การตัดแรสเตอร์ด้วยรูปหลายเหลี่ยมโดยใช้ PostGIS - ข้อผิดพลาดของสิ่งประดิษฐ์


15

ฉันใช้PostGIS2.0ทำทางแยก raster / polygon ฉันมีปัญหาในการทำความเข้าใจการทำงานที่ฉันควรใช้และวิธีที่เร็วที่สุดในการแสดงคืออะไร ปัญหาของฉันเป็นดังนี้:

  • ฉันมีรูปหลายเหลี่ยมและแรสเตอร์
  • ฉันต้องการค้นหาพิกเซลทั้งหมดที่อยู่ในรูปหลายเหลี่ยมและได้รับผลรวมของค่าพิกเซล
  • และ (ปัญหาที่อัปเดต): ฉันได้รับค่าจำนวนมากสำหรับบางพิกเซลที่ไม่มีอยู่ในแรสเตอร์ดั้งเดิมเมื่อฉันทำการค้นหา

ฉันมีความเข้าใจความยากลำบากไม่ว่าฉันควรใช้หรือ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

โพสต์ลิงก์ไปยังการอ้างอิง ฉันหวังว่าจะช่วย
RK

2
ค่าสูงสุดของสเกลในแผนที่ของคุณคือจำนวนเต็มสูงสุด 32 บิต ฉันไม่ทราบว่าสิ่งที่หมายถึงในกรณีของคุณ แต่มันอาจจะเกี่ยวข้องกับค่า NA ช่วงในแบบสอบถามของคุณอาจมีค่า Null ที่จัดการไม่ถูกต้อง en.wikipedia.org/wiki/2147483647#2147483647_in_computing
yellowcap

6
FWIW, 21474836 ไม่ใช่ค่าสูงสุดของ int 32 บิตที่เซ็นชื่อ อย่างไรก็ตาม 2 ^ 31-1 = 2147483647 เป็นค่าสูงสุดและสังเกตว่า 21474836 = 2147483647/100 (การหารจำนวนเต็ม) สิ่งนี้บอกเป็นนัยว่าภายในของ NA บางอันถูกสร้างขึ้น (อาจตามเซลล์ของเส้นขอบ) พวกมันจะถูกแสดงเป็น 2 ^ 31-1 และจากนั้นโค้ด "ลืม" เหล่านี้คือ NA และ (อาจอยู่ในกระบวนการ resampling?) มันหารด้วย 100
whuber

คำตอบ:


6

ผมพบว่าการกวดวิชาในการตัดรูปหลายเหลี่ยมเวกเตอร์ที่มีความคุ้มครองแรสเตอร์ขนาดใหญ่โดยใช้ PostGIS WKT Raster อาจมีคำตอบที่คุณต้องการ

บทช่วยสอนใช้ชุดข้อมูลสองชุดเป็นไฟล์รูปร่างจุดที่ถูกบัฟเฟอร์เพื่อสร้างรูปหลายเหลี่ยมและชุดแรสเตอร์ระดับความสูง 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 มากพอที่จะอธิบายสิ่งนี้ แต่แน่ใจว่าดูเหมือนว่าคุณกำลังพยายามทำให้สำเร็จ การสอนควรทำให้กระจ่างในขั้นตอนกลาง โชคดี :)


ขอบคุณ @RK ฉันได้อ่านบทช่วยสอนนั้นแล้ว ฉันคิดว่าการคำนวณของฉันเป็นแบบพื้นฐาน แต่ฉันยังคงหาขั้นตอนพื้นฐานนี้ได้!
djq

2

สำหรับประเด็นที่ 2 ในคำถามเดิม - การพัฒนา postgis 2.0 หลายรุ่นนั้นใช้ไลบรารี GDAL รุ่นหนึ่งซึ่งหล่อลอยให้เป็น ints หาก raster ของคุณมีค่าทศนิยมและคุณใช้ GDAL รุ่นต่ำกว่า 1.9.0 หรือรุ่นก่อนวางจำหน่าย PostGIS 2.0 ที่ไม่ได้เรียก GDALFPolygonize () อย่างถูกต้องคุณอาจพบข้อผิดพลาดนี้ ตั๋วในเครื่องมือติดตามบั๊กของPostGISและGDALได้ถูกยื่นและปิด ข้อผิดพลาดนี้มีการใช้งานในช่วงเวลาของคำถามเดิม

ในแง่ของประสิทธิภาพคุณจะพบว่าการใช้ST_Intersects(raster, geom)นั้นเร็วกว่าการใช้ST_Intersects(geom, raster)มาก รุ่นแรกแรสเตอร์เรขาคณิตและทำแยกพื้นที่แรสเตอร์ รุ่นที่สอง vectorizes เรขาคณิตและทำปริภูมิเวกเตอร์ซึ่งอาจมีราคาแพงกว่ากระบวนการ


0

ผมยังมีปัญหาแปลก ๆ ที่ใช้กับST_SummaryStats ST_Clipสอบถามข้อมูลที่แตกต่างกันบอกฉันมูลค่านาทีแรสเตอร์ของฉันคือ 32 และจากนั้นสูงสุด 300 แต่ST_SummaryStatsกลับ -32,700 สำหรับค่าพิกเซลในรูปหลายเหลี่ยมเป้าหมายของฉัน

ฉันลงเอยด้วยการแฮ็คปัญหานี้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.