Получение данных о маршрутах из Карт Google - PullRequest
8 голосов
/ 01 марта 2011

Я работаю над проектом и нахожусь в состоянии, когда я не могу идти дальше и мне нужна серьезная помощь. Позвольте мне дать вам немного фона.

Я работаю над сервисом, который позволит пользователям кататься на велосипедах один и тот же пункт назначения из нескольких начальных точек координирует свои поездки. У части рабочего процесса, которую мы разработали, пользователи строят карты, используя Сервис Google Maps; они вводят начальный пункт назначения, Google создает маршрут, который он считает, будет работать, и тогда пользователи смогут адаптировать его к перетаскивая точки, чтобы удовлетворить их конкретные потребности. У нас есть это интерфейс разработан и хорошо работает на:

http://ridestreaming.com/google_maps/

То, где я столкнулся с непроходимой стеной, - это как редактировать пользователя вывести из Google Maps и сохранить в базе данных на будущее ссылка. Кажется, у нас есть способ сделать это в нашем Javascript, в этом файле (строки 344-352):

http://ridestreaming.com/google_maps/workflow.js

<code>    var newString = JSON.stringify(directions);
    //set up area to place drop directionsResponse object string
    var directions_response_panel = document.getElementById("directions_response");
    //dump any contents in directions_response_panel
    directions_response_panel.innerHTML = "";
    //add JSON string to it 
    directions_response_panel.innerHTML = "<pre>" + newString + "
"; // запускаем ajax runAjax (направления);

Мы можем получить данные о маршруте в виде файла JSON, преобразовать их в строку и отправить это через AJAX в файл PHP, где мы намереваемся его обработать и сохранить в MySQL. Тем не менее, JSON возвращается из Google Maps появляется быть уродливым; PHP нервничает, когда пытается его расшифровать, и я запустил это через валидатор онлайн, который подтвердил его неправильность. это на данный момент, что мы полностью сбиты с толку и понятия не имеем, как двигаться вперед.

Есть ли шанс, что кто-нибудь сможет помочь с этим? Я собираюсь ударить головой о стену. Любой ответ с благодарностью. Спасибо за ваше время!

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Я делал подобные вещи и нашел это действительно трудным, однако после нескольких часов кропотливой работы мне удалось получить все путевые точки из маршрута, перетаскиваемого пользователем, и сохранить их в базе данных ..

Итак, у меня есть поле, которое содержит все путевые точки, разделенные ";".

Вы должны иметь это:

directionsDisplay = new google.maps.DirectionsRenderer({
    'map': map,
    'preserveViewport': true,
    'draggable': true
});

в вашей функции инициализации

это часть моего JS:

var currentDirections;
var directionsDisplay;
var waypoints = [];
    function saveWaypoints()
    {
        waypoints = [];
        var waypts_field = document.getElementById('waypoints').value.split(';');
        for(var bo = 0; bo < waypts_field.length; bo++)
        {
            if(waypts_field[bo] == ' ' || waypts_field[bo] == '')
            {
                waypts_field.splice(bo,1);
                bo -= 1;
                continue;
            }

            waypoints.push({ location: waypts_field[bo], stopover: false });
        }
    }


    function getWaypoints()
{
    currentDirections = directionsDisplay.getDirections();
    var route = currentDirections.routes[0];
    totalLegs = route.legs.length;
    for (var i = 0; i < route.legs.length; i++) {
        var routeSegment = i+1;
        if(route.legs[i].via_waypoint[0] === undefined) continue;

        document.getElementById('waypoints').value = '';
        var via_waypoint_count = route.legs[i].via_waypoint.length;
        queue = 0;
        for(var bi = 0; bi < via_waypoint_count; bi++)
        {
            var count = 0;

            var lat;
            var lng;

            for (key in route.legs[i].via_waypoint[bi]['location'])
            {
                if(count > 1) break;
                if(count == 0)
                {
                    lat = route.legs[i].via_waypoint[bi]['location'][key];
                    count++;
                    continue;
                }
                lng = route.legs[i].via_waypoint[bi]['location'][key];

                count++;
            }
            reverseGeoCode(new google.maps.LatLng(lat,lng));
        }
    }
}

        function reverseGeoCode(latlng)
    {
        queue += 60;
        setTimeout(function(){
        geocoder.geocode({ 'latLng': latlng }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[1]) {
              document.getElementById('waypoints').value += results[1].formatted_address + '; ';
            }
          } else {
            alert("Geocoder failed due to: " + status);
          }
        });
        }, queue * 10);
    }

Я быстро снял это с моего JS, поэтому, если это не имеет смысла, я опубликую все мои JS и объясню это по крупицам.

Спасибо

1 голос
/ 28 апреля 2011

Вместо этого вам нужно создать новый JSON в вашем JS, который не будет искажен, а затем передать его в PHP через AJAX, что решит проблему искаженного JSON

0 голосов
/ 26 июня 2011

Я столкнулся с той же проблемой, и я только что решил ее.

Хранение всего DirectionsResponse совершенно не нужно. DirectionsService.route возвращает маршрут на основе хэша, который ему передан. Так что хранения этого хэша должно быть достаточно для хранения маршрута.
К тому времени, это может стать другим маршрутом, только когда есть лучший / более быстрый путь.

Давайте посмотрим на хэш запроса:

request = {
  origin: "Hamburg"
  destination: "Berlin"
  waypoints: [{location: new google.maps.LatLng(53.88,11.51), stopover: false}],
  travelMode: google.maps.DirectionsTravelMode.DRIVING
}

Как уже упоминалось ранее Crag , возвращаемые данные похожи на JSON, а не на JSON. Поэтому, когда мы храним эти данные, нам нужно снова преобразовать строку JSON в JSON-подобный хэш. Путевые точки, которые будут храниться в базе данных с помощью JSON.stringify (), выглядят так:

waypoints:
  [location: {
      Ha: 53.88, 
      Ia: 11.51
    },
    stopover: false
  ]

всякий раз, когда вы хотите передать эти данные в DirectionsService.route, вы можете просто вызвать функцию, перед которой будет перезаписано каждое местоположение объектом LatLng:

parse_route_request = function(request) {
  var waypoint, i, len;
  request = JSON.parse(request);
  for (i = 0, len = request.waypoints.length; i < len; i++) {
    waypoint = request.waypoints[_i];
    if (waypoint.location.Ha) {
      waypoint.location = new google.maps.LatLng(waypoint.location.Ha, waypoint.location.Ia);
    }
  }
  return request;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...