Hex-Gitterwertinterpolation in POSTGIS


8

Ich habe eine Tabelle mit tessellierten Sechsecken, die ich als Hex-Binning-Gitter erstellt habe, um einen Bereich abzudecken.

Ich habe dann eine Punktmenge überlagert, um einigen Sechsecken einen Wert zu geben, siehe Abbildung: -

Geben Sie hier die Bildbeschreibung ein

Die Formen mit dem Wert "0" haben keinen Wert und ich möchte diese aus den Werten der Nachbarn gemäß Kriging interpolieren. Wie kann ich dies in Postgres erreichen, wenn meine Tabelle wie folgt aussieht: -

hex_grid_data
(
 gid SERIAL,
 wkb_geometry (geometry),
 value INTEGER
)

Können Sie Kriging in Postgis verwenden? Schauen Sie sich diesen Thread an gis.stackexchange.com/questions/1041/…
GISKid

Sind Sie mit Kriging besonders verheiratet? Würde eine andere Interpolationsmethode funktionieren?
MakinFlippyFloppy

Was meinst du mit Interpolation? Wäre der Durchschnitt aller Nachbarn ein guter Wert?
Jendrusk

Jede Interpolationsmethode wäre in Ordnung.
user1331131

Aus Neugier - warum aus dem Hex-Gitter interpolieren, wenn Sie Werte aus einer Punktmenge haben, die Sie für die Interpolation verwenden könnten?
Simbamangu

Antworten:


5

Ich weiß nicht, um welche Art von Interpolation es sich handelt, aber wenn der Durchschnitt aller Nachbarn einen guten Wert hat, könnte dies die Lösung sein:

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
  )

Oder wenn Sie @MakinFlippyFloppy folgen, bezweifeln Sie, dass wirklich 0 im Beispiel null bedeutet (kein Wert):

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
  )

Oder wenn Null- oder Nullwerte den Durchschnitt nicht verringern sollen:

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
  )

Die Art und Weise, wie Sie den Durchschnitt berechnen, würde sich verzerren, da der Zähler und der Nenner Zellen mit dem Wert Null enthalten. Aus seiner Problembeschreibung geht hervor, dass seine nullwertigen Zellen angemessener als Nullen angesehen werden.
MakinFlippyFloppy

@ MakinFlippyFloppy - Nein? Der Nenner ist immer 6, um einen Fehler beim Teilen durch Null zu vermeiden. Auf dem Beispiel gibt es 0 nicht null ... hoffe ich muss hier nicht erklären, dass das nicht dasselbe ist :) Auch wenn es sechsmal null Interpolation gibt, wird die eine oder andere Weise null sein
Jendrusk

Ja? Aus OP: "Die Formen mit '0' haben keinen Wert und ich möchte diese Werte aus den Werten der Nachbarn interpolieren ..."
MakinFlippyFloppy

kein Wert! = 0, kein Wert ist null, also ist etw in dieser Frage falsch ... ob Beispiel oder Kommentar darunter Ich habe eine Abfrage geschrieben, die ein Beispiel betrachtet, aber selbst wenn 0 im Beispiel null bedeutet (es ist, als würde man Schwarz sagen und Weiß bedeuten ) Sie können immer die Funktion coalesce () verwenden
Jendrusk

Richtig, 0! = NULL, aber was OP will, ist ein Beispiel für ein räumliches Interpolationsproblem. Er oder sie möchte fehlende Werte "ausfüllen" oder interpolieren - die, wie Sie richtig hervorheben, fälschlicherweise als auf Null basierende Beobachtungen bekannter Werte modelliert werden. Durch die Berechnung des lokalen Durchschnitts wird der Nenner für Zellen mit dem Wert Null (dh Null) erhöht, wodurch der interpolierte Wert nach unten verschoben wird. Das Zusammenführen des Zählers behebt dieses Problem nicht. Ihr Code ist auch für ALLE Zellen an der Grenze seiner Daten falsch.
MakinFlippyFloppy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.