यहां एक सामान्य समाधान है, जिसे आप पोस्टजीआईएस या किसी अन्य ओजीसी-अनुपालन सॉफ्टवेयर के साथ लागू कर सकते हैं।
नोट: जैसा कि मैंने पहले कहा , FOSS और GIS में एक प्रमुख अवधारणा मानकीकरण है : सबसे अच्छा समाधान मानकों को अपनाते हैं, जैसे OGC वाले।
आपकी समस्या "छद्म नोड्स ढूंढना" है ... लेकिन मुझे लगता है कि यह थोड़ा अधिक है, "गैर-छद्म नोड्स ढूंढें और छद्म नोड्स की रेखाओं में शामिल हों"। मेरे समाधान का उपयोग दोनों के लिए किया जा सकता है।
OGC मानकों की पेशकश:
ST_Boundary (geom) : लाइनों के नोड्स का पता लगाने के लिए
ST_Dump (geom) : प्रत्येक एकल नोड को SQL टेबल रिकॉर्ड में डालने के लिए।
ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap का उपयोग परिवर्तन सहिष्णुता के लिए किया जा सकता है। मैं ST_DWithin का उपयोग कर रहा हूं।
हम मान सकते हैं कि आपकी मुख्य समस्या इन वस्तुओं और गुणों के साथ निर्दिष्ट की जा सकती है,
एक लाइन सेगमेंट के (केवल एक टेबल लैनिनेशन के ) होते हैं, जो एक LINESTRING ज्यामिति द्वारा दर्शाया जाता है ... मैंने MULTILNE के साथ परीक्षण नहीं किया है, यदि आपके पास ज्यामिति = MULTIPOINT है, तो आप M_ILILINE को ST_Dump और ST_LineMerge से विभाजित और कास्ट कर सकते हैं;
प्रत्येक पंक्ति खंड में एक (ज्यामिति आईडी) gid और एक (रंग ID) आइडलाइन होती है ।
तो, पहला कदम उन नोड्स को प्राप्त करना है जो जुड़ने वाली लाइनों से आते हैं,
CREATE TABLE cache_bounds AS
SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
gid as color
-- if you not have something for "color label" of lines, use gid.
FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;
CREATE TABLE cache_joinnodes AS
-- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
SELECT *, array_length(colors,1) as ncolors FROM (
SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
SELECT
a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
, st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
FROM cache_bounds a, cache_bounds b
WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
-- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
GROUP BY a.gid, a.the_geom
) as t
) as t2;
नोट: कैश का उपयोग करना क्योंकि वे विचारों की तुलना में तेज़ हैं। CPU समय की जांच करने के लिए "EXPLAIN SELECT ..." का उपयोग करें, इसमें लंबा समय लग सकता है।
यहाँ चक्र और निरंतर (समान रंग) रेखाओं को ncolors=1
बिंदुओं के रूप में और ncolors=2
बिंदुओं द्वारा छद्म नोड्स का पता लगाया जाता है , इसलिए, आपके पास उस बिंदुओं के साथ एक परत है।
"अच्छे नोड्स" की आपकी तालिका मूल "बाउंडिंग पॉइंट्स" के साथ और "छद्म नोड्स" के बिना है।
CREATE VIEW vw_joinnodes_full AS
SELECT b.*, j.ncolors
FROM cache_joinnodes j INNER JOIN cache_bounds b
ON j.gid=b.gid;
CREATE TABLE cache_good_nodes AS
SELECT *
FROM vw_joinnodes_full
WHERE ncolors=1 OR ncolors>2;
-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ...