Предположительно, это можно получить из Google Maps или другого подобного сервиса. (Только адреса в США недостаточно.)
Как получить долготу и широту почтового адреса программно (и юридически)
Ответы (15)
Вам нужен термин геокодирование, и да, Google действительно предоставляет эту услугу.
Новый API V3: http://code.google.com/apis/maps/documentation/geocoding/
Старый API V2: http://code.google.com/apis/maps/documentation/services.html#Geocoding
В дополнение к вышеупомянутой веб-службе геокодирования Google существует также конкурирующий сервис, предоставляемый Yahoo. В недавнем проекте, где геокодирование выполняется при взаимодействии с пользователем, я включил поддержку обоих. Причина в том, что я обнаружил, что, особенно за пределами США, их работа с менее известными местами сильно различается. Иногда лучший ответ будет у Google, иногда у Yahoo.
Одна хитрость, о которой следует знать: если Google действительно думает, что они не знают, где вы находитесь, они вернут ошибку 602, указывающую на сбой. Yahoo, с другой стороны, если он может удалить город / провинцию / штат / и т. Д. Из вашего плохого адреса, вернет местоположение центра этого города. Поэтому вам нужно обращать внимание на результаты, которые вы получаете, чтобы увидеть, действительно ли они соответствуют вашим ожиданиям. В некоторых результатах есть вспомогательные поля, которые сообщают вам об этом: Yahoo называет это поле «точностью», а Google - «точностью».
Если вы хотите сделать это, не полагаясь на службу, загрузите TIGER Шейп-файлы из переписи населения США.
Вы смотрите вверх по интересующей вас улице, которая будет состоять из нескольких сегментов. Каждый сегмент будет иметь начальный и конечный адреса, и вы интерполируете по сегменту, чтобы найти, где находится номер вашего дома.
Это даст вам пару долгота / широта.
Однако имейте в виду, что онлайн-сервисы включают много проверок и исправлений адресов, которые вам также придется продублировать, чтобы получить хорошие результаты.
Также обратите внимание, что какими бы хорошими ни были бесплатные данные, они не идеальны - последних улиц там нет (они могут быть в данных, которые использует Google), и улицы могут отличаться от своего реального местоположения на некоторую величину из-за неточностей опроса. Но для 98% потребностей геокодирования он работает отлично, является бесплатным, и вы все контролируете, сокращая количество зависимостей в своем приложении.
Openstreetmaps имеет цель отображать все в мире, хотя они не совсем там, за ними стоит следить, поскольку они предоставляют свои данные по лицензии CC
Однако многие (большинство?) Других стран отображаются только правительствами или службами, за которые нужно платить. Если вам не нужно геокодировать очень много данных, тогда может быть достаточно использования Google, Yahoo или некоторых других бесплатных картографических сервисов по всему миру.
Если вам необходимо геокодировать большой объем данных, вам лучше всего подойдет аренда картографических данных у крупного поставщика, такого как Teleatlas.
-Адам
Вы также можете попробовать 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, в котором есть загружаемая база данных, бесплатная веб-служба и коммерческая веб-служба .
Условия обслуживания Google позволят вам бесплатно использовать их API геокодирования, если ваш веб-сайт, в свою очередь, бесплатен для использования потребителями. В противном случае вам нужно будет получить лицензию на Enterprise Maps.
Для использования с 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 здесь:
http://code.google.com/apis/maps/documentation/services.html#Geocoding
Это также похоже на то, что вы можете сделать для международных адресов с помощью Live Maps:
http://virtualearth.spaces.live.com/blog/cns!2BBC66E99FDCDB98!1588.entry
Вы также можете сделать это с помощью Microsoft MapPoint Web Services.
Вот сообщение в блоге, в котором объясняется, как: 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-запросе.
У меня был пакет из 100000 записей для геокодирования, и я столкнулся с лимитом Google API (и, поскольку это было для внутреннего корпоративного приложения, нам пришлось перейти на их премиум-сервис, который стоит 10 тысяч долларов плюс)
Итак, я использовал вместо этого: http://geoservices.tamu.edu/Services/Geocode/BatchProcess/ - у них тоже есть API. (общая стоимость около ~ 200 $)
Вы можете попробовать это в JavaScript для такого города, как кохат.
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 с использованием geopy 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 strong>.
Он возвращается правильно. 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>
