2010-12-29 13 views
11

मैं GoogleMaps API v3.0 का उपयोग कर रहा हूं और मेरे डेटाबेस में दिशा-निर्देश सहेजने की कोशिश कर रहा हूं और फिर इसे मानचित्र पर उपयोग करने के लिए पुनः प्राप्त कर रहा हूं। मेरी समस्या यह है कि जब मैं अपने डेटाबेस से अपने JSON प्रस्तुति को खींचकर सहेजे गए ऑब्जेक्ट को फिर से हाइड्रेट करने का प्रयास करता हूं, तो ऑब्जेक्ट सिर्फ जेएसओएन गूंगा है, इसकी मूल विधियों और उसके घटक ऑब्जेक्ट्स के फ़ंक्शन नहीं हैं। इसलिए, मैंने एक फिक्स रूटीन बनाया जो डंबल्ट टेक्स्ट जेएसओएन लेता है और सभी LatLng और LatLngBound ऑब्जेक्ट्स को पुनर्निर्माण करके इसे पुनर्निर्माण करता है। लेकिन, कुछ अभी भी गायब है क्योंकि मेरी निश्चित वस्तु मूल की तरह काम नहीं करती है, मेरे नक्शे पर दो बिंदु दिखाई देते हैं लेकिन उनके बीच बैंगनी रेखा गायब है।GoogleMaps दिशाओं को Deserialize नहीं कर सकते हैं ऑब्जेक्ट

सीरियलाइजेशन/हाइड्रेशन या किसी भी विचार के लिए किसी भी सलाह के बारे में किसी भी सलाह की सराहना करेंगे कि मेरी फिक्स रूटीन क्या हो सकती है।

धन्यवाद

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

अगर कोई रुचि है, मैं भी गूगल मैप्स मंच को यह प्रश्न के रूप में अच्छी तरह से पोस्ट किया है: https://groups.google.com/d/topic/google-maps-js-api-v3/Ai1bZIVgfzo/चर्चा – sisdog

उत्तर

5

यह अपने कोड की नज़र आप ठीक ढंग से अक्षां और एलएनजी तक पहुँचने नहीं कर रहे हैं से लगता है। गूगल मानचित्र एपीआई लाइब्रेरी को छोटा किया गया है। चर नामों को अक्सर वर्णों के एक यादृच्छिक सेट के लिए छोटा कर दिया जाता है। आपको इन चर के माध्यम से एक्स और वाई तक नहीं पहुंचना चाहिए, बल्कि उनके गेटर्स के माध्यम से: यानी। भविष्य के संस्करणों के साथ एक ही मुद्दे से बचने के लिए lat() और lng()। उम्मीद है कि यह वह मुद्दा है जो आपकी दिशा को प्रस्तुत नहीं कर रहा है। उदाहरण के लिए,

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

तो यह निम्न पंक्ति होना चाहिए::

उचित सिफारिश की जिस तरह से अक्षां और एलएनजी प्राप्त करने के लिए निम्नलिखित के समान है

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

करने के लिए:

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

Google मानचित्र डेटा का संग्रहण सेवा की अवधि के भीतर है।

10.1.3 Restrictions against Data Export or Copying. 

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

काम करता है, या सामग्री का प्रदर्शन: यहाँ प्रतिबंध यह है कि आप एक बार देख लेने के लिए इससे पहले कि आप अपने डेटा भंडारण के साथ आगे जाना चाहते हो सकता है है। आप , कॉपी चाहिए नहीं अनुवाद, संशोधन, या व्युत्पन्न कार्य की (बनाने या एक डेटाबेस के लिए योगदान दे शामिल हैं), या सार्वजनिक रूप से सिवाय के रूप में स्पष्ट रूप से इन शर्तों के तहत अनुमत उसके किसी सामग्री या उसके किसी भाग प्रदर्शित करते हैं। उदाहरण के लिए, निम्नलिखित निषिद्ध हैं: (i) सर्वर-साइड मानचित्र टाइल के संशोधन को बनाना; (ii) मैप्स एपीआई दस्तावेज़ीकरण में अनुमत की तुलना में एक मानचित्र प्रदर्शित करने के लिए एक साथ कई स्थिर नक्शा छवियों को सिलाई करना (iii) सामग्री के आधार पर मेलिंग सूचियां या टेलीमार्केटिंग सूचियां बनाना; या (iv) निर्यात, लेखन, या सामग्री को तृतीय पक्ष के स्थान-आधारित प्लेटफ़ॉर्म या सेवा में सहेजना।

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

पहले लाएं, कैश, या किसी सामग्री, स्टोर सिवाय इसके कि आप संग्रहीत कर सकते हैं: सामग्री की सीमित मात्रा में अपने मैप्स एपीआई कार्यान्वयन के प्रदर्शन में सुधार लाने के प्रयोजन के लिए (i) आप अगर अस्थायी रूप से, सुरक्षित रूप से, और तरीके से ऐसा करें जो सेवा के बाहर सामग्री का उपयोग करने की अनुमति नहीं देता है; और (ii) कोई सामग्री पहचानकर्ता या कुंजी कि मैप्स एपीआई दस्तावेज़ीकरण विशेष रूप से आपको स्टोर करने की अनुमति देता है। उदाहरण के लिए, यदि आप सामग्री के एक स्वतंत्र डेटाबेस बनाने के लिए

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

सेवा एक तरह से है कि आप या बड़े पैमाने पर करने के लिए किसी अन्य व्यक्ति का उपयोग डाउनलोड या की बल्क फ़ीड देता है में उपयोग नहीं करना चाहिए "स्थानों।" सामग्री, जिसमें संख्यात्मक अक्षांश या देशांतर निर्देशांक, इमेजरी, दृश्यमान मानचित्र डेटा, या डेटा डेटा ( व्यापार लिस्टिंग सहित) तक सीमित नहीं है। उदाहरण के लिए, आप को बैच भौगोलिक सेवा प्रदान करने की अनुमति नहीं है जो मैप्स एपीआई में निहित सामग्री का उपयोग करती है।

1

मुझे उपरोक्त कोड काम करने के लिए नहीं मिला, इसलिए मैंने अपना खुद लिखा। निम्नलिखित दो कार्य एक दिशा-निर्देश वस्तु को क्रमबद्ध और deserialize करेंगे। हालांकि, यह केवल रूट प्लॉट करने के लिए आवश्यक न्यूनतम मात्रा में डेटा क्रमबद्ध करेगा। यदि आपको लगता है कि लौटाई गई deserialized DirectionsResult में आपकी आवश्यक सुविधाओं की कमी है, तो आपको जो भी अतिरिक्त DirectionsResult object attributes चाहिए, उसे जोड़ने के लिए आपको कोड को संशोधित करना होगा।

कृपया इस कोड का दुरुपयोग न करें। Google केवल आपको विशिष्ट परिस्थितियों में मानचित्र डेटा स्टोर करने की अनुमति देता है, और केवल अस्थायी रूप से (यानी 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; 
} 
संबंधित मुद्दे