सबसे छोटे नेटवर्क की गणना कैसे करें जो PostGIS का उपयोग करके सभी बिंदुओं को जोड़ता है?


13

मेरे पास पोस्टगिस लिपियों का एक सेट है जो दो तालिकाओं को उत्पन्न करता है - एक अंक का सेट और दूसरा सड़कों का एक सेट जो उन्हें घेरता है। सभी डेटा एक ही प्रक्षेपण में है और दोनों आउटपुट पोस्टगिस 2.1 के साथ 9.2 तालिकाओं में संग्रहीत हैं

सड़क नेटवर्क की पगाउटिंग टोपोलॉजी बनाई गई है और पॉइंट टेबल में एक स्तंभ है जिसमें निकटतम सड़क खंड है।

मैं तब सड़क नेटवर्क का एक सबसेट बनाना चाहता हूं जो सबसे छोटे नेटवर्क का प्रतिनिधित्व करता है जो न्यूनतम फैले हुए पेड़ की तरह कुछ का उपयोग करके सभी बिंदुओं को जोड़ता है। सड़क नेटवर्क अप्रत्यक्ष है, और लागत केवल मार्ग की लंबाई है।

मैं मॉड्यूल के v.net परिवार का उपयोग करके QGIS / Grass में ऐसा कर सकता हूं, लेकिन आदर्श रूप से मैं इस अंतिम चरण को SQL में भी रखना चाहूंगा।

मैंने नए apspWarshall postgis फ़ंक्शन को देखा है, लेकिन मैं एक नुकसान में हूं कि यह कैसे अपनी ऊर्जा को बिंदुओं को जोड़ने पर ध्यान केंद्रित करने के लिए प्रोत्साहित किया जा सकता है और पूरे नेटवर्क पर नहीं।

यह लघु स्क्रिप्ट है जिसे मैंने इसे हल करने के लिए एक फ्रेमवर्क बनाने के प्रयास में एक साथ रखा है, लेकिन मैं यह नहीं देख सकता हूं कि किनारों के सबसेट के साथ शुरू करने के लिए फ़ंक्शन को केंद्रित करना कहां संभव है।

SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM   pgr_apspWarshall('SELECT gid AS id, 
                                source, 
                                target, 
                                st_length(the_geom) AS cost 
                         FROM   road_network
                        ',
                        false, false
                       ) AS tree
JOIN   road_network As roads
ON     tree.id2 = roads.gid

एकल पथ सबसे छोटी पथ समस्याओं में फ़ंक्शन प्रारंभ और समाप्ति के लिए पूछता है, लेकिन स्पष्ट रूप से सभी बिंदु समस्याओं में नहीं। समान रूप से ग्रास में v.net.spanningtree और v.net.steiner के साथ काम करने के लिए एक संयुक्त नेटवर्क के रूप में बिंदुओं और लाइनों के एक सेट की उम्मीद है।

क्या किसी के पास PostGIS में ऐसा करने के लिए कोई सुझाव है?


मुझे यकीन नहीं है कि मैं सवाल समझता हूं, लेकिन क्या docs.pgrout.org/2.0/en/src/tsp/doc/index.html#pgr-tsp ट्रैवलिंग सेल्स पर्सन एल्गोरिथम आपकी मदद करता है?
सिंप्लेक्सियो

1
धन्यवाद। यह वास्तव में मुझे डर नहीं है। ट्रैवलिंग सेल्समैन एक बी से सी तक की यात्रा और एक रैखिक फैशन में आगे बढ़ता है। मैं जो चाहता हूं वह न्यूनतम नेटवर्क है जो हर बिंदु को कुशलता से जोड़ता है, ताकि कोई भी बिंदु ज्ञान के किसी अन्य बिंदु पर यात्रा शुरू कर सके कि खो जाने के लिए कोई शानदार रास्ते नहीं हैं। अन्य प्लेटफार्मों में यह आमतौर पर न्यूनतम स्पैनिंग ट्री फ़ंक्शन, स्टेनर ट्री ( en.wikipedia.org/wiki/Steiner_tree_problem ) या इसी तरह के साथ किया जाता है। यदि आप चाहें, तो TSP लॉजिस्टिक्स कंपनी के लिए बहुत अच्छा है, लेकिन मैं उन सड़कों की योजना बनाना चाहता हूं, जिनका वे उपयोग करेंगे।
एड्रियन

जवाबों:


2

यह उत्तर पूर्ण या परीक्षणित नहीं है, लेकिन कुछ इस तरह आज़माएँ:

प्रश्नों के अनुसार / 39210 :

with index_query as (
SELECT
        ,ST_Distance(i.geom, i.b_geom) AS dist
        ,ST_MakeLine(i.geom, i.b_geom) as geom
FROM(
SELECT
        ,a.geom
        ,b.geom AS b_geom
        ,rank() OVER (PARTITION BY a.id ORDER BY ST_Distance(a.centroid_geom, b.the_geom)) AS pos
FROM points a, points b 
WHERE a.id <> b.id) i
WHERE pos = 1
) select ST_Union(geom) from index_query;

मुझे लगता है कि यह बहुत कुशल नहीं है।


वास्तव में इस की सराहना करते हैं - धन्यवाद। यह मुझे कुछ नए कोणों का पता लगाने के लिए दिया है जिनके बारे में मैंने नहीं सोचा था। यह कोड अंक तालिका से निकटतम असंबद्ध पड़ोसियों को ढूंढेगा। मेरे द्वारा जोड़ी गई जटिलता यह है कि मेरे मामले में अंक अलंकारों के एक नेटवर्क के साथ जुड़े हुए हैं, लेकिन मुझे आश्चर्य है कि अगर मैं ST_Distance क्वेरी को एक pgRout सड़क दूरी से बदल सकता हूं, हालांकि यह एक अनियंत्रित बिंदु क्वेरी की तुलना में काफी धीमा होगा।
एड्रियन

2

@ एड्रियन, मैं वास्तव में pgrouting परिणामों से अपरिचित हूँ, हालाँकि प्रलेखन बहुत विस्तृत है। मेरा जवाब दो-चरणीय फ़ंक्शन पर आधारित है, जो कि SQL में बहुत अधिक अपर्याप्त होगा लेकिन [संभावना] परिणाम उत्पन्न करता है। यह [अप्रयुक्त] समाधान ऑप्टिमाइज़ नहीं करेगा जो सबसे अच्छा शुरुआती बिंदु है, लेकिन पूरे मार्ग नेटवर्क को केवल किनारों तक कम कर देगा जो सभी स्टॉप को जोड़ता है, फिर सभी स्टॉप के लिए कुशलतापूर्वक रूट करता है।

चरण 1 (एक सड़क नेटवर्क सबसेट का उप-चयन जो सभी स्टॉप को जोड़ता है) यह पथों के संग्रह को वापस करने के लिए कई-गंतव्य (K Dijkstr पथ) रूटिंग फ़ंक्शन का उपयोग करता है जो (जब लागत <> -1) वास्तव में आपके सभी कनेक्ट करते हैं बंद हो जाता है।

SELECT id1 as path, st_astext(st_linemerge(st_union(b.the_geom))) as the_geom
FROM pgr_kdijkstraPath(
SELECT id, source, target, cost FROM edge_table’,
min(all_your_stop_ids), [array_of_all_your_stop_ids], false, false
) a,
edge_table b
WHERE a.id3=b.id
GROUP by id1
ORDER by id1

मेरे यहाँ समस्या यह है कि आपके स्टॉप टेबल से एक सरणी को असेंबल करने के लिए वाक्यविन्यास है, क्योंकि यह वास्तव में प्रश्न में वर्णित नहीं था। हालाँकि, मान लेते हैं कि SQL सिंटैक्स उस ऐरे को इकट्ठा कर सकता है और न्यूनतम K स्टॉप को सभी K पथों के लिए शेष लक्ष्य स्टॉप्स के लिए प्रारंभिक बिंदु होना चाहिए।

चरण 2 (उप सबसे ऊपर सड़क नेटवर्क पथों पर आधारित न्यूनतम पथों का अंतिम चयन जो सभी स्टॉपों को जोड़ता है) यह अनिवार्य रूप से आपके साथ शुरू हुआ है, लेकिन मैं प्रस्ताव करता हूं कि आप आईडी 1 (पथ) पर प्रारंभिक परिणाम के लिए अपने सड़क नेटवर्क को समान करें ताकि अंतिम फील्ड-वारशाल रूटिंग में केवल सड़कों के उपसमुच्चय का उपयोग किया जाए :

SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM   pgr_apspWarshall('SELECT R.gid AS id, 
                                R.source, 
                                R.target, 
                                st_length(R.the_geom) AS cost 
             FROM   road_network AS R JOIN
                   (SELECT id1 as path
                     FROM pgr_kdijkstraPath(
                            ’SELECT id, source, target, cost FROM edge_table’,
                            min(all_your_stop_ids), 
                            [array_of_all_your_stop_ids], false, false
                           ) a,
                     edge_table b
                    WHERE a.id3=b.id
                    GROUP by id1
                    ORDER by id1
                        ',
                        false, false
                  ) AS  Just_K_Paths
         on R.id1 = just_K_paths.id1',       /* this join reduces R down to K paths */
         false, false
        ) AS tree
  JOIN   road_network As roads
  ON     tree.id2 = roads.gid

तो, सारांश में ... आंतरिक k_dijkstra_path रूटिंग क्वेरी कुल रोड नेटवर्क को केवल आपके सभी स्टॉप्स को जोड़ने वाले रास्तों को कम करती है, फिर बाहरी fField_Warshal रूटिंग केवल पथ-अनुकूलन क्वेरी को हल करने के लिए उन एज आईडी का उपयोग करती है .... शायद।


धन्यवाद - यह बहुत मददगार है और मेरी पहली नई लीड है। मैं इसे अभी देख रहा हूं। मैं केवल न्यूनतम स्टॉप आईडी और सरणी उत्पन्न करने का तरीका जानने की कोशिश कर रहा हूं। मेरे पास आवश्यक आईडी की एक तालिका है, लेकिन 'SEL min (id) FROM नोड_टेबल' और 'SELECT ARRAY [id] FROM नोड_टेबल' आपके कोड में डालने पर वाक्यविन्यास त्रुटियां उत्पन्न करता है, लेकिन फ्री-स्टैंडिंग कोड (मेरी खराब समझ के रूप में) काम करता हूं यकीन)
एड्रियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.