2017-01-25 4 views
2

Скажем, есть два 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 имеют больше строк, но на данный момент я хочу сосредоточиться на следующем вопросе. Есть ли способ оценить, являются ли эти две строки одинаковыми. По аналогичному я имею в виду, что если расстояние между соответствующими точками линий не превышает допустимое значение (например, 100 м), две линии считаются идентичными.

ответ

0

Тестирование, которое вы выполняете (например, сравнение вершин на вершину), имеет очень важное ограничение: должно быть точно такое же количество вершин в обеих строках, что маловероятно.

Поскольку вы, очевидно, хотите получить очень простую и широкую проверку подобия, я бы начал с сравнения основных характеристик ваших линий. Это можно достичь с помощью атрибутов геометрии 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 
+0

Это ответ на ваш вопрос? Пожалуйста, дайте мне знать, поэтому мы знаем, можем ли мы закрыть эту тему. –