我们说,有两个df,df1
和df2
。两者都有一列(分别为geometry_1
和geometry_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),则认为这两条线是相同的。
答案 0 :(得分:0)
您正在进行的测试(即比较每个顶点的顶点)有一个非常重要的约束:两个LineStrings中必须有完全相同数量的顶点,这不太可能发生。
由于您显然需要一个非常基本的,广泛的相似性检查,我将首先比较您的线条的主要特征。您可以使用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