ฉันจะลดความซับซ้อนของsf
รูปหลายเหลี่ยมได้อย่างไรโดยไม่แนะนำช่องว่างและตัวเอียง
ด้วย Shapefile เช่นฉันจะใช้rmapshaper::ms_simplify()
:
library("pryr")
library("rgdal")
library("rmapshaper")
download.file("https://borders.ukdataservice.ac.uk/ukborders/easy_download/prebuilt/shape/England_gor_2011.zip",
destfile = "regions.zip")
unzip("regions.zip")
regions <- readOGR(".", "england_gor_2011")
object_size(regions)
# ~13MB
regions <- ms_simplify(regions)
object_size(regions)
# < 1MB
ฉันได้ลองแล้วsf::st_cast()
ซึ่งจากหน้าคน, รัฐ:
ส่งเรขาคณิตไปยังประเภทอื่น: ลดความซับซ้อนหรือโยนอย่างชัดเจน
และ:
เพื่อโต้แย้ง: ตัวละคร; ประเภทเป้าหมายหากขาดหายไปจะพยายามลดความซับซ้อน เมื่อ x เป็นชนิด sfg (เช่นเรขาคณิตเดียว) จากนั้นจำเป็นต้องระบุ
เมื่อฉันจากto
ไปเพราะขาดสิ่งนี้มันก็ไม่ได้ผลตามที่คาดหวังไว้ (ฉันรู้ว่ามันดีเกินกว่าจะเป็นจริงได้!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
ขณะนี้ฉันกำลังเปิดไฟล์ที่มีการลดความซับซ้อนของมันประหยัดนี้แล้วโหลดนี้อีกครั้งกับrgdal::readOGR()
sf
มีวิธีที่ดีกว่า?
rgeos::gSimplify()
คำแนะนำของ @sk ของrgeos::gSimplify()
สามารถทำการลดความซับซ้อนของtopologically (เช่นลดความซับซ้อนโดยไม่ต้องสร้าง slivers) เมื่อระบุด้วยอาร์กิวเมนต์ต่อไปนี้:
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
ไม่รักษา@data
เฟรมไว้ดังนั้นเราควรสร้างใหม่อีกครั้ง:
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
และนี่จะส่งผลให้ไฟล์มีขนาดเล็กลง (สามารถปรับtol
อาร์กิวเมนต์ให้เล็กลงได้) และฉันยืนยันว่านี่ไม่ได้สร้าง slivers ใด ๆ โดยตรวจสอบใน QGIS
object_size(regions_gSimplify)
# ~8MB
ดังนั้นแม้ว่านี่จะเป็นทางเลือกที่ถูกต้องสำหรับrmapshaper::ms_simplify()
ฉันยังคงมีปัญหาเดียวกันนั่นคือมันใช้ไม่ได้กับsf
:
regions_sf <- sf::read_sf("england_gor_2011.shp")
object_size(regions_sf)
regions_gSimplify <- gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05)
# Error in gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05) :
# no slot of name "proj4string" for this object of class "sf"
@obrl_soil 'คำตอบ sนอกจากนี้ยังสามารถนำไปใช้เพียงแค่ใช้มันในสถานที่ของgSimplify()
ms_simplify()
st_simplify
ควรที่จะทำอย่างนั้น? (ยังไม่ได้ใช้มัน)
st_simplify
ขอบคุณที่ชี้ให้เห็น ฉันชอบอัลกอริทึมที่เป็นrmapshaper::ms_simplify
ค่าเริ่มต้นสำหรับคนอื่น ๆ ทั้งหมดที่ฉันได้ลองมาแล้ว แต่ฉันจะเล่นกับตัวเลือกใหม่ (อัปเดต: ผู้ใช้งานด้วยความระมัดระวังpreserveTopology = TRUE
ไม่ทำงานอย่างถูกต้อง)
regions
) แต่นอกเหนือจากนั้นมันไม่ได้เก็บโทโพโลยีอีกต่อไป เมื่อถึงจุดหนึ่งฉันจะบอกว่านั่นไม่ใช่พฤติกรรมที่ตั้งใจ