Cum să geocodificați 300.000 de adrese din mers?

Am o bază de date care are 300.000 de adrese, care urmează să fie afișate pe hartă. Știu că dacă codez geografic toată adresa, va fi prea scump pentru mine. Așa că mă întrebam dacă este posibil să geo-codificați adresa în timp real / în timp real, când un utilizator ar selecta o adresă (o adresă a proprietății) va căuta prin baza de date, apoi va codifica geo adresa și apoi o va mapa cu alte atribute.

Ar fi foarte frumos dacă ați putea partaja un cod, un concept sau orice altceva. Apropo, backend-ul meu este pe MySQL susținut de Joomla.

Comentarii

  • În general, folosesc capacitatea de geocodare ArcGIS pentru a geocoda un număr mare de adrese. De asemenea, ‘ mă interesează cu adevărat despre procesele explicate aici, în special, îmi place să testez scriptul Python pentru a geocoda adresele folosind Google, apoi să le compar cu ceea ce eu ‘ am primit de la ArcGIS. Din păcate, mi se pare că ‘ nu pot găsi toate fișierele și scripturile aferente care se află în locuri diferite. Ar fi atât de apreciat dacă cineva vă rog să-mi trimiteți toate scripturile într-un singur fișier zip sau orice instrucțiuni pas cu pas. Am ‘ am încercat să-l folosesc și să primesc feedback, dar nu am reușit

Răspunde

Mehul, obișnuiam să lucrez în industria verificării adreselor cu o companie numită SmartyStreets. Există o mulțime de servicii de geocodificare acolo, dar doar puțini vor sprijini procesarea în serie cu volumul de care aveți nevoie. (Google și alții nu permit utilizarea în bloc a API-ului lor sau rezultatele stocării / memorării în cache.)

Dacă accesați baza de date MySQL și efectuați un export al tabelului care conține adresele, salvați-l ca Fișier CSV, de exemplu. Puteți apoi să-l procesați folosind Instrument de validare a adresei în bloc pentru liste sau Instrument pentru linia de comandă . După cum am spus, există mai multe servicii acolo, dar veți dori ceva, presupun, care să verifice și existența adreselor (de aici și motivul geocodificării) – dacă adresa este greșită sau incompletă, la fel și rezultatele geocodării. Doar câteva servicii fac acest lucru.

LiveAddress este un serviciu care este certificat CASS de către USPS. Există câteva acolo, așa că faceți-vă cercetările, dar doriți ceva „din mers” / rapid și ieftin, așa că vă recomand din nou LiveAddress. Nu numai că va verifica adresa, dar va face ceea ce doriți, care este furnizarea de informații lat / lon și, de asemenea, precizia rezultatelor geocodificării. Este bazat pe web și va procesa zeci de milioane de înregistrări în cel mai scurt timp (consultați această întrebare ca referință ).

Dacă aveți mai multe trebuie să geocodificați adresele pe măsură ce utilizatorii interacționează, US Street Address are, de asemenea, o versiune API care se poate conecta la aproape orice și acceptă, de asemenea, procesarea batch on-the- zboară, dar se plătește ca abonament, nu ca plată unică.

Comentarii

  • Nu este familiarizat cu SmartyStreets, pare promițător, mulțumesc pentru capul sus.
  • API-ul LiveAddress va face 300.000 în aproximativ 5-10 minute. Serviciul LiveAddress for Lists (încărcați o listă pentru procesare) durează 15-20 de minute. Ambele destul de rapide. Serviciul List nu vă va cere să scrieți niciun cod.
  • SmartyStreets doar geocoduri pentru SUA?
  • Am date care sunt pentru Singapore, va funcționa? Dacă nu vrei să îmi dai instrucțiuni ????
  • SmartyStreets oferă acum verificarea adresei internaționale. @ user1089553

Răspuns

Dacă îți place Python, ai putea folosi API GeoPy , combinat cu legături GDAL Python sau Fiona , și creați un script foarte simplu ca acesta pentru a converti adresele într-un shapefile punct.

Acest lucru va geoloca un fișier numit „address_to_geocode”, creând un shapefile de ieșire numit „my_output.shp” în folderul 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") 

Se presupune că fișierul are doar o linie pentru o singură adresă, de exemplu:

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

Aici folosesc Google API, dar cu GeoPy este foarte de bază pentru a trece la API diferite, cum ar fi Yahoo !, GeoNames sau MapPoint .

Comentarii

  • Este minunat! Multumesc omule! Oricum, în prezent (01/2016), ‘ geocoders.Google () ‘ ar trebui schimbat în ‘ geocoders.GoogleV3 () ‘ ca în geopy.readthedocs.org/en/1.11.0

Răspuns

O altă opțiune pentru a rezolva problema dvs. ar fi importarea setului de date în fuziune tabele și setați câmpul de adresă ca locație. Apoi va geocoda punctele automat. Odată ce ați terminat, puteți exporta datele ca KML.

Sau .. alternativ, puteți scrie un script php pentru a utiliza geocoderul Yahoo care are o limită de 50 000 de înregistrări, deci mai devreme sau mai târziu veți avea toate punctele dvs. geocodificate în baza de date.

Sper că acest lucru a ajutat!

Comentarii

  • mulțumesc tamas dar Nu aș vrea să obțin kml-ul și apoi să aduc informațiile de acolo și apoi să m db. Îmi place să mă gândesc la geocodificarea Yahoo, dar nu sunt prea sigur de acuratețea pe care o are, deoarece nu am folosit niciodată Yahoo pentru cartografiere. Vă rog să-mi spuneți dacă aveți un script scris sau ceva. Acesta este un mare ajutor
  • Rețineți că utilizarea geocoderului Yahoo (sau Google, de altfel) cu interogări automate sau fără afișarea unei hărți va încălca TOS …
  • Până în prezent după cum știu, nu este dacă prezentați rezultatul pe o hartă. Corectează-mă dacă greșesc!
  • @Tamas. Cu toate acestea, vedeți acest lucru: developer.google.com/maps/terms#section_10_1_3

Răspuns

Am folosit cu succes geopolul care utilizează serviciul web de geocodificare Google. Funcționează perfect până la 2k puncte la 24 de ore.

Răspunde

de departe cel mai bun și mai simplu geocoder pe care l-am folosit https://pypi.python.org/pypi/geocoder/1.8.0 hărți bing, hărți google, OSM etc.

Răspuns

Poate că nu este cel mai bun răspuns la întrebarea dvs., dar poate încercați BatchGeo. Versiunea gratuită vă va face să suferiți mult, dar totuși a fost suficient de bună pentru munca mea. Deși am cumpărat versiunea pro.

Trucul pentru a obține coordonatele din fișierul KML este să îl importați la ArcGIS mai târziu.

Comentarii

  • Mulțumesc, îmi puteți spune cum fac un BatchGeo, de asemenea, ați ști numele versiunii gratuite (Încercam pentru Google Map api v3). Aceasta înseamnă, de asemenea că trebuie să stochez valorile Lat / Long în baza mea de date pentru a o harta. Aceasta este ceea ce intenționam să fac în primul rând.
  • Cu BatchGeo, va trebui să importați KML în baza de date, apoi să extrageți coordonatele, nu știu alt mod, deoarece Google interzice furnizarea de coordonate. Despre yahoo, experiența mea cu Turcia nu este prea strălucitoare. Majoritatea țărilor în curs de dezvoltare sunt lăsate în afara domeniului Yahoo ‘. Anil.

Răspuns

Matej, Asta deoarece API-ul Google permite să extragă până la 2,5k pe zi.
Despre soluția Geo, lotul nu este încă acceptat, deoarece, din revizuirea codului geo python, se pare că deschide conexiunea de fiecare dată când solicită un nou coordonat, 300k probabil că vor rămâne blocate pentru totdeauna (probabil cu eroare 400).
Jucați-vă cu Poligons ar trebui să facă truc, dar depinde care este zona dvs. „Teren de joacă”, dacă este o țară sau n țări.
Pentru o țară poligoanele ar trebui să funcționeze destul de bine .
Pentru n țări, soluția nu va funcționa, deoarece colectarea va dura mai mult de fiecare dată când adăugați o altă țară. Cea mai bună metodă de realizare este încărcarea leneșă.
=> începeți cu ideea poligonului, fiecare lucru în altul țară, creați un tabel mare de baze de date pentru a păstra datele, eventual veți păstra datele de care aveți nevoie, presupun.

Răspuns

Dacă doriți să o faceți cu PHP – MySQL iată o soluție care este foarte bună a cerut pentru mine:

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

Răspuns

Încercați acest api de geocodare . Este gratuit pentru o utilizare mică, dar dacă doriți mai mult, vă fac să plătiți. Este ieftin, totuși și puteți procesa atât de ușor, eu procesez milioane pe lună prin intermediul lor.

Răspundeți

Utilizați instrumentele Mappointing (Map pointing | Batch Geocoding Tool ( http://www.mappointing.com/ )) În acest instrument puteți procesa datele utilizând cheia API gratuită Google map. Și, de asemenea, acest instrument oferă calculul distanței & Instrumentul de căutare a locurilor.

Comentarii

  • De ce ‘ nu ar atinge aceeași limită API API menționată?

Răspuns

Puteți salva datele dvs. ca fișier text (o înregistrare pe linie) și apoi să le geocodați în serie folosind acest serviciu: http://geocode.xyz/batch (funcționează pentru majoritatea țărilor europene)

sau, puteți scrie propriul cod pentru a accesa REST / API JSON: (este gratuit pentru căutări nelimitate)

Comentarii

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *