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

Split longitude and latitude columns to create grid with equal sized cells

我有一个坐标如下的数据集:

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。四个 lat/lot 坐标表示区域的边界(四个角)。

我想做的是创建一个网格,将 splits/separates 这个范围分成 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))

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

首先,我们首先将 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 = "+")

用例:

例如,您可以像这样计算每个多边形内的点数:

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