แก้ไขรูกำพร้าใน R


18

ฉันพยายามที่จะทำการรวมกันในสนามทั่วไปหลังจากรวมสองไฟล์รูปร่างที่อยู่ติดกัน ท้ายที่สุดรูปร่างของไฟล์นั้นจะมีช่องว่างระหว่างเศษไม้อย่างน้อยหนึ่งอัน เมื่อฉันพยายามสหภาพฉันได้รับข้อผิดพลาดของหลุมที่กำพร้าต่อไปนี้:

ข้อผิดพลาดใน createPolygonsComment (p): rgeos_PolyCreateComment: รูแบบกำพร้าไม่สามารถค้นหารูปหลายเหลี่ยมที่มีรูสำหรับดัชนีที่ 17

ฉันได้อัปโหลดตัวอย่างที่ทำซ้ำได้ไปยัง Dropbox ที่ลิงค์นี้

นี่คือรหัสเพื่อสร้างปัญหา:

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

ผลตอบแทน:

ข้อผิดพลาดใน createPolygonsComment (p): rgeos_PolyCreateComment: รูแบบกำพร้าไม่สามารถค้นหารูปหลายเหลี่ยมที่มีรูสำหรับดัชนีที่ 17

ลองใช้การแก้ไขที่เสนอที่นี่และที่นี่ :

slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)

ส่งกลับข้อผิดพลาดเดียวกันที่มาจากความพยายามรวม แต่มีหมายเลขดัชนีแตกต่างกัน:

rgeos_PolyCreateComment: หลุมกำพร้าไม่สามารถหารูปหลายเหลี่ยมสำหรับหลุมที่ดัชนี 30

ลองใช้การแก้ไขที่เสนอในบทช่วยสอนของ Roger Bivand

fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)

ส่งคืนข้อผิดพลาดเดียวกันที่ดัชนี 30 ตามด้านบน

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

ปรากฏว่าผู้คนยังคงมีปัญหาแม้รหัสนี้จะทำงานเป็นครั้งคราว มีใครพบวิธีแก้ปัญหาภายใน R หรือไม่?

ฉันใช้เครื่องมือ "ซ่อมแซมเรขาคณิต" ใน ArcGIS แล้วและแก้ไขปัญหาได้ แต่ดูเหมือนว่าควรมีการแก้ไขใน R


หากไม่มีข้อมูลของคุณก็ยากที่จะบอกว่าปัญหาอยู่ที่ไหน

@Pascal ฉันเพิ่งอัปโหลดลิงก์ดรอปบ็อกซ์ที่มีรูปร่างไฟล์ลดขนาดลงเป็น 10mb ที่บีบอัดแล้วและคลายซิป 16mb ที่จะทำให้เกิดปัญหาอีกครั้ง ฉันไม่แน่ใจว่าจะให้ข้อมูลได้อย่างไรเหมือนเดิมคือ 1.5 gb แต่สามารถใช้ ArcGIS เพื่อ จำกัด ปัญหาให้แคบลงเป็นไฟล์ขนาดเล็กลง มีโปรโตคอลที่ดีสำหรับการสร้างและแบ่งปันตัวอย่างที่ทำซ้ำขนาดที่สามารถจัดการได้หรือไม่?
ลุค Macaulay

การลองใช้วิธีที่แตกต่างกับ R ไม่ได้ผล และ Qgis จะหยุดเมื่อตรวจสอบรูปทรงเรขาคณิต

คำตอบ:


25

ผมได้วิเคราะห์ปัญหาเรขาคณิตในข้อมูลที่แนบมาและดูเหมือนว่ามันไม่ได้มีเพียงแต่ยังorphaned holes geometry validity issuesมันเป็นความจริงที่ว่าorphaned holeปัญหาเรื่องความถูกต้องของรูปทรงเรขาคณิตเป็นอย่างใด แต่rgeosไม่ได้จัดการมันในลักษณะเดียวกันเช่นเดียวกับหลุมกำพร้าเกิดข้อผิดพลาดขึ้นแทนที่จะเป็นคำเตือนง่ายๆ ดังที่คุณระบุไว้พวกมันเป็นคำแนะนำในการตรวจสอบรูรูปหลายเหลี่ยม แต่จะไม่ประสบความสำเร็จเมื่อนำมาใช้เพื่อแก้ไขหลุมที่ไม่ได้ใช้งาน

จึงขอ:

  1. ทำความสะอาดข้อมูลของคุณ (ซึ่งเป็นสิ่งจำเป็นหากคุณต้องการทำกระบวนการทางภูมิศาสตร์เช่นเดียวกับสหภาพ)

  2. ใช้ข้อมูลที่ล้างแล้วด้วยกระบวนการสหภาพของคุณ

1. การทำความสะอาดรูปทรงเรขาคณิตการ แก้ไขรูปทรงใน R อาจมีความท้าทายในบางครั้งดังนั้นฉันได้ลองสร้างแพ็คเกจ R แบบทดลอง (ดูhttps://github.com/eblondel/cleangeo ) ที่มีจุดประสงค์เพื่ออำนวยความสะดวกในการทำความสะอาดของspวัตถุ รูปหลายเหลี่ยม) คุณสามารถติดตั้งแพ็คเกจด้วย:

require(devtools)
install_github("eblondel/cleangeo")
require(cleangeo)

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

#get a report of geometry validity & issues for a sp spatial object
report <- clgeo_CollectionReport(sp)
summary <- clgeo_SummaryReport(report)
issues <- report[report$valid == FALSE,]

ด้วยวิธีนี้คุณจะเห็นว่าข้อมูลของคุณมี 2 ชนิดของปัญหา: และorphaned holes geometry validity issuesทั้ง (และไม่เพียง แต่เป็นรูที่กำพร้า) มีแนวโน้มที่จะทำให้unionกระบวนการล้มเหลวดังนั้นข้อมูลควรได้รับการทำความสะอาดก่อนโดยอัตโนมัติเมื่อเป็นไปได้ เพื่อการทำสำเนาที่รวดเร็วรหัสตัวอย่างแรกด้านล่างจะใช้ชุดย่อยของคุณลักษณะที่ติดแท็กเป็นที่น่าสงสัย (ยกเว้นอันล่าสุดโดยมีดัชนี = 9002 ในข้อมูลดั้งเดิม - ดูบันทึกย่อของฉันด้านล่าง)

#get suspicious features (indexes)
nv <- clgeo_SuspiciousFeatures(report)
mysp <- sp[nv[-14],]

#try to clean data
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

หากclgeo_Cleanทำงานได้ดีคุณควรทำให้รูปทรงเรขาคณิตทั้งหมดมีผลในขณะนี้ คุณสามารถใช้สิ่งนี้กับชุดข้อมูลที่สมบูรณ์ (ยกเว้น index feature = 9002)

#try to clean data
mysp <- sp[-9002,]
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

2. Union process ทีนี้มาดูกันว่าunionชุดข้อมูลนี้ทำงานอย่างไร:

#Attempting a UnionSpatialPolygons based on the COUNTY field
mysp.df <- as(mysp, "data.frame")
countycol <- mysp.df$COUNTY
mysp.diss <- unionSpatialPolygons(mysp.clean, countycol)

หมายเหตุ: ดังที่กล่าวไว้ก่อนหน้านี้ฉันได้ลบหนึ่งคุณลักษณะ (ดัชนี = 9002) โดยการพล็อตมัน: plot(sp[9002,])คุณจะเห็นว่าคุณลักษณะนี้ซับซ้อนมาก (มาก) ฉันได้แยกออกจากตัวอย่างเพียงเพราะการตรวจสอบรูใช้เวลานานเกินไป เรามาดูกันว่าปัญหาเดียวกันนี้เกิดขึ้นโดยใช้readShapePoly(จากmaptools) เพื่ออ่านข้อมูล ...

3. เปลี่ยนเป็น readShapePoly vs. readOGR สำหรับการอ่านข้อมูล (UPDATE)

readOGRไม่ได้เป็นเพียงฟังก์ชั่นเดียวที่สามารถอ่าน shapefiles ได้ คุณยังสามารถใช้readShapePolyจากmaptoolsแพ็คเกจโดยทั่วไปมีประสิทธิภาพมากกว่าคนแรก:

require(maptools)
mysp <- readShapePoly("ReproducibleExample.shp")

นอกเหนือจากการทำงานได้เร็วขึ้น:

  • หากคุณใช้รหัสข้างต้นโดยclgeo_CollectionReportไม่มีปัญหาของหลุมกำพร้า แต่ยังคงมีปัญหาของรูปทรงเรขาคณิต

  • การทำความสะอาดรูปทรงเรขาคณิตclgeo_Cleanยังทำงานได้ดีและตอนนี้ก็ไม่ได้ติดอยู่กับดัชนีคุณลักษณะ 9002

  • และ ... กระบวนการสหภาพทำงานได้

ดูผลการพล็อตด้านล่าง:

#plot the result
plot(mysp, border= "lightgray")
plot(mysp.diss, border="red", add = TRUE)

ผลยูเนี่ยน

สรุป : ชอบmaptoolsในการอ่านข้อมูล shapefile ของคุณและพิจารณาใช้cleangeoเพื่อทำความสะอาดข้อมูลของคุณก่อนที่กระบวนการทางภูมิศาสตร์ใด ๆ


ขอบคุณ eblondel! ฉันจะลองทำดู ขอบคุณสำหรับการพัฒนาแพ็คเกจ!
Luke Macaulay

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

ว้าว. แพ็คเกจที่น่าประทับใจมาก นั่นต้องทำงานเยอะมาก
nograpes

3
ขอบคุณ @nograpes สำหรับความคิดเห็นของคุณ ฉันได้สร้างแพ็คเกจนี้ตั้งแต่เริ่มต้นเมื่อมีการโพสต์ปัญหานี้ด้วยเนื่องจากการทำความสะอาดรูปทรงเรขาคณิตไม่ใช่เรื่องง่ายเสมอไป หากคุณอยู่ใน Github ฉันยินดีต้อนรับ 'ดารา' ของคุณ :-) ฉันต้องการปรับปรุงแพ็คเกจเพิ่มเติมในอนาคตและอาจเผยแพร่ใน CRAN
eblondel

7
เพียงเพื่อแจ้งให้คุณทราบว่า cleangeo ได้รับการเผยแพร่ใน CRAN ( cran.r-project.org/package=cleangeo ) สำหรับทุกคนที่ใช้งานแล้วรู้สึกฟรีเพื่อรายงานคำขอการปรับปรุงหรือข้อบกพร่องใน Github
eblondel

1

ทางออกที่สะดวกที่ทำงานให้ฉันใน R คือการใช้บัฟเฟอร์ความกว้างเป็นศูนย์ :

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#project your data (I'm using California Albers here) and apply a zero-width buffer
example <- spTransform(example, CRS("+init=epsg:3310"))
example <- gBuffer(example, byid = T, width = 0)

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

unionSpatialPolygons ใช้เวลาสักครู่ในชุดข้อมูลนี้ แต่ดูเหมือนว่าจะทำงานได้ดี

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