Python 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
Этот ответ показывает, как удалить дубликат многоугольника из списка многоугольников, но как я могу удалить дубликат точки из списка точек, как многоугольник Shapely?
Я предполагаю, что возможно преобразовать это обратно в список, удалить дубликаты, и затем повторно преобразовать в Многоугольник.
Но это кажется слишком сложным. Есть идеи, как это сделать?
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
является избыточным, поскольку последняя точка совпадает с первой. Но на самом деле это не проблема, так как иначе Шейпли дублировал бы первую точку (чтобы закрыть границу многоугольника). Вы можете увидеть это с:
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)]