Hogyan lehet menet közben 300 000 címet geokódolni?

Van egy adatbázisom, amelynek 300 000 címe van, amelyeket meg kell jeleníteni a térképen. Tudom, ha az összes címet geokódolom, az túl drága lesz számomra. Ezért arra gondoltam, hogy lehetséges-e a cím geokódolása menet közben / valós időben, amikor a felhasználó kiválaszt egy címet (ingatlan címet), az adatbázisban keresgél, majd geokódolja a címet, majd feltérképezi egyéb attribútumok.

Nagyon jó lenne, ha megosztanál egy kódot, koncepciót vagy bármit. A háttérképem egyébként a Joomla által támogatott mysql-en van.

Megjegyzések

  • Általában az ArcGIS geokódolási képességét használom nagyszámú cím geokódolásához. Ezenkívül ‘ nagyon érdekelnek az itt ismertetett folyamatok, különösképpen szeretném tesztelni a python szkriptet a címek geokódolásához a Google segítségével, majd összehasonlítani őket azzal, amit én ‘ az ArcGIS-től kapott. Sajnos számomra úgy tűnik, hogy ‘ nem találom meg az összes kapcsolódó fájlt és szkriptet, amelyek különböző helyeken vannak. Nagyon nagyra értékelném, ha valaki kérem, küldje el nekem az összes szkriptet egy zip fájlban, vagy bármilyen lépésről lépésre. Megpróbáltam ‘ használni és visszajelzést kapni, de nem voltam sikeres

Válasz

Mehul, a címellenőrző iparban dolgoztam egy SmartyStreets nevű céggel. Nagyon sok geokódolási szolgáltatás létezik, de csak kevesen támogatják a kötegelt feldolgozást az Ön által igényelt mennyiséggel. (A Google és mások nem engedélyezik az API-k tömeges használatát vagy az eredmények tárolását / tárolását.)

Ha belép a MySQL adatbázisába, és exportálja a táblákat, amelyek tartalmazzák a címeket, mentse el Például CSV-fájl. Ezután feldolgozhatja a Tömeges címellenőrző eszköz listákhoz vagy a parancssori eszközzel . Mint mondtam, több szolgáltatás is létezik, de feltételezni akarok valamit, ami igazolja a címek meglétét (tehát a geokódolás okát) – ha a cím téves vagy hiányos, ugyanígy a geokódolási eredmények is. Csak néhány szolgáltatás teszi ezt.

A LiveAddress egy olyan szolgáltatás, amely CASS-tanúsítvánnyal rendelkezik az USPS által. Van néhány odakinn, így végezze el a kutatását, de szeretne valami “on-the-fly” / gyors és olcsó dolgot, ezért ismét ajánlom a LiveAddress alkalmazást. Nemcsak ellenőrizni fogja a címet, de azt is megteszi, amire szüksége van, ami lat / lon információkat szolgáltat, valamint a geokódolási eredmények pontosságát. Mindez webalapú és több tízmillió rekordot fog feldolgozni egy pillanat alatt (lásd ezt a kérdést referenciaként ).

Ha további kérdése van geokódolnia kell a címeket, miközben a felhasználók interakcióba lépnek, az amerikai utcacímnek van egy API verziója is, amely szinte bármihez csatlakoztatható, és támogatja a kötegelt feldolgozást repül, de előfizetésként fizetik, nem pedig egyszeri fizetésként.

Megjegyzések

  • Nem ismeri a SmartyStreets alkalmazást, ígéretesnek tűnik, köszönöm a felfelé.
  • A LiveAddress API körülbelül 5-10 perc alatt 300 000-et tesz meg. A LiveAddress for Lists szolgáltatás (egy lista feltöltése feldolgozás céljából) 15-20 percet vesz igénybe. Mindkettő nagyon gyors. A List szolgáltatás nem igényel semmilyen kód megírását.
  • A SmartyStreets csak az Egyesült Államok geokódjait használja?
  • Vannak olyan adataim, amelyek Szingapúrra vonatkoznak, működni fog? Ha nem, akkor adjon nekem egy utasítást ????
  • A SmartyStreets most már nemzetközi címellenőrzést kínál. @ user1089553

Válasz

Ha tetszik a Python, használhatja a GeoPy API a GDAL Python-összerendelésekkel vagy Fiona , és hozzon létre egy ilyen nagyon egyszerű szkriptet a címek pontszerű fájlokká alakításához.

Ez geolokalizálja a “address_to_geocode” nevű fájlt, és létrehozza a “my_output.shp” nevű kimeneti alakfájlt a my_output mappában:

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

A fájlnak állítólag csak egy címet kell tartalmaznia egyetlen címhez, például:

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

Itt a Google API-t használom, de az verzióval a GeoPy nagyon alapvető a különböző API-kra váltáshoz, például a Yahoo!, a GeoNames vagy a MapPoint .

Megjegyzések

  • Ez nagyon jó! Köszi haver! Mindenesetre jelenleg (01/2016) a ‘ geokódolókat. A Google () ‘ -et geokódolók.GoogleV3 () ‘ mint geopy.readthedocs.org/en/1.11.0

Válasz

A probléma megoldásának másik lehetősége az adatkészlet fúzióba importálása lenne táblázatokat, és állítsa be a cím mezőt helyként. Ezután automatikusan geokódolja a pontokat. Ha ez befejeződött, exportálhatja az adatokat KML-ként.

Vagy … írhat php parancsfájlt is a yahoo geokódoló használatára, amelynek korlátja 50 000 rekord, tehát előbb vagy utóbb az összes pontod geokódolva lesz az adatbázisodban.

Remélem, hogy ez segített!

Hozzászólások

  • köszönöm Tamásnak, de nem szeretném megszerezni az kml-t, majd onnan lehívni az információkat, majd m db-re. Szeretem elképzelni a yahoo geokódolást, de nem vagyok túl biztos a pontosságában, mivel soha nem használtam a yahoo-t térképezésre. Kérjük, tudassa velem, ha van írva forgatókönyv vagy valami. Ez nagy segítség
  • Ne feledje, hogy a Yahoo (vagy a Google-nak megfelelő) geokódoló automatizált lekérdezésekkel vagy térkép megjelenítése nélkül történő használata megsérti a TOS-t …
  • Eddig mint tudom, nem az, ha bemutatja a kimenetet egy térképen. Javíts ki, ha tévedek!
  • @Tamas Kind of. Ezt azonban lásd: developers.google.com/maps/terms#section_10_1_3

Válasz

Sikeresen használtam a Google geokódolási webszolgáltatást használó geopy-t. Tökéletesen működik, akár 2k pont / 24 óra.

Válasz

az általam használt legjobb és legegyszerűbb geokódoló https://pypi.python.org/pypi/geocoder/1.8.0 bing maps, google maps, OSM stb.

Válasz

Talán nem a legjobb válasz a kérdésedre, de kipróbálhatja a BatchGeo programot. Az ingyenes verzió sokat szenvedne tőle, de mégis elég jó volt a munkámhoz. Pedig megvettük a pro verziót.

A KML fájl koordinátáinak megszerzéséhez trükk az importálás később.

Hozzászólások

  • Köszönöm, elmondanád, hogyan csinálom a BatchGeót, tudnád-e az ingyenes verzió nevét is (A Google Map api v3 verzióval próbálkoztam.) Ez azt is jelenti hogy a Lat / Long értékeket feltérképeznem kell az adatbázisomban. Ezt elsősorban el akartam csinálni.
  • A BatchGeo használatával be kell importálnia a KML-t az adatbázisába, majd kibontani a koordinátákat. Nem tudok más módot, mivel a Google megtiltja a koordináták megadását. A yahoo-ról a Törökországgal kapcsolatos tapasztalataim nem igazán fényesek. A legtöbb fejlődő ország kimarad a Yahoo ‘ hatóköréből. Anil.

Válasz

Matej, ez az, mert a Google API lehetővé teszi napi 2,5 ezer felhúzást.
A Geo megoldásról a batch még nem talált támogatottnak, mert “s a geo python kód áttekintése alapján úgy tűnik, hogy minden egyes alkalommal új kapcsolatot nyit, amikor új koordinátát kér, 300k valószínűleg örökre megragad (valószínűleg 400-as hiba).
A Poligonokkal történő játéknak meg kell tennie a trükköt, de ez attól függ, hogy mi a “Playground” területe, ha ez egy ország vagy n ország.
1 ország esetében a sokszögeknek nagyon szépen kell működniük .
N országban a megoldás nem fog működni, mivel a gyűjtés hosszabb időt vesz igénybe, bármikor hozzáad egy másik országot. A legjobb megoldás erre a lusta terhelés.
=> kezdje a sokszög ötlettel, minden mással ország, hozzon létre egy nagy adatbázis-táblázatot az adatok tárolására, végül úgy gondolja, hogy megtartja a szükséges adatokat.

Válasz

Ha meg akarja csinálni PHP-vel – a MySQL itt egy megoldás, hogy jaj rked nekem:

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

Válasz

Próbálkozzon ezzel geokódolási api . Kicsi használat esetén ingyenes, de ha többet akarsz, fizetésre késztetnek. Ez azonban olcsó és ennyire könnyen feldolgozható, havi milliókat dolgozok fel rajtuk keresztül.

Válasz

Használjon Mappointing eszközöket (Térképmutató | Kötegelt geokódoló eszköz ( http://www.mappointing.com/ )) Ebben az eszközben feldolgozhatja az adatokat a Google map ingyenes API kulcsával. És ez az eszköz biztosítja a távolság kiszámítását & Hely kereső eszközt is.

Megjegyzések

  • Miért nem ‘ érte el ugyanazt az API korlát OP-t, amelyet említettünk?

Válasz

Adatait szövegfájlként mentheti (soronként egy rekordot), majd a szolgáltatás segítségével kötegelheti geokódot: http://geocode.xyz/batch (működik a legtöbb európai országban)

vagy írhat saját kódot a REST eléréséhez / JSON API: (korlátlan keresésekhez ingyenes)

Megjegyzések

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük