设置 CRS 以使用雄蕊图进行绘图

2024-04-20

我试图在地图上绘制一个简单的多边形来表示我感兴趣的区域。迄今为止,我已将多边形定义为并且能够单独绘制它。

poly <- st_polygon(list(as.matrix(data.frame(lat = c(40, 40, 60, 60, 40),
                                             lon = c(-60, -40, -40, -60, -60))))) #EDIT: these are lat/lon coordinates
ggplot() + 
    geom_sf(data = poly,
    aes(geometry = geometry),
    col = "red)

但是,我需要添加底图,以便可以显示该多边形相对于其他空间元素的位置。

# Attempt #1: stamenmaps basemap

    grid_box <- c(left   = -70, 
                  right  = -30,
                  bottom = 35,
                  top    = 70)
    base <- get_stamenmap(grid_box, zoom = 6, maptype = "terrain-background", color = "color")
    ggmap(base) +
      geom_sf(data = poly, 
              aes(geometry = geometry),
              col = "red")

    Coordinate system already present. Adding new coordinate system, which will replace the existing one.
    Error in `geom_sf()`:
    ! Problem while computing aesthetics.
    ℹ Error occurred in the 4th layer.
    Caused by error in `FUN()`:
    ! object 'lon' not found
    Run `rlang::last_error()` to see where the error occurred.

我发现向多边形添加 crs 的唯一方法如下(st_transform 和 st_as_sf 不起作用),但这极大地改变了坐标的比例,并且仍然无法绘制。

 # Attempt #2: new CRS

    poly <- st_polygon(list(as.matrix(data.frame(lon = c(-62, -43, -43, -62, -62),
                                                     lat = c(43, 43, 70, 70, 43))))) %>%
            st_sfc(crs = 3857)
    ggmap(base) +
      geom_sf(data = poly, 
              aes(geometry = geometry),
              col = "red")

Coordinate system already present. Adding new coordinate system, which will replace the existing one.
Error in `geom_sf()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 4th layer.
Caused by error in `FUN()`:
! object 'lon' not found
Run `rlang::last_error()` to see where the error occurred.

How can I get this polygon to plot over my basemaps?

我相信你走在正确的道路上sf::st_sfc()请再次尝试。为了让它发挥作用,你必须想一下你的坐标意味着什么?

In 每股收益:3857 https://epsg.io/3857坐标以米为单位定义。这似乎不是您名为 lat & long 的原始列的情况,它们通常代表纬度和经度(以度为单位)。

如果您的坐标以度为单位(这似乎很可能,尽管我在您的问题中找不到明确说明),那么使用 EPSG:4326 会更好。

您必须解决的一个技巧是 ggmap 被标记为 EPSG:4326(未投影度),但实际上是在 EPSG:3857(墨卡托投影米)中绘制的,这里描述了一种可能的方法如何将 geom_sf 生成的地图放在 ggmap 生成的栅格之上 https://stackoverflow.com/questions/47749078/how-to-put-a-geom-sf-produced-map-on-top-of-a-ggmap-produced-raster

基于所链接的问题,我提出以下建议:

library(sf)
library(ggmap)

poly <- st_polygon(list(as.matrix(data.frame(lon = c(-62, -43, -43, -62, -62),
                                             lat = c(43, 43, 70, 70, 43))))) %>%
  st_sfc(crs = 4326) 

grid_box <- c(left   = -70, 
              right  = -30,
              bottom = 35,
              top    = 70)

base <- get_stamenmap(grid_box, zoom = 5, 
                      maptype = "terrain-background", 
                      color = "color")

ggmap_bbox <- function(map) {
  if (!inherits(map, "ggmap")) stop("map must be a ggmap object")
  # Extract the bounding box (in lat/lon) from the ggmap to a numeric vector, 
  # and set the names to what sf::st_bbox expects:
  map_bbox <- setNames(unlist(attr(map, "bb")), 
                       c("ymin", "xmin", "ymax", "xmax"))
  
  # Coonvert the bbox to an sf polygon, transform it to 3857, 
  # and convert back to a bbox (convoluted, but it works)
  bbox_3857 <- st_bbox(st_transform(st_as_sfc(st_bbox(map_bbox, crs = 4326)), 3857))
  
  # Overwrite the bbox of the ggmap object with the transformed coordinates 
  attr(map, "bb")$ll.lat <- bbox_3857["ymin"]
  attr(map, "bb")$ll.lon <- bbox_3857["xmin"]
  attr(map, "bb")$ur.lat <- bbox_3857["ymax"]
  attr(map, "bb")$ur.lon <- bbox_3857["xmax"]
  map
}

# Use the function:
base <- ggmap_bbox(base)

ggmap(base) +
  coord_sf(crs = st_crs(3857)) +
  geom_sf(data = st_transform(poly, 3857), 
          col = "red", fill = NA,
          inherit.aes = F) +
  theme(axis.title = element_blank())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置 CRS 以使用雄蕊图进行绘图 的相关文章

  • 将值添加到 rCharts hPlot 工具提示

    我想通过 rCharts 向标准 Highcharts 工具提示添加一些额外的值 示例代码 require rCharts df lt data frame x c 1 5 y c 5 1 z c A B C D E name c K L
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • 更改列的顺序

    我正在处理一个包含 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
  • 从 data.frame 创建新列

    我有一个长格式的数据集 其中测量 时间 嵌套在 Networkpartners NP 中 而 Networkpartners NP 又嵌套在人员 ID 中 下面是它的示例 真实数据集有数千行 ID NP Time Outcome 1 11
  • 在 r 中的 unique() 函数中使用管道不起作用

    我在使用管道运算符 gt 和 unique 函数时遇到一些麻烦 df data frame a c 1 2 3 1 b a unique df a no problem here df gt unique a not working her
  • 使用 Rcpp 得出斐波那契数列的意外结果

    我刚刚开始使用Rcpp很抱歉 如果我错过了一个简单的步骤或类似的东西 我已经尝试过这个 sourceCpp library Rcpp sourceCpp code include
  • 使用列表中的数据框:删除变量,添加新变量

    定义一个列表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
  • 在R中绘制3x3方形网格

    我得到了一个数字列表 n 9 想将它们画在一个 3 3 的正方形网格中 每个网格填充相应的数字 我如何在 R 中执行此操作而不安装额外的软件包 例如情节 非常感谢 这里有一个ggplot解决方案比我预期的要难一点 Setup the dat
  • geom_密度匹配geom_histogram binwitdh

    我想在 ggplot2 中的分布条形图上添加一条线以显示平均分布 但遇到了麻烦 像这样的 ggplot 调用 ggplot x aes date received geom histogram aes y count binwidth 30
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • R 的 dplyr 切片中的奇怪行为

    打电话时slice df i 在 R 的 dplyr 包中 如果我要求的行索引不存在 nrows lt i 它似乎返回除组中的第一行之外的所有行 就像我调用的那样slice df 1 例如 library dplyr c1 lt c a b
  • R:邻接表到邻接矩阵

    Bonjour 我想将邻接列表 3 列 转换为邻接矩阵 在这个论坛中 我找到了多个有关如何将边列表转换为邻接矩阵的示例 我成功地为两列列表做到了这一点 我已经尝试了在网上可以找到的所有解决方案 但似乎我错过了一小步 我尝试过的 我的变量是用
  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • 我可以在 R 中并行读取 1 个大 CSV 文件吗? [复制]

    这个问题在这里已经有答案了 我有一个很大的 csv 文件 需要很长时间才能阅读 我可以使用 parallel 或相关的包在 R 中并行读取此内容吗 我尝试过使用 mclapply 但它不起作用 根据OP的评论 fread来自data tab
  • 用闪亮的 R 设计 DT 中的展开行按钮

    我正在尝试设计 DT 中可用的展开行按钮的样式 样式可用here https datatables net examples api row details html 我用于创建数据表的代码是 library DT datatable cb
  • R 中的 Mapdeck 包 - add_grid 似乎未渲染任何内容

    Problem The add gridR 中的函数mapdeck包很精彩 然而 遵循CRAN 文档 https cran r project org web packages mapdeck mapdeck pdf 我似乎无法获得任何数据
  • 如何在折线图中显示 Sep-12 格式的数据并抑制网格线和灰色背景?

    我正在努力使日期格式正确 数据已经是melt 格式 数据中有四个变量碰巧共享相同的数据 我只是想绘制一个简单的四线折线图 每个变量作为一条单独的线 并将 Sep 12 显示为最新数据点 我正在使用旧的 ggplot 请随意 我有两个问题 第
  • dplyr 总结小计

    Excel 中数据透视表的一大优点是它们会自动提供小计 首先 我想知道 dplyr 中是否已经创建了任何可以实现此目的的东西 如果没有 实现它的最简单方法是什么 在下面的示例中 我按气缸和化油器的数量显示了平均排量 对于每组气缸 4 6 8
  • 删除绘图轴值

    我只是想知道是否有一种方法可以消除 r 图中的轴值 分别是 x 轴或 y 轴 我知道axes false将摆脱整个轴 但我只想摆脱编号 删除 x 轴或 y 轴上的编号 plot 1 10 xaxt n plot 1 10 yaxt n 如果
  • linux下无法安装Cairo包

    我在本地下载该软件包并尝试安装它 但出现此错误 R CMD INSTALL l usr local lib64 R library Cairo 1 5 1 tar gz 我得到他的错误 checking for PNG support in

随机推荐

  • 沟通差距:用户与分析师-设计师

    通常的做法是使用案例研究 构建工作流和数据流等 但这并不一定会在用户 发起者和分析师 设计者之间创建共享词汇表 通常 其中一方都必须获得其他专业领域 内部 的术语和观点 这通常会导致误解和澄清会议 进入 RAD 技术 如进化原型 等 用户
  • 在Java中声明布尔变量的正确方法是什么?

    我刚刚开始学习Java 在我关注的在线课程中 我被要求尝试以下代码 String email1 email protected cdn cgi l email protection String email2 email protected
  • Sklearn LogisticRegressionCV 的类似数组的输入

    最初 我从a读取数据 csv文件 但在这里我从列表构建数据框 以便可以重现问题 目的是使用交叉验证来训练逻辑回归模型LogisticRegressionCV indeps M F M F M M F M M F F F F F M F F
  • 使用 Numpy for Python 创建 cx_Freeze exe

    我正在尝试使用 cx Freeze 创建一个基本的 exe 它适用于没有 numpy 的 py 程序 但我无法使用 numpy 正确制作一个程序 有想法该怎么解决这个吗 我需要在 setup py 中包含一些内容吗 当我去运行 exe 时
  • 更改传单归属控制位置

    我在我的应用程序中使用 WebView 来显示传单地图 在 HTML 文件中 我有以下制作人员和链接 L tileLayer https api tiles mapbox com v4 id z x y png access token x
  • 使用 LLVM 为整个源代码生成 CFG

    LLVM 社区的任何人都知道是否有一种方法可以使用以下方法为整个输入源代码生成 CFG opt dot cfg foo ll bc 由于此函数为每个函数生成 CFG 因此函数之间的连接将被忽略 看来旧的分析工具已经贬值了 我想知道你是否找到
  • 使用 highcharts 在堆栈标签中显示特定系列值

    这是我正在处理的内容 http jsfiddle net josip0423 prJjY 171 http jsfiddle net josip0423 prJjY 171 过去几个小时我一直在努力解决这个问题 但一无所获 我对 javas
  • C# 异步操作

    实际上我很难理解 BeginInvoke 和 EndInvoke 对 class AsynchronousDemo public delegate void DemoDelegate static void Main DemoDelegat
  • glGenerateMipmap 是否在 sRGB 纹理的线性空间中执行平均?

    OpenGL 3 3 规范似乎没有要求 mipmap 生成在线性空间中完成 我能找到的只有以下内容 派生的 mipmap 数组的内部格式都与 levelbase 数组和派生数组的维度如下 第 3 8 14 节中描述的要求 的内容 派生数组是
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • 在用 Kotlin 编写的 Android 库的公共 API 中处理 R8 + JvmStatic Annotation + Lambda

    首先请注意 我并不期待why do you want to obfuscate library评论 这是我要问的一个真正的问题 我在使用 Kotlin 编写的 Android 库处理 R8 混淆时遇到了问题 我有一个公共 API 方法 其注
  • 使用 C# 不使用 xslt 将 XML 转换为 CSV

    我一直在网上搜索 我假设有人必须在我之前需要这个并且做得更好 以获取 xml 到 csv 转换器 我有一个非常标准的 xml 如下
  • IE7 大纲:0 不工作

    我知道大纲是用于可访问性的 但还有另一种方法 a outline 0 可以在 IE7 中运行的东西 也许使用 Jquery 对于 jquery 你可以尝试这样的事情 a focus function this blur 它本质上与 IE 7
  • 决定要 #include 哪些标准头文件

    假设我正在编辑一些大型 C 源文件 并且我添加了几行碰巧使用的代码auto ptr 如下例所示 include
  • c中前缀和后缀的优先级和结合性

    int main char arr geeksforgeeks char ptr arr while ptr 0 ptr printf s s arr ptr getchar return 0 while循环内的语句 ptr 我不明白的行为
  • SSE,行主要与列主要性能问题

    出于个人和娱乐目的 我正在使用 SSE 4 1 编写一个 geom 库 我花了最后 12 个小时试图理解处理行主要与列主要存储矩阵时的性能问题 我知道 Dirext OpenGL 矩阵是以行主顺序存储的 因此对我来说 将矩阵按行主顺序存储会
  • Android Http 获取会话 Cookie

    我本来不想在这里发帖 因为网上有太多信息 但我已经深入搜寻但无法弄清楚 好吧 所以我无法让它在两种情况下工作 希望这两种情况的答案是相同的 我的问题是我设置了请求标头 但它似乎没有发送它 我有一个会话 id s e32ff223fwefd3
  • 从片段访问父活动的数据

    从活动的片段访问活动的数据成员的最佳方法是什么 我知道的一些方法包括 在 Activity 将实现的 Fragment 中创建一个接口 该接口将具有访问活动数据成员的方法 直接使用片段中的 Activity getActivity getX
  • jQuery:触发器不会在使用 .load() 加载的元素上触发

    我有index php 并使用jQuery load 从load php 加载内容 当我在 index php 中的元素上触发事件时 该事件将触发 在相同的元素上 当使用 load 加载到 index php 时 事件不会触发 为什么 我做
  • 设置 CRS 以使用雄蕊图进行绘图

    我试图在地图上绘制一个简单的多边形来表示我感兴趣的区域 迄今为止 我已将多边形定义为并且能够单独绘制它 poly lt st polygon list as matrix data frame lat c 40 40 60 60 40 lo