Làm thế nào để biến đổi các cô lập thành isopolygons với postgis?


9

Tôi có một bảng một bảng postgis của các phân lập được định nghĩa như thế này:

CREATE TABLE myisolines
(
  gid serial NOT NULL,
  isotime timestamp without timezone,
  val numeric(10,4),
  geom geometry(LineString,4326)
);

Trực quan các đối tượng linestring này trông như thế này:

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

Tôi biết phạm vi không gian của dữ liệu của mình, vì vậy tôi có thể thêm Bbox, vì vậy LineStrings có thể được đóng lại.

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

Tôi muốn tạo một bảng isopolygons myisopolygonstừ myisolinesbảng, với đa giác, không trùng nhau nhưng tạo ra một bề mặt liên tục và có một cột valcó các cô lập thấp nhất val, từ đó đa giác được hình thành. Tôi hiểu nó có thể được hình thành từ isoline tự đóng (đảo) hoặc isoline đóng bằng bbox, trong trường hợp đó valnên được lấy từ isoline cụ thể đó. Nhìn bề ngoài nó sẽ trông như thế này:

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

Tôi nghĩ rằng tôi có thể tạo cấu trúc liên kết bằng cách nào đó và sau đó biến đổi khuôn mặt thành đa giác, nhưng tôi không hiểu làm thế nào để làm điều đó đúng. Điều này có thể giải quyết như thế nào?

Một lựa chọn khác là sử dụng đệ quy một hàm khác biệt giữa bbox và mỗi đa giác được tạo, nhưng tôi đoán đó không phải là cách đúng để làm điều đó, và chắc chắn không nhanh chút nào.


ST_Split hoặc ST_BuildArea là những ứng cử viên sáng giá cho vấn đề của bạn
biệt danh

Câu trả lời:


3

Đây là một giải pháp sử dụng ST_Polygonize. Nó tạo ra một đa giác cho mỗi ranh giới, và cung cấp độ cao tối thiểu và tối đa được bao phủ bởi đa giác. Thuật toán không thể phân biệt giữa cực đại và trầm cảm và sẽ trả về cùng một độ cao cho cả cực tiểu và cực đại trong các trường hợp này.

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

Các WITHđiều khoản của truy vấn "đóng cửa" bất cứ đường nét mở bởi unioning chúng với mức độ nhẹ-hợp đồng của những đường nét hiện có. (Phạm vi được ký hợp đồng để rửa sạch mọi lỗi làm tròn do sử dụng ST_Extent, tạo ra một hộp có độ chính xác duy nhất, với ST_Polygonizeyêu cầu đầu vào được đóng hoàn toàn và gật đầu với độ chính xác doulbe). Nếu các đường viền của bạn đã bị đóng (nghĩa là bạn đang làm việc với một hòn đảo), thì bước này có thể được bỏ qua.


0

Tôi không có nhiều kinh nghiệm, nhưng tôi sẽ thử chức năng hình học ST_MakePolygon (biểu đồ ngoài hình học, hình học [] nội tuyến);


Điều đó không thực sự trả lời câu hỏi đầy đủ.
John Powell

0

Sử dụng hộp thư của bạn và lặp lại qua từng đường đồng mức, bạn có thể sử dụng ST_ConcaveHullđể chuyển đổi từng vùng thành đa giác.

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.