我在 Stackoverflow 和其他网站上经历了许多类似的问题,我的解决方案基于这些答案,但我仍然无法让它工作......
我的问题:我想确定某个 GPS 位置 P
是否位于由四个给定 GPS 坐标 A
包围的矩形区域内>, B
, C
, D
.
目前我正在计算三角形ABP
、BCP
、CDP
和DAP
的面积。如果这些区域中的任何一个大于零(请不要生气,数学家),该点位于我的矩形之外,如解释的那样 here .
代码:
private static double triangleArea(Location a, Location b, Location c) {
// (C.x*B.y-B.x*C.y)-(C.x*A.y-A.x*C.y)+(B.x*A.y-A.x*B.y)
double result = (c.getLongitude()*b.getLatitude()-b.getLongitude()*c.getLatitude())-(c.getLongitude()*a.getLatitude()-a.getLongitude()*c.getLatitude())+(b.getLongitude()*a.getLatitude()-a.getLongitude()*b.getLatitude());
return result;
}
public static boolean isInsideSquare(Location a, Location b, Location c, Location d, Location p) {
if (triangleArea(a,b,p)>0 || triangleArea(b,c,p)>0 || triangleArea(c,d,p)>0 || triangleArea(d,a,p)>0) {
return false;
}
return true;
}
但是当我调用这个函数时,它总是返回 false
。即使使用以下坐标(纬度、经度):
A: (50.884706, 4.714151)
B: (50.884944, 4.716149)
C: (50.884679, 4.716228)
D: (50.884441, 4.714230)
P: (50.884538, 4.714615)
然而,当我在 map 上绘制这些点时(例如 here),我可以看到点 P 位于 ABCD 内......(见下文)
我已经阅读了一些简单的解决方案,您只需减去点的 x、y 坐标,但这显然只适用于平行于 x 轴和 y 轴的矩形,而我的矩形可以在任何方向上定向角度。
谁能告诉我我做错了什么或提出更好的解决方案来解决这个问题?
非常感谢!
最佳答案
如果点在矩形内。在飞机上。对于数学家或大地测量学 (GPS) 坐标
- 让我们延长矩形的边。所以我们有 4 条直线 lAB、lBC、lCD、lDA,或者,为了简短起见, l1, l2, l3, l4.
对每个 li 做一个方程。等式排序:
fi(P)=0。
P 是一个点。对于属于 li 的点,等式成立。
- 我们需要等式左边的函数。它们是f1, f2, f3, f4。
- 注意,对于来自 li 一侧的每个点,函数 fi 都大于 0,对于来自另一侧的点 fi 小于 0。
- 因此,如果我们要检查 P 是否在矩形中,我们只需要 p 位于所有四条直线的正确边上。因此,我们必须检查四个函数的标志。
- 但是直线的哪一侧是正确的,矩形属于哪一侧?它是侧面,不属于该线的矩形顶点所在的位置。为了进行检查,我们可以选择两个不属于的顶点中的任何一个。
所以,我们必须检查一下:
fAB(P) fAB(C) >= 0
fBC(P) fBC(D) >= 0
fCD(P) fCD(A) >= 0
fDA(P) fDA(B) >= 0
不等式并不严格,因为如果一个点在边界上,它也属于矩形。如果你不需要边界上的点,你可以改变严格的不等式。但是,当您从事浮点运算时,选择是无关紧要的。
- 对于矩形中的一个点,所有四个不等式都为真。请注意,它也适用于每个凸多边形,只是线/方程的数量会有所不同。
唯一剩下的事情就是得到一条穿过两点的直线的方程式。这是一个著名的线性方程。让我们为直线 AB 和点 P 编写它:
fAB(P) ≡ (xA-xB) (yP-yB) - (yA-yB) (xP-xB)
可以简化检查 - 让我们沿着矩形顺时针 - A、B、C、D、A。然后所有正确的边都会在线的右侧。因此,我们不必与另一个顶点所在的边进行比较。我们需要检查一组更短的不等式:
fAB(P) >= 0
fBC(P) >= 0
fCD(P) >= 0
fDA(P) >= 0
但这对于正常的数学家坐标集来说是正确的,其中 X 位于右侧,Y 位于顶部。对于在 GPS 中使用的大地测量学 坐标,其中 X 位于顶部,Y 位于右侧,我们必须对不等式进行转换:
fAB(P) <= 0
fBC(P) <= 0
fCD(P) <= 0
fDA(P) <= 0
如果您不确定轴的方向,请小心进行此简化检查 - 如果您选择了正确的不等式,请手动检查一个点。
顺便说一句,球体上的矩形也有意义。它是两条平行线和两条子午线之间的区域,当然,主轴的任何方向。但是根据评论,您不需要它。
关于java - 如何确定 GPS 坐标是否位于矩形区域内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21787743/