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ę rast
wartoś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, polygon
lub polygon, raster
przekształ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.