Java 如何确定多边形中是否存在点
如何确定给定多边形集中是否存在点? 我有像这样的坐标Java 如何确定多边形中是否存在点,java,postgresql,mongodb,geometry,opengis,Java,Postgresql,Mongodb,Geometry,Opengis,如何确定给定多边形集中是否存在点? 我有像这样的坐标 polygonA = 1(0,0),2(0,5),3(3,4),4(3,5),5( 2,2) polygonB = 1(10,10),2(10,15),3(13,14),4(13,15),5(12,12) 我有一个点,如(6,4),现在我想搜索这个点是在这个多边形中的任何一个,还是在这两个多边形中,或者离哪个多边形最近 如何存储此类数据(多边形)?是否有系统/数据库/算法来执行此搜索 更新:谢谢大家这么快的回复……我想我需要更具体一些 如何
polygonA = 1(0,0),2(0,5),3(3,4),4(3,5),5( 2,2)
polygonB = 1(10,10),2(10,15),3(13,14),4(13,15),5(12,12)
我有一个点,如(6,4),现在我想搜索这个点是在这个多边形中的任何一个,还是在这两个多边形中,或者离哪个多边形最近
如何存储此类数据(多边形)?是否有系统/数据库/算法来执行此搜索
更新:谢谢大家这么快的回复……我想我需要更具体一些
如何搜索=是…已获取和的列表
如何存储=根据我的研究,SQL和NoSQL db有它们的解决方案。
NoSQL=MongoDb似乎最符合我的需要。但问题是,我可以像“db.places.find”({“loc”:{“$within”:{“$polygon”:polygonB}}}})”这样查询,但不能像db.places.find那样进行查询({“loc”:{“$within”:{}})
SQL检查了postgre和openGIS以获得一些帮助。但科鲁德没有弄清楚这是否可能
如果有人能帮我…提前谢谢。基本方法(如果有少量多边形)是将所有多边形存储在一个集合中,并在元素上循环以检查点是否在多边形内
另一方面,如果有相当多的多边形,我建议使用R树数据结构,这在标准库中是不可用的。如果要使用R-tree选项,则应选中此项目:
R树允许您索引矩形(在本例中为多边形的边界框)。因此,您可以使用R-树快速找到少量候选多边形。然后,您可以在候选列表上循环以获得最终结果。您可以使用GeneralPath类帮助您确定点是否与多边形相交。首先,创建一个添加坐标的GeneralPath:
GeneralPath gp = new GeneralPath();
double[] x = ...
double[] y = ...
gp.moveTo(x[0], y[0]);
for (int i =1; i < x.length; i++) {
gp.lineTo(x[i], y[i]);
}
gp.closePath();
if (gp.contains(pointX, pointY)) {
...
}
GeneralPath gp=new GeneralPath();
双[]x=。。。
双[]y=。。。
gp.moveTo(x[0],y[0]);
对于(int i=1;i
对于点靠近哪个多边形的问题,这在一定程度上取决于您需要解决方案的准确程度
为了获得准确的解决方案,该值(无需优化)为:
- 取点与连接每个多边形顶点的每条线(段)之间的最短距离(Java2D显然没有提供此方法,但从点到线的最短距离是a)
- 哪一个多边形的直线到该点的距离最短
- 取每个多边形的边界矩形的中心点(GeneralPath.getBounds()将给出该值)
- 取查询点与每个中心点之间的距离,并查看哪个距离最近
我不太了解数据库的内容。您的多边形只是定义为一系列点。您决定如何将这些点存储在内存/文件中对算法基本上没有任何影响。您的多边形是凸的、凹的、自相交的吗?另请参见此。@nhahdh,这有什么关系?@Beta-有些算法效率低下ent或不适用于某些类型的多边形。这就是为什么它很重要。然而,一些算法涵盖了所有情况(如果我没记错的话),但速度不如特例算法快。我认为更重要的是如何检查点是否位于特定多边形中,而不是如何缩放算法。我不太确定这一点,因为java.awt.polygon已经有许多包含()方法。无论如何,从问题上看,这不是很明显,所以你也可能是对的。嗨,vizier,谢谢你的帮助。是的,我需要如何查找和存储,但效率也很高。在查看不同的结构时,我发现MongoDB最接近我需要的。MongoDB的问题是我无法进行类似的查询“从点(x,y)附近的poly_表中选择poly”…根据mongo的描述,我可以说“db.places.find({“loc”:{“$within”:{“$polygon”:polygonB}}})”…有人能帮我一下吗(更新问题)你也应该检查这个问题(如果还没有):精确解部分有点奇怪。我认为方法应该是:必须计算到线段的最短距离,其中多边形的每个线段必须计算到直线的距离一次,到点的距离两次。对于自交多边形的情况,这可能有点定义不清。我不确定我是否理解我基本上是说:“将点到多边形的距离视为到最近顶点的距离"。你是否将其视为其他东西?P.S.我忽略了自交多边形的情况。我认为点到多边形的最短距离是点到连接定义多边形的顶点的所有线段的最短距离,而不仅仅是到顶点的最短距离。抱歉,我明白了,现在发生了什么-我们正在定义同样的方法,但我混淆了我的术语。我所说的“顶点”是指“连接顶点的直线/线段”(因此我向calc提到了算法)