2010-12-29 51 views
11

Uso la API de GoogleMaps v3.0 y trato de guardar un DirectionsResult en mi base de datos y luego lo recupero para utilizarlo en un mapa. Mi problema es que cuando trato de rehidratar el objeto guardado sacando su representación JSON de mi base de datos, el objeto es simplemente tonto JSON, no tiene los métodos y funciones originales de sus objetos constituyentes. Entonces, construí una rutina de reparación que toma el texto de Dumbalt JSON y lo reconstruye reconstruyendo todos los objetos LatLng y LatLngBound. Pero, todavía falta algo porque mi objeto fijo no funciona como el original, los dos puntos aparecen en mi mapa pero falta la línea violeta entre ellos.No se puede deserializar el objeto DirectionsResult de GoogleMaps

Agradecería cualquier consejo sobre una mejor técnica para la serialización/hidratación o cualquier idea sobre lo que podría faltar en mi rutina de reparación.

Gracias

alt text alt text

request = { 
    origin: homeLocation, 
    destination: jobLocation, 
    travelMode: google.maps.DirectionsTravelMode.DRIVING 
}; 
directionsService.route(request, function(response, status) { 
    if (status == google.maps.DirectionsStatus.OK) { 
     var str = Ext.encode(response); //<<==SAVING RAW JSON OBJECT TO DB (I USE ExtJs) 
     var z = eval('(' + str + ')'); //<<==REHYDRATING DirectionsResult RAW JSON OBJECT 
     FixDirectionResult(z);   //<<==ATTEMPT TO RE-ESTABLISH ORIGINAL OBJECTS 
     directionsRenderer.setDirections(z); //<<==THIS WORKS WITH response BUT NOT WITH z 
    } 
); 
function FixDirectionResult(rslt) { 
for(r=0; r<rslt.routes.length; r++) { 
    var route = rslt.routes[r]; 
    var bounds = route.bounds; 
    route.bounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(bounds.U.b,bounds.O.d), 
    new google.maps.LatLng(bounds.U.d,bounds.O.b)); 

    for(l=0; l<route.legs.length;l++) { 
    var leg = route.legs[l]; 
    leg.start_location = new google.maps.LatLng(leg.start_location.wa,leg.start_location.ya); 
    leg.end_location = new google.maps.LatLng(leg.end_location.wa,leg.end_location.ya); 

    for(s=0; s<leg.steps.length;s++) { 
    var step = leg.steps[s]; 
    step.start_location = 
    new google.maps.LatLng(step.start_location.wa,step.start_location.ya); 
    step.end_location = 
    new google.maps.LatLng(step.end_location.wa,step.end_location.ya); 

    for(p=0;p<step.path.length;p++) { 
    var path=step.path[p]; 
    step.path[p] = new google.maps.LatLng(step.path.wa,step.path.ya); 
    } 
    } 
    } 

    for(o=0; o<route.overview_path.length;o++) { 
    var overview = route.overview_path[o]; 
    route.overview_path[o] = new google.maps.LatLng(overview.wa,overview.ya); 
    } 
} 
} 
+0

Si alguien está interesado, también hemos publicado esta consulta para el foro de Google Maps, así: https://groups.google.com/d/topic/google-maps-js-api-v3/Ai1bZIVgfzo /discusión – sisdog

Respuesta

5

Al parecer, de la mirada de su código que no está accediendo a la lat y lng correctamente. La biblioteca de google api es minificada. Los nombres de las variables a menudo se acortan a un conjunto aleatorio de caracteres. No debe acercarse a la xey a través de estas variables sino a través de sus captadores: es decir. lat() y lng() para evitar el mismo problema con las versiones futuras. Con suerte, este es el problema que está causando que su dirección no se represente.

la forma recomendada adecuada para obtener GNL lat y es similar a la siguiente:

results[0].geometry.location.lat().toFixed(3); 
results[0].geometry.location.lng().toFixed(3); 

Así, por ejemplo, esta línea siguiente debe ser:

step.start_location = new google.maps.LatLng(step.start_location.wa,step.start_location.ya); 
step.end_location = new google.maps.LatLng(step.end_location.wa,step.end_location.ya); 

Para:

step.start_location = new google.maps.LatLng(step.start_location.lat(), step.start_location.lng()); 
step.end_location = new google.maps.LatLng(step.end_location.lat(), step.end_location.lng()); 

El almacenamiento de Google Map Data está dentro del plazo de servicio. Aquí está la restricción de que es posible que desee echar un vistazo antes de ir más allá con su almacenamiento de datos:

10.1.3 Restrictions against Data Export or Copying. 

    (a) No Unauthorized Copying, Modification, Creation of Derivative 

Works, o exhibición del contenido. Usted no debe copiar, traducir, modificar, o crear una obra derivada (incluyendo crear o contribuir a una base de datos ), o mostrar públicamente cualquier contenido o parte de ella, excepto como permita explícitamente en estos Términos . Por ejemplo, se prohíbe lo siguiente: : (i) crear una modificación en el lado del servidor de las teselas del mapa; (ii) unir varias imágenes de mapas estáticos juntas para mostrar un mapa que es mayor que el permitido en las API de Maps Documentación; (iii) crear listas de correo o listas de telemercadeo basadas en el Contenido; o (iv) exportar, escribiendo, o guardando el Contenido en una plataforma basada en la ubicación de un tercero o servicio.

(b) No Pre-Fetching, Caching, or Storage of Content. You must not 

de solicitud previa, memoria caché, o almacenar cualquier contenido, excepto que usted puede almacenar: (i) una cantidad limitada de contenido para el propósito de mejorar el rendimiento de la API de Google Maps Implementación si hágalo de forma temporal, segura y en una forma que no permita el uso del contenido fuera del Servicio; y (ii) cualquier identificador de contenido o clave que la Documentación de las API de Maps específicamente le permita almacenar. Para ejemplo, no se debe utilizar el contenido para crear una base de datos independiente de “lugares”.

(c) No Mass Downloads or Bulk Feeds of Content. You must not use the 

Servicio de una manera que usted o da a cualquier otra persona tenga acceso a los medios de descargas o feeds masivos de cualquier contenido de , incluidos, entre otros, coordenadas de latitud numérica o longitud , imágenes, mapas visibles datos o datos de lugares (incluidos listados de empresas). Por ejemplo, no tiene permitido ofrecer un servicio de geocodificación por lotes que utiliza el Contenido que se encuentra en la (s) API (s) de Maps.

1

No pude hacer funcionar el código anterior, así que escribí el mío. Las siguientes dos funciones serializarán y deserializarán un objeto DirectionsResult. Sin embargo, solo serializará la cantidad mínima de datos necesarios para trazar una ruta. Si encuentra que DirectionsResult deserializado devuelto carece de las funciones que necesita, debe modificar el código para agregar cualquier DirectionsResult object attributes adicional que necesite.

No abuse de este código. Google solo le permite almacenar datos de Maps en circunstancias específicas, y solo temporalmente (es decir, nunca más de 30 calendar days).

//Takes Google Maps API v3 directionsRequest and directionsResult objects as input. 
//Returns serialized directionsResult string. 
function serializeDirectionsResult (directionsRequest, directionsResult) { 
     var copyright = directionsResult.routes[0].copyrights; 
     var travelMode = directionsRequest.travelMode; 
     var startLat = directionsResult.routes[0].legs[0].start_location.lat(); 
     var startLng = directionsResult.routes[0].legs[0].start_location.lng(); 
     var endLat = directionsResult.routes[0].legs[0].end_location.lat(); 
     var endLng = directionsResult.routes[0].legs[0].end_location.lng(); 
     var steps = []; 
     for (var i = 0; i < directionsResult.routes[0].legs[0].steps.length; i++){ 
       var pathLatLngs = []; 
       for (var c = 0; c < directionsResult.routes[0].legs[0].steps[i].path.length; c++){ 
         var lat = directionsResult.routes[0].legs[0].steps[i].path[c].lat(); 
         var lng = directionsResult.routes[0].legs[0].steps[i].path[c].lng(); 
         pathLatLngs.push({ "lat":lat , "lng":lng } ); 
       } 
       steps.push(pathLatLngs); 
     } 
     var serialSteps = JSON.stringify(steps); 
     //Return custom serialized directions result object. 
     return copyright + "`" + travelMode + "`" + startLat + "`" + startLng + "`" + endLat + "`" + endLng + "`" + serialSteps; 
} 

//Takes serialized directionResult object string as input. 
//Returns directionResult object. 
function deserializeDirectionsResult (serializedResult) { 
     var serialArray = serializedResult.split("`"); 
     const travMode = serialArray[1]; 
     var directionsRequest = { 
      travelMode: travMode, 
      origin: new google.maps.LatLng(serialArray[2], serialArray[3]), 
      destination: new google.maps.LatLng(serialArray[4], serialArray[5]), 
     }; 
     var directionsResult = {}; 
     directionsResult.request = directionsRequest; 
     directionsResult.routes = []; 
     directionsResult.routes[0] = {}; 
     directionsResult.routes[0].copyrights = serialArray[0]; 
     directionsResult.routes[0].legs = []; 
     directionsResult.routes[0].legs[0] = {}; 
     directionsResult.routes[0].legs[0].start_location = directionsRequest.origin; 
     directionsResult.routes[0].legs[0].end_location = directionsRequest.destination; 
     directionsResult.routes[0].legs[0].steps = []; 
     var deserializedSteps = JSON.parse(serialArray[6]); 
     for (var i = 0; i < deserializedSteps.length; i++){ 
       var dirStep = {}; 
       dirStep.path = []; 
       for (var c = 0; c < deserializedSteps[i].length; c++){ 
         var lat = deserializedSteps[i][c].lat; 
         var lng = deserializedSteps[i][c].lng; 
         var theLatLng = new google.maps.LatLng(lat, lng); 
         dirStep.path.push(theLatLng); 
       } 
       dirStep.travel_mode = travMode; 
       directionsResult.routes[0].legs[0].steps.push(dirStep); 
     } 
     return directionsResult; 
} 
Cuestiones relacionadas