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 .
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()
Windows 7, Python 3.6.2
Shapely 1.6.3 (diinstal dari PyPI)
@ 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:
@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.
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: