Shapely: parallel_offset dan buffer tidak menutup kontur dengan benar

Dibuat pada 6 Feb 2018  ·  4Komentar  ·  Sumber: Toblerity/Shapely

Perilaku yang diharapkan dan perilaku yang sebenarnya.

Terkadang, saat menggunakan parallel_offset atau buffer , kontur yang dihasilkan tidak ditutup dengan benar. Titik di mana kontur tidak ditutup dengan benar sepertinya selalu menjadi titik pertama / terakhir kontur.

Berikut ini adalah masalah yang awalnya saya posting di StackExchange .

Langkah-langkah untuk mereproduksi masalah.

Berikut adalah contoh kerja minimal yang menghasilkan kontur yang tidak tertutup saat menggunakan parallel_offset . Saat menggunakan buffer , tepi bulat dibuat (meskipun gaya mitred ).
Anehnya, dalam kumpulan data saya yang lebih besar ada kontur lain yang sangat mirip yang berhasil ditutup.

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

Sistem operasi

Windows 7, Python 3.6.2

Versi dan Provenance Shapely

Shapely 1.6.3 (diinstal dari PyPI)

geos upstream bug

Komentar yang paling membantu

@ doctor-ian ini adalah aplikasi yang menarik dan bahkan membuat crash Python saya. Saya pikir ada bug di pustaka GEOS di sini. Offset paralel tidak dirancang untuk cincin tertutup, tetapi harus gagal dengan lebih baik. Sebaliknya, buffer negatif poligon berfungsi:

untitled

Semua 4 komentar

@ doctor-ian ini adalah aplikasi yang menarik dan bahkan membuat crash Python saya. Saya pikir ada bug di pustaka GEOS di sini. Offset paralel tidak dirancang untuk cincin tertutup, tetapi harus gagal dengan lebih baik. Sebaliknya, buffer negatif poligon berfungsi:

untitled

@sgillies Saya sudah takut bahwa masalah yang mendasarinya bukan pada bentuknya. Mengenai buffer: Ini juga gagal ketika nilainya melebihi nilai negatif tertentu, yaitu ketika terjadi perpotongan sendiri. Apakah ini juga bug atau disengaja?

Serangga, menurutku.

Di C-API, GEOSOffsetCurve_r didokumentasikan untuk hanya menerima LINESTRING. Jika kita ingin menerima LinearRings juga, maka dukungan itu perlu ditambahkan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat