parallel_offset
またはbuffer
と、結果の輪郭が正しく閉じられない場合があります。 輪郭が正しく閉じられていない点は、常に輪郭の最初/最後の点のように見えます。
以下は私が最初にStackExchangeに投稿した
これは、 parallel_offset
を使用したときに閉じられない輪郭を生成する最小限の作業例です。 buffer
と、丸みを帯びたエッジが作成されます( mitred
スタイルにもかかわらず)。
不思議なことに、私のより大きなデータセットには、正常に閉じる他の非常によく似た輪郭があります。
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(PyPIからインストール)
@ doctor-ianこれは興味深いアプリケーションであり、実際にPythonをクラッシュさせます。 ここのGEOSライブラリにはバグがあると思います。 平行オフセットは閉じたリング用に設計されていませんが、より適切に失敗するはずです。 一方、ポリゴンの負のバッファは次のように機能します。
@sgillies私はすでに根本的な問題が形になっていないことを恐れていました。 バッファについて:値が特定の負の値を超えている場合、つまり自己交差が発生した場合にも失敗します。 これもバグですか、それとも意図されたものですか?
バグだと思います。
C-APIでは、 GEOSOffsetCurve_rはLINESTRINGのみを受け入れるように文書化されています。 LinearRingsも受け入れたい場合は、何らかの方法でそのサポートを追加する必要があります。
最も参考になるコメント
@ doctor-ianこれは興味深いアプリケーションであり、実際にPythonをクラッシュさせます。 ここのGEOSライブラリにはバグがあると思います。 平行オフセットは閉じたリング用に設計されていませんが、より適切に失敗するはずです。 一方、ポリゴンの負のバッファは次のように機能します。