0

我有一个将地址作为用户输入的应用程序。对于给定的输入,我在 < 2 KMS 距离内找到了地址列表(保存在数据库中)。我有数据库中地址的经纬度信息。每个地址都有一个起点和终点。这些起点和终点的经纬度也在数据库中。

现在我需要在谷歌地图中的这些起点和终点之间画线。我使用 Javascript 来做到这一点。对于任何给定的地址,我至少要画 50 条线。由于 OVER_QUERY_LIMIT,我想将此响应作为字符串保存在数据库中,然后将其转换回对象并显示在谷歌地图中。

请注意,我总是只有一个已知地址的列表。这些地址使用 From&To lat&long 保存在数据库中。所以我也可以编写一个 cronjob 来检索给定 fromlat&long & to-lat&long 的响应,就像这样。

var directionsDisplay<?php print $i; ?> = new google.maps.DirectionsRenderer(rendererOptions);  
directionsDisplay<?php print $i; ?>.setMap(map); 
var start<?php print $i; ?> = '<?php echo $address1; ?>'; 
var end<?php print $i; ?> = '<?php echo $address2; ?>'; 
var request<?php print $i; ?> = { 
    origin:start<?php print $i; ?>,  
    destination:end<?php print $i; ?>, 

    travelMode: google.maps.DirectionsTravelMode.DRIVING 

}; 

<?php if(isempty($routestr)) { ?> 
directionsService.route(request<?php print $i; ?>, function(response, status) { 
    if (status == google.maps.DirectionsStatus.OK) { 
        var routestr = JSON.stringify(response, null, 4); 
        //Saving routestr in database using ajax call
        directionsDisplay<?php print $i; ?>.setDirections(response);
    }
}
<?php } //end of $routestr check 
else { //convert $routestr into response and assign to setDirections method
  ?>
  //PHP $routestr is a JSON object automatically. so eval function will not work.
  //var response1 = eval('(' + <?php print $routestr; ?> + ')');

  var response1 = <?php echo $routestr; ?>; //This works.
  alert(response1.status); //displays OK. So I am assured that this is a JSON object now.
   directionsDisplay<?php print $i; ?>.setDirections(response1); //This still does not work. Map is blank

<?php    }//end of $routestr else check ?>

我在其他部分面临问题。eval 方法不能正确转换对象。因此,当我调用 setDirections(response1) 时不起作用。

有人可以帮忙吗?我想将我的 JSON 字符串转换回 DirectionsResult 对象

我还检查了https://developers.google.com/maps/documentation/javascript/reference#DirectionsResult。这里有一行“请注意,虽然这个结果是“类 JSON”,但它不是严格的 JSON,因为它间接包含 LatLng 对象。

我在 html 文件中测试了这段代码

var res = new google.maps.DirectionsResult(); //I receive js error This is not a class and cannot be instantiated. Don't understand how they send back this as response in route method call.
res1.status = "OK"; //Becoz of above issue, this will not work
alert(res1.status); //Becoz of above issue, this will not work

但是这个警告信息永远不会被执行。什么都没有显示。不知道为什么。

伙计们不要尝试这个。这是行不通的。

目前,我已经更改了我的代码并实现了超时。我在某处读到,我们每秒最多可以向方向服务发出 5 个请求。如果我们在一秒钟内超过 5 个请求,将返回 OVER_QUERY_LIMIT。

实施超时减慢了最终响应。但似乎没有别的办法。不确定将此服务作为业务 api 是否可以解决问题。

4

1 回答 1

0

我也有这个问题。但在我的情况下,我需要将那条路线画回来并允许用户拖动路线(与我们发出路线请求时存在的相同属性)并更新 BD 中的 lat lng。如果您只需要在已有的这两个点之间画线,您可以请求一条新路线。如果您有 Over_query_limit 问题,您可以保存 response.routes[0].overview_path 中的 LatLng,并使用将 LatLng 解析为 Path 的简单折线将其绘制回来。当然,这不会完全是一个新的路由请求。

于 2012-06-27T16:19:07.010 回答