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

标签 java algorithm math gps coordinates

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

我的问题:我想确定某个 GPS 位置 P 是否位于由四个给定 GPS 坐标 A 包围的矩形区域内>, B, C, D.

目前我正在计算三角形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)

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

enter image description here

我已经阅读了一些简单的解决方案,您只需减去点的 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/

相关文章:

java - java中的动态编程(内存多个关键参数)

arrays - 如何在 ruby​​ 数组中仅添加正数?

math - Windows 批处理文件数学怪异

python - 将数组拆分为子数组 5 次,同时在所有子数组中保留唯一的对

c - 下面的代码如何运行?

algorithm - 随机拍摄之间的用户延迟是否是 PRNG 的良好改进?

c# - 评估字符串 "3*(4+2)"yield int 18

java - jackson :避免反序列化某些字段但不要忽略它们

java - 构建失败 apache-tomcat-7.0.42-src build.xml

Java (Eclipse) 对我自己的 jar 库的引用无法解析