R函数计算坐标

时间:2016-09-12 11:47:04

标签: r dataframe spatial

尝试通过mapply或类似的东西完成它而不进行迭代 - 我在R中有一个空间数据框,并希望对所有更复杂的形状进行子集化 - 即具有10个或更多坐标的形状。 shapefile是实质性的(10k形状),对于小样本来说很好的方法对于大样本来说非常慢。迭代方法是

Street$cc <-0
i <- 1
while(i <= nrow(Street)){
  Street$cc[i] <-length(coordinates(Street)[[i]][[1]])/2
  i<-i+1
}

如何以任何阵列方式获得相同的效果?从顶部(Shapefile / lines / Lines / coords)访问几个级别我有一个问题

我试过了:

    Street$cc <- lapply(slot(Street, "lines"), 
     function(x) lapply(slot(x, "Lines"),   
     function(y) length(slot(y, "coords"))/2))

/除以2,因为每个坐标是一对2个值/ 但仍然会返回一个列表,其中包含每行的项目数,而不是整数,告诉我有多少项目。如何获得空间数据框中每个形状的坐标数?抱歉,我没有可重复的示例,但您可以检查任何空间文件 - 它更多的是访问低级别的属性而不是非常具体的问题。

编辑: 我解决了这个问题 - 使用函数

tail()

1 个答案:

答案 0 :(得分:1)

这是一个可重复的例子。与你的略有不同,因为你没有提供数据,但原理是一样的。 &#39;原则&#39;深入研究复杂的S4结构时,要注意每个级别是列表还是插槽,使用[[]]访问列表,@用于插槽。

首先让我们得到一个空间ploygon。我将使用美国州界;

library(maps)  
local.map = map(database = "state", fill = TRUE, plot = FALSE) 
IDs = sapply(strsplit(local.map$names, ":"), function(x) x[1])
states = map2SpatialPolygons(map = local.map, ID = IDs) 

现在我们可以使用少于200个顶点对多边形进行子集化,如下所示:

# Note: next line assumes that only interested in one Polygon per top level polygon.
# I.e. assumes that we have only single part polygons
# If you need to extend this to work with multipart polygons, it will be
# necessary to also loop over values of lower level Polygons
lengths = sapply(1:length(states), function(i) 
            NROW(states@polygons[[i]]@Polygons[[1]]@coords))

simple.states = states[which(lengths < 200)]
plot(simple.states)

enter image description here