Як я спрощую sf
багатокутник, не вводячи прогалини та слайвери?
Наприклад, з файлом форми я б використав 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()
який зі сторінок man:
Передайте геометрію іншому типу: або спрощуйте, або чітко додайте
і:
аргументувати: характер; цільовий тип, якщо він відсутній, спроба спрощення; коли 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()
може робити топологічно спрощені спрощення (тобто спрощує без створення слайдів), коли це задано за допомогою наступних аргументів:
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
аргумент, щоб зменшити його), і я підтвердив, що це не створило жодних слайдів, вивчивши його в 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 також може бути застосована gSimplify()
, просто використовуйте її замість ms_simplify()
.
st_simplify
повинен цього робити? (поки не користувався ним)
st_simplify
, дякую, що вказав на це. Я віддаю перевагу алгоритму, який rmapshaper::ms_simplify
за замовчуванням застосовується над усіма іншими, які я намагався до цього часу, але я буду грати з новою опцією (оновлення: хто продовжувати обережно, preserveTopology = TRUE
точно не працює належним чином)
regions
), але крім цього він більше не зберігає топологію. Оскільки це порушується в певний момент, я б сказав, що це не призначена поведінка