2010-12-29 28 views
11

Tôi đang sử dụng API GoogleMaps v3.0 và cố gắng lưu DirectionsResult vào cơ sở dữ liệu của mình rồi truy xuất lại sau để sử dụng trên bản đồ. Vấn đề của tôi là khi tôi cố gắng hydrat hóa đối tượng đã lưu bằng cách kéo biểu diễn JSON của nó từ cơ sở dữ liệu của tôi, đối tượng chỉ là JSON ngu ngốc, nó không có các phương thức và chức năng ban đầu của các đối tượng cấu thành của nó. Vì vậy, tôi đã xây dựng một thói quen sửa lỗi lấy văn bản dumbalt JSON và xây dựng lại nó bằng cách xây dựng lại tất cả các đối tượng LatLng và LatLngBound. Nhưng, một cái gì đó vẫn còn thiếu bởi vì đối tượng cố định của tôi không hoạt động như bản gốc, hai điểm hiển thị trên bản đồ của tôi nhưng đường màu tím giữa chúng bị thiếu.Không thể Deserialize GoogleMaps DirectionsResult Object

Sẽ đánh giá cao bất kỳ lời khuyên nào về kỹ thuật tuần tự hóa/hydrat hóa tốt hơn hoặc bất kỳ ý tưởng nào về việc thường xuyên sửa lỗi của tôi.

Cảm ơn

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

Nếu có ai quan tâm, tôi cũng đã đăng truy vấn này lên diễn đàn bản đồ google: https://groups.google.com/d/topic/google-maps-js-api-v3/Ai1bZIVgfzo /thảo luận – sisdog

Trả lời

5

Có vẻ như từ cái nhìn của mã của bạn, bạn không được truy cập vào lat và lng đúng cách. Thư viện api bản đồ google được rút gọn. Các tên biến thường được rút ngắn thành một nhóm ký tự ngẫu nhiên. Bạn không nên tiếp cận x và y thông qua các biến này nhưng thông qua getters của chúng: tức là. lat()lng() để tránh sự cố tương tự với các phiên bản trong tương lai. Hy vọng rằng, đây là vấn đề gây ra hướng đi của bạn để không hiển thị.

Các khuyến cáo cách thích hợp để có được lng lat và là tương tự như sau:

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

Vì vậy, ví dụ dòng sau này sẽ là:

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

Việc lưu trữ Dữ liệu Bản đồ của Google trong thời hạn dịch vụ. Dưới đây là những hạn chế mà bạn có thể muốn xem xét trước khi bạn đi xa hơn với việc lưu trữ dữ liệu của bạn:

10.1.3 Restrictions against Data Export or Copying. 

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

trình, hoặc hiển thị các nội dung. Bạn không phải sao chép, dịch, sửa đổi, hoặc tạo ra một tác phẩm phái sinh (bao gồm tạo hoặc đóng góp vào một cơ sở dữ liệu ), hoặc công khai hiển thị bất kỳ Nội dung hoặc bất kỳ phần nào trừ khi một cách rõ ràng cho phép theo những Điều khoản này. Ví dụ: các trường hợp sau đây bị cấm : (i) tạo một mặt cắt phía máy chủ phía máy chủ; (ii) ghép nhiều hình ảnh bản đồ tĩnh với nhau để hiển thị bản đồ là lớn hơn mức được phép trong API Maps Tài liệu; (iii) tạo danh sách gửi thư hoặc danh sách tiếp thị qua điện thoại dựa trên Nội dung; hoặc (iv) xuất, viết hoặc lưu Nội dung vào nền tảng dựa trên vị trí của bên thứ ba hoặc dịch vụ.

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

tìm nạp trước, bộ nhớ cache, hoặc lưu trữ bất kỳ nội dung, ngoại trừ việc bạn có thể lưu trữ: (i) một lượng hạn chế về nội dung cho mục đích cải thiện hiệu suất của API của bạn thực hiện Maps nếu bạn tạm thời, an toàn và theo cách không cho phép sử dụng nội dung bên ngoài Dịch vụ; và (ii) bất kỳ số nhận dạng nội dung hoặc khóa nào mà Tài liệu API Maps đặc biệt cho phép bạn lưu trữ. Đối với dụ, bạn không phải sử dụng các nội dung để tạo ra một cơ sở dữ liệu độc lập của “nơi”.

Dịch vụ
(c) No Mass Downloads or Bulk Feeds of Content. You must not use the 

một cách cung cấp cho bạn hoặc bất kỳ truy cập người khác để tin đại chúng tải hoặc thức ăn lớn mọi nội dung Nội dung, bao gồm nhưng không giới hạn ở vĩ độ hoặc kinh độ số tọa độ, hình ảnh, bản đồ hiển thị dữ liệu hoặc dữ liệu địa điểm (bao gồm danh sách doanh nghiệp). Ví dụ: bạn không được phép cung cấp dịch vụ mã hóa địa lý lô hàng sử dụng Nội dung được chứa trong (các) API Maps.

1

Tôi không thể lấy mã ở trên để hoạt động nên tôi đã tự viết. Hai hàm sau sẽ tuần tự hóa và deserialize một đối tượng DirectionsResult. Tuy nhiên, nó sẽ chỉ tuần tự hóa số lượng dữ liệu tối thiểu cần thiết để vẽ đường. Nếu bạn thấy rằng DirectionsResult được trả về không có các tính năng bạn cần, bạn phải sửa đổi mã để thêm bất kỳ bổ sung DirectionsResult object attributes nào bạn cần.

Vui lòng không lạm dụng mã này. Google chỉ cho phép bạn lưu trữ dữ liệu Maps trong các trường hợp cụ thể và chỉ tạm thời (tức là không bao giờ dài hơn 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; 
} 
Các vấn đề liên quan