Wie kann man 300.000 Adressen im laufenden Betrieb geocodieren?

Ich habe eine Datenbank mit 300.000 Adressen, die auf der Karte angezeigt werden sollen. Ich weiß, wenn ich die gesamte Adresse geocodiere, ist das für mich zu teuer. Ich habe mich also gefragt, ob es möglich ist, die Adresse im laufenden Betrieb / in Echtzeit zu geocodieren. Wenn ein Benutzer eine Adresse (eine Eigenschaftsadresse) auswählt, durchsucht er die Datenbank, codiert die Adresse geocodiert und ordnet sie dann zu andere Attribute.

Es wäre wirklich schön, wenn Sie einen Code, ein Konzept oder etwas anderes teilen könnten. Mein Backend ist übrigens auf MySQL, unterstützt von Joomla.

Kommentare

  • Ich verwende im Allgemeinen die ArcGIS-Geokodierungsfunktion, um eine große Anzahl von Adressen zu geokodieren. Außerdem bin ich ‚ sehr interessiert an den hier erläuterten Prozessen, insbesondere daran, das Python-Skript zu testen, um die Adressen mit Google zu geocodieren, und sie dann mit dem zu vergleichen, was ich ‚ habe von ArcGIS erhalten. Leider scheint es mir, dass ich ‚ nicht alle zugehörigen Dateien und Skripte finden kann, die sich an verschiedenen Orten befinden. Es wäre sehr dankbar, wenn mir jemand bitte alle Skripte in einer Zip-Datei oder einer Schritt-für-Schritt-Anleitung schicken würde. Ich ‚ habe versucht, es zu verwenden und Ihnen Feedback zu geben, aber ich war nicht erfolgreich

Antwort

Mehul, ich habe in der Adressüberprüfungsbranche bei einer Firma namens SmartyStreets gearbeitet. Es gibt viele Geokodierungsdienste, aber nur wenige unterstützen die Stapelverarbeitung mit dem von Ihnen benötigten Volumen. (Google und andere erlauben keine Massenverwendung ihrer API oder das Speichern / Zwischenspeichern von Ergebnissen.)

Wenn Sie zu Ihrer MySQL-Datenbank gehen und einen Export Ihrer Tabelle durchführen, die die Adressen enthält, speichern Sie sie als CSV-Datei zum Beispiel. Sie können sie dann mit dem Tool zur Überprüfung der Massenadresse für Listen oder Befehlszeilentool verarbeiten Wie ich bereits sagte, gibt es mehrere Dienste, aber Sie möchten vermutlich etwas, das auch die Existenz von Adressen überprüft (daher der Grund für die Geokodierung) – wenn die Adresse falsch oder unvollständig ist, Ebenso die Geokodierungsergebnisse. Dies tun nur wenige Dienste.

LiveAddress ist ein Dienst, der vom USPS CASS-zertifiziert ist. Es gibt ein paar da draußen, also recherchieren Sie, aber Sie möchten etwas „on-the-fly“ / schnell und kostengünstig, also empfehle ich wieder LiveAddress. Es wird nicht nur die Adresse überprüfen, sondern auch tun, was Sie benötigen. Dies ist die Bereitstellung von Lat / Lon-Informationen und auch die Genauigkeit der Geokodierungsergebnisse. Es ist alles webbasiert und verarbeitet in kürzester Zeit zig Millionen Datensätze (siehe diese Frage als Referenz ).

Wenn Sie weitere Informationen haben US Street Address muss auch eine API -Version haben, die sich in nahezu alles einbinden lässt und auch die Stapelverarbeitung im Internet unterstützt. fliegen, wird aber als Abonnement bezahlt, nicht als einmalige Zahlung.

Kommentare

  • Nicht vertraut mit SmartyStreets, sieht vielversprechend aus, danke für die Heads-up.
  • Die LiveAddress-API erledigt 300.000 in ungefähr 5-10 Minuten. Der LiveAddress for Lists-Dienst (Hochladen einer Liste zur Verarbeitung) dauert 15 bis 20 Minuten. Beides ziemlich schnell. Für den Listendienst müssen Sie keinen Code schreiben.
  • SmartyStreets nur Geocodes für die USA?
  • Ich habe Daten für Singapur. Funktioniert das? Wenn nicht, können Sie mir Anweisungen geben ????
  • SmartyStreets bietet jetzt eine internationale Adressüberprüfung an. @ user1089553

Antwort

Wenn Sie Python mögen, können Sie die GeoPy-API , kombiniert mit den GDAL-Python-Bindungen oder Fiona und erstellen Sie ein sehr einfaches Skript wie dieses zum Konvertieren der Adressen in ein Punkt-Shapefile.

Dadurch wird eine Datei mit dem Namen „address_to_geocode“ geolokalisiert und ein Ausgabe-Shapefile mit dem Namen „my_output.shp“ im Ordner my_output erstellt:

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

Die Datei soll nur eine Zeile für eine einzelne Adresse enthalten, wie zum Beispiel:

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

Hier verwende ich die Google-API, aber mit ist GeoPy sehr einfach, um zu einer anderen API wie Yahoo! GeoNames oder MapPoint zu wechseln .

Kommentare

Antwort

Eine weitere Möglichkeit zur Lösung Ihres Problems besteht darin, Ihren Datensatz in Fusion zu importieren Tabellen und legen Sie das Adressfeld als Speicherort fest. Dann werden die Punkte automatisch geocodiert. Sobald dies abgeschlossen ist, können Sie die Daten als KML exportieren.

Oder … alternativ können Sie ein PHP-Skript schreiben, um den Yahoo-Geocoder zu verwenden, der ein Limit von 50.000 Datensätzen hat, also früher oder später Sie haben alle Ihre Punkte in Ihrer Datenbank geokodiert.

Ich hoffe, das hat geholfen!

Kommentare

  • danke tamas aber Ich möchte nicht die kml bekommen und dann die Informationen von dort und dann zu m db holen. Ich mag die Idee der Yahoo-Geokodierung, bin mir aber nicht sicher, wie genau sie ist, da ich Yahoo noch nie für die Kartierung verwendet habe. Bitte lassen Sie mich wissen, wenn Sie ein Skript geschrieben haben oder etwas. Dies ist eine große Hilfe.
  • Beachten Sie, dass die Verwendung eines Geocoders von Yahoo (oder Google) mit automatisierten Abfragen oder ohne Anzeige einer Karte gegen die Nutzungsbedingungen verstößt …
  • Soweit möglich Wie ich weiß, ist es nicht, wenn Sie die Ausgabe auf einer Karte präsentieren. Korrigieren Sie mich, wenn ich falsch liege!
  • @Tamas Art von. Beachten Sie jedoch Folgendes: developer.google.com/maps/terms#section_10_1_3

Antwort

Ich habe erfolgreich Geopy verwendet, das den Google-Geokodierungs-Webdienst verwendet. Es funktioniert perfekt für bis zu 2.000 Punkte pro 24 Stunden.

Antwort

Der mit Abstand beste und einfachste Geocoder, den ich verwendet habe https://pypi.python.org/pypi/geocoder/1.8.0 Bing Maps, Google Maps, OSM usw.

Antwort

Vielleicht nicht die beste Antwort auf Ihre Frage, aber Sie können BatchGeo ausprobieren. Die kostenlose Version würde Sie sehr leiden lassen, war aber dennoch gut genug für meine Arbeit. Wir haben jedoch die Pro-Version gekauft.

Der Trick, um Koordinaten aus der KML-Datei zu erhalten, besteht darin, sie zu importieren zu ArcGIS später.

Kommentare

  • Danke, können Sie mir sagen, wie ich ein BatchGeo mache, würden Sie auch die Namen der kostenlosen Version kennen (Ich habe versucht, für Google Map API v3). Bedeutet das auch dass ich die Lat / Long-Werte in meiner Datenbank speichern muss, um sie zuzuordnen. Dies ist, was ich ursprünglich vorhatte.
  • Mit BatchGeo müssen Sie KML in Ihre Datenbank importieren und dann die Koordinaten extrahieren. Ich kenne keinen anderen Weg, da Google die Bereitstellung von Koordinaten verbietet. Über Yahoo, meine Erfahrung mit der Türkei ist nicht wirklich gut. Die meisten Entwicklungsländer sind von Yahoo ‚ ausgeschlossen. Anil.

Antwort

Matej, das liegt daran, dass die Google API bis zu 2,5 KB pro Tag abrufen kann.
In Bezug auf die Geo-Lösung wurde noch nicht festgestellt, dass Batch unterstützt wird. Dies liegt daran, dass nach meiner Überprüfung des Geo-Python-Codes jedes Mal, wenn er einen neuen Koordinaten anfordert, eine Verbindung hergestellt wird. 300 KB bleiben wahrscheinlich für immer hängen (wahrscheinlich mit Fehler 400).
Spielen mit Poligons sollte den Trick machen, aber es hängt davon ab, was Ihr „Spielplatz“ -Bereich ist, ob es sich um 1 Land oder n Länder handelt.
Für 1 Land sollten die Polygone ziemlich gut funktionieren
Für n Länder funktioniert die Lösung nicht, da die Sammlung jedes Mal länger dauert, wenn Sie ein anderes Land hinzufügen. Der beste Weg, dies zu tun, ist das langsame Laden.
=> Beginnen Sie mit der Polygon-Idee, alles in einem anderen Land, erstellen Sie eine große Datenbanktabelle, um die Daten zu speichern. Schließlich werden Sie vermutlich die Daten speichern, die Sie benötigen.

Antwort

Wenn Sie es mit PHP – MySQL machen wollen, ist hier eine Lösung, die wo rked für mich:

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

Antwort

Versuchen Sie dies Geocodierungs-API . Es ist kostenlos für den kleinen Gebrauch, aber wenn Sie mehr wollen, müssen Sie dafür bezahlen. Es ist jedoch billig und Sie können es so einfach verarbeiten. Ich verarbeite monatlich Millionen durch sie.

Antwort

Verwenden Sie Mappointing-Tools (Map Pointing | Batch Geocoding Tool ( http://www.mappointing.com/ )) In diesem Tool können Sie die Daten mit dem kostenlosen API-Schlüssel von Google Map verarbeiten. Außerdem bietet dieses Tool eine Entfernungsberechnung. & Suchwerkzeug platzieren.

Kommentare

  • Warum sollte ‚ nicht das gleiche API-Limit OP erreichen, das erwähnt wurde?

Antwort

Sie können Ihre Daten als Textdatei (ein Datensatz pro Zeile) speichern und mit diesem Dienst stapelweise geocodieren: http://geocode.xyz/batch (funktioniert in den meisten europäischen Ländern)

oder Sie können Ihren eigenen Code schreiben, um auf REST / zuzugreifen JSON-API: (kostenlos für unbegrenzte Suchvorgänge)

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.