Как получить долготу и широту для адреса улицы программно (и юридически)
предположительно, это можно получить из Google Maps или какой-то такой службы. (Американские адреса недостаточно хороши.)
13 ответов
В дополнение к вышеупомянутым веб-сервис геокодирования Google, есть и конкурирующие услуги, предоставляемые Yahoo. В недавнем проекте, где геокодирование выполняется с помощью взаимодействия с пользователем, я включил поддержку для обоих. Причина в том, что я обнаружил, что, особенно за пределами США, их обработка более неясных мест сильно варьируется. Иногда у Google будет лучший ответ, иногда Yahoo.
один должен быть в курсе: если Google действительно думает, что они не знают, где ваше место, они вернут ошибку 602, указывающую на сбой. Yahoo, с другой стороны, если он может очистить город/провинцию/штат/и т. д. От вашего плохого адреса, вернет местоположение центра этого города. Поэтому вы должны обратить внимание на результаты, которые вы получите, чтобы увидеть, действительно ли они то, что вы хотите. В некоторых результатах есть вспомогательные поля, которые говорят вам об этом: Yahoo называет это поле "точностью", а Google называет его "точностью".
Если вы хотите сделать это, не полагаясь на сервис, потом скачать тигровые Шейп-файлы из переписи населения США.
вы смотрите на улицу, которая вас интересует, которая будет иметь несколько сегментов. Каждый сегмент будет иметь начальный и конечный адреса, и вы интерполировать вдоль сегмента, чтобы найти, где на сегменте ваш номер дома лежит.
Это предоставит вам пару lon/lat.
имейте в виду, однако, что онлайн службы используют много проверки и коррекции адресов, которые вам также придется дублировать, чтобы получить хорошие результаты.
также обратите внимание, что, как хорошо, как бесплатные данные, это не идеально - последние улицы не там (они могут быть в данных Google использует), и улицы могут быть от их реального местоположения на некоторую сумму из-за неточностей опроса. Но для 98% потребностей геокодирования он работает отлично, свободен, и вы контролируете все, поэтому вы уменьшаете зависимости в своем приложение.
Openstreetmaps имеет целью отображения всего в мире, хотя они не совсем там, стоит следить за тем, как они предоставляют свои данные под лицензией CC
многие (большинство?) другие страны отображаются только правительством или услугами, за которые вам нужно заплатить плату. Если вам не нужно геокодировать очень много данных, то достаточно использовать Google, Yahoo или некоторые другие бесплатные картографические сервисы по всему миру.Если вам нужно геокодировать много данных, то вам будет лучше всего обслуживаться лизинг данных карты от крупного поставщика, таких как teleatlas.
Адам
вы также можете попробовать OpenStreetMap NameFinder, который содержит открытые исходные, wiki-подобные уличные данные для (потенциально) всего мира. NameFinder перестанет существовать в конце августа, но Nominatim - это его замена.
Google требует, чтобы вы показывали карту Google со своими данными, максимум 2,5 k (было 25k) HTTP-запросов в день. Полезно, но вы должны следить за использованием.
у них
http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders
(с тех пор Google удалил это. Если вы увидите дубликат или кэш, я свяжусь с ним.)
..., в котором я нашел GeoNames и загружаемые дБ, бесплатный веб-сервис и веб-сервис.
условия обслуживания 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;
}
вы можете посмотреть на Google Maps API docs здесь, чтобы начать с этого:
http://code.google.com/apis/maps/documentation/services.html#Geocoding
Это также похоже на то, что вы можете сделать для международных адресов, используя живые карты:
http://virtualearth.spaces.live.com/blog/cns!2BBC66E99FDCDB98!1588.entry
вы также можете сделать это с помощью веб-служб Microsoft 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 (и поскольку это было для внутреннего корпоративного приложения, нам пришлось перейти на их премиум-сервис ,который составляет $ 10K plus)
Итак, я использовал это вместо этого: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);
}
});