You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R与DuckDB读取CSV并转为sf对象?解决读取报错

解决DuckDB空间扩展读取为sf对象的WKB Type 0错误

问题原因

错误Error in CPL_read_wkb(x, EWKB, spatialite): reading wkb type 0 is not supported是因为生成的geometry列中存在空几何(Empty Geometry),通常由以下原因导致:

  • ST_Point参数顺序错误(将纬度/经度搞反)
  • 未过滤经纬度为空的行,生成了无效几何
  • 未指定空间参考系(SRID)导致几何类型不被sf识别

解决方案

1. 修正几何列生成逻辑

创建df_sf表时,确保使用正确的参数顺序、过滤空值并指定SRID:

-- 重新创建df_sf表,修正几何生成逻辑
CREATE TABLE df_sf AS
SELECT 
  *, 
  ST_SetSRID(ST_Point(longitude, latitude), 4326) AS geometry
FROM df
-- 过滤空的经纬度,避免生成空几何
WHERE longitude IS NOT NULL AND latitude IS NOT NULL;

注意:DuckDB的ST_Point参数是(x, y),对应经度(longitude)在前,纬度(latitude)在后,不要搞反。ST_SetSRID(..., 4326)指定WGS84坐标系,是地理数据的通用标准。

2. 正确读取并转换为sf对象

不要直接用st_read读取DuckDB表,而是先通过DBI或dplyr提取数据,再用st_as_sf转换:

方法1:使用DBI

# 从DuckDB提取数据
data <- DBI::dbGetQuery(con, "SELECT * FROM df_sf")

# 转换为sf对象
data_sf <- sf::st_as_sf(data, wkt = "geometry")

方法2:使用dplyr管道

data_sf <- dplyr::tbl(con, "df_sf") %>%
  dplyr::collect() %>%
  sf::st_as_sf(wkt = "geometry")

验证结果

转换完成后可以用以下命令验证sf对象:

# 查看对象类型
class(data_sf)

# 查看空间信息
sf::st_crs(data_sf)

内容的提问来源于stack exchange,提问作者Philippe Massicotte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:45:29