我正在探索新的空间扩展--duckdb,并且正在try 读取CSV文件并将其转换为SF对象.

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(sf)
#> Linking to GEOS 3.11.1, GDAL 3.7.1, PROJ 9.2.0; sf_use_s2() is TRUE
library(duckdb)
#> Loading required package: DBI

conn <- DBI::dbConnect(duckdb::duckdb())
status <- DBI::dbExecute(conn, "INSTALL 'spatial';")
status <- DBI::dbExecute(conn, "LOAD 'spatial';")


dbExecute(conn, "CREATE OR REPLACE TABLE df AS FROM
  read_csv_auto('https://raw.githubusercontent.com/cboettig/duckdbfs/main/inst/extdata/spatial-test.csv')")
#> [1] 10

dbSendQuery(conn, "SHOW df;") |>
  dbFetch()
#>   column_name column_type null  key default extra
#> 1        site     VARCHAR  YES <NA>    <NA>    NA
#> 2    latitude      BIGINT  YES <NA>    <NA>    NA
#> 3   longitude      BIGINT  YES <NA>    <NA>    NA

在这里,我创建了几何柱,看起来它起作用了.

dbExecute(conn, "CREATE OR REPLACE TABLE df_sf AS SELECT *,
  ST_Point(latitude, longitude) as geometry, FROM df;")
#> [1] 10

dbSendQuery(conn, "SHOW df_sf;") |>
  dbFetch()
#>   column_name column_type null  key default extra
#> 1        site     VARCHAR  YES <NA>    <NA>    NA
#> 2    latitude      BIGINT  YES <NA>    <NA>    NA
#> 3   longitude      BIGINT  YES <NA>    <NA>    NA
#> 4    geometry    GEOMETRY  YES <NA>    <NA>    NA

我的问题是,如何将df_sf表读入R作为sf对象?

st_read(
  conn,
  query = "SELECT * FROM df_sf;",
  geometry_column = "geometry"
)
#> Error in CPL_read_wkb(x, EWKB, spatialite): reading wkb type 0 is not supported

# Any pointers would be greatly appreciated.

创建于2023-09-12年第reprex v2.0.2

推荐答案

我找到了一个使用ST_asWKB的解决方案.

  dbExecute(conn, "CREATE OR REPLACE TABLE df_sf AS SELECT *,
    ST_asWKB(ST_Point(latitude, longitude)) as geometry, FROM df;")
  
  st_read(
    conn,
    query = "SELECT * FROM df_sf;",
    geometry_column = "geometry"
  )

R相关问答推荐

具有相同条宽 * 和 ** 在 * 多个 * 图上相同条距的条图

Select 与特定列中最大值对应的数据帧行

如何在弹性表中为类别值的背景上色

根据固定值范围在tible中添加新行

寻找图片边缘

使用R的序列覆盖

R Highcharts与两个位置关联的注释

如果行和大于值,则过滤

在GGPLATE中将突出的点放在前面

在R中使用数据集名称

制作等距离的线串副本

使用R闪光显示所有数据点作为默认设置

R—将各种CSV数字列转换为日期

在RStudio中堆叠条形图和折线图

LOF中的插图短文字幕

当我添加美学时,geom_point未对齐

R如何计算现有行的总和以添加新的数据行

根据另一列中的值和条件查找新列的值

如果COLSUM为>;0,则COLNAME为向量

是否有可能从边界中找到一个点值?