2010-12-29 13 views
11

Sto utilizzando l'API di GoogleMaps v3.0 e sto provando a salvare un DirectionsResult nel mio database e quindi a recuperarlo in seguito per utilizzarlo su una mappa. Il mio problema è che quando provo a reidratare l'oggetto salvato estraendo la sua rappresentazione JSON dal mio database, l'oggetto è semplicemente JSON stupido, non ha i metodi e le funzioni originali dei suoi oggetti costitutivi. Quindi, ho creato una routine di correzione che prende il testo dumbalt JSON e lo ricostruisce ricostruendo tutti gli oggetti LatLng e LatLngBound. Ma qualcosa manca ancora perché il mio oggetto fisso non funziona come l'originale, i due punti appaiono sulla mia mappa ma manca la linea viola tra loro.Can not Deserialize GoogleMaps DirectionsResult Object

Apprezzerebbero qualsiasi consiglio su una tecnica migliore per la serializzazione/idratazione o qualsiasi idea su quale potrebbe essere la mia routine di correzione mancante.

Grazie

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

Se qualcuno è interessato, ho anche postato query al forum mappe google così: https://groups.google.com/d/topic/google-maps-js-api-v3/Ai1bZIVgfzo /discussione – sisdog

risposta

5

Sembra dallo sguardo del codice non si accede al lat e lng correttamente. La libreria di API di google maps è ridotta. I nomi delle variabili sono spesso abbreviati in un insieme casuale di caratteri. Non dovresti avvicinarti a xey attraverso queste variabili ma attraverso i loro getter: es. lat() e lng() per evitare lo stesso problema con le versioni future. Si spera che questo sia il problema che causa il mancato rendering della tua direzione.

il metodo consigliato corretto per ottenere lng lat ed è simile al seguente:

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

Così, per esempio questa seguente riga dovrebbe essere:

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

A:

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()); 

L'archiviazione dei dati di Google Maps è a termine di servizio. Ecco la restrizione che si potrebbe desiderare di dare un'occhiata prima di andare avanti con l'archiviazione dei dati:

10.1.3 Restrictions against Data Export or Copying. 

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

Works, o visualizzazione del contenuto. È vietato copiare, tradurre, modificare o creare opere derivate (compresi creare o contribuire a un database ), o visualizzare pubblicamente qualsiasi Contenuti o parte di esso ad eccezione di quanto esplicitamente consentito in queste Termini. Ad esempio, i seguenti sono vietati: (i) creazione di modifiche lato server delle tessere mappa; (ii) cucitura di più immagini di mappe statiche insieme per visualizzare una mappa che è più grande di quanto consentito nella documentazione delle API di Maps ; (iii) creazione di mailing list o elenchi di telemarketing basati su contenuto; o (iv) esportazione, scrittura o salvataggio del contenuto su una piattaforma basata sulla posizione di di terze parti o servizio.

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

pre-fetch, la cache, o memorizzare Contenuti, se non che è possibile memorizzare: (i) una quantità limitata di contenuti per la scopo di migliorare le prestazioni di Maps API se farlo in modo temporaneo, sicuro e in un modo che non consente l'uso del Contenuto al di fuori del Servizio; e (ii) qualsiasi identificatore di contenuto o chiave che la documentazione API di Maps consente specificamente di memorizzare. Ad esempio, non si deve utilizzare il Contenuto per creare un database indipendente “luoghi”.

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

Servizio in modo che voi o dà alcun altro l'accesso ai mass download o feed collettivi di qualsiasi contenuto, incluso ma non limitato a latitudine numerico o longitudine coordinate, immagini, mappa visibile dati o dati di luoghi (tra cui elenchi di attività commerciali). Ad esempio, è possibile che non offra un servizio di geocodifica batch che utilizza Contenuto contenuto nelle API di Maps.

1

Non ho potuto ottenere il codice di cui sopra per funzionare così ho scritto il mio. Le seguenti due funzioni serializzeranno e deserializzeranno un oggetto DirectionsResult. Tuttavia, serializzerà solo la quantità minima di dati necessaria per tracciare una rotta. Se si rileva che il metodo DirectionsResult restituito deserializzato è privo delle funzionalità necessarie, è necessario modificare il codice per aggiungere qualsiasi ulteriore DirectionsResult object attributes necessario.

Si prega di non abusare questo codice. Google ti consente di archiviare i dati di Maps solo in circostanze specifiche e solo temporaneamente (ad esempio, non più lunghi di 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; 
} 
Problemi correlati