สร้างรูปหลายเหลี่ยมจากบรรทัดใน PostGIS


13

ฉันพยายามแบ่งรูปหลายเหลี่ยมในรูปหลายเหลี่ยมที่เล็กกว่าจากบรรทัด แต่ฉันคิดว่าฉันไม่สามารถใช้ฟังก์ชัน st_split ได้ สิ่งที่ฉันต้องการคือการสร้างรูปหลายเหลี่ยมขนาดเล็กภายในชิ้นส่วนขนาดใหญ่โดยใช้ตาราง linestring

ฉันลองมาหลายวิธีแล้ว แต่ไม่สามารถรับผลลัพธ์ได้ สิ่งที่ฉันได้ลอง:

แบ่งรูปหลายเหลี่ยมหนึ่งรูปจาก LineString โดยใช้ st_split ()

จากรูปหลายเหลี่ยมขอบเขต

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

และตาราง Linestring:

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

ฉันต้องการรูปหลายเหลี่ยมต่อไปนี้:

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

ปัญหา : ฉันไม่สามารถแบ่งรูปหลายเหลี่ยมออกจากหลาย ๆ เส้นไม่ได้รูปหลายเหลี่ยมจาก Multilinestring

วิธีอื่นที่ฉันพยายามคือการสร้างรูปหลายเหลี่ยมจากบรรทัดที่มี st_polygonize () SQL ที่ฉันพยายามคือ:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

แยกจากการสร้างรูปหลายเหลี่ยมจากส่วนของบรรทัดโดยใช้ PostgreSQL และ PostGIS

ปัญหา : ฉันสามารถรับได้เพียงหนึ่งรูปหลายเหลี่ยม (ขอบเขต)

มีคนบอกฉันได้ไหมว่าจะเป็นวิธีที่ดีที่สุดในการรับรูปหลายเหลี่ยมจากการคืนรูปหรือถ้าฉันทำอะไรหายไป

หมายเหตุ: ตารางอยู่ใน SRID เดียวกันและรูปทรงเรขาคณิตจะถูกจัดวางลงในตาราง ใน QGIS ฉันสามารถเรียกใช้กระบวนการรูปหลายเหลี่ยมจากเส้นตรงไปยังรูปหลายเหลี่ยมได้อย่างสมบูรณ์แบบ

ตามความต้องการของจอห์นนี่คือตารางการเคลื่อนไหว https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
คุณสามารถโพสต์รูปเรขาคณิตที่ใดก็ได้? ST_Polygonize พร้อมกับ ST_Dump ควรใช้งานได้
John Powell

แน่ใจ ฉันแก้ไขโพสต์พร้อมลิงค์ไปยังตารางแล้ว
Pablo Pardo

@ JohnPowellakaBarçaคุณมองสิ่งนี้ได้ไหม คำถามนี้ดีมาก ST_Polygonize ในชุดตัวอย่างของเขาส่งคืนรูปหลายเหลี่ยมเดียว เราจำเป็นต้องแยกย่อยความยุ่งเหยิงของเขาจาก LINESTRINGS ที่เปิดกว้างและค้นหาพวกมันทั้งหมดที่สามารถทำรูปสี่เหลี่ยม?
Evan Carroll

1
@EvanCarroll แน่ใจ ฉันกำลังยุ่งกับตู้เอทีเอ็มอย่างบ้าคลั่งดังนั้นอาจไม่กี่วัน
John Powell

1
@ppardoz Espero que esto te ayude ฉันสังเกตเห็นว่าตารางของคุณ defs ทั้งหมดในภาษาสเปน :-)
จอห์นพาวเวลล์

คำตอบ:


4

ผมได้ทำงานนี้โดยใช้ST_Nodeแรกร่วมกับST_Collect , การแปลงสายเข้าไปในชุดของ LineStrings noded ภายในที่MultiLinestring

ตามที่ระบุไว้ในเอกสารสำหรับST_Node :

โหนดชุดของ linestrings โดยใช้จำนวนโหนดที่เป็นไปได้น้อยที่สุดในขณะที่รักษาอินพุตทั้งหมดไว้

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

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

หากคุณเพิ่งรันส่วนแรกของสิ่งนี้คือ CTE multi ผลลัพธ์จะเป็นดังนี้:

MULTILINESTRING ((204.5 69.9000000000004,204.5 69.9000000000000004), (204.5 68.9,205.4 68.9), (204.5 68.9,204.5 69,204.5 69.1,204.5 69.3,204.5 69.3,204.5 69.4,204.5 69.54 69.44 69.4,204,694.44 69.5,204,694.44 69.4,204,654,694.4 204.5 69.9000000000004), (209.5 68.9,209.5 68.8,209.5 68.7,209.5 68.6,209.5 67.59 67.9 67.49 67.49 67.4,209.5 67.5,209.5 67.59.59.59 67.4,209.59 67.9 , 209.5 .......

ตอนนี้เมื่อคุณฟีด MultiLinestring นี้ไปยังST_Polygonizeมันทำงานได้ตามที่คาดไว้เช่น

POLYGON ((205.4 68.9,204.5 68.9,204.5 69,204.5 69.1,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.4,204.5 69.5,204.5 69.6,204.5 69.8,204.5 69.8,204.5 69.9,204.5,69.4,4.4,69.4,205,205)

POLYGON ((204.5 69.9000000000004,204.5 70,204.5 70.1,204.5 70.2,204.5 70.3,204.5 70.4,204.5 70.4,209.5 70.4,209.5 70.2,209.5 70.2,209.5 70.1,209.5 70.9)

POLYGON ((206.8 70.4,204.5 70.4,204.5 70.5,204.5 70.6,204.5 70.7,204.5 70.8,204.5 70.8,204.5 70.9,204.5 71,204.5 71.1,204.5 71.3,204.5 71.4,206.5 71.4,206.8 71.4,206.8 71.4,206.8 71.4,206.8 71.4,206.8

เห็นได้ชัดว่า ST_AsText เป็นเพียงภาพประกอบและคุณจะต้องปรับแต่งถ้าคุณต้องการ ID พา ธ ด้วย

ประเด็นสำคัญคือST_Polygonize คาดว่า linestrings ที่อธิบายโครงร่างของรูปหลายเหลี่ยมซึ่งเป็นสิ่งที่ ST_Node (ST_Collect (.... ทำในข้างต้น)


มันยอดเยี่ยมจริงๆฉันสามารถยืนยันได้ว่าวิธีนี้ใช้งานได้! ในด้านพลิกฉันสงสัยว่าทำไมST_Polygonize()บอกว่าใช้สายสตริงหรือสิ่งที่กรณีการใช้งานสำหรับสิ่งนั้นโดยไม่ต้องโทรST_Node()ก่อน
Evan Carroll

1
@EvanCarroll ฉันคิดว่าคำตอบคือ ST_Polygonize ใช้ Linestrings ที่มีอยู่แล้วในชุดที่เป็นตัวแทนของรูปหลายเหลี่ยมในขณะที่ linestrings ในคำถามนี้ประกอบด้วยหลายรูปหลายเหลี่ยมที่เป็นไปได้ ฉันเข้าใจว่านี่คือสิ่งที่ ST_Node ทำ ฉันจะพยายามสืบหาเพิ่มเติมและอัปเดตคำตอบ
John Powell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.