मुझे लगता है कि यह थोड़ा मुश्किल है, क्योंकि आपके दोनों बहुभुजों के अलग-अलग नोड सेट (हरे बहुभुज A, लाल बहुभुज B के अलग-अलग खंड) हैं। दोनों बहुभुजों के खंडों की तुलना करने से एक संकेत मिलता है कि बहुभुज B के किस खंड को संशोधित किया जाएगा।
नोड्स बहुभुज ए
"अलग" खंडों के नोड्स बहुभुज बी
दुर्भाग्य से यह केवल खंड संरचना में अंतर दिखाता है, लेकिन मुझे आशा है कि यह एक प्रारंभिक बिंदु है और यह इस तरह काम करता है:
एक डाउनलोड और अनजिप प्रक्रिया के बाद मैंने कमांड के साथ डेबियन लिनक्स जेसी के तहत PostgrSQL 9.46, PostGIS 2.1 का उपयोग करके डेटा सेट आयात किया है।
$ 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 के खंड B और इसके विपरीत में नहीं हैं, मैं दोनों बहुभुज सेटों के खंडों के बीच अंतर बनाने की कोशिश करता हूं, प्रत्येक समूह (A या B) में बहुभुज को खंड सदस्यता की उपेक्षा करता है। कई कारणों से मैंने कई दृश्यों में SQL सामान तैयार किया है।
इस जीआईएस-एसई पोस्ट के अनुरूप , मैं दोनों बहुभुजों को खंड तालिकाओं में विघटित करता हूं 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
उसी प्रक्रिया को बहुभुज बी पर लागू किया गया था।
-- 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}
। अंतर ए और बी के सेगमेंट सेट में सॉर्ट किए गए प्रारंभ या समाप्ति बिंदुओं की गैर-मौजूदगी द्वारा दिया जाता है।
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;
निष्कर्ष: लाल तीर के साथ चिह्नित छोटे छोटे खंडों के लिए एक उचित परिणाम प्राप्त करने के लिए, दोनों बहुभुजों में एक ही नोड स्ट्रॉकचर और एक नोड स्तर पर एक चौराहे कदम होना चाहिए (बी में बहुभुज ए के शीर्षों को सम्मिलित करना) आवश्यक है। इसके द्वारा किया जा सकता है:
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;
लेकिन अजीब परिणामों के साथ ...