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

基于GISTools计算Georgia多边形几何参数遇报错求助

批量计算Georgia多边形几何参数的问题解决方法

我来帮你搞定这个批量计算的问题!首先理清楚你遇到的两个报错的原因,再给你正确的调用方式和优化后的函数方案。

错误原因分析

  1. 第一种调用方式的错误:
    你写的Complete.List(list(georgia.polys[[1:159]]))里,georgia.polys[[1:159]]是错误的索引用法——[[只能用来提取列表里的单个元素,要提取多个元素(比如1到159号多边形),应该用方括号georgia.polys[1:159]。而且额外套的list()也是多余的,因为georgia.polys本身就是一个包含159个多边形的列表,直接传进去就行。

  2. 第二种调用方式的错误:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:34:59