Невозможно десериализовать объект GoogleMaps DirectionsResult - PullRequest
11 голосов
/ 29 декабря 2010

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

Спасибо

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

Ответы [ 3 ]

5 голосов
/ 21 апреля 2011

Судя по вашему коду, вы не обращаетесь к lat и lng должным образом.Библиотека API карт Google сведена к минимуму.Имена переменных часто сокращаются до случайного набора символов.Вы не должны приближаться к x и y через эти переменные, а через их получатели: т.е.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);

Кому:

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

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

1 голос
/ 24 июня 2015

Я не смог заставить работать приведенный выше код, поэтому я написал свой собственный. Следующие две функции будут сериализовать и десериализовать объект 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;
}
0 голосов
/ 26 ноября 2018

Для тех, кто все еще хочет решить эту проблему, вам просто нужно преобразовать свойства Lat / Lng в google.maps.LatLng объекты.

function deserializeDirectionsResult(directions) {
    directions.routes.forEach(function (route) {
        route.legs.forEach(function (leg) {
            leg.end_location = new google.maps.LatLng(leg.end_location.lat, leg.end_location.lng)
            leg.start_location = new google.maps.LatLng(leg.start_location.lat, leg.start_location.lng)

            leg.steps.forEach(function (step) {
                step.end_location = new google.maps.LatLng(step.end_location.lat, step.end_location.lng);
                step.end_point = new google.maps.LatLng(step.end_point.lat, step.end_point.lng);
                step.start_location = new google.maps.LatLng(step.start_location.lat, step.start_location.lng);
                step.start_point = new google.maps.LatLng(step.start_point.lat, step.start_point.lng);

                step.lat_lngs.forEach(function (lat_lng) {
                    lat_lng = new google.maps.LatLng(lat_lng.lat, lat_lng.lng);
                });

                // Optional property
                if (step.hasOwnProperty('steps')) { 
                    step.steps.forEach(function (stepStep) {
                        stepStep.end_location = new google.maps.LatLng(stepStep.end_location.lat, stepStep.end_location.lng);
                        stepStep.start_location = new google.maps.LatLng(stepStep.start_location.lat, stepStep.start_location.lng);

                        stepStep.lat_lngs.forEach(function (lat_lng) {
                            lat_lng = new google.maps.LatLng(lat_lng.lat, lat_lng.lng);
                        });

                        stepStep.path.forEach(function (path_item) {
                            path_item = new google.maps.LatLng(stepStep.path.lat, stepStep.path.lng);
                        });
                    });
                }
            });
        });
    });

    return directions;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...