PostGIS - आर्टिफैक्ट त्रुटि का उपयोग करते हुए बहुभुज के साथ एक रेखापुंज को अलग करना


15

मैं कुछ रैस्टर / बहुभुज चौराहों को करने के लिए PostGIS2.0 का उपयोग कर रहा हूं । मुझे यह समझने में कठिनाई हो रही है कि मुझे किस ऑपरेशन का उपयोग करना चाहिए, और यह प्रदर्शन करने का सबसे तेज़ तरीका क्या है। मेरी समस्या इस प्रकार है:

  • मेरे पास एक बहुभुज और एक रेखापुंज है
  • मैं उन सभी पिक्सेल को खोजना चाहता हूं जो बहुभुज के भीतर आते हैं, और पिक्सेल मूल्य का योग प्राप्त करते हैं
  • और (अपडेट की गई समस्या): मैं कुछ पिक्सेल के लिए बड़े पैमाने पर मान प्राप्त कर रहा हूं जो क्वेरी करते समय मूल रेखापुंज में मौजूद नहीं होते हैं

मुझे यह समझने में कठिनाई हो रही है कि मुझे इसका उपयोग करना चाहिए ST_Intersects()या नहीं ST_Intersection()। मुझे यह भी पता नहीं है कि मेरे पिक्सल को समेटने के लिए सबसे अच्छा तरीका क्या है। यहाँ पहला तरीका है जिसे मैंने (# 1) आज़माया है:

SELECT 
    r.rast 
FROM
    raster as r, 
    polygon as p
WHERE
    ST_Intersects(r.rast, p.geom)

यह rastमानों की एक सूची देता है , जो मुझे यकीन नहीं है कि क्या करना है। मैंने सारांश आँकड़ों का उपयोग करके गणना करने की कोशिश की, ST_SummaryStats()लेकिन यह निश्चित नहीं है कि यह सभी पिक्सेल के भारित-योग है जो बहुभुज के भीतर स्थित हैं।

SELECT  
        (result).count,
        (result).sum    
FROM (  
         SELECT 
            ST_SummaryStats(r.rast) As result
         FROM
            raster As r, 
            polygon As p
         WHERE
            ST_Intersects(r.rast, p.geom)    
    ) As tmp

अन्य दृष्टिकोण जो मैंने कोशिश की है (# 2) का उपयोग करता है ST_Intersection():

 SELECT
        (gv).geom,         
        (gv).val
 FROM 
 (
    SELECT 
        ST_Intersection(r.rast, p.geom) AS gv
    FROM 
        raster as r, 
        polygon as p           
    WHERE 
        ST_Intersects(r.rast, p.geom)

      ) as foo;

यह ज्यामिति की एक सूची देता है जिसका मैं आगे विश्लेषण करता हूं, लेकिन मुझे लगता है कि यह कम कुशल है।

मैं स्पष्ट नहीं हूं कि ऑपरेशन का सबसे तेज क्रम कौन सा है। क्या मुझे हमेशा बहुभुज को रैस्टर में चुनना raster, polygonया polygon, rasterबदलना चाहिए , ताकि यह हो raster, raster?

संपादित करें: मैंने दृष्टिकोण 2 को कुछ R.K.लिंक के विवरण के साथ अद्यतन किया ।

# 2 दृष्टिकोण का उपयोग करते हुए, मैंने परिणामों में निम्नलिखित त्रुटि देखी है जो इस कारण का हिस्सा है कि मुझे आउटपुट समझ में नहीं आया। यहाँ मेरे मूल रेखापुंज की छवि है, और बहुभुज की एक रूपरेखा है जिसका उपयोग इसे अंतर करने के लिए किया जा रहा है:

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

और यहाँ PostGIS का उपयोग कर चौराहे का परिणाम है:

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

परिणाम के साथ समस्या यह है कि 21474836 के मूल्य वापस किए जा रहे हैं, जो मूल रेखापुंज में नहीं हैं। मुझे नहीं पता कि ऐसा क्यों हो रहा है। मुझे संदेह है कि यह छोटी संख्याओं से संबंधित है (लगभग 0 से विभाजित), लेकिन यह गलत परिणाम देता है।


बिंदु दो के संबंध में, आप बहुभुज को प्रतिच्छेद करने वाले पिक्सल के मान प्राप्त करना चाहते हैं?
RK

हां, मैंने ST_SummaryStats()# 1 का उपयोग किया है , लेकिन यह सुनिश्चित नहीं है कि यह # 2 के लिए कैसे किया जाए।
djq

एक संदर्भ के लिए एक लिंक पोस्ट किया। मुझे आशा है कि वह मदद करेंगे।
आरके

2
आपके नक्शे में पैमाने का अधिकतम मूल्य एक 32-बिट हस्ताक्षरित पूर्णांक का अधिकतम है। मुझे नहीं पता कि आपके मामले में इसका क्या मतलब है, लेकिन यह NA मूल्यों के साथ हो सकता है। आपकी क्वेरी की श्रेणी में शून्य मान हो सकते हैं जिन्हें ठीक से नियंत्रित नहीं किया गया है। en.wikipedia.org/wiki/2147483647#2147483647_in_computing
पीलापन

6
FWIW, 21474836 एक 32 बिट हस्ताक्षरित इंट का अधिकतम मूल्य नहीं है। हालांकि, 2 ^ 31-1 = 2147483647 है अधिकतम, और सूचना है कि 21474836 = 2147483647/100 (पूर्णांक प्रभाग)। यह संकेत देता है कि आंतरिक रूप से कुछ एनए उत्पन्न होते हैं (शायद सीमा कोशिकाओं के साथ), उन्हें 2 ^ 31-1 के रूप में दर्शाया जाता है, और फिर कोड "भूल जाता है" ये एनए हैं और (शायद फिर से शुरू करने की प्रक्रिया में?) यह उन्हें 100 से विभाजित करता है।
whuber

जवाबों:


6

मैंने पोस्टगिस डब्ल्यूकेटी रैस्टर का उपयोग करके एक बड़े रेखापुंज कवरेज के साथ वेक्टर बहुभुज को प्रतिच्छेद करने पर एक ट्यूटोरियल पाया । आप के लिए देख रहे हैं जवाब हो सकता है।

ट्यूटोरियल में दो डेटासेट्स का उपयोग किया गया था, जो पॉलीगॉन और 13 SRTM ऊंचाई पर चलने वाली आपदाओं की एक श्रृंखला बनाने के लिए बफ़र किया गया था। बीच में बहुत सारे कदम थे, लेकिन क्वेरी को रेखापुंज करने के लिए इस्तेमाल किया गया था और वेक्टर इस तरह दिखता था:

 CREATE TABLE caribou_srtm_inter AS
 SELECT id, 
        (gv).geom AS the_geom, 
        (gv).val
 FROM (SELECT id, 
              ST_Intersection(rast, the_geom) AS gv
       FROM srtm_tiled,
            cariboupoint_buffers_wgs
       WHERE ST_Intersects(rast, the_geom)
      ) foo;

तब निम्न का उपयोग करके मूल्यों को संक्षेप में प्रस्तुत किया गया था:

 CREATE TABLE result01 AS
 SELECT id, 
        sum(ST_Area(ST_Transform(the_geom, 32198)) * val) / 
        sum(ST_Area(ST_Transform(the_geom, 32198))) AS meanelev
 FROM caribou_srtm_inter
 GROUP BY id
 ORDER BY id;

मैं वास्तव में यह समझाने के लिए पर्याप्त PostGIS नहीं जानता, लेकिन यह सुनिश्चित करता है कि आप जो पूरा करने की कोशिश कर रहे थे वह लगता है। ट्यूटोरियल को मध्यवर्ती चरणों पर प्रकाश डालना चाहिए। सौभाग्य :)


धन्यवाद @ आरके मैंने उस ट्यूटोरियल के माध्यम से पढ़ा। मुझे लगता है कि मेरी गणना अधिक बुनियादी है, फिर भी मैं इस बुनियादी कदम का पता लगा रहा हूं!
djq

2

मूल प्रश्न में बिंदु 2 के संबंध में - पोस्टगिस 2.0 विकास रिलीज में से कई ने जीडीएएल पुस्तकालय के एक संस्करण का उपयोग किया जो कि किलों में तैरता है। यदि आपके रेखापुंज में फ्लोट मान हैं, और आप 1.9.0 से कम GDAL के संस्करण का उपयोग कर रहे थे, या PostGIS 2.0 prerelease का एक संस्करण जो ठीक से GDALFPolygonize () नहीं कहता था, तो आप इस बग का सामना कर सकते हैं। PostGIS और GDAL बग ट्रैकर्स में टिकट दर्ज किए गए और बंद कर दिए गए। यह बग मूल प्रश्न के समय के आसपास सक्रिय था।

प्रदर्शन के संदर्भ में, आप पाएंगे कि उपयोग करने ST_Intersects(raster, geom)की तुलना में उपयोग करना बहुत तेज है ST_Intersects(geom, raster)। पहला संस्करण ज्यामिति को रेखापुंज करता है और एक रास्टर-स्पेस चौराहे को करता है। दूसरा संस्करण ज्यामिति को सदिश करता है और एक वेक्टर-स्पेस चौराहा करता है, जो अधिक महंगी प्रक्रिया हो सकती है।


0

मैं भी का उपयोग कर अजीब मुद्दों कर रहा था ST_SummaryStatsके साथ ST_Clip। डेटा को अलग करते हुए मुझे बताया कि मेरे रेखापुंज का न्यूनतम मूल्य 32 था, और फिर अधिकतम 300, फिर ST_SummaryStatsभी मेरे लक्ष्य बहुभुज में पिक्सेल मानों के लिए -32700 लौट रहा था।

मैंने इस मुद्दे के आसपास हैकिंग को समाप्त कर दिया:

WITH first AS (
   SELECT id, (ST_Intersection(geom, rast)).val
   FROM raster_table
   INNER JOIN vector_table ON ST_Intersects(rast, geom)
)
SELECT id, COUNT(val), SUM(val), AVG(val), stddev(val), MIN(val), MAX(val)
FROM first
GROUP BY id
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.