从谷歌地图中获取拖拽的路线数据

Posted

技术标签:

【中文标题】从谷歌地图中获取拖拽的路线数据【英文标题】:Getting dragged route data out of Google Maps 【发布时间】:2011-07-06 19:37:30 【问题描述】:

我正在从事一个项目,目前我无法再进一步,需要一些认真的帮助。让我给你一些背景知识。

我正在开发一项服务,让用户骑自行车到 来自多个起点的同一目的地协调他们的游乐设施。 我们设计的部分工作流程让用户使用 谷歌地图服务;他们输入一个起始目的地,谷歌创建 它认为可行的路线,然后用户可以通过 拖动点以满足他们的特殊需求。我们有这个 界面开发并运行良好:

http://ridestreaming.com/google_maps/

我遇到的难题是如何让用户编辑 从谷歌地图中取出路线并保存在数据库中以备将来使用 参考。似乎我们有一种方法可以做到这一点 javascript,在这个文件中(第 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);

我们可以将路由数据作为 JSON 文件取出,将其字符串化,然后发送 它通过 AJAX 到一个 php 文件,我们打算在其中处理和存储它 在 mysql 中。但是,出现从 Google Maps 返回的 JSON 格式不正确; PHP 在尝试解码时吓坏了,我跑了 它通过一个在线验证器确认了它的错误。它是 在这一点上,我们完全困惑,不知道如何 继续前进。

有没有人可以提供帮助的机会?我正要把头撞在墙上。非常感谢任何回应。感谢您的宝贵时间!

【问题讨论】:

您的评论说“//重要!这是 Directions JSON 对象”,但用于 DirectionsResults 的 Google Maps API 声明“请注意,尽管此结果是“类似于 JSON”,但严格来说并不严格JSON,因为它间接包含 LatLng 对象。”这可能是您收到格式错误的 JSON 的原因吗? 完全有可能。我不知道 DirectionsResults 对象。有没有办法解析这个格式错误的 JSON? 你可以看看devshed.com/c/a/PHP/… 我只在javascript中使用过DirectionsResults,从未使用过JSON,所以除此之外我帮不上什么忙。 【参考方案1】:

我一直在做类似的事情,发现这真的很难,但是经过几个小时的努力,我设法从用户​​拖动路线中获取所有航点并将其保存到数据库中..

所以,我有一个字段,其中包含用“;”分隔的所有航点。

你必须有这个:

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 并一点一点解释它..

谢谢

【讨论】:

【参考方案2】:

你应该做的是在你的 JS 中创建一个没有格式错误的新 JSON,然后通过 AJAX 将它传递给 PHP,这将解决 JSON 格式错误的问题

【讨论】:

【参考方案3】:

我遇到了同样的问题,我刚刚解决了。

完全没有必要存储整个 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 的 Hash。 使用 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;
;

【讨论】:

以上是关于从谷歌地图中获取拖拽的路线数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌地图API获取拥堵信息

给定两个位置,如何从谷歌地图获取所有纬度和经度

在谷歌地图中做“沿途的兴趣点”

是否可以从 android2.2 应用程序中的谷歌地图获取建议的路线?

从谷歌地图的后端获取数据

使用 swift 3 从谷歌地图获取 JSON 数据