首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ggplot,ggsave & coord_map/quickmap:如何保存大的空间对象并获得正确的投影?

ggplot,ggsave & coord_map/quickmap:如何保存大的空间对象并获得正确的投影?
EN

Stack Overflow用户
提问于 2018-06-22 16:27:48
回答 1查看 671关注 0票数 2

我有一个较大的折线形状文件(巴伐利亚河流,可以访问here),我想通过ggplot绘制和保存。例如,这可以通过以下代码轻松完成:

library(ggplot2)
library(rgdal)
library(sp)
library(rgeos)

riv <- readOGR(paste0(getwd(),"\\rivers_bavaria","rivers_bavaria"))
riv1 <- subset(riv,WDM=="1310"|WDM=="1320")
riv2 <- subset(riv,WDM=="1330")

p <- ggplot() +
  geom_line(data=riv1, aes(x=long, y=lat, group=group), color="dodgerblue", size=1) +
  geom_line(data=riv2, aes(x=long, y=lat, group=group), color="dodgerblue")

ggsave(paste0(getwd(),"\\riv.tiff",p,device="tiff",units="cm",dpi=300)

由于文件大小较大,这并不是很有效,但它是有效的。但是,在不进一步指定纵横比或投影的情况下,输出文件的尺寸由绘图窗口定义-这对于地图不可取。这可以通过使用coord_quickmap()来解决。

p1 <- ggplot() +
  geom_line(data=riv1, aes(x=long, y=lat, group=group), color="dodgerblue", size=1) +
  geom_line(data=riv2, aes(x=long, y=lat, group=group), color="dodgerblue") +
  coord_quickmap()
p1

不幸的是,投影完全关闭了。我已经尝试过coord_map()以获得更好的结果,但由于文件太大,它永远需要花费时间,因此不是一个现实的选择。通过gLinemerge()简化多段线会生成一个小得多的对象,但由于它是一个SpatialLines对象,因此无法由ggplot处理。使用fortify()data.frame()将其强制转换为ggplot友好的数据帧格式也会产生Error: ggplot2 doesn't know how to deal with data of class SpatialLines

因此,我正在拼命寻找一种工作流程,它可以让我用ggplot来绘制和保存这种高质量的空间数据。如有任何建议,我们将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-25 00:56:28

下面是sf的快速演练。我推荐使用sf的小插曲和文档来查看任何函数的更多细节。我首先使用sf::st_read将shapefile作为sf对象读取,然后进行过滤、变异,并选择与在dplyr中相同的方法,以获得较小版本的形状。

library(tidyverse)
library(sf)

rivers_sf <- st_read("rivers_bavaria/rivers_bavaria.shp") %>%
  filter(WDM %in% c("1310", "1320", "1330")) %>%
  mutate(name2 = ifelse(WDM == "1330", "river 2", "river 1")) %>%
  select(name2, NAM, geometry)

这个对象很大,绘制起来会很慢,所以我简化了它,通过名称统一几何图形,然后使用st_simplify。还有rmapshaper::ms_simplify,它使用Mapshaper,我更喜欢它,它可以更好地控制你保存的信息量。然后,为了展示CRS转换,我从Spatial Reference为德国选择了一个投影。

riv_simple <- rivers_sf %>%
  group_by(name2, NAM) %>%
  summarise(geometry = st_union(geometry)) %>%
  ungroup() %>%
  st_simplify(preserveTopology = T, dTolerance = 1e6) %>%
  st_transform(31493)

GitHub上的ggplot2的开发版本有一个函数geom_sf,用于打印不同类型的sf对象。要获取此版本,请运行devtools::install_github("tidyverse/ggplot2")

geom_sf有一些怪癖,它的工作方式与其他geoms略有不同,但它的用途相当广泛。我相信它会包含在下一个CRAN版本中。geom_sf有对应的stat_sfcoord_sf。默认情况下,它会绘制网格线;要关闭网格线,请添加coord_sf(ndiscr = F)

ggplot(riv_simple) +
  geom_sf(aes(size = name2), color = "dodgerblue", show.legend = "line") +
  scale_size_manual(values = c("river 1" = 1, "river 2" = 0.5)) +
  theme_minimal() +
  coord_sf(ndiscr = F)

希望这能帮助你入门!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50983783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档