2012-05-20 17 views
12

Sto cercando di trovare le due strade più vicine a un punto con l'API di Google Places (in pratica per indicare l'intersezione più vicina). Tuttavia, qualsiasi risultato restituirà sempre una "route", se non del tutto.Ottenere un incrocio con Google Places/Geocoding API

Immagino di poter eseguire 5 query in uno schema + o X, ma questo è hacky, inaffidabile e, naturalmente, colpirà il limite della query molto prima.

Sono tentato di dire che si tratta di una mossa intenzionale perché l'API non è pensata per essere utilizzata per qualcosa come i sistemi di navigazione (cosa che non sto tentando di fare), ma spero ancora che ci sia un modo conforme alla TOS per ottenere l'incrocio.

Nota a margine - sembra che specificare "tipi = percorso" non restituisca mai alcun risultato, il che oltrepermette il mio sospetto che Places sia realmente destinato a essere utilizzato per i POI reali, non per la navigazione, sebbene lo terms of service non menzioni eventuali restrizioni esplicite a tale riguardo.

MODIFICA: come ha sottolineato Chris, c'è l'API di geocoding appositamente progettata per il geocoding, ma non vedo ancora un modo per ottenere il cross street più vicino se non attraverso più query.

+0

Il geocensore inverso restituisce sempre esattamente un risultato: la cosa più vicina trovata, quindi non puoi fare ciò che descrivi. Cosa stai cercando di ottenere esattamente? – smirkingman

+0

Sto cercando di trovare l'intersezione più vicina al punto in cui mi trovo. Per lo meno vorrei due nomi di strada quando sono su un incrocio, ma idealmente voglio anche la traversa più vicina. La mia speranza era che fornire una determinata dimensione del raggio mi avrebbe dato più risultati di "percorso", e avrei potuto usare la seconda "via" migliore per attraversare la strada. – EboMike

+0

In fase di test, posso confermare che un geocoding inverso non restituisce mai più di un risultato: la cosa più vicina nell'opinione di GoogleMap. Ho anche provato google.maps.places.PlaceSearchRequest, ma anche se chiedi "street_address" non restituisce nulla (a meno che non ci sia un luogo di interesse che qualcuno ha contrassegnato nelle vicinanze). – smirkingman

risposta

5

Il consenso è che il geocoder inverso di Google non è abbastanza sofisticato da segnalare le intersezioni in una query. Cioè, non c'è un parametro che puoi usare per dire loro che vuoi solo i risultati con "types" : [ "intersection" ]. Google sta mangiando il proprio cibo per cani qui; se inserisci un lat/lon in una casella di ricerca maps.google, ottieni sempre una strada (in Google parlance, un "percorso") indietro.

Come si fa notare, ci sono un sacco di euristiche che è possibile applicare per ottenere l'ambito tipo ["intersection"].

ad es. Diverse intersezioni "importanti" nelle città del primo mondo hanno fermate di transito che descrivono l'intersezione. Se qualche risultato ha un elemento "types" : [ "bus_station", "transit_station" ], puoi provare l'elemento "long_name" come termine di ricerca e sperare di ottenere un incrocio.smirkingman ha anche menzionato una soluzione valida. Entrambi hanno richiesto 2+ query, purtroppo.

In conclusione, non esiste alcun tipo di funzione latelngToIntersection (lat, lng) nell'API di Google Geocoding. La prova di ciò esiste nella pagina maps.google di Google. Attaccherei il tuo problema in modo diverso. Se si desidera ottenere l'intersezione principale più vicina in base alla posizione GPS, può essere utile aiutare l'utente. Geocoding è notoriamente disseminato di icky umanità.

+0

Hey Rooke, questo è in realtà un approccio interessante. Potrei anche provare a utilizzare un punto di riferimento come riferimento (preferibilmente una fermata dell'autobus, come "Schmuck Street vicino a Dork Station", ma forse anche "Food Street vicino a Applebee" se non viene fuori altro. Ciò richiederà un numero inferiore di query rispetto a un modello X Preferisco ancora il nome dell'intersezione, ma cerchiamo di essere pratico.E qui c'è il bounty! – EboMike

2

Sei corretto, l'API di Places non è pensata per essere utilizzata per il geocoding. I risultati politici come strade e città sono limitati a soli 2 risultati poiché sono lì solo per fornire l'identità dell'area per i Luoghi restituiti.

Se si desidera cercare strade ecc provare a utilizzare l'API Geocoding: https://developers.google.com/maps/documentation/geocoding/

+0

Grazie Chris! Sono uno schmuck completo - come ho fatto a non notare l'API Geocoding? Tuttavia, ho ancora lo stesso problema con l'API Geocoding - Posso solo eseguire una geocodifica inversa di un punto specifico, che restituisce la strada più vicina, ma mai un'intersezione. Come posso trovare la traversa più vicina? – EboMike

1

API di Google Maps non supporta questa. È solo un indirizzo geocoder. Il meglio che puoi fare con l'API di Google Maps è l'utente del loro servizio di indicazioni stradali per trovare dove si trova il primo turno, ma è un trucco totale. Potresti voler provare a esaminare altri servizi di mappe che possono offrire questa capacità.

1

Come discusso, non esiste una funzione GoogleMap per invertire il geocodice e ottenere una serie di punti di chiusura.

L'unica alternativa che vedo è

  • Calcolare 200 metri N/S/E/O di punto con Haversine. Avrete bisogno di scegliere '200' empiricamente
  • Reverse-Geocode quei 4 punti
  • dagli indirizzi restituiti, prendere le 2 strade più vicini che sono diverse (non può riuscire)

Se si esegue questa operazione lato client, raramente i tuoi utenti incontrano il limite giornaliero di 2'500.

+0

Sigh, non sono sicuro di chi dare la taglia, probabilmente proverò sia il tuo sia l'approccio di Rooke. Rooke mi ha ispirato a provare qualcos'altro, cioè a identificare una strada con il suo nome e un punto di riferimento importante. Sarebbe bello poter dividere una taglia. – EboMike

3

È possibile utilizzare i dati da OpenStreetMap. Il loro file .osm fornisce il lat/long delle strade che si intersecano.

  1. Come ottenere i dati.

    1. Vai OpenStreetMap e trovare il tuo posto in cui siete interessati, zoom in, come il segno di spunta 4 °.

    2. Fare clic su Esporta nella barra di navigazione in alto, nel menu a discesa, premere "Dati XML OpenStreetMap" e fare clic su "Esporta".

    3. Per un sacco di dati come uno stato o un paese, Planet.osm e trovare un "estratto" desiderato.

  2. Per ottenere le intersezioni, si vuole cercare i dati che corrisponde a questo formato, probabilmente la ricerca di autostrada.

Esempio:

<way id="6419265" user="eric22" uid="160949" visible="true" version="2" changeset="10632563" timestamp="2012-02-09T10:49:21Z"> 
    <nd ref="53167978"/> 
    <nd ref="53163978"/> 
    <nd ref="53163979"/> 
    <nd ref="53173508"/> 
    <nd ref="53164158"/> 
    <nd ref="53173510"/> 
    <tag <b>k="highway"</b> v="residential"/> 
    <tag k="name" v="Alberta St"/> 
    <tag k="tiger:cfcc" v="A41"/> 
    <tag k="tiger:county" v="St. Louis-City, MO"/> 
    ... 
</way> 

Il way.id è l'id strada, un nd gli arbitri sono strade ID possono si dovrebbe trovare nello stesso file. Assomigliano a questo tipo

‹node id="53167978" lat="38.5852785" lon="-90.2450074" user="eric22" uid="160949" visible="true" version="3" changeset="10632563" timestamp="2012-02-09T10:48:49Z"/> 
+0

Bel database C'è un'API in cui posso accedere al database usando semplici query? Ovviamente, non voglio scaricare planet.osm , e questa è un'operazione di background automatizzata, non posso usare l'interfaccia Web. Ho controllato il sito Web, ma non ho trovato immediatamente nulla. – EboMike

+0

leggi il wiki, puoi connetterti al db. Gli Stati Uniti planet.osm è solo 25 concerti. Salverei ogni parte della mappa che ti serve, invece di colpire il loro db o sito web ogni volta che si tratta di un servizio gratuito. – NJordan

8

GeoNames fornisce un'API di geocoding per l'intersezione più vicina dalle coordinate di latitudine/longitudine.

http://www.geonames.org/maps/us-reverse-geocoder.html#findNearestIntersection

La risposta JSON assomiglia a questo:

{"intersection": 
{"adminName2":"San Mateo", 
    "street2":"Curtis St", 
    "postalcode":"94025", 
    "street1":"Roble Ave", 
    "adminCode1":"CA", 
    "distance":"0.08", 
    "countryCode":"US", 
    "lng":"-122.180842", 
    "placename":"Menlo Park", 
    "lat":"37.450649", 
    "adminName1":"California" 
}, 
"credits":"1.0" 
} 

street1 e street2 sono le vie trasversali.

Problemi correlati