في بعض الأحيان ، عند استخدام 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
جميل 1.6.3 (مثبت من PyPI)
@ doctor-ian هذا تطبيق مثير للاهتمام وفي الحقيقة يعطل بايثون الخاص بي. أعتقد أن هناك خطأ في مكتبة GEOS هنا. الإزاحة المتوازية ليست مصممة للحلقات المغلقة ، ولكن يجب أن تفشل بطريقة أكثر رشاقة. من ناحية أخرى ، يعمل المخزن المؤقت السلبي للمضلع:
sgillies كنت أخشى بالفعل أن المشكلة الأساسية ليست في شكل جميل. بخصوص المخزن المؤقت: يفشل أيضًا عندما تتجاوز القيمة قيمة سالبة معينة ، أي عند حدوث تقاطعات ذاتية. هل هذا أيضًا خطأ أم مقصود؟
خطأ ، على ما أعتقد.
في C-API، GEOSOffsetCurve_r تم توثيقه لقبول خطوط سلاسل فقط. إذا أردنا قبول LinearRings أيضًا ، فحينئذٍ يجب إضافة هذا الدعم بطريقة ما.
التعليق الأكثر فائدة
@ doctor-ian هذا تطبيق مثير للاهتمام وفي الحقيقة يعطل بايثون الخاص بي. أعتقد أن هناك خطأ في مكتبة GEOS هنا. الإزاحة المتوازية ليست مصممة للحلقات المغلقة ، ولكن يجب أن تفشل بطريقة أكثر رشاقة. من ناحية أخرى ، يعمل المخزن المؤقت السلبي للمضلع: