【问题标题】:Find neighbouring Polygons Java查找相邻的多边形 Java
【发布时间】:2013-01-27 13:36:37
【问题描述】:

我有一系列使用 JTS 拓扑套件创建的多边形。每个多边形是一组点、经度和纬度组成的形状,如下图所示。

((lat1,lon1),(lat2,lon2),....(lat1,lon1))

我想找到这些多边形邻居中的每一个,以及物理上靠近它们的其他形状。我曾想过寻找匹配点,但显然这并不适用于所有情况。我想知道是否有任何软件包可以检查多边形是否共享我可以在这种情况下使用的相同边缘?或者,如果不是,那么在 Java 中执行此操作的另一种方法。

谢谢。

【问题讨论】:

  • 你可以看看java.awt.Polygon,它实现了java.awt.Shape

标签: java computational-geometry polygons jts


【解决方案1】:

由于您正在寻找共享边,因此您可以创建一个哈希表,使用边作为键,并以该边作为项目的多边形列表。

然后你遍历每个多边形并填满表格。边数是线性的。

然后您浏览表格并查找与多个多边形相关联的边,这就是您要查找的内容。这与唯一边的数量成线性关系。

我不确定 Java 是如何实现哈希表的,因此获得此设置可能需要做一些工作。确保对边缘进行排序,以防止边缘 (A,B) 与边缘 (B,A) 不同,这会弄乱算法。

至于库,似乎您尝试做的事情可能有点专业化,因此不确定您是否会找到库实现,因此我概述了一个算法。

【讨论】:

    【解决方案2】:

    实际上有一个非常简单的方法可以做到这一点。我创建了一个包含对象数组的数组列表。该对象引用了多边形的名称/id、实际的多边形坐标,然后是一个包含任何邻居 id 的字符串。

    在 JTS 拓扑套件中,有一个方法可以调用多边形,称为 touches,它返回一个布尔值;所以我有一个双循环,通过我的数组列表两次并调用该方法触及多边形(i)所以:

    arraylist<object[]>..
    //where in the array the objects are
    object[0] = id
    object[1] = polygon
    object[2] = neighbours
    
    for (int i=0;i<arraylist;i++)
      for (int j=0;j<arraylist;j++)
        if (i)[1].touches(j)[1]
          update i[2]..
    

    这可能不是最好的方法,但它似乎有效。

    【讨论】:

      【解决方案3】:

      如果您仍然使用 JTS 几何,则可以使用可用于任何几何对象的空间关系。

      如果您可以确保邻居之间至少有一个点是共同的并且它们的内部不相交,请使用 touches

      如果您无法确保内部不相交,请使用 intersects。根据数据源,这可能是更好的选择。

      给定多边形,获取邻居的方法如下所示:

      public ArrayList<Polygon> getNeighbourList(Polygon center, ArrayList<Polygon> possibleNeighbourList){
          // result list
          ArrayList realNeighbourList = new ArrayList();
          for(Polygon p : possibleNeighbourList){
              // check if current polygon is a neighbour of the center polygon by using the spatial relation touches or intersects
              if(center.intersects(p)){
                  realNeighbourList.add(p);
              }
          }
          return realNeighbourList;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 2014-12-17
        • 2017-09-22
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        相关资源
        最近更新 更多