在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
相关产品推荐
相关产品推荐

