แบ่งรูปร่างที่ซับซ้อนลงในตาราง


11

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

ฉันได้พยายาม:

  • การใช้ QGIS และตัดเนื้อหา Shapefile ของฉันด้วยเวกเตอร์กริด - ผลลัพธ์แย่มาก เจ้าของที่ดินรายใหญ่ส่วนใหญ่หายตัวไปอย่างน่าอัศจรรย์แม้ว่าบางครั้งมันอาจดูเหมือนว่าเป็นที่ดินขนาดเล็กก็ตาม ฉันควรทราบว่าวิธีนี้ใช้ได้ดีกับข้อมูลที่ง่ายกว่า (เช่น. คะแนนน้อยกว่า)

  • การใช้เครื่องมือ Intersection ของ OGR ฉันลองทั้งผ่าน ogr2ogr และแม้กระทั่งโดยการหมุนเครื่องมือ C ++ ของฉันเอง ทั้งคู่มีปัญหาเดียวกันกับ QGIS พวกเขายังไม่แสดงปัญหานี้สำหรับไฟล์แบบง่าย ๆ แต่จะไม่ทำให้ไฟล์ซับซ้อนขึ้น สำหรับการอ้างอิงฉันใช้ shapefile ของออสเตรเลียและนิวซีแลนด์ต่ำกว่า 20mb ในขนาดและทั้ง QGIS และ OGR ล้มเหลวในการ 'จัดเรียง' มัน

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

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

แก้ไข: การเพิ่มข้อมูลเพิ่มเติม

ในการตอบสนองต่อ Simbamangu:

  • Shapefile นั้นเป็นข้อมูลแนวชายฝั่งจาก OpenStreetMap มันเป็นไฟล์ที่ถูกรวมเข้าด้วยกันของ 'processing_p' (ดังนั้นมันจึงไม่แยกเป็นไทล์) ที่ฉันได้รับโดยการส่งอีเมลรายการ dev ของพวกเขา โปรดทราบว่าการแยกของพวกเขากระเบื้อง (เป็นชิ้น 100km x 100km กับทับซ้อน) ไม่จำเป็นต้องเป็นสิ่งที่ฉันต้องการ - ฉันไม่ต้องการเหลื่อมกันและฉันต้องการอิสระในการเลือกขนาดกริดหรือฉันแค่ใช้ ค่าเริ่มต้น processing_p

  • โดยค่าเริ่มต้นข้อมูลชายฝั่งมีข้อผิดพลาดทางเรขาคณิตที่รายงานโดย QGIS ฉันแก้ไขข้อผิดพลาดเหล่านี้ด้วยเครื่องมือขนาดเล็กที่ฉันรวบรวมไว้โดยใช้รหัสที่ฉันพบออกแบบมาเพื่อแก้ไขปัญหานี้โดยเฉพาะ (การซ่อมแซมข้อผิดพลาดทางเรขาคณิตในข้อมูลชายฝั่ง: https://github.com/tudelft-gist/prepair ) การเรียกใช้ไฟล์ด้วยเครื่องมือนี้จะช่วยแก้ไขข้อผิดพลาดแทบทั้งหมดที่ QGIS หยิบขึ้นมา ฉันพยายามแยกกันหลังจากทำความสะอาดไฟล์เท่านั้น

  • สิ่งที่ฉันทำโดยใช้ QGIS: เปิดข้อมูลเพื่อให้แน่ใจว่าดูดีใน QGIS ลองแบ่งเป็นแผ่นย่อยโดยสร้างเลเยอร์ของกระเบื้องโดยใช้ Vector Grid ด้วยระยะห่างที่กำหนดจากนั้นทำการตัดสองชั้น - โดยไม่ต้องไป ลองใช้ชุดข้อมูลที่เล็กลง - เลือกคุณสมบัติในโอเชียเนีย (Aus, นิวซีแลนด์) เพื่อลองชุดข้อมูลที่เล็กลง - ไฟล์รูปร่างนี้มีขนาด <20mb ลองแบ่งอีกครั้งไม่ทำงาน

  • สิ่งที่ฉันทำกับ OGR: ogr2ogr โดยตรงโดยใช้ตัวเลือก '-spat' และ '-clipsrc' ด้วย spat_extent ยังเขียนเครื่องมือ C ++ ขนาดเล็กที่ทำงานบน WKT ดังนั้นฉันจึงแปลง shapefile เป็น WKT โดยใช้ ogr2ogr จากนั้นป้อนไฟล์ข้อความไปยังแอปพลิเคชันของฉัน มันวิ่งผ่านไฟล์และเรียกสี่แยก () วิธีการบันทึกไว้ที่นี่: http://www.gdal.org/ogr/classOGRGeometry.html ฉันคิดว่ามันจบลงด้วยการทำสิ่งเดียวกันกับการใช้ ogr2ogr โดยตรง

ในการตอบสนองต่อ Brent:

  1. มันทำ ทุกอย่างอยู่ใน WGS84 Lat / Lon
  2. ฉันคิดว่าสิ่งที่ตรงกันข้ามนั้นเป็นจริง - สำหรับชุดของตารางกริดที่ได้รับนั้นจะใช้เวลานานกว่าในการตัดรูปหลายเหลี่ยมขนาดยักษ์หนึ่งก้อนแทนที่จะเป็นรูปแบบที่กระจัดกระจายซึ่งอาจมีการแปลเชิงพื้นที่มากขึ้นสำหรับแต่ละกระเบื้อง ข้อเสนอแนะที่น่าสนใจ - ฉันจะลองแล้วรายงานกลับ
  3. ไม่มีการเก็บฟิลด์ของแอตทริบิวต์ในระหว่างกระบวนการฉันสนใจเฉพาะรูปทรงเรขาคณิตเท่านั้น
  4. ฉันไม่แน่ใจ แต่ฉันคิดว่าคุณกำลังบอกว่าฉันควรเลือกรูปหลายเหลี่ยมที่ทับซ้อนกันของแผ่นตารางที่กำหนดและจากนั้นดำเนินการทางแยก นี่เป็นเรื่องยุ่งยากด้วยตนเองกับ QGIS เครื่องมือของฉันทำสิ่งนี้ในระดับหนึ่งด้วยการทำเครื่องหมายในกล่องขอบเขต มีความเร็วเพิ่มขึ้นเล็กน้อย แต่ผลลัพธ์ที่ได้ยังไม่ดีและไม่แตกต่างกันอย่างเห็นได้ชัด
  5. นี่ไม่ใช่ตัวเลือก ตอนนี้ฉันกำลังพยายามแบ่งข้อมูลเพื่อให้มันมีขนาด 1 องศาละติจูดและลองจิจูดต่ำกว่า 1 องศาและฉันกำลังมองหาวิธีการทั่วไป / มีประสิทธิภาพที่ทำงานได้กับทุกกรณี ฉันพยายามเพิ่มขนาดกริด (เช่น 10x10) เพื่อดูว่าฉันจะได้ผลลัพธ์ที่ดีขึ้นหรือไม่และฉันไม่เห็นความสัมพันธ์ระหว่างขนาดกริดกับคุณภาพของผลผลิต

แก้ไข # 2:

ฉันได้ลองเล่นกับสิ่งนี้มากขึ้นและโดยทั่วไปดูเหมือนว่าผลลัพธ์จะไม่น่าเชื่อถือทั้งที่ใช้ GEOS และกับ QGIS (ซึ่งใช้ fTools ฉันไม่ทราบว่าในทางกลับกันจะใช้ GEOS อีกครั้ง) ฉันผิดที่ระบุขนาดของกริดไม่เกี่ยวข้องกับผลลัพธ์ - ยิ่งกริดนั้นใหญ่ขึ้นเท่าไรผลลัพธ์ก็จะยิ่งดีขึ้นเท่านั้น (นั่นเป็นเรื่องดีที่จะรู้ แต่ก็ไม่ใช่วิธีแก้ปัญหา) นี่คือภาพหน้าจอของตารางที่เว้นระยะจริงๆซึ่งส่วนใหญ่ใช้งานได้ แต่ล้มเหลวบางส่วนในไทล์เดียว:

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

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


คุณได้รับโลกหรือรูปร่างของออสเตรเลียจากที่ไหน ฉันสงสัยว่ารูปทรงเรขาคณิตของไฟล์นั้นอาจมีปัญหา (ลองใช้ Vector | เครื่องมือเรขาคณิต | ตรวจสอบความถูกต้องทางเรขาคณิตใน QGIS) เพิ่งลองตัดกับไฟล์รูปร่างโลกที่เล็กกว่าและเรียงแผ่น 5 องศาและทำงานได้อย่างสมบูรณ์ใน QGIS
Simbamangu

1
ทดลองใช้กับแนวชายฝั่งออสเตรเลีย 100K จาก Geoscience Australia (20MB) และแผ่นกระเบื้อง 4 องศาทำงานได้ดี (QGIS 1.7.4, OSX 10.7) คุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับข้อมูลของคุณและสิ่งที่คุณทำได้ไหม?
Simbamangu

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

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

คำตอบ:


7

ฉันเพิ่งสร้างเครื่องมือของตัวเองเพื่อทำสิ่งนี้

ฉันใช้ไลบรารี Clipper ( http://www.angusj.com/delphi/clipper.php ) ร่วมกับ OGR เพื่อแบ่งการตั้งค่าข้อมูลของฉัน สิ่งที่ควรทราบคือการใช้จุดตัดอย่างไร้เดียงสากับ lib นี้ใช้เวลานานมากดังนั้นฉันจึงใช้วิธีควอดทรีแทนคือแบ่งออกเป็นสี่กริดเซลล์แบ่งแต่ละอันออกเป็นสี่ส่วนและจนกว่าคุณจะได้ความละเอียดที่ต้องการ lib ใช้งานได้ดี แต่ฉันได้แนบภาพหน้าจอที่แสดงผลลัพธ์ในซีกโลกตะวันออก:

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

ผลลัพธ์ข้างต้นใช้เวลาประมาณ 4.5 ชั่วโมงสำหรับโปรเซสเซอร์ 1.33GHz

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

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


รหัสที่เชื่อมโยงไม่สามารถใช้ได้อีก :-(
Shaun McDonald

ผมย้ายที่เก็บข้อมูลเพื่อgithub.com/preet/scratch/tree/master/gis/polytoolkit ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณกำลังพยายามที่จะประสบความสำเร็จคุณอาจพบgithub.com/preet/scratch/tree/master/gis/shapefiles/shptkให้เป็นประโยชน์มากขึ้น
ริส

ภายหลังมีประโยชน์มากกว่า ตอนนี้ฉันได้ค้นพบวิธีการที่ใช้ PostGIS แล้วแม้ว่าจะมีความสนใจในการค้นหาว่าสิ่งนี้เร็วกว่านี้หรือไม่ คุณมี readme สำหรับการรวบรวมและติดตั้งหรือไม่?
Shaun McDonald

คุณสามารถแก้ไขคำตอบเพื่อแก้ไขลิงก์ได้หรือไม่? ขอบคุณ
Afr

4

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

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

2) แปลงคุณสมบัติทั้งหมดให้เป็นส่วนเดียว - ประมวลผลได้ง่ายขึ้นมาก

3) ลบฟิลด์ที่ไม่เกี่ยวข้องทั้งหมดที่เก็บเฉพาะฟิลด์ id ซึ่งจะช่วยให้คุณสามารถเข้าร่วมคุณสมบัติของคุณกลับมาหลังจากการดำเนินการทางแยกได้ง่ายขึ้นอีกมากในการประมวลผล

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

5) ลองใช้รูปหลายเหลี่ยมกริดที่ใหญ่ขึ้น


+1 น่าสนใจจริง ๆ - มันมีผลต่อความเร็วในการประมวลผลทางภูมิศาสตร์เท่าใดหากคุณเก็บฟิลด์ ID หรือหลายส่วนไว้ในข้อมูล
Simbamangu

1
ฉันไม่เคยพยายามคำนวณความแตกต่าง ฉันสามารถพูดได้จากประสบการณ์ที่การปฏิบัติการสำรวจทางภูมิศาสตร์ล้มเหลวและสิ่งเหล่านี้เป็นสิ่งที่ช่วยแก้ปัญหาได้
Brent Edwards

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

1
ไม่ควรมีการรวมเข้าด้วยกัน เป้าหมายคือการระเบิดคุณสมบัติหลายส่วน ตัวอย่างเช่นในภาพหน้าจอของไทล์ที่ล้มเหลวของคุณเป้าหมายคือการกระจายบันทึกทั้งหมดของคุณที่มีการจัดกลุ่มรูปหลายเหลี่ยมแยกกันเชิงพื้นที่เช่นคุณสมบัติเกาะตามแนวชายฝั่งของ BC และอลาสก้าลงในระเบียนรูปหลายเหลี่ยมส่วนเดียวแยกต่างหาก สามารถทำได้ใน QGIS โดยใช้เครื่องมือ "Multipart to singleparts" ใต้เมนู Vector> Geometry Tools
Brent Edwards

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

0

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

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