【问题标题】:Compare geometries with geopandas将几何图形与 geopandas 进行比较
【发布时间】:2017-01-25 18:16:35
【问题描述】:

假设有两个 df,df1df2。两者都有一列(分别为geometry_1geometry_2)代表线串类型的几何形状。

df1    
    geometry_1
0   LINESTRING(37.00 59.00, 37.05 59.32)
.... 


df2
    geometry_2
0   LINESTRING(37.89 59.55, 38.05 60.32 )
....

两个 df 都有更多的行,但现在我想专注于以下问题。有什么方法可以评估两条线是否相似。类似我的意思是如果线的各个点之间的距离不高于有效值(例如100m),则两条线被认为是相同的。

【问题讨论】:

    标签: geopandas


    【解决方案1】:

    您所进行的测试(即比较每个顶点的顶点)有一个非常重要的约束:两个 LineString 中的顶点数量必须完全相同,这不太可能发生。

    由于您显然想要一个非常基本、广泛的相似性检查,我将从比较您的线条的主要特征开始。您可以通过使用shapely 的几何属性来实现这一点,如下面的自解释示例所示:

    def are_geometries_similar(geom1,geom2,MAX_ALLOWED_DISTANCE = 100,MAX_ALLOWED_DIFFERENCE_RATIO = 0.1):
    
        """
        Function compares two linestrings' number of vertices, length and basic position.
        If they pass all 3 tests within the specified margin of error, it returns true, otherwise it returns false.
        """    
    
        # 1. Compare length:
        l1 = geom1.length
        l2 = geom2.length
    
        if not abs(float(l1) - l2)/max([l1,l2]) < MAX_ALLOWED_DIFFERENCE_RATIO:
            return False
    
        # 2. Compare number of vertices:
        vert_num1 = len(geom1.coords)
        vert_num2 = len(geom2.coords)
    
        if not abs(float(vert_num1) - vert_num2)/max([vert_num1,vert_num2]) < MAX_ALLOWED_DIFFERENCE_RATIO:
            return False
    
        # 3. Compare position by calculating the representative point
        rp1 = geom1.representative_point()
        rp2 = geom2.representative_point()
    
        if rp1.distance(rp2) > MAX_ALLOWED_DISTANCE:
            return False
    
        # If all tests passed, return True
        return True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-10-24
      相关资源
      最近更新 更多