如何在 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
最终将取代 sp
和 Spatial*
数据格式。 sf
是我认为跨多个平台的标准格式。有关 sf
.
的更多详细信息,请参阅 this link
回答您的问题 - 使用 sf
非常简单。要查找特定县内的河流,我们使用 st_intersection()
(gIntersection
的 sf
版本)。
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}
然后我们可以使用 ggplot
和 geom_sf()
绘制 sf
对象,就像您使用 geom_line()
等绘制线条一样。geom_sf()
似乎知道您绘制的是点数据、线数据还是多边形数据,并相应地绘制。使用起来相当简单。
# plot it
state_46_trans %>%
ggplot()+
geom_sf()+
geom_sf(data = my_rivers_46, colour = 'red')
希望这看起来是对的 - 我不知道我所在的美国各州,所以不知道这是不是南达科他州。
我想在包含来自南达科他州的多边形(县等)的地图中绘制河流(线)。河流数据来了,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
最终将取代 sp
和 Spatial*
数据格式。 sf
是我认为跨多个平台的标准格式。有关 sf
.
回答您的问题 - 使用 sf
非常简单。要查找特定县内的河流,我们使用 st_intersection()
(gIntersection
的 sf
版本)。
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}
然后我们可以使用 ggplot
和 geom_sf()
绘制 sf
对象,就像您使用 geom_line()
等绘制线条一样。geom_sf()
似乎知道您绘制的是点数据、线数据还是多边形数据,并相应地绘制。使用起来相当简单。
# plot it
state_46_trans %>%
ggplot()+
geom_sf()+
geom_sf(data = my_rivers_46, colour = 'red')
希望这看起来是对的 - 我不知道我所在的美国各州,所以不知道这是不是南达科他州。