Giao cắt raster với đa giác bằng PostGIS - lỗi artefact


15

Tôi đang sử dụng PostGIS2.0 để thực hiện một số giao lộ raster / đa giác. Tôi đang gặp khó khăn trong việc hiểu nên sử dụng thao tác nào và cách nhanh nhất để thực hiện việc này là gì. Vấn đề của tôi là như sau:

  • Tôi có một đa giác và raster
  • Tôi muốn tìm tất cả các pixel nằm trong đa giác và lấy tổng giá trị pixel
  • Và (vấn đề được cập nhật): Tôi đang nhận được các giá trị lớn cho một số pixel không tồn tại trong raster ban đầu khi tôi thực hiện truy vấn

Tôi đang gặp khó khăn trong việc hiểu liệu tôi nên sử dụng ST_Intersects()hay ST_Intersection(). Tôi cũng không biết cách tiếp cận tốt nhất để tóm tắt pixel của mình là gì. Đây là cách tiếp cận đầu tiên mà tôi đã thử (# 1):

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

Điều này trả về một danh sách các rastgiá trị, mà tôi không biết phải làm gì với. Tôi đã thử tính toán thống kê tóm tắt bằng cách sử dụng ST_SummaryStats()nhưng tôi không chắc đây có phải là tổng trọng số của tất cả các pixel nằm trong đa giác không.

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

Cách tiếp cận khác mà tôi đã thử (# 2) sử dụng 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;

Điều này trả về một danh sách hình học mà tôi phân tích thêm, nhưng tôi cho rằng điều này là ít hiệu quả hơn.

Tôi không rõ đó là thứ tự hoạt động nhanh nhất cũng có. Tôi có nên luôn luôn chọn raster, polygonhoặc polygon, rasterchuyển đổi đa giác thành raster raster, rasterkhông?

EDIT: Tôi đã cập nhật cách tiếp cận # 2 với một số chi tiết từ R.K.liên kết của.

Sử dụng phương pháp # 2, tôi đã nhận thấy lỗi sau trong kết quả, đó là một phần lý do tại sao tôi không hiểu đầu ra. Đây là hình ảnh của raster ban đầu của tôi và một phác thảo của đa giác đang được sử dụng để giao với nó, được phủ lên trên:

nhập mô tả hình ảnh ở đây

Và đây là kết quả của giao lộ sử dụng PostGIS:

nhập mô tả hình ảnh ở đây

Vấn đề với kết quả là có các giá trị của 21474836 được trả về, không nằm trong raster gốc. Tôi không biết tại sao điều này lại xảy ra. Tôi nghi ngờ nó có liên quan đến số nhỏ ở đâu đó (chia cho gần 0), nhưng nó trả về kết quả sai.


Về điểm hai, bạn muốn lấy tổng các giá trị của các pixel giao nhau với đa giác?
RK

Có, tôi đã sử dụng ST_SummaryStats()cho # 1, nhưng không chắc chắn làm thế nào cho # 2.
djq

Đăng một liên kết đến một tài liệu tham khảo. Tôi hy vọng điều đó sẽ giúp.
RK

2
Giá trị tối đa của tỷ lệ trong bản đồ của bạn là tối đa của số nguyên có chữ ký 32 bit. Tôi không biết điều đó có nghĩa gì trong trường hợp của bạn, nhưng nó có thể phải làm với các giá trị NA. Phạm vi trong truy vấn của bạn có thể có các giá trị null không được xử lý đúng cách. vi.wikipedia.org/wiki/2147483647#2147483647_in_computing
yellowcap

6
FWIW, 21474836 không phải là giá trị tối đa của một int được ký 32 bit. Tuy nhiên, 2 ^ 31-1 = 2147483647 mức tối đa và lưu ý rằng 21474836 = 2147483647/100 (chia số nguyên). Điều này gợi ý rằng bên trong một số NA được tạo ra (có thể dọc theo các ô viền), chúng được biểu diễn dưới dạng 2 ^ 31-1, và sau đó mã "quên" đây là NA và (có lẽ trong quá trình lấy mẫu lại?), Chúng chia cho 100.
whuber

Câu trả lời:


6

Tôi tìm thấy một hướng dẫn về các đa giác vector giao nhau với độ bao phủ raster lớn bằng PostGIS WKT Raster . Có thể có câu trả lời bạn đang tìm kiếm.

Hướng dẫn sử dụng hai bộ dữ liệu, một tệp hình dạng điểm được đệm để tạo đa giác và một loạt 13 trình quét độ cao SRTM. Có rất nhiều bước ở giữa nhưng truy vấn được sử dụng để giao cắt raster và vector trông như thế này:

 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;

Các giá trị sau đó được tóm tắt bằng cách sử dụng như sau:

 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;

Tôi thực sự không biết đủ PostGIS để giải thích điều này nhưng nó chắc chắn nghe giống như những gì bạn đang cố gắng thực hiện. Hướng dẫn sẽ làm sáng tỏ các bước trung gian. Chúc may mắn :)


Cảm ơn @RK tôi đã đọc qua hướng dẫn đó. Tôi nghĩ rằng tính toán của tôi là cơ bản hơn, nhưng tôi vẫn đang tìm ra bước cơ bản này!
djq

2

Liên quan đến điểm 2 trong câu hỏi ban đầu - một số bản phát hành phát triển sau 2.0 đã sử dụng một phiên bản của thư viện GDAL để chuyển thành số nguyên. Nếu raster của bạn có các giá trị nổi trong đó và bạn đang sử dụng phiên bản GDAL thấp hơn 1.9.0 hoặc phiên bản phát hành trước PostGIS 2.0 mà không gọi đúng GDALFPolygonize (), thì bạn có thể gặp phải lỗi này. Vé trong trình theo dõi lỗi PostGISGDAL đã được nộp và đóng. Lỗi này đã hoạt động trong khoảng thời gian của câu hỏi ban đầu.

Về hiệu suất, bạn sẽ thấy rằng việc sử dụng ST_Intersects(raster, geom)nhanh hơn nhiều so với sử dụng ST_Intersects(geom, raster). Phiên bản đầu tiên rasterize hình học và thực hiện giao cắt không gian raster. Phiên bản thứ hai vector hóa hình học và thực hiện giao cắt không gian vectơ, có thể là quá trình tốn kém hơn nhiều.


0

Tôi cũng đã có vấn đề lạ sử dụng ST_SummaryStatsvới ST_Clip. Truy vấn dữ liệu khác nhau cho tôi biết giá trị tối thiểu của raster của tôi là 32, và sau đó tối đa 300, nhưng ST_SummaryStatsđã trả về -32700 cho các giá trị pixel trong đa giác mục tiêu của tôi.

Tôi đã kết thúc hack xung quanh vấn đề như vậy:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.