मुझे एक प्रश्न के साथ कठिनाई हो रही है। मेरे पास linestrings का एक नेटवर्क है, प्रत्येक में n_type कॉलम का मान है। यह मुट्ठी भर विकल्पों में से एक हो सकता है। मैं एक नई तालिका तैयार करना चाहता हूं, जो किसी भी प्रकार के अलंकरण समूह को एक ही प्रकार की हो और जो एक सतत रेखा बनाती हो।
इससे पहले:
उपरांत:
यहाँ मुझे अब तक क्या मिला है। यह परिणाम देता है, लेकिन उन्हें कोई मतलब नहीं है - प्रकार मेल नहीं खाते हैं और यह बहुत सारी सुविधाएँ देता है।
कृपया यह भी ध्यान दें कि मैंने "निरंतर" को अपने पड़ोसी के 5 फीट के भीतर किसी भी रेखा के रूप में परिभाषित किया है और 30 डिग्री से कम के कोण पर मिल रहा है।
WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
SELECT 1 AS i,
pk_uid,
n_type,
geom
FROM network
WHERE n_type != 'none'
UNION ALL
SELECT a.i + 1,
b.pk_uid,
b.n_type,
b.geom
FROM network b, all_links a
WHERE b.n_type = a.n_type
AND b.geom <#> a.geom <= 5 --lines are continuous if within 5 feet of neighbor
AND ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 ) --only take links within 30 degrees of the same angle
SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type
मैंने मान लिया है कि एक पुनरावर्ती क्वेरी जाने का रास्ता है, लेकिन मुझे उस पर गलत साबित होने की खुशी है। Recursives को खुरचना थोड़ा कठिन है।
संपादित करें: मुझे यह भी जोड़ना चाहिए कि मैंने पहले ही ST_Union और ST_Linemerge का उपयोग करके एकत्रीकरण की कोशिश की है, और फिर परिणाम को डंप कर रहा है। यह थोड़े काम करता है, लेकिन> 30 डिग्री चौराहों के लिए खाता नहीं है और कनेक्टिविटी के लिए पांच फुट की सहिष्णुता का सम्मान नहीं कर सकता है।
a.pk_uid != b.pk_uid