Як геокодувати 300 000 адрес на льоту?


18

У мене є база даних, яка має 300 000 адрес, які потрібно показати на карті. Я знаю, якщо я геокодую всю адресу, це буде для мене занадто дорогим. Тож мені було цікаво, чи можна геокодувати адресу під час руху в режимі реального часу, коли користувач вибере адресу (адресу властивості), він буде шукати в базі даних, а потім геокодувати адресу, а потім зіставити її з інші атрибути.

Було б дуже приємно, якби ви могли поділитися кодом, концепцією чи чим завгодно. До речі, мій бекенд у Myql підтримується Joomla.


Зазвичай я використовую можливість геокодування ArcGIS для геокодування великої кількості адрес. Також мене дуже цікавлять процеси, пояснені тут, зокрема, як тестувати сценарій python для геокодування адрес за допомогою Google, а потім порівнювати їх з тим, що я отримав від ArcGIS. На жаль, мені здається, що я не в змозі знайти всі пов'язані файли та сценарії, які є в різних місцях. Буде так вдячно, якщо хтось, будь ласка, надішле мені всі сценарії в одному поштовому файлі або будь-яку покрокову інструкцію. Я намагався використати його і отримати вам відгуки, але я не мав успіху
Housh

Відповіді:


15

Мегул, я працював у галузі перевірки адрес у компанії під назвою SmartyStreets. Там багато послуг геокодування, але лише деякі підтримують пакетну обробку з потрібним обсягом. (Google та інші забороняють масове використання свого API чи зберігання / кешування результатів.)

Якщо ви переходите до своєї бази даних MySQL та виконуєте експорт таблиці, що містить адреси, збережіть її, наприклад, у форматі CSV. Потім можна обробити його за допомогою веб-інструменту SmartyList або інструменту командного рядка . Як я вже казав, там є кілька сервісів, але ви хочете чогось, я вважаю, що також підтверджує існування адрес (отже, причина геокодування) - якщо адреса неправильна або неповна, такі й результати геокодування. . Це роблять лише деякі служби.

LiveAddress - це сервіс, сертифікований CASS USPS. Є кілька таких, щоб зробити ваше дослідження, але ви хочете чогось "на льоту" / швидкого і недорогого, тому знову рекомендую LiveAddress. Він не тільки перевірить адресу, але потім зробить так, як вам потрібно, що є інформація про lat / lon, а також точність результатів геокодування. Це все на базі веб-сторінок і за короткий час обробить десятки мільйонів записів (див. Це питання як посилання ).

Якщо вам надалі потрібно геокоректувати адреси під час взаємодії користувачів, LiveAddress також має версію API, яка може підключатися практично до всього, і вона також підтримує пакетну обробку на ходу, але оплачується як підписка, а не разова. оплата.


Не знайомий із SmartyStreets, виглядає багатообіцяючим, дякую за голову вгору.
Дерек Свінглі

API LiveAddress зробить 300 000 приблизно за 5-10 хвилин. Послуга LiveAddress for Lists (завантажте список для обробки) займає 15-20 хвилин. Обидва досить швидкі. Служба "Список" не вимагає від вас введення будь-якого коду.
Джеффрі

2
SmartyStreets лише геокоди для США?
Mapperz

У мене є дані, які Сингапур буде працювати? Якщо не будь-які вказівки, ви могли б мені дати ??
користувач1089553

У Google Bing та інших постачальників існує багато правил авторського права. Ви не експортуєте дані!

11

Якщо вам подобається Python, ви можете використовувати API GeoPy у поєднанні з прив'язками GDAL Python або Fiona , і створити такий базовий сценарій, як цей для перетворення адрес у точковий файл форми.

Це дозволить геолокувати файл з назвою 'adres_to_geocode', створивши вихідний файл форми з назвою 'my_output.shp' у папці my_output:

import os
from geopy import geocoders
from osgeo import ogr, osr

def geocode(address):
    g = geocoders.GoogleV3()
    place, (lat, lng) = g.geocode(address)
    print '%s: %.5f, %.5f' % (place, lat, lng)
    return place, lat, lng

def parse_file(filepath, output_shape):
    # create the shapefile
    drv = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(output_shape):
        drv.DeleteDataSource(output_shape)
    ds = drv.CreateDataSource(output_shape)
    # spatial reference
    sr = osr.SpatialReference()
    sr.ImportFromProj4('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
    lyr = ds.CreateLayer(output_shape, sr, ogr.wkbPoint)
    # fields
    featDefn = lyr.GetLayerDefn()
    fld_id = ogr.FieldDefn('id', ogr.OFTInteger)
    fld_address = ogr.FieldDefn('ADDRESS', ogr.OFTString)
    fld_address.SetWidth(255)
    lyr.CreateField(fld_id)
    lyr.CreateField(fld_address)
    print 'Shapefile %s created...' % ds.name
    # read text addresses file
    i = 0
    f = open(filepath, 'r')
    for address in f:
        try:
            print 'Geocoding %s' % address
            place, lat, lng = geocode(address)
            point = ogr.Geometry(ogr.wkbPoint)
            point.SetPoint(0, lng, lat)
            feat = ogr.Feature(lyr.GetLayerDefn())
            feat.SetGeometry(point)
            feat.SetField('id', i)
            feat.SetField('ADDRESS', address)
            lyr.CreateFeature(feat)
            feat.Destroy()
            i = i + 1
        except:
            print 'Error, skipping address...'

parse_file('addresses_to_geocode', 'my_output')

Файл повинен містити лише рядок для однієї адреси, наприклад, наприклад:

Via Benedetto Croce 112, Rome, Italy
Via Aristide Leonori 46, Rome, Italy
Viale Marconi 197, Rome, Italy

Тут я використовую API Google, але в GeoPy дуже просто переходити на API, такі як Yahoo !, GeoNames або MapPoint .


Це чудово! Спасибі людино! У будь-якому разі, в даний час (01/2016) "geocoders.Google ()" слід змінити на "geocoders.GoogleV3 ()", як у geopy.readthedocs.org/en/1.11.0
umbe1987,

1

Іншим варіантом вирішення вашої проблеми буде імпорт вашого набору даних у таблиці злиття та встановлення адресного поля як місця розташування. Тоді вони будуть геокодувати точки автоматично. Після цього ви зможете експортувати дані як KML.

Або ... альтернативно, ви можете написати php-скрипт, щоб скористатися геокодером Yahoo, який має обмеження в 50 000 записів, тому рано чи пізно всі ваші точки будуть геокодовані у вашій базі даних.

Я сподіваюся, що це допомогло!


спасибі тамас, але я не хотів би отримати kml, а потім отримати інформацію звідти, а потім до m db. Мені подобається ідея геокодування Yahoo, але я не надто впевнений у точності, яку я маю, оскільки я ніколи не використовував Yahoo для картографування. Будь ласка, дайте мені знати, чи є у вас написаний якийсь сценарій чи щось інше. Це чудова допомога
користувач1089553

Майте на увазі, що використання Yahoo (або Google, з цього приводу) геокодера з автоматизованими запитами або без показу карти порушить TOS ...
Метт

Наскільки я знаю, це не так, якщо ви представите вихід на карті. Виправте мене, якщо я помиляюся!
EZMapdesign

@Tamas Види. Дивіться це, однак: developers.google.com/maps/terms#section_10_1_3
Метт


0

Можливо, не найкраща відповідь на ваше запитання, але ви можете спробувати BatchGeo. Безкоштовна версія змусила б вас багато страждати, але все-таки була досить хорошою для моєї роботи. Хоча ми придбали про-версію.

Потрібно отримати координати з KML-файлу - це імпортувати його в ArcGIS згодом.


Дякую, чи можете ви сказати мені, як я роблю BatchGeo, також чи знаєте ви назви безкоштовної версії (я намагався для Google Map api v3). Це також означає, що я повинен зберігати значення Lat / Long у своїй базі даних, щоб відобразити їх. Це те, що я мав намір зробити в першу чергу.
користувач1089553

З BatchGeo вам доведеться імпортувати KML у вашу базу даних, потім витягувати координати, я не знаю іншого способу, оскільки Google забороняє надавати координати. Щодо yahoo, мій досвід роботи з Туреччиною насправді не яскравий. Більшість країн, що розвиваються, залишаються поза сферою Yahoo. Аніл.
Anıl Çelik

0

Я успішно використовую геопію, яка використовує веб-службу геокодування Google. Він прекрасно працює до 2k балів за 24 години.


0

Матей, це тому, що Google API дозволяє витягувати до 2,5 кб на день.
Щодо рішення Geo, пакетна програма ще не підтримується, тому що, з мого огляду коду геопітон, це, мабуть, відкриває з'єднання щоразу, коли він запитує новий кординат, 300k, ймовірно, застрягне назавжди (можливо, з помилкою 400).
Гра з Poligons повинна зробити трюк, але це залежить від того, яка ваша область "Play play", якщо це 1 країна або п ять країн.
Для 1 країни багатокутники повинні працювати досить непогано.
Для n країн це рішення не працюватиме, оскільки збір триватиме більше, коли ви додасте іншу країну. Найкращий засіб для цього - ледаче навантаження.
=> почніть з ідеї багатокутника, кожну річ в іншій країні створіть велику таблицю бази даних для зберігання даних, зрештою, ви будете зберігати потрібні вам дані.


0

Якщо ви хочете зробити це з PHP - MySQL ось рішення, яке працювало для мене:

<script type="text/javascript" charset="utf-8">

    var customIcons = {
      restaurant: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png',
        shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
      },
      bar: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png',
        shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
      },
      club:
      {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_yellow.png',
        shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png' 
      },
      church:
      {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_green.png',
        shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png' 
      }
    };

      function initialize() 
      {
        var mapOptions = {
          center: new google.maps.LatLng(37.976178, 23.735881),
          zoom: 7,
          mapTypeId: google.maps.MapTypeId.roadmap
        };
        var map = new google.maps.Map(document.getElementById("map-canvas"),
            mapOptions);
        <?php header("content-type: text/html;charset=utf-8");
        $getpoints = "SELECT lat, lng, name, address, type FROM markers";
        $getpoints .= $filter;

        if(!$result = $con->query($getpoints)){
        die('There was an error running the query 
        [' . $con->error . ']');
        }

        else 
        {
            while ($row = $result->fetch_assoc()) 
            {
                $thematic = "'$row[type]'";
                $name = "'$row[name]'";
                $map_address = "$row[address]";

                $url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=".urlencode($map_address);
                $lat_long = get_object_vars(json_decode(file_get_contents($url)));

                // pick out what we need (lat,lng)
                $lat_long = $lat_long['results'][0]->geometry->location->lat . "," . $lat_long['results'][0]->geometry->location->lng;

                echo "var myLatlng1 = new google.maps.LatLng($lat_long); 
                var icon = customIcons[$thematic] || {};
                var marker1 = new google.maps.Marker({ 
                position: myLatlng1, 
                map: map,
                icon: icon.icon,
                title: '$map_address'
                });";           
            }
        }       

        ?>    
      }

      google.maps.event.addDomListener(window, 'load', initialize);
    </script>

0

Спробуйте це геокодування api . Це безкоштовно для невеликого використання, але якщо ви хочете більше, вони змусять вас платити. Однак це дешево, і ви могли б обробити це дуже легко, я обробляю їх мільйони на місяць.


0

Ви можете зберегти свої дані у вигляді текстового файлу (один запис на рядок), після чого пакетне геокодування за допомогою цієї послуги: http://geocode.xyz/batch (працює в більшості країн Європи)

або, ви можете написати власний код для доступу до API REST / JSON: http://geocode.xyz/api (це безкоштовно для необмеженого пошуку)


0

Використовуйте інструменти Mappointing (вказівка ​​на карту | Інструмент пакетного геокодування ( http://www.mappointing.com/ )) У цьому інструменті ви можете обробляти дані за допомогою безкоштовного ключа API API на карті Google. А також цей інструмент забезпечує розрахунок відстані та інструмент пошуку місця.


Чому б це не потрапило в ту саму згадану граничну програму API?
lynxlynxlynx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.