ggplot,ggsave和coord_map / quickmap:如何保存大型空间对象并正确投影?

时间:2018-06-22 08:27:48

标签: r plot ggplot2 gis sp

我有一个稍大的折线shapefile(巴伐利亚河流,可以访问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高质量地绘制并保存这种空间数据。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

这里是sf的快速演练。我建议使用sf插图和文档,以查看任何功能的更多详细信息。我首先使用sf作为sf::st_read对象读取shapefile,然后进行过滤,变异并选择与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有一些怪异,并且与其他几何体有些不同,但是它用途广泛。我相信它会包含在下一个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)

enter image description here

希望可以帮助您入门!