Як програмно (і юридично) отримати довготу та широту для вуличної адреси


Відповіді:


70

Термін, який ви шукаєте, - це геокодування, і Google надає цю послугу.


1
Відмінно! Розділ "Геокодування через HTTP", здається, саме те, що я шукаю.
Ola Eldøy,

3
Тільки переконайтеся, що дотримуєтесь правил використання. Я думаю, що Google дозволяє використовувати це лише в тому випадку, якщо ви показуєте місця на карті Google. Не дозволяється використовувати його для інших цілей, але слід перевірити ліцензію та правила використання.
peSHIr

v2 (застарілий з 2010 р.) повністю вимикається всього за кілька місяців (травень 2013 р.), тому рекомендуємо більше не створювати нічого нового на цьому!
Funka

Отримати його через службу дозволено, але зберігати для подальшого використання - ні. Див. Коментар (під відповіддю) про це тут stackoverflow.com/a/30595524/2403881
Нхан

22

На додаток до згаданої веб-служби геокодування Google , існує також конкуруюча послуга, яку надає Yahoo . У недавньому проекті, де геокодування виконується за допомогою взаємодії з користувачем, я включив підтримку обох. Причина полягає в тому, що я виявив, що, особливо за межами США, поводження з більш незрозумілими місцями дуже різниться. Іноді найкращу відповідь отримає Google, іноді Yahoo.

Треба пам’ятати: якщо Google дійсно вважає, що вони не знають, де ваше місце, вони повернуть повідомлення про помилку 602, що вказує на помилку. З іншого боку, Yahoo, якщо він може вилучити місто / провінцію / штат / тощо з вашої поганої адреси, поверне місце розташування центру цього міста. Тому вам доведеться звертати увагу на отримані результати, щоб перевірити, чи вони насправді такі, як ви хочете. У деяких результатах є допоміжні поля, які говорять вам про це: Yahoo називає це поле "точністю", а Google - "точністю".


1
Jsfiddle із прикладом заміни служби Yahoo, ovimaps Nokia: jsfiddle.net/MgjGr
Кріс

15

Якщо ви хочете зробити це, не покладаючись на послугу, ви завантажуєте TIGER Shapefiles з перепису населення США.

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

Це забезпечить вам парі lon / lat.

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

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

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

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

Якщо вам доведеться геокодувати багато даних, то вам найкраще буде допомогти, орендуючи картографічні дані у великого постачальника, такого як телеатлас.

-Адам


Це не спрацювало б (для цього питання; загалом для США це чудово звучить), оскільки в цьому питанні вже зазначається, що рішення, яке працює лише для адрес у США, не буде прийнятним рішенням.
peSHIr

1
Це правда, але спочатку у питанні цього не було зазначено - редагування, зроблені автором протягом 15 хвилин після вихідної публікації, не вважаються редагуваннями. Все-таки я оновлю відповідь.
Адам Девіс,

9

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


7

Google вимагає, щоб ви показували карту Google із їхніми даними, макс. 2,5 тис. (Було 25 тис.) Запитів HTTP на день. Корисно, але ви повинні стежити за використанням.

Вони справді мають

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

(З тих пір Google видалив це. Якщо ви побачите дублікат або кеш-пам’ять, я зв’яжу з цим.)

... в якому я знайшов GeoNames, який має як завантажуваний db, безкоштовний веб-сервіс, так і комерційний веб-сервіс.


1
На жаль, здається, що посилання groups.google.com більше не існує ... Дякую за посилання на геоназви, однак, виглядає багатообіцяючим!
Funka

1
Точка виправлення / роз'яснення: API Google "v3" дозволяє 2500 запитів на день (на IP-адресу!), А не 25 тис. Див. Developers.google.com/maps/documentation/geocoding/#Limits
Funka

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;
}

Супер! , Слава Богу, прочитайте всю відповідь, ось ви можете знайти вашу відповідь. Чи повинен я знати, чи є обмеження щодо використання цієї URL-адреси в звичайному php. як кількість запитів на день? @Nate
Rajesh



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

Якщо ви хочете зробити це в 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-запиті.


1

У мене була партія із 100 000 записів для геокодування, і я натрапив на обмеження Google API (і оскільки це стосувалося внутрішнього корпоративного додатка, нам довелося перейти на їх преміум-сервіс, який перевищує 10 тис. Доларів США)

Отже, я використав замість цього: http://geoservices.tamu.edu/Services/Geocode/BatchProcess/ - вони також мають API. (загальна вартість склала близько ~ 200 $)


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);
  } 
});

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


1

У python за допомогою геопії 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)

Сподіваюся, це допоможе.


0

Я знаю, що це старе питання, але 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.