পোস্টজিআইএস ব্যবহার করে ছেদ করার ভিত্তিতে বহুভুজগুলি পৃথক করুন


36

আমার বহুভুজগুলির একটি পোস্টজিআইএস টেবিল রয়েছে যেখানে কিছু একে অপরের সাথে ছেদ করে। এটি আমি যা করার চেষ্টা করছি:

  • আইডি দ্বারা নির্বাচিত প্রদত্ত বহুভুজের জন্য, আমাকে যে বহুভুজ ছেদ করেছে তার সবগুলি আমাকে দিন। মূলত,select the_geom from the_table where ST_Intersects(the_geom, (select the_geom from the_table where source_id = '123'))
  • এই বহুভুজগুলি থেকে আমার এমন একটি নতুন বহুভুজ তৈরি করা দরকার যাতে ছেদটি একটি নতুন বহুভুজ হয়ে যায়। সুতরাং বহুভুজ A যদি বহুভুজ বি এর সাথে ছেদ করে, আমি 3 টি নতুন বহুভুজ পাব: একটি বিয়োগ বিহীন, এবি, এবং বি বিয়োগ AB।

কোন ধারনা?


1
হুম, আমি মনে করি আপনি কী পাচ্ছেন তা দেখুন তবে একটি সাধারণ গ্রাফিক আপনার (এবং অন্যদের) ঠিক কী চান তা দেখতে সহায়তা করতে আশ্চর্য কাজ করতে পারে।
জেসন

আমার উত্তরে কিছু যুক্ত হয়েছে।
অ্যাডাম মাতান 2'10

উত্তর:


29

যেহেতু আপনি বলেছিলেন যে প্রতিটি বহুভুজকে আপনি আগ্রহী তার জন্য ছেদ করার বহুভুজ একটি গ্রুপ পেয়েছেন, তাই আপনি "বহুভুজ ওভারলে" হিসাবে চিহ্নিত এমনটি তৈরি করতে চাইতে পারেন।

অ্যাডামের সমাধানটি ঠিক এটি করছে না। পার্থক্যটি দেখতে, একটি এবিসি ছেদ করার এই চিত্রটি একবার দেখুন:

এবিসি মোড়

আমি বিশ্বাস করি যে অ্যাডামের সমাধানটি একটি "এবি" বহুভুজ তৈরি করবে যা "এবি! সি" এবং "এবিসি" উভয় অঞ্চল জুড়ে, পাশাপাশি "এসি" বি "এবং" এবিসি "জুড়ে একটি" এসি "বহুভুজ এবং একটি" বিসি "বহুভুজ যা" বিসি! এ "এবং" এবিসি "। সুতরাং "এবি", "এসি" এবং "বিসি" আউটপুট বহুভুজগুলি সমস্ত "এবিসি" অঞ্চলকে ওভারল্যাপ করে।

একটি বহুভুজ ওভারলে নন-ওভারল্যাপিং বহুভুজ উত্পাদন করে, সুতরাং এবি! সি একটি বহুভুজ এবং এবিসি হবে একটি বহুভুজ।

পোস্টজিআইএসে বহুভুজ ওভারলে তৈরি করা আসলে বেশ সোজা is

মূলত তিনটি ধাপ রয়েছে।

পদক্ষেপ 1 লাইনওয়ার্ক নিষ্কাশন করা হয়েছে [নোট করুন যে আমি বহুভুজের বহিরাগত রিংটি ব্যবহার করছি , আপনি যদি সঠিকভাবে গর্তগুলি পরিচালনা করতে চান তবে এটি কিছুটা জটিল হয়ে উঠবে]:

SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines

পদক্ষেপ 2 লাইনওয়ার্কটি "নোড" করা (প্রতিটি ছেদে নোড উত্পাদন করা)। মত কিছু লাইব্রেরি JTS "Noder" ক্লাস আপনি এই কাজ করতে ব্যবহার করতে পারেন, কিন্তু PostGIS মধ্যে ST_Union ফাংশন তোমার জন্য এটা আছে:

SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines

পদক্ষেপ 3 হ'ল এস- পলজিওনাইজ ফাংশন দ্বারা সম্পন্ন সমস্ত লাইন থেকে আসা সমস্ত সম্ভাব্য অ-ওভারল্যাপিং বহুভুজ তৈরি করা :

SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)

আপনি এই পদক্ষেপগুলির প্রত্যেকটির আউটপুট একটি টেম্প টেবিলের মধ্যে সংরক্ষণ করতে পারেন বা আপনি সেগুলি একক বিবৃতিতে একত্রিত করতে পারেন:

CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
    SELECT ST_Polygonize(the_geom) AS the_geom FROM (
        SELECT ST_Union(the_geom) AS the_geom FROM (
            SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
        ) AS noded_lines
    )
)

আমি এস এসডাম্প ব্যবহার করছি কারণ এস এসপলিগোনাইজের আউটপুটটি জ্যামিতি সংগ্রহ এবং এটি প্রতিটি সারিটিতে বহুভুজগুলির মধ্যে একটি বহুভুজ যা একটি বহুভুজ ওভারলে তৈরি করে এমন একটি টেবিল রাখা (সাধারণত) বেশি সুবিধাজনক।


নোট করুন যে ST_ExteriorRingকোনও গর্ত ড্রপ। ST_Boundaryঅভ্যন্তরের রিংগুলি সংরক্ষণ করবে তবে এটি তাদের ভিতরে বহুভুজ তৈরি করবে।
jpmc26

বহিরাগত রিংগুলির ইউনিয়ন ক্র্যাশ হয় যখন খুব বেশি বহুভুজ থাকে। দুর্ভাগ্যজনকভাবে এই "সোজাসাপ্টা" সমাধানটি কেবল ছোট কভ্রেজের জন্য কাজ করে।
পিয়েরে র্যাসিন

13

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি নিতে চান (এ বাম জ্যামিতি, বি ডানদিকে):

A∪B এর চিত্র http://img838.imageshack.us/img838/3996/intersectab1.png

এবং নিষ্কাশন:

একজন ∖ এবি

A ∖ AB এর চিত্র http://img830.imageshack.us/img830/273/intersectab2.png

এবি

এবি এর চিত্র http://img828.imageshack.us/img828/7413/intersectab3.png

এবং বি ∖ এ বি

বি এ বি এর চিত্র http://img839.imageshack.us/img839/5458/intersectab4.png

তা হ'ল প্রতিটি ছেদকারী জোড়ের জন্য তিনটি পৃথক জ্যামিতি।

প্রথমে সমস্ত ছেদ করা জ্যামিতির একটি দৃশ্য তৈরি করা যাক। আপনার টেবিলের নামটি ধরে নিলে polygons_tableআমরা ব্যবহার করব:

CREATE OR REPLACE VIEW p_intersections AS    -- Create a view with the 
SELECT t1.the_geom as t1_geom,               -- intersecting geoms. Each pair
       t2.the_geom as t2_geom                -- appears once (t2.id<t2.id)
    FROM polygons_table t1, polygons_table t2  
         WHERE t1.id<t2.id AND t1.the_geom && t2.the_geom 
                           AND intersects t1.the_geom, t2.the_geom;

এখন আমাদের কাছে একটি দর্শন (ব্যবহারিকভাবে, কেবল একটি পঠনযোগ্য সারণী) আছে যা ছেদকারী রত্নগুলির জুড়ি সঞ্চয় করে, যেখানে প্রতিটি জুটি t1.id<t2.idশর্তের কারণে কেবল একবার উপস্থিত হয় ।

- এখন চল আপনার ছেদ জড়ো করা A∖AB, ABএবং B∖ABএসকিউএল এর ব্যবহার করে, UNIONসব তিনটি প্রশ্নের উপর

--AB:
SELECT ST_intersection(t1.the_geom, t2.the_geom) 
    AS geom 
    FROM p_intersections

UNION 

--AAB:
SELECT ST_Difference(t1.the_geom, t2.the_geom) 
    AS geom 
    FROM p_intersections

UNION

--BAB:
SELECT ST_Difference(t2.the_geom, t1.the_geom) 
    AS geom 
    FROM p_intersections;

নোট:

  1. &&অপারেটর সামনে একটি ফিল্টার হিসেবে ব্যবহার করা হয় intersectsপারফরম্যান্সের উন্নতি করতে, অপারেটর।
  2. আমি VIEWএকটি বিশাল জিজ্ঞাসার পরিবর্তে একটি তৈরি করতে বেছে নিয়েছি ; এটি কেবল সুবিধার জন্য।
  3. যদি আপনি বোঝাতে চেয়েছিলেন ABইউনিয়ন, ছেদ না, Aএবং B- UNIONউপযুক্ত জায়গায় কোয়েরিতে st_inters পরিবর্তে ST_Union ব্যবহার করুন ।
  4. চিহ্ন স্থাপন পার্থক্য জন্য একটি ইউনিকোড নিদর্শন রয়েছে; কোড থেকে এটি সরিয়ে ফেলুন যদি এটি আপনার ডাটাবেসটিকে বিভ্রান্ত করে।
  5. ছবি সৌজন্যে উইকিমিডিয়া কমন্সের 'চমৎকার সেট তত্ত্ব বিভাগ


সুন্দর ব্যাখ্যা! ফলাফল স্ক্রু সমাধানের মতো একই, তবে তার উপায়টি দ্রুত হওয়া উচিত (এ এবং বি এর অতিরিক্ত
ছেদগুলি

ধন্যবাদ! আমি মনে করি যে আমি কোনও অতিরিক্ত তথ্য সঞ্চয় করি না, কারণ আমি কেবল সারণী নয়, এসকিউএল ভিউ তৈরি করি।
অ্যাডাম মতান

হ্যাঁ, এটি সত্য, তবে আপনি A এবং B এর অতিরিক্ত
ছেদগুলি

5
এই উত্তরের চিত্রগুলি আর কাজ করে না।
ফেজার

8

আপনি যা বর্ণনা দিচ্ছেন সেটি হল ইউনিয়ন অপারেটর আর্কজিআইএসে যেভাবে কাজ করে তবে এটি জিইওএস বিশ্বের ইউনিয়ন বা ছেদকীর চেয়ে কিছুটা আলাদা। শেপলি ম্যানুয়ালটিতে জিওএস-এ কীভাবে সেটগুলি কাজ করে তার উদাহরণ রয়েছে । তবে পোস্টজিআইএস উইকির লাইনওয়ার্ক ব্যবহার করে একটি ভাল উদাহরণ রয়েছে যা আপনার জন্য কৌশলটি করা উচিত।

বিকল্পভাবে, আপনি তিনটি জিনিস গণনা করতে পারেন:

  1. ST_ অন্তর্নিহিত (geom_a, geom_b)
  2. ST_Differences (geom_a, geom_b)
  3. ST_Differences (geom_b, geom_a)

আপনার দ্বিতীয় বুলেট পয়েন্টে আপনি উল্লেখ করেছেন এমন তিনটি বহুভুজ হওয়া উচিত।


2
পোস্টজিআইএসের উইকির উদাহরণটি ভাল
২৩:৪১

ছেলেরা না ছড়িয়ে দিলে কি এস-ইন্টেরেক্টসগুলি বুলিয়ানটি ফেরত দেবে না? আমি মনে করি ST_Intersication কাজ করবে।
জেসন

হ্যাঁ, আমার অংশে টাইপ করুন - আসলটিতে এখন ঠিক করা হয়েছে, ধন্যবাদ জেসন!
স্ক্য করুন

-2

কিছুটা এইরকম:

নতুন_সারণযোগ্য ভ্যালুতে অন্তর্ভুক্ত করুন (পুরানো_ টেবিল থেকে আইডি নির্বাচন করুন, যেখানে_সামগ্রীগুলি (the_geom, (পুরানো_ট্যাবল থেকে আইডি = '123') থেকে the_geom নির্বাচন করুন) = সত্য

সম্পাদনা: আপনার বহুভুজের আসল ছেদ প্রয়োজন।

নতুন_সারণযোগ্য মান অন্তর্ভুক্ত করুন (আইডি নির্বাচন করুন, এসT_ আন্তঃসংযোগ (the_geom, (পুরানো থেকে আইডি = 123 নির্বাচন করুন))

দেখুন যে কাজ করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.