使用 sf 围绕点(质心)创建网格

2023-11-30

我有 EURO-CORDEX 气候数据,该数据位于 11 度旋转的极网格上。我通过将投影转换为 WGS84 来预先准备好这些数据。数据以点的形式出现,代表方形网格的质心。我需要创建围绕这些点的方形网格。我已经导出了实现此目的的通用方法,但网格单元的最终区域显示的误差高达 50%。

我的代码如下。之前我曾被告知要以 tidyverse 表示法提供代码,因此我的目标是尽可能将其删除。数据和代码在github上:https://github.com/avisserquinn/exampleData

首先,我从 csv 加载质心的经度和纬度,并使用 WGS84 投影转换为空间特征数据框。这些点应代表 11 x 11 度或 12 x 12 公里的网格。

> library(tidyverse)
> library(sf)
> 
> data <- read_csv("stackExample.csv", col_types = cols())
> data <- st_as_sf(data, coords = c("lon", "lat")) # Spatial feature data frame
> data <- st_set_crs(data, 4326) # Set projection
> data
Simple feature collection with 2221 features and 1 field
geometry type:  POINT
dimension:      XY
bbox:           xmin: -9.996 ymin: 50.051 xmax: 1.965 ymax: 61.938
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
# A tibble: 2,221 x 2
    grid        geometry
   <dbl>     <POINT [°]>
 1     1 (-9.996 51.768)
 2     2 (-9.979 53.544)
 3     3  (-9.96 52.013)
 4     4 (-9.931 51.666)
 5     5 (-9.924 52.258)
 6     6 (-9.912 53.442)
 7     7 (-9.906 54.034)
 8     8  (-9.895 51.91)
 9     9 (-9.875 53.687)
10    10 (-9.869 54.278)
# ... with 2,211 more rows
> 
> ggplot(data) + geom_sf() + theme_bw()

enter image description here

我通过应用 st_make_grid 两次(来自 sf 空间特征包)来创建网格。第一次,我找到了点之间的中心。第二次,我找到网格角,这样这些点现在就是质心。

> cellsize = .11 
> dataGrid <- st_make_grid(data, cellsize = cellsize, what = "centers") 
> dataGrid <- st_make_grid(dataGrid, cellsize = cellsize)
> dataGrid <- dataGrid %>% as_tibble %>% st_as_sf
> dataGrid

Simple feature collection with 11772 features and 0 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -9.941 ymin: 50.106 xmax: 1.939 ymax: 62.096
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
                         geometry
1  POLYGON ((-9.941 50.106, -9...
2  POLYGON ((-9.831 50.106, -9...
3  POLYGON ((-9.721 50.106, -9...
4  POLYGON ((-9.611 50.106, -9...
5  POLYGON ((-9.501 50.106, -9...
6  POLYGON ((-9.391 50.106, -9...
7  POLYGON ((-9.281 50.106, -9...
8  POLYGON ((-9.171 50.106, -9...
9  POLYGON ((-9.061 50.106, -8...
10 POLYGON ((-8.951 50.106, -8...

接下来,我将网格数据与质心聚合,以仅查找匹配的网格单元。

> dataGrid <- aggregate(data, dataGrid, FUN = mean)
> dataGrid <- as_tibble(dataGrid)
> dataGrid <- dataGrid[!is.na(dataGrid$grid),]
> dataGrid$area_sqm = st_area(dataGrid$geometry)
> dataGrid$area_sqkm = as.numeric(unlist(dataGrid$area_sqm * 10^-6))
> dataGrid$area_deficit = (12*12) - dataGrid$area_sqkm
> dataGrid
# A tibble: 2,175 x 5
    grid                                                                      geometry area_sqm area_sqkm area_deficit
   <dbl>                                                                 <POLYGON [°]>    [m^2]     <dbl>        <dbl>
 1  656  ((-5.651 50.106, -5.541 50.106, -5.541 50.216, -5.651 50.216, -5.651 50.106)) 96173304      96.2         47.8
 2  678  ((-5.431 50.106, -5.321 50.106, -5.321 50.216, -5.431 50.216, -5.431 50.106)) 96173304      96.2         47.8
 3  702  ((-5.211 50.106, -5.101 50.106, -5.101 50.216, -5.211 50.216, -5.211 50.106)) 96173304      96.2         47.8
 4  730  ((-5.101 50.106, -4.991 50.106, -4.991 50.216, -5.101 50.216, -5.101 50.106)) 96173304      96.2         47.8
 5  693  ((-5.321 50.216, -5.211 50.216, -5.211 50.326, -5.321 50.326, -5.321 50.216)) 95954257      96.0         48.0
 6  720  ((-5.101 50.216, -4.991 50.216, -4.991 50.326, -5.101 50.326, -5.101 50.216)) 95954257      96.0         48.0
 7  762  ((-4.881 50.216, -4.771 50.216, -4.771 50.326, -4.881 50.326, -4.881 50.216)) 95954257      96.0         48.0
 8 1044  ((-3.891 50.216, -3.781 50.216, -3.781 50.326, -3.891 50.326, -3.891 50.216)) 95954257      96.0         48.0
 9  712  ((-5.211 50.326, -5.101 50.326, -5.101 50.436, -5.211 50.436, -5.211 50.326)) 95734844      95.7         48.3
10  746. ((-4.991 50.326, -4.881 50.326, -4.881 50.436, -4.991 50.436, -4.991 50.326)) 95734844      95.7         48.3
# ... with 2,165 more rows

当我绘制最终输出时,您可以看到问题。网格单元尺寸有很大偏差(赤字);由于投影是弯曲的,我预计与 12 x 12 公里会有一些偏差,但这种程度的赤字是极端的。另外,网格中存在间隙;我推测这是因为网格单元的大小不正确意味着并非所有点都被捕获?

> ggplot(dataGrid) + 
+   geom_sf(aes(geometry = geometry, fill = area_deficit)) +
+   theme_minimal() +  
+   scale_fill_viridis_c(direction = -1) +
+   scale_colour_viridis_c(direction = -1) +
+   coord_sf()

enter image description here

我尝试了多种方法来解决这个问题,但没有成功。任何有关替代解决方案的建议将不胜感激。


st_make_grid()仅使用第一个参数的边界框,因此您可以将边界框在每个方向上扩展单元格大小的 1/2:

# Generate some centroids
centroids <- st_make_grid(what="centers") %>% st_sf()

# Make a new grid from them
cellSize <- 10
grid <- (st_bbox(centroids) + cellSize/2*c(-1,-1,1,1)) %>%
  st_make_grid(cellsize=c(cellSize, cellSize)) %>% st_sf()

ggplot() + geom_sf(data=grid) + geom_sf(data=centroids)

网格示例

这篇文章目前已经很旧了,因此链接已损坏,但单元格大小 0.11 看起来不正确。希望你能解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sf 围绕点(质心)创建网格 的相关文章

  • 使用faceting()时如何连接geom_point()和geom_line?

    我有一个问题 但我在互联网上没有找到任何相关信息 我很高兴得到一些提示 我有一个数据集 其中 x 轴是离散的 但我想将这些点相互连接 我可以做到 我的问题是当我添加分面选项时 我无法再将这些点相互链接起来 我找到了一个替代方案 但看起来不太
  • 在 R 的替换命令中取消引用字符串

    我想知道是否可以unquote通过替换命令传递给表达式的字符串 具体来说 我使用 dplyr 从数据框中过滤和选择 gt w subject sex response 1 1 M 19 08 2 2 M 16 46 6 6 M 23 60
  • 将模式的所有元素与向量以相同的顺序匹配

    我创建了一个函数yes seq需要两个参数 一个模式pat和数据dat 该函数以相同的顺序查找数据中是否存在模式 例如 dat lt letters 1 10 dat 1 a b c d e f g h i j pat lt c a c g
  • 按组复制数据框

    我有以下数据框 df structure list Group c 1 1 1 1 2 2 2 2 2 2 3 3 3 index c 1 2 3 4 1 2 3 4 5 6 1 2 3 row names c NA 13L class c
  • 如何创建 highcharter 事件函数以在 Shiny R 中创建“下拉函数”

    我正在建造一个shiny应用程序 我想要完成的事情之一是创建一个下拉菜单 我想将劳动力变量绘制为不同级别的年份变量的函数 请参阅下面的示例数据框 year level 2 level 3 labour 1 2013 10 101 1 2 2
  • R 无法回忆起内存中的对象

    我正在构建一个包含多个步骤的函数 其中每个步骤都会创建一个对象 某个步骤失败 temp3 并且无法找到前面的步骤对象 错误 未找到对象 temp2 我不知道为什么 我有类似的函数 遵循完全相同的结构 每个步骤都遵循先前创建的对象 在函数内
  • 基本 dyplr 函数给出错误:“check_dots_used”

    试图找出为什么我会收到此错误 以前从未见过 谷歌没有帮助 check dots used action warn 中的错误 未使用参数 action warn 我在下面的非常基本的试验中收到错误 而且在 group by count 中也收
  • R 3.5 - read.csv 无法读取 UTF-16 csv 文件

    我的代码如下 read csv http asic gov au Reports YTD 2018 RR20180420 001 SSDailyYTD csv skip 1 fileEncoding UTF 16 sep t header
  • 使用矢量相应地更改传单线条的颜色

    无论如何 是否可以根据某些变量的值更改传单线条的颜色 我用谷歌搜索 发现了这个link http hgoebl github io Leaflet MultiOptionsPolyline demo 然而 我想知道是否有一种简单的方法可以在
  • 使用 data.table 左连接

    假设我有两个数据表 s dataA A B 1 1 12 2 2 13 3 3 14 4 4 15 dataB A B 1 2 13 2 3 14 我有以下代码 merge test merge dataA dataB by A all d
  • SparkR 和 Sparklyr 之间导入 parquet 文件所需的时间差异

    我正在使用 databricks 导入镶木地板文件SparkR and sparklyr data1 SparkR read df dbfs data202007 source parquet header TRUE inferSchema
  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 如何编写固定宽度的文件?

    我应该编写一个基于固定宽度列的特定格式的 txt 文件 例如 第 1 8 列中的第一个变量 第 9 15 列中的第二个变量 原始数据有不同的长度 它们必须放在指定列的右侧 例如 值 15 96 和 12 489 必须写入第一行和第二行的第1
  • 为特定 ID 重新编码列中的观察结果

    我有一个数据集 称为 调查 其中有行是个人 ID 列中有许多问题 我需要将 1 列中的值重新编码为 NA 并将观察结果移至另一列 例如 ID Fruit Vegetable aaa NA grape bbb NA tomato ccc ap
  • GLMER 警告:方差-协方差矩阵 [...] 不是正定的或包含 NA 值

    我有时发现我的 GLMM 来自glmer 包裹lme4 当调用其摘要时显示以下警告消息 Warning messages 1 In vcov merMod object use hessian use hessian variance co
  • k折交叉验证 - 如何自动获得预测?

    这可能是一个愚蠢的问题 但我只是找不到一个包来做到这一点 我知道我可以编写一些代码来获得我想要的东西 但如果有一个函数可以自动完成它那就太好了 所以基本上我想对 glm 模型进行 k 倍交叉验证 我想自动获取每个验证集的预测和实际值 因此
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 使用 glmnet 纠正 n 个数据集上的 n 个 LASSO 回归的输出(严格来说是所选的特征/变量)

    注意 这是对上一个问题 https stackoverflow com questions 75006466 how to replicate my results from running n lassos iteratively usi
  • R:使用数据框 A 中某个日期之前的值填充数据框 B 中的行

    这可能非常复杂 我怀疑需要先进的知识 我现在有两种不同类型的 data frames 我需要组合 数据 数据框A 按患者 ID 列出所有输血日期 每次输血均由单独的行表示 患者可以进行多次输血 不同的患者可以在同一天进行输血 Patient
  • R ggplot:加权 CDF

    我想使用绘制加权 CDFggplot 一些旧的非 SO 讨论 例如this https stat ethz ch pipermail r help 2012 October 337288 html从 2012 年起 建议这是不可能的 但我想

随机推荐

  • 隐藏多个div,默认显示1,并根据链接点击在它们之间切换(显示/隐藏)?

    我知道显示 隐藏的事情已经在堆栈上被覆盖得很厉害 但我只是找不到适合我的解决方案 抱歉 我已经尝试了几种我发现的 JS jQuery 解决方案 但无法完全让其中一个按照我想要的方式运行 我有许多内容非常相似的 div 内容根据所选版本略有变
  • Android GCM 服务器已发送但 GCM 未推送到设备

    我正在手机上测试 GCM 2 3 6 安卓 清单文件 MainActivity First 和 Second 活动不执行任何操作 它们用于其他测试目的 不会干扰 GCM
  • 无法使用 Netlify 和 Heroku 跨域设置/接收 cookie

    我遇到了无法在浏览器中设置 cookie 的问题 因为客户端托管在 Netlify 上 服务器托管在 Heroku 上 它在本地主机上运行良好 所以看起来它现在与跨域有关 阅读了多篇关于此的文章后 似乎这可能与 cors 或我如何设置 co
  • 矩阵的某些值没有出现在 Matplotlib 的图中

    我从 CSV 创建了一个空参考矩阵 将 x y 定位为矩阵上的一个位置 并将其打印出来 并将 100 指定为矩阵上的该位置 每个 x 都是 ref mass pandas 系列中的值 ref df pd read csv ref file
  • 更改 JTable 中单元格的颜色

    我想更改 JTable 中单元格的颜色 我编写了自己的类来扩展 DefaultTableCellRenderer 然而 我的班级确实有不一致的行为 它所做的只是 如果某个条目在一列中出现两次 则会将其标记为红色 这是我得到的结果 请注意 在
  • IIS 6/7 是否会在提供图像文件时锁定图像文件?

    我正在编写一段 NET 代码 需要覆盖 IIS 6 或 7 上托管的网站中的图像文件 唯一应该接触图像的进程是 IIS 和我覆盖图像的进程 我想知道 IIS 是否会锁定文件 导致我的覆盖代码抛出异常 简短的答案是尝试打开文件 如果失败 请等
  • Rotativa Pdf 生成不考虑 HTML 字符间距

    我正在使用 Rotativa 将 MVC HTML 转换为 Pdf 在 HTML 中 一切看起来都很好 但在 Pdf 格式中 字符间距的格式不太好 因为它太小了 这大大降低了文档的可读性 下图中是 HTML 中的字符串 这是使用 Rotat
  • EC2 密钥对更改

    我看到了几个有关更改正在运行的实例的 EC2 密钥对的问题和答案 然而 我现在是一个完全的 AWS 新手 我可以轻松停止正在运行的实例并重新启动它 在我们的情况下这不是问题 是否可以停止正在运行的 EC2 实例并以某种方式更改密钥对 然后在
  • 如何在Javascript中检查点是否在多边形中

    我遇到了这段 C 代码 我认为 这应该是检查一个点是否在concave or convex多边形 我想将其转换为 JS 等效函数以在我的 JS 程序中使用 int pnpoly int nvert float vertx float ver
  • 处理 Promise 内错误的正确方法

    目前 我正在尝试决定在处理 Promise 内的错误时应该使用哪种模式 例如 我有下面的代码 promiseFunc then result gt console info THEN result catch error gt consol
  • 将文本围绕 ImageSpan 中心垂直对齐

    我有一个ImageSpan一段文字里面 我注意到周围的文本总是绘制在文本行的底部 更准确地说 文本行的大小随着图像的增长而增长 但文本的基线不会向上移动 当图像明显大于文本大小时 效果就相当难看 Here is a sample the o
  • exe 中的 DllMain?

    是否可以在不使用任何额外的 dll 的情况下接收 DllMain 之类的关于独立 exe 中线程附加 分离的通知 Edit 这只是一个理论问题 与我正在进行的一些测试有关 不是现实生活中的情况 没有在线程上运行并加载可执行文件的外部代码 因
  • 在 Xcode 中从 Cern 设置 ROOT,正确链接库

    我想在 Xcode IDE 中从 CERN 设置 ROOT 但链接库时遇到问题 我使用 root 6 04 14 和 xcode 7 3 我创建了一个模拟项目 其中只有一个 cpp 其中包含根目录中的基本类 include TFile h
  • Erlang中如何进行日期格式之间的转换?

    我有一个函数 名为test 返回一个日期 我给你举一个这种回报的例子 2012 年 6 月 1 日 现在我想以这种形式将此日期设为月 年 所以 01 June 2012 应该变成 06 2012 因为我想用这个日期发送短信 send To
  • Java 8 lambda 表达式和一流值

    Java 8 闭包真的是一流的值还是它们只是语法糖 我想说 Java 8 闭包 Lambdas 既不是单纯的语法糖 也不是一流的值 我已经在一篇文章中解决了语法糖的问题answer另一个 StackExchange 问题 至于 lambda
  • GO结构定义中的字符串文字[重复]

    这个问题在这里已经有答案了 在这个结构体定义中 type API struct Message string json message 该字符串的含义是什么 json 消息 以及如何访问它 如果可以访问 先感谢您 这些是结构标签 该结构标记
  • 更改 foreach 内的集合

    这是我的代码 foreach OrderItem item in OrderInfo order orderItemViews Single i gt i numericUpDown Name item id ToString numeri
  • Excel VBA - 合并一个单元格中具有重复值的行并合并其他单元格中的值

    我试图在一列中查找重复值并将第二列的值合并到一行中 我还想对第三列中的值求和 例如 A B C D h 4 w 3 h 4 u 5 h 4 g 7 h 4 f 4 k 9 t 6 k 9 o 6 k 9 p 9 k 9 j 1 会成为 A
  • 如何打印列表更加美观?

    这类似于如何在 Python 中 漂亮地 打印列表 但我想更好地打印列表 没有括号 撇号和逗号 甚至在列中更好 foolist exiv2 devel mingw libs tcltk demos fcgi netcdf pdcurses
  • 使用 sf 围绕点(质心)创建网格

    我有 EURO CORDEX 气候数据 该数据位于 11 度旋转的极网格上 我通过将投影转换为 WGS84 来预先准备好这些数据 数据以点的形式出现 代表方形网格的质心 我需要创建围绕这些点的方形网格 我已经导出了实现此目的的通用方法 但网