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

在R中使用sf/terra将GeoJSON格式建筑底图保存为Shapefile

解决R中将微软建筑数据转换为Shapefile的报错问题

问题原因

你遇到的报错是因为geojson包生成的geofeaturecollection对象并非sf或terra包原生支持的空间对象类型,这两个工具只识别各自的空间数据结构(sf包的sf/sfc对象、terra包的SpatVector对象)。

可行解决方法

以下两种方法都能直接生成可写入Shapefile的空间对象:

方法1:直接读取GeoJSONL文件(推荐)

微软的这份建筑数据本质是GeoJSON Line-delimited(GeoJSONL)格式,解压后的CSV文件每行对应一个GeoJSON Feature,无需手动拼接成FeatureCollection,直接用sf读取即可:

library(R.utils)
library(sf)

# 解压.gz文件
file_name <- "part-00138-7b73ad6b-e7c8-4e22-9fa2-01d140ca911d.c000.csv.gz"
uncompressed_file <- sub(".gz$", "", file_name)
R.utils::gunzip(file_name, destname = uncompressed_file)

# 读取GeoJSONL为sf对象
sf_obj <- st_read(uncompressed_file, driver = "GeoJSONSeq")

# 保存为Shapefile
st_write(sf_obj, dsn = "temp.shp", driver = "ESRI Shapefile")

方法2:将已生成的GeoJSON字符串转换为sf对象

如果你已经手动拼接好了GeoJSON字符串(即代码中的j),可以直接用sf读取这个字符串,跳过geojson包的转换步骤:

library(sf)

# 从GeoJSON字符串生成sf对象
sf_obj <- st_read(textConnection(j), driver = "GeoJSON")

# 保存为Shapefile
st_write(sf_obj, dsn = "temp.shp", driver = "ESRI Shapefile")

额外注意事项

  • Shapefile格式有字段名长度限制(最多10个字符),如果数据中字段名过长,st_write会自动截断,也可以手动重命名字段避免问题。
  • 若数据量较大,建议分块处理或增加R的内存分配,避免内存溢出。

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:23:13