Jak geokodować 300 000 adresów w locie?


18

Mam bazę danych, która ma 300 000 adresów, które mają być pokazane na mapie. Wiem, że jeśli geokoduję cały adres, będzie to dla mnie zbyt kosztowne. Zastanawiałem się więc, czy możliwe jest geokodowanie adresu w locie / w czasie rzeczywistym, kiedy użytkownik wybierze adres (adres nieruchomości), przeszuka bazę danych, a następnie geokoduje adres, a następnie zmapuje go za pomocą inne atrybuty.

Byłoby naprawdę miło, gdybyś mógł udostępnić kod, koncepcję lub cokolwiek innego. Nawiasem mówiąc, mój backend jest na mysql obsługiwanym przez Joomla.


Generalnie używam możliwości geokodowania ArcGIS do geokodowania dużej liczby adresów. Jestem też bardzo zainteresowany opisanymi tutaj procesami, w szczególności testowaniem skryptu python w celu geokodowania adresów za pomocą Google, a następnie porównywania ich z tym, co otrzymałem z ArcGIS. Niestety wydaje mi się, że nie jestem w stanie znaleźć wszystkich powiązanych plików i skryptów znajdujących się w różnych miejscach. Byłoby bardzo mile widziane, gdyby ktoś prześlij mi wszystkie skrypty w jednym pliku zip lub w instrukcji krok po kroku. Próbowałem z niego skorzystać i uzyskać informacje zwrotne, ale nie
odniosłem

Odpowiedzi:


15

Mehul, pracowałem w branży weryfikacji adresów w firmie SmartyStreets. Istnieje wiele usług geokodowania, ale tylko nieliczne obsługują przetwarzanie wsadowe z wymaganym wolumenem. (Google i inni nie zezwalają na masowe korzystanie z interfejsu API lub przechowywanie / buforowanie wyników).

Jeśli przejdziesz do bazy danych MySQL i wykonasz eksport tabeli zawierającej adresy, zapisz ją na przykład jako plik CSV. Następnie możesz go przetworzyć za pomocą narzędzia internetowego SmartyList lub narzędzia wiersza poleceń . Tak jak powiedziałem, istnieje kilka usług, ale przypuszczam, że będziesz czegoś potrzebować, co weryfikuje również istnienie adresów (stąd przyczyna geokodowania) - jeśli adres jest nieprawidłowy lub niekompletny, podobnie jak wyniki geokodowania . Robi to tylko kilka usług.

LiveAddress to usługa posiadająca certyfikat CASS wydany przez USPS. Jest ich kilka, więc przeszukaj swoje badania, ale chcesz czegoś „w locie” / szybkiego i niedrogiego, więc znów polecam LiveAddress. Nie tylko zweryfikuje adres, ale następnie wykona to, czego potrzebujesz, podając informacje o długości i długości geograficznej, a także dokładność wyników geokodowania. Wszystko jest oparte na sieci Web i przetworzy dziesiątki milionów rekordów w krótkim czasie (zobacz to pytanie jako odniesienie ).

Jeśli potrzebujesz więcej geokodować adresy podczas interakcji użytkowników, LiveAddress ma również wersję API, która może podłączyć się do prawie wszystkiego i obsługuje również przetwarzanie wsadowe w locie, ale jest opłacane jako subskrypcja, a nie jednorazowo Zapłata.


Nie zna SmartyStreets, wygląda obiecująco, dziękuję za zgłoszenie się.
Derek Swingley

Interfejs API LiveAddress wykona 300 000 w około 5-10 minut. Usługa LiveAddress for Lists (prześlij listę do przetworzenia) zajmuje 15-20 minut. Oba dość szybkie. Usługa List nie wymaga pisania żadnego kodu.
Jeffrey

2
SmartyStreets tylko geokody dla USA?
Mapperz

Mam dane dla Singapuru, czy to zadziała? Jeśli nie jakieś wskazówki, możesz mi dać ????
user1089553

Istnieje wiele zasad dotyczących praw autorskich w Google Bing i innych dostawcach. Nie eksportujesz danych!

11

Jeśli podoba Ci się Python, możesz użyć GeoPy API w połączeniu z powiązaniami GDAL Python lub Fiona i stworzyć bardzo prosty skrypt do konwersji adresów na punktowy plik kształtu.

Spowoduje to geolokalizację pliku o nazwie „adres_do_geokodu”, tworząc wyjściowy plik kształtów o nazwie „my_output.shp” w folderze 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')

Plik powinien zawierać tylko wiersz dla jednego adresu, na przykład:

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

Tutaj korzystam z Google API, ale GeoPy jest bardzo prosty, aby przejść do różnych API, takich jak Yahoo !, GeoNames lub MapPoint .


To jest świetne! Dzięki! W każdym razie, obecnie (01/2016), „geocoders.Google ()” należy zmienić na „geocoders.GoogleV3 ()” jak w geopy.readthedocs.org/en/1.11.0
umbe1987

1

Inną opcją rozwiązania problemu byłoby zaimportowanie zestawu danych do tabel syntezy i ustawienie pola adresu jako lokalizacji. Następnie automatycznie geokoduje punkty. Po zakończeniu możesz wyeksportować dane jako KML.

Lub ... alternatywnie, możesz napisać skrypt php, aby skorzystać z geokodera yahoo, który ma limit 50 000 rekordów, więc prędzej czy później będziesz mieć wszystkie swoje punkty geokodowane w bazie danych.

Mam nadzieję, że to pomogło!


dzięki tamas ale nie chciałbym dostać kml, a następnie pobrać informacje stamtąd, a następnie do m db. Lubię pomysł geokodowania Yahoo, ale nie jestem zbyt pewny jego dokładności, ponieważ nigdy nie korzystałem z Yahoo do mapowania. Daj mi znać, jeśli masz napisany skrypt lub coś takiego. To świetna pomoc
1089553,

Należy pamiętać, że używanie geokodera Yahoo (lub Google) z automatycznymi zapytaniami lub bez pokazywania mapy naruszy TOS ...
Matt

O ile mi wiadomo, nie jest tak, jeśli przedstawisz dane wyjściowe na mapie. Popraw mnie, jeśli się mylę!
EZMapdesign

@Tamas Rodzaj. Zobacz to jednak: developers.google.com/maps/terms#section_10_1_3
Matt


0

Może nie najlepsza odpowiedź na twoje pytanie, ale możesz spróbować BatchGeo. Darmowa wersja sprawiłaby, że dużo cierpiałeś, ale wciąż był wystarczająco dobry dla mojej pracy. Chociaż kupiliśmy wersję Pro.

Sztuką, aby uzyskać współrzędne z pliku KML, jest później zaimportować go do ArcGIS.


Dzięki, możesz mi powiedzieć, jak mam zrobić BatchGeo, czy też znasz nazwy darmowej wersji (próbowałem dla Google Map api v3). Oznacza to również, że muszę przechowywać wartości Lat / Long w mojej bazie danych, aby ją zmapować. Właśnie to zamierzałem zrobić.
user1089553

Z BatchGeo będziesz musiał zaimportować KML do swojej bazy danych, a następnie wyodrębnić współrzędne, nie znam innego sposobu, ponieważ Google zabrania podawania współrzędnych. Jeśli chodzi o yahoo, moje doświadczenia z Turcją nie są naprawdę jasne. Większość krajów rozwijających się jest wykluczona z zakresu działalności Yahoo. Indygowiec.
Anıl Çelik

0

Z powodzeniem korzystam z geofonii korzystającej z usługi geokodowania Google. Działa idealnie do 2k punktów na 24 godziny.


0

Matej, to dlatego, że Google API pozwala pobierać do 2,5 tys. Dziennie.
Jeśli chodzi o rozwiązanie Geo, partia nie jest jeszcze obsługiwana, ponieważ z mojej recenzji kodu geo python wydaje się, że otwiera połączenie za każdym razem, gdy poprosi o nowy cordinate, 300k prawdopodobnie utknie na zawsze (prawdopodobnie z błędem 400).
Zagraj w Poligons powinno załatwić sprawę, ale zależy to od tego, jaki jest twój obszar gry, jeśli jest to 1 kraj lub n krajów.
Dla 1 kraju wielokąty powinny działać całkiem nieźle.
W przypadku n krajów rozwiązanie nie będzie działać, ponieważ pobieranie potrwa dłużej za każdym razem, gdy dodasz inny kraj. Najlepszym sposobem na zrobienie tego jest leniwe ładowanie.
=> zacznij od pomysłu wielokąta, wszystko w innym kraju, stwórz dużą bazę danych do przechowywania danych, w końcu będziesz przechowywać dane, których potrzebujesz, jak sądzę.


0

Jeśli chcesz to zrobić za pomocą PHP - MySQL jest rozwiązaniem, które działało dla mnie:

<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

Wypróbuj interfejs API geokodowania . Jest bezpłatny dla małego użytku, ale jeśli chcesz więcej, płacą. Jest jednak tani i można to łatwo przetworzyć, przetwarzam miliony miesięcznie za ich pośrednictwem.


0

Możesz zapisać swoje dane jako plik tekstowy (jeden rekord na linię), a następnie wsadować geokodować za pomocą tej usługi: http://geocode.xyz/batch (działa w większości krajów europejskich)

lub możesz napisać własny kod, aby uzyskać dostęp do interfejsu API REST / JSON: http://geocode.xyz/api (jest bezpłatny dla nieograniczonej liczby wyszukiwań)


0

Użyj narzędzi do mapowania (Wskazywanie mapy | Boc Geocoding Tool ( http://www.mappointing.com/ )) W tym narzędziu możesz przetwarzać dane za pomocą darmowego klucza API do map Google. A także to narzędzie zapewnia narzędzie do obliczania odległości i wyszukiwania miejsca.


Dlaczego nie trafiłoby w ten sam limit API, o którym wspomniano?
lynxlynxlynx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.