Interpolasi nilai kisi heks di POSTGIS

8

Saya memiliki tabel segi enam tessellated yang saya buat sebagai kisi binning hex untuk menutupi area.

Saya kemudian overlay titik yang ditetapkan untuk memberikan beberapa segi enam nilai, lihat diagram: -

masukkan deskripsi gambar di sini

Bentuk dengan nilai "0" tidak memiliki nilai dan saya ingin menyisipkan ini dari nilai tetangga sesuai Kriging. Bagaimana saya bisa melakukan ini di postgres mengingat tabel saya terlihat seperti: -

hex_grid_data
(
 gid SERIAL,
 wkb_geometry (geometry),
 value INTEGER
)
pengguna1331131
sumber
Bisakah Anda menggunakan kriging di postgis? Lihat utas ini gis.stackexchange.com/questions/1041/…
GISKid
Apakah Anda menikah dengan menggunakan kriging pada khususnya? Apakah metode interpolasi lain berfungsi?
MakinFlippyFloppy
Apa yang Anda maksud dengan interpolasi? Apakah rata-rata semua tetangga akan bernilai baik?
Jendrusk
Metode interpolasi apa pun akan baik-baik saja.
user1331131
Karena penasaran - mengapa interpolasi dari hex grid ketika Anda memiliki nilai dari set point yang dapat Anda gunakan untuk interpolasi?
Simbamangu

Jawaban:

5

Saya tidak tahu interpolasi seperti apa yang Anda bicarakan, tetapi jika rata-rata semua tetangga memiliki nilai bagus, ini bisa menjadi solusinya:

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
  )

Atau mengikuti @MakinFlippyFloppy ragu jika benar-benar 0 misalnya berarti nol (tidak ada nilai):

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
  )

Atau jika nilai nol atau nol tidak boleh mengurangi rata-rata:

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
sumber
Cara Anda menghitung rata-rata akan cenderung rendah karena pembilang dan penyebutnya termasuk sel bernilai nol. Dari uraian masalahnya, bagi saya sepertinya sel-sel bernilai nol lebih tepat dipandang sebagai nol.
MakinFlippyFloppy
@MakinFlippyFloppy - Tidak? Penyebut selalu 6 untuk mencegah kesalahan divide-by-zero. Pada contoh ada 0 bukan nol ... harap saya tidak perlu menjelaskan di sini bahwa itu tidak sama :) Bahkan jika akan ada enam kali nol interpolasi satu atau lain cara akan menjadi nol
Jendrusk
Iya? Dari OP: "Bentuk dengan '0' tidak memiliki nilai dan saya ingin menginterpolasi nilai-nilai ini dari nilai tetangga ..."
MakinFlippyFloppy
tidak ada nilai! = 0, tidak ada nilai nol, jadi sth dalam pertanyaan ini salah ... apakah contoh atau komentar di bawahnya saya menulis kueri mencari contoh, tetapi bahkan jika 0 dalam contoh berarti nol (Ini seperti mengatakan hitam dan berarti putih ) Anda selalu dapat menggunakan fungsi coalesce ()
Jendrusk
Benar, 0! = NULL, tetapi yang diinginkan OP adalah contoh masalah interpolasi spasial. Ia ingin "mengisi" atau menginterpolasi nilai-nilai yang hilang - yang, seperti yang Anda tunjukkan dengan benar, dimodelkan secara salah sebagai pengamatan berbasis nilai nol terhadap nilai-nilai yang diketahui. Perhitungan Anda dari rata-rata lokal menambah penyebut untuk sel bernilai nol (yaitu, nol), sehingga memiringkan nilai yang diinterpolasi ke bawah. Penggabungan pembilang tidak melakukan apa pun untuk memperbaiki masalah ini. Kode Anda juga akan salah untuk SEMUA sel di batas datanya.
MakinFlippyFloppy