Shapely: parallel_offsetとbufferが輪郭を正しく閉じない

作成日 2018年02月06日  ·  4コメント  ·  ソース: Toblerity/Shapely

期待される動作と実際の動作。

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からインストール)

geos upstream bug

最も参考になるコメント

@ doctor-ianこれは興味深いアプリケーションであり、実際にPythonをクラッシュさせます。 ここのGEOSライブラリにはバグがあると思います。 平行オフセットは閉じたリング用に設計されていませんが、より適切に失敗するはずです。 一方、ポリゴンの負のバッファは次のように機能します。

untitled

全てのコメント4件

@ doctor-ianこれは興味深いアプリケーションであり、実際にPythonをクラッシュさせます。 ここのGEOSライブラリにはバグがあると思います。 平行オフセットは閉じたリング用に設計されていませんが、より適切に失敗するはずです。 一方、ポリゴンの負のバッファは次のように機能します。

untitled

@sgillies私はすでに根本的な問題が形になっていないことを恐れていました。 バッファについて:値が特定の負の値を超えている場合、つまり自己交差が発生した場合にも失敗します。 これもバグですか、それとも意図されたものですか?

バグだと思います。

C-APIでは、 GEOSOffsetCurve_rはLINESTRINGのみを受け入れるように文書化されています。 LinearRingsも受け入れたい場合は、何らかの方法でそのサポートを追加する必要があります。

このページは役に立ちましたか?
0 / 5 - 0 評価