Nội suy giá trị lưới hex trong POSTGIS


8

Tôi có một bảng các hình lục giác tessellated mà tôi đã tạo như một lưới binning hex để bao phủ một khu vực.

Sau đó, tôi đã phủ lên một điểm được đặt để cung cấp cho một số hình lục giác một giá trị, xem sơ đồ: -

nhập mô tả hình ảnh ở đây

Các hình có giá trị "0" không có giá trị và tôi muốn nội suy chúng từ các giá trị của hàng xóm theo Kriging. Làm thế nào tôi có thể thực hiện điều này trong các postgres khi bảng của tôi trông như sau: -

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

Bạn có thể sử dụng kuceing trong postgis? Kiểm tra chủ đề này gis.stackexchange.com/questions/1041/ từ
GISKid

Bạn đã kết hôn với việc sử dụng đặc biệt? Một phương pháp nội suy khác sẽ làm việc?
MakinFlippyFloppy

Bạn có ý nghĩa gì bởi nội suy? Trung bình của tất cả các hàng xóm sẽ có giá trị tốt?
Jendrusk

Bất kỳ phương pháp nội suy sẽ tốt.
user1331131

Vì tò mò - tại sao phải nội suy từ lưới hex khi bạn có các giá trị từ một tập hợp điểm mà bạn có thể sử dụng để nội suy?
Simbamangu

Câu trả lời:


5

Tôi không biết bạn đang nói về loại nội suy nào nhưng nếu trung bình của tất cả các hàng xóm sẽ có giá trị tốt thì đây có thể là giải pháp:

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
  )

Hoặc theo dõi @MakinFlippyFloppy nghi ngờ nếu thực sự 0 trong ví dụ có nghĩa là null (không có giá trị):

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
  )

Hoặc nếu giá trị null hoặc zero không nên giảm trung bình:

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
  )

Cách tính trung bình của bạn sẽ lệch thấp vì tử số và mẫu số bao gồm các ô có giá trị bằng không. Từ mô tả vấn đề của anh ấy, có vẻ như tôi là các ô không có giá trị của anh ấy được xem một cách thích hợp hơn là null.
MakinFlippyFloppy

@MakinFlippyFloppy - Không? Mẫu số luôn là 6 để ngăn lỗi chia cho 0. Trong ví dụ này có 0 không null ... hy vọng tôi không phải giải thích ở đây không giống nhau :) Ngay cả khi sẽ có sáu lần nội suy bằng 0 theo cách này hay cách khác sẽ bằng 0
Jendrusk

Đúng? Từ OP: "Các hình có '0' không có giá trị và tôi muốn nội suy các giá trị này từ các giá trị của hàng xóm ..."
MakinFlippyFloppy

không có giá trị nào ) bạn luôn có thể sử dụng hàm coalesce ()
Jendrusk

Đúng, 0! = NULL, nhưng những gì OP muốn là một ví dụ về vấn đề nội suy không gian. Anh ấy hoặc cô ấy muốn "điền vào" hoặc nội suy các giá trị còn thiếu - mà, như bạn chỉ ra một cách chính xác, được mô hình không chính xác như các quan sát dựa trên các giá trị đã biết. Tính toán của bạn về mức trung bình cục bộ làm tăng mẫu số cho các ô có giá trị bằng không (nghĩa là null), do đó làm lệch giá trị nội suy xuống dưới. Liên kết tử số không làm gì để khắc phục vấn đề này. Mã của bạn cũng sẽ sai đối với TẤT CẢ các ô ở ranh giới dữ liệu của người đó.
MakinFlippyFloppy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.