拆分经度和纬度列以创建具有相同大小的单元格的网格

时间:2017-07-31 09:11:30

标签: python r cell geospatial latitude-longitude

我有一个包含以下坐标的数据集:

lat <- c(-5.9, 35.9, 5.13, -3.4)
lon <- c(-19.9, -6, -39.9, 9.38)

因此纬度范围为-5.9 - 35.9,而经度范围为-39.9 - 9.38。四个纬度/批次坐标表示区域的边界(四个角)。

我想要做的是创建一个网格,将该范围拆分/分成20个(左右)相等的单元格。我尝试了以下方法,将实例拆分为相等的部分并创建一个新列,为每个拆分分配一个数字(1-20)。

df$LAT_SPLIT <- NA
df$LAT_SPLIT <- as.numeric(cut2(df$LAT, g=20))

但是,每个分割都没有相同的坐标范围(度),这会创建不同大小的网格。我的问题是,如何将上述坐标分开以创建具有相同单元格的网格,同时创建一个新列,其中每个单元格都分配了一个数字?

我已经阅读了不同的方法,每个单元代表纬度的1度变化* 30分钟的经度,但我不知道该怎么做。我已经尝试更改上面的代码,以便纬度中的每个度数变化都会分割纬度列,但我还不能弄清楚如何做到这一点,我相信你可以使用序列?即使我可以让它工作,经度仍然会有不同的范围..

我在R中试过这个,但是使用Python的任何建议也都很受欢迎 非常期待任何可能的解决方案,谢谢!

可重复的代码

df <- structure(list(LAT = c(35.61226, 35.34986, 35.17794, 34.60425,34.40356, 33.94433, 33.41834, 16.89566, 16.89561, 16.89561),
                     LON = c(-9.604802, -9.803048, -9.921968, -10.30782, -10.44971,-10.76656, -11.13053, -24.99776, -24.99788, -24.99773)), 
                     .Names = c("LAT","LON"), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 5L,6L, 7L, 44161L, 44162L, 44163L))

1 个答案:

答案 0 :(得分:1)

这是一种生成正多边形网格的方法。

首先,我们将data.frame转换为SpatialPointsDataFrame

library(sp)
dfSp <- SpatialPointsDataFrame(matrix(c(df$LON, df$LAT), nrow = nrow(df)), data = df)

之后,我们使用makegrid创建一个中心点的常规网格,并将其转换为SpatialPointsDataFrame

grid <- makegrid(dfSp, n = 20)
gridSp <- SpatialPointsDataFrame(grid, data = data.frame(id = rownames(grid)))

为了生成多边形,我们使用了一些raster::函数。首先,我们创建一个RasterLayer然后转换为多边形。

library(raster)
gridSpRas <- rasterFromXYZ(gridSp)
gridPoly <- rasterToPolygons(gridSpRas, dissolve = T)

此数据还有每个多边形的数字标识符(在本例中为gridPoly$layer):

str(gridPoly@data)
# 'data.frame': 30 obs. of  1 variable:
#   $ layer: num  19 20 21 22 24 14 15 16 17 18 ...

让我们看看结果:

plot(gridPoly)
points(dfSp, col = "red", pch = "+")

enter image description here

USECASE:

例如,您可以计算每个多边形内的点数,如下所示:

gridPoly$count <- unlist(lapply(1:length(gridPoly), 
                                function (x) {length(dfSp[gridPoly[x, ], ])}))
spplot(gridPoly, zcol = "count")

enter image description here