วิธีการแปลงไอโซลีนเป็นไอโซโทปกอนด้วยโพสต์จิส?


9

ฉันมีตารางหนึ่งตารางของ isolines ที่กำหนดไว้ดังนี้:

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

เห็นวัตถุ linestring นี้มีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันรู้ขอบเขตของข้อมูลของฉันดังนั้นฉันสามารถเพิ่ม Bbox ได้ดังนั้น LineStrings จึงสามารถปิดได้

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการสร้างตารางของ isopolygons myisopolygonsจากmyisolinesตารางที่มีรูปหลายเหลี่ยมที่จะไม่ทับซ้อนกัน แต่สร้างพื้นผิวต่อเนื่องและมีคอลัมน์ที่valมีvalisolines ต่ำสุดซึ่งเป็นรูปหลายเหลี่ยมที่เกิดขึ้น ฉันเข้าใจว่ามันสามารถเกิดขึ้นได้จากตัวแยกไอโซ (เกาะ) หรือไอโซที่ปิดด้วย bbox ในกรณีนั้นvalควรนำมาจากไอโซนั้น มองเห็นควรมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันคิดว่าฉันสามารถสร้างโทโพโลยีแล้วเปลี่ยนรูปใบหน้าเป็นรูปหลายเหลี่ยมได้ แต่ฉันไม่เข้าใจวิธีการทำอย่างถูกต้อง สิ่งนี้สามารถทำได้?

อีกทางเลือกหนึ่งคือการใช้ฟังก์ชั่นความแตกต่างระหว่าง bbox และรูปหลายเหลี่ยมที่สร้างขึ้นซ้ำ ๆ แต่ฉันคิดว่านั่นไม่ใช่วิธีที่ถูกต้องที่จะทำและไม่เร็วเลย


ST_Split หรือ ST_BuildArea เป็นตัวเลือกที่ดีสำหรับปัญหาของคุณ
นิค

คำตอบ:


3

ST_Polygonizeนี่เป็นทางออกที่ใช้ มันสร้างรูปหลายเหลี่ยมสำหรับแต่ละขอบเขตและให้ระดับความสูงต่ำสุดและสูงสุดที่ครอบคลุมโดยรูปหลายเหลี่ยม อัลกอริทึมไม่สามารถแยกแยะความแตกต่างระหว่างจุดสูงสุดและความหดหู่ใจและจะคืนค่าระดับความสูงเดียวกันทั้ง min และ max ในกรณีนี้

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;

ส่วนWITHคำสั่งของแบบสอบถาม "ปิด" รูปทรงเปิดใด ๆ โดยการรวมกลุ่มกับขอบเขตที่มีการหดตัวเล็กน้อยของรูปทรงที่มีอยู่ (ขอบเขตคือสัญญาเพื่อล้างข้อผิดพลาดรอบออกใด ๆ ที่เป็นผลมาจากการใช้งานST_Extentซึ่งผลิตกล่องความแม่นยำเดียวด้วยST_Polygonizeซึ่งต้องใช้ปิดอย่างสมบูรณ์และอินพุต nodes ในความแม่นยำ doulbe) หากรูปทรงของคุณปิดไปแล้ว (เช่นคุณกำลังทำงานกับเกาะ) คุณสามารถข้ามขั้นตอนนี้ได้


0

ฉันไม่กระตือรือร้นมากนัก แต่ฉันจะลองใช้ฟังก์ชั่นเรขาคณิต ST_MakePolygon


แต่นั่นไม่ได้ตอบคำถามอย่างเต็มที่
John Powell

0

การใช้ bbox ของคุณและวนซ้ำในแต่ละเส้นชั้นความสูงคุณสามารถใช้ST_ConcaveHullในการแปลงแต่ละภูมิภาคเป็นรูปหลายเหลี่ยม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.