2012-05-20 33 views
12

Estoy tratando de encontrar las dos calles más cercanas a un punto con la API de Google Places (básicamente para indicar la intersección más cercana). Sin embargo, cualquier resultado solo devolverá una "ruta", si es que lo hace.Obtener una intersección con la API de Google Places/Geocodificación

Me imagino que podría hacer 5 consultas en un patrón + o X, pero eso es raro, poco confiable y, por supuesto, alcanzará el límite de la consulta mucho antes.

Estoy tentado de decir que este es un paso deliberado porque la API no está destinada a ser utilizada para sistemas de navegación (que no estoy tratando de hacer), pero todavía espero que haya una forma compatible con TOS para obtener la intersección.

Nota al margen: parece que especificar "types = route" nunca arroja ningún resultado, lo que confirma mi sospecha de que Places solo está destinado a ser usado para POI reales, no para navegación, aunque el terms of service no menciona cualquier restricción explícita en ese sentido.

EDITAR: Como Chris señaló, existe la API de codificación geográfica específicamente diseñada para la codificación geográfica, pero todavía no veo una manera de obtener la calle transversal más cercana que no sea a través de múltiples consultas.

+0

El geocodificador inverso siempre devuelve exactamente un resultado: lo más parecido que encontró, por lo que no puede hacer lo que describe. ¿Qué estás tratando de lograr exactamente? – smirkingman

+0

Estoy tratando de encontrar la intersección más cercana al punto donde estoy. Por lo menos, me gustaría tener dos nombres de calles cuando estoy en una intersección, pero idealmente también quiero la calle transversal más cercana. Mi esperanza era que proporcionar un cierto tamaño de radio me diera múltiples resultados de 'ruta', y podría usar la segunda mejor 'ruta' como el cruce de calles. – EboMike

+0

En las pruebas, puedo confirmar que un geocodificación inverso nunca arroja más de un resultado: lo más parecido en la opinión de GoogleMap. También probé google.maps.places.PlaceSearchRequest, pero incluso si pides "street_address" no devuelve nada (a menos que haya un lugar de interés que alguien haya marcado cerca). – smirkingman

Respuesta

5

El consenso es que el geocodificador inverso de Google no es lo suficientemente sofisticado como para informar intersecciones en una consulta. Es decir, no hay un parámetro que pueda usar para decirles que solo desea los resultados con "types" : [ "intersection" ]. Google está comiendo su propio dogfood aquí; si ingresas un lat/lon en un cuadro de búsqueda de maps.google, siempre obtienes una calle (en el lenguaje de Google, una 'ruta').

Como usted señala, hay muchas heurísticas que podría aplicar para obtener el codiciado tipo ["intersection"].

p. Ej. Varias intersecciones "principales" en las ciudades del 1er mundo tienen paradas de tránsito que describen la intersección. Si algún resultado tiene un elemento "types" : [ "bus_station", "transit_station" ], puede probar el elemento "long_name" como un término de búsqueda y esperar obtener una intersección.smirkingman también mencionó una solución viable. Ambos requieren 2+ consultas, ¡ay!

En conclusión, no existe un tipo de función latelngToIntersection (lat, lng) en la API de geocodificación de Google. La evidencia de esto existe en la propia página maps.google de Google. Atacaría tu problema de manera diferente. Si desea obtener la intersección principal más cercana con una ubicación GPS, puede ser útil ayudar al usuario. La geocodificación está notoriamente plagada de humanidad repulsiva.

+0

Hola Rooke, eso es realmente un enfoque interesante. Incluso podría intentar utilizar un punto de referencia como referencia (preferiblemente una parada de autobús, como "Schmuck Street, cerca de Dork Station", pero posiblemente incluso "Food Street, cerca de Applebee's" si no aparece nada más. Eso requerirá menos consultas que un patrón X . Preferiría el nombre de la intersección, pero seamos prácticos. ¡Y aquí está la recompensa! – EboMike

2

Tiene razón, la API de Places no está destinada a ser utilizada para geocodificación. Los resultados políticos, como las calles y las ciudades, están limitados a solo 2 resultados, ya que solo están allí para proporcionar la identidad del área para los Lugares devueltos.

Si desea buscar calles etc. intente utilizar el API de codificación geográfica: https://developers.google.com/maps/documentation/geocoding/

+0

Gracias Chris! Soy un completo idiota. ¿Cómo no noté la API de geocodificación? Sin embargo, todavía tengo el mismo problema con la API de geocodificación. Solo puedo hacer una geocodificación inversa de un punto específico, que devuelve la calle más cercana, pero nunca una intersección. ¿Cómo puedo encontrar la calle transversal más cercana? – EboMike

1

API de Google Maps no es compatible con esto. Es un geocodificador de direcciones solamente. Lo mejor que puedes hacer con Google Maps API es utilizar el servicio de indicaciones para encontrar el primer turno, pero eso es un truco total. Es posible que desee intentar buscar en otros mapas servicios que puedan ofrecer esta capacidad.

1

Como se mencionó, no existe una función de GoogleMap para revertir el geocodificación y obtener un conjunto de puntos de cierre.

La única alternativa que veo es

  • Calcular 200 metros N/S/E/W del punto con Haversine. Tendrá que elegir '200' empíricamente
  • Reverse-geocodificación esos 4 puntos
  • De las direcciones devueltas, tome las 2 calles más cercanos que son diferentes (no puede tener éxito)

Si hace esto del lado del cliente, sus usuarios raramente se encontrarán con el límite diario de 2'500.

+0

Suspiro, no estoy seguro de a quién dar la recompensa también - Probablemente probaré tanto el suyo como el de Rooke. Aunque Rooke me inspiró para probar otra cosa, es decir, identificar una calle por su nombre y un hito importante. Sería bueno poder separar una recompensa. – EboMike

3

Puede usar los datos de OpenStreetMap. Su archivo .osm proporciona la latitud/longitud de las calles que se cruzan.

  1. Cómo obtener los datos.

    1. Ir a OpenStreetMap y encontrar su lugar en el que le interesa, hacer zoom en la marca de la señal como la cuarta.

    2. Haga clic en Exportar en la barra de navegación superior, en el menú desplegable, presione "OpenStreetMap XML Data" y haga clic en "Exportar".

    3. Para obtener una gran cantidad de datos como un estado o país, Planet.osm y encuentre el "extracto" que desee.

  2. Para obtener las intersecciones, se quiere buscar datos que coincidan con este formato, probablemente buscar carretera.

Ejemplo:

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

El way.id es el identificador de la calle, un nd de los árbitros son calles ids se le debe encontrar en el mismo archivo. Se ven algo como esto

‹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

Buena base de datos. ¿Hay una API donde pueda acceder a la base de datos usando consultas simples? Obviamente, no quiero descargar planet.osm , y esta es una operación de fondo automatizada, no puedo usar la interfaz web. Revisé el sitio web, pero no encontré nada inmediatamente. – EboMike

+0

lea la wiki, puede conectarse a la base de datos. solo 25 conciertos. Ahorraría lo que sea que sea parte del mapa que necesite, en lugar de acceder a su base de datos o sitio web cada vez, ya que es un servicio gratuito. – NJordan

8

GeoNames proporciona una API de codificación geográfica para la intersección más cercana de las coordenadas de latitud/longitud.

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

La respuesta JSON se parece a esto:

{"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 y street2 son los cruces de calles.

Cuestiones relacionadas