如何查找哪个点存在于哪个多边形中

时间:2012-05-27 13:45:01

标签: 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)现在想要搜索这个点是否在这个多边形中的任何一个或两者中或最接近哪个多边形。

如何存储此类数据(多边形)?有没有系统/数据库/算法来进行此搜索?

更新:感谢大家的快速回复......我想我需要更加具体......

如何搜索=是...获取algorithmslibrary的列表。

如何存储=基于我的研究SQL和NoSQL db有他们的解决方案。 NoSQL = MongoDb似乎最接近我需要的东西。但问题是我可以查询如“db.places.find({”loc“:{”$ within“:{”$ polygon“:polygonB}}})”但是不能像db.places.find那样进行查询({“ loc“:{”$ in“:{}}}) SQL检查了postgre和openGIS以获得一些帮助。但是如果可能的话,colud就不会想出来。

如果有人可以帮助我...提前致谢。

2 个答案:

答案 0 :(得分:2)

基本方法(如果您有少量多边形)是将所有多边形存储在一个集合中,并在元素上循环以检查一个点是否在多边形内。

另一方面,如果你有相当数量的多边形,我建议使用R-tree数据结构,这在标准库中是不可用的。如果您想使用R-tree选项,请检查此项目:http://sourceforge.net/projects/jsi/

R-tree允许您索引矩形(在这种情况下为多边形的边界框)。因此,您可以使用R树快速找到少量候选多边形。然后你可以遍历候选列表以获得最终结果。

答案 1 :(得分:1)

您可以使用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)) {
        ...
    }

对于哪个多边形点更近的问题,这取决于您需要解决方案的准确程度。

对于准确的解决方案,这个数量(没有优化)为:

  • 取点和连接每个多边形顶点的每条线(段)之间的最短距离(Java2D显然没有为此提供方法,但从点到线的最短距离是a fairly simple calculation
  • 哪个多边形具有到点的最短距离的线?

实际上,您可以为某些应用程序估算此过程。例如,您可以更有效地执行此操作:

  • 取每个多边形的边界矩形的中心点(GeneralPath.getBounds()会给你这个)
  • 获取查询点与每个中心点之间的距离,并查看哪个最接近。

如果确实需要准确的答案,那么您可以结合使用这些技术来优化所有顶点之间的搜索。例如,您可以按照距离“中心点”(如上所述)的距离对多边形进行排序。从最小距离到最大距离搜索。如果到目前为止找到的段的最小距离为d,则可以自动排除任何多边形P,其中查询点到“中心点”的距离为d + r,其中r是长度的一半。 P的边界矩形的对角线(换句话说,为简单起见,您可以想象围绕该边界框的边界圆并检查到该边界圆的距离是否远远超过其他多边形上到目前为止的最近点)。

我对数据库的一点不太了解。您的多边形只是定义为一系列点。你决定如何将它们存储在内存/文件中并不会对算法产生任何影响。