Interpolação espacial em PostGIS sem saída de Raster
Eu tenho alguns dados que são semelhantes à precipitação, ou seja. uma latitude, longitude e um número Z. Está em uma camada de pontos que é uma grade de pontos bem limpa. Muitos números Z estão faltando nesta grade.
Quero interpolar para encontrar números Z razoáveis. TIN, IDW ou outros métodos. Não quero entrar em um raster primeiro e depois voltar as interseções do raster para a grade de pontos.
Posso fazer uma interpolação no QGIS, mas gera um raster que estou querendo evitar. O objetivo é realizar todos os cálculos dentro do PostgreSQL para fins de produção.
Isso é possível?
Respostas
Uma implementação IDW ingênua, do topo da minha cabeça:
UPDATE <points> AS itp
SET "Z" = (
SELECT SUM(z/d)/SUM(1/d)
FROM (
SELECT smpl."Z" as z,
ST_Distance(itp.geom, smpl.geom)^<P-value> AS d
FROM <point> AS smpl
ORDER BY
itp.geom <-> smpl.geom
WHERE smpl."Z" IS NOT NULL
LIMIT <sample_size>
) sq
WHERE ipt."Z" IS NULL
) q
;
Onde
<P-value>é o fator aplicado à distância inversa; você provavelmente quer ficar entre1.0e2.0<sample_size>a quantidade de pontos de amostra (conhecidos) que precisam ser considerados na vizinhança mais próxima (k)
Já faz um tempo que eu não dei uma olhada no algoritmo IDW, então pode ser necessário ajustar; a subconsulta sqretorna a lista de distâncias inversas (quando usada como 1/<distance>^p), então você pode ir a partir daí se precisar alterar as somas IDW reais.