มีฟังก์ชันการละลายใน PostGIS นอกเหนือจาก st_union หรือไม่


22

ฉันกำลังมองหาฟังก์ชั่นที่จะละลายขอบเขตการแชร์ระหว่างคุณสมบัติรูปหลายเหลี่ยมในตาราง ST_UNION () เกือบจะทำในสิ่งที่ฉันกำลังมองหา แต่มันก็สร้างรูปหลายเหลี่ยมจากรูปหลายเหลี่ยมทั้งหมดในเลเยอร์โดยไม่คำนึงว่าพวกเขาแบ่งปันขอบเขตทั่วไปหรือไม่ ฉันควรละลายขอบเขตระหว่างรูปหลายเหลี่ยมที่สัมผัสกันเท่านั้น ฉันคิดว่าควรมีวิธีใช้ ST_TOUCHES () แต่แล้วความต้องการฟังก์ชั่นการละลายดูเหมือนเป็นเรื่องธรรมดาที่ฉันจะแปลกใจหากไม่มีฟังก์ชันในตัวที่จะทำให้บรรลุผล

กรณีการใช้งานมีลักษณะดังนี้: ฉันดาวน์โหลดข้อมูล Corine Landcover สำหรับประเทศยุโรปขนาดใหญ่และฉันต้องการที่จะละลายขอบเขตระหว่างชนิดของป่าต่าง ๆ (ประมาณ 75,000 รูปหลายเหลี่ยมในหนึ่งตาราง) ฉันลอง ST_UNION แล้ว แต่มันทำให้ฉันมีข้อผิดพลาด "หน่วยความจำไม่เพียงพอ" (30,000 รูปหลายเหลี่ยมใช้งานได้):

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

หมายเหตุ: รหัสฟอเรสต์ทั้งหมดเริ่มต้นด้วย '31' และฉันใช้ PostGIS 1.4 รุ่น GEOS: 3.2.0-CAPI-1.6.0

คำตอบ:


21

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


4
เยี่ยมมากที่มีคุณอยู่ที่นี่ Paul ขอบคุณที่นำความเชี่ยวชาญที่หาที่เปรียบมิได้ให้คุณ
fmark

1
ขอบคุณดูเหมือนว่าปัญหาของฉันยังไม่เล็กพอ ST_MemUnion () ได้ทำงานเป็นเวลา 24 ชั่วโมงแล้ว ฉันจะพยายามแยกปัญหา
underdark

5

ฉันเชื่อว่า ST_Dump เป็นสิ่งที่คุณต้องการ:

ST_Dump :

ส่งคืนชุดของแถว geometry_dump (geom, path) ที่ประกอบเป็นเรขาคณิต g1 ... ตัวอย่างเช่นสามารถใช้เพื่อขยาย MULTIPOLYGONS ไปยัง POLYGONS ...

ดังนั้นสำหรับกรณีของคุณ:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

ฉันไม่แน่ใจว่ามันจะโต้ตอบกับการสร้างตารางที่คุณพยายามทำอย่างไร แต่ควรให้รูปทรงเรขาคณิตเป็นรายการแยกต่างหาก จากนั้นคุณจะสามารถทำการรวมเชิงพื้นที่ (โดยใช้ && และ ST_Contains) ระหว่างสองตารางเพื่อรวบรวมข้อมูลไปยังรูปทรงเรขาคณิต


2
หมายเหตุ: สิ่งนี้จะมีประโยชน์ก็ต่อเมื่อคุณได้รับปัญหาหน่วยความจำของการจัดการ ST_Union! :)
yhw42

4

PostGIS ของคุณรวบรวมกับ GEOS 3.1.0+ หรือไม่ สำหรับเวอร์ชั่นนั้นสหภาพที่เรียงซ้อนกันเร็วกว่านั้นถูกนำไปใช้งาน แต่ถ้าไม่พบจะใช้รหัสที่เก่ากว่าซึ่งเป็นคำสั่งของขนาดที่ช้ากว่า

อัปเดต : ดูเหมือนว่า PostGIS ของคุณใช้วิธีการรวมกันแบบต่อเรียง แต่ความอดอยากในหน่วยความจำนั้นเป็นเรื่องจริง ฉันจะลองเพิ่มหน่วยความจำที่มีอยู่ให้กับอินสแตนซ์ Postgres ของคุณต่อไปนี้เป็นคำแนะนำจากการพูดคุย FOSS4G PostGISของพอลแรมซีย์2007 :

  • การเข้าถึงดิสก์ช้าทำให้สามารถรับประสิทธิภาพที่สูงขึ้นได้โดยใช้หน่วยความจำเพิ่มเติมในการแคชข้อมูล
    • เพิ่ม shared_buffers
    • RAM จริง - ระบบปฏิบัติการต้องการ * 75%
  • การเรียงลำดับเร็วขึ้นในหน่วยความจำ
    • เพิ่ม work_mem
  • การล้างดิสก์เร็วขึ้นด้วยหน่วยความจำมากขึ้น
    • เพิ่ม maintenance_work_mem
  • จัดสรรต่อการเชื่อมต่อ
  • ด้วย
    • เพิ่ม wal_buffers
    • เพิ่ม checkpoint_segments
    • ลดลง random_page_cost

ในกรณีของคุณฉันจะลองเพิ่มshared_buffersคำแนะนำทั่วไปคือ 25% ของหน่วยความจำที่มีอยู่ของคุณสำหรับเซิร์ฟเวอร์ฐานข้อมูล แต่ลองเพิ่มขึ้นเป็น 3-4 เท่าของมูลค่าปัจจุบันและดูว่ามันเสร็จสมบูรณ์หรือไม่


postgis_geos_version () ส่งคืน: 3.2.0-CAPI-1.6.0 ... ฉันเดาว่าไม่เป็นไร จะลอง ST_Collect ขอบคุณ
underdark

ST_Collect ดูเหมือนจะไม่ละลายขอบเขตใด ๆ และมันก็สร้าง Multipolygon ยักษ์หนึ่งอัน
underdark

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