Comment géocoder 300 000 adresses à la volée?

Jai une base de données qui contient 300 000 adresses, qui doivent être affichées sur la carte. Je sais que si je géocode toutes les adresses, ce sera trop cher pour moi. Je me demandais donc sil était possible de géocoder ladresse à la volée / en temps réel, quand un utilisateur sélectionnerait une adresse (une adresse de propriété), il rechercherait dans la base de données, puis géocoderait ladresse, puis la mapperait avec autres attributs.

Ce serait vraiment bien si vous pouviez partager un code, un concept ou quoi que ce soit. Au fait, mon backend est sur mysql pris en charge par Joomla.

Commentaires

  • Jutilise généralement la fonction de géocodage dArcGIS pour géocoder un grand nombre dadresses. De plus, je ‘ m très intéressé par les processus expliqués ici, en particulier, comme tester le script python pour géocoder les adresses en utilisant Google, puis les comparer avec ce que je ‘ proviennent dArcGIS. Malheureusement, il me semble que je ‘ ne peut pas trouver tous les fichiers et scripts associés qui se trouvent à des endroits différents. Il serait très apprécié que quelquun menvoie tous les scripts dans un fichier zip ou dans toute instruction étape par étape. Jai ‘ essayé de lutiliser et de vous faire part de vos commentaires, mais je nai pas réussi

Réponse

Mehul, javais lhabitude de travailler dans lindustrie de la vérification dadresse avec une société appelée SmartyStreets. Il existe de nombreux services de géocodage, mais seuls quelques-uns prendront en charge le traitement par lots avec le volume dont vous avez besoin. (Google et dautres nautorisent pas lutilisation en masse de leur API ou le stockage / la mise en cache des résultats.)

Si vous accédez à votre base de données MySQL et effectuez une exportation de votre table contenant les adresses, enregistrez-la en tant que Fichier CSV par exemple. Vous pouvez ensuite le traiter à laide de l Outil de validation dadresses en bloc pour les listes ou de Outil de ligne de commande . Comme je lai dit, il existe plusieurs services, mais je suppose que vous voudrez quelque chose qui vérifie également lexistence dadresses (doù la raison du géocodage) – si ladresse est erronée ou incomplète, les résultats du géocodage le sont aussi. Seuls quelques services le font.

LiveAddress est un service qui est certifié CASS par lUSPS. Il y en a quelques-uns, alors faites vos recherches, mais vous voulez quelque chose de « à la volée » / rapide et peu coûteux, donc encore une fois, je recommande LiveAddress. Il « va non seulement vérifier ladresse, mais aussi faire ce que vous voulez, ce qui fournit les informations de latitude / longitude et également la précision des résultats de géocodage. Tout est basé sur le Web et traitera des dizaines de millions denregistrements en un rien de temps (voir cette question comme référence ).

Si vous avez plus besoin de géocoder les adresses lorsque les utilisateurs interagissent, US Street Address a également une version API qui peut se brancher sur à peu près tout et prend également en charge le traitement par lots sur le- voler, mais est payé comme un abonnement, pas un paiement unique.

Commentaires

  • Je ne connais pas SmartyStreets, semble prometteur, merci pour le Attention.
  • LAPI LiveAddress en fera 300 000 en 5 à 10 minutes environ. Le service LiveAddress for Lists (télécharger une liste pour traitement) prend 15 à 20 minutes. Les deux sont assez rapides. Le service List ne vous obligera pas à écrire de code.
  • SmartyStreets ne géocode que pour les États-Unis?
  • Jai des données qui concernent Singapour, cela fonctionnera-t-il? Sinon, vous pouvez me donner des indications ????
  • SmartyStreets propose maintenant la vérification dadresse internationale. @ user1089553

Réponse

Si vous aimez Python, vous pouvez utiliser le API GeoPy , associée aux liaisons GDAL Python ou Fiona , et créez un script très basique comme celui-ci pour convertir les adresses en un fichier de formes point.

Cela géolocalisera un fichier nommé « addresses_to_geocode », créant un fichier de formes de sortie nommé « my_output.shp » dans le dossier 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") 

Le fichier est censé avoir juste une ligne pour une seule adresse, comme par exemple:

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

Ici, jutilise lAPI Google, mais avec GeoPy est très basique pour passer à différentes API, comme Yahoo !, GeoNames ou MapPoint .

Commentaires

  • Cest génial! Merci mec! Quoi quil en soit, à lheure actuelle (01/2016), ‘ geocoders.Google () ‘ devrait être remplacé par ‘ geocoders.GoogleV3 () ‘ comme dans geopy.readthedocs.org/en/1.11.0

Réponse

Une autre option pour résoudre votre problème serait dimporter votre jeu de données vers fusion tables et définissez le champ dadresse comme emplacement. Ensuite, il géocodera les points automatiquement. Une fois que cela est terminé, vous pouvez exporter les données au format KML.

Ou … alternativement, vous pouvez écrire un script php pour utiliser le géocodeur Yahoo qui a une limite de 50 000 enregistrements, donc tôt ou tard vous aurez tous vos points géocodés dans votre base de données.

Jespère que cela vous a aidé!

Commentaires

  • merci tamas mais Je ne voudrais pas obtenir le kml, puis récupérer les informations à partir de là, puis vers m db. Jaime lidée du géocodage yahoo mais je ne suis pas trop sûr de sa précision, car je nai jamais utilisé Yahoo pour la cartographie. Sil vous plaît laissez-moi savoir si vous avez écrit un script ou quelque chose. Ceci est dune grande aide
  • Gardez à lesprit que lutilisation du géocodeur Yahoo (ou Google, dailleurs) avec des requêtes automatisées ou sans afficher une carte enfreindra le TOS …
  • Jusquà présent comme je le sais, ce nest pas si vous présentez la sortie sur une carte. Corrigez-moi si je me trompe!
  • @Tamas Kind of. Cependant, voyez ceci: développeurs.google.com/maps/terms#section_10_1_3

Réponse

Jai utilisé avec succès geopy qui utilise le service Web de géocodage de Google. Cela fonctionne parfaitement jusquà 2 000 points par 24 heures.

Réponse

de loin le meilleur et le plus simple géocodeur que jai utilisé https://pypi.python.org/pypi/geocoder/1.8.0 bing maps, google maps, OSM etc.

Answer

Ce nest peut-être pas la meilleure réponse à votre question, mais vous pouvez essayer BatchGeo. La version gratuite vous ferait beaucoup souffrir, mais cétait quand même assez bien pour mon travail. Cependant, nous avons acheté la version pro.

Lastuce pour obtenir les coordonnées dun fichier KML est de limporter vers ArcGIS plus tard.

Commentaires

  • Merci, pouvez-vous me dire comment puis-je faire un BatchGeo, connaissez-vous également les noms de la version gratuite (Jessayais pour Google Map api v3). Cela signifie-t-il également que je dois stocker les valeurs Lat / Long dans ma base de données afin de la mapper. Cest ce que javais lintention de faire en premier lieu.
  • Avec BatchGeo, vous devrez importer du KML dans votre base de données puis extraire les coordonnées, je ne connais pas dautre moyen car Google interdit de fournir des coordonnées. À propos de Yahoo, mon expérience avec la Turquie nest pas vraiment brillante. La plupart des pays en développement sont exclus du champ d’application de Yahoo ‘. Anil.

Réponse

Matej, cest parce que lAPI Google permet de tirer jusquà 2,5k par jour.
A propos de la solution Geo, le batch nest pas encore pris en charge car, daprès mon examen du code geo python, il semble ouvrir une connexion chaque fois quil demande un nouveau cordinate, 300k restera probablement bloqué pour toujours (probablement avec erreur 400).
Jouer avec des Poligons devrait faire laffaire, mais cela dépend de votre zone de « terrain de jeu », sil sagit dun ou de n pays.
Pour 1 pays, les polygones devraient fonctionner plutôt bien .
Pour n pays, la solution ne fonctionnera pas car la collecte prendra plus de temps à chaque fois que vous ajoutez un autre pays. Le meilleur moyen de le faire est le chargement paresseux.
=> commencez par lidée de polygone, tout dans un autre pays, créez une grande table de base de données pour contenir les données, vous finirez par contenir les données dont vous avez besoin, je suppose.

Réponse

Si vous voulez le faire avec PHP – MySQL voici une solution qui ne a répondu pour moi:

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

Essayez ceci API de géocodage . Cest gratuit pour un petit usage, mais si vous en voulez plus, ils vous font payer. Cest bon marché cependant et vous pouvez le traiter très facilement, jen traite des millions par mois.

Réponse

Utiliser les outils de mappage (Pointage de carte | Outil de géocodage par lots ( http://www.mappointing.com/ )) Dans cet outil, vous pouvez traiter les données à laide de la clé API gratuite de Google map. Et cet outil fournit également le calcul de la distance & outil de recherche de lieux.

Commentaires

  • Pourquoi ‘ cela natteindrait-il pas la même limite dAPI OP que celle mentionnée?

Réponse

Vous pouvez enregistrer vos données sous forme de fichier texte (un enregistrement par ligne) puis les géocoder par lots en utilisant ce service: http://geocode.xyz/batch (fonctionne pour la plupart des pays européens)

ou, vous pouvez écrire votre propre code pour accéder au REST / API JSON: (il est gratuit pour des recherches illimitées)

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *