我有一个将地址作为用户输入的应用程序。对于给定的输入,我在 < 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 是否可以解决问题。