PostGIS में रेखापुंज आँकड़ों की गणना में प्रदर्शन


9

मैं PostgreSQL / PostGIS का उपयोग करके वेक्टर परत में प्रत्येक बहुभुज के लिए रेखापुंज आँकड़े (न्यूनतम, अधिकतम, माध्य) की गणना करने का प्रयास कर रहा हूँ।

यह GIS.SE उत्तर बताता है कि यह कैसे करना है, बहुभुज और रेखापुंज के बीच चौराहे की गणना करके और फिर एक भारित औसत की गणना करके: https://gis.stackexchange.com/a/19858/12420

मैं निम्नलिखित प्रश्न का उपयोग कर रहा हूं (जहां demमेरा रेखापुंज है, topo_area_su_regionमेरा वेक्टर है, और toidएक अद्वितीय आईडी है:

SELECT toid, Min((gv).val) As MinElevation, Max((gv).val) As MaxElevation, Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation FROM (SELECT toid, ST_Intersection(rast, geom) AS gv FROM topo_area_su_region,dem WHERE ST_Intersects(rast, geom)) foo GROUP BY toid ORDER BY toid;

यह काम करता है, लेकिन यह बहुत धीमा है। मेरी वेक्टर लेयर में 2489k फीचर हैं, जिनमें से प्रत्येक को प्रोसेस करने में लगभग 90ms लगते हैं - पूरी लेयर को प्रोसेस करने में कई दिन लगेंगे । यदि मैं केवल मिनट और अधिकतम (जो ST_Area को कॉल से बचा जाता है) की गणना करता है, तो गणना की गति में उल्लेखनीय रूप से सुधार नहीं होता है।

यदि मैं पायथन (GDAL, NumPy और PIL) का उपयोग करके एक समान गणना करता हूं, तो डेटा को संसाधित करने में लगने वाले समय को कम कर सकता है, अगर रेखापुंज (ST_Intersection का उपयोग करके) के बजाय मैं वेक्टर को rasterize करता हूं। यहां देखें कोड: https://gist.github.com/snorfalorpagus/7320167

मुझे वास्तव में एक भारित औसत की आवश्यकता नहीं है - "अगर यह छूता है, तो यह" दृष्टिकोण काफी अच्छा है - और मुझे यकीन है कि यह वही है जो चीजों को धीमा कर रहा है।

प्रश्न : क्या इस तरह का व्यवहार करने के लिए पोस्टजीआईएस प्राप्त करने का कोई तरीका है? रस्टर से सभी कोशिकाओं के मूल्यों को वापस करने के लिए जो एक बहुभुज को छूता है, बजाय सटीक चौराहे के।

मैं PostgreSQL / PostGIS के लिए बहुत नया हूं, इसलिए शायद कुछ और है जो मैं सही नहीं कर रहा हूं। मैं विंडोज 7 (2.9GHz i7, 8GB RAM) पर PostgreSQL 9.3.1 और PostGIS 2.1 चला रहा हूं और यहां सुझाए गए डेटाबेस कॉन्फिग को ट्वीक किया है: http://postgis.net/workbooks/postgis-intro/troing.html

यहां छवि विवरण दर्ज करें


1
मैंने अपना उत्तर संपादित कर दिया है। मैं यह कहना भूल गया कि मेरे जवाब में चौराहा कम सटीक है।
स्टीफन

जवाबों:


11

आप सही हैं, ST_Intersectionअपनी क्वेरी को ध्यान देने योग्य उपयोग करते हुए ।

ST_Intersectionइसका उपयोग करने के बजाय ST_Clipपॉलीगॉन (आपके क्षेत्र) के साथ अपने रेखांकन को क्लिप करना ( ) बेहतर है और परिणाम को पॉलीगॉन ( ST_DumpAsPolygons) के रूप में डंप करें । इसलिए प्रत्येक रैस्टर सेल को अलग-अलग मूल्यों के साथ थोड़ा बहुभुज आयत में बदला जाएगा।

न्यूनतम, अधिकतम या मतलब डंप से प्राप्त करने के लिए आप एक ही बयान का उपयोग कर सकते हैं।

इस क्वेरी को चाल करना चाहिए:

SELECT 
    toid,
    Min((gv).val) As MinElevation,
    Max((gv).val) As MaxElevation,
    Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation
FROM (
    SELECT 
        toid,
        ST_DumpAsPolygons(ST_Clip(rast, 1, geom, true)) AS gv
    FROM topo_area_su_region,dem 
        WHERE ST_Intersects(rast, geom)) AS foo 
            GROUP BY toid 
            ORDER BY toid;

बयान में ST_Clipआप रेखापुंज को परिभाषित करते हैं, रेखापुंज बैंड (= 1), बहुभुज और यदि फसल TRUE याALALSE होनी चाहिए।

इसके अलावा आप avg((gv).val)औसत मूल्य की गणना करने के लिए उपयोग कर सकते हैं ।

संपादित करें

आपके दृष्टिकोण का परिणाम अधिक सटीक है, लेकिन धीमा है। के संयोजन के परिणाम ST_Clipऔर ST_DumpAsPolygonsरेखापुंज कोशिकाओं की अनदेखी कर रहे हैं जो उनके आकार के 50% (या 51%) से कम के साथ प्रतिच्छेद कर रहे हैं।

एक CORINE लैंड यूज़ चौराहे से ये दो स्क्रीन शॉट्स अंतर दिखाते हैं। पहली तस्वीर के साथ ST_Intersection, दूसरी के साथ ST_Clipऔर ST_DumpAsPolygons

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.