Zum Beispiel, wenn wir diese Koordinaten haben
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Wie können wir die Stadt/das Land herausfinden?
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
Andere Option:
Vorteile:
Nachteile:
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'}
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 .
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
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: '/' });
}
});
}
}
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
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.
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.
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;
}
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;
}
}
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.
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;
}