আমার জিজ্ঞাসা নিয়ে সমস্যা হচ্ছে। আমার কাছে লাইনস্ট্রিংয়ের একটি নেটওয়ার্ক রয়েছে, যার প্রতিটি এন_ টাইপ কলামে একটি মান রয়েছে। এটি মুষ্টিমেয় বিকল্পগুলির মধ্যে একটি হতে পারে। আমি একটি নতুন টেবিল তৈরি করতে চাই যা একই ধরণের যে কোনও লাইনস্ট্রিংগুলিকে গ্রুপ করে এবং এটি একটি অবিচ্ছিন্ন লাইন তৈরি করে।
আগে:
পরে:
আমি এখন পর্যন্ত যা পেয়েছি তা এখানে। এটি ফলাফলগুলি দেয় কিন্তু তারা কোনও ধারণা দেয় না - প্রকারগুলি মেলে না এবং এটি অনেকগুলি বৈশিষ্ট্য ফেরত দেয়।
দয়া করে নোট করুন যে আমি তার প্রতিবেশীর 5 ফুটের মধ্যে কোনও লাইন হিসাবে "ধারাবাহিক" সংজ্ঞায়িত করেছি এবং 30 ডিগ্রি কোণে মিটিং করেছি।
WITH 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 a.i + 1,
b.pk_uid,
b.n_type,
b.geom
FROM network b, all_links a
WHERE b.n_type = a.n_type
AND b.geom <#> a.geom <= 5 --lines are continuous if within 5 feet of neighbor
AND 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 ) --only take links within 30 degrees of the same angle
SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type
আমি ধরে নিয়েছি যে একটি পুনরাবৃত্তি ক্যোয়ারী যাওয়ার উপায়, তবে আমি এতে ভুল প্রমাণিত হতে পেরে খুশি। পুনরাবৃত্তিগুলি কুঁচকানো একটু কঠিন।
সম্পাদনা করুন: আমার আরও যোগ করা উচিত যে আমি ইতিমধ্যে ST_Uionion এবং ST_Line विसর ব্যবহার করে একত্রিত করার চেষ্টা করেছি এবং তারপরে ফলাফলটি ডাম্পিং করছি। এই ধরনের কাজ করে তবে 30 ডিগ্রি ছেদ করার জন্য অ্যাকাউন্ট করে না এবং সংযোগের জন্য পাঁচ ফুট সহনাকে সম্মানও করতে পারে না।
a.pk_uid != b.pk_uid