将Shapefile转换为GeoJSON后转DataFrame时出现行数不匹配错误的技术求助
你在尝试将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

