【问题标题】:Converting table columns to spatial objects将表列转换为空间对象
【发布时间】:2020-12-29 10:46:09
【问题描述】:

在将原始数据从 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)

很遗憾,它不适用于表格列。这是我的数据库表(名为“tableDB”):

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

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

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

在那之后,我的“newDF”变成了“sf”和“data.frame”对象,这没关系,但我仍然需要制作 2 个几何列,而不是一个。不知道如何在 df 的末尾添加第二个和更多的 geom 列。总结一下,我有几个问题:

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

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

【问题讨论】:

    标签: r gis geospatial sf


    【解决方案1】:

    sf 对象可以有两个几何列,但只有一个是“活动的”。这里的例子和解释: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 日创建

    【讨论】:

    • 感谢您的回答。我想知道在一个数据框中有几个 geom 列是否是一种好方法?如果没有,没有它们的原因是什么? (我在第 3 点的帖子中问过这个问题)
    • 通常我看到一个几何列和单独的数据框,或者一个带有一个几何列和一个列的单个 df 进行过滤。 sf 中的大多数函数似乎都可以在单个 geom 列中发挥最佳作用。我从未遇到过使用超过 2 个几何列的情况。根据您的用例,您可能需要两个数据框。一个带有 Cust 几何图形和一个带有 App 几何图形。如果这些列足够独特,则可以使用 zlp 和 lp 将它们连接和过滤。
    • 这是有道理的:) 所以假设我想再添加一个几何列(例如 LINESTRING)——那么最好的选择是使用这个几何列创建另一个 df 并在需要时与其他数据框连接?
    • 这可能是我的方法,但这取决于你的目标是什么。也许找出你想要结束的结果并在 SO 上问另一个。 sf 具有连接点(并返回线串)的功能,如果那是您的目标。
    猜你喜欢
    • 2023-02-02
    • 2013-12-02
    • 1970-01-01
    • 2021-10-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多