मैं 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