我試圖確定一個點沿谷歌地圖上給定的多段線(從起點)的距離(假設用戶點擊了折線,並且我得到了事件中的點座標)。谷歌地圖確定沿線的距離
到目前爲止,這是我想到的唯一的事情:直到我找到一個,使得 d(線,點)〜= 0,跟蹤的
- 遍歷所有段折線到目前爲止所覆蓋的距離。
- 在點上插入點,以找到相對於段起點的距離 。
不幸的是,這似乎是相當複雜的事情應該是直截了當的事情。
有沒有更簡單的方法?
PS:我使用的API V3
我試圖確定一個點沿谷歌地圖上給定的多段線(從起點)的距離(假設用戶點擊了折線,並且我得到了事件中的點座標)。谷歌地圖確定沿線的距離
到目前爲止,這是我想到的唯一的事情:直到我找到一個,使得 d(線,點)〜= 0,跟蹤的
不幸的是,這似乎是相當複雜的事情應該是直截了當的事情。
有沒有更簡單的方法?
PS:我使用的API V3
於是,經過一番搜索,我決定爲上述實施的算法。原來它並沒有我想象的那麼糟糕。如果沒有人登陸這個頁面上,完整代碼如下:
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 R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
變量d是距離。
希望這有助於
只有在折線中只有1段時才能使用。 – user472875 2012-02-28 23:40:25
正如我上面所說,謝謝你的答案,但這將不適用於一般折線,因爲有很多段。 – user472875 2012-02-29 04:31:06