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

76

Предположительно, это можно получить с Карт Google или с помощью такой службы. (Адреса США только не достаточно хороши.)

Теги:
web-services
geolocation
geocoding
street-address

14 ответов

69
Лучший ответ

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

  • 1
    Отлично! Раздел "Геокодирование по HTTP", кажется, то, что я ищу.
  • 3
    Просто убедитесь, что вы соблюдаете правила использования. Я думаю, что Google разрешает использовать это, только если вы показываете местоположения на карте Google. Не разрешается использовать его для других целей, но вы должны проверить лицензию и правила использования.
Показать ещё 3 комментария
23

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

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

  • 1
    Jsfiddle с примером замены для службы Yahoo, ovimaps от Nokia: jsfiddle.net/MgjGr
15

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

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

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

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

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

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

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

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

-Adam

  • 0
    Это не сработает (для этого вопроса; в целом это звучит нормально для США), поскольку этот вопрос уже гласит, что решение, которое работает только для адресов США, не будет приемлемым решением.
  • 1
    Это правда, но изначально в вопросе об этом не говорилось - изменения, сделанные автором в течение 15 минут после первоначального сообщения, не считаются изменениями. Тем не менее, я обновлю ответ.
9

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

7

Google требует, чтобы вы показывали карту Google с их данными, с максимальным объемом запросов на 2,5 тыс. (было 25 тыс.) в день. Полезно, но вам нужно следить за использованием.

У них есть

http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders

(Google с тех пор удалил это. Если вы видите дубликат или кеш, я свяжусь с ним.)

... в котором я нашел GeoNames, который имеет загружаемый db, бесплатный веб-сервис и коммерческий веб-сервис.

  • 1
    К сожалению, кажется, что ссылка groups.google.com больше не существует ... Спасибо за ссылку geonames, однако, выглядит многообещающе!
  • 1
    Точка исправления / уточнения: Google v3 API разрешает 2500 запросов в день (на IP-адрес!), А не 25k. См. Developers.google.com/maps/documentation/geocoding/#Limits.
Показать ещё 1 комментарий
4

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

3

Для использования с 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;
}
  • 0
    Супер! Слава Богу, прочитайте все ответы, вот и я могу найти ваш ответ. Должен ли я знать, есть ли какие-либо ограничения использования этого URL в нормальном php. как количество запросов в день? @Nate
2

Если вы хотите сделать это в 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-запросе.

2

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"
2

Вы также можете сделать это с помощью Microsoft MapPoint Web Services.

Вот сообщение в блоге, в котором объясняется, как: http://www.codestrider.com/BlogRead.aspx?b=b5e8e275-cd18-4c24-b321-0da26e01bec5

  • 0
    Выше ссылка кажется сломанной
2

Здесь вы можете ознакомиться с документами API Карт Google, чтобы начать с этого:

http://code.google.com/apis/maps/documentation/services.html#Geocoding

Это также похоже на то, что вы можете сделать для международных адресов, используя Live Maps:

http://virtualearth.spaces.live.com/blog/cns!2BBC66E99FDCDB98!1588.entry

1

В 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.
Возвращается правильно. 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)

Надеюсь, поможет.

1

Вы можете попробовать это на 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);
  } 
});

Изображение 7887

1

У меня была партия из 100 000 записей, которые были геокодом и попали в пределы API Google (и поскольку это было для внутреннего корпоративного приложения, нам пришлось обновить их премиум-сервис, который составляет $10 тыс. плюс)

Итак, я использовал это вместо: http://geoservices.tamu.edu/Services/Geocode/BatchProcess/ - у них также есть API. (общая стоимость около ~ 200 $)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню