PostGIS raster toplamı (harita cebiri)


14

Belirli günlerde seyahat süresi iz zamanlarını temsil eden bir çokgen tablo var. Her başlangıç ​​noktası için beş izokron geometrisi vardır (ayrı satırlarda saklanır). Her başlangıç ​​noktası için, beş eşzamanlı (bir ikili NULL veya 1) rasterleştirmek ve sonra bunları tek bir raster katmanında birleştirmek istiyorum. Bu raster katmanı basit bir harita cebiri gerektirir: toplam / 5, böylece her orijin sonunda kaç tanesine bağlı olarak [NULL, 0.2, 0.4, 0.6, 0.8, 1] değerlerine sahip tek bir raster katmanı ile ilişkilendirilecektir. bileşen katmanları çakışır. Olasılıklı bir yüzeydir.

Verilerimin tümü Postgres 9.3'te (PostGIS ile) saklanır. Benim sorunum PostGIS raster kullanmayı öğrenmek isterken, gerçekten dik bir öğrenme eğrisi var gibi görünüyor ve tüm örnekler tek bir raster katmanı ile ilgili bulabilirsiniz. Örneklerde, bu katman çokgen bir bindirmenin parçası olarak kullanılır, belki de her bir çokgen için raster değerinin ortalaması alınır. Birleştirme için tekrarlanabilir bir örnek bulamadım: a) vektör -> raster b) harita cebiri; ve c) İlk paragrafım uyarınca GROUP BY özelliği.

Ben bu görevi gerçekleştirmek için GDAL veya GRASS kullanarak Tamam, ama bu PostGIS bir şey işlemek gerekir gibi görünüyor; girdi verilerimin zaten PostGIS geometrisi olduğu göz önüne alındığında bunu yapmak uygun olacaktır; ve gerçekten PostGIS raster'iyle anlaşmak istiyorum.

Bazı örnek veri yapısı:

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

Rasterleştirmek, alan kimliğine göre gruplandırmak ve daha sonra gelmek için harita cebirini gerçekleştirmek istiyorum:

areaid    isorast (raster)
1000      aaa
1006      bbb

Bunu PostGIS'e dahil etmekte başarılı olamadım. Benim yaklaşımım, vektörü raster haline getirmek, rasterleri dizilere dökmek ve bir GeoTIFF'e (belki de PostGIS'e geri koymak için) yazmadan önce psycopg2 aracılığıyla sayısal dizilerle kombinasyonu gerçekleştirmekti. İdeal değil ama yapılabilir.


1
Güzel soru. Postgis raster hissini gerçekten öğrenmeliyim ve istediğin şeyin mümkün olduğundan eminim. Bugün maalesef çok meşgul.
John Powell

1
Bu BostonGIS blogunda harita cebirinde oldukça sert bir makale var . Bu blogun yazarı, Postgis'in raster yeteneklerinin birçoğu olan mükemmel Postgis in Action kitabının da yazarıdır. Üzgünüm, daha doğrudan bir örnek bulamadım.
John Powell

Yanıtlar:


3

Kendi toplama fonksiyonunuzu yazmanız gerekecektir:

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

daha sonra böyle diyebilirsiniz

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

Bu size aynı alan kimliğine sahip tüm rasterlerinizin toplamını verir. Raster değerlerini her bir alan kimliği için gözlem sayısına bölmeniz gerekir. (Toplama işlevine dahil etmedim. Burada veya daha sonra MapAlegbra'yı kullanarak yapabilirsiniz)

Giriş rasterlerinizin hizalı olduğundan emin olun, aksi takdirde çalışmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.