如何在 ggplot2 地图中绘制 geom_line 个特征?

How to plot geom_line features in ggplot2 map?

我想在包含来自南达科他州的多边形(县等)的地图中绘制河流(线)。河流数据来了,https://www.weather.gov/gis/Rivers. Use the subset of rivers data set. The county download can be obtained from here, https://www2.census.gov/geo/tiger/TIGER2020/COUNTY/.

我只想要位于南达科他州县界内的河流,所以我使用 rgeos::intersection 来执行该操作,这会生成一个大型 SpatialLines 对象,当我尝试时 ggplot2 不喜欢它用 geom_line 绘制它(我收到一条错误消息“错误:data 必须是数据框,或其他可被 fortify() 强制的对象,而不是具有 class 的 S4 对象空间线。")

这是我的代码:

library(rgdal)
library(raster)

counties <- readOGR('D:\Shapefiles\Counties\tl_2020_us_county.shp')
counties <- counties[which(counties$STATEFP == '46'),]
counties <- spTransform(counties, CRS("+init=epsg:3395"))

rivers <- readOGR('D:\Shapefiles\Main_Rivers\rs16my07.shp')
proj4string(rivers) <- CRS("+proj=longlat")
rivers <- spTransform(rivers, CRS("+init=epsg:3395"))
rivers <- as.SpatialLines.SLDF(rgeos::gIntersection(counties, rivers)) 

栅格包的“相交”功能不适用于相交。我想我需要将 SpatialLines 对象更改为 spatialLinesDataFrame 对象以使 ggplot2 绘制河流。我怎么做? as.SpatialLines.SLDF 函数没有这样做。有没有另一种方法来绘制它?我的绘图代码在这里:

ggplot() +
geom_path(counties, mapping = aes(x = long, y = lat, group = group, col = 'darkgreen')) +
geom_path(rivers, mapping = aes(x = long, y = lat, color = 'blue'))

我建议使用 sf 库处理空间数据。首先,它与 ggplot 配合得很好。此外,根据我对 R 中的 GIS 和空间数据的非常幼稚的理解,我相信这个想法是 sf 最终将取代 spSpatial* 数据格式。 sf 是我认为跨多个平台的标准格式。有关 sf.

的更多详细信息,请参阅 this link

回答您的问题 - 使用 sf 非常简单。要查找特定县内的河流,我们使用 st_intersection()gIntersectionsf 版本)。

library(sf)

# read in the rivers data
st_read(dsn = 'so_data/rs16my07', layer = 'rs16my07') %>%
  {. ->> my_rivers}

# set the CRS for the rivers data
st_crs(my_rivers) <- crs('+proj=longlat')

# transform crs
my_rivers %>% 
  st_transform('+init=epsg:3395') %>% 
  {. ->> my_rivers_trans}
  


# read in counties data
st_read(dsn = 'so_data/tl_2020_us_county') %>% 
  {. ->> my_counties}

# keep state 46
my_counties %>% 
  filter(
    STATEFP == 46
  ) %>% 
  {. ->> state_46}

# transform crs
state_46 %>% 
  st_transform('+init=epsg:3395') %>% 
  {. ->> state_46_trans}


# keep only rivers inside state 46
my_rivers_trans %>% 
  st_intersection(state_46_trans) %>% 
  {. ->> my_rivers_46}

然后我们可以使用 ggplotgeom_sf() 绘制 sf 对象,就像您使用 geom_line() 等绘制线条一样。geom_sf() 似乎知道您绘制的是点数据、线数据还是多边形数据,并相应地绘制。使用起来相当简单。

# plot it
state_46_trans %>% 
  ggplot()+
  geom_sf()+
  geom_sf(data = my_rivers_46, colour = 'red')

希望这看起来是对的 - 我不知道我所在的美国各州,所以不知道这是不是南达科他州。