无法反序列化GoogleMaps DirectionsResult对象

sis*_*dog 11 javascript serialization json google-maps

我正在使用GoogleMaps API v3.0并尝试将DirectionsResult保存到我的数据库,然后稍后检索它以在地图上使用.我的问题是,当我尝试通过从我的数据库中提取其JSON表示来重新保存已保存的对象时,该对象只是简单的JSON,它没有其组成对象的原始方法和功能.因此,我构建了一个修复例程,它接受dumbalt文本JSON并通过重建所有LatLng和LatLngBound对象来重建它.但是,仍然缺少某些东西,因为我的固定物体不像原来那样工作,这两个点出现在我的地图上,但它们之间的紫色线条缺失.

对于更好的序列化/保湿技术或任何关于我的修复程序可能缺失的想法,我们将不胜感激.

谢谢

替代文字 替代文字

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);
  }
 }
} 
Run Code Online (Sandbox Code Playgroud)

KJY*_*葉家仁 5

从代码的外观来看,您似乎没有正确访问lat和lng.谷歌地图api库缩小了.变量名通常缩写为随机字符集.你不应该通过这些变量接近x和y,而是通过它们的吸气剂:即.lat()lng()避免将来的版本出现同样的问题.希望这是导致你的方向无法渲染的问题.

获取lat和lng的正确推荐方法类似于以下内容:

results[0].geometry.location.lat().toFixed(3);
results[0].geometry.location.lng().toFixed(3);
Run Code Online (Sandbox Code Playgroud)

所以,例如以下这一行应该是:

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);
Run Code Online (Sandbox Code Playgroud)

至:

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());
Run Code Online (Sandbox Code Playgroud)

Google地图数据的存储在服务期限内.在进一步使用数据存储之前,您可能需要查看以下限制:

 10.1.3 Restrictions against Data Export or Copying.

    (a) No Unauthorized Copying, Modification, Creation of Derivative
Run Code Online (Sandbox Code Playgroud)

工作或显示内容.除非这些条款明确允许,否则您不得复制,翻译,修改或创建衍生作品(包括创建或贡献数据库),或公开展示任何内容或其任何部分.例如,禁止以下内容:(i)创建地图图块的服务器端修改; (ii)将多个静态地图图像拼接在一起,以显示大于Maps API文档中允许的地图; (iii)根据内容创建邮件列表或电话营销列表; 或(iv)将内容出口,书写或保存到第三方的基于位置的平台或服务.

    (b) No Pre-Fetching, Caching, or Storage of Content. You must not
Run Code Online (Sandbox Code Playgroud)

预取,缓存或存储任何内容,但您可以存储以下内容:(i)有限数量的内容,以便提高Maps API实施的性能,如果您临时,安全地以及以某种方式执行此操作不允许在服务范围之外使用内容; (ii)Maps API文档特别允许您存储的任何内容标识符或密钥.例如,您不得使用内容来创建"地点"的独立数据库.

    (c) No Mass Downloads or Bulk Feeds of Content. You must not use the
Run Code Online (Sandbox Code Playgroud)

服务的方式使您或任何其他人可以访问任何内容的大量下载或批量订阅,包括但不限于数字纬度或经度坐标,图像,可见地图数据或地点数据(包括商家列表).例如,您不得提供使用Maps API中包含的内容的批量地理编码服务.