SpeaRy Polygon.Buffer (0) "теряет" половина моего галстука
-
22-12-2019 - |
Вопрос
Я видел в Интернете, этот буфер (0) должен «исправить» Bowties.Степельно находит точку пересечения бабочки, но держит только верхнюю правую часть.Ищете обходной путь, я попробовал обратный порядок моих очков.Удивительно (для меня), та же самая правая часть Боутина была еще одной сохраненной.Я не понимаю.Любая помощь оценила.
Я хотел бы сохранить всю бабочку как два треугольника (руда один шестигранный многогин - либо будет полезен).Ищете обходной путь для этой «проблемы».
#!/usr/bin/env python3
from shapely.geometry.polygon import Polygon
bowtie_plot = [(1, 0), (0, 1), (0, -1), (-1, 0)]
bowties = [
Polygon(bowtie_plot),
Polygon(bowtie_plot[::-1])
]
cleaned = [
bowties[0].buffer(0),
bowties[1].buffer(0)
]
print('cleaned[0] exterior = {}'.format(list(cleaned[0].exterior.coords)))
# cleaned[0] exterior = [(0.0, 0.0), (-1.0, 1.0), (1.0, 1.0), (0.0, 0.0)]
print('cleaned[1] exterior = {}'.format(list(cleaned[1].exterior.coords)))
# cleaned[1] exterior = [(0.0, 0.0), (-1.0, 1.0), (1.0, 1.0), (0.0, 0.0)]
# ADDITIONAL INFORMATION BELOW
# here's what shapely *can* do with intersecting lines:
# a star shape made of five intersecting lines and five points
from math import sin, cos, pi
star = Polygon(
[(cos(x*pi*4/5), sin(x*pi*4/5)) for x in range(5)]
).buffer(0)
# after buffering, becomes a star shape made out of ten lines and ten points
# shapely found all intersections and corrected the polygon.
print('list exterior = {}'.format(list(star.exterior.coords)))
.
После того, как мы думаем об этом, я могу понять , почему bowtie обрабатывается по-разному, чем звезда, но я заинтересован в поисках обходного пути.
Решение
Ваш бабочка не является действительным формированным формам Polygon .Прочтите эту документацию, а также документация для linearring (чуть выше документации Polygon
).В частности, обратите внимание на примеры действительных и недействительных генеракодичец.
Если вы создаете бабочку, как это:
In [46]: bt = [(1,0), (0,1), (0,0), (-1,0), (0, -1), (0,0)]
In [47]: poly = Polygon(bt)
.
Тогда LinearRing
возвращает a Мультиплогон :
In [48]: poly.buffer(0)
Out[48]: <shapely.geometry.multipolygon.MultiPolygon at 0x4a40050>
. Другие советы
buffer(0)
не всегда производит мультиполизм:
from shapely.wkt import loads
bt = loads('POLYGON ((0 0, 2 2, 2 0, 0 2, 0 0))')<br>
bt.buffer(0).wkt
produces 'POLYGON ((1 1, 2 2, 2 0, 1 1))'
.