আমি পার্সেল (বহুভুজ) স্তরে সংলগ্ন পরীক্ষা করতে চাই এবং যদি তারা নির্দিষ্ট মানদণ্ডে (আকার হতে পারে) ফিট করে তবে সেগুলিকে একীভূত করতে চাই। নীচের ছবি অনুসারে, আমি বহুভুজ 1,2,3 এবং 4 একত্রিত করতে চাই, তবে 5 নয় ।
আমার দুটি সমস্যা আছে:
ST_TOUCHES
সত্য যদি সত্যায়িত হয় যদি কেবল কোণগুলি স্পর্শ করে এবং একটি রেখাংশ নেই। আমি মনে করি ভাগ করা লাইন বিভাগগুলি পরীক্ষা করার জন্য আমার ST_RELATE প্রয়োজন।- আদর্শভাবে, আমি সমস্ত সংলগ্ন বহুভুজকে একের সাথে একীভূত করতে চাই, তবে আমি নিশ্চিত না যে কীভাবে দুটি ছাড়িয়ে স্কেল করা যায় - হিসাবে, 1,2,3 এবং 4 (এবং সম্ভবত প্রকৃত তথ্যের উপর আরও বেশি) এক রাউন্ডে মার্জ করুন।
আমার এখন যে কাঠামো রয়েছে তা স্ব-যোগদানের উপর ভিত্তি করে ST_TOUCHES
।
খেলনা তথ্য
CREATE TABLE testpoly AS
SELECT
1 AS id, ST_PolyFromText('POLYGON ((0 0, 10 0, 10 20, 00 20, 0 0 ))') AS geom UNION SELECT
2 AS id, ST_PolyFromText('POLYGON ((10 0, 20 0, 20 20, 10 20, 10 0 ))') AS geom UNION SELECT
3 AS id, ST_PolyFromText('POLYGON ((10 -20, 20 -20, 20 0, 10 0, 10 -20 ))') AS geom UNION SELECT
4 AS id, ST_PolyFromText('POLYGON ((20 -20, 30 -20, 30 0, 20 0, 20 -20 ))') AS geom UNION SELECT
5 AS id, ST_PolyFromText('POLYGON ((30 0, 40 0, 40 20, 30 20, 30 0 ))') AS geom ;
নির্বাচন
SELECT
gid, adj_gid,
st_AStext(st_union(l2.g1,l2.g2)) AS geo_combo
from (
--level 2
SELECT
t1.id AS gid,
t1.geom AS g1,
t2.id AS adj_gid,
t2.geom AS g2
from
testpoly t1,
testpoly t2
where
ST_Touches( t1.geom, t2.geom )
AND t1.geom && t2.geom
)
l2
এখানে ফলাফল:
+-----+---------+-------------------------------------------------------------------------------+
| gid | adj_gid | geo_combo |
+-----+---------+-------------------------------------------------------------------------------+
| 1 | 2 | POLYGON((10 0,0 0,0 20,10 20,20 20,20 0,10 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 1 | 3 | MULTIPOLYGON(((10 0,0 0,0 20,10 20,10 0)),((10 0,20 0,20 -20,10 -20,10 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 1 | POLYGON((10 20,20 20,20 0,10 0,0 0,0 20,10 20)) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 3 | POLYGON((10 0,10 20,20 20,20 0,20 -20,10 -20,10 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 4 | MULTIPOLYGON(((20 0,10 0,10 20,20 20,20 0)),((20 0,30 0,30 -20,20 -20,20 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 1 | MULTIPOLYGON(((10 0,20 0,20 -20,10 -20,10 0)),((10 0,0 0,0 20,10 20,10 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 2 | POLYGON((20 0,20 -20,10 -20,10 0,10 20,20 20,20 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 4 | POLYGON((20 -20,10 -20,10 0,20 0,30 0,30 -20,20 -20)) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 2 | MULTIPOLYGON(((20 0,30 0,30 -20,20 -20,20 0)),((20 0,10 0,10 20,20 20,20 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 3 | POLYGON((20 0,30 0,30 -20,20 -20,10 -20,10 0,20 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 5 | MULTIPOLYGON(((30 0,30 -20,20 -20,20 0,30 0)),((30 0,30 20,40 20,40 0,30 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 5 | 4 | MULTIPOLYGON(((30 0,30 20,40 20,40 0,30 0)),((30 0,30 -20,20 -20,20 0,30 0))) |
+-----+---------+-------------------------------------------------------------------------------+
নোট করুন যে বহুভুজ আইডি = 3 আইডি = 1 এর সাথে একটি পয়েন্ট ভাগ করে এবং তাই ইতিবাচক ফলাফল হিসাবে ফিরে আসে। আমি যদি WHERE ধারাটি পরিবর্তন করি তবে আমি ST_Touches( t1.geom, t2.geom ) AND t1.geom && t2.geom AND ST_Relate(t1.geom, t2.geom ,'T*T***T**');
কোনও রেকর্ড পাই না।
সুতরাং প্রথমে , আমি কীভাবে ST_ সম্পর্কিত উল্লেখ করব তা নিশ্চিত করার জন্য যে কোনও লাইন বিভাগ ভাগ করে নেওয়া কেবল পার্সেল বিবেচনা করা হবে।
এবং তারপরে, আমি কীভাবে উপরের কল থেকে ফলাফলগুলি ভেঙে এক রাউন্ডে 1,2,3,4 বহুভুজগুলি একীভূত করব, যখনই 1 থেকে 2 সংলগ্নতা বিপরীত হিসাবে স্বীকৃত হবে?
হালনাগাদ
যদি আমি এই where
শৃঙ্খলে যুক্ত করি তবে আমি কেবল বহুভুজ পেয়েছি এবং মাল্টিপলিজাগন না পেয়ে এইভাবে আমার উদ্দেশ্যে মিথ্যা ধনাত্মকতা ছড়িয়ে দিচ্ছি - কোণার স্পর্শগুলি উপেক্ষা করা হবে।
GeometryType(st_union(t1.geom,t2.geom)) != 'MULTIPOLYGON'
যদিও এটি আদর্শ নয় (আমি বরং টপোলজি চেকগুলি ST_RELATE
আরও সাধারণ সমাধান হিসাবে ব্যবহার করব ), এটি এগিয়ে যাওয়ার এক উপায়। তারপরে এগুলি ডি-ডুপিং এবং ইউনিয়ন করার বিষয়টি রয়ে গেছে। সম্ভবত, যদি আমি কেবল বহুভুজ স্পর্শের জন্য একটি ক্রম উত্পন্ন করতে পারি তবে আমি এটিতে মিলিত হতে পারি।
আপডেট দ্বিতীয়
এইটি বহুভুজ ভাগ করে নেওয়ার লাইনগুলি নির্বাচনের জন্য কাজ করছে বলে মনে হচ্ছে (তবে কোণ নয়) এবং এটি উপরের MULTIPOLYGON
পরীক্ষার চেয়ে আরও সাধারণ সমাধান । আমার যেখানে এখন ধারাটি দেখতে এটির মতো দেখাচ্ছে:
WHERE
ST_Touches( t1.geom, t2.geom )
AND t1.geom && t2.geom
-- 'overlap' relation
AND ST_Relate(t1.geom, t2.geom)='FF2F11212') t2
এখন যা অবশিষ্ট রয়েছে তা কেবল একজোড়া বহুভুজের চেয়ে বেশি কীভাবে একীভূত করা যায় তা নয়, তবে একসাথে মানদণ্ডের সাথে মানিয়ে নেওয়া একটি স্বেচ্ছাসেবী সংখ্যার জন্য।
ST_IntersectionArray
: [ফাংশন] [1] ST_Union [1] এর সাথে কাজ করা gis.stackexchange.com/a/60295/36886