确定点是否在java中的坐标集中

确定点是否在java中的坐标集中,java,gis,Java,Gis,我一直在寻找这个问题的答案,但似乎找不到解决办法。我需要的是我有一组坐标(开始时长度未知),我需要确定一个点是否位于由该坐标确定的多边形内。但是,我不能使用AWT(正如我最初认为的那样),因为坐标可以在美国的任何地方移动 我想我需要使用一个for循环,用一系列小于,大于的检查。我走的是正确的道路,还是有一个我没有想到的更简单的解决方案?任何帮助都将不胜感激 编辑:以下是我正在处理的数据示例: 49.006452278468664, 115.10363050431958 48.9933143858

我一直在寻找这个问题的答案,但似乎找不到解决办法。我需要的是我有一组坐标(开始时长度未知),我需要确定一个点是否位于由该坐标确定的多边形内。但是,我不能使用
AWT
(正如我最初认为的那样),因为坐标可以在美国的任何地方移动

我想我需要使用一个
for循环
,用一系列
小于
大于
的检查。我走的是正确的道路,还是有一个我没有想到的更简单的解决方案?任何帮助都将不胜感激

编辑:以下是我正在处理的数据示例:

49.006452278468664, 115.10363050431958
48.993314385809654, 115.04009921106841
49.03510754434096, 115.02009771650923
49.04825271759021, 115.08366905978859
维基百科:

确定该点是在简单多边形的内部还是外部的一种简单方法是,测试一条光线从该点开始沿任何固定方向与多边形的边相交的次数。如果点位于多边形的外侧,则光线将与其边相交偶数次。如果该点位于多边形内部,则它将与边相交奇数次。不幸的是,如果点位于多边形的边上,此方法将不起作用

为简单起见,可能最容易水平投射光线,因此可以通过符号更改来识别穿过光线的边:

boolean inside(Point p, Point[] polygon) {
    int intersections = 0;
    Point prev = polygon[polygon.length - 1];
    for (Point next : polygon) {
        if ((prev.y <= p.y && p.y < next.y) || (prev.y >= p.y && p.y > next.y)) {
            double dy = next.y - prev.y;
            double dx = next.x - prev.x;
            double x = (p.y - prev.y) / dy * dx + prev.x;
            if (x > p.x) {
                intersections++;
            }
        }
        prev = next;
    }
    return intersections % 2 == 1;
}
内部布尔值(点p,点[]多边形){
整数交点=0;
Point prev=多边形[多边形.长度-1];
对于(下一个点:多边形){
如果((上一个y=p.y&&p.y>next.y)){
double dy=next.y-prev.y;
双dx=下一个.x-上一个.x;
双x=(p.y-上一个y)/dy*dx+上一个x;
如果(x>p.x){
交叉口++;
}
}
上一个=下一个;
}
返回交点%2==1;
}

埃里克·海恩斯(Eric Haines)就此写了一篇很棒的文章:

<> P>有几种方法,Jordan曲线定理相当好,但是如果你的数据创建了一个炸圈饼型多边形,你的点在中间,则有一些问题。 从本质上讲,如果从该点开始的任何光线与多边形的边相交的次数为奇数,则表示该点位于多边形内部

您还可以使用角度总和测试,这是一种非常缓慢但绝对可靠的方法来测试点是否位于多边形内

求各边端点在该点形成的有符号角度的和。如果和接近于零,则点在外部;如果不是,它就在里面(图2)

第三种方法是三角形测试,如果您的多边形不是太尖(我怀疑可能是这样),它会很好地工作:

将多边形视为从一个顶点发出的三角形的扇形,并通过计算其重心坐标对每个三角形测试该点


如果您可以检查形状是否凹,还有其他方法可供您选择,我建议您阅读这篇文章,因为它讨论了比此处列出的方法更多的解决问题的方法。

坐标如何确定多边形?我们讨论的是凸包还是坐标与多边形边界上的坐标顺序相同?请参考凸包问题!我从一个KMZ文件中提取数据,从我所能看出它们是有序的(虽然文件中有很多点,所以我没有全部检查)。多边形是凸的吗?不一定。我从“展望”中获得数据,所以这实际上取决于预测者的预测结果。所以我需要水平和垂直地投射数据,或者我只需要做一个或另一个?所有方向都应该给出相同的结果。好吧,我想我现在记得它背后的数学理论了!谢谢我们只朝一个方向投,对吗?(只喜欢右边?)在你发布的代码中,当你有sgn时,你是指sin吗?我用signum函数尝试了这个代码,不幸的是,它似乎对我的情况不起作用。它在确定点位置时不准确