Na przykład, jeśli mamy taki zestaw współrzędnych
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Jak możemy poznać miasto / kraj?
Na przykład, jeśli mamy taki zestaw współrzędnych
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Jak możemy poznać miasto / kraj?
Odpowiedzi:
Bezpłatny interfejs API Google Geocoding udostępnia tę usługę za pośrednictwem interfejsu API REST HTTP. Uwaga: API jest ograniczone pod względem użycia i stawki , ale możesz zapłacić za nieograniczony dostęp.
Wypróbuj ten link, aby zobaczyć przykład danych wyjściowych (to jest w formacie json, dane wyjściowe są również dostępne w formacie XML)
https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true
Inna opcja:
Zalety:
Niedogodności:
Potrzebujesz geopy
pip install geopy
i wtedy:
from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")
print(location.address)
aby uzyskać więcej informacji:
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'}
Alternatywą Open Source jest Nominatim z Open Street Map. Wszystko, co musisz zrobić, to ustawić zmienne w adresie URL i zwraca miasto / kraj tej lokalizacji. Sprawdź poniższy link, aby uzyskać oficjalną dokumentację: Nominatim
Szukałem podobnej funkcjonalności i zobaczyłem dane „ http://download.geonames.org/export/dump/ ” udostępnione we wcześniejszej odpowiedzi (dziękuję za udostępnienie, jest to doskonałe źródło) i wdrożyłem usługę opartą na na danych cities1000.txt.
Możesz zobaczyć, jak działa pod adresem
http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (uszkodzony link)
Po prostu zmień szerokość i długość geograficzną dla swoich lokalizacji.
Jest wdrażany w OpenShift (platforma RedHat). Pierwsze połączenie po długim okresie bezczynności może trochę potrwać, ale zwykle wydajność jest zadowalająca. Zapraszam do korzystania z tej usługi w dowolny sposób ...
Możesz również znaleźć źródło projektu na https://github.com/turgos/Location .
Użyłem Geocodera , dobrej biblioteki Pythona, która obsługuje wielu dostawców, w tym Google, Geonames i OpenStreetMaps, aby wymienić tylko kilka . Próbowałem użyć biblioteki GeoPy i często pojawiają się limity czasu. Tworzenie własnego kodu dla GeoNames nie jest najlepszym sposobem wykorzystania Twojego czasu i możesz otrzymać niestabilny kod. Z mojego doświadczenia wynika, że Geocoder jest bardzo prosty w użyciu i ma wystarczająco dobrą dokumentację . Poniżej znajduje się przykładowy kod do wyszukiwania miasta według szerokości i długości geograficznej lub wyszukiwania szerokości / długości geograficznej według nazwy miasta.
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
, sam też chciałbym spróbować!
Spędziłem około 30 minut, próbując znaleźć przykładowy kod, jak to zrobić w JavaScript. Nie udało mi się znaleźć szybkiej i jasnej odpowiedzi na zadane przez Ciebie pytanie. Więc ... stworzyłem własne. Miejmy nadzieję, że ludzie mogą z tego korzystać bez konieczności zagłębiania się w API lub wpatrywania się w kod, którego nie mają pojęcia, jak czytać. Ha, jeśli nic więcej, mogę odnieść się do tego postu dla własnych rzeczy .. Miłe pytanie i dzięki za forum dyskusji!
To wykorzystuje Google API.
<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: '/' });
}
});
}
}
Wiem, że to pytanie jest naprawdę stare, ale pracowałem nad tym samym problemem i znalazłem niezwykle wydajny i wygodny pakiet reverse_geocoder
, zbudowany przez Ajaya Thampi. Kod jest dostępny tutaj . Opiera się na równoległej implementacji drzew KD, co jest niezwykle wydajne dla dużej liczby punktów (zajęło mi kilka sekund, aby uzyskać 100 000 punktów.
Opiera się na tej bazie danych, która została już wyróżniona przez @turgos.
Jeśli Twoim zadaniem jest szybkie znalezienie kraju i miasta z listy współrzędnych, jest to świetne narzędzie.
To naprawdę zależy od tego, jakie masz ograniczenia technologiczne.
Jednym ze sposobów jest posiadanie przestrzennej bazy danych zawierającej zarys krajów i miast, którymi jesteś zainteresowany. Przez zarys rozumiem, że kraje i miasta są przechowywane jako wielokąt typu przestrzennego. Twój zestaw współrzędnych może zostać przekonwertowany na punkt typu przestrzennego i porównany z wielokątami, aby uzyskać nazwę kraju / miasta, w którym znajduje się punkt.
Oto niektóre bazy danych obsługujące typ przestrzenny: SQL server 2008 , MySQL , postGIS - rozszerzenie postgreSQL i Oracle .
Jeśli chcesz skorzystać z usługi zamiast posiadania własnej bazy danych, możesz skorzystać z usługi GeoPlanet Yahoo . Jeśli chodzi o podejście do usług, możesz sprawdzić tę odpowiedź na gis.stackexchange.com , która obejmuje dostępność usług umożliwiających rozwiązanie problemu.
Możesz użyć Google Geocoding API
Poniżej znajduje się funkcja php, która zwraca adres, miasto, stan i kraj
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 to narzędzie oparte na języku Golang, które zwraca kod kraju ISO alpha-3 dla podanych współrzędnych lokalizacji (szer. / Dł.). Odpowiada w mikrosekundach. Używa geohash do mapy kraju.
Dane geohash są generowane za pomocą georaptora .
Do tego narzędzia używamy geohaszu na poziomie 6, czyli skrzynek o wymiarach 1,2km x 600m.
Zminimalizuj liczbę bibliotek.
Uzyskaj klucz do korzystania z interfejsu API w ich witrynie internetowej i po prostu uzyskaj wynik w żądaniu http:
curl -i -H "key: YOUR_KEY" -X GET https://api.latlong.dev/lookup?lat=38.7447913&long=-9.1625173
Sprawdź poniższą odpowiedź. Mi to pasuje
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;
}
Jeśli korzystasz z interfejsu API Miejsc Google, możesz pobrać kraj i miasto z obiektu miejsca za pomocą JavaScript:
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;
}
}