วิธีเพิ่มความเร็วในการแบ่งพื้นที่ใน postgis?


9

ฉันมีรูปหลายเหลี่ยมซ้อนกันและฉันพยายามแบ่งพื้นที่เพื่อหลีกเลี่ยงการซ้อนทับกัน ฉันคิดว่าปัญหาของฉันค่อนข้างง่าย การใช้ผลิตภัณฑ์ ESRI และhttp://arcscripts.esri.com/details.asp?dbid=16700เพื่อนร่วมงานของฉันคำนวณใน 48 วินาที

ฉันพยายามทำกับ postgis โดยใช้http://s3.opengeo.org/postgis-power.pdf#page=24 (คาดเดารายละเอียดโดยใช้http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopologyเป็นแรงบันดาลใจ) แต่มันช้ามากที่ฉันทำไม่ได้กับโพลีมากกว่า 10 อัน (ฉันมี 800 อันเพื่อแยก) ส่วนที่ช้าคือ ST_Union ฉันลองสิ่งต่าง ๆ แต่ไม่มีที่ไหนที่ประสบความสำเร็จนี่คือสถานการณ์ปัจจุบัน:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

สิ่งนี้ได้รับการคำนวณเป็นเวลา 26 นาที (linemerge () ไม่ใช่จริง) โพลีคือ MultiPolygons ในกรณีที่ st_dump ทำผิดพลาดคุณ

คุณมีเคล็ดลับหรือไม่? st_union () ของ linework เป็นส่วนที่ช้ามาก

ขอบคุณ

นิโก้

PS: นี่คือตัวเลขบางส่วน: 852 มัลติโพลิกอน, นำไปสู่ ​​14880 รูปหลายเหลี่ยม, นำไปสู่ ​​21467 linestrings รวมยอด 315513 จุด


หากไม่มีใครตอบคุณอาจต้องการลองใช้จดหมายข่าว postGIS
GIS-Jonathan

ฉันไม่ได้ชอบรายชื่อผู้รับจดหมายมากไปกว่านั้นอาจเป็นปัญหาของ GEOS ซึ่งอาจบ่นเกี่ยวกับ JTS และฉันชอบเปิดปัญหาอยู่
nraynaud

โดยการรวบรวม linework และทำการรวมกลุ่มกับเรขาคณิตที่ว่างเปล่าฉันสามารถทำได้ใน 800s: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT ว่าง'), 900913)) ที่เกือบ 20 เท่าของ ESRI
nraynaud

1
จากหน่วยความจำให้ลองวาง st_union จาก st_linemerge (st_union ... ) ถ้ามันช่วย
simplexio

คำตอบ:


3

คำตอบนี้อาจไม่ช่วย @nraynaud โดยตรง แต่หวังว่าจะทำให้มีแสงสว่างในเรื่องนี้

มีปัญหาที่คล้ายกันใน spatiaLite <4.0 เนื่องจากปัญหากับ GEOS ดูลิงค์นี้สำหรับการอภิปรายของปัญหา

วิธีแก้ปัญหาคือการแทนที่ฟังก์ชัน ST_Union () ด้วย ST_UnaryUnion (ST_Collect ()) น่าเสียดายที่ ST_UnaryUnion ไม่สามารถใช้ได้จนกว่าจะโพสต์ GIS 2.0 (เท่าที่ฉันจะบอกได้)


1

คุณใช้ PostGIS รุ่นใด การรวมกันช้ากว่ากันมากหากคุณใช้ PostGIS <1.4 หรือ GEOS <3.2 การรวมกันเร็วขึ้นมากใน 1.4 แต่ก็ต้องการ GEOS 3.2+ ด้วย ดังนั้นก่อนถ้าคุณใช้ต่ำกว่า 1.4 ฉันจะอัปเกรดเป็นอย่างน้อย 1.5

SELECT postgis_full_version();

เพื่อตรวจสอบ.

ยังเป็นความตั้งใจของคุณที่จะรักษาขอบดั้งเดิมของรูปหลายเหลี่ยม หากคุณต้องการยุบพื้นที่ที่ทับซ้อนกัน

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

จะทำเคล็ดลับ


สวัสดีนี่คือผลลัพธ์: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel 4.8.0, 6 มีนาคม 2555 "LIBXML =" 2.7.3 "USE_STATS" ฉันไม่พบการเพิ่มที่เกี่ยวข้องกับสหภาพใน GEOS เมื่อเร็ว ๆ นี้ ฉันพบการเร่งความเร็วหนึ่งครั้งในสหภาพรูปหลายเหลี่ยม แต่ฉันไม่ได้ผสานรูปหลายเหลี่ยมเข้าด้วยกันและการเร่งความเร็วนี้ดูขัดแย้งกัน ฉันไม่ต้องการรวมกันรูปหลายเหลี่ยมของฉันเพราะฉันต้องเพิ่มค่าสำหรับรูปหลายเหลี่ยมที่ทับซ้อนกัน
nraynaud
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.