如何确定GPS坐标是否位于矩形区域内?

我在Stackoverflow和其他网站上经历了许多类似的问题,我的解决方案基于这些答案,但我仍然无法让它工作……

我的问题:我想确定某个GPS位置P位于由四个给定的GPS坐标ABCD界定的矩形区域内。

目前我正在计算三角形ABPBCPCDPDAP的面积。 如果这些区域中的任何一个大于零(不要沮丧,数学家),那么这个点就在我的矩形之外。

码:

 private static double triangleArea(Location a, Location b, Location c) { // (Cx*By-Bx*Cy)-(Cx*Ay-Ax*Cy)+(Bx*Ay-Ax*By) 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) 

然而,当我在地图上绘制这些点(例如这里 )时,我可以看到P点位于ABCD内…(见下文)

在此处输入图像描述

我已经阅读了一些简单的解决方案,你只需减去点的x,y坐标,但这显然只适用于平行于x轴和y轴的矩形,而我的矩形可以任意角度定向。

谁能告诉我我做错了什么或建议更好的解决方案来解决这个问题?

非常感谢!

如果一个点在矩形内。 在飞机上。 适用于数学家或大地测量学(GPS)坐标

  • 让我们延长矩形的边。 因此,我们有4条直线l AB ,l BC ,l CD ,l DA ,或者,为了简洁,l 1 ,l 2 ,l 3 ,l 4
  • 为每个l i制定一个等式。 方程式:

    f i (P)= 0。

P是一个观点。 对于属于l i的点,等式为真。

  • 我们需要方程左边的函数。 它们是f 1 ,f 2 ,f 3 ,f 4
  • 注意,对于来自l i的一侧的每个点,函数f i大于0,对于来自另一侧的点,f i小于0。
  • 因此,如果我们检查P是否为矩形,我们只需要将p放在所有四条线的正确边上。 所以,我们必须检查四个function的标志。
  • 但该线的哪一侧是正确的,矩形属于哪一侧? 它是侧面,其中位于不属于该线的矩形顶点。 为了检查,我们可以选择两个不属于顶点的任何一个。
  • 所以,我们必须检查一下:

    f AB (P)f AB (C)> = 0

    f BC (P)f BC (D)> = 0

    f CD (P)f CD (A)> = 0

    f DA (P)f DA (B)> = 0

不平等并不严格,因为如果一个点在边界上,它也属于矩形。 如果边界上不需要点,则可以更改严格的点的不等式。 但是当你从事浮点运算时,选择是无关紧要的。

  • 对于一个点,即矩形,所有四个不等式都是真的。 请注意,它也适用于每个凸多边形,只有线/方程的数量会有所不同。
  • 唯一剩下的就是得到一条线经过两点的方程式。 这是一个众所周知的线性方程。 让我们把它写成AB行和P点:

    f AB (P)≡(x A -x B )(y P -y B ) – (y A -y B )(x P -x B

检查可以简化 – 让我们顺时针方向沿着矩形 – A,B,C,D,A。然后所有正确的边都在线的右边。 因此,我们无需与另一个顶点所在的一侧进行比较。 我们需要检查一组较短的不等式:

f AB (P)> = 0

f BC (P)> = 0

f CD (P)> = 0

f DA (P)> = 0

但这对于普通的数学坐标系是正确的,其中X在右边,Y在顶部。 对于GPS中使用的大地测量坐标,其中X位于顶部,Y位于右侧,我们必须改变不等式:

f AB (P)<= 0

f BC (P)<= 0

f CD (P)<= 0

f DA (P)<= 0

如果您不确定轴的方向,请注意这种简化的检查 – 如果您选择了正确的不等式,请手动检查一个点。


顺便说一句,球体上的矩形也有感觉。 当然,它是两个平行线和两个子午线之间的区域,具有主轴的任何方向。 但根据评论,你不需要它。

也许尝试java.awt.Rectangle类。

 public boolean contains(Point p) 

检查此Rectangle是否包含指定的Point

我会在多边形函数中使用一个点。 这始终有效,除非不与基准限制(180到-180跳)或极点重叠。

我很好奇哪个更快,来自Gangnus的方法还是poly中的点。 正常情况是点远在外面。