如何用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
相关产品推荐
相关产品推荐

