Извлечение минимальной и максимальной координат из MULTIPOLYGON в отдельные столбцы - PullRequest
0 голосов
/ 04 марта 2020

У меня есть большой фрейм данных со столбцом, называемым геометрией.

> class(df$geometry)

[1] "sfc_MULTIPOLYGON" "sf c"

Столбец выглядит например:

head(df$geometry)
Geometry set for 6 features 
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -157.9813 ymin: 56.73044 xmax: -152.267 ymax: 58.93569
epsg (SRID):    4269
proj4string:    +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
First 5 geometries:
MULTIPOLYGON (((-157.973 56.74355, -157.9727 56...
MULTIPOLYGON (((-157.5293 57.61359, -157.5293 5...
MULTIPOLYGON (((-152.268 57.62401, -152.2674 57...
MULTIPOLYGON (((-157.5457 58.86262, -157.5449 5...
MULTIPOLYGON (((-156.3857 58.88877, -156.3849 5...

Я знаю, что могу получить доступ к вектору чисел c широты, например, копаясь в списках списков, то есть:

head(df$geometry[[1]][[1]][[1]][,1])
[1] -157.9730 -157.9727 -157.9721 -157.9716 -157.9708 -157.9707

I просто нужно извлечь min и max lat и lon для каждой строки и сделать каждый столбец (таким образом, добавляя четыре столбца к фрейму данных: lat_min, lat_max, lon_min, lon_max).

Я пробовал несколько вариантов - в том числе комбинации st_coordinates (), st_bbox (), unlist, но, похоже, это не отображается для всех строк. Пожалуйста, помогите.

пакеты: dpylr, tidyverse, tidyr, sf

1 Ответ

0 голосов
/ 06 марта 2020

См. reprex моего комментария:

library(sf)
library(dplyr)

myshape <- st_read(system.file("shape/nc.shp", package = "sf"))[1:6,"NAME"]
head(myshape,3)
#> Simple feature collection with 3 features and 1 field
#> geometry type:  MULTIPOLYGON
#> dimension:      XY
#> bbox:           xmin: -81.74107 ymin: 36.23388 xmax: -80.43531 ymax: 36.58965
#> epsg (SRID):    4267
#> proj4string:    +proj=longlat +datum=NAD27 +no_defs
#>        NAME                       geometry
#> 1      Ashe MULTIPOLYGON (((-81.47276 3...
#> 2 Alleghany MULTIPOLYGON (((-81.23989 3...
#> 3     Surry MULTIPOLYGON (((-80.45634 3...

#Extract coordinates
bbox_list <- lapply(st_geometry(myshape), st_bbox)

#To df
maxmin <- as.data.frame(matrix(unlist(bbox_list),nrow=nrow(myshape)))

#get names
names(maxmin) <- names(bbox_list[[1]])

#Final shape
myshape2=bind_cols(myshape,maxmin)
head(myshape2,3)
#> Simple feature collection with 3 features and 5 fields
#> geometry type:  MULTIPOLYGON
#> dimension:      XY
#> bbox:           xmin: -81.74107 ymin: 36.23388 xmax: -80.43531 ymax: 36.58965
#> epsg (SRID):    4267
#> proj4string:    +proj=longlat +datum=NAD27 +no_defs
#>        NAME                       geometry      xmin      ymin      xmax
#> 1      Ashe MULTIPOLYGON (((-81.47276 3... -81.74107 -80.90344 -76.33025
#> 2 Alleghany MULTIPOLYGON (((-81.23989 3...  36.23436  36.57286  36.07282
#> 3     Surry MULTIPOLYGON (((-80.45634 3... -81.23989 -80.96577 -75.77316
#>        ymax
#> 1 -77.07531
#> 2  36.55629
#> 3 -77.21767

Создано в 2020-03-06 пакетом Представить (v0.3.0)

...