简化rgeos中的多边形并保留SpatialPolygonsDataFrame中的数据

4

背景

我对使用gSimplify函数简化多边形很感兴趣,该函数可通过rgeos包获得。

可重现的示例

您可以使用以下代码生成一个可重现的示例:

# Data sourcing -----------------------------------------------------------

# Download an read US state shapefiles
tmp_shps <- tempfile()
tmp_dir <- tempdir()
download.file(
    "http://www2.census.gov/geo/tiger/GENZ2014/shp/cb_2014_us_state_20m.zip",
    tmp_shps
)
unzip(tmp_shps, exdir = tmp_dir)

# Libs
require(rgdal)
require(rgeos)

# Read
us_shps <- readOGR(dsn = tmp_dir, layer = "cb_2014_us_state_20m")

# Simplified --------------------------------------------------------------

# Simplifiy
us_shps_smpl <- gSimplify(spgeom = us_shps,
                          tol = 200,
                          topologyPreserve = TRUE)

预览

par(mfrow = c(2,1))
plot(us_shps_smpl, main = "Simplified")
plot(us_shps, main = "Original")

简化后和原始的多边形

问题

除了将多边形简化,gSimplify函数还会改变结果对象的类别:

>> class(us_shps)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
>> class(us_shps_smpl)
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

>> names(us_shps)
[1] "STATEFP"  "STATENS"  "AFFGEOID" "GEOID"    "STUSPS"   "NAME"     "LSAD"     "ALAND"    "AWATER"  
>> names(us_shps_smpl)
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19"
[21] "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39"
[41] "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" "51"

问题

  • 如何安全地重新连接最初在原始对象中可用的数据,并将生成的SpatialPolygons对象转换为SpatialPolygonsDataFrame

  • 我认为一种方法只涉及附加数据帧;但这取决于元素顺序不改变。是否有其他更好的方法(理想情况下保留初始对象类)?


https://gis.stackexchange.com/ 他们肯定可以帮助你。 - Andre Elrico
1
只是想确保您知道那个网站 :-) - Andre Elrico
1
这里的答案可能与您有关。 - Z.Lin
1
你是否一定要使用 rgeos?否则,我认为 sf::st_simplify() 可以帮助你解决这个问题。 - coletl
@coletl 谢谢,很乐意考虑其他的软件包。随意将其作为答案提供。 - Konrad
显示剩余4条评论
1个回答

4

sf包完全基于数据框,因此其几何操作始终保留附加在每个要素上的数据。该包目前还没有赶上R中所有标准的空间包,但是当需要更多功能时,可以在sfsp对象之间来回转换。

在这里,st_simplify()起到了作用,但您需要先投影多边形:

library(sf)

# Download and read example data
tmp_shps <- tempfile()
tmp_dir <- tempdir()
download.file(
  "http://www2.census.gov/geo/tiger/GENZ2014/shp/cb_2014_us_state_20m.zip",
  tmp_shps
)
unzip(tmp_shps, exdir = tmp_dir)

us_shps <- st_read(paste(tmp_dir, "cb_2014_us_state_20m.shp", sep = "/"))

# st_simplify needs a projected CRS
us_shps_merc <- st_transform(us_shps, 3857)
simple_us_merc <- st_simplify(us_shps_merc)

# Change back to original CRS
simple_us <- st_transform(simple_us_merc, st_crs(us_shps))

# Change to sp object, if you like
simple_us_sp <- as(st_zm(simple_us), "Spatial")

我发现如果 st_simplify 删除了一些多边形,那么这些行的几何列将变成一个空列表 ("list()")。在应用 as(.,"Spatial") 之前必须删除这些 "空几何" 行,否则会出错。 - Richard DiSalvo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接