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

Предположительно, это можно получить из Google Maps или другого подобного сервиса. (Только адреса в США недостаточно.)


person Ola Eldøy    schedule 01.10.2008    source источник


Ответы (15)


Вам нужен термин геокодирование, и да, Google действительно предоставляет эту услугу.

person Sijin    schedule 01.10.2008
comment
Отлично! Мне кажется, что я ищу раздел «Геокодирование через HTTP». - person Ola Eldøy; 01.10.2008
comment
Только убедитесь, что вы соблюдаете правила использования. Я думаю, что Google позволяет использовать это только в том случае, если вы показываете местоположения на карте Google. Его нельзя использовать для других целей, но вы должны проверить лицензию и правила использования. - person peSHIr; 05.11.2012
comment
v2 (не рекомендуется с 2010 г.) полностью закрывается всего через несколько месяцев (май 2013 г.), поэтому рекомендую больше не создавать ничего нового с этой версией! - person Funka; 10.01.2013
comment
Получить его через службу можно, но нельзя хранить для дальнейшего использования. См. Комментарий (под ответом) об этом здесь stackoverflow.com/a/30595524/2403881 - person Nhan; 14.07.2016

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

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

person Tim Farley    schedule 01.10.2008
comment
Jsfiddle с примером замены службы Yahoo, Nokia ovimaps: jsfiddle.net/MgjGr - person Chris Moschini; 07.02.2012

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

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

Это даст вам пару долгота / широта.

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

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

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

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

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

-Адам

person Adam Davis    schedule 01.10.2008
comment
Это не сработает (для этого вопроса; в целом это звучит нормально для США), поскольку в вопросе уже говорится, что решение, которое работает только для адресов в США, не будет приемлемым решением. - person peSHIr; 16.10.2009
comment
Это правда, но изначально в вопросе об этом не говорилось - правки, сделанные автором в течение 15 минут после исходного сообщения, не считаются правками. Тем не менее, я обновлю ответ. - person Adam Davis; 16.10.2009

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

person peSHIr    schedule 15.01.2009

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

У них есть

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

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

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

person Richard Watson    schedule 29.09.2009
comment
К сожалению, похоже, что ссылка groups.google.com больше не существует ... Спасибо за ссылку geonames, однако она выглядит многообещающей! - person Funka; 15.11.2012
comment
Исправление / уточнение: API Google v3 допускает 2500 запросов в день (на IP-адрес!), А не 25k. См. developers.google.com/maps/documentation/geocoding/#Limits. - person Funka; 10.01.2013

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

person Craig Wohlfeil    schedule 01.10.2008

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

Чтобы начать, вы можете ознакомиться с документацией по API Карт Google здесь:

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

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

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

person Carl    schedule 01.10.2008

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

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

person Stephen Curial    schedule 04.03.2009
comment
Выше ссылка кажется неработающей - person Gurupad Hegde; 23.10.2015

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"
person Selva    schedule 13.05.2015

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

person Suman    schedule 21.07.2015

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

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

person paras_doshi    schedule 18.02.2016

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

введите описание изображения здесь

person Adiii    schedule 21.11.2016

В 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)

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

person Parthiban Soundram    schedule 31.01.2019

Я знаю, что это старый вопрос, но 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>
person Mukesh Jakhar    schedule 21.02.2019