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

时间:2014-02-14 19:17:49

标签: java algorithm math gps coordinates

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

我的问题:我想确定某个GPS位置P是否位于由四个给定的GPS坐标A所限定的矩​​形区域内B,{{1} },CD

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

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

enter image description here

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

任何人都可以告诉我我做错了什么或建议更好的解决方案来解决这个问题吗?

非常感谢!

3 个答案:

答案 0 :(得分:4)

如果一个点在矩形内。在飞机上。对于数学家或大地测量学(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 < / sub>小于0.
  • 因此,如果我们检查P是否为矩形,我们只需要将p放在所有四条线的正确边上。因此,我们必须检查四个功能的标志。
  • 但这条线的哪一侧是正确的,矩形属于哪一侧?它是侧面,其中位于不属于该线的矩形顶点。为了检查,我们可以选择两个不属于顶点的任何一个。
  • 所以,我们必须检查一下:

    f AB (P)f AB (C)&gt; = 0

    f BC (P)f BC (D)&gt; = 0

    f CD (P)f CD (A)&gt; = 0

    f DA (P)f DA (B)&gt; = 0

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

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

    f AB (P)≡ (x A -x B )(y P -y B ) - (y A < / sub> -y B )(x P -x B

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

f AB (P)&gt; = 0

f BC (P)&gt; = 0

f CD (P)&gt; = 0

f DA (P)&gt; = 0

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

f AB (P)&lt; = 0

f BC (P)&lt; = 0

f CD (P)&lt; = 0

f DA (P)&lt; = 0

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


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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

也许试试java.awt.Rectangle课程。

public boolean contains(Point p)

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