将 table 列转换为空间对象

Converting table columns to spatial objects

在将原始数据从 db 转换为 sf 对象时,我正在寻找最佳可行的解决方案。 我需要创建原始坐标点(浮点类型)。我找到了一种解决方案,我们从原始数据创建 sf 对象,如下所示:

lnd_point = st_point(c(0.1, 51.5)) 
lnd_geom = st_sfc(lnd_point, crs = 4326)
lnd_attrib = data.frame(
  name = 'London',
  temperature = 25,
  date = as.Date('2017-06-21')
)
lnd_sf = st_sf(lnd_attrib, geometry = lnd_geom)

遗憾的是,它不适用于 table 列。这是我的数据库 table(名为 'tableDB'):

就像上面的例子一样,首先我想创建 2 个独立的 POINT 类型的几何列(对于 lonCust/latCust 和 lonApp/latApp 使用 st_point),然后创建点列表(使用 st_sfc) 并最终创建 sf 对象(使用 st_sf),但它在我的情况下不起作用。

一般来说,我需要在 2 个单独的列(2 个几何列放置在数据框的末尾)中创建 lonCust/latCust 和 lonApp/latApp 的 POINT 数据类型。首先,我想将它们转换为 POINT,但 st_point 不适用于列,正如我之前提到的。我在书上和网上查到的是这样的:

newDF <- tableDB %>%
  st_as_sf(coords = c("lonCust","latCust"), crs = 4326)

在那之后,我的 'newDF' 变成了 'sf' 和 'data.frame' object 什么都可以,但我仍然需要制作 2 个 geom 列,而不是一个。不知道如何在 df 的末尾添加第二个和更多的 geom 列。总结一下,我有几个问题:

  1. 将原始数据从数据库转换为空间对象(例如点)的最佳方法是什么?
  2. 如何向数据框添加更多几何列(如在我的示例中,我需要有 2 个几何点列:用于 ..Cust 和 ..App)?
  3. 减去例如lat/lon 来自原始 df 的列并创建一个新的、单独的 sf 对象?如果是这样,那么我如何 pair/assign 每个具有属性的空间点(如上面示例中的 ZLP 或 LP)?

我对将原始数据转换为空间数据的良好实践非常感兴趣 - 我想编写 Shiny 应用程序并且需要知道从哪里开始。

一个 sf 对象可以有两个几何列,但只有一个是 'active'。此处的示例和解释:https://cran.r-project.org/web/packages/sf/vignettes/sf6.html

从您在图像中发布的数据框开始并将其命名为 my_df:

library(dplyr)
library(sf)

my_sf <- my_df %>% 
  st_as_sf(coords = c('lonCust', 'latCust')) %>%
  st_set_crs(4326)

my_sf$geom2 <- my_df %>% st_as_sf(coords = c('lonApp', 'latApp')) %>%
  st_geometry()

应该可以。以下是组成数据的示例:


x <- data.frame(id = 1:10,
                lon = sample(1:10, size = 10, replace = T),
                lat = sample(1:10, size = 10, replace = T),
                lon2 = sample(1:10, size = 10, replace = T),
                lat2 = sample(1:10, size = 10, replace = T))

xsf <- st_as_sf(x, coords = c('lon', 'lat'), remove = F)

xsf$geometry2 <- st_as_sf(x, coords = c('lon2', 'lat2')) %>%
  st_geometry()

head(xsf)
#> Simple feature collection with 6 features and 5 fields
#> Active geometry column: geometry
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: 1 ymin: 1 xmax: 8 ymax: 7
#> CRS:            NA
#>   id lon lat lon2 lat2    geometry    geometry2
#> 1  1   8   1    4    4 POINT (8 1)  POINT (4 4)
#> 2  2   8   6   10    8 POINT (8 6) POINT (10 8)
#> 3  3   7   7    2    6 POINT (7 7)  POINT (2 6)
#> 4  4   1   1    7    2 POINT (1 1)  POINT (7 2)
#> 5  5   5   3    3    9 POINT (5 3)  POINT (3 9)
#> 6  6   6   2    3    8 POINT (6 2)  POINT (3 8)

reprex package (v0.3.0)

于 2020-12-29 创建