Interpolação de valor de grade hexadecimal no POSTGIS

8

Eu tenho uma tabela de hexágonos em mosaico que criei como uma grade de bin hexadecimal para cobrir uma área.

Sobreponha um conjunto de pontos para atribuir um valor a alguns hexágonos, veja o diagrama: -

insira a descrição da imagem aqui

As formas com o valor "0" não têm valor e eu gostaria de interpolá-las dos valores dos vizinhos, conforme Kriging. Como posso fazer isso no postgres, dada a minha tabela:

hex_grid_data
(
 gid SERIAL,
 wkb_geometry (geometry),
 value INTEGER
)
user1331131
fonte
Você pode usar o kriging no postgis? Verifique este tópico gis.stackexchange.com/questions/1041/…
GISKid
Você é casado com o kriging em particular? Outro método de interpolação funcionaria?
MakinFlippyFloppy
O que você quer dizer com interpolação? A média de todos os vizinhos será de bom valor?
Jendrusk
Qualquer método de interpolação seria bom.
user1331131
Por curiosidade - por que interpolar da grade hexadecimal quando você tem valores de um conjunto de pontos que você pode usar para interpolação?
Simbamangu

Respostas:

5

Não sei de que tipo de interpolação você está falando, mas se a média de todos os vizinhos tiver um bom valor, essa pode ser a solução:

create table hex_grid_data_av as 
  (
  select gid, wkb_geometry, value,
    case
      when value > 0 then value
      else (select sum(h2.value)/6 from hex_grid_data h2 where ST_Touches(h1.wkb_geometry, h2.wkb_geometry))
    end as int_value 
  from hex_grid_data h1
  )

Ou após as dúvidas de @MakinFlippyFloppy, se realmente 0 no exemplo significa nulo (sem valor):

create table hex_grid_data_av as 
  (
  select gid, wkb_geometry, value,
    case
      when value > 0 then value
      else (select sum(coalesce(h2.value,0))/6 from hex_grid_data h2 where ST_Touches(h1.wkb_geometry, h2.wkb_geometry))
    end as int_value 
  from hex_grid_data h1
  )

Ou se os valores nulos ou zero não devem diminuir a média:

create table hex_grid_data_av as 
  (
  select gid, wkb_geometry, value,
    case
      when value > 0 then value
      when value = 0 and not exists (select 1 from hex_grid_data h2 where ST_Touches(h1.wkb_geometry, h2.wkb_geometry) and h2.value != 0 and h2.value is not null ) then 0
      else (select sum(coalesce(h2.value,0))/(select count(nullif(value,0)) from hex_grid_data h3 where ST_Touches(h1.wkb_geometry, h3.wkb_geometry) ) from hex_grid_data h2 where ST_Touches(h1.wkb_geometry, h2.wkb_geometry))
    end as int_value 
  from hex_grid_data h1
  )
Jendrusk
fonte
A maneira como você calcula a média seria muito baixa, porque o numerador e o denominador incluem células com valor zero. Pela descrição do problema, parece-me que suas células com valor zero são mais apropriadamente vistas como nulas.
MakinFlippyFloppy
@MakinFlippyFloppy - Não? O denominador é sempre 6 para evitar erros de divisão por zero. Por exemplo, há 0 não nulo ... espero que eu não tenho que explicar aqui que não é a mesma :) Mesmo que haverá seis vezes de zero a interpolação de uma maneira ou de outra será zero
Jendrusk
Sim? Do OP: "As formas com '0' não têm valor e eu gostaria de interpolar esses valores dos valores dos vizinhos ..."
MakinFlippyFloppy
nenhum valor! = 0, nenhum valor é nulo, portanto, sth nesta pergunta está errada ... seja exemplo ou comentário abaixo, escrevi uma consulta olhando para o exemplo, mas mesmo que 0 no exemplo signifique nulo (é como dizer preto e significa branco) ) você pode sempre usar coalesce () função
Jendrusk
Correto, 0! = NULL, mas o OP quer um exemplo de problema de interpolação espacial. Ele ou ela deseja "preencher" ou interpolar valores ausentes - que, como você indica corretamente, são incorretamente modelados como observações baseadas em zeros de valores conhecidos. Seu cálculo da média local incrementa o denominador para células de valor zero (ou seja, nulas), inclinando assim o valor interpolado para baixo. A coalescência do numerador não faz nada para corrigir esse problema. Seu código também estará errado para TODAS as células nos limites de seus dados.
MakinFlippyFloppy