Come posso ottenere il nome di una città da un punto di latitudine e longitudine?


Risposte:


118

Questo si chiama Geocodifica inversa


Eccezionale! Ho letto su questo, e ora sono in arrivo troppe domande;) grazie.
Dennis Martinez

Per indirizzo IP e per singolo utente è lo stesso se stai usando l'API javascript ma se stai usando PHP ad esempio e pensi di raggiungere questi limiti dovrai limitare le richieste a 1 al secondo o usare server proxy ma fai attenzione ai proxy, Google non è stupido e non puoi martellarli. Maggiori informazioni qui: developers.google.com/maps/documentation/business/articles/…
Andy Gee,

26

Ecco un esempio completo:

<!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>

C'è un modo per scoprire la posizione dell'utente da latitudine e longitudine senza l'approvazione dell'utente?
Vikas Verma

8
@VikasVerma che sarebbe una grave violazione della privacy se ti fosse permesso di trovare la posizione dell'utente senza il loro consenso
omerio

@omerio grazie ma ho creato il codice lì ho costretto l'utente a fare clic su consenti se vuole procedere.
Vikas Verma

1
Questo effettivamente mi ha dato il mio indirizzo di casa esatto. Esattamente quello che voglio. Come estraggo esattamente come la città e lo stato o il codice postale?
ydobonebi

6

In node.js possiamo usare il modulo node-geocoder npm per ottenere l'indirizzo da 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);
});

produzione:

node 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' } ]

Grazie per il feedback molto chiaro e funzionante, ci sarebbe qualche differenza tra la scelta di 'node-geocoder' e '@ google / maps'?, Sembrano fare la stessa cosa però
Ade

1
entrambi gli output sono gli stessi, ma node-geocoder è un modulo semplificato per ottenere l'indirizzo e @ google / maps è api per ottenere l'indirizzo che dobbiamo configurare.
KARTHIKEYAN.A


4

Ecco una soluzione moderna che utilizza una promessa:

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

E chiamalo così:

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

La promessa restituisce l'oggetto indirizzo in "then" o il codice di stato di errore in "catch"


3
Questo non funzionerebbe senza una chiave di accesso. Anche il parametro del sensore è obsoleto
Joro Tenev

In realtà non funziona
ProgrammingHobby

3

Il seguente codice funziona bene per ottenere il nome della città (utilizzando Google Map Geo API ):

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>

SCRIPT

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

0

Come @Sanchit Gupta.

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

consola semplicemente l'array dei risultati

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

0

Sono disponibili molti strumenti

  1. API di Google Maps come tutte le avevano scritte
  2. usa questi dati " https://simplemaps.com/data/world-cities " scarica la versione gratuita e converti excel in JSON con alcuni convertitori online come " http://beautifytools.com/excel-to-json-converter.php "
  3. usa un indirizzo IP che non va bene perché l'uso dell'indirizzo IP di qualcuno potrebbe non essere un buon utente che pensa che tu possa hackerarlo.

sono disponibili anche altri strumenti gratuiti ea pagamento


-1

BigDataCloud ha anche una bella API per questo, anche per gli utenti di nodejs.

hanno API per client - gratuito . Ma anche per il backend , utilizzando API_KEY (gratuito in base alla quota).

La loro pagina GitHub .

il codice ha questo aspetto:

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

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

-1

Nel caso in cui non si desideri utilizzare l'API di geocodifica di Google, è possibile fare riferimento a poche altre API gratuite a scopo di sviluppo. ad esempio ho utilizzato l'API [mapquest] per ottenere il nome della posizione.

puoi recuperare facilmente il nome della posizione implementando questa funzione seguente

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


OP stava chiedendo una soluzione con l'API di Google Maps, penso che tu non stia rispondendo alla domanda.
Michał Tkaczyk,

Scusa ma ho appena suggerito un modo alternativo per farlo. e funziona bene se ha la chiave API di Google Geo Coding.
pankaj chaturvedi

-3

puoi farlo con puro php e google geocode api

/*
 *
 * @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;
    }
}

1
Non una soluzione JavaScript
Chintan Pathak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.