Kuinka geokoodata 300 000 osoitetta lennossa?

Minulla on tietokanta, jolla on 300 000 osoitetta, jotka on tarkoitus näyttää kartalla. Tiedän, jos geokoodaan kaikki osoitteet, se on minulle liian kallista. Joten mietin, onko mahdollista geokoodata osoite lennossa / reaaliajassa, kun käyttäjä valitsee osoitteen (ominaisuusosoite), se etsii tietokannasta ja geokoodasi osoitteen ja kartoittaa sen sitten muut määritteet.

Olisi todella mukavaa, jos voisit jakaa koodin, konseptin tai mitä tahansa. Muuten taustani on mysqlissä, jota Joomla tukee.

Kommentit

  • Käytän yleensä ArcGIS-geokoodausominaisuutta geokoodaamaan suuren määrän osoitteita. Olen myös ’ todella kiinnostunut tässä selitetyistä prosesseista, erityisesti haluaisin testata python-komentosarjaa osoitteiden geokoodaamiseksi Googlen avulla ja verrata niitä sitten siihen, mitä ’ olemme saaneet ArcGIS: stä. Valitettavasti minusta tuntuu, että en ’ en löydä kaikkia niihin liittyviä tiedostoja ja komentosarjoja, jotka ovat eri paikoissa. Olisi niin arvostettua, jos joku lähettäisi minulle kaikki komentosarjat yhdessä zip-tiedostossa tai mikä tahansa vaiheittainen ohje. Olen ’ yrittänyt käyttää sitä ja saada sinulle palautetta, mutta en ollut onnistunut

Vastaa

Mehul, työskentelin aiemmin osoitteenvahvistusteollisuudessa SmartyStreets -nimisen yrityksen kanssa. Siellä on paljon geokoodauspalveluja, mutta vain harvat tukevat eräkäsittelyä tarvitsemallasi määrällä. (Google ja muut eivät salli sovellusliittymiensä massakäyttöä tai tulosten tallentamista / välimuistiin tallentamista.)

Jos menet MySQL-tietokantaan ja viet taulukot, jotka sisältävät osoitteet, tallenna se Esimerkiksi CSV-tiedosto. Voit sitten käsitellä sen käyttämällä luetteloiden joukkotunnistustyökalua tai komentorivityökalua . Kuten sanoin, siellä on useita palveluja, mutta haluat jotain, luulen, että se tarkistaa myös osoitteiden olemassaolon (siis syy geokoodaukseen) – jos osoite on väärä tai puutteellinen, niin ovat myös geokoodaustulokset. Vain muutama palvelu tekee tämän.

LiveAddress on palvelu, jonka USPS CASS-sertifioi . Siellä on muutama, joten tee tutkimuksesi, mutta haluat jotain ”lennossa” / nopeaa ja edullista, joten suosittelen jälleen LiveAddressia. Se ”ei tarkista vain osoitetta, vaan tekee sen mukaan mitä tarvitset, mikä on lat / lon -tietojen toimittaminen ja myös geokoodaustulosten tarkkuus. Kaikki verkkopohjainen ja käsittelee kymmeniä miljoonia tietueita hetkessä (katso tämä kysymys viitteenä ).

Jos sinulla on vielä täytyy geokoodata osoitteet käyttäjien ollessa vuorovaikutuksessa, Yhdysvaltain katuosoitteella on myös -sovellusliittymän versio, joka voidaan liittää mihin tahansa, ja se tukee myös eräkäsittelyä verkossa lentää, mutta se maksetaan tilauksena, ei kertamaksuna.

Kommentit

  • Ei tunne SmartyStreetsia, näyttää lupaavalta, kiitos
  • LiveAddress-sovellusliittymä tekee 300 000 noin 5-10 minuutissa. LiveAddress for Lists -palvelu (lataa luettelo käsiteltäväksi) kestää 15-20 minuuttia. Molemmat melko nopeita. Lista-palvelu ei vaadi sinua kirjoittamaan koodia.
  • SmartyStreets vain geokoodeja Yhdysvalloissa?
  • Minulla on tietoja Singaporesta, toimiiko se? Jos ei mitään ohjeita, voisit antaa minulle ????
  • SmartyStreets tarjoaa nyt kansainvälisen osoitetodistuksen. @ user1089553

Vastaa

Jos pidät Pythonista, voit käyttää GeoPy-sovellusliittymä yhdistettynä GDAL Python -sidontaan tai Fiona , ja luo tämänkaltainen hyvin yksinkertainen komentosarja osoitteiden muuntamiseksi piste-muotoiseksi tiedostoksi.

Tämä geolokoi tiedoston nimeltä ”address_to_geocode” ja luo ulostulon muotoisen tiedoston nimeltä ”my_output.shp” my_output-kansioon:

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

Tiedostossa oletetaan olevan vain rivi yhdelle osoitteelle, kuten esimerkiksi:

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

Tässä käytän Google-sovellusliittymää, mutta -toiminnolla GeoPy on hyvin yksinkertainen vaihtaaksesi erilaisiin sovellusliittymiin, kuten Yahoo!, GeoNames tai MapPoint .

Kommentit

  • Tämä on hienoa! Kiitos, kaveri! Joka tapauksessa tällä hetkellä (01/2016) ’ geokooderit.Google () ’ tulisi vaihtaa muotoon ’ geokooderit.GoogleV3 () ’ kuten kohdassa geopy.readthedocs.org/en/1.11.0

Vastaa

Toinen vaihtoehto ongelman ratkaisemiseksi olisi tuoda tietojoukko fuusioon ja aseta osoitekenttä sijainniksi. Sitten se geokoodaa pisteet automaattisesti. Kun tämä on valmis, voit viedä tiedot KML: nä.

Vaihtoehtoisesti voit kirjoittaa php-komentosarjan hyödyntämään yahoo-geokooderia, jonka enimmäismäärä on 50 000 tietuetta, ennemmin tai myöhemmin kaikki pisteet on koodattu tietokantaan.

Toivottavasti tämä auttoi!

Kommentit

  • kiitos tamas mutta en haluaisi saada kml: tä ja sitten hakea tietoja sieltä ja sitten m db: ksi. Haluan ajatella yahoo-geokoodausta, mutta en ole liian varma sen tarkkuudesta, koska en ole koskaan käyttänyt yahooa kartoitukseen. Kerro minulle, jos sinulla on kirjoitettu käsikirjoitus tai jotain. Tämä on suuri apu
  • Muista, että Yahoo (tai Googlen) geokooderin käyttö automaattisilla kyselyillä tai ilman kartan näyttämistä rikkoo käyttöehtoja …
  • Toistaiseksi kuten tiedän, ei ole, jos esität tuotoksen kartalla. Korjaa minut, jos olen väärässä!
  • @Tamas Kind of. Katso tämä kuitenkin: developers.google.com/maps/terms#section_10_1_3

Vastaa

Olen onnistuneesti käyttänyt geopiaa, joka käyttää Googlen geokoodausverkkopalvelua. Se toimii täydellisesti jopa 2 kt pistettä 24 tunnissa.

Vastaa

ylivoimaisesti paras ja helpoin käyttämäni geokooderi https://pypi.python.org/pypi/geocoder/1.8.0 bing-kartat, google maps, OSM jne.

Vastaa

Ehkä ei ole paras vastaus kysymykseesi, mutta voit kokeilla BatchGeoa. Ilmainen versio saisi sinut kärsimään paljon, mutta silti oli tarpeeksi hyvä työhöni. Olemme kuitenkin ostaneet pro-version.

Koukkujen hankkiminen KML-tiedostosta on sen tuominen myöhemmin ArcGIS: ään.

Kommentit

  • Kiitos, voitko kertoa minulle miten teen BatchGeon, tiedätkö myös ilmaisen version nimet (Yritin Google Map api v3: ta.) Tarkoittaako tämä myös että minun on tallennettava Lat / Long-arvot tietokantaani sen kartoittamiseksi. Tämän tarkoitukseni oli tehdä ensinnäkin.
  • BatchGeon avulla sinun on tuotava KML tietokantaan ja purettava sitten koordinaatit. En tiedä mitään muuta tapaa, koska Google kieltää antamasta koordinaatteja. Yahoo: sta, kokemukseni Turkin kanssa ei ole kovin kirkas. Suurin osa kehitysmaista on jätetty Yahoo ’ soveltamisalan ulkopuolelle. Anil.

Vastaa

Matej, Thats koska Google-sovellusliittymä sallii jopa 2,5k päivässä.
Geo-ratkaisusta erää ei vielä löydetä tuetuksi, koska geopython-koodin tarkastelustani näyttää siltä, että yhteys on auki joka kerta, kun hän pyytää uutta koordinaattia, 300k juuttuu todennäköisesti ikuisesti (luultavasti virhe 400).
Pelaa monikulmioilla pitäisi tehdä temppu, mutta se riippuu siitä, mikä on ”pelikenttä” -alueesi, jos se on yksi maa tai n maata.
Yhden maan polygonien pitäisi toimia melko mukavasti .
Ratkaisu ei toimi n maassa, koska kokoelma kestää kauemmin, kun lisäät toisen maan. Paras tapa tehdä se on laiska kuorma.
=> aloita monikulmion ideasta, jokainen asia toisessa maa, luo iso tietokantataulukko tietojen säilyttämiseksi, ja lopulta pidät tarvitsemasi tiedot.

Vastaa

Jos haluat tehdä sen PHP: llä – MySQL on tässä ratkaisu rked minulle:

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

Vastaa

Kokeile tätä geokoodaus-api . Se on ilmainen pieneen käyttöön, mutta jos haluat enemmän, ne saavat sinut maksamaan. Se on kuitenkin halpaa ja pystyt käsittelemään niin helposti, käsittelen miljoonia kuukaudessa heidän kauttaan.

Vastaa

Käytä Mappointing-työkaluja (Kartan osoittaminen | Erän geokoodaustyökalu ( http://www.mappointing.com/ )) Tässä työkalussa voit käsitellä tietoja Google-kartan ilmaisella sovellusliittymäavaimella. Tämä työkalu tarjoaa myös etäisyyden laskemisen & Paikkahaun työkalu.

Kommentit

  • Miksi ’ t osui samaan mainittuun sovellusliittymän raja-arvoon?

vastaus

Voit tallentaa tietosi tekstitiedostona (yksi tietue riviä kohden) ja sitten erittää geokoodin käyttämällä tätä palvelua: http://geocode.xyz/batch (toimii useimmissa Euroopan maissa)

tai voit kirjoittaa oman koodisi päästäksesi REST / JSON-sovellusliittymä: (se on ilmainen rajoittamattomille hauille)

Kommentit

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *