【问题标题】:R for compute the area and centroid of polygonsR用于计算多边形的面积和质心
【发布时间】:2017-01-07 12:25:55
【问题描述】:

创建函数来计算多边形列表的面积和质心(如 georgia.polys 的格式)。多边形的面积公式是

其中 A 是多边形区域,xi 是多边形边界的第 i 个 x 坐标(R 中的 x[i]),yi 是多边形边界的第 i 个 y 坐标(R 中的 y[i] ) - n 是用于指定多边形边界的点数。假设多边形是封闭形式,因此 xi 和 yi 取与 xn 和 yn 相同的值。 质心具有坐标 (Cx, Cy),其中:

这是已经创建的代码,但我不确定质心坐标是否正确

library(GISTools)
data("georgia")


polyn<-function(x){

  poly.df<-data.frame()

  for(d in 1:159){
    poly.d<-x[[d]]
    n<-length(poly.d[,1])

    i<-1
    A.sum<-0
    C.xsum<-0
    C.ysum<-0

    while(i<n){

      A.area<-0.5*(poly.d[i,2]*poly.d[i+1,1]-poly.d[i+1,2]*poly.d[i,1])
      A.sum<-A.sum+A.area

      C.x<-(1/(6*A.sum))*(poly.d[i,2]+poly.d[i+1,2])*(poly.d[i,2]*poly.d[i+1,1]-poly.d[i+1,2]*poly.d[i,1])
      C.xsum<-C.xsum+C.x

      C.y<-(1/(6*A.sum))*(poly.d[i,1]+poly.d[i+1,1])*(poly.d[i,2]*poly.d[i+1,1]-poly.d[i+1,2]*poly.d[i,1])
      C.ysum<-C.ysum+C.y

      i<-i+1
    }

    poly.df<-rbind(poly.df, c(A.sum,C.xsum,C.ysum))
    colnames(poly.df) <- c("Area", "Cx", "Cy")
  }

  poly.df

}

polyn(georgia.polys)

这是该函数的一些结果,

          Area           Cx            Cy
1   1326077000    4044403.4    4855396.03 
2    891511462   -2237689.5   -2962558.41 
3    740601936   10709355.7   12996988.27 

有人可以帮我写代码吗?

【问题讨论】:

    标签: r polygons


    【解决方案1】:

    C.ysumC.xsum 中的区域 A.sum 应该是总区域,而不是取决于您的迭代器 i 的区域。最简单的方法是在计算面积后加上除法。

    此外,方程应该循环遍历索引1,2,...,n+1,最后一个顶点与第一个顶点相同。因此,您还应该修改您的代码,使其在方程式求和的最后一种情况下循环。

    ....
    
    while(i<n+1){
    
      j <- ifelse(i+1==n+1,1,i+1) # j=i+1 and j=1 for the last iteration
    
      A.area<-0.5*(poly.d[i,2]*poly.d[j,1]-poly.d[j,2]*poly.d[i,1])
      A.sum<-A.sum+A.area
    
      C.x<-(poly.d[i,2]+poly.d[j,2])*(poly.d[i,2]*poly.d[j,1]-poly.d[j,2]*poly.d[i,1])
      C.xsum<-C.xsum+C.x
    
      C.y<-(poly.d[i,1]+poly.d[j,1])*(poly.d[i,2]*poly.d[j,1]-poly.d[j,2]*poly.d[i,1])
      C.ysum<-C.ysum+C.y
    
      i<-i+1
    }
    
    C.ysum<-C.ysum/(6*A.sum)
    C.xsum<-C.xsum/(6*A.sum)
    ....
    

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 2011-01-22
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多