如何使用 sf 按因子构建/绘制多边形的凸包?

2023-11-23

我有一个物种出现的数据集,我试图通过制作凸包将其转换为出现的区域。我可以手动执行此操作(即一次一个物种),但我真的很希望能够通过物种名称自动处理它。

可以在此处找到精简的示例数据集:https://pastebin.com/dWxEvyUB

这是我目前手动执行的方法:

library(tidyverse)
library(sf)
library(rgeos)
library(maps)
library(mapview)
library(mapdata)
library(ggplot2)


fd <- read_csv("occurrence.csv")

spA.dist <- fd %>%
  filter(species == "sp.A") %>%
  dplyr::select(lon,lat) %>%
  as.matrix() %>%
  coords2Polygons(ID="distribution") %>%
  gConvexHull() %>%
  gBuffer()

spB.dist <- fd %>%
  filter(species == "sp.B") %>%
  dplyr::select(lon,lat) %>%
  as.matrix() %>%
  coords2Polygons(ID="distribution") %>%
  gConvexHull() %>%
  gBuffer() 

wrld2 = st_as_sf(map('world2', plot=F, fill=T))
ggplot() + 
  geom_sf(data=wrld2, fill='gray20',color="lightgrey",size=0.07) +
  geom_polygon(aes(x=long,y=lat,group=group),color="red",data=spA.dist,fill=NA) +
  geom_polygon(aes(x=long,y=lat,group=group),color="blue",data=spB.dist,fill=NA) + 
  coord_sf(xlim=c(100,300), ylim=c(-60,60))

这会根据观察结果的凸包显示两个物种出现区域的地图。我意识到我在这里混合了不同的空间库,所以如果可能的话,最好在 sf 中完成这一切。在我的真实数据中,我有两个以上的物种,我可以复制并粘贴每个物种的代码,但似乎应该可以简化这一点,以便多边形(以及后续的凸包)由因子级别构建自动地。更像这样的东西:

polys <- st_as_sf(fd) %>%
  group_by(species) %>%
  magically_make_polygons(lon,lat) %>%
  st_convex_hull() %>%
  st_buffer()

我已经搜索了好几天并挖掘了大量文档。很多空间方面的东西对我来说都是不直观的,所以我希望我缺少很多基本的理解。这可以做到吗?


这是一个可能的解决方案,使用tidyverse(实际上只是dplyr)和sf- 包(和mapview包以便快速查看)。

你非常接近你自己的解决方案(工藤的)。诀窍是summarise分组数据,然后创建船体..

library( tidyverse )
library( sf )

#create simple feature
df.sf <- df %>%
  st_as_sf( coords = c( "lon", "lat" ), crs = 4326 )
#what are we working with? 
# perform fast visual check using mapview-package
mapview::mapview( df.sf )

enter image description here

#group and summarise by species, and draw hulls
hulls <- df.sf %>%
  group_by( species ) %>%
  summarise( geometry = st_combine( geometry ) ) %>%
  st_convex_hull()

#result
mapview::mapview( list( df.sf, hulls ) )

enter image description here

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

如何使用 sf 按因子构建/绘制多边形的凸包? 的相关文章

  • 使用开源闪亮服务器时,我的图标不会显示在我的应用程序的浏览器选项卡上

    我一直在尝试找到一种方法将 ico 与托管在开源闪亮服务器上的闪亮应用程序的快捷方式关联起来 最终 我希望 ico 显示为我的应用程序快捷方式的图形 而且 我希望用户在创建应用程序的快捷方式时显示 可用此图标 听起来很简单 但事实证明这是一
  • R 在读取文件时添加额外的数字

    我一直在尝试读取一个包含日期字段和数字字段的文件 我的数据在 Excel 工作表中 如下所示 Date X 1 25 2008 0 0023456 12 23 2008 0 001987 当我在 R 中使用readxl read xlsx函
  • 准备编程竞赛的缩写和函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用cowplot包的多重图的中心X轴标签

    我有一个多图图形 由 2x2 配置中的 4 个图组成 我使用 cowplot 包和plot grid函数使用下面的代码排列了绘图 plot grid p1 p2 p3 p4 align vh vjust 1 scale 1 其中 p1 p4
  • R 中的聚类分析:确定最佳聚类数

    如何选择最佳的聚类数量来进行 k 均值分析 绘制以下数据的子集后 多少个簇比较合适 如何进行聚类树突分析 n 1000 kk 10 x1 runif kk y1 runif kk z1 runif kk x4 sample x1 lengt
  • 使用 ggplot 未完全填充等值线图

    我正在尝试使用以下方法绘制我的第一个填充等高线图ggplot 根据我的数据 我期待类似的结果 但我的结果是 a lt c 1 1 1 1 1 3 1 2 2 2 2 2 2 5 2 1 3 3 3 3 1 3 2 b lt c rep c
  • 如何使用 ggplot2 绘制 NA 间隙

    在 R 的基本绘图中 如果数据系列 ggplot2 中存在 NA 则会绘制间隙 举个例子看看 df data frame x c 1 10 y c 1 10 df 5 7 NA plot df type l 但是 ggplot2 删除了缺失
  • R 中 x 轴曲线的阴影面积

    所以我有一个位于 x 轴下方和上方的图表 并且想要对线和 0 之间的区域进行着色 在这里 我尝试使用多边形函数 但它只给出曲线下的面积 plot year difference1 type l polygon year difference
  • 如何更改数据表中的少数列名称

    我有一个包含 10 列的数据表 town tc one two three four five six seven total 需要生成我正在使用的列 一 到 总计 的平均值 DTmean lt DT lapply SD mean by t
  • 如何在R中绘制仪表图表?

    如何在 R 中绘制以下图 Red 30 Yellow 40 Green 30 Needle at 52 所以这里有一个完整的ggplot解决方案 注意 从原始帖子中编辑 在仪表中断处添加数字指示器和标签 这似乎是OP在评论中所要求的 如果不
  • 为什么 data.table `:=` 的 knit 缓存失败?

    这在精神上与this https stackoverflow com q 15267018 1900520问题 但机制上一定不同 如果您尝试缓存knitr包含一个块data table 分配然后它的行为就好像该块尚未运行 并且后面的块看不到
  • 将 r 数据框中的列字符串转换为数字

    我有一个数据框 其中有一列字符串 如下所示 mydata lt c 1 356670 35 355030 1 356670 35 355030 1 356620 35 355890 1 356930 35 358660 1 357000 3
  • 带有 geom_errorbar 的position_dodge

    我有以下代码 require ggplot2 pd lt position dodge 0 3 ggplot dt aes x Time y OR colour Group geom errorbar aes ymin CI lower y
  • 合并具有一个共同元素的集合 R

    我有一个这样的列表 lista list lista 1 c 1 2 4 6 8 9 10 11 12 19 32 34 35 36 37 38 lista 2 c 7 8 lista 3 c 13 14 16 26 27 28 29 30
  • 生成因子变量水平的预测值

    我正在使用连续结果变量对多个因子变量进行回归lm 例如 fit lt lm dv factor hour factor weekday factor month factor year count data df 我想生成预测值 yhat
  • 向图像添加坐标,以用作 R 中的 Leaflet、Shiny 和 Shinydashboard 包中的地图

    我计划使用 Leaflet Shiny 和 Shinydashboard 沿着以下很棒的路线创建一个带有医院 OHS 事件标记的交互式地图交互式地图和直方图模板 http shiny rstudio com gallery superzip
  • Openxlsx 多次验证损坏输出文件

    我正在尝试添加多个验证并将公式添加到 Excel 文件 这是我使用的代码 library openxlsx fileTemplate lt New01 xlsx wbTemplate lt loadWorkbook fileTemplate
  • 无重叠的抖动点

    My data a lt sample 1 5 100 replace TRUE b lt sample 1 5 100 replace TRUE c lt sample 1 10 100 replace TRUE d lt sample
  • 字边界正则表达式问题

    我在使用单词边界时遇到问题 b在我的正则表达式中 我正在使用 R 但当我尝试时问题也存在http regexr com http regexr com 我使用的模式是 bs l b 虽然我预计下面的第 1 行和第 3 行能够匹配此模式 但只
  • 如何融合颜色和形状?

    当我有一个超过 6 个值的变量时 我的麻烦就开始了 因为这是 ggplot2 中 scale shape 函数的当前最大值 由于这个问题 我尝试使用另一个变量来解决这个问题 我只是将原始变量的长度包裹起来 这是我的示例代码 dataf lt

随机推荐

  • 如何避免 Java 游戏中的垃圾收集延迟? (最佳实践)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在为 Android 平台调整 Java 交互游戏的性能 有时 垃圾收集的绘图和交互会出现问题 通常它不到十分之一秒 但有时在非常慢的设备上可能会长达 200 毫秒 我正在使
  • 检查两个 Python 正则表达式模式是否等效

    我想写一个正则表达式re VERBOSE模式 但我不相信我会毫无错误地添加详细部分 我记得 理论上 两个正则表达式的等价性 至少没有反向引用 可以通过生成它们的自动机并尝试找到图双射来找到 但我看不到用于比较正则表达式的实例方法 有没有办法
  • 无法使用滚动条使 DIV 宽度为 100%

    我有一个带有 DIV 和 TABLE 的页面 DIV 是我的标题 即使显示水平滚动条 我也希望它的宽度为 100 由于某种原因 它只占用 100 的可见窗口 我的 HTML 代码是 div style background color ye
  • WCF、Web 服务或 ADO.NET 数据服务:我应该使用什么?

    对于一个项目 我必须在 Web 服务器上托管的数据库与互联网上的多个客户端之间实现通信 在阅读了一些内容并观看了一些有关可能的 微软 技术的介绍性视频后 我发现我似乎 至少 有三个选择 1 Windows 通信基础 WCF 2 ASP NE
  • 目标框架下拉列表为空

    我安装了 VS NET 2010 Premium 但在尝试针对现有 NET 框架时似乎出现问题 当我打开 Web 应用程序项目的属性时 我得到的唯一选项是安装框架 如果我打开任何其他项目类型的属性 我会得到完整列表 到目前为止 我已执行以下
  • LocalDateTime 和 SQL Server JDBC 4.2 驱动程序

    我正在尝试使用新的java time具有最新版本的 Sql Server JDBC 驱动程序的类 据我所知 它应该只适用于方法 PreparedStatement setObject and ResultSet getObject 所以我创
  • 如何使用 StoryBoard 在 iPad 上的 Popover 内显示 UIDatePicker?

    我已经实现了在弹出窗口中显示日期选择器 以编程方式执行此操作 如下所示UIPopover 中的 UIDatePicker 但我一直在尝试在界面生成器中执行此操作 我已经制作了一个名为 DatePickerViewController m 的
  • 在 android 中使用 handler 和 postDelayed 暂停

    我对 Android 编程很陌生 所以请原谅我的新手 我正在尝试创建一个非常简单的活动 该活动将在布局中间有一个 TextView 并且每隔几秒切换到不同的文本 例如 TextView 会说 text1 暂停几秒钟 然后说 text2 然后
  • Facebook graph api 照片上传到粉丝页面相册

    我已经获得了使用此代码的照片上传功能
  • Hadoop 作业失败,资源管理器无法识别 AttemptED

    我正在尝试在 Oozie 工作流程中聚合一些数据 但是聚合步骤失败 我在日志中发现了两个有趣的点 第一个是一个似乎重复出现的错误 容器完成后 它会被终止 但会以非零退出代码 143 退出 它完成了 2015 05 04 15 35 12 0
  • .NET - 从代码设置电源选项

    我想用 C 编写非常简单的代码 一个简单的 2 按钮应用程序 它允许我更改盖子关闭时所采取的操作 从 睡觉 到 不行动 反之亦然 我发现它以某种方式连接到 WMI 但没有关于如何实现这一点的实际信息 非常感谢您的帮助 Thanks 这是一篇
  • 正则表达式 - 前瞻断言

    我在前瞻断言 方面遇到问题 例如我有这样的表达 Win 2000 它匹配Win 如果表达式是这样的Win2000 Win2000fgF 我有下一个表达 d a z 它匹配数字和小写字母 例如 45dF 4Dd 但我不知道 为什么它有效并匹配
  • ServerManager 如何获取站点在磁盘上的物理路径?

    如何获取磁盘上站点的物理路径 using ServerManager serverManager new ServerManager var sites serverManager Sites foreach Site site in si
  • 目前最好的垃圾邮件过滤算法

    目前检测垃圾邮件的最佳方法是什么 尤其是手机短信 有资源或者比较分析吗 研究监督学习技术是件好事 多项研究表明 多项式朴素贝叶斯分类器已被用于垃圾邮件过滤 并取得了巨大成功 如果它适用于垃圾邮件过滤 那么它也应该适用于短信过滤 您需要的是一
  • Flutter - 错误:没有为该类定义 getter X

    我有课TripController包含私有字段 updatedAccount 我创建了一个吸气剂以便从外部获取 class TripController final String accountId final BuildContext c
  • 为什么“代数数据类型”在名称中使用“代数”?

    当我学习 Scala Haskell 时 我看到有一个概念代数数据类型 我已经阅读了维基百科的解释 但我仍然有一个问题 为什么它的名称中使用 代数 一词 它和 代数 有什么关系吗 简而言之 我们必须考虑代数和类型之间的关系 Haskell
  • 使用 Jest 和 @testing-library/react-native 测试 React Native 项目时出现“SyntaxError:无法在模块外部使用 import 语句”错误?

    每当我跑步时都会遇到错误npm test FAIL App test js 测试套件运行失败 Jest encountered an unexpected token This usually means that you are tryi
  • 将对象从 Activity 传递到 Fragment

    我有一个Activity它使用一个Fragment 我只是想从中传递一个对象Activity to the Fragment 我怎样才能做到呢 到目前为止我见过的所有教程都是从资源中检索数据 EDIT 让我们更精确一点 我的活动有一个Lis
  • Android Studio 3.0 beta2

    当我构建项目时 出现以下错误 错误 com android builder merge DuplicateRelativeFileException 在操作系统独立路径 META INF app debug kotlin module 中找
  • 如何使用 sf 按因子构建/绘制多边形的凸包?

    我有一个物种出现的数据集 我试图通过制作凸包将其转换为出现的区域 我可以手动执行此操作 即一次一个物种 但我真的很希望能够通过物种名称自动处理它 可以在此处找到精简的示例数据集 https pastebin com dWxEvyUB 这是我