将 OS National Grid 名称/代码添加到 R 中的网格

2024-03-25

我希望重新创建完整的地形测量国家网格(如此处所示https://upload.wikimedia.org/wikipedia/commons/f/f5/Ordnance_Survey_National_Grid.svg https://upload.wikimedia.org/wikipedia/commons/f/f5/Ordnance_Survey_National_Grid.svg) in R.

我可以毫无问题地创建 4 个级别的网格(使用 36GB RAM 的 1 公里版本大约需要 20 分钟):

library(sf)

OS_National_Grid_BBox <- st_bbox(c(xmin = -1000000, xmax = 1500000, ymax = 2000000, ymin = -500000), crs = st_crs(27700))

OS_National_Grid_500km <- st_make_grid(st_as_sfc(OS_National_Grid_BBox), square = T, cellsize = c(500000, 500000)) %>% st_sf()
OS_National_Grid_100km <- st_make_grid(st_as_sfc(OS_National_Grid_BBox), square = T, cellsize = c(100000, 100000)) %>% st_sf()
OS_National_Grid_10km <- st_make_grid(st_as_sfc(OS_National_Grid_BBox), square = T, cellsize = c(10000, 10000)) %>% st_sf()
OS_National_Grid_1km <- st_make_grid(st_as_sfc(OS_National_Grid_BBox), square = T, cellsize = c(1000, 1000)) %>% st_sf()

但是,如何命名所有 500 公里、100 公里、10 公里和 1 公里单元格以反映图像中显示的命名/编码约定?


我想没有多少人愿意在测试他们的答案的过程中花费 20 分钟来生成 6,125,000 个多边形。碰巧的是,我不得不将基于 Windows 的云服务器升级到 32GB,只是为了创建 1 公里的方块......

不幸的是,当您创建网格方块时,它们是从下到上、从左到右排序的,而标签是按顺序排序的从上到下, 左到右。这使得标签有点棘手。对于 500 公里的盒子,我们希望能够给它们贴上标签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)

第二级更难,因为我们需要重复每个方块内的行和列。这需要一些模块化数学才能获得正确的索引:

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)

同样,由于重复、模块化数学和子集设置,下一层变得更加复杂,但可以这样实现:

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))

最细的方块也可以用与 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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 OS National Grid 名称/代码添加到 R 中的网格 的相关文章

  • 如何在 R 中执行随机森林/交叉验证

    我无法找到对我尝试生成的回归随机森林模型执行交叉验证的方法 因此 我有一个数据集 其中包含 1664 个解释变量 不同的化学性质 和一个响应变量 保留时间 我正在尝试生成一个回归随机森林模型 以便能够预测给定保留时间的物质的化学性质 ID
  • 加拿大人口普查地图分区 R

    我对 R 和映射非常陌生 我想创建某些数据的映射 我有一组名为 D Montreal 的数据 显示 2010 年前往蒙特利尔的加拿大人口普查部门游客来自哪个国家 我想使用此数据创建一个地图 以显示有多少人来自不同地区 也许可以通过对根据人数
  • R:如何添加具有从矩阵的每一行中随机选择的值的列?

    我会先说我是一个 R 菜鸟 我认为这可能有一个简单的解决方案 但我正在努力寻找它 我有一个 2 列 1 000 行的矩阵 保持行固定 我想创建一个新变量 从两列中随机选择一个元素 例如制作一个简单的矩阵 matrix c 1 1 4 6 1
  • 更改 ggplot 条形图填充颜色

    有了这个数据 df lt data frame value c 20 50 90 group c 1 2 3 我可以得到一个条形图 df gt ggplot aes x group y value fill value geom col c
  • 更改列的顺序

    我正在处理一个包含 gt 40 列的大型数据框 我希望能够移动列 而不必指定所有列名称 例如 a lt c 1 5 b lt c 4 3 2 1 1 Percent lt c 40 30 20 10 10 Labels lt c Cat D
  • 在 R 中将文本文件拆分为段落文件

    我正在尝试将一个巨大的 text 文件拆分为多个 text 文件 每个文件仅包含一个段落 让我举个例子 我需要这样的文字 这是第一段 这没有任何意义 因为这只是一个例子 这是第二段 和前一段一样毫无意义 另存为两个独立的 txt 文件 其中
  • 使用facet时ggplot2控制每行的面板数量?

    Is it possible to control the number of panels per row in a ggplot I can only get an equal number of panels on each row
  • 使用 Rcpp 得出斐波那契数列的意外结果

    我刚刚开始使用Rcpp很抱歉 如果我错过了一个简单的步骤或类似的东西 我已经尝试过这个 sourceCpp library Rcpp sourceCpp code include
  • 为什么安装的“igraph”包在加载后返回“libicui18n.so.58:无法打开共享对象文件”?

    我试图使用命令 install packages igraph 在 R 中安装 igraph 包 安装后 在测试阶段出现以下错误 测试是否可以加载已安装的包错误 包或命名空间 dyn load file DLLpath DLLpath 中的
  • 完全缺失列的 VaR 计算

    我需要计算股票收益的滚动 VaR 从这篇文章 使用rollapply函数使用R进行VaR计算 https stackoverflow com questions 25045612 using rollapply function for v
  • 使用列表中的数据框:删除变量,添加新变量

    定义一个列表dats有两个数据框 df1 and df2 dats lt list df1 data frame a sample 1 3 b sample 11 13 df2 data frame a sample 1 3 b sampl
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • 如何在ggplot2中使用希腊符号?

    我的类别需要用希腊字母命名 我在用ggplot2 并且它与数据配合得很好 不幸的是 我无法弄清楚如何将这些希腊符号放在 x 轴上 在刻度线处 并使它们出现在图例中 有什么办法可以做到吗 更新 我看了一下link https github c
  • 如何更改 Quarto pptx 中的字体格式

    我正在 R 中使用 Quarto 创建 pptx 要更改我尝试更改的默认字体格式mainfont范围 但是当我渲染它时 最终的 pptx 文件具有默认字体 Calibri 这是我的文件 YAML 将 Quarto 文件渲染为 pptx 时如
  • (R 错误)错误:cons 内存耗尽(达到限制?)

    我正在处理大数据 并且有一个 70GB 的 JSON 文件 我正在使用 jsonlite 库将文件加载到内存中 我尝试过 AWS EC2 x1 16large 机器 976 GB RAM 来执行此负载 但 R 因错误而中断 Error co
  • r - 从我的应用程序下载shinyapps代码

    我正在尝试从shinyapps io 在另一台电脑上下载我的shiny 应用程序代码 我按照这个例子 https support rstudio com hc en us articles 204536588 从 shinyapps io下
  • 当添加列较少时追加到现有 SQLite 表,而不将数据库读入 R

    是否有一些简单的方法 无论是在 SQL 端还是在 R 端 将 data frame 附加到具有更多列的现有表 缺失的列应该用 NA 填充 如果它能够优雅地处理比表 1 列数更多的表 2 那么会加分吗 library RSQLite Crea
  • svyby比例的置信区间

    是否存在创建置信区间的现有函数 从一个svyby比例对象 在我的例子中 是一个二进制项目的交叉表survey包裹 我经常比较各组之间的比例 如果有一个可以提取置信区间的函数 使用调查函数svyciprop而不是confint 下面的示例显示
  • R 中的 huxtable 即使有选项也默认为科学记数法(scipen=999)

    我试图生成像样的桌子 并在过去的一周尝试了很多软件包 我的头在游泳 今天早上开始使用 package huxtable 并试图摆脱科学记数法 x lt mtcars 1 5 1 2 x mpg lt x mpg 10000000 get s
  • 如何缩放(标准化)每列内的 ggplot2 stat_bin2d 值(按 X 轴)

    我有一个 ggplot stat bin2d 热图 library ggplot2 value lt rep 1 5 1000 df lt as data frame value df group lt rep 1 7 len 5000 d

随机推荐

  • React 路由器和任意查询参数:页面加载时无意刷新?

    过去几周我一直在使用 React Router 取得了巨大成功 但我刚刚遇到了一个我似乎无法找到解决方案的问题 每当将任意查询参数附加到 URL 时 在我们的例子中 用于从电子邮件进行 URL 跟踪 您登陆的页面就会加载 然后自动刷新 而不
  • 开发支持 Web 应用程序的移动应用程序的方法

    我的公司构建了自己的项目管理 Web 应用程序 这就像打了类固醇的大本营 该应用程序的核心功能是 创建任务列表 将任务分配给团队成员 跟踪任务项目的工时 我希望构建移动应用程序作为网络应用程序的扩展 移动应用程序必须 重现上述功能 连接到与
  • Visual Studio 2008 崩溃日志在哪里? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我安装了带有 SP1 的 Visual Studio 2008 当我在 Moq 框架中使用 lambda 表达式时 它崩溃了 起初我以为是Reshar
  • 无法通过 SSH 连接到曾经正常工作的 GCP 虚拟机实例

    我昨天创建了几个 GCP 虚拟机实例 所有实例都使用相同的配置 但运行不同的任务 我可以通过 GCP 控制台通过 SSH 连接到这些实例 它们都工作正常 今天我想检查任务是否已完成 但我无法再通过浏览器 SSH 到任何这些实例 错误消息如下
  • Angularjs ng-attr-title 在 Chrome 浏览器中不起作用

    我正在使用 ng table 在表网格视图中显示所有值 我想在用户将鼠标悬停在单元格上时显示一些消息 所以我使用 ng attr title 作为工具提示 它在 firfox 中工作 但在 google chrome 网络浏览器中不起作用
  • 将 WPF 控件居中

    我有一个窗口 我可以在其中添加新的UserControl到 使用图像 我只想将控件置于屏幕中间 垂直和水平 我只能让垂直的工作 我要交换内容DockPanel来自我的 CodeBehind 并希望在开始制作幻灯片 UI 之前显示此启动屏幕
  • 选择添加按钮时需要显示额外的文本输入,还需要删除字段

    我有一个表格 要求用户输入他们的项目结果 他们需要输入至少一个结果 并且每个结果都需要至少 2 个与其相关的度量 因此 我需要能够向用户呈现初始结果字段 以及与其关联的两个度量字段 并能够向其相关结果添加更多度量 I sketched up
  • MS Access VBA 代码编辑器字符编码和复制/粘贴

    Access 的 VBA 编辑器中实际使用的编码是什么 我已经寻找具体答案很长一段时间了 但没有运气 我以为它是UTF 8 但我不太确定 我的主要问题是 在 VBA 中编写查询时 有时需要在 Access 的查询编辑器中测试它 然而 当复制
  • 将本地 jar 文件声明为库项目的传递依赖项

    我有一个 Android 应用程序 App1 它依赖于一个库项目 Lib1 该库项目有几个远程依赖项 例如 guava android 支持库等 和两个本地依赖项 它们是存储在 Lib1 libs 中的 JAR 文件 Lib1 的 buil
  • Android - CardView 背景始终为灰色

    我正在尝试以编程方式更改 CardView 颜色 这是我的卡片视图
  • Silverlight - 绑定使用 https 的图像

    我存储了一个图像 可以使用 http 和 https 在浏览器中查看该图像 然而 当我将这些 url 绑定到我的图像源时 我只能看到使用 http 的 URL silverlight 有什么办法支持 https 图像吗 似乎是Silverl
  • FSharp.Data Csv.Load() 失败,仅支持 Web 位置

    我有以下代码 r packages FSharp Data 2 0 9 lib portable net40 sl5 wp8 win8 FSharp Data dll open FSharp Data let trainData CsvFi
  • Go 之旅练习#10:爬虫

    我正在经历 Go Tour 我觉得除了并发之外 我对这门语言有了很好的理解 slide 10 https tour golang org concurrency 10是一个要求读者并行化网络爬虫的练习 并使其不覆盖重复 但我还没有做到这一点
  • Keras:如何将学习率输出到张量板上

    我添加了一个回调来衰减学习率 keras callbacks ReduceLROnPlateau monitor val loss factor 0 5 patience 100 verbose 0 mode auto epsilon 0
  • Sonata 管理仪表板:配置每个实体的操作

    我正在使用SonataAdminBundle作为 Symfony2 v2 0 x 支持的网站管理界面的基础 默认情况下 添加到 SonataAdmin 仪表板的实体具有以下操作 add list 这对于大多数实体来说效果很好 但是该网站有一
  • 如何禁用文本区域的可调整大小属性?

    我想禁用 a 的可调整大小属性textarea 目前 我可以调整大小textarea通过单击右下角textarea并拖动鼠标 我怎样才能禁用这个功能 以下 CSS 规则禁用调整大小行为textarea http www w3 org wik
  • elm:读取文件内容

    有没有办法读取文件elm 我想要一个xml设置文件 我将在其中保留不同的设置并用 elm 读取它 我已经看过这个parser https github com toburger elm xml parser 但它期望xml内容 而不是路径
  • 解决方案构建顺序的保存位置

    我有一个包含多个项目 csproj 和 btproj 的解决方案 我实际上正在运行 BizTalk 2013 R2 因此我在 Visual Studio 2013 下进行开发 我有许多 powershell 脚本来部署我的应用程序 我必须增
  • 查找包含任意坐标列表的 voronoi 区域

    我正在使用一种算法 对于每次迭代 都需要找到一组任意坐标属于 Voronoi 图的哪个区域 即每个坐标位于哪个区域内 我们可以假设所有坐标都属于一个区域 如果这有什么区别的话 我还没有任何可以在 Python 中运行的代码 但伪代码如下所示
  • 将 OS National Grid 名称/代码添加到 R 中的网格

    我希望重新创建完整的地形测量国家网格 如此处所示https upload wikimedia org wikipedia commons f f5 Ordnance Survey National Grid svg https upload