2011-03-01 11 views
8

Estoy trabajando en un proyecto y estoy en un punto en el que no puedo ir más allá y necesito ayuda. Déjame darte algunos antecedentes.Obtener datos de ruta arrastrados fuera de Google Maps

Estoy trabajando en un servicio que permitirá a los usuarios andar en bicicleta al mismo destino desde múltiples puntos de partida coordinar sus paseos. Parte del flujo de trabajo que hemos diseñado tiene usuarios que crean mapas utilizando el servicio Google Maps; ingresan a un destino inicial, Google crea una ruta que cree que funcionará, y luego los usuarios pueden adaptar esa ruta por puntos de arrastre para satisfacer sus necesidades particulares. Hemos desarrollado esta interfaz y trabajando muy bien en:

http://ridestreaming.com/google_maps/

Dónde he golpeado un muro infranqueable es en la forma de obtener la ruta editados por el usuario de Google Maps y se guardan en la base de datos para futuras referencia. Parece que tenemos un método para hacer que en nuestro Javascript, en este archivo (líneas 344-352):

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

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 + "</pre>"; 
    //run the ajax 
    runAjax(directions); 

Podemos obtener los datos de la ruta como un archivo JSON, stringify y envíe a través de AJAX a un archivo PHP donde tenemos la intención de procesarlo y almacenarlo en MySQL. Sin embargo, el JSON devuelto de Google Maps aparece como incorrecto; PHP se asusta cuando intenta descifrarlo, y lo ejecuté a través de un validador en línea que confirmó su malformidad. Es en este punto que estamos completamente desconcertados y no tenemos idea de cómo avanzar .

¿Hay alguna posibilidad de que alguien pueda ayudar con esto? Estoy a punto de golpear mi cabeza contra la pared. Cualquier respuesta en absoluto es muy apreciada. ¡Gracias por tu tiempo!

+1

Su comentario dice "! // IMPORTANTE este es el objeto JSON llegar", pero la API de Google Maps para DirectionsResults afirma que "Tenga en cuenta que aunque este resultado es" apariencia JSON , "no es estrictamente JSON, ya que indirectamente incluye objetos LatLng". ¿Podría ser esta la razón por la que estás obteniendo JSON malformado? – Crag

+0

Es completamente posible. No sabía esto sobre el objeto DirectionsResults. ¿Hay alguna manera de analizar este JSON malformado? – mcleodm3

+0

Puede consultar http://www.devshed.com/c/a/PHP/Parsing-Google-Maps-API-using-PHP-and-JSON-2348127/ Solo he trabajado con DirectionsResults en javascript y nunca usé JSON, así que más allá de eso no sirvo de mucho. – Crag

Respuesta

2

que he estado haciendo algo similar y encontré esto realmente por muy difícil después de varias horas de duro trabajo, he conseguido todos los waypoints de ruta Arrastrado por el usuario y lo guarda en la base de datos ..

lo tanto, tengo una campo que mantiene todos los puntos de referencia separados por ";".

Hay que tener presente:

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

en su función de inicialización

esto es parte de mis 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); 
    } 

me sacó rápidamente esto de mi JS, por lo que si no tiene sentido, publicaré todos mis JS y lo explicaré poco a poco ...

Gracias

1

Lo que debe hacer en su lugar es crear una nueva JSON en que JS que no está mal formado y luego pasar esto a PHP a través de AJAX, que va a resolver el problema de JSON malformación

0

me encontré con el mismo problema y yo lo acabo de resolver.

Almacenar todo DirectionsResponse es totalmente innecesario. DirectionsService.route devuelve una ruta en función de un Hash que se le pasa. Así que almacenar esa Hash debería ser suficiente para almacenar la ruta.
Por el momento, esto podría ser solo una ruta diferente cuando haya disponible una forma mejor/más rápida.

Vamos a echar un vistazo a la solicitud de hash:

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

Como ya se ha mencionado por Crag, los datos que se devuelve es JSON-like y no JSON. Entonces, cuando almacenamos estos datos, necesitamos convertir la cadena JSON en una Hash similar a JSON nuevamente. Los puntos de ruta que van a ser almacenados en la base de datos mediante el uso de JSON.stringify() se ve así:

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

cada vez que desee pasar esos datos a DirectionsService.route puede simplemente llamar a una función ante el cual se sobrescribir cada lugar con un objeto 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; 
}; 
Cuestiones relacionadas