Shapely: متوازي_الإزاحة والمخزن المؤقت لا يغلقان ملامح بشكل صحيح

تم إنشاؤها على ٦ فبراير ٢٠١٨  ·  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

رشيقة الإصدار والمصدر

جميل 1.6.3 (مثبت من PyPI)

geos upstream bug

التعليق الأكثر فائدة

@ doctor-ian هذا تطبيق مثير للاهتمام وفي الحقيقة يعطل بايثون الخاص بي. أعتقد أن هناك خطأ في مكتبة GEOS هنا. الإزاحة المتوازية ليست مصممة للحلقات المغلقة ، ولكن يجب أن تفشل بطريقة أكثر رشاقة. من ناحية أخرى ، يعمل المخزن المؤقت السلبي للمضلع:

untitled

ال 4 كومينتر

@ doctor-ian هذا تطبيق مثير للاهتمام وفي الحقيقة يعطل بايثون الخاص بي. أعتقد أن هناك خطأ في مكتبة GEOS هنا. الإزاحة المتوازية ليست مصممة للحلقات المغلقة ، ولكن يجب أن تفشل بطريقة أكثر رشاقة. من ناحية أخرى ، يعمل المخزن المؤقت السلبي للمضلع:

untitled

sgillies كنت أخشى بالفعل أن المشكلة الأساسية ليست في شكل جميل. بخصوص المخزن المؤقت: يفشل أيضًا عندما تتجاوز القيمة قيمة سالبة معينة ، أي عند حدوث تقاطعات ذاتية. هل هذا أيضًا خطأ أم مقصود؟

خطأ ، على ما أعتقد.

في C-API، GEOSOffsetCurve_r تم توثيقه لقبول خطوط سلاسل فقط. إذا أردنا قبول LinearRings أيضًا ، فحينئذٍ يجب إضافة هذا الدعم بطريقة ما.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

chivasblue picture chivasblue  ·  3تعليقات

sgillies picture sgillies  ·  6تعليقات

sgillies picture sgillies  ·  5تعليقات

jrobichaud picture jrobichaud  ·  3تعليقات

benediktbrandt picture benediktbrandt  ·  3تعليقات