PostGIS raster summation (พีชคณิตแผนที่)


14

ฉันมีตารางรูปหลายเหลี่ยมแสดงเวลาในการเดินทางในแต่ละวัน สำหรับจุดเริ่มต้นแต่ละจุดมีรูปทรงเรขาคณิต isochrone ห้า (เก็บไว้ในแถวที่แยกต่างหาก) สำหรับจุดเริ่มต้นแต่ละจุดฉันต้องการที่จะรวมห้า isochrones (ไบนารี NULL หรือ 1) แล้วรวมเข้ากับชั้นแรสเตอร์เดียว เลเยอร์แรสเตอร์นี้ต้องใช้พีชคณิตแผนที่อย่างง่าย ๆ : sum / 5 เพื่อให้ต้นกำเนิดแต่ละอันจะเชื่อมโยงกับเลเยอร์แรสเตอร์เดี่ยวที่มีค่าใน [NULL, 0.2, 0.4, 0.6, 0.8, 1] ขึ้นอยู่กับจำนวน ชั้นที่เป็นองค์ประกอบทับซ้อนกัน มันเป็นพื้นผิวที่น่าจะเป็น

ข้อมูลของฉันถูกเก็บไว้ใน Postgres 9.3 (พร้อม PostGIS) ปัญหาของฉันคือในขณะที่ฉันต้องการเรียนรู้การใช้ PostGIS แรสเตอร์ดูเหมือนว่าจะมีช่วงการเรียนรู้ที่สูงชันและตัวอย่างทั้งหมดที่ฉันสามารถหาข้อตกลงกับชั้นแรสเตอร์เดียว ในตัวอย่างเลเยอร์นี้ใช้เป็นส่วนหนึ่งของรูปหลายเหลี่ยมซ้อนทับอาจเฉลี่ยค่าของแรสเตอร์สำหรับรูปหลายเหลี่ยมแต่ละรูป ฉันไม่พบตัวอย่างที่จำลองได้สำหรับการรวม: a) เวกเตอร์ -> raster b) พีชคณิตแผนที่ และ c) GROUP BY attribute ตามวรรคหนึ่งของฉัน

ฉันตกลงที่จะใช้ GDAL หรือ GRASS ถ้าฉันต้องทำสิ่งนี้ แต่ดูเหมือนว่า PostGIS จะสามารถจัดการได้ มันจะสะดวกที่จะทำเช่นนั้นเพราะข้อมูลอินพุตของฉันมีรูปทรงเรขาคณิตของ PostGIS อยู่แล้ว และฉันจริงๆต้องการที่จะมาถึงข้อตกลงกับ PostGIS แรสเตอร์

โครงสร้างข้อมูลตัวอย่างบางส่วน:

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

ฉันต้องการแรสเตอรกลุ่มโดย areaid แล้วดำเนินการพีชคณิตแผนที่เพื่อมา:

areaid    isorast (raster)
1000      aaa
1006      bbb

ฉันไม่ได้ประสบความสำเร็จในการรวบรวม PostGIS นี้ วิธีการของฉันคือการแปลงเวกเตอร์เป็นแรสเตอร์ทิ้งแรสเตอร์เป็นอาร์เรย์และดำเนินการผสมกับอาร์เรย์ numpy ผ่าน psycopg2 ก่อนที่จะเขียนลงใน GeoTIFF (อาจจะนำกลับมาใช้ใน PostGIS) ไม่เหมาะ แต่ทำได้


1
คำถามเจ๋ง ฉันแบ่งปันความรู้สึกที่แท้จริงของ postgis raster และฉันแน่ใจว่าสิ่งที่คุณต้องการเป็นไปได้ น่าเศร้าที่วันนี้ยุ่งเกินไปที่จะไป
John Powell

1
มีบทความเกี่ยวกับพีชคณิตแผนที่ง่าย ๆ ในบล็อก BostonGISนี้ ผู้เขียนบล็อกนี้ยังเป็นผู้แต่งหนังสือ Postgis in Action ที่ยอดเยี่ยมซึ่งมีความสามารถแรสเตอร์มากมายของ Postgis ขออภัยฉันไม่สามารถหาตัวอย่างที่ตรงกว่านี้ได้
John Powell

คำตอบ:


3

คุณจะต้องเขียนฟังก์ชันรวมของคุณเอง:

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
);

หลังจากนั้นคุณสามารถโทรได้เช่นนี้

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

นี่จะให้ผลรวมของ rasters ทั้งหมดของคุณด้วยรหัสพื้นที่เดียวกัน คุณจะต้องแบ่งค่าแรสเตอร์ตามจำนวนการสังเกตสำหรับแต่ละรหัสพื้นที่ (ฉันไม่ได้รวมไว้ในฟังก์ชันการรวมคุณสามารถทำได้ที่นี่หรือหลังจากนั้นโดยใช้ MapAlegbra)

ตรวจสอบให้แน่ใจว่าอินพุตแรสเตอร์ของคุณสอดคล้องทั้งหมดมิฉะนั้นจะไม่สามารถใช้งานได้

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