基于GISTools计算Georgia多边形几何参数遇报错求助
我来帮你搞定这个批量计算的问题!首先理清楚你遇到的两个报错的原因,再给你正确的调用方式和优化后的函数方案。
错误原因分析
第一种调用方式的错误:
你写的Complete.List(list(georgia.polys[[1:159]]))里,georgia.polys[[1:159]]是错误的索引用法——[[只能用来提取列表里的单个元素,要提取多个元素(比如1到159号多边形),应该用方括号georgia.polys[1:159]。而且额外套的list()也是多余的,因为georgia.polys本身就是一个包含159个多边形的列表,直接传进去就行。第二种调用方式的错误:
Complete.List(list(georgia.polys))是把整个georgia.polys列表包装成了一个长度为1的新列表,你的函数循环时只会处理这一个“大元素”,而这个元素里包含了所有多边形的坐标数据,转成data.frame时因为每个多边形的坐标行数不一样,就会抛出arguments imply differing number of rows的错误。
正确的解决方法
方法一:修正调用方式(保留你原有的函数)
直接把georgia.polys作为参数传给你的Complete.List函数即可,不需要额外包装:
# 正确调用 result_table <- Complete.List(georgia.polys)
方法二:优化整合函数(更高效简洁)
原函数里的手动循环可以用lapply替代,代码更简洁,运行效率也更高,修改后的完整代码如下:
library(GISTools) data(georgia) # 面积计算函数 polygon.area <- function(co_ord){ n = dim(co_ord)[1]; sum.of = 0; for(i in 1:(n-1)){ sum.of = sum.of + (co_ord[i,1]*co_ord[i+1,2])-(co_ord[i+1,1]*co_ord[i,2]) }; return((sum.of*0.5)*-1) } # X质心计算函数 Cen_x <- function(cen_x_coord){ n = dim(cen_x_coord)[1]; sum_cen_x = 0; for(i in 1:(n-1)){ sum_cen_x = sum_cen_x + ((cen_x_coord[i,1]+cen_x_coord[i+1,1]))*((cen_x_coord[i,1]*cen_x_coord[i+1,2])-(cen_x_coord[i+1,1]*cen_x_coord[i,2])) }; return((sum_cen_x/(6*polygon.area(cen_x_coord))*-1)) } # Y质心计算函数 Cen_y <- function(cen_y_coord){ n = dim(cen_y_coord)[1]; sum_cen_y = 0; for(i in 1:(n-1)){ sum_cen_y = sum_cen_y + ((cen_y_coord[i,2]+cen_y_coord[i+1,2]))*((cen_y_coord[i,1]*cen_y_coord[i+1,2])-(cen_y_coord[i+1,1]*cen_y_coord[i,2])) }; return((sum_cen_y/(6*polygon.area(cen_y_coord))*-1)) } # 周长计算函数 Polygon.Perim <- function(perim_coord){ n = dim(perim_coord)[1]; sum.of.perim = 0; for(i in 1:(n-1)){ sum.of.perim = sum.of.perim + sqrt((perim_coord[i+1,1]-perim_coord[i,1])^2+(perim_coord[i+1,2]-perim_coord[i,2])^2) }; return(sum.of.perim) } # 优化后的整合函数 Complete.List <- function(Poly.List){ # 遍历每个多边形,计算参数并生成小数据框 poly_results <- lapply(Poly.List, function(poly){ area <- polygon.area(poly) cen_x <- Cen_x(poly) cen_y <- Cen_y(poly) perim <- Polygon.Perim(poly) data.frame( "Polygon Area" = area, "Centroid of X" = cen_x, "Centroid of Y" = cen_y, "Perimeter" = perim ) }) # 合并所有小数据框为完整表格 do.call(rbind, poly_results) } # 调用函数生成完整结果 full_result <- Complete.List(georgia.polys)
这个优化后的函数用lapply批量处理每个多边形,逐个计算参数后生成小数据框,最后用do.call(rbind, ...)合并成一个完整表格,避免了原函数手动添加行的繁琐,也更不容易出错。
单个多边形的测试验证
如果要测试单个多边形,依然可以用你之前的写法,函数完全兼容:
single_result <- Complete.List(list(georgia.polys[[2]]))
内容的提问来源于stack exchange,提问作者user9181109

