Мовляв, це можна отримати на Картах Google або на якійсь такій службі. (Лише адреси в США недостатньо хороші.)
Відповіді:
Термін, який ви шукаєте, - це геокодування, і Google надає цю послугу.
На додаток до згаданої веб-служби геокодування Google , існує також конкуруюча послуга, яку надає Yahoo . У недавньому проекті, де геокодування виконується за допомогою взаємодії з користувачем, я включив підтримку обох. Причина полягає в тому, що я виявив, що, особливо за межами США, поводження з більш незрозумілими місцями дуже різниться. Іноді найкращу відповідь отримає Google, іноді Yahoo.
Треба пам’ятати: якщо Google дійсно вважає, що вони не знають, де ваше місце, вони повернуть повідомлення про помилку 602, що вказує на помилку. З іншого боку, Yahoo, якщо він може вилучити місто / провінцію / штат / тощо з вашої поганої адреси, поверне місце розташування центру цього міста. Тому вам доведеться звертати увагу на отримані результати, щоб перевірити, чи вони насправді такі, як ви хочете. У деяких результатах є допоміжні поля, які говорять вам про це: Yahoo називає це поле "точністю", а Google - "точністю".
Якщо ви хочете зробити це, не покладаючись на послугу, ви завантажуєте TIGER Shapefiles з перепису населення США.
Ви дивитесь на вулицю, яка вас цікавить, яка матиме кілька сегментів. Кожен сегмент матиме початкову та кінцеву адреси, і ви інтерполюєте вздовж сегмента, щоб знайти, де на сегменті знаходиться ваш номер будинку.
Це забезпечить вам парі lon / lat.
Однак майте на увазі, що в Інтернет-сервісах застосовується велика кількість перевірки та виправлення адрес, які вам також доведеться продублювати, щоб отримати хороші результати.
Також зауважте, що як би хороші не були дані, вони не ідеальні - найновіших вулиць там немає (вони можуть бути в даних, які використовує Google), і вулиці можуть десь відставати від свого реального розташування через неточності опитування. Але для 98% потреб геокодування це працює ідеально, безкоштовно, і ви контролюєте все, щоб зменшити залежності у своєму додатку.
Openstreetmaps має на меті відобразити все у світі, хоча їх там не зовсім, варто стежити за ними, оскільки вони надають свої дані за ліцензією CC
Однак багато (більшість?) Інших країн нанесені на карту лише урядом чи службами, за які потрібно сплатити збір. Якщо вам не потрібно геокодувати дуже багато даних, то використання Google, Yahoo або деяких інших безкоштовних служб картографування у всьому світі може бути достатнім.
Якщо вам доведеться геокодувати багато даних, то вам найкраще буде допомогти, орендуючи картографічні дані у великого постачальника, такого як телеатлас.
-Адам
Ви також можете спробувати OpenStreetMap NameFinder , який містить дані про вулиці з відкритим вихідним кодом для (потенційно) всього світу. NameFinder припинить своє існування наприкінці серпня, але заміною його буде Nominatim .
Google вимагає, щоб ви показували карту Google із їхніми даними, макс. 2,5 тис. (Було 25 тис.) Запитів HTTP на день. Корисно, але ви повинні стежити за використанням.
Вони справді мають
http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders
(З тих пір Google видалив це. Якщо ви побачите дублікат або кеш-пам’ять, я зв’яжу з цим.)
... в якому я знайшов GeoNames, який має як завантажуваний db, безкоштовний веб-сервіс, так і комерційний веб-сервіс.
Умови використання Google дозволять вам безкоштовно використовувати їх API геокодування, якщо ваш веб-сайт, у свою чергу, безкоштовний для споживачів. Якщо ні, то вам доведеться отримати ліцензію на Карти підприємства.
Для використання з Drupal та PHP (і легко модифікується):
function get_lat_long($address) {
$res = drupal_http_request('http://maps.googleapis.com/maps/api/geocode/json?address=' . $address .'&sensor=false');
return json_decode($res->data)->results[0]->geometry->location;
}
Тут ви можете ознайомитися з документами API Google Maps, щоб розпочати це:
http://code.google.com/apis/maps/documentation/services.html#Geocoding
Здається, це також щось, що ви можете зробити для міжнародних адрес, використовуючи також Live Maps:
http://virtualearth.spaces.live.com/blog/cns!2BBC66E99FDCDB98!1588.entry
Ви також можете зробити це за допомогою веб-служб Майкрософт MapPoint.
Ось допис у блозі, який пояснює, як: http://www.codestrider.com/BlogRead.aspx?b=b5e8e275-cd18-4c24-b321-0da26e01bec5
R Код для отримання широти та довготи вуличної адреси
# CODE TO GET THE LATITUDE AND LONGITUDE OF A STREET ADDRESS WITH GOOGLE API
addr <- '6th Main Rd, New Thippasandra, Bengaluru, Karnataka' # set your address here
url = paste('http://maps.google.com/maps/api/geocode/xml?address=', addr,'&sensor=false',sep='') # construct the URL
doc = xmlTreeParse(url)
root = xmlRoot(doc)
lat = xmlValue(root[['result']][['geometry']][['location']][['lat']])
long = xmlValue(root[['result']][['geometry']][['location']][['lng']])
lat
[1] "12.9725020"
long
[1] "77.6510688"
Якщо ви хочете зробити це в Python:
import json, urllib, urllib2
address = "Your address, New York, NY"
encodedAddress = urllib.quote_plus(address)
data = urllib2.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=" + encodedAddress + '&sensor=false').read()
location = json.loads(data)['results'][0]['geometry']['location']
lat = location['lat']
lng = location['lng']
print lat, lng
Зверніть увагу, що Google, здається, придушує запити, якщо бачить більше певної суми, тому ви хочете використовувати ключ API у своєму HTTP-запиті.
У мене була партія із 100 000 записів для геокодування, і я натрапив на обмеження Google API (і оскільки це стосувалося внутрішнього корпоративного додатка, нам довелося перейти на їх преміум-сервіс, який перевищує 10 тис. Доларів США)
Отже, я використав замість цього: http://geoservices.tamu.edu/Services/Geocode/BatchProcess/ - вони також мають API. (загальна вартість склала близько ~ 200 $)
Ви можете спробувати це в JavaScript для такого міста, як kohat
var geocoder = new google.maps.Geocoder();
var address = "kohat";
geocoder.geocode( { 'address': address}, function(results, status) {
var latitude = results[0].geometry.location.lat();
var longitude = results[0].geometry.location.lng();
alert(latitude+" and "+longitude);
}
});
У python за допомогою геопії PyPI використовується для отримання широти, довготи, поштового індексу тощо. Ось робочий зразок коду ..
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your-app-id")
location = geolocator.geocode("Your required address ")
if location:
print('\n Nominatim ADDRESS :',location.address)
print('\n Nominatim LATLANG :',(location.latitude, location.longitude))
print('\n Nominatim FULL RESPONSE :',location.raw)
else:
print('Cannot Find')
У Nominatim - деякі адреси не можуть працювати, тому я щойно спробував MapQuest .
Повертається правильно. Mapquest забезпечує безкоштовний план 15000 транзакцій на місяць. Мені цього досить.
Зразок коду:
import geocoder
g = geocoder.mapquest("Your required address ",key='your-api-key')
for result in g:
# print(result.address, result.latlng)
print('\n mapquest ADDRESS :',result.address,result.city,result.state,result.country)
print('\n mapquest LATLANG :', result.latlng)
print('\n mapquest FULL RESPONSE :',result.raw)
Сподіваюся, це допоможе.
Я знаю, що це старе питання, але Google змінює спосіб отримання широти та довготи на регулярній основі.
HTML-код
<form>
<input type="text" name="address" id="address" style="width:100%;">
<input type="button" onclick="return getLatLong()" value="Get Lat Long" />
</form>
<div id="latlong">
<p>Latitude: <input size="20" type="text" id="latbox" name="lat" ></p>
<p>Longitude: <input size="20" type="text" id="lngbox" name="lng" ></p>
</div>
Код JavaScript
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" async defer></script>
<script>
function getLatLong()
{
var address = document.getElementById("address").value;
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var latitude = results[0].geometry.location.lat();
document.getElementById("latbox").value=latitude;
var longitude = results[0].geometry.location.lng();
document.getElementById("lngbox").value=longitude;
}
});
}
</script>