Wenn Sie parallel_offset
oder buffer
, wird die resultierende Kontur manchmal nicht richtig geschlossen. Der Punkt, an dem die Kontur nicht richtig geschlossen ist, scheint immer der erste / letzte Punkt der Kontur zu sein.
Das Folgende ist ein Problem, das ich ursprünglich auf StackExchange gepostet habe.
Hier ist ein minimales Arbeitsbeispiel, das eine Kontur erzeugt, die bei Verwendung von parallel_offset
nicht geschlossen wird. Bei Verwendung von buffer
wird eine abgerundete Kante erstellt (trotz des Stils mitred
).
Seltsamerweise gibt es in meinem größeren Datensatz andere sehr ähnliche Konturen, die erfolgreich geschlossen werden.
import matplotlib.pyplot as plt
from shapely.geometry.polygon import LinearRing
def plot_line(ax, ob, color):
x, y = ob.xy
ax.plot(x, y, color=color, alpha=0.7, linewidth=3,
solid_capstyle='round', zorder=2)
polygon = [[-29.675, -30.675],
[-28.4094, -29.4094],
[-28.325, -29.325],
[-28.325, -29.764],
[-28.325, -29.7933],
[-28.4587, -29.8274],
[-28.4676, -29.8297],
[-28.5956, -29.8814],
[-28.6041, -29.8848],
[-28.724, -29.953],
[-28.732, -29.9576],
[-28.8417, -30.0413],
[-28.849, -30.0469],
[-28.9466, -30.1445],
[-28.9531, -30.151],
[-29.0368, -30.2607],
[-29.0424, -30.268],
[-29.1106, -30.3879],
[-29.1152, -30.3959],
[-29.1669, -30.5239],
[-29.1703, -30.5324],
[-29.2044, -30.6661],
[-29.2067, -30.675],
[-29.6457, -30.675],
[-29.675, -30.675]]
poly_line = LinearRing(polygon)
poly_line_offset = poly_line.parallel_offset(0.05, side="left", resolution=16,
join_style=2, mitre_limit=1)
# Alternative:
# poly_line_offset = poly_line.buffer(0.05, resolution=16, join_style=2, mitre_limit=1).exterior
fig = plt.figure()
ax = fig.add_subplot(111)
plot_line(ax, poly_line, "blue")
plot_line(ax, poly_line_offset, "green")
plt.show()
Windows 7, Python 3.6.2
Shapely 1.6.3 (von PyPI installiert)
@ Doctor-Ian Dies ist eine interessante Anwendung und stürzt in der Tat mein Python. Ich denke, hier gibt es einen Fehler in der GEOS-Bibliothek. Der parallele Versatz ist nicht für geschlossene Ringe ausgelegt, sollte jedoch eleganter ausfallen. Ein negativer Puffer eines Polygons funktioniert dagegen:
@sgillies Ich habe bereits befürchtet, dass das zugrunde liegende Problem nicht in Form ist. In Bezug auf den Puffer: Er schlägt auch fehl, wenn der Wert einen bestimmten negativen Wert überschreitet, dh wenn Selbstüberschneidungen auftreten. Ist das auch ein Fehler oder beabsichtigt?
Ein Fehler, denke ich.
In dem C-API, GEOSOffsetCurve_r wird dokumentiert nur Linienfolgen zu akzeptieren. Wenn wir auch LinearRings akzeptieren wollen, müsste diese Unterstützung irgendwie hinzugefügt werden.
Hilfreichster Kommentar
@ Doctor-Ian Dies ist eine interessante Anwendung und stürzt in der Tat mein Python. Ich denke, hier gibt es einen Fehler in der GEOS-Bibliothek. Der parallele Versatz ist nicht für geschlossene Ringe ausgelegt, sollte jedoch eleganter ausfallen. Ein negativer Puffer eines Polygons funktioniert dagegen: