أكثر

استعلام تكراري PostGIS على أساس اتصال الخط

استعلام تكراري PostGIS على أساس اتصال الخط


أواجه صعوبة في الاستعلام. لدي شبكة من السلاسل الخطية ، ولكل منها قيمة في العمود n_type. يمكن أن يكون هذا أحد الخيارات القليلة. أرغب في إنشاء جدول جديد يجمع أي سلاسل سطرية من نفس النوع والتي تشكل خطًا متواصلًا.

قبل:

بعد، بعدما:

إليكم ما لدي حتى الآن. تقوم بإرجاع نتائج لكنها لا معنى لها - الأنواع لا تتطابق وتعيد العديد من الميزات.

يرجى أيضًا ملاحظة أنني قمت بتعريف "مستمر" على أنه أي خط يقع في نطاق 5 أقدام من جاره ويلتقي بزاوية أقل من 30 درجة.

مع RECURSIVE all_links (i، pk_uid، n_type، geom) AS (SELECT 1 AS i، pk_uid، n_type، geom FROM network WHERE n_type! = 'none' UNION ALL SELECT ai + 1، b.pk_uid، b.n_type، b. geom من الشبكة b ، all_links a حيث b.n_type = a.n_type AND b.geom <#> a.geom <= 5 - تكون الخطوط متصلة إذا كانت على بُعد 5 أقدام من الجار و ABS (DEGREES (3 * pi () - st_azimuth (st_startpoint (a.geom) ، st_endpoint (a.geom)) + st_azimuth (st_startpoint (b.geom) ، st_endpoint (b.geom))) :: int٪ 360-180) <= 30) - خذ فقط الروابط ضمن 30 درجة من نفس الزاوية حدد i، n_type، ST_Union (the_geom) من all_links GROUP BY i، n_type

لقد افترضت أن الاستعلام التعاودي هو السبيل للذهاب ، ولكن يسعدني أن أكون مخطئًا في ذلك. من الصعب بعض الشيء التملص من العودية.

تحرير: يجب أن أضيف أيضًا أنني حاولت بالفعل التجميع باستخدام ST_Union و ST_Linemerge ، ثم التخلص من النتيجة. يعمل هذا نوعًا ما ، ولكنه لا يأخذ في الحسبان تقاطعات أكثر من 30 درجة ولا يمكنه أيضًا احترام التسامح بخمسة أقدام للاتصال.


الحل الخاص بك ، على الأقل ، يفتقد إلى الطلب المسبق لمكونات الخط كما قال جون برشلونة.

من الصعب جدًا جدًا تذوق الاستعلامات التكرارية ، كما يمكنني القول.

يجب أن تحاول إجراء نسخ متماثل لسلوك ST_Linemerge في دالة قاعدة بيانات جديدة. سأحاول أولاً إلقاء نظرة على مصدر تنفيذ ST_Linemerge وتكرارها ، مع تغييرها لإنتاج نشل بزاوية 30 درجة.

لتجاهل المقاطع التي ليست بزاوية <30 درجة من التجميع ، يجب مقارنتها داخل حلقة تجميع.