Как получить долготу и широту для адреса программно (и юридически)


предположительно, это можно получить из Google Maps или какой-то такой службы. (Только адреса США недостаточно хороши.)

13 70

13 ответов:

термин, который вы ищете, - это геокодирование, и Да, Google предоставляет эту услугу.

В дополнение к вышеупомянутым веб-сервис геокодирования Google, есть и конкурирующие сервис, предоставляемый Yahoo. В недавнем проекте, где геокодирование выполняется с помощью взаимодействия с пользователем, я включил поддержку для обоих. Причина в том, что я обнаружил, что, особенно за пределами США, их обработка более неясных мест широко варьируется. Иногда Google будет иметь лучший ответ, иногда Yahoo.

один gotcha, чтобы быть в курсе: если Google действительно думает, что они не знают, где ваше место, они вернут ошибку 602, указывающую на сбой. Yahoo, с другой стороны, если он может очистить город/провинцию/штат/и т. д. От вашего плохого адреса, вернет местоположение центра этого города. Так что вы должны обратить внимание на результаты, которые вы получите, чтобы увидеть, если они действительно то, что вы хотите. В некоторых результатах есть вспомогательные поля, которые говорят вам об этом: Yahoo называет это поле "точностью", а Google называет его "точностью".

Если вы хотите сделать это, не полагаясь на сервис, потом скачать TIGER Shapefiles из переписи населения США.

вы смотрите на интересующую вас улицу, которая будет иметь несколько сегментов. Каждый сегмент будет иметь начальный адрес и конечный адрес, и вы интерполируете вдоль сегмента, чтобы найти, где на сегменте лежит ваш номер дома.

Это предоставит вам пару lon/lat.

имейте в виду, однако, что в интернете службы используют много проверки и исправления адресов, которые вам также придется дублировать, чтобы получить хорошие результаты.

также обратите внимание, что, как ни хорошо, как бесплатные данные, это не идеально - последние улицы не там (они могут быть в данных Google использует), и улицы могут быть от их реального местоположения на некоторую сумму из-за неточностей опроса. Но для 98% потребностей геокодирования он отлично работает, свободен, и вы контролируете все, поэтому вы уменьшаете зависимости в своем приложение.

Openstreetmaps имеет целью отображения всего в мире, хотя они не совсем там стоит следить за тем, как они предоставляют свои данные под лицензией CC

многие (большинство?) другие страны отображаются только правительством или услугами, за которые вам нужно заплатить плату. Если вам не нужно геокодировать очень много данных, то с помощью Google, Yahoo или некоторых других бесплатных картографических сервисов по всему миру может быть достаточно.

Если вам нужно геокодировать много данных, то вам будет лучше всего обслуживать лизинг картографических данных от крупного поставщика, такого как teleatlas.

Адам

вы также можете попробовать OpenStreetMapNameFinder, который содержит открытый источник, wiki-подобные уличные данные для (потенциально) всего мира. NameFinder прекратит свое существование в конце августа, но Nominatim - это его замена.

Google требует, чтобы вы показывали карту Google со своими данными, с максимальным количеством запросов HTTP 2.5 k (was 25k) в день. Полезно, но вы должны следить за использованием.

у них

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 (и поскольку это было для внутреннего корпоративного приложения, нам пришлось перейти на их премиальный сервис, который составляет $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);
  } 
});

enter image description here