我需要使用google maps api directions服务检索目的地的坐标。我已经有了起点坐标,但是我没有指定坐标中的终点,而是希望通过指定距离(以km为单位)来检索坐标。
所以我想我的问题如下:是否可以通过指定服务方向的距离(以km为单位)来检索目的地latlong坐标(基于/计算道路的距离而不是方向/直线)也许还有其他办法吗?
我有一个图片插图,但不幸的是我无法附加到这个问题,因为我没有足够的声誉。如果我的问题不清楚,或者您希望看到插图,那么请联系我,我会把它发送出去。
答案 0 :(得分:1)
我认为你不能这样做,因为request parameters说需要原点和目的地参数。
答案 1 :(得分:-2)
我相信你是对的。 api中似乎没有任何当前的方法可以让您执行以下操作。
相反,我循环通过Directions service调用返回的坐标,并使用函数计算坐标之间的距离。然而,即使这样也不够准确,因为返回的坐标似乎也是聚合的,并且在计算每个坐标之间的距离时不会返回准确的值/距离,因为它们是聚合的,因此沿着道路不需要每个坐标。
为了解决上述问题,我最终添加了一个点击事件,并自己绘制了道路上的坐标,然后将它们存储在我使用xmlhttprequest缓存和调用的本地json文件中。
幸运的是,对于我的情况,我只需要计算A点和A点之间的距离。 B在一条单独的道路上,因此当您使用多个或通用道路/位置时,我的替代方案将不起作用。您可以使用所描述的第一种方法,因为您很乐意使用汇总数据和不准确的计算。
以下是用于计算坐标之间距离的函数,然后是用于求出点和点的最终计算。最后两点之间的坐标。请注意,此代码依赖于并使用jQuery方法。
<强> 1。计算两个坐标之间的距离(以米为单位)
function pointDistance( begin, end )
{
var begin = { lat: begin[0], long: begin[1] },
end = { lat: end[0], long: end[1] };
// General calculations
var earthRadius = 6371, //km
distanceLat = (end.lat - begin.lat).toRad(),
distanceLong = (end.long - begin.long).toRad();
// Convert lats to radiants
begin.lat = begin.lat.toRad();
end.lat = end.lat.toRad();
// Calculation
var a = Math.sin(distanceLat / 2) * Math.sin(distanceLat / 2) +
Math.sin(distanceLong / 2) * Math.sin(distanceLong / 2) * Math.cos(begin.lat) * Math.cos(end.lat);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var distance = (earthRadius * c) - 0.000536;
return (distance * 1000);
}
<强> 2。获取最终A-B坐标的坐标(基于剩余百分比)。 'matrix'变量是json坐标数组。
function getCoordinates( totalDistance )
{
var lastPoint = { lat: null, long: null },
total = parseFloat(0),
position = { start: null, end: null, distance: 0 };
$(matrix).each(function()
{
if ( lastPoint.lat == null )
{
lastPoint = { lat: this[0], long: this[1] };
return;
}
var distance = pointDistance([lastPoint.lat, lastPoint.long], [this[0], this[1]]);
total = total + distance;
if ( (total / 1000) >= totalDistance )
{
position.start = new google.maps.LatLng(lastPoint.lat, lastPoint.long);
position.end = new google.maps.LatLng(this[0], this[1]);
position.distance = total;
return false;
}
lastPoint = { lat: this[0], long: this[1] };
});
return position;
}
第3。将数字度转换为弧度
if ( typeof(Number.prototype.toRad) === 'undefined' ) {
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
}
希望以下内容可以帮助任何具有相同或类似问题的人。我没有对此进行调查,因为我没有必要,但是,如果您正在处理谷歌的付费服务,他们不会聚合通话返回的数据?