Упрощение полигонов в rgeos и ведение данных в SpatialPolygonsDataFrame

Задний план

Меня интересует упрощение многоугольников с помощью 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

  • Я полагаю, что один из подходов просто включал бы присоединение фрейма данных, но это зависит от порядка, в котором элементы не меняются. Есть ли другие лучшие подходы (в идеале с сохранением исходного класса объекта)?


person Konrad    schedule 05.09.2017    source источник
comment
gis.stackexchange.com они наверняка могут вам помочь   -  person Andre Elrico    schedule 05.09.2017
comment
@AndreElrico Я периодически публикую на gis, но, на мой взгляд, этот вопрос больше связан с тем, как gSimplify обрабатывает SpatialPolygonDataFrame класс, а не с количественной географией аспект проблемы. Я считаю, что это не совсем однозначно, но я полагаю, что многие люди, которые следят за rgeos и gis посмотрите на обе доски.   -  person Konrad    schedule 05.09.2017
comment
просто хотел убедиться, что вы знаете об этом сайте :-)   -  person Andre Elrico    schedule 05.09.2017
comment
Да, вы можете повторно прикрепить данные, используя SpatialPolygonsDataFrame(us_shps_smpl, us_shps@data). У вас есть пример, где порядок элементов изменился после gSimplify?   -  person Z.Lin    schedule 05.09.2017
comment
Ответ здесь может иметь отношение.   -  person Z.Lin    schedule 05.09.2017
comment
@ Z.Lin Нет, не думаю и не предполагал, что это изменится. Я надеялся, что кто-то здесь подтвердит, что это не меняется, что, похоже, так.   -  person Konrad    schedule 05.09.2017
comment
@ Z.Lin Стоит добавить, что в моем производственном коде должен быть аргумент SpatialPolygonsDataFrame match.ID = FALSE, чтобы избежать сбоев при несовпадении идентификаторов.   -  person Konrad    schedule 05.09.2017
comment
Вы замужем за rgeos? В противном случае, я считаю, sf::st_simplify() мог бы вам здесь помочь.   -  person coletl    schedule 09.10.2017
comment
@coletl Спасибо, рад рассмотреть другие пакеты. Не стесняйтесь дать ответ.   -  person Konrad    schedule 09.10.2017


Ответы (1)


Пакет sf полностью основан на фреймах данных, поэтому его геометрические манипуляции всегда сохраняют данные, прикрепленные к каждому объекту. Пакет еще не догнал все стандартные пространственные пакеты в R, но довольно легко переключаться между sf и sp объектами, когда вам нужно больше функциональности.

Здесь 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")
person coletl    schedule 09.10.2017
comment
Я обнаружил, что если st_simplify отбрасывает несколько полигонов, столбец геометрии станет пустым списком в этих строках (list ()). эти пустые строки геометрии должны быть удалены перед применением (., Spatial), иначе появится ошибка - person Richard DiSalvo; 27.03.2019