使用Geopandas比较几何图形

3

假设有两个数据框,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 )
....

两个数据框的行数都较多,但现在我只想关注以下问题。是否有方法可以评估这两条线是否相似。所谓相似是指如果两条线各自点之间的距离不超过一个有效值(例如100米),则认为这两条线是相同的。

1个回答

2
你所需要的测试(即逐点比较)有一个非常重要的限制条件:两个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接