it-swarm.com.de

Wie können wir die Stadt/das Land anhand der Längen- und Breitengrade herausfinden?

Zum Beispiel, wenn wir diese Koordinaten haben

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

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

122
ming yeow

Die kostenlose Google Geocoding API stellt diesen Dienst über eine HTTP REST - API bereit. Beachten Sie, dass die API Nutzung und Rate begrenzt ist , aber Sie können für unbegrenzten Zugriff bezahlen.

Verwenden Sie diesen Link, um ein Beispiel für die Ausgabe anzuzeigen (dies ist in Json, Ausgabe ist auch in XML verfügbar).

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

86
Kevin

Andere Option:

  • Laden Sie die Datenbank der Städte von http://download.geonames.org/export/dump/ herunter.
  • Fügen Sie jede Stadt als Lat/Long -> City-Zuordnung 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: 

  • Hängt nicht von einem externen Server ab, der verfügbar ist
  • Sehr schnell (führt leicht Tausende von Suchvorgängen pro Sekunde durch)

Nachteile:

  • Nicht automatisch auf dem neuesten Stand
  • Erfordert einen zusätzlichen Code, wenn Sie den Fall unterscheiden möchten, in dem die nächste Stadt Dutzende von Meilen entfernt ist
  • Es kann zu ungewöhnlichen Ergebnissen in der Nähe der Pole und der internationalen Datumsgrenze kommen (obwohl dort ohnehin keine Städte vorhanden sind)
149

Sie benötigen 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'}
30
Farsheed

Ich suchte nach einer ähnlichen Funktion und sah die Daten " http://download.geonames.org/export/dump/ ", die in einer früheren Antwort geteilt wurden (vielen Dank für das Teilen, es ist eine ausgezeichnete Quelle) und einen Dienst implementiert, der auf den Daten von cities1000.txt basiert.

Sie können sehen, dass es um .__ läuft.http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9(defekter Link)Ändern Sie einfach den Längen- und Breitengrad für Ihre Standorte.

Es wird auf OpenShift (RedHat Platform) bereitgestellt. Der erste Anruf nach längerer Ruhezeit kann einige Zeit dauern, die Leistung ist jedoch in der Regel zufriedenstellend. Fühlen Sie sich frei, diesen Dienst nach Ihren Wünschen zu nutzen ...

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

20
turgos

Eine Open Source-Alternative ist Nominatim von Open Street Map. Alles, was Sie tun müssen, ist, die Variablen in einer URL festzulegen und die Stadt/das Land dieses Ortes zurückzugeben. Bitte überprüfen Sie den folgenden Link für offizielle Dokumente: Nominatim

20
Rega

Ich habe ungefähr 30 Minuten damit verbracht, ein Codebeispiel zu finden, wie man dies in Javascript macht. Ich konnte keine schnelle, klare Antwort auf Ihre Frage finden. Also ... ich habe mich selbst gemacht. Hoffentlich können die Leute dies nutzen, ohne sich in die API einarbeiten zu müssen oder auf Code zu starren, den sie nicht kennen. Ha wenn nichts anderes kann ich auf diesen Beitrag für meine eigenen Sachen verweisen .. Nette Frage und danke für das Forum der Diskussion!

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
Kai Husen

Ich habe Geocoder verwendet, eine gute Python-Bibliothek, die mehrere Provider unterstützt, darunter Google, Geonames und OpenStreetMaps, für nur einige wenige . Ich habe versucht, die GeoPy-Bibliothek zu verwenden, und es kommt häufig zu Timeouts. Die Entwicklung Ihres 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 Dokumentation . Nachstehend finden Sie einige Beispielcodes zum Suchen von Stadt nach Längen- und Breitengrad oder zum Suchen von Breiten-/Längengrad nach Stadtnamen.

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
5
Hamman Samuel

Es hängt wirklich davon ab, welche Technologieeinschrä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. Unter Umriss meine ich, dass Länder und Städte als räumliches Polygon gespeichert werden. Ihr Koordinatensatz kann in den räumlichen Typpunkt konvertiert und anhand der Polygone abgefragt werden, um den Namen des Landes/der Stadt zu erhalten, in dem sich der Punkt befindet. 

Hier einige Datenbanken, die räumliche Typen unterstützen: SQL Server 2008 , MySQL , postGIS - eine Erweiterung von postgreSQL und Oracle

Wenn Sie anstelle einer eigenen Datenbank einen Dienst verwenden möchten, können Sie das GeoPlanet von Yahoo verwenden. Für den Service-Ansatz sollten Sie this answer on gis.stackexchange.com überprüfen. Dort wird die Verfügbarkeit von Services zur Lösung Ihres Problems beschrieben. 

3
steenhulthin

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

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

Wenn Sie das Land und die Stadt einer Koordinatenliste schnell finden müssen, ist dies ein hervorragendes Werkzeug.

2

Sie können die Google Geocoding-API verwenden

Balg 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;
}
1
Nishad Up

Wenn Sie die Places-API von Google verwenden, können Sie mithilfe von Javascript Land und Ort vom 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;
  }
}
0
vedo27

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

Die Geohash-Daten werden mit georaptor generiert.

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

0
Ashwin Nair

Bitte überprüfen Sie die Antwort unten. 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
Summved Jain