Sådan geokodes 300.000 adresser i farten?

Jeg har en database med 300.000 adresse, som skal vises på kortet. Jeg ved, hvis jeg geokoder hele adressen, bliver det for dyrt for mig. Så jeg spekulerede på, om det er muligt at geokode adressen i farten / realtid, når en bruger ville vælge en adresse (en ejendomsadresse), ville den søge gennem databasen og derefter geokode adressen og derefter kortlægge den med andre attributter.

Det ville være rigtig rart, hvis du kunne dele en kode, et koncept eller noget. Forresten er min backend på mysql understøttet af Joomla.

Kommentarer

  • Jeg bruger generelt ArcGIS-geokodningsfunktionen til at geokode et stort antal adresser. Jeg ‘ er også meget interesseret i de processer, der er forklaret her, specielt som at teste python-scriptet for at geokode adresserne ved hjælp af Google, og sammenlign dem derefter med det, jeg ‘ er kommet fra ArcGIS. Desværre ser det ud til, at jeg ‘ ikke er i stand til at finde alle de relaterede filer og scripts, der findes forskellige steder. Det ville være så værdsat, hvis nogen send mig alle scripts i en zip-fil eller en trinvis instruktion. Jeg ‘ har forsøgt at bruge det og få feedback til dig, men jeg lykkedes ikke

Svar

Mehul, jeg arbejdede tidligere i adressebekræftelsesindustrien med et firma kaldet SmartyStreets. Der er mange geokodningstjenester derude, men kun få understøtter batchbehandling med den mængde, du har brug for. (Google og andre tillader ikke massebrug af deres API eller lagring / caching-resultater.)

Hvis du går til din MySQL-database og udfører en eksport af din tabel, der indeholder adresserne, skal du gemme den som en CSV-fil for eksempel. Du kan derefter behandle den ved hjælp af Validering af bulkadresse til lister eller Kommandolinjeværktøj . Som jeg sagde, er der flere tjenester derude, men du vil gerne have noget, formoder jeg, der også bekræfter eksistensen af adresser (deraf grunden til geokodning) – hvis adressen er forkert eller ufuldstændig, det er også geokodningsresultaterne. Kun få tjenester gør dette.

LiveAddress er en tjeneste, der er CASS-certificeret af USPS. Der er et par derude, så gør din forskning, men du vil have noget “on-the-fly” / hurtigt og billigt, så igen anbefaler jeg LiveAddress. Det “verificerer ikke kun adressen, men gør derefter som du har brug for, hvilket er oplysninger om lat / lon og også præcisionen af geokodningsresultaterne. Det er alt webbaseret og behandler titusindvis af poster på ingen tid (se dette spørgsmål som reference ).

Hvis du har yderligere har brug for at geokode adresser, når brugerne interagerer, US Street Address har også en API version, som kan tilsluttes næsten alt, og den understøtter også batchbehandling på-the- flyv, men betales som et abonnement, ikke en engangsbetaling.

Kommentarer

  • Ikke bekendt med SmartyStreets, ser lovende ud, tak for head up.
  • LiveAddress API klarer 300.000 på cirka 5-10 minutter. LiveAddress for Lists-tjenesten (upload en liste til behandling) tager 15-20 minutter. Begge ret hurtige. Listetjenesten kræver ikke, at du skriver nogen kode.
  • SmartyStreets kun geokoder til USA?
  • Jeg har data, der er til Singapore, fungerer det? Hvis ikke nogen retninger, du kunne give mig ????
  • SmartyStreets tilbyder international adressebekræftelse nu. @ user1089553

Svar

Hvis du kan lide Python, kan du bruge GeoPy API kombineret med GDAL Python-bindinger eller Fiona , og opret et meget grundlæggende script som dette til konvertering af adresserne til en punktformefil.

Dette vil geolokalisere en fil ved navn “adresser_til_geokode” og skabe en outputformfil med navnet “min_output.shp” i min_output-mappe:

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

Filen skal kun have en linje til en enkelt adresse, som for eksempel:

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

Her bruger jeg Google API, men med GeoPy er meget grundlæggende for at skifte til forskellige API, som Yahoo!, GeoNames eller MapPoint .

Kommentarer

  • Dette er fantastisk! Tak mand! Under alle omstændigheder skal ‘ geocoders.Google () ‘ i øjeblikket ændres til ‘ geocoders.GoogleV3 () ‘ som i geopy.readthedocs.org/da/1.11.0

Svar

En anden mulighed for at løse dit problem ville være at importere dit datasæt til fusion indstille adressefeltet som placering. Derefter geokoder det punkterne automatisk. Når det er færdigt, kan du eksportere dataene som KML.

Eller..alternativt kan du skrive et php-script for at gøre brug af yahoo geocoder, der har en grænse på 50.000 poster, så før eller senere du får alle dine point geokodet i din database.

Jeg håber, det hjalp!

Kommentarer

  • tak tamas men Jeg vil ikke gerne hente kml og derefter hente oplysningerne derfra og derefter til m db. Jeg kan godt lide at forestille mig yahoo-geokodning, men jeg er ikke så sikker på den nøjagtighed, den har, da jeg aldrig har brugt yahoo til kortlægning. Lad mig vide, hvis du har skrevet et script eller noget. Dette er en stor hjælp
  • Husk, at brug af Yahoo (eller Google for den sags skyld) geokoder med automatiserede forespørgsler eller uden at vise et kort vil være i strid med TOS …
  • For så vidt som jeg ved, er det ikke, hvis du præsenterer output på et kort. Ret mig, hvis jeg tager fejl!
  • @Tamas slags. Se dog dette: developers.google.com/maps/terms#section_10_1_3

Svar

Jeg har med succes brugt geografi, der bruger Googles geokodning-webservice. Det fungerer perfekt i op til 2k point pr. døgn.

Svar

langt den bedste og nemmeste geocoder, jeg har brugt https://pypi.python.org/pypi/geocoder/1.8.0 bing-kort, google maps, OSM osv.

Svar

Måske ikke det bedste svar på dit spørgsmål, men du kan prøve BatchGeo. Gratis version vil få dig til at lide meget, men var stadig god nok til mit arbejde. Selvom vi har købt pro-versionen.

Trick for at få koordinater fra KML-filen er at importere den til ArcGIS senere.

Kommentarer

  • Tak, kan du fortælle mig, hvordan laver jeg en BatchGeo, ville du også kende navnene på gratis version (Jeg prøvede efter Google Map api v3). Betyder det også at jeg skal gemme Lat / Long-værdierne i min database for at kortlægge den. Dette er hvad jeg tænkte at gøre i første omgang.
  • Med BatchGeo skal du importere KML til din database og derefter udpakke koordinaterne, jeg kender ingen anden måde, da Google forbyder at give koordinater. Om yahoo er min erfaring med Tyrkiet ikke rigtig lys. De fleste udviklingslande udelades af Yahoo ‘ s anvendelsesområde. Anil.

Svar

Matej, det er fordi Google API tillader at trække op til 2,5k om dagen.
Om Geo-løsningen er det endnu ikke fundet, at batch understøttes, fordi det fra min gennemgang af geo-pythonkoden ser ud til at åbne forbindelse hver gang han anmoder om en ny kardinal, vil 300k sandsynligvis sidde fast for evigt (sandsynligvis med fejl 400).
Spil med poligoner skal gøre tricket, men det afhænger af, hvad der er dit “legeplads” -område, hvis det er 1 land eller n lande.
For 1 land skal polygoner fungere ret pænt .
I n lande fungerer løsningen ikke, da samlingen vil tage længere tid, når du tilføjer et andet land. Det bedste formål at gøre det er doven belastning.
=> start med polygonideen, hver ting i en anden land, opret en stor databasetabel for at holde dataene, til sidst vil du holde de data, du har brug for, formoder jeg.

Svar

Hvis du vil gøre det med PHP – MySQL er her en løsning, der er usikker rked for mig:

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

Svar

Prøv dette API til geokodning . Det er gratis til mindre brug, men hvis du vil have mere, får de dig til at betale. Det er dog billigt, og du kunne behandle så meget let, jeg behandler millioner om måneden gennem dem.

Svar

Brug Mappointing-værktøjer (Map pointing | Batch Geocoding Tool ( http://www.mappointing.com/ )) I dette værktøj kan du behandle dataene ved hjælp af Google-kortfri API-nøgle. Og også dette værktøj giver afstandsberegning & Placeringssøgningsværktøj.

Kommentarer

  • Hvorfor ville ‘ ikke dette ramme den samme API-grænse OP som nævnt?

Svar

Du kan gemme dine data som en tekstfil (en post pr. linje) og derefter geokode batch ved hjælp af denne service: http://geocode.xyz/batch (fungerer i de fleste europæiske lande)

eller du kan skrive din egen kode for at få adgang til REST / JSON API: (det er gratis til ubegrænset opslag)

Kommentarer

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *