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

StackOverflow https://stackoverflow.com/questions/158474

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Это обеспечит вас парой lon / lat.

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

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

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

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

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

-Адам

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

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

У них действительно есть

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

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

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

Условия предоставления услуг 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 здесь, чтобы начать с этого:

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

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

http://virtualearth.spaces.live.com/blog/cns !2BBC66E99FDCDB98!1588.запись

Вы также можете сделать это с помощью веб-служб 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 для city, например кохат

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

В python с использованием геометрический PyPI используется для получения latitude, langitude, почтового индекса и т.д..Вот рабочий пример кода..

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 предоставляет бесплатный план 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>

Для получения дополнительной информации перейдите по этой ссылке https://www.phpkida.com/java-script/get-latitude-longitude-from-address/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top