Interpolation de valeurs de grille hexadécimale dans POSTGIS

8

J'ai une table d'hexagones en mosaïque que j'ai créé comme une grille de binning hexagonale pour couvrir une zone.

J'ai ensuite superposé un ensemble de points pour donner une valeur à certains hexagones, voir le diagramme: -

entrez la description de l'image ici

Les formes avec la valeur "0" n'ont aucune valeur et je voudrais les interpoler à partir des valeurs des voisins selon Kriging. Comment puis-je accomplir cela en postgres étant donné que ma table ressemble à: -

hex_grid_data
(
 gid SERIAL,
 wkb_geometry (geometry),
 value INTEGER
)
user1331131
la source
Pouvez-vous utiliser le krigeage dans les postgis? Consultez ce fil gis.stackexchange.com/questions/1041/…
GISKid
Êtes-vous marié à utiliser le krigeage en particulier? Une autre méthode d'interpolation fonctionnerait-elle?
MakinFlippyFloppy
Qu'entendez-vous par interpolation? La moyenne de tous les voisins serait-elle d'un bon rapport qualité-prix?
Jendrusk
Toute méthode d'interpolation conviendrait.
user1331131
Par curiosité - pourquoi interpoler à partir de la grille hexadécimale lorsque vous avez des valeurs d'un ensemble de points que vous pouvez utiliser pour l'interpolation?
Simbamangu

Réponses:

5

Je ne sais pas de quel type d'interpolation vous parlez, mais si la moyenne de tous les voisins sera bonne, cela pourrait être la solution:

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 suivre @MakinFlippyFloppy doute si vraiment 0 dans l'exemple signifie null (aucune valeur):

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 si les valeurs nulles ou nulles ne doivent pas diminuer la moyenne:

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
la source
La façon dont vous calculez la moyenne serait asymétrique, car le numérateur et le dénominateur incluent des cellules de valeur nulle. D'après sa description du problème, il me semble que ses cellules à valeur nulle sont plus correctement considérées comme nulles.
MakinFlippyFloppy
@MakinFlippyFloppy - Non? Le dénominateur est toujours 6 pour éviter les erreurs de division par zéro. Sur l'exemple, il y a 0 non nul ... j'espère que je n'ai pas à expliquer ici que ce n'est pas pareil :) Même s'il y aura six fois l'interpolation nulle d'une manière ou d'une autre sera nulle
Jendrusk
Oui? De OP: "Les formes avec '0' n'ont aucune valeur et je voudrais interpoler ces valeurs à partir des valeurs des voisins ..."
MakinFlippyFloppy
pas de valeur! = 0, aucune valeur n'est nulle, donc qc dans cette question est faux ... que ce soit un exemple ou un commentaire en dessous j'ai écrit une requête en regardant l'exemple, mais même si 0 dans l'exemple signifie null (c'est comme dire noir et signifiant blanc ) vous pouvez toujours utiliser la fonction coalesce ()
Jendrusk
Correct, 0! = NULL, mais ce que souhaite OP est un exemple de problème d'interpolation spatiale. Il ou elle veut «remplir» ou interpoler les valeurs manquantes - qui, comme vous le signalez correctement, sont incorrectement modélisées comme des observations basées sur des zéros de valeurs connues. Votre calcul de la moyenne locale incrémente le dénominateur pour les cellules de valeur nulle (c.-à-d. Nulles), biaisant ainsi la valeur interpolée vers le bas. La coalescence du numérateur ne résout en rien ce problème. Votre code sera également erroné pour TOUTES les cellules à la limite de ses données.
MakinFlippyFloppy