geopandas ile geometrilere karşılaştırın

oy
2

Diyelim, orada iki df en vardır df1ve df2. Her ikisi de (bir sütun olması geometry_1ve geometry_2LineString Çeşidi geometrisini temsil eden, sırasıyla).

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 )
....

Her iki df en fazla satır var, ama şimdilik şu soru üzerinde odaklanmak istiyorum. iki satır benzerse değerlendirmek için herhangi bir yolu var mı. Benzer olarak çizginin karşılık gelen noktalar arasındaki mesafenin, geçerli bir değeri (örneğin. 100) daha yüksek olduğunda, iki hat aynı olarak kabul edilir anlamına gelir.

Oluştur 25/01/2017 saat 16:16
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Eğer (yani vertex köşe karşılaştırarak) sonra olan test çok önemli bir kısıtlaması vardır: gerçekleşmesi çok olası değildir hem LineStrings içinde köşe aynı sayıda olmalıdır.

Belli ki çok temel, geniş benzerlik kontrolü istiyorum, ben senin hatlarının ana karakteristiklerini karşılaştıran ile başlamak istiyorum. Sen kullanarak elde edebilirsiniz shapelyler' geometrisi aşağıdaki kendini açıklayıcıdır örnekte olduğu gibi niteliklerini:

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
Cevap 13/02/2017 saat 11:27
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more