我有一系列使用JTS拓扑套件创建的多边形。每个多边形都是一组形成一个形状的点,经度和纬度,如下所示。
((lat1,lon1),(lat2,lon2),....(lat1,lon1))
我想找到这些多边形中的每一个邻居,以及它们旁边的其他形状。我曾想过寻找匹配点,但显然这并不适用于所有情况。我想知道是否有任何包将检查多边形是否共享我在这种情况下可以使用的相同边缘?或者如果没有,那么另一种方法是在Java中执行此操作。
感谢。
答案 0 :(得分:1)
由于您正在寻找共享边,您可以创建一个哈希表,使用边作为关键字和一个以该边作为项的多边形列表。
然后你浏览每个多边形并填满表格。这是边数的线性。
然后,您将浏览表格并查找与多个多边形相关的边缘,这正是您要寻找的。这是唯一边数的线性。
我不确定Java如何实现哈希表,因此进行此设置可能需要一些工作。确保对边缘进行排序以防止边缘(A,B)与边缘(B,A)不同,这将使算法陷入混乱。
至于库,看起来你想要做的事情可能有点专业,因此不确定你会找到库实现,因此我概述了算法。
答案 1 :(得分:1)
实际上有一种非常简单的方法可以做到这一点。我创建了一个包含对象数组的arraylist。该对象引用了多边形的名称/ id,实际的多边形坐标,然后是一个包含任何邻居的ID的字符串。
在JTS拓扑套件中,有一种方法可以调用多边形,称为触摸,返回一个布尔值;所以我有一个双循环,两次通过我的arraylist并调用方法触及多边形(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]..
这可能不是最好的方法,但似乎有用。
答案 2 :(得分:0)
如果您正在使用JTS几何,则可以使用可与任何Geometry对象一起使用的空间关系。
使用触摸,如果您可以确保邻居之间至少有一个点是共同的,并且它们的内部不相交。
如果无法确保内部不相交,请使用相交。根据数据源,这可能是更好的选择。
给定多边形,获取邻居的方法可以如下所示:
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;
}