Tổng kết raster PostGIS (đại số bản đồ)


14

Tôi có một bảng đa giác đại diện cho isochrones du hành thời gian vào những ngày đặc biệt. Đối với mỗi điểm gốc, có năm hình học isochrone (được lưu trữ trong các hàng riêng biệt). Đối với mỗi điểm gốc, tôi muốn rasterise năm isochrones (một NULL nhị phân hoặc 1), sau đó kết hợp chúng thành một lớp raster duy nhất. Lớp raster này yêu cầu một đại số bản đồ đơn giản: sum / 5, do đó, mỗi gốc sẽ được liên kết với một lớp raster duy nhất có các giá trị trong [NULL, 0,2, 0,4, 0,6, 0,8, 1] tùy thuộc vào số lượng các lớp cấu thành chồng lên nhau. Đó là một bề mặt xác suất.

Tất cả dữ liệu của tôi được lưu trữ trong Postgres 9.3 (với PostGIS). Vấn đề của tôi là trong khi tôi muốn học cách sử dụng raster PostGIS, nó dường như có một đường cong học tập thực sự dốc và tất cả các ví dụ tôi có thể tìm thấy đối phó với một lớp raster duy nhất. Trong các ví dụ, lớp này được sử dụng như một phần của lớp phủ đa giác, có lẽ lấy trung bình giá trị của raster cho mỗi đa giác. Tôi chưa tìm thấy một ví dụ có thể nhân rộng để kết hợp: a) vectơ -> raster b) đại số bản đồ; và c) Thuộc tính GROUP BY theo đoạn đầu tiên của tôi.

Tôi ổn khi sử dụng GDAL hoặc GRASS nếu tôi phải thực hiện nhiệm vụ này, nhưng điều này có vẻ như là thứ gì đó PostGIS có thể xử lý; Sẽ thuận tiện khi làm như vậy vì dữ liệu đầu vào của tôi đã là hình học PostGIS; và tôi thực sự muốn đi đến thỏa thuận với raster PostGIS.

Một số cấu trúc dữ liệu mẫu:

areaid    time        date          isogeom (polygon)
1000      07:15:00    2014-05-05    xxx
1000      07:15:00    2014-05-06    xxy
...
1006      07:15:00    2014-05-05    zzz

Tôi muốn rasterise, nhóm theo areaid, và sau đó thực hiện đại số bản đồ để đến:

areaid    isorast (raster)
1000      aaa
1006      bbb

Tôi đã không thành công trong việc chứa nó cho PostGIS. Cách tiếp cận của tôi là chuyển đổi vectơ thành raster, kết xuất các raster thành các mảng và thực hiện kết hợp với các mảng numpy thông qua psycopg2, trước khi viết chúng vào GeoTIFF (có thể được đưa trở lại vào PostGIS). Không lý tưởng, nhưng có thể.


1
Câu hỏi hay. Tôi chia sẻ thực sự nên học cảm giác raster postgis và tôi chắc chắn những gì bạn muốn là có thể. Đáng buồn là hôm nay quá bận để có một đi.
John Powell

1
Có một bài viết khá khó về đại số bản đồ trong blog BostonGIS này . Tác giả của blog này cũng là tác giả của cuốn sách xuất sắc, Postgis in Action, có rất nhiều khả năng raster của Postgis. Xin lỗi, tôi không thể đưa ra một ví dụ trực tiếp hơn.
John Powell

Câu trả lời:


3

Bạn sẽ cần phải viết hàm tổng hợp của riêng bạn:

CREATE OR REPLACE function sum_raster_state(raster, raster)
returns raster
language sql
as $f$

SELECT
CASE $1
WHEN NULL THEN
      $2
ELSE
    ST_MapAlgebra(
        $1, 
        $2, 
        '([rast1] + [rast2])', 
        NULL, 
        'UNION', 
        '[rast2]', 
        '[rast1]', 
        NULL)
END;
$f$;

CREATE OR REPLACE FUNCTION sum_raster_final(raster)
returns raster
language sql
as $f$
SELECT 
   $1
$f$;

create aggregate sum_raster(raster) (
    SFUNC = sum_raster_state,
    STYPE = raster,
    FINALFUNC = sum_raster_final
);

sau đó bạn có thể gọi nó như thế này

SELECT areaid, sum_raster(st_asraster(isogeom, ...)) FROM isochrone GROUP BY areaid

Điều này cung cấp cho bạn tổng của tất cả các trình quét của bạn có cùng ID khu vực. Bạn vẫn sẽ cần chia các giá trị raster cho số lượng quan sát cho từng ID khu vực. (Tôi không bao gồm nó trong hàm tổng hợp. Bạn có thể thực hiện ở đây hoặc sau đó bằng MapAlegbra)

Hãy chắc chắn rằng các raster đầu vào của bạn đều được căn chỉnh, nếu không điều này sẽ không hoạt động.

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.