Невозможно десериализовать GoogleMaps DirectionsResult Object

Я использую API GoogleMaps v3.0 и пытаюсь сохранить DirectionsResult в моей базе данных, а затем получить его позже, чтобы использовать его на карте. Моя проблема в том, что когда я пытаюсь повторно убрать сохраненный объект, вытаскивая его представление JSON из моей базы данных, объект просто тупой JSON, у него нет оригинальных методов и функций его составных объектов. Итак, я построил процедуру исправления, которая принимает текст Dumbalt JSON и восстанавливает его, восстанавливая все объекты LatLng и LatLngBound. Но что-то по-прежнему отсутствует, потому что мой фиксированный объект не работает, как оригинал, две точки отображаются на моей карте, но фиолетовая линия между ними отсутствует.

Порадовал бы любой совет по лучшей методике сериализации/гидратации или любых идей относительно того, что моя программа исправления может отсутствовать.

Спасибо

alt textalt 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);
  }
 }
} 

Ответ 1

По внешнему виду вашего кода вы не получаете доступ к лат и lng правильно. Минимизирована библиотека api-карт google. Имена переменных часто сокращаются до произвольного набора символов. Вы не должны приближаться к x и y через эти переменные, но через их getters: ie. lat() и lng(), чтобы избежать такой же проблемы с будущими версиями. Надеюсь, это проблема, из-за которой ваше направление не отображается.

Правильный рекомендуемый способ получения 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);

To:

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) сшивание нескольких статических изображений карты вместе, чтобы отобразить карту, которая больше, чем разрешено в API Карт Документация; (iii) создание почтовой рассылки списков или списков телемаркетинга на основе Контент; или (iv) экспорт, написании или сохранении Контента платформа, основанная на третьей части или службы.

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

предварительная выборка, кеш или сохранение любых Контент, за исключением того, что вы можете хранить: (i) ограниченное количество Контента для цель повышения эффективности вашей реализации API Карт, если вы сделать это временно, надежно и в способ, который не позволяет использовать Содержание вне Сервиса; а также (ii) любой идентификатор или ключ контента что Документация API Карт специально разрешает вам хранить. Для Например, вы не должны использовать Контент создать независимую базу данных "Место".

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

Служба в порядке, который дает вам или любой другой доступ к массе загрузок или навальных каналов любого Содержание, включая, но не ограничиваясь, численная широта или долгота координаты, изображения, видимая карта данных или мест (включая списки компаний). Например, вы не разрешено предлагать партию служба геокодирования, использующая Content содержащиеся в API (-ов) Карт.

Ответ 2

Я не мог заставить этот код работать, поэтому я написал свой собственный. Следующие две функции сериализуют и десериализуют объект DirectionsResult. Однако он будет сериализовать минимальный объем данных, необходимых для построения маршрута. Если вы обнаружите, что в возвращаемом десериализованном DirectionsResult отсутствуют необходимые функции, вы должны изменить код, чтобы добавить дополнительные атрибуты объектов DirectionsResult, которые вам нужны.

Пожалуйста, не злоупотребляйте этим кодом. Google позволяет хранить данные Карты только в определенных обстоятельствах и только временно (т.е. Никогда больше 30 календарных дней).

//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;
}