Wie können wir angesichts der Lat / Long-Koordinaten die Stadt / das Land herausfinden?


141

Zum Beispiel, wenn wir diese Koordinaten haben

"latitude": 48.858844300000001,
"longitude": 2.2943506,

Wie können wir die Stadt / das Land herausfinden?


2
Sie benötigen wahrscheinlich eine Datenbank. Ich würde versuchen, selbst mit der Google Maps-API zu spielen ... sie unterstützt lat / long.
Beatgammit

Antworten:


96

Die kostenlose Google Geocoding-API bietet diesen Service über eine HTTP-REST-API. Beachten Sie, dass die API in Bezug auf Nutzung und Rate begrenzt ist. Sie können jedoch für unbegrenzten Zugriff bezahlen.

Versuchen Sie diesen Link, um ein Beispiel für die Ausgabe zu sehen (dies ist in JSON, die Ausgabe ist auch in XML verfügbar).

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true


Ich akzeptiere das, weil dies das ist, was ich am Ende anstrebe :) Michaels Antwort ist sicherlich eine großartige Option, tho!
Ming Yeow

5
Die umgekehrte Geokodierung von Google ist nur in Verbindung mit einer Google Map zulässig. Wenn Sie eine Lösung suchen
James D

mapquest api ist hier eine weitere Option, da es in einigen Fällen keine Ratenbeschränkungen und sehr hohe Ratenbeschränkungen für verschiedene Geokodierungsanforderungen gibt.
Tom

2
frei ist umstritten, es ist nur unter bestimmten Grenzen frei.
Petah

@JamesD: Die API-Richtlinien besagen, dass es sich bei der Anzeige der Daten auf einer Karte um eine Google Map handeln muss, diese jedoch nicht (oder überhaupt nicht) auf einer Karte anzeigen muss.
user276648

173

Andere Option:

  • Laden Sie die Stadtdatenbank von http://download.geonames.org/export/dump/ herunter.
  • Fügen Sie jede Stadt als Lat / Long -> City Mapping zu einem räumlichen Index wie einem R-Tree hinzu (einige DBs verfügen auch über die Funktionalität).
  • Verwenden Sie die Suche nach dem nächsten Nachbarn, um die nächstgelegene Stadt für einen bestimmten Punkt zu finden

Vorteile:

  • Es hängt nicht davon ab, ob ein externer Server verfügbar ist
  • Sehr schnell (macht leicht Tausende von Suchvorgängen pro Sekunde)

Nachteile:

  • Nicht automatisch auf dem neuesten Stand
  • Benötigt zusätzlichen Code, wenn Sie den Fall unterscheiden möchten, in dem die nächste Stadt Dutzende von Kilometern entfernt ist
  • Kann seltsame Ergebnisse in der Nähe der Pole und der internationalen Datumsgrenze liefern (obwohl es an diesen Orten sowieso keine Städte gibt

5
Wird auch seltsame Ergebnisse für Städte innerhalb von Städten liefern, zum Beispiel können bestimmte Orte in Rom "Vatikanstadt" zurückgeben - abhängig von dem Lat / Lon, der in jeder Datenbank angegeben ist.
Noel Abrahams

1
Sie haben auch eine REST-API und sehen ziemlich anständig aus: api.geonames.org/…
jeudyx

8
Ein Beispiel wäre von unschätzbarem Wert gewesen
Hack-R

GeoNames bietet auch einen kostenlosen Webservice an, der einfach fantastisch ist!
mcont

Im Jahr 2020 sieht GeoNames.org ziemlich inaktiv aus. Weiß jemand, ob es überhaupt aktuell ist? Das Problem ist, dass sie nirgends die Daten der letzten Aktualisierung auf der Website erwähnen.
Joedotnot

45

Du brauchst geopy

pip install geopy

und dann:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

um weitere Informationen zu erhalten:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}

2
Gibt es irgendwelche Grenzen für diese? Dies scheint der schnellste Ansatz zu sein. Könnte es einen Grund geben, dies nicht über @ Michaels Ansatz zu verwenden?
Satys

1
Nun,

Es ist ein großartiger Ansatz, aber ich brauche nur die Landkreise, also muss ich die Adresse verfeinern. Ich wünschte, es gäbe einen Weg, der die Landkreise zurückgab.
Fatemeh Asgarinejad

22

Eine Open Source-Alternative ist Nominatim von Open Street Map. Sie müssen lediglich die Variablen in einer URL festlegen und die Stadt / das Land dieses Standorts zurückgeben. Bitte überprüfen Sie den folgenden Link für die offizielle Dokumentation: Nominatim


3
Beachten Sie, dass in der Nominatim-Nutzungsrichtlinie Operations.osmfoundation.org/policies/nominatim eine maximale Rate von einer Anforderung pro Sekunde angegeben ist, sodass sie nur für Ad-hoc-Abfragen wirklich geeignet ist.
Matthew Wise

22

Ich habe nach einer ähnlichen Funktionalität gesucht und die Daten " http://download.geonames.org/export/dump/ " gesehen, die in einer früheren Antwort geteilt wurden (danke für das Teilen, es ist eine ausgezeichnete Quelle), und einen Service implementiert auf den Daten von city1000.txt.

Sie können es laufen sehen http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (defekter Link) Ändern Sie einfach den Breiten- und Längengrad für Ihre Standorte.

Es wird auf OpenShift (RedHat Platform) bereitgestellt. Der erste Anruf nach einer langen Leerlaufzeit kann einige Zeit dauern, aber normalerweise ist die Leistung zufriedenstellend. Fühlen Sie sich frei, diesen Service zu nutzen, wie Sie möchten ...

Die Projektquelle finden Sie auch unter https://github.com/turgos/Location .


Es funktioniert nicht richtig. Wenn es keine Stadt bekommen kann, sucht es nach einer nächsten bekannten Stadt. Hier ist ein Beispiel: Scatter-otl.rhcloud.com/… Es steht "Basseterre" anstelle von "Saint John" ...
Smartmouse

1
Das ist richtig. Der Algorithmus sucht nach der nächstgelegenen verfügbaren Stadt im Datensatz. Für den oben bereitgestellten Server habe ich "Towns1000.txt" verwendet. Es hat nur die großen Städte. Der Quellcode ist unter github.com/turgos/Location verfügbar . Sie können Ihre eigenen mit detaillierteren Daten unter " download.geonames.org/export/dump " starten .
Turgos

Es scheint, dass Städte1000.txt die detaillierteren verfügbaren Daten sind. Habe ich recht?
Smartmouse

8

Ich habe Geocoder verwendet , eine gute Python-Bibliothek, die mehrere Anbieter unterstützt, darunter Google, Geonames und OpenStreetMaps, um nur einige zu nennen . Ich habe versucht, die GeoPy-Bibliothek zu verwenden, und es kommt häufig zu Zeitüberschreitungen. Das Entwickeln eines eigenen Codes für GeoNames ist nicht die beste Verwendung Ihrer Zeit, und Sie erhalten möglicherweise instabilen Code. Geocoder ist meiner Erfahrung nach sehr einfach zu bedienen und verfügt über ausreichend Dokumentation . Unten finden Sie einen Beispielcode zum Nachschlagen der Stadt nach Breiten- und Längengrad oder zum Ermitteln von Breiten- / Längengraden nach Städtenamen.

import geocoder

g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton

g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084

Vielen Dank für das Teilen, aber es funktioniert nicht für alle Koordinaten. Muss die Anzahl der Ziffern der Koordinaten eine bestimmte Größe haben?
Fatemeh Asgarinejad

1
Ich glaube, ich habe Längen- und Breitengrad richtig gewählt. Ich habe Tausende von Koordinaten, von denen eine zufällige Koordinate nicht funktioniert hat. Es ist jetzt in Ordnung. Ich habe einen anderen Ansatz gewählt. Vielen Dank für Ihre Antwort.
Fatemeh Asgarinejad

1
Herzlich willkommen. Neugierig, welcher Ansatz für Sie funktioniert hat? Wenn es besser ist als geocoder, würde ich es auch gerne selbst versuchen!
Hamman Samuel

1
Ich habe dies verwendet: aus geopy.geocoders import Nominatim geolocator = Nominatim () location = geolocator.reverse ("41.4721, -72.6311") print (location.address) Es gibt die gesamte Adresse an und dann filtere ich die Grafschaft daraus.
Fatemeh Asgarinejad

1
Vielen Dank, ich habe mit einem großen Datensatz gearbeitet und 2017 mit GeoPy viele Auszeiten bekommen. Vielleicht 3 Jahre später haben sie ihre Beschränkungen gelockert, das ist also gut zu wissen!
Hamman Samuel

5

Ich habe ungefähr 30 Minuten damit verbracht, ein Codebeispiel dafür in Javascript zu finden. Ich konnte keine schnelle und klare Antwort auf die von Ihnen gestellte Frage finden. Also ... ich habe es mir selbst gemacht. Hoffentlich können die Leute dies nutzen, ohne sich in die API vertiefen oder auf Code starren zu müssen, von dem sie keine Ahnung haben, wie sie ihn lesen sollen. Ha wenn nichts anderes kann ich diesen Beitrag für meine eigenen Sachen referenzieren .. Schöne Frage und danke für das Diskussionsforum!

Hierbei wird die Google-API verwendet.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>

.

//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        //GET USER CURRENT LOCATION
        var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

        //CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
        var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
                var locItemCount = results.length;
                var locCountryNameCount = locItemCount - 1;
                var locCountryName = results[locCountryNameCount].formatted_address;

                if (locCountryName == "Australia") {
                    //SET COOKIE FOR GIVING
                    jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' }); 
                }
        });
    }
}

5

Ich weiß, dass diese Frage wirklich alt ist, aber ich habe an demselben Problem gearbeitet und ein äußerst effizientes und praktisches Paket gefunden reverse_geocoder, das von Ajay Thampi erstellt wurde. Der Code ist hier verfügbar . Es basiert auf einer parallelisierten Implementierung von KD-Bäumen, die für große Punktmengen äußerst effizient ist (ich habe einige Sekunden gebraucht, um 100.000 Punkte zu erhalten.

Es basiert auf dieser Datenbank, die bereits von @turgos hervorgehoben wurde.

Wenn Sie schnell das Land und die Stadt einer Koordinatenliste finden möchten, ist dies ein großartiges Tool.


3

Es hängt wirklich davon ab, welche technologischen Einschränkungen Sie haben.

Eine Möglichkeit besteht darin, eine räumliche Datenbank mit den Umrissen der Länder und Städte zu haben, an denen Sie interessiert sind. Mit Umrissen meine ich, dass Länder und Städte als räumliches Polygon gespeichert werden. Ihr Koordinatensatz kann in den Punkt vom räumlichen Typ konvertiert und anhand der Polygone abgefragt werden, um den Namen des Landes / der Stadt zu erhalten, in dem sich der Punkt befindet.

Hier sind einige der Datenbanken, die den räumlichen Typ unterstützen: SQL Server 2008 , MySQL , postGIS - eine Erweiterung von postgreSQL und Oracle .

Wenn Sie einen Dienst anstelle einer eigenen Datenbank verwenden möchten, können Sie den GeoPlanet von Yahoo verwenden . Informationen zum Serviceansatz finden Sie in dieser Antwort auf gis.stackexchange.com , in der die Verfügbarkeit von Services zur Lösung Ihres Problems beschrieben wird.


1

Sie können die Google Geocoding-API verwenden

Unten ist eine PHP-Funktion, die Adresse, Stadt, Bundesland und Land zurückgibt

public function get_location($latitude='', $longitude='')
{
    $geolocation = $latitude.','.$longitude;
    $request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false'; 
    $file_contents = file_get_contents($request);
    $json_decode = json_decode($file_contents);
    if(isset($json_decode->results[0])) {
        $response = array();
        foreach($json_decode->results[0]->address_components as $addressComponet) {
            if(in_array('political', $addressComponet->types)) {
                    $response[] = $addressComponet->long_name; 
            }
        }

        if(isset($response[0])){ $first  =  $response[0];  } else { $first  = 'null'; }
        if(isset($response[1])){ $second =  $response[1];  } else { $second = 'null'; } 
        if(isset($response[2])){ $third  =  $response[2];  } else { $third  = 'null'; }
        if(isset($response[3])){ $fourth =  $response[3];  } else { $fourth = 'null'; }
        if(isset($response[4])){ $fifth  =  $response[4];  } else { $fifth  = 'null'; }


        $loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
        if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $fourth;
            $loc['country'] = $fifth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null'  ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $third;
            $loc['country'] = $fourth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
            $loc['city'] = $first;
            $loc['state'] = $second;
            $loc['country'] = $third;
        }
        else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['state'] = $first;
            $loc['country'] = $second;
        }
        else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['country'] = $first;
        }
      }
      return $loc;
}

Wenn ich nur administrative_area_level_ 3 oder locality möchte (wenn administrative_area_level_ 3 nicht verfügbar ist), welche sollte ich ändern? neu bei PHP ..
August

1

Loc2country ist ein Golang-basiertes Tool, das den ISO-Alpha-3-Ländercode für bestimmte Standortkoordinaten (lat / lon) zurückgibt. Es reagiert in Mikrosekunden. Es verwendet eine Geohash-Landkarte.

Die Geohash-Daten werden mit Georaptor generiert .

Wir verwenden Geohash auf Stufe 6 für dieses Werkzeug, dh Kisten mit einer Größe von 1,2 km x 600 m.



0

Bitte überprüfen Sie die unten stehende Antwort. Für mich geht das

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){

        initialize(position.coords.latitude,position.coords.longitude);
    }); 
}

function initialize(lat,lng) {
    //directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    //directionsService = new google.maps.DirectionsService();
    var latlng = new google.maps.LatLng(lat, lng);

    //alert(latlng);
    getLocation(latlng);
}

function getLocation(latlng){

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                    alert("location is::"+loc);
                }
            }
        });

}

function getCountry(results)
{
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                return shortname;
            }
            else
            {
                return longname;
            }
        }
    }

}

function isNullOrWhitespace(text) {
    if (text == null) {
        return true;
    }
    return text.replace(/\s/gi, '').length < 1;
}

0

Wenn Sie die Places-API von Google verwenden, können Sie auf diese Weise mithilfe von Javascript Land und Stadt aus dem Ortsobjekt abrufen:

function getCityAndCountry(location) {
  var components = {};
  for(var i = 0; i < location.address_components.length; i++) {
    components[location.address_components[i].types[0]] = location.address_components[i].long_name;
  }

  if(!components['country']) {
    console.warn('Couldn\'t extract country');
    return false;
  }

  if(components['locality']) {
    return [components['locality'], components['country']];
  } else if(components['administrative_area_level_1']) {
    return [components['administrative_area_level_1'], components['country']];
  } else {
    console.warn('Couldn\'t extract city');
    return false;
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.