¿Cómo puedo obtener el nombre de la ciudad a partir de un punto de latitud y longitud?

92

¿Hay alguna manera de obtener un nombre de ciudad a partir de un punto de latitud y longitud usando la api de google maps para javascript?

Si es así, ¿podría ver un ejemplo?

Dennis Martinez
fuente
necesitará encontrar un servicio web que ofrezca esto.
Deviland

Respuestas:

118

Esto se llama codificación geográfica inversa.

inteligentecaveman
fuente
¡Increíble! Leí sobre esto, y ahora la superación de demasiadas consultas;) gracias.
Dennis Martinez
Por dirección IP y por usuario único es lo mismo si está utilizando la API de JavaScript, pero si está utilizando PHP, por ejemplo, y cree que alcanzará estos límites, deberá limitar las solicitudes a 1 por segundo o utilizar servidores proxy, pero tenga cuidado con los proxies, Google no es estúpido y no puede martillarlos. Más información aquí: developers.google.com/maps/documentation/business/articles/…
Andy Gee
26

Aquí tienes una muestra completa:

<!DOCTYPE html>
<html>
  <head>
    <title>Geolocation API with Google Maps API</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script>
      function displayLocation(latitude,longitude){
        var request = new XMLHttpRequest();

        var method = 'GET';
        var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='+latitude+','+longitude+'&sensor=true';
        var async = true;

        request.open(method, url, async);
        request.onreadystatechange = function(){
          if(request.readyState == 4 && request.status == 200){
            var data = JSON.parse(request.responseText);
            var address = data.results[0];
            document.write(address.formatted_address);
          }
        };
        request.send();
      };

      var successCallback = function(position){
        var x = position.coords.latitude;
        var y = position.coords.longitude;
        displayLocation(x,y);
      };

      var errorCallback = function(error){
        var errorMessage = 'Unknown error';
        switch(error.code) {
          case 1:
            errorMessage = 'Permission denied';
            break;
          case 2:
            errorMessage = 'Position unavailable';
            break;
          case 3:
            errorMessage = 'Timeout';
            break;
        }
        document.write(errorMessage);
      };

      var options = {
        enableHighAccuracy: true,
        timeout: 1000,
        maximumAge: 0
      };

      navigator.geolocation.getCurrentPosition(successCallback,errorCallback,options);
    </script>
  </body>
</html>
Benny Neugebauer
fuente
¿Hay alguna forma de averiguar la ubicación del usuario por latitud y longitud sin la aprobación del usuario?
Vikas Verma
8
@VikasVerma eso sería una violación grave de la privacidad si se le permite encontrar la ubicación del usuario sin su consentimiento
omerio
@omerio gracias, pero hice un código allí y obligué al usuario a hacer clic en permitir si él / ella quiere continuar.
Vikas Verma
1
Esto realmente me dio la dirección exacta de mi casa. Exactamente lo que quiero. ¿Cómo extraigo la ciudad y el estado o el código postal?
ydobonebi
6

En node.js podemos usar el módulo npm node-geocoder para obtener la dirección de lat, lng.,

geo.js

var NodeGeocoder = require('node-geocoder');

var options = {
  provider: 'google',
  httpAdapter: 'https', // Default
  apiKey: ' ', // for Mapquest, OpenCage, Google Premier
  formatter: 'json' // 'gpx', 'string', ...
};

var geocoder = NodeGeocoder(options);

geocoder.reverse({lat:28.5967439, lon:77.3285038}, function(err, res) {
  console.log(res);
});

salida:

nodo geo.js

[ { formattedAddress: 'C-85B, C Block, Sector 8, Noida, Uttar Pradesh 201301, India',
    latitude: 28.5967439,
    longitude: 77.3285038,
    extra: 
     { googlePlaceId: 'ChIJkTdx9vzkDDkRx6LVvtz1Rhk',
       confidence: 1,
       premise: 'C-85B',
       subpremise: null,
       neighborhood: 'C Block',
       establishment: null },
    administrativeLevels: 
     { level2long: 'Gautam Buddh Nagar',
       level2short: 'Gautam Buddh Nagar',
       level1long: 'Uttar Pradesh',
       level1short: 'UP' },
    city: 'Noida',
    country: 'India',
    countryCode: 'IN',
    zipcode: '201301',
    provider: 'google' } ]
KARTHIKEYAN.A
fuente
Gracias por los comentarios muy claros y funcionales, ¿habría alguna diferencia entre la elección de 'nodo-geocoder' y '@ google / maps'? Sin embargo, parecen hacer lo mismo
Ade
1
Ambos resultados son iguales, pero el nodo geocoder es un módulo simplificado para obtener la dirección y @ google / maps es api para obtener la dirección que necesitamos configurar.
KARTHIKEYAN.A
4

Aquí hay una solución moderna con una promesa:

function getAddress (latitude, longitude) {
    return new Promise(function (resolve, reject) {
        var request = new XMLHttpRequest();

        var method = 'GET';
        var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + latitude + ',' + longitude + '&sensor=true';
        var async = true;

        request.open(method, url, async);
        request.onreadystatechange = function () {
            if (request.readyState == 4) {
                if (request.status == 200) {
                    var data = JSON.parse(request.responseText);
                    var address = data.results[0];
                    resolve(address);
                }
                else {
                    reject(request.status);
                }
            }
        };
        request.send();
    });
};

Y llámalo así:

getAddress(lat, lon).then(console.log).catch(console.error);

La promesa devuelve el objeto de dirección en 'entonces' o el código de estado de error en 'captura'

Steven Spungin
fuente
3
Esto no funcionaría sin una clave de acceso. El parámetro del sensor también está obsoleto
Joro Tenev
En realidad no funciona
ProgrammingHobby
3

Seguir el código funciona bien para obtener el nombre de la ciudad (usando la API de Google Map Geo ):

HTML

<p><button onclick="getLocation()">Get My Location</button></p>
<p id="demo"></p>
<script src="http://maps.google.com/maps/api/js?key=YOUR_API_KEY"></script>

GUIÓN

var x=document.getElementById("demo");
function getLocation(){
    if (navigator.geolocation){
        navigator.geolocation.getCurrentPosition(showPosition,showError);
    }
    else{
        x.innerHTML="Geolocation is not supported by this browser.";
    }
}

function showPosition(position){
    lat=position.coords.latitude;
    lon=position.coords.longitude;
    displayLocation(lat,lon);
}

function showError(error){
    switch(error.code){
        case error.PERMISSION_DENIED:
            x.innerHTML="User denied the request for Geolocation."
        break;
        case error.POSITION_UNAVAILABLE:
            x.innerHTML="Location information is unavailable."
        break;
        case error.TIMEOUT:
            x.innerHTML="The request to get user location timed out."
        break;
        case error.UNKNOWN_ERROR:
            x.innerHTML="An unknown error occurred."
        break;
    }
}

function displayLocation(latitude,longitude){
    var geocoder;
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(latitude, longitude);

    geocoder.geocode(
        {'latLng': latlng}, 
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var add= results[0].formatted_address ;
                    var  value=add.split(",");

                    count=value.length;
                    country=value[count-1];
                    state=value[count-2];
                    city=value[count-3];
                    x.innerHTML = "city name is: " + city;
                }
                else  {
                    x.innerHTML = "address not found";
                }
            }
            else {
                x.innerHTML = "Geocoder failed due to: " + status;
            }
        }
    );
}
Sanchit Gupta
fuente
0

Igual que @Sanchit Gupta.

en esta parte

if (results[0]) {
 var add= results[0].formatted_address ;
 var  value=add.split(",");
 count=value.length;
 country=value[count-1];
 state=value[count-2];
 city=value[count-3];
 x.innerHTML = "city name is: " + city;
}

solo consola la matriz de resultados

if (results[0]) {
 console.log(results[0]);
 // choose from console whatever you need.
 var city = results[0].address_components[3].short_name;
 x.innerHTML = "city name is: " + city;
}
Fahad Hossain
fuente
0

Hay muchas herramientas disponibles

  1. API de Google Maps como todos habían escrito
  2. use estos datos " https://simplemaps.com/data/world-cities " descargue la versión gratuita y convierta Excel a JSON con algún convertidor en línea como " http://beautifytools.com/excel-to-json-converter.php "
  3. use la dirección IP que no es buena porque el uso de la dirección IP de alguien puede no ser bueno, los usuarios piensan que puede piratearlos.

otras herramientas gratuitas y de pago también están disponibles

usuario12449933
fuente
-1

BigDataCloud también tiene una buena API para esto, también para usuarios de nodejs.

tienen API gratis para el cliente . Pero también para backend , usando API_KEY (gratis según cuota).

Su página de GitHub .

el código se ve así:

const client = require('@bigdatacloudapi/client')(API_KEY);

async foo() {
    ...
    const location: string = await client.getReverseGeocode({
          latitude:'32.101786566878445', 
          longitude: '34.858965073072056'
    });
}
OhadR
fuente
-1

En caso de que no desee utilizar la API de codificación geográfica de Google, puede consultar algunas otras API gratuitas para fines de desarrollo. por ejemplo, utilicé la API [mapquest] para obtener el nombre de la ubicación.

puede obtener el nombre de la ubicación fácilmente implementando esta función siguiente

 const fetchLocationName = async (lat,lng) => {
    await fetch(
      'https://www.mapquestapi.com/geocoding/v1/reverse?key=API-Key&location='+lat+'%2C'+lng+'&outFormat=json&thumbMaps=false',
    )
      .then((response) => response.json())
      .then((responseJson) => {
        console.log(
          'ADDRESS GEOCODE is BACK!! => ' + JSON.stringify(responseJson),
        );
      });
  };

pankaj chaturvedi
fuente
OP estaba pidiendo una solución con la API de Google Maps, creo que no está respondiendo la pregunta.
Michał Tkaczyk
Lo siento, pero acabo de sugerir una forma alternativa de hacerlo. y funciona bien si tiene la clave api de codificación geográfica de Google.
pankaj chaturvedi
-3

puedes hacerlo con php puro y api de codificación geográfica de google

/*
 *
 * @param latlong (String) is Latitude and Longitude with , as separator for example "21.3724002,39.8016229"
 **/
function getCityNameByLatitudeLongitude($latlong)
{
    $APIKEY = "AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // Replace this with your google maps api key 
    $googleMapsUrl = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $latlong . "&language=ar&key=" . $APIKEY;
    $response = file_get_contents($googleMapsUrl);
    $response = json_decode($response, true);
    $results = $response["results"];
    $addressComponents = $results[0]["address_components"];
    $cityName = "";
    foreach ($addressComponents as $component) {
        // echo $component;
        $types = $component["types"];
        if (in_array("locality", $types) && in_array("political", $types)) {
            $cityName = $component["long_name"];
        }
    }
    if ($cityName == "") {
        echo "Failed to get CityName";
    } else {
        echo $cityName;
    }
}
Hendi Ahmed
fuente
1
No es una solución de JavaScript
Chintan Pathak