我需要使用 google maps api 方向服务检索目的地的坐标。我已经有了起点坐标,但是我希望通过指定距离(以公里为单位)来检索坐标,而不是在坐标中指定终点。
所以我想我的问题如下:是否可以通过使用方向服务或任何替代方法指定距离(以公里为单位)来检索目的地纬度坐标(基于/计算道路的距离而不是方向/直线)方法?
我有一个图片说明,但不幸的是,由于我没有足够的声誉,因此无法附上这个问题。如果我的问题有任何不清楚的地方,或者你想看插图,请联系我,我会寄出。
我需要使用 google maps api 方向服务检索目的地的坐标。我已经有了起点坐标,但是我希望通过指定距离(以公里为单位)来检索坐标,而不是在坐标中指定终点。
所以我想我的问题如下:是否可以通过使用方向服务或任何替代方法指定距离(以公里为单位)来检索目的地纬度坐标(基于/计算道路的距离而不是方向/直线)方法?
我有一个图片说明,但不幸的是,由于我没有足够的声誉,因此无法附上这个问题。如果我的问题有任何不清楚的地方,或者你想看插图,请联系我,我会寄出。
我认为您不能这样做,因为请求参数说需要起点和终点参数。
我相信你是对的。api 中似乎没有任何当前方法可以让您执行以下操作。
相反,我遍历了从路线服务调用返回的坐标,并使用了一个函数来计算坐标之间的距离。然而,即使这还不够准确,因为返回的坐标似乎也是聚合的,并且在计算每个坐标之间的距离时没有返回准确的值/距离,因为它们是聚合的,因此每个坐标在道路上都是不必要的。
为了解决上述问题,我最终添加了一个点击事件,并自己绘制了沿路的坐标,然后将它们存储在我缓存并使用 xmlhttprequest 调用的本地 json 文件中。
幸运的是,就我的情况而言,我只需要计算一条单独道路上 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.获取最终AB坐标的坐标(基于剩余百分比)。“矩阵”变量是一个 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;
}
}
希望以下内容对遇到相同或类似问题的任何人有所帮助。我没有对此进行调查,因为我没有必要,但是,也许如果您正在处理谷歌的付费服务,他们不会汇总调用返回的数据?