Создание sf полигонов из фрейма данных - PullRequest
1 голос
/ 14 апреля 2020

У меня есть датафрейм, содержащий координаты набора полигонов. Вот как я мог бы преобразовать его в пространственныеPolygons (пакет sp)

my.df <- data.frame(
  Plot = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
  Corner = c("SW", "NW", "NE", "SE", "SW2", "SW", "NW", "NE", "SE", "SW2"),
  Easting = c(511830, 512230, 512230, 511830, 511830, 511730, 512130, 512130, 511730, 511730),
  Northing = c(7550903, 7550903, 7550503, 7550503, 7550903, 7550803, 7550803, 7550403, 7550403, 7550803))


utm18 <- CRS("+init=EPSG:26918")

my.sp <- df_to_SpatialPolygons(my.df, keys = "Plot", coords = c("Easting", "Northing"), utm18)

plot(my.sp)

Как я могу создать объект sf (пакет sf), содержащий эти два полигона непосредственно из my.df?


Изменить: На мой вопрос частично ответили в этом вопросе, но их ответ только иллюстрирует, как создать один многоугольник. Как создать несколько полигонов?

Преобразовать последовательность долготы и широты в многоугольник через sf в R

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

library(sfheaders) позволяет вам создавать объект sf непосредственно из data.frame

library(sf)
library(sfheaders)

sf <- sfheaders::sf_polygon(
  obj = my.df
  , x = "Easting"
  , y = "Northing"
  , polygon_id = "Plot"
)
sf::st_crs( sf ) <- 26918

sf

# Simple feature collection with 2 features and 1 field
# geometry type:  POLYGON
# dimension:      XY
# bbox:           xmin: 511730 ymin: 7550403 xmax: 512230 ymax: 7550903
# z_range:        zmin: NA zmax: NA
# m_range:        mmin: NA mmax: NA
# CRS:            EPSG:26918
# id                       geometry
# 1  1 POLYGON ((511830 7550903, 5...
# 2  2 POLYGON ((511730 7550803, 5...


plot( sf )

enter image description here

0 голосов
/ 15 апреля 2020

Я нашел ответ, основанный на предложении Пакмо посмотреть на Преобразовать последовательность долготы и широты в многоугольник через sf в R

Ответ, предоставленный в этом вопросе, группирует все точки в фрейм данных в виде одного многоугольника. Я добавил шаг, чтобы сгруппировать фрейм данных по переменной, которая идентифицирует многоугольник.

polygon <- my.df %>%
  st_as_sf(coords = c("Easting", "Northing"), crs = utm18) %>%
  group_by(Plot) %>%
  summarise(geometry = st_combine(geometry)) %>%
  st_cast("POLYGON")
0 голосов
/ 15 апреля 2020

Это несколько запутанно, поскольку ваши точки не в правильном порядке для создания многоугольника, но это работает. Вероятно, есть более простой ответ, который я пропускаю.

library(sf)
#> Linking to GEOS 3.7.2, GDAL 2.4.2, PROJ 5.2.0
library(tidyverse)

# Your data
my_df <- data.frame(
  Plot = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
  Corner = c("SW", "NW", "NE", "SE", "SW2", "SW", "NW", "NE", "SE", "SW2"),
  Easting = c(511830, 512230, 512230, 511830, 511830, 511730, 512130, 512130, 511730, 511730),
  Northing = c(7550903, 7550903, 7550503, 7550503, 7550903, 7550803, 7550803, 7550403, 7550403, 7550803))


## Create an sf object from your data,
##  grouped by 'Plot' column summarise() combines the geomtries by group,
##  st_convex_hull() since the points are out of order for a polygon
my_df_sf <- st_as_sf(my_df,
                     coords = c('Easting', 'Northing')) %>%
  st_set_crs(26918) %>%
  group_by(Plot) %>%
  summarise() %>%
  ungroup() %>%  # Just in case
  st_convex_hull()


## A look at the data as an sf object
my_df_sf
#> Simple feature collection with 2 features and 1 field
#> geometry type:  POLYGON
#> dimension:      XY
#> bbox:           xmin: 511730 ymin: 7550403 xmax: 512230 ymax: 7550903
#> CRS:            EPSG:26918
#> # A tibble: 2 x 2
#>   Plot                                                                  geometry
#>   <fct>                                                            <POLYGON [m]>
#> 1 A     ((511830 7550503, 511830 7550903, 512230 7550903, 512230 7550503, 51183…
#> 2 B     ((511730 7550403, 511730 7550803, 512130 7550803, 512130 7550403, 51173…

## ggplot2 plot, colored by 'Plot' column
ggplot(my_df_sf) + 
  geom_sf(aes(color = Plot), fill = NA)

Создано в 2020-04-14 с помощью пакета prex (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...