SF 객체의 다각형 단순화


14

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()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().


1
Douglas–Peucker 알고리즘에 액세스 할 수 있습니까? GIS 세계의 기능 단순화로 널리 알려져 있습니다. stackoverflow.com/questions/17217413/… & r-bloggers.com/simplifying-spatial-polygons-in-r
sk

1
st_simplify그렇게 하지 않아야합니까? (아직 사용하지 않았습니다)
lbusett

2
아, 눈치 채지 못했습니다 st_simplify. 지적 해 주셔서 감사합니다. 나는 rmapshaper::ms_simplify지금까지 시도한 다른 모든 것보다 기본적으로 사용 되는 알고리즘을 선호 하지만 새로운 옵션으로 플레이 할 것입니다 (업데이트 : whoa는 신중 preserveTopology = TRUE하게 진행 하지만 확실히 제대로 작동하지 않습니다)
obrl_soil

1
알아 둘만 한. 이것에 대한 버그 보고서를 여는 것은 어떻습니까?
lbusett

1
@obrl_soil이 질문에서 사용한 다각형 ( regions) 에서 최대 약 1000까지의 공차에 대해 작동 하지만 그 이상으로 더 이상 토폴로지를 유지하지 않습니다. 특정 시점에서 중단 될 때 의도 된 동작이 아니라고 말하고 싶습니다
Phil

답변:


16

아직 sf를 지원하지 않는 패키지의 경우 sf 객체를 sp로 캐스트 할 수 있습니다. 래스터 / 폴리곤 상호 작용을위한 적절한 비트입니다. 그래서 당신은 할 수 있습니다 :

simplepolys <- rmapshaper::ms_simplify(input = as(sfobj, 'Spatial')) %>%
  st_as_sf()

1
이 기술 - int로서 재 - 캐스팅 후, 단순화, 공간 객체로 캐스팅 sf객체 - 완벽하게 작동하고 사용할 수 있습니다 rmapshaper::ms_simplify()또는 rgeos::gSimplify(). 제안 해 주셔서 감사합니다!
Phil

차갑게 시원하게, 맞물림 다각형의 토폴로지는 rmapshaper의 접근 방식으로 만 유지됩니다. 입력 데이터가 모두 격리 된 비 인터록 다각형 인 경우 사용 가능한 단순화 알고리즘을 안전하게 사용할 수 있습니다.
obrl_soil

sf::st_simplify()글을 쓰는 시점에 표준 이 높을수록 공차가 높지 않기 때문에 대답으로 받아들 입니다.
Phil

8
현재 rmapshapersf 에서 객체 지원을 위해 노력하고 있습니다. 개발 버전의 객체에 사용할 수 있습니다 . 초기 테스터를 좋아합니다. 시험해보고 싶다면 다음과 같이 설치할 수 있습니다.ms_simplifysfdevtools::install_github("ateucher/rmapshaper", ref = "sf")
andyteucher

6
현재 rmapshaper버전 0.3.0, 통화가하는 as( , "Spatial")더 이상 필요하지 않습니다.
Luke1018
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.