Jak za běhu geokódovat 300 000 adres?

Mám databázi s 300 000 adresami, které se mají zobrazit na mapě. Vím, že pokud geo-kóduji celou adresu, bude to pro mě příliš drahé. Zajímalo by mě, jestli je možné geograficky kódovat adresu za běhu / v reálném čase, když by uživatel vybral adresu (adresu nemovitosti), prohledal by databázi a poté geokódoval adresu a poté ji namapoval pomocí další atributy.

Bylo by opravdu hezké, kdybyste mohli sdílet kód, koncept nebo cokoli jiného. Mimochodem, můj backend je na mysql podporovaný Joomlou.

Komentáře

  • Obecně používám schopnost geokódování ArcGIS ke geokódování velkého počtu adres. Také mě ‚ opravdu zajímají zde vysvětlené procesy, zvláště bych chtěl otestovat skript pythonu ke geokódování adres pomocí Google a pak je porovnat s tím, co jsem ‚ dostal jsem se z ArcGIS. Bohužel se mi zdá, že ‚ nejsem schopen najít všechny související soubory a skripty, které jsou na různých místech. Bylo by velmi oceněno, kdyby mi někdo poslal všechny skripty v jednom souboru zip nebo jakýkoli krok za krokem. ‚ Snažil jsem se to použít a získat pro vás zpětnou vazbu, ale nebyl jsem úspěšný

Odpovědět

Mehul, pracoval jsem v oboru ověřování adres se společností SmartyStreets. Existuje spousta služeb geokódování, ale jen málo z nich bude podporovat dávkové zpracování s požadovaným objemem. (Google a další neumožňují hromadné použití jejich API nebo ukládání / ukládání výsledků do mezipaměti.)

Pokud přejdete do své databáze MySQL a provedete export tabulky, která obsahuje adresy, uložte ji jako Například soubor CSV. Poté jej můžete zpracovat pomocí nástroje pro hromadnou kontrolu adres pro seznamy nebo nástroje příkazového řádku . Jak jsem řekl, existuje několik služeb, ale předpokládám, že budete chtít něco, co také ověří existenci adres (tedy důvod geokódování) – pokud je adresa nesprávná nebo neúplná, stejně tak výsledky geokódování. Provádí to jen několik služeb.

LiveAddress je služba, kterou USPS CASS-Certified . Je jich tam pár, takže si udělejte průzkum, ale chcete něco „on-the-fly“ / rychlé a levné, takže znovu doporučuji LiveAddress. „Nejen, že ověříte adresu, ale také uděláte, co požadujete, které jsou informace o lat / lon a také přesnost výsledků geokódování. Je to vše webové a za okamžik zpracuje desítky milionů záznamů (viz tuto otázku jako referenci ).

Pokud máte další při interakci uživatelů je třeba geokódovat adresy, US Street Address má také verzi API , kterou lze připojit téměř ke všemu, a podporuje také dávkové zpracování online létat, ale platí se jako předplatné, nikoli jednorázová platba.

Komentáře

  • Neznám SmartyStreets, vypadá slibně, díky za heads up.
  • LiveAddress API zvládne 300 000 za přibližně 5-10 minut. Služba LiveAddress pro seznamy (nahrání seznamu ke zpracování) trvá 15–20 minut. Oba docela rychlé. Služba Seznam nebude vyžadovat, abyste psali jakýkoli kód.
  • SmartyStreets pouze geokódy pro USA?
  • Mám data, která jsou pro Singapur, bude to fungovat? Pokud ne, můžete mi dát pokyny ????
  • SmartyStreets nyní nabízí mezinárodní ověřování adres. @ user1089553

Odpověď

Pokud máte rádi Python, můžete použít GeoPy API v kombinaci s GDAL Python vázání nebo Fiona a vytvořte velmi základní skript, jako je tento, pro převod adres na bodový tvarový soubor.

Tímto způsobem vytvoříte geolokaci souboru s názvem „addresses_to_geocode“ a ve složce my_output vytvoříte výstupní tvarový soubor s názvem „my_output.shp“:

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

Soubor má mít pouze řádek pro jednu adresu, například:

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

Zde používám Google API, ale s GeoPy je velmi základní přepnout na různé API, jako je Yahoo !, GeoNames nebo MapPoint .

Komentáře

  • To je skvělé! Díky chlape! V současné době (01/2016) by mělo být ‚ geocoders.Google () ‚ změněno na ‚ geocoders.GoogleV3 () ‚ jako v geopy.readthedocs.org/en/1.11.0

Odpověď

Další možností, jak vyřešit váš problém, by byl import vaší datové sady do fúze. tabulky a nastavte pole adresy jako umístění. Poté body automaticky geokóduje. Jakmile to bude hotové, můžete data exportovat jako KML.

Nebo můžete také napsat php skript, který využije geokodér yahoo, který má limit 50 000 záznamů, takže dříve či později ve své databázi budete mít geokódované všechny své body.

Doufám, že to pomohlo!

Komentáře

  • děkuji tamas, ale Nechtěl bych získat kml a poté načíst informace odtud a pak do m db. Rád si představuji geokódování yahoo, ale nejsem si příliš jistý přesností, kterou má, protože jsem yahoo pro mapování nikdy nepoužil. Pokud máte napsaný nějaký scénář nebo něco, dejte mi prosím vědět. To je skvělá pomoc
  • Pamatujte, že používání geokodéru Yahoo (nebo Google) s automatizovanými dotazy nebo bez zobrazení mapy by porušilo TOS …
  • Pokud jde o jak vím, není tomu tak, pokud prezentujete výstup na mapě. Opravte mě, pokud se mýlím!
  • @Tamas Druh. Podívejte se na toto: developers.google.com/maps/terms#section_10_1_3

Odpovědět

Úspěšně používám geopy, které využívá webovou službu geokódování Google. Funguje perfektně až za 2 000 bodů za 24 hodin.

Odpovědět

zdaleka nejlepší a nejjednodušší geokodér, jaký jsem použil https://pypi.python.org/pypi/geocoder/1.8.0 bing mapy, google mapy, OSM atd.

Odpověď

Možná ne nejlepší odpověď na vaši otázku, ale můžete zkusit BatchGeo. Bezplatná verze by vás hodně trápila, ale pro mou práci byla stále dost dobrá. Přesto jsme si koupili profesionální verzi.

Trik k získání souřadnic ze souboru KML spočívá v importu do ArcGIS později.

Komentáře

  • Díky, můžete mi říct, jak mám udělat BatchGeo, také byste věděli názvy bezplatné verze (Snažil jsem se o Google Map api v3). Znamená to také že musím uložit hodnoty Lat / Long do své databáze, abych to mohl mapovat. To je to, co jsem chtěl udělat na prvním místě.
  • S BatchGeo budete muset importovat KML do vaší databáze a poté extrahovat souřadnice, neznám jiný způsob, protože Google zakazuje poskytovat souřadnice. Pokud jde o yahoo, moje zkušenost s Tureckem není příliš jasná. Většina rozvojových zemí je mimo rozsah Yahoo ‚. Anil.

Odpověď

Matej, Je to proto, že Google API umožňuje vytáhnout až 2,5 tis za den.
O řešení Geo se zatím nepodařilo najít podporu dávky, protože z mé kontroly kódu geo pythonu se zdá, že navazuje spojení pokaždé, když požádá o nový cordinate, 300k se pravděpodobně zasekne navždy (pravděpodobně s chyba 400).
Hra s Poligons by měla stačit, ale záleží na tom, jaká je vaše oblast „Hřiště“, jestli je to 1 země nebo n zemí.
Pro 1 zemi by polygony měly fungovat docela dobře .
Pro n zemí řešení nebude fungovat, protože kolekce bude trvat déle, kdykoli přidáte další zemi. Nejlepší aprochem k tomu je líné načtení.
=> začít s myšlenkou polygonu, každá věc v jiné země, vytvořte velkou databázovou tabulku pro uchování dat, případně budete uchovávat data, která potřebujete.

Odpověď

Pokud to chcete udělat s PHP – MySQL, je tu řešení, které není v pořádku rked for me:

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

Odpověď

Vyzkoušejte geokódovací rozhraní API . Pro malé použití je to zdarma, ale pokud chcete více, nutí vás platit. Je to však levné a můžete to snadno zpracovat, zpracovávám přes ně miliony měsíčně.

Odpověď

Používejte nástroje pro mapování (Mapování bodů | Dávkový geokódovací nástroj ( http://www.mappointing.com/ )) V tomto nástroji můžete data zpracovávat pomocí klíče API Google map free. A také tento nástroj poskytuje výpočet vzdálenosti & Nástroj pro vyhledávání míst.

Komentáře

  • Proč by to ‚ nezasáhlo stejný limit API uvedený v OP?

Odpověď

Data můžete uložit jako textový soubor (jeden záznam na řádek) a poté pomocí této služby dávkově geokódovat: http://geocode.xyz/batch (funguje pro většinu evropských zemí)

nebo můžete napsat vlastní kód pro přístup k REST / JSON API: (pro neomezené vyhledávání je zdarma)

Komentáře

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *