【发布时间】:2013-07-27 16:51:21
【问题描述】:
我需要验证坐标 LAT/LNG 点是否在其他两点之间(如道路的线段)。 我关注了THIS topic,但没有成功。
function inRange(start, point, end) {
start_x = start.lat();
start_y = start.lng();
end_x = end.lat();
end_y = end.lng();
point_x = point.lat();
point_y = point.lng();
var dx = end_x - start_x;
var dy = end_y - start_y;
var innerProduct = (point_x - start_x)*dx + (point_y - start_y)*dy;
return 0 <= innerProduct && innerProduct <= dx*dx + dy*dy;
}
function checkRange(start, point, end){
var x1 = start.lat();
var y1 = start.lng();
var x2 = end.lat();
var y2 = end.lng();
var x = point.lat();
var y = point.lng();
if (x1 == x2) { // special case
return y1 < y2 ? (y1 <= y && y <= y2) : (y2 <= y && y <= y1);
}
var m = (y2 - y1) / (x2 - x1);
var r1 = x1 + m * y1;
var r2 = x2 + m * y2;
var r = x + m * y;
return r1 < r2 ? (r1 <= r && r <= r2) : (r2 <= r && r <= r1);
}
- 第一次测试
开始:(44.4963217, 11.327993300000003)
结束:(44.4973624, 11.32760170000006)
点(44.4958434、11.328122000000008)
InRange == 假(确定) 所以Point成为新的起点
- 第二次测试
开始:(44.4958434, 11.328122000000008)
结束:(44.4973624, 11.32760170000006)
点:(44.4966928, 11.32781620000003)
InRange == 假(错误) Point2 在开始/结束之间,但函数返回 false :(
【问题讨论】:
-
我觉得你把这件事弄得太复杂了。暂时忘记“特殊情况”:
return (point.lat() < end.lat() && point.lat() > start.lat() && point.lng() < end.lng() && point.lng > start.lng());返回什么? -
您在第二次测试中的经度点不在起点经度和终点经度之间。
(11.32781620000003 < 11.32760170000006 && 11.32781620000003 > 11.328122000000008)返回 false。 -
是的,但如果您查看 GMaps,您会发现第二个测试点位于起点和终点之间的道路上。
-
那是学术性的。关键是您的方法正在按照应有的方式响应您传递给它的变量。那么,问题在于 GMaps 渲染或位置计算。
标签: javascript google-maps coordinates