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
)

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
  )

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.