Comment puis-je obtenir le nom d'une ville à partir d'un point de latitude et de longitude?

92

Existe-t-il un moyen d'obtenir un nom de ville à partir d'un point de latitude et de longitude à l'aide de l'API google maps pour javascript?

Si oui, pourrais-je voir un exemple?

Dennis Martinez
la source
vous devrez trouver un service Web qui offre cela.
Deviland

Réponses:

118

C'est ce qu'on appelle le géocodage inversé

smartcaveman
la source
Impressionnant! J'ai lu à ce sujet, et maintenant le trop grand nombre de requêtes;) merci.
Dennis Martinez
Par adresse IP et par utilisateur unique, c'est la même chose si vous utilisez l'API javascript, mais si vous utilisez PHP par exemple et que vous pensez atteindre ces limites, vous devrez limiter les requêtes à 1 par seconde ou utiliser serveurs proxy mais soyez prudent avec les proxys, google n'est pas stupide et vous ne pouvez pas les marteler. Plus d'informations ici: développeurs.google.com
maps
26

Voici un échantillon complet:

<!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
la source
Existe-t-il un moyen de connaître l'emplacement de l'utilisateur à partir de la latitude et de la longitude sans l'approbation de l'utilisateur?
Vikas Verma
8
@VikasVerma ce serait une grave violation de la vie privée si vous êtes autorisé à trouver l'emplacement de l'utilisateur sans son consentement
omerio
@omerio merci, mais j'ai créé du code là-bas, j'ai forcé l'utilisateur à cliquer sur Autoriser s'il voulait continuer.
Vikas Verma
1
Cela m'a donné l'adresse exacte de mon domicile. Exactement ce que je veux. Comment extraire comme la ville et l'état ou le code postal?
ydobonebi
6

Dans node.js, nous pouvons utiliser le module npm de node-geocoder pour obtenir l'adresse 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);
});

production:

noeud 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
la source
Merci pour les commentaires très clairs et fonctionnels, y aurait-il une différence entre le choix de 'node-geocoder' et '@ google / maps'?, Ils semblent faire la même chose cependant
Ade
1
les deux sorties sont identiques mais node-geocoder est un module simplifié pour obtenir l'adresse et @ google / maps est une api pour obtenir l'adresse que nous devons configurer.
KARTHIKEYAN.A
4

Voici une solution moderne utilisant une promesse:

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();
    });
};

Et appelez-le comme ceci:

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

La promesse renvoie l'objet d'adresse dans 'alors' ou le code d'état d'erreur dans 'catch'

Steven Spungin
la source
3
Cela ne fonctionnerait pas sans une clé d'accès. Le paramètre du capteur est également obsolète
Joro Tenev
Cela ne fonctionne pas réellement
ProgrammingHobby
3

Le code suivant fonctionne bien pour obtenir le nom de la ville (à l'aide de l' API 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>

SCÉNARIO

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
la source
0

Identique à @Sanchit Gupta.

dans cette partie

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;
}

console juste le tableau des résultats

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
la source
0

Il existe de nombreux outils disponibles

  1. API google maps comme tout avait écrit
  2. utilisez ces données " https://simplemaps.com/data/world-cities " téléchargez la version gratuite et convertissez Excel en JSON avec un convertisseur en ligne comme " http://beautifytools.com/excel-to-json-converter.php "
  3. utilisez l'adresse IP qui n'est pas bonne car l'utilisation de l'adresse IP de quelqu'un peut ne pas penser que les bons utilisateurs pensent que vous pouvez les pirater.

d'autres outils gratuits et payants sont également disponibles

user12449933
la source
-1

BigDataCloud a également une belle API pour cela, également pour les utilisateurs de nodejs.

ils ont API pour client - gratuit . Mais aussi pour le backend , en utilisant API_KEY (gratuit selon quota).

Leur page GitHub .

le code ressemble à:

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

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

Si vous ne souhaitez pas utiliser l'API de géocodage Google, vous pouvez vous référer à quelques autres API gratuites à des fins de développement. par exemple, j'ai utilisé l'API [mapquest] pour obtenir le nom de l'emplacement.

vous pouvez facilement récupérer le nom de l'emplacement en implémentant cette fonction suivante

 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
la source
OP demandait une solution avec l'API Google Maps, je pense que vous ne répondez pas à la question.
Michał Tkaczyk
Désolé, mais je viens de suggérer une autre façon de le faire. et cela fonctionne très bien s'il a la clé api de codage géographique de google.
pankaj chaturvedi
-3

vous pouvez le faire avec l'api php pur et google geocode

/*
 *
 * @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
la source
1
Pas une solution javascript
Chintan Pathak