【发布时间】:2021-12-07 17:06:03
【问题描述】:
我正在尝试创建一个在顶部绘制空间数据的地图。我正在使用 ggmap 跟踪示例,然后使用 geom_sf 添加新西兰海岸线。我有两个问题:
- map_data(nz) 的投影与 ggmap 的投影不匹配,因此海岸线未与地图对齐,即使两者都在 WGS84 经纬度。
- 当我尝试将 coord_sf(xlim, ylim) 应用于绘图时,出现 st_cast.POINT 错误:
恐怕reprex 需要一个谷歌密钥。 this post doesn't work for me中的方法
library(sf)
library(dplyr)
library(ggmap)
nz <- map_data("nz") %>%
st_as_sf(coords = c("long", "lat"), remove = FALSE, crs = st_crs(4326)) %>%
group_by(group) %>%
summarise(
region = region[1],
do_union = FALSE
) %>%
st_cast("LINESTRING") %>%
ungroup()
gkey <- readLines("sjrw_google_key.dat")
register_google(key = gkey)
basemap <- get_map(location = c(lon = 175.5, lat = -38),
zoom = 8,
maptype = 'terrain-background',
source = 'stamen')
attr(basemap, "bb")
#> ll.lat ll.lon ur.lat ur.lon
#> bottom -39.37417 173.7449 -36.604 177.2606
ggmap(basemap) +
geom_sf(data = nz, inherit.aes = FALSE) +
coord_sf(crs = st_crs(4326)) +
coord_sf(xlim = c(174.5, 176.5), ylim = c(-39.2, -36.6))
#> Coordinate system already present. Adding new coordinate system, which will replace the existing one.
# Error in st_cast.POINT(x[[1]], to, ...) :
# cannot create MULTILINESTRING from POINT
由reprex package (v2.0.1) 于 2021 年 10 月 21 日创建
【问题讨论】:
-
看起来您正在使用
st_as_sf(coords = c("long", "lat"), remove = FALSE, crs = st_crs(4326))执行坐标转换,您对CRS 4326 坐标系绝对肯定吗?这里的问题可能是稍微不同的坐标系? -
您是否 100% 确定这两个图层确实对齐?显然,理论上新西兰的海岸线应该与陆地区域的轮廓相匹配,但看起来您正在从不同的来源检索海岸线和陆地区域。如果不运行您的示例,我想知道它们是否只是不同的分辨率/质量数据,实际上无论如何都不能完全对齐(黑线在您的地图中看起来很粗糙)。也许您可以分享一个指向您正在使用的示例的链接?
-
谢谢。一切都在 reprex 中。
-
根据警告消息,我会尝试将两条
coord_sf()行合并为开始 - 听起来第一条无论如何都被第二条取代了。我通过“分享您的示例”在想什么 - 您所遵循的示例是否显示底图和海岸线相互匹配?你是从哪里来的例子? -
好的,那么代码是生成示例中的图像还是返回错误?如果它产生图像,那就太好了。如果您想将图像完全裁剪到您提供的限制,请将
expand = FALSE添加到coord_sf(),否则它将添加一个小缓冲区。见ggplot2.tidyverse.org/reference/ggsf.html。我不知道数据是否都需要相同的crs,但是您可以尝试在ggplot()之外设置nz的crs,然后再进行绘制?