Estou usando o PostGIS2.0 para fazer algumas interseções de varredura / polígono. Estou tendo dificuldades para entender qual operação devo usar e qual é a maneira mais rápida de fazer isso. Meu problema é o seguinte:
- Eu tenho um polígono e uma varredura
- Quero encontrar todos os pixels que se enquadram no polígono e obter a soma do valor do pixel
- E (problema atualizado): estou recebendo valores massivos para alguns pixels que não existem na varredura original quando executo a consulta
Estou tendo dificuldades para entender se devo usar ST_Intersects()
ou ST_Intersection()
. Também não sei qual é a melhor abordagem para somar meus pixels. Aqui está a primeira abordagem que eu tentei (# 1):
SELECT
r.rast
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
Isso retorna uma lista de rast
valores, com os quais não tenho certeza do que fazer. Tentei calcular as estatísticas de resumo usando, ST_SummaryStats()
mas não tenho certeza se essa é a soma ponderada de todos os pixels que estão dentro do polígono.
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
A outra abordagem que tentei (nº 2) usa 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;
Isso retorna uma lista de geometrias que analiso mais adiante, mas presumo que isso seja menos eficiente.
Não sei ao certo qual é a ordem de operação mais rápida também. Devo sempre escolher raster, polygon
ou polygon, raster
, ou converter o polígono em uma varredura para que seja raster, raster
?
EDIT: Atualizei a abordagem # 2 com alguns detalhes do R.K.
link de.
Usando a abordagem nº 2, notei o seguinte erro nos resultados, que é parte do motivo pelo qual não entendi a saída. Aqui está a imagem da minha varredura original e um contorno do polígono que está sendo usado para interceptá-la, sobreposto na parte superior:
E aqui está o resultado da interseção usando o PostGIS:
O problema com o resultado é que há valores de 21474836 sendo retornados, que não estão na varredura original. Eu não tenho idéia do por que isso está ocorrendo. Eu suspeito que esteja relacionado a números pequenos em algum lugar (dividindo por quase 0), mas retorna o resultado errado.
ST_SummaryStats()
número 1, mas não sei como fazê-lo no número 2.