Google maps 谷歌地图决定了这条线的距离
我试图在Google maps中确定点沿给定多段线(从起点)的距离(假设用户单击多段线,我在事件中获得点坐标) 到目前为止,我唯一想到的是:Google maps 谷歌地图决定了这条线的距离,google-maps,Google Maps,我试图在Google maps中确定点沿给定多段线(从起点)的距离(假设用户单击多段线,我在事件中获得点坐标) 到目前为止,我唯一想到的是: 迭代多段线中的所有线段,直到找到 d(直线,点)~=0,记录到目前为止所覆盖的距离 在点所在的线段上插值以查找其距离 相对于线段的起点 可悲的是,对于一些本应直截了当的事情来说,这似乎相当复杂 有没有更简单的方法 附言:我正在使用API v3,如果你得到起点和终点的坐标,然后使用哈弗森算法计算距离,你可以很容易地找到两点之间的距离,同时考虑到地球的曲率
- 迭代多段线中的所有线段,直到找到 d(直线,点)~=0,记录到目前为止所覆盖的距离
- 在点所在的线段上插值以查找其距离 相对于线段的起点
附言:我正在使用API v3,如果你得到起点和终点的坐标,然后使用哈弗森算法计算距离,你可以很容易地找到两点之间的距离,同时考虑到地球的曲率 以下是公式(您可能需要将转换为您正在使用的语言): 变量d是你的距离
希望这能有所帮助,所以,经过多次搜索,我决定实现上述算法。结果并不像我想的那么糟。如果有人登陆此页面,完整代码如下:
var DistanceFromStart = function (/*latlng*/ markerPosition) {
var path = this.polyline.getPath();
var minValue = Infinity;
var minIndex = 0;
var x = markerPosition.lat();
var y = markerPosition.lng();
for (var i = 0; i < path.getLength() - 1; i++) {
var x1 = path.getAt(i).lat();
var y1 = path.getAt(i).lng();
var x2 = path.getAt(i + 1).lat();
var y2 = path.getAt(i + 1).lng();
var dist = pDistance(x, y, x1, y1, x2, y2);
if (dist < minValue) {
minIndex = i;
minValue = dist;
}
}
var gdist = google.maps.geometry.spherical.computeDistanceBetween;
var dinit = gdist(markerPosition, path.getAt(minIndex));
var dtotal = gdist(path.getAt(minIndex), path.getAt(minIndex + 1));
var distanceFromStart = 0;
for (var i = 0; i <= minIndex - 1; i++) {
distanceFromStart += gdist(path.getAt(i), path.getAt(i + 1));
}
distanceFromStart += dtotal * dinit / dtotal;
return distanceFromStart;
}
function pDistance(x, y, x1, y1, x2, y2) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var param = dot / len_sq;
var xx, yy;
if (param < 0 || (x1 == x2 && y1 == y2)) {
xx = x1;
yy = y1;
}
else if (param > 1) {
xx = x2;
yy = y2;
}
else {
xx = x1 + param * C;
yy = y1 + param * D;
}
var dx = x - xx;
var dy = y - yy;
return Math.sqrt(dx * dx + dy * dy);
}
var DistanceFromStart=函数(/*latlng*/markerPosition){
var path=this.polyline.getPath();
var minValue=无穷大;
var-minIndex=0;
var x=markerPosition.lat();
var y=markerPosition.lng();
对于(var i=0;i
如果您认为有什么需要改进的地方,请务必告诉我。只有当您的多段线中只有一个线段时,这才有效。如上所述,感谢您的回答,但这通常不适用于多段线,因为有许多线段。
var DistanceFromStart = function (/*latlng*/ markerPosition) {
var path = this.polyline.getPath();
var minValue = Infinity;
var minIndex = 0;
var x = markerPosition.lat();
var y = markerPosition.lng();
for (var i = 0; i < path.getLength() - 1; i++) {
var x1 = path.getAt(i).lat();
var y1 = path.getAt(i).lng();
var x2 = path.getAt(i + 1).lat();
var y2 = path.getAt(i + 1).lng();
var dist = pDistance(x, y, x1, y1, x2, y2);
if (dist < minValue) {
minIndex = i;
minValue = dist;
}
}
var gdist = google.maps.geometry.spherical.computeDistanceBetween;
var dinit = gdist(markerPosition, path.getAt(minIndex));
var dtotal = gdist(path.getAt(minIndex), path.getAt(minIndex + 1));
var distanceFromStart = 0;
for (var i = 0; i <= minIndex - 1; i++) {
distanceFromStart += gdist(path.getAt(i), path.getAt(i + 1));
}
distanceFromStart += dtotal * dinit / dtotal;
return distanceFromStart;
}
function pDistance(x, y, x1, y1, x2, y2) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var param = dot / len_sq;
var xx, yy;
if (param < 0 || (x1 == x2 && y1 == y2)) {
xx = x1;
yy = y1;
}
else if (param > 1) {
xx = x2;
yy = y2;
}
else {
xx = x1 + param * C;
yy = y1 + param * D;
}
var dx = x - xx;
var dy = y - yy;
return Math.sqrt(dx * dx + dy * dy);
}