আপনার উভয় বহুভুজের বিভিন্ন নোড সেট (সবুজ বহুভুজ এ, পলিয়ন বি এর লাল বিভিন্ন বিভাগ) এর কারণে এটি কিছুটা জটিল বলে আমি মনে করি। উভয় বহুভুজগুলির বিভাগগুলির তুলনা করলে একটি সূত্র দেয় যা বহুভুজ বি এর অংশগুলিকে সংশোধন করা হবে।
নোড বহুভুজ A
"বিভিন্ন" বিভাগের বহুভুজ বি এর নোড
দুর্ভাগ্যক্রমে এটি কেবলমাত্র বিভাগের কাঠামোর মধ্যে পার্থক্য দেখায়, তবে আমি আশা করি এটি একটি প্রাথমিক পয়েন্ট এবং এটি এর মতো কাজ করে:
ডাউনলোড এবং আনজিপ প্রক্রিয়া শেষে আমি কমান্ডগুলি সহ ডেবিয়ান লিনাক্স জেসির অধীনে পোস্টগ্রিএসএসকিউএল 9.46, পোস্টজিআইএস ২.১ ব্যবহার করে ডেটা সেট আমদানি করেছি।
$ createdb gis-se
$ psql gis-se < /usr/share/postgis-2.1/postgis.sql
$ psql gis-se < /usr/share/postgis-2.1/spatial_ref_sys.sql
$ shp2pgsql -S polygon_a | psql gis-se
$ shp2pgsql -S polygon_b | psql gis-se
বহন করে যে বহুভুজ A এর বিভাগগুলি বি এবং ভাইস ভেরায় নেই, আমি উভয় বহুভুজ সেটের বিভাগগুলির মধ্যে পার্থক্য গড়ে তোলার চেষ্টা করি, প্রতিটি গ্রুপের (এ বা বি) বহুভুজগুলিতে বিভাগের সদস্যপদ অবহেলা করে। যুক্তিযুক্ত কারণে আমি এসকিউএল স্টাফগুলি বেশ কয়েকটি ভিউতে প্রস্তুত করি।
এই সংশ্লিষ্ট জিআইএস-দঃপূঃ পোস্টে , আমি সেগমেন্ট টেবিল মধ্যে উভয় বহুভুজ পচা segments_a
এবংsegments_b
-- Segments of the polygon A
CREATE VIEW segments_a AS SELECT sp, ep
FROM
-- extract the endpoints for every 2-point line segment for each linestring
(SELECT
ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp,
ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep
FROM
-- extract the individual linestrings
(SELECT (ST_Dump(ST_Boundary(geom))).geom
FROM polygon_a
) AS linestrings
-- be sure that nothing is scrambled
ORDER BY sp, ep
) AS segments;
সেগমেন্ট টেবিল বহুভুজ A:
SELECT
st_astext(sp) AS sp,
st_astext(ep) AS ep
FROM segments_a
LIMIT 3;
sp | ep
-------------------------------------------+--------------------------------------------
POINT(-292.268907321861 95.0342877387557) | POINT(-287.118411917425 99.4165242769195)
POINT(-287.118411917425 99.4165242769195) | POINT(-264.62129248575 93.2470010145007)
POINT(-277.459563916327 -44.5629543976138) | POINT(-292.268907321861 95.03428773875
একই পদ্ধতি বহুভুজ বিতে প্রয়োগ করা হয়েছিল to
-- Segments of the polygon B
CREATE VIEW segments_b AS SELECT sp, ep
FROM
-- extract the endpoints for every 2-point line segment for each linestring
(SELECT
ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp,
ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep
FROM
-- extract the individual linestrings
(SELECT (ST_Dump(ST_Boundary(geom))).geom
FROM polygon_b
) AS linestrings
-- be sure that nothing is scrambled
ORDER BY sp, ep
) AS segments;
সেগমেন্ট টেবিল বহুভুজ বি
SELECT
st_astext(sp) AS sp,
st_astext(ep) AS ep
FROM segments_b
LIMIT 3;
sp | ep
-------------------------------------------+-------------------------------------------
POINT(-292.268907321861 95.0342877387557) | POINT(-287.118411917425 99.4165242769195)
POINT(-287.118411917425 99.4165242769195) | POINT(-264.62129248575 93.2470010145007)
POINT(-277.459563916327 -44.5629543976138) | POINT(-292.268907321861 95.0342877387557)
...
আমি নামের একটি পার্থক্য টেবিল ভিউ তৈরি করতে পারি segments_diff_{a,b}
। পার্থক্যটি সেগমেন্ট সেট এ এবং বিতে বাছাই করা শুরু বা শেষ পয়েন্টগুলির অজানা দ্বারা দেওয়া হয়েছে A
CREATE VIEW segments_diff_a AS
SELECT st_makeline(b.sp, b.ep) as geom
FROM segments_b as b
LEFT JOIN segments_a as a ON (a.sp=b.sp and a.ep = b.ep)
-- filter segments without corresponding stuff in polygon A
WHERE a.sp IS NULL;
এবং পরিপূরক স্টাফ:
CREATE VIEW segments_diff_b AS
SELECT st_makeline(a.sp, a.ep) as geom
FROM segments_a as a
LEFT JOIN segments_b as b ON (a.sp=b.sp and a.ep = b.ep)
-- filter segments without corresponding stuff in polygon B
WHERE b.sp IS NULL;
উপসংহার: লাল তীরের সাহায্যে চিহ্নিত ছোট্ট ছোট্ট অংশগুলির জন্য উপযুক্ত ফলাফল পেতে, উভয় বহুভুজের নোড স্ট্রাকচারের সমান এবং নোড স্তরের একটি ছেদ পদক্ষেপ থাকতে হবে (বি-তে বহুভুজ A এর শীর্ষবৃত্ত সন্নিবেশ করানো) প্রয়োজনীয়। ছেদটি দ্বারা করা যেতে পারে:
CREATE VIEW segments_bi AS
SELECT distinct sp, ep
FROM (
SELECT
ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp,
ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep
FROM (
SELECT st_difference(b.seg, a.seg) as geom FROM
segments_diff_a as a, segments_diff_b as b
WHERE st_intersects(a.seg, b.seg)
) as cut
) as segments
WHERE sp IS NOT NULL AND ep IS NOT NULL
ORDER BY sp, ep;
তবে অদ্ভুত ফলাফল সহ ...