我想不会有太多人愿意花费20分钟的时间来生成6125000个多边形以测试他们的答案。恰巧我不得不升级我的基于Windows的云服务器到32GB才能创建1km的正方形...
不幸的是,当您创建网格正方形时,它们按从下到上、从左到右的顺序排序,而标签则按从上到下、从左到右的顺序排序。这使得标记变得有点棘手。对于500km的盒子,我们希望能够用
LETTERS[-9]
来标记它们,但由于排序的原因,我们需要用
LETTERS[-9][rep(4:0 * 5, each = 5) + 1:5]
来标记它们。
我们可以通过将包含网格名称的数据框与网格对象绑定在一起来创建命名网格,如下所示:
gridref500 <- LETTERS[-9][rep(4:0 * 5, each = 5) + 1:5]
OS_National_Grid_500km <- st_as_sfc(OS_National_Grid_BBox) %>%
st_make_grid(square = TRUE, cellsize = c(5e5, 5e5)) %>%
cbind(data.frame(Grid_Ref = gridref500)) %>%
st_sf()
现在我们可以绘制图表以确保我们有正确的标签:
library(ggplot2)
ggplot(OS_National_Grid_500km) +
geom_sf(fill = "white") +
geom_sf_text(aes(label = Grid_Ref), size = 5)
![](https://i.imgur.com/pX1IcNC.png)
第二层更难,因为我们需要在每个方块内重复行和列。这需要一些模数运算来正确地进行索引:
gridref100 <- rep(gridref500, each = 5) %>%
split(0:124 %/% 25) %>%
lapply(rep, 5) %>%
do.call(c, .) %>%
paste0(split(gridref500, 0:24 %/% 5) %>%
lapply(rep, 5) %>%
do.call(c, .) %>%
rep(5))
OS_National_Grid_100km <- st_as_sfc(OS_National_Grid_BBox) %>%
st_make_grid(square = TRUE, cellsize = c(1e5, 1e5)) %>%
cbind(data.frame(Grid_Ref = gridref100)) %>%
st_sf()
但是我们也可以看到这也是有效的:
ggplot(OS_National_Grid_100km) +
geom_sf(fill = "white") +
geom_sf_text(aes(label = Grid_Ref), size = 3)
![enter image description here](https://istack.dev59.com/yg4hr.webp)
再次,由于重复、模块化数学和子集,下一层变得更加复杂,但可以通过以下方式实现:
gridref10 <- rep(gridref100, each = 10) %>%
split(0:6249 %/% 250) %>%
lapply(rep, 10) %>%
do.call(c, .) %>%
paste0(as.character(rep(0:9, 6250)) %>%
paste0(rep(rep(0:9, each = 250), 25)))
OS_National_Grid_10km <- st_as_sfc(OS_National_Grid_BBox) %>%
st_make_grid(square = TRUE, cellsize = c(1e4, 1e4)) %>%
cbind(data.frame(Grid_Ref = gridref10)) %>%
st_sf()
显然,我现在无法绘制整个网格,因为它会太小而无法看到单独的正方形(更不用说它们的标签了),因此我只会提取
TQ
以确保编号正确。
TQ <- OS_National_Grid_10km[substr(OS_National_Grid_10km$Grid_Ref, 1, 2) == "TQ",]
ggplot(TQ) +
geom_sf(fill = "white") +
geom_sf_text(aes(label = Grid_Ref))
![enter image description here](https://istack.dev59.com/apeUd.webp)
最好的正方形也可以像10公里的方格一样进行标记,但是需要添加一个复杂的步骤,在标记后需要交换第四位和第五位数字。
gridref1 <- rep(gridref10, each = 10) %>%
split(0:624999 %/% 2500) %>%
lapply(rep, 10) %>%
do.call(c, .) %>%
paste0(as.character(rep(0:9, 625000)) %>%
paste0(rep(rep(0:9, each = 2500), 250)))
swapchar <- substr(gridref1, 4, 4)
substr(gridref1, 4, 4) <- substr(gridref1, 5, 5)
substr(gridref1, 5, 5) <- swapchar
OS_National_Grid_1km <- st_as_sfc(OS_National_Grid_BBox) %>%
st_make_grid(square = TRUE, cellsize = c(1e3, 1e3)) %>%
cbind(data.frame(Grid_Ref = gridref1)) %>%
st_sf()
我们需要挑选一个小的子集来展示这个工作原理:
ss <- with(OS_National_Grid_1km,
which(paste0(substr(Grid_Ref, 1, 3), substr(Grid_Ref, 5, 5)) == "TQ28"))
TQ28 <- OS_National_Grid_1km[ss,]
ggplot(TQ28) +
geom_sf(fill = "white") +
geom_sf_text(aes(label = Grid_Ref))
![enter image description here](https://istack.dev59.com/3CBmQ.webp)
substr
是对的,我已经更改了。似乎我错了1km的网格。我会设法调试它,而不必生成实际的网格(或者租用更大的服务器)。 - Allan Cameronsplit(0:62499 %/% 2500)
应该是split(0:62499 %/% 250)
。 - Allan Cameron