拆分经度和纬度列以创建具有相同大小单元格的网格
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")
我有一个坐标如下的数据集:
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")