R使用geojson_write导出GEOJSON丢失M维度(时间戳)如何解决?
解决方案
核心原因:geojsonio包的geojson_write函数默认遵循RFC7946标准GeoJSON规范,该规范明确定义仅支持2D(XY)和3D(XYZ,含高程)坐标,会自动移除M维度。你要保留4维坐标可以用以下两种方案:
方案1:使用sf自带的st_write函数(推荐)
sf包的写入函数支持关闭RFC7946严格校验,保留XYZM四个维度,直接替换你代码中最后一行geojson_write即可:
# 替换原来的geojson_write代码 st_write(res_sfdata, dsn = "C:/Project/checks/res_sfdata.geojson", driver = "GeoJSON", RFC7946 = FALSE, # 关闭严格RFC7946规范校验,允许保留M维度 delete_layer = TRUE) # 覆盖已存在的同名文件
输出的GeoJSON会直接保留coordinates中的经度、纬度、高程、时间戳四个值,完全符合你给出的示例格式。
方案2:手动构造JSON结构(适合自定义需求)
如果需要对输出格式做更多自定义调整,可以用jsonlite包手动构造GeoJSON结构再写入:
library(jsonlite) # 构造FeatureCollection结构 geojson_output <- list( type = "FeatureCollection", features = lapply(1:nrow(res_sfdata), function(i) { list( type = "Feature", properties = list(Msisdn = res_sfdata$Msisdn[i]), # 可自行添加其他属性字段 geometry = list( type = "LineString", coordinates = unname(st_coordinates(res_sfdata$geometry[i])[,1:4]) # 提取XYZM四列 ) ) }) ) # 写入文件 write_json(geojson_output, path = "C:/Project/checks/res_sfdata.geojson", auto_unbox = TRUE, # 自动解包单值数组 digits = 6) # 坐标保留6位小数,可自行调整
补充说明
当前主流的地理可视化库(Mapbox GL JS、deck.gl、Leaflet扩展插件等)均兼容带4维坐标的扩展GeoJSON格式,不会影响你后续的可视化项目使用。
内容的提问来源于stack exchange,提问作者brad7192
相关产品推荐
相关产品推荐

