Zum Beispiel, wenn wir diese Koordinaten haben
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Wie können wir die Stadt / das Land herausfinden?
Zum Beispiel, wenn wir diese Koordinaten haben
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Wie können wir die Stadt / das Land herausfinden?
Antworten:
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
Andere Option:
Vorteile:
Nachteile:
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'}
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
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 .
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
geocoder
, würde ich es auch gerne selbst versuchen!
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: '/' });
}
});
}
}
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.
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.
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;
}
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.
Minimieren Sie die Anzahl der Bibliotheken.
Holen Sie sich einen Schlüssel, um die API auf ihrer Website zu verwenden, und erhalten Sie das Ergebnis in einer http-Anfrage:
curl -i -H "key: YOUR_KEY" -X GET https://api.latlong.dev/lookup?lat=38.7447913&long=-9.1625173
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;
}
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;
}
}