我有一个包含以下坐标的数据集:
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))
答案 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 = "+")
例如,您可以计算每个多边形内的点数,如下所示:
gridPoly$count <- unlist(lapply(1:length(gridPoly),
function (x) {length(dfSp[gridPoly[x, ], ])}))
spplot(gridPoly, zcol = "count")