Korzystam z PostGIS2.0 do wykonywania skrzyżowań rastra / wielokąta. Mam problem ze zrozumieniem, której operacji powinienem użyć i jaki jest najszybszy sposób jej wykonania. Mój problem jest następujący:
- Mam wielokąt i raster
- Chcę znaleźć wszystkie piksele wchodzące w skład wielokąta i uzyskać sumę wartości pikseli
- I (zaktualizowany problem): Otrzymuję ogromne wartości dla niektórych pikseli, które nie istnieją w oryginalnym rastrze podczas wykonywania zapytania
Mam problem ze zrozumieniem, czy powinienem użyć, ST_Intersects()czy ST_Intersection(). Nie wiem też, jakie jest najlepsze podejście do sumowania moich pikseli. Oto pierwsze podejście, które próbowałem (# 1):
SELECT
r.rast
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
Zwraca listę rastwartości, z którymi nie jestem pewien, co zrobić. Próbowałem obliczać statystyki podsumowujące przy użyciu, ST_SummaryStats()ale nie jestem pewien, czy jest to suma ważona wszystkich pikseli, które znajdują się w obrębie wielokąta.
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
Inne podejście, które wypróbowałem (# 2), wykorzystuje 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;
Zwraca to listę geometrii, które dalej analizuję, ale zakładam, że jest to mniej wydajne.
Nie jestem pewien, która kolejność jest najszybsza. Czy zawsze powinienem wybrać raster, polygonlub polygon, rasterprzekształcić wielokąt w raster tak, aby był raster, raster?
EDYCJA: Zaktualizowałem podejście nr 2 z kilkoma szczegółami z R.K.linku.
Stosując podejście nr 2, zauważyłem następujący błąd w wynikach, który jest jednym z powodów, dla których nie zrozumiałem wyniku. Oto obraz mojego oryginalnego rastra i zarys wielokąta, który jest używany do jego przecięcia, nałożony na wierzch:

A oto wynik skrzyżowania z PostGIS:

Problem z wynikiem polega na tym, że zwracane są wartości 21474836, których nie ma w oryginalnym rastrze. Nie mam pojęcia, dlaczego tak się dzieje. Podejrzewam, że jest to gdzieś związane z małymi liczbami (dzielenie przez prawie 0), ale zwraca zły wynik.
ST_SummaryStats()dla # 1, ale nie jestem pewien, jak to zrobić dla # 2.