Удалите повторяющуюся точку из многоугольника в Shapely

Чтобы удалить повторяющиеся списки из списка, в Python есть несколько хороших способов - например, :

a = [[ 9.1514622, 47.1166004 ], [ 9.1513045, 47.1164599 ], [ 9.1516278, 47.1163001 ], [ 9.1517832, 47.1164408 ], [ 9.1514622, 47.1166004 ] ] 

print len(a) # 5
b_set = set(map(tuple,a))
b = map(list,b_set)
print len(b) # 4

Но, к сожалению, мне пришлось преобразовать свой список в объект Shapely Polygon. , в котором мне нужно упростить геометрию и выполнить некоторые другие гео-функции.

from shapely.geometry import Polygon
a = [[[ 9.1514622, 47.1166004 ], [ 9.1513045, 47.1164599 ], [ 9.1516278, 47.1163001 ], [ 9.1517832, 47.1164408 ], [ 9.1514622, 47.1166004 ] ] ]
polys = [Polygon(item) for item in a] # convert list to polygon
print len(polys) # prints 5

В этом ответе показано, как удалить повторяющийся многоугольник из списка многоугольников, но как удалить повторяющуюся точку из списка точек, как стройный многоугольник?

Я предполагаю, что можно преобразовать его обратно в список, удалить дубликаты, а затем повторно преобразовать в многоугольник.

Но это кажется слишком сложным. Есть идеи, как это сделать?


person philshem    schedule 16.03.2018    source источник


Ответы (1)


Давайте использовать данные в вашем вопросе в качестве примера. У вас есть список координат:

L = [[ 9.1514622, 47.1166004 ], [ 9.1513045, 47.1164599 ], [ 9.1516278, 47.1163001 ], [ 9.1517832, 47.1164408 ], [ 9.1514622, 47.1166004 ]]

который затем преобразуется в Polygon:

P = Polygon(L)

Теперь может показаться, что L излишне, поскольку последняя точка совпадает с первой. Но на самом деле это не проблема, поскольку в противном случае Shapely в любом случае дублировал бы первую точку (чтобы закрыть границу многоугольника). Вы можете увидеть это с помощью:

P = Polygon(L)
print(list(P.exterior.coords))
#[(9.1514622, 47.1166004), (9.1513045, 47.1164599), (9.1516278, 47.1163001), (9.1517832, 47.1164408), (9.1514622, 47.1166004)]

#now skip the last point
P = Polygon(L[:-1])
print(list(P.exterior.coords))
#[(9.1514622, 47.1166004), (9.1513045, 47.1164599), (9.1516278, 47.1163001), (9.1517832, 47.1164408), (9.1514622, 47.1166004)]

В случае, если "внутри" L будет какая-то повторяющаяся точка, как, например, в:

L = [[ 9.1514622, 47.1166004 ], [ 9.1513045, 47.1164599 ], [ 9.1513045, 47.1164599 ], [ 9.1516278, 47.1163001 ], [ 9.1517832, 47.1164408 ], [9.1514622, 47.1166004 ]]

тогда его можно было бы устранить с помощью метода simplify с нулевым допуском (чтобы не было побочных эффектов):

print(list(Polygon(L).simplify(0).exterior.coords))
#[(9.1514622, 47.1166004), (9.1513045, 47.1164599), (9.1516278, 47.1163001), (9.1517832, 47.1164408), (9.1514622, 47.1166004)]
person ewcz    schedule 17.03.2018
comment
simplify мне очень пригодился - person vpipkt; 06.03.2020