使用 R 中的 coord_sf 显示地图轴上的度数

ber*_*roe 2 maps r ggplot2

我正在制作地图并想使用替代投影。当我使用 执行此操作时coord_sf,x 轴和 y 轴会获得一些其他单位的标签,例如 0.001\xc2\xb0W。我不是地理学家,所以我不确定这些是什么。我只想查看纬度和经度......

\n\n

生成基本地图的代码:

\n\n
mapWorld <- borders("world", colour="gray70", fill="gray70") \nggplot() + mapWorld +  coord_sf(xlim=c(-125, 155),ylim=c(-22,40), crs = "+proj=laea") \n
Run Code Online (Sandbox Code Playgroud)\n\n

结果图:

\n\n

地图投影

\n

dsh*_*kol 7

解决这里问题的最简单方法就是删除重投影。您看到有趣坐标的原因是您通过提供了不同的坐标参考系coord_sf(...)

#install.packages('maps')
mapWorld <- borders("world",colour="gray70", fill="gray70") 
ggplot() + mapWorld + coord_sf(xlim=c(-125, 155),ylim=c(-22,40))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 更复杂的答案与您是否想要使用不同的投影系统有关。您正在coord_sf(xlim=c(-125, 155),ylim=c(-22,40), crs = "+proj=laea")应用修改以geom_sf使用地图的不同投影。我认为您的代码laea是指以欧洲为中心的兰伯特方位角等面积投影,对吧?那一个的 CRS 代码为 3035

然而,您将遇到的问题是,为了应用空间投影,您需要使用空间对象,而不是地图图片。当您调用时:borders("world",colour="gray70", fill="gray70")您正在使用快速 hack 从包ggplot2中的数据中获取简单的 x 和 y 值maps。问题是,borders()当它从包中检索数据时,不会将投影作为参数maps,因此它只需要简单的 x(long) 和 y(lat) 值并将其转换为数据帧。

现在,您可以maps仅使用( 和) 包重新投影并绘制地图mapproj。如果您查看其文档,maps::map表明您可以提供projection = ...参数,但投影仅限于mapproj. 例如,您可以使用方位角等积投影:

map("world", projection = "azequalarea", xlim = c(-125,155), ylim = c(-22,40))

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 它看起来像这样,有点难看。您可以修改它的居中方式等,但它看起来仍然不太好。这并不奇怪,因为您使用的库早R 本身,来自 S 语言。

您可以使用更现代的工具来解决此问题,这些工具为您提供了更大的灵活性。geom_sfggplot 旨在处理空间对象,最好是sf格式,但很容易在不同类型的空间对象之间进行转换。这是一个如何制作您想要的地图的简单示例。

首先,让我们获取一张作为空间数据对象的世界地图

#install.packages('rnaturalearth')
#install.packages('rnaturalearthdata')
#install.packages('sf')
#install.packages('rgeos')

library(rnaturalearth)
library(rnaturalearthdata)
library(sf)

world <- ne_countries(scale = "medium", returnclass = "sf")
> world
Simple feature collection with 241 features and 63 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -180 ymin: -89.99893 xmax: 180 ymax: 83.59961
CRS:            +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
First 10 features:
Run Code Online (Sandbox Code Playgroud)

该物体附有一个投影 CRS:+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0。这本质上是处理纬度和经度时的默认投影,也是大多数人所习惯的。我们可以绘制这个:

ggplot(data = world) +
  geom_sf() + 
  xlab("Longitude") + ylab("Latitude")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 现在它是一个空间数据对象,可以轻松更改投影或根据数据中的元素对其进行自定义。例如,使用 LAEA 投影代码 (3035) 并添加颜色。对于不同的大陆:

ggplot(data = world) +
  geom_sf(aes(fill = continent)) + 
  coord_sf(crs = 3035)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 如果您仍然希望有像 之类的边界xlim=c(-125, 155),ylim=c(-22,40),则在处理其他投影时需要注意这些数字代表什么。这些数字指的是纬度/经度值,但是当我们使用其他投影时,我们必须使用这些投影所在的单位。您必须将这些限制重新投影到该特定投影使用的坐标中;但是,根据您设置的限制,我建议它们根本不适用于这种类型的投影。我建议您坚持使用纬度/经度,即CRS = 4326如果您希望地图看起来像您想要的那样。

ggplot(data = world) +
  geom_sf() + 
  xlab("Longitude") + ylab("Latitude") + coord_sf(xlim=c(-125, 155),ylim=c(-22,40))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述