Shapely: parallel_offset und buffer schließen Konturen nicht richtig

Erstellt am 6. Feb. 2018  ·  4Kommentare  ·  Quelle: Toblerity/Shapely

Erwartetes Verhalten und tatsächliches Verhalten.

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.

Schritte zum Reproduzieren des Problems.

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

Betriebssystem

Windows 7, Python 3.6.2

Formschöne Version und Provenienz

Shapely 1.6.3 (von PyPI installiert)

geos upstream bug

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:

untitled

Alle 4 Kommentare

@ 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:

untitled

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen