2012-02-15 18 views
12

Quiero ser capaz de almacenar y volver a mostrar fácilmente una ruta de indicaciones de Google Maps en un mapa de Google. Digamos del punto A al B, el objeto DirectionsResult de Google tiene 100 puntos a lo largo de la ruta, quiero poder almacenar esta ruta y garantizar que la próxima vez que pinto las instrucciones pasarán por todos estos puntos.Almacenamiento de la ruta completa de Google Maps

La forma en que he visto que la gente trata de hacerlo es serializar todo el objeto DirectionsResult y almacenarlo en una base de datos. Luego, cuando deseemos volver a dibujar la ruta, envíe de nuevo la cadena, JSON.Párguela, y luego intente alimentarla a un objeto DirectionsRenderer que representará las instrucciones en el mapa. Este enfoque tiene tres problemas:

1) Se pierde información de tipo durante el proceso de serialización, y como Google minnifica los objetos, no puede usar las funciones de clase para obtener estos valores del objeto de manera confiable. Primero debe usar las funciones o los accesos a los datos para crear objetos 'portadocumentos' al serializar inicialmente el objeto, luego reconstruir los objetos de Google Maps cuando más tarde analice la cadena serializada.

2) Es legalmente dudoso. El TOS de Google Maps dice que no debes almacenar datos permanentemente y parece que de otras publicaciones este enfoque lo infringe.

3) El objeto puede ser enorme, una ruta que serialicé tenía más de 64 KB.

También pensé en tratar de almacenar algunos puntos del camino y luego reconstruirlo usando Waypoints. Este tipo de trabajo funciona pero solo puedes tener como máximo 8 puntos para la API gratuita, por lo que esto no garantiza mucha precisión más allá de esos 8 puntos. Además, pinta los marcadores del waypoint a lo largo de la ruta, lo que creo que podría confundir al usuario.

¿Existe alguna forma aceptada de almacenar rutas exactas desde Google Maps, o la API y los TOS están diseñados a propósito para evitar esto? Gracias por la ayuda.

+2

Así es como lo resolvimos: Tomé el campo "encoded_polyline" y lo envié a nuestro back-end. Si necesitaba procesar los puntos en el backend, utilicé una versión del algoritmo de decodificación de la polilínea de Google que encontré en línea y la migración a ruby ​​(o el idioma que esté usando). Aquí hay una [versión de Python] (http://code.google.com/p/py-gpolyencode/) que encontré. Si necesita mostrar la polilínea en la parte delantera, envíe la polilínea hasta la parte frontal y use la [Herramienta de Google Geometry] (https://developers.google.com/maps/documentation/javascript/3.exp/referencia # codificación) para decodificarlo. – jargetz

+1

Por supuesto, la desventaja de esto es que solo muestra la ruta como una polilínea, por lo que si desea tener waypoints, también deberá almacenarlos. Y si desea que la ruta sea editable, entonces no tiene suerte, solo tendrá que solicitar un nuevo conjunto de instrucciones. – jargetz

+0

Si tiene marcadores con waypoints, puede almacenar 'waypoints list' (o' markers list' con 'start' -'end' point) en la' base de datos' y luego retive whenver require con la misma secuencia y pase a la directionrender con inicio y punto final. Volverá a dibujar la ruta en el mapa. – bharat

Respuesta

2

Creo que esto es legalmente dudoso. De hecho, casi con toda seguridad contraviene el Terms of Service. Como usted señala, se trata de un almacenamiento permanente para fines distintos de la mejora del rendimiento (a diferencia de 10.1.3 (b)); pero también está destinado a mostrar direcciones sin obtenerlas a través de la API (a diferencia de 10.1.1 (a)). El hecho de que Google no lo haya facilitado significa que no han autorizado este caso de uso. De hecho, el TOS y el API están diseñados para dificultar o imposibilitar el almacenamiento de este tipo.

¿No sería aceptable almacenar los puntos de inicio y fin y dejar que la API desarrolle la ruta cuando desee volver a mostrarla?

+0

Gracias por su respuesta Andrew. Estoy de acuerdo contigo. La solución que ofreciste es buena para la mayoría de los casos, pero teníamos el requisito de que necesitábamos estar seguros de que la ruta creada por Google Maps DirectionsRenderer era generalmente la misma durante toda la vida de esta ruta. No había forma de garantizar que un día el camino más corto pintado por el DirectionsRenderer tomaría una nueva carretera (especialmente porque estamos operando en China y las nuevas carreteras que surgen son una realidad). – jargetz

+0

Estamos considerando una solución en la que almacenamos [encoded_polyline] (http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html) desde DirectionsResult, y luego lo pasamos a la parte delantera para pintar usando el algoritmo de decodificación propio de Google. Si necesitamos decodificar la ruta en el backend, usamos una versión del decodificador que transferimos a ruby. Tenemos un prototipo en funcionamiento, pero hemos dudado en implementarlo, ya que es legalmente dudoso (especialmente en contra de 10.1.1 (a) como usted mencionó). – jargetz

0

Eche un vistazo a www.mapmyrun.com que están utilizando la API de google api y sin duda persisten los datos. Sin embargo, es poco probable que usen la API gratuita.