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

将Shapefile转换为GeoJSON后转DataFrame时出现行数不匹配错误的技术求助

解决Shapefile转GeoJSON再转data.frame的行数不匹配问题

你在尝试将Shapefile转成GeoJSON后再转换为data.frame时,碰到了这个报错:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 144, 62, 29

这个问题的根源在于FROM_GeoJson()解析GeoJSON后返回的是嵌套结构的列表——你的两个MULTIPOLYGON要素包含的子多边形/顶点数量不一样,plyr::ldply没法把这种行数不一致的嵌套列表强行合并成一个规整的data.frame。

其实不用绕这么复杂的弯路,我们可以同时拿到GeoJSON和符合要求的data.frame,给你两个简单的解决方案:

方案一:直接从sf对象生成data.frame(推荐)

因为你用sf::st_read()读取的stands_sel本身就是一个带几何信息的sf对象,直接转成data.frame就能完美保留所有属性和几何信息(几何部分会以WKT字符串形式存储),同时不影响GeoJSON的导出:

library(sf)
library(geojsonsf)

# 下载并读取Shapefile(你的原有代码)
download.file( "https://github.com/Leprechault/trash/raw/main/sel_stands_CMPC.zip", zip_path <- tempfile(fileext = ".zip") )
unzip(zip_path, exdir = tempdir())
setwd(tempdir())
stands_sel <- st_read("sel_stands_CMPC.shp")

# 导出GeoJSON(这部分可以正常执行)
geo <- sf_geojson(stands_sel)

# 直接将sf对象转为规整的data.frame
stands_df <- as.data.frame(stands_sel)
# 此时stands_df包含所有16个属性列,以及存储MULTIPOLYGON的WKT字符串的geometry列,行数完全匹配

方案二:从GeoJSON转回sf对象再转data.frame

如果你一定要通过GeoJSON中间步骤转data.frame,可以用geojsonsf包的geojson_sf()把GeoJSON转回sf对象,再转成data.frame,这样就能避免嵌套列表的行数问题:

# 在生成geo变量之后执行以下代码:
geo_sf <- geojson_sf(geo)
geo_js_df <- as.data.frame(geo_sf)

为什么原有方法会报错?

FROM_GeoJson()会把GeoJSON中的几何要素拆分成深层嵌套的列表(比如每个MULTIPOLYGON下的子多边形、每个子多边形下的顶点坐标),这些列表的长度(行数)因为要素的几何复杂度不同而不一样,plyr::ldply在尝试把它们合并成一个data.frame时,就会触发行数不匹配的错误。而用sf相关的方法处理,会把几何信息作为一个整体(WKT字符串或sf几何对象)存储,不会拆分顶点,自然就不会有行数问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:58:13