เข้าร่วมรูปหลายเหลี่ยมขนาดเล็กจำนวนมากเพื่อสร้างรูปหลายเหลี่ยมที่มีขนาดใหญ่ขึ้นโดยใช้ PostGIS


47

ฉันมีเลเยอร์ต่อไปนี้ใช้ SRID 27700 ใน postgis:

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

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

สิ่งที่ฉันต้องการทำคือการทำให้รูปหลายเหลี่ยมของมณฑลใหญ่ขึ้นจากรูปเล็กในเขตที่กำหนดดังนั้น EG ในภาพด้านบนรูปหลายเหลี่ยมสีนกเป็ดน้ำจะกลายเป็นรูปหลายเหลี่ยมขนาดใหญ่หนึ่งรูปจากวงแหวนด้านนอกเดียวที่มี polys ทั้งหมดในนั้น สีเช่นสีม่วง, น้ำตาล, ชมพู, เทา ฯลฯ อย่างชาญฉลาดควรรวมกันเป็นหนึ่งเดียว

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

แต่มันก็สร้างรูปทรงที่แตกซึ่งฉันมีปัญหาใหญ่ในการประมวลผลต่อไป

ฉันกำลังพยายามทำแผนที่ระดับเคาน์ตีที่เรียบง่ายขึ้นด้วยพื้นที่เอาท์พุทหลักใน

โซลูชันใด ๆ ก็ไม่จำเป็นต้องอยู่ใน Postgis เช่นกันฉันได้ติดตั้งสแต็ค OS4Geo เต็มเวอร์ชั่นล่าสุดของ QGis และอุปกรณ์อื่น ๆ มากกว่าที่ฉันสามารถจับได้

สิ่งเดียวที่ฉันไม่มีคือชายใหญ่อย่าง ArcGis (แม้ว่าฉันอาจมี Mapinfo แบบเก่าอยู่รอบ ๆ )


สำหรับบันทึกชุดข้อมูลที่ฉันพยายามสร้างคือการรวบรวมหนังสือ GIS ที่ฉันกำลังเขียนโดยมีวัตถุประสงค์เพื่อโปรแกรมเมอร์. NET ที่ต้องการเขียนแอปพลิเคชัน GIS โดยใช้. NET


หลังจากลองทำตามคำแนะนำด้านล่างสิ่งที่ได้ผลดีที่สุดคือทางออกของ 'Paul Ramseys'

ตอนนี้ฉันมีไฟล์มณฑลและเมืองที่เรียบง่ายที่ดีพอสำหรับหนังสือของฉัน แต่ซับซ้อนพอที่จะให้ฉันแสดง SQL ทางภูมิศาสตร์เชิงพื้นที่ที่น่าสนใจ

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

ในสิ่งที่ฉันได้สังเกตในขณะที่ทำสิ่งนี้อย่างไรก็ตามในขณะที่ ST_Collect เร็วกว่า ST_Union แน่นอนการวิ่งเพื่อวิ่งก็เป็นสิ่งที่รับผิดชอบต่อรูปทรงเรขาคณิตที่แตกหัก ฉันเดาว่าการเพิ่มความเร็วนั้นทำได้ด้วยความแม่นยำน้อยกว่าในฟังก์ชั่นคอร์


กระบวนการนี้เรียกว่า "ละลาย" ฉันไม่ได้มีประสบการณ์กับ PostGIS แต่ฉันเชื่อว่าคุณสามารถใช้คำสั่งST_Union เพื่อทำการละลายได้
dmahr

สวัสดี dmahr ขอบคุณสำหรับการชี้แจงไม่แน่ใจว่ามันถูกเรียกว่าอย่างไร แต่ถ้าคุณอ่านคำถามของฉันคุณจะเห็นว่าฉันได้ลองแล้ว :-)
shawty

โอ๊ะโอขออภัย ... ไม่เห็นว่า คุณลองคำสั่ง select โดยไม่มีastext(multi())ส่วนแล้วหรือยัง? ฉันเพิ่งจะออกจากสิ่งที่ฉันเห็นใน PostGIS อื่น ๆ ละลายตัวอย่าง
dmahr

ยังไม่ลองตอนนี้ Tks คุณมีลิงค์สำหรับตัวอย่างละลายหรือไม่
Shawty

โปรดแก้ไขด่วนหากคุณต้องการ "วงแหวนรอบนอกเดียว" หรือไม่ (ดูคำตอบของฉัน)
35432 Peter Krauss

คำตอบ:


43

ST_Union จะทำงานได้ แต่งานของคุณเกือบจะไม่สะอาด ดังนั้นขอบเขตของสิ่งเล็ก ๆ น้อย ๆ ของคุณจึงไม่เหมือนกันอย่างสมบูรณ์ คุณสามารถสแน็ปอินไปที่กริดเพื่อลองและเพิ่มอัตราต่อรองที่แนวตั้ง แต่ฉันเดิมพันว่าคุณจะยังมีบางกรณีที่ไม่ได้ผล ไม่ว่าพวกเขาจะอยู่เหนือความอดทนหรือมีโอกาสมากขึ้นที่จะมีสถานที่ที่จุดยอดไม่ได้ถูกจับคู่ดังนั้นจึงมีเส้นข้างหนึ่งและจุดยอดอีกด้านหนึ่ง

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

หากคุณมี PostGIS 2.0 การสร้างโครงสร้างโทโพโลยีด้วยความอดทนอาจทำให้คุณได้คำตอบที่คุณกำลังมองหาหากคุณโชคดี


เบาะแสที่ดีสำหรับการแก้ไขรูปทรงเรขาคณิต แต่เกี่ยวกับ "... รูปหลายเหลี่ยมขนาดใหญ่หนึ่งจากวงแหวนรอบนอกเดียวที่มี polys ทั้งหมด ... "?
Peter Krauss

ฉันไม่รู้เกี่ยวกับ 'SnapTo' ฉันจะลองดู :-) Tks น่าเสียดายที่ยังไม่ได้ใช้ PG 2 แต่การอัปเกรดอยู่ในขั้นตอนการดำเนินการ
Shawty

ไม่แน่ใจว่าไวยากรณ์ของคุณถูกต้อง ต่อpostgis.net/docs/ST_Union.htmlไม่มีลายเซ็นต์ที่รับตัวเลขในพารามิเตอร์ตัวที่ 2
Aren Cambre

คุณพูดถูกวงเล็บอยู่ผิดที่ แก้ไข
Paul Ramsey

จะมี mysql เทียบเท่ากับสิ่งนี้หรือไม่? ฉันได้รับIncorrect parameter count in the call to native function 'ST_Union'และฉันไม่รู้ว่ามันเป็นข้อ จำกัด mysql
Jayen

7

คุณบอกว่าต้อง "" สร้างรูปหลายเหลี่ยมขนาดใหญ่หนึ่งรูปจากวงแหวนรอบนอกเดียวที่มี polys ทั้งหมด ... " ST_ExternalRing ทำเช่นนี้

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

คุณสามารถใช้ ST_Union () ตามที่แนะนำหรือทดสอบกับ ST_Collection ()


หมายเหตุ: เพื่อหลีกเลี่ยงการเกิดอุบัติเหตุเล็ก ๆ น้อย ๆ หรือ "รูปทรงเรขาคณิตที่แตกหัก" คุณสามารถใช้ st_convexhull และ / หรือ ST_Simplify สำหรับแต่ละ geom

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

และตรวจสอบรูปทรงเรขาคณิตของคุณ

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 

ขออภัยในความสับสน: สิ่งที่ฉันหมายถึงโดยคำอธิบายของฉันคือรูปหลายเหลี่ยมขนาดใหญ่ที่สร้างขึ้นจากสิ่งที่เล็กกว่าฉันรู้ว่าขึ้นอยู่กับบริบทของ 'วงแหวนรอบนอก' อาจหมายถึงสิ่งที่แตกต่างสำหรับคนต่าง ๆ มีขอบเขตรอบกลุ่มรูปหลายเหลี่ยมแต่ละกลุ่ม
Shawty

7

ฟังก์ชันST_Collectเป็นฟังก์ชัน "รวม" ในคำศัพท์ของ PostgreSQL

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN" จะส่งกลับ GEOMETRYCOLLECTION แยกต่างหากสำหรับแต่ละค่า ATTRCOLUM ที่แตกต่างกัน

http://postgis.net/docs/ST_Collect.html

หมายเหตุ: ST_Collect เร็วกว่า ST_Union มาก


3
ฉันลองและได้ผลลัพธ์ที่แตกต่างออกไปเล็กน้อย แต่สิ่งที่ฉันต้องการคือชุดรูปทรงเรขาคณิต? ฉันเป็นหลักพยายามที่จะทำให้หนึ่งรูปหลายเหลี่ยมใหญ่เลือกที่มีรูอยู่ในนั้น (โดยเฉพาะใน Derbyshire และน็อตติงแฮมที่ทั้งดาร์บี้และน็อตติงแฮมฟอร์มอำเภอแยกเป็นสัดส่วนที่เหมาะสมในศูนย์ที่ฉันได้สังเกตเห็นความแตกต่างของความเร็วแม้ว่าดังนั้น kewl ครับ..
shawty

2

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

หากคุณไม่ได้ใช้ Boundary-Line ฉันขอแนะนำให้คุณทำเพราะมันฟรีภายใต้ใบอนุญาต OS OpenData และมีระดับ County เป็นไฟล์รูปร่างคุณสามารถโหลดลงใน PostGIS ได้โดยตรง


2
วิธีการเกี่ยวกับการให้ลิงค์สำหรับผู้ที่ไม่รู้จัก? ขอบคุณ
jonatr

1
สวัสดีคุณจริง ๆ แล้วคุณถูกต้องใช่ฉันใช้ชุดข้อมูลเลเยอร์ขอบเขตจาก OS Opendata โชคไม่ดีที่เขตแดนไม่สมบูรณ์ไฟล์รูปร่างที่แท้จริงของเคาน์ตี้จะรวมเฉพาะพื้นที่ที่มีชื่อเป็นเขตเมืองลอนดอนมีพื้นที่โดยรอบ ลอนดอนและไฟล์อื่น ๆ ทั้งหมดมีบางส่วนในบางระดับที่ต่ำกว่าและเล็กกว่าบางส่วน ไฟล์เดียวที่มีโครงร่างทั้งหมดของสหราชอาณาจักรในและหลังจากนั้นโอกาสใด ๆ ในการแยกเขตบนและเขตเทศบาลทั้งหมดในชั้นเดียวคือชั้นตำบลดังนั้นทำไมฉันจึงพยายามทำเช่นนั้น
Shawty

สำหรับผู้ที่สนใจคุณสามารถดาวน์โหลดขอบเขตของเขตและอีกมากมายได้ที่นี่: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
Shawty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.