Interpolación de valor de cuadrícula hexadecimal en POSTGIS

8

Tengo una tabla de hexágonos teselados que creé como una cuadrícula de agrupamiento hexadecimal para cubrir un área.

Luego superpuse un conjunto de puntos para dar un valor a algunos de los hexágonos, vea el diagrama:

ingrese la descripción de la imagen aquí

Las formas con el valor "0" no tienen valor y me gustaría interpolarlas a partir de los valores de los vecinos según Kriging. ¿Cómo puedo lograr esto en postgres dado que mi tabla se ve así: -

hex_grid_data
(
 gid SERIAL,
 wkb_geometry (geometry),
 value INTEGER
)
usuario1331131
fuente
¿Puedes usar kriging en postgis? Echa un vistazo a este hilo gis.stackexchange.com/questions/1041/…
GISKid
¿Estás casado con el uso de kriging en particular? ¿Funcionaría otro método de interpolación?
MakinFlippyFloppy
¿Qué quieres decir con interpolación? ¿El promedio de todos los vecinos será un buen valor?
Jendrusk
Cualquier método de interpolación estaría bien.
user1331131
Por curiosidad, ¿por qué interpolar desde la cuadrícula hexadecimal cuando tiene valores de un conjunto de puntos que podría usar para la interpolación?
Simbamangu

Respuestas:

5

No sé de qué tipo de interpolación estás hablando, pero si el promedio de todos los vecinos será un buen valor, esta podría ser la solución:

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
  )

O siguiendo las dudas de @MakinFlippyFloppy si realmente 0, por ejemplo, significa nulo (sin 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
  )

O si los valores nulos o cero no deberían disminuir el promedio:

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
fuente
La forma en que calcula el promedio sería sesgada porque el numerador y el denominador incluyen celdas de valor cero. A partir de la descripción de su problema, me parece que sus celdas de valor cero se consideran más nulas.
MakinFlippyFloppy
@MakinFlippyFloppy - ¿No? El denominador siempre es 6 para evitar el error de división por cero. En el ejemplo hay 0 no nulo ... espero no tener que explicar aquí que no es lo mismo :) Incluso si habrá seis veces cero interpolación de una forma u otra será cero
Jendrusk
¿Si? De OP: "Las formas con '0' no tienen valor y me gustaría interpolar estos valores de los valores de los vecinos ..."
MakinFlippyFloppy
sin valor! = 0, ningún valor es nulo, entonces algo en esta pregunta está mal ... ya sea ejemplo o comentario debajo, escribí la consulta mirando el ejemplo, pero incluso si 0 en ejemplo significa nulo (es como decir negro y significa blanco ) siempre puedes usar la función coalesce ()
Jendrusk
Correcto, 0! = NULL, pero lo que OP quiere es un ejemplo de un problema de interpolación espacial. Él o ella quiere "completar" o interpolar valores perdidos, que, como usted señala correctamente, están incorrectamente modelados como observaciones basadas en ceros de valores conocidos. Su cálculo del promedio local incrementa el denominador para las celdas de valor cero (es decir, nulas), sesgando así el valor interpolado hacia abajo. Fusionar el numerador no hace nada para solucionar este problema. Su código también será incorrecto para TODAS las celdas en el límite de sus datos.
MakinFlippyFloppy