क्या StGunion के अलावा PostGIS में एक भंग कार्य है?


22

मैं एक तालिका में बहुभुज सुविधाओं के बीच साझा सीमाओं को भंग करने के लिए एक फ़ंक्शन की तलाश कर रहा हूं। ST_UNION () लगभग वही करता है जो मैं देख रहा हूं, लेकिन यह परत में सभी बहुभुजों से एक बहुभुज बनाता है चाहे वे एक सामान्य सीमा साझा करें या नहीं। मैं केवल बहुभुज के बीच की सीमाओं को भंग करना चाहता हूं जो एक दूसरे को छूते हैं। मुझे लगा, ST_TOUCHES () का उपयोग करने का कोई तरीका होना चाहिए, लेकिन फिर एक विघटित फ़ंक्शन की आवश्यकता इतनी आम लगती है कि अगर इसे प्राप्त करने के लिए कोई अंतर्निहित फ़ंक्शन नहीं है तो मुझे आश्चर्य होगा।

उपयोग का मामला इस तरह दिखता है: मैंने एक बड़े यूरोपीय देश के लिए कोरीन लैंडकवर डेटा डाउनलोड किया और मैं विभिन्न वन प्रकारों (लगभग एक तालिका में 75,000 बहुभुज) के बीच की सीमाओं को भंग करना चाहता हूं। मैंने ST_UNION की कोशिश की, लेकिन यह मुझे "मेमोरी से बाहर" त्रुटि के साथ विफल कर देता है (30,000 पॉलीगोन ने हालांकि काम किया):

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

नोट: सभी वन कोड '31' से शुरू होते हैं और मैं PostGIS 1.4, GEOS संस्करण का उपयोग कर रहा हूं: 3.2.0-CAPI-1.6.0

जवाबों:


21

ST_MemUnion () एक भोली और धीमी मेमोरी फ्रेंडली प्रक्रिया चलाएगा। आप कोशिश कर सकते हैं कि, यदि आपकी समस्या काफी छोटी है, तो यह समय की उचित मात्रा में समाप्त हो सकती है। आप अपनी समस्या को केवल हिस्सों में तोड़ सकते हैं, फिर हिस्सों को एक साथ चला सकते हैं। चूंकि परिणामकों में इनपुट की तुलना में बहुत कम अंक होंगे जो आप पूरी समस्या को स्मृति में फिट करने में सक्षम हो सकते हैं। या हाफ़ मेमोरी फास्ट रूटीन का उपयोग करें और अंतिम मर्ज पर धीमी दिनचर्या।


4
आप यहाँ पॉल के लिए शानदार है, आप अतुलनीय विशेषज्ञता लाने के लिए धन्यवाद।
fmark

1
धन्यवाद, ऐसा लगता है कि मेरी समस्या काफी छोटी नहीं है। ST_MemUnion () अब 24 घंटे से चल रहा है। मैं समस्या को विभाजित करने की कोशिश करूंगा।
UnderDark

5

मेरा मानना ​​है कि ST_Dump वही है जो आप चाहते हैं:

ST_Dump :

ज्योमेट्री_डम्प (जियोम, पाथ) पंक्तियों का एक सेट लौटाता है, जो एक ज्यामिति g1 बनाता है। .... उदाहरण के लिए इसका उपयोग MULTIPOLYGONS को POLYGONS में विस्तारित करने के लिए किया जा सकता है। ...

तो आपके मामले के लिए:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

मुझे यकीन नहीं है कि आप इसे बनाने की कोशिश कर रहे टेबल निर्माण के साथ कैसे तालमेल बिठाएंगे, लेकिन यह आपको अलग-अलग प्रविष्टियों के रूप में ज्यामिति देना चाहिए। फिर आप ज्यामिति पर डेटा एकत्र करने के लिए दो तालिकाओं के बीच एक स्थानिक जुड़ाव (&& और ST_Contains का उपयोग करके) कर पाएंगे।


2
नोट: यह तभी मददगार होगा जब आपको ST_Union के मेमोरी इश्यूज मिल जाएँगे! :)
yhw42

4

क्या आपका PostGIS GEOS 3.1.0+ के खिलाफ संकलित है? उस संस्करण के लिए, बहुत तेज़ कैस्केड यूनियन को लागू किया गया था, लेकिन यदि नहीं मिला तो पुराने कोड का उपयोग करेंगे जो परिमाण धीमी के आदेश हैं।

अद्यतन : ऐसा लगता है जैसे कि आपका PostGIS कैस्केड यूनियन दृष्टिकोण का उपयोग कर रहा है, लेकिन मेमोरी भुखमरी वास्तविक है। मैं आपके पोस्टग्रेज उदाहरण के लिए उपलब्ध मेमोरी बढ़ाने की कोशिश कर रहा हूँ, यहाँ पॉल रैमसे के 2007 FOSS4G पोस्टपेड से कुछ सलाह दी गई है :

  • डिस्क का उपयोग धीमा है, इसलिए कैश डेटा के लिए अधिक मेमोरी का उपयोग करके उच्च प्रदर्शन प्राप्त किया जा सकता है!
    • बढ़ना shared_buffers
    • भौतिक RAM - OS की जरूरत है * 75%
  • छँटाई याददाश्त में तेज़ होती है
    • बढ़ना work_mem
  • अधिक मेमोरी के साथ डिस्क क्लीन-अप तेज है
    • बढ़ना maintenance_work_mem
  • प्रति कनेक्शन आवंटित किया गया
  • भी
    • बढ़ना wal_buffers
    • बढ़ना checkpoint_segments
    • कमी random_page_cost

आपके मामले में, मैं बढ़ाने की कोशिश करूंगा shared_buffers, सामान्य सिफारिश डेटाबेस सर्वर के लिए आपकी उपलब्ध मेमोरी का 25% है, लेकिन इसे अपने वर्तमान मूल्य को 3-4 गुना बढ़ाने की कोशिश करें और देखें कि क्या यह पूरा होता है।


postgis_geos_version () रिटर्न: 3.2.0-CAPI-1.6.0 ... मुझे लगता है कि यह ठीक है। कोशिश करेंगे ST_Collect, धन्यवाद।
UnderDark

खैर, ST_Collect किसी भी सीमा को भंग नहीं करता है और यह एक विशाल मल्टीपोलिगन भी बनाता है।
UnderDark

हाँ, मैं ST_Collect के लिए पृष्ठ को गलत बताता हूं। मैंने Postgres की मेमोरी उपयोग को ट्यून करने के लिए अधिक विशिष्ट सलाह प्रदान करने के लिए अपना उत्तर अपडेट किया है।
SCW
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.