使用sf和ggplot2放大地图

4月30日,二千零一十九
通过

(本文首次发表于 188bet appR-Bloggers–WZB数据科学博客,并对 188bet appR博主

在R中处理地理空间数据时,我通常用SF用于操作空间数据的包简单功能对象GGPROTT2吉姆斯夫用于可视化这些数据。经常出现的一件事是“放大”某个感兴趣的区域,即显示特定的地图细节。有几种方法可以做到这一点。三个常见选项是:

  • 仅从空间数据集中选择某些感兴趣的区域(例如仅限于某些国家/大陆等)
  • 在空间数据集中使用SF~()
  • 通过限制显示窗口COODENSF()

我将展示这些选项的优点和缺点,特别关注如何在特定的“缩放级别”放大某个感兴趣的点。我们将看到如何计算这个缩放点周围显示窗口或“边界框”的坐标。

加载所需的库和数据

我们需要加载以下包:

图书馆(ggplot2)图书馆(sf)图书馆(rnaturalearth)

使用NEI国家()从包中世界地图,我们可以得到一个与世界各国边界有关的空间数据集。我们通过指定返回class='sf'.结果是一个空间数据集,可以使用SF包中的工具进行处理。

Worldmap<-ne_国家(scale='medium',type='地图单位',returnClass='sf')仅查看这两列head(worldmap[c('name',“大陆”)
简单功能集合,具有6个功能和2个字段地理测量类型:多功能维度:xybbox:xmin:-180 ymin:-18.28799 xmax:180 ymax:83.23324epsg(srid):4326proj4字符串:+proj=longlat+datum=wgs84+无定义大陆几何0斐济-大洋洲多功能多边形(((180-16.067…1坦桑尼亚-非洲多功能多边形(((33.90371-0…2 W)。撒哈拉非洲多聚物((-8.66559 27…3加拿大北美多聚物((-122.84 49,…4美利坚合众国北美多聚物((-122.84 49,…5哈萨克斯坦亚洲多聚物(((87.35997 49…

我们看到我们有一个由几个属性组成的空间数据集(仅名称大陆如上图所示),对于存储在几何学列。表格上方的标题显示更多信息,如坐标参考系(CRS)这在以后会很重要。现在,重要的是要知道图中的坐标是经度/纬度坐标(度)在一个叫做CRSWGS84.经度从子午线以西180度到子午线以东180度。纬度从赤道以南-90°(90°)到赤道以北+90°(90°)。

让我们绘制这些数据以确认我们拥有什么:

ggplot()+geom_sf(data=worldmap)+theme_bw()。

世界地图

从空间数据集中选择某些感兴趣的区域

这是非常直接的:我们可以绘制一个更大的空间数据集的子集,然后ggplot2自动相应地设置显示窗口,这样它只包含选定的几何图形。我们只选择和绘制法国:

法国<-worldmap[worldmap$name='france',]ggplot()+geom_sf(data=france)+theme_bw())

法国

让我们尝试选择和绘制来自欧洲的所有国家:

欧洲<-worldmap[worldmap$洲='europe',]ggplot()+geom_sf(data=europe)+theme_bw())

欧洲

好,当你想绘制一幅欧洲版图时,这可能不是你想要显示的部分。它包括整个俄罗斯大陆属性设置为“欧洲”)这使得这片土地横跨了整个北半球。同时,附近国家如土耳其或北非国家失踪,您可能希望包括它来显示您感兴趣区域的“上下文”。

在空间数据集中裁剪几何图形或限制显示窗口

要解决这个问题,您可以在空间数据集中裁剪几何图形,就好像您拿着一把刀,将地图上的形状切成一片,以取出感兴趣的矩形区域。另一种方法是限制绘图的显示窗口,这就像拿着地图折叠起来,你只看到感兴趣的区域。地图的其余部分仍然存在,你就是看不到。

所以这两种方法都很相似,只有第一个通过切割几何图形实际更改数据,而后者只“缩放”到细节,但保持底层数据不变。

我们先试试裁剪法,这可以用SF~().它通过传递空间数据集(整个世界地图在我们的例子中是dataset),并指定要剪切的矩形区域。我们的坐标是以度为单位的经度/纬度。如前所述。我们设置了最小经度(即作物区的左边界)asXmin最大经度(即右边框)asXMAX.最小/最大纬度(即下边框和上边框)类似地设置为伊敏YMAX.对于欧洲的一个种植区,我们可以将经度范围设置为[-20,45]纬度范围在[30,73):

欧洲种植的作物Xmin=- 20,XMAX=45,YMIN=30,ymax=73)ggplot()+geom_sf(data=europe_cropped)+theme_bw()。

欧洲裁剪

当您查看绘图页边距附近的间隙时,可以看到形状实际上是在指定范围内裁剪的。如果你想消除这些差距,您可以添加+coord_sf(expand=false)对情节。

我们还可以看到,当我们将形状投影到不同的CRS时,我们现在已经裁剪了形状。我们可以看到,在ggplot2使用的默认投影中,经度和纬度网格,这叫做划线,由垂直线(显示为浅灰色线)组成。当我们使用莫氏投影,这是一个“伪圆柱”投影,我们看到了被裁剪的形状是如何沿着子午线弯曲的,它不会在这个投影中平行运行,而是会聚到本初子午线的极端:

欧洲种植在莫维德投影

将显示窗口限制为绘图,结果非常相似,只是我们不需要修改空间数据集。我们可以使用COODENSF()指定经度范围(XLIM最小和最大)和纬度的矢量(伊林矢量)显示,就像我们做的那样STROCROP()

ggplot()+geom_sf(data=worldmap)+coord_sf(xlim=c(-20,45)yLIM=C(30),73)expand=false)+主题

限制显示窗口时的欧洲

你看结果很相似,但我们使用整个世界地图不裁剪数据集。注意我用过展开=假这将删除显示窗口边界周围的填充(这是在之前的绘图页边距处产生“间隙”的原因)。

现在,如果我们想再次使用莫氏投影作为这一部分的目标投影呢?让我们试试:

ggplot()+geom_sf(data=worldmap)+coord_sf(crs=st_crs('+proj=moll'),XLIM=C(- 20),45)yLIM=C(30),73)expand=false)+主题

更改投影时失败

这里发生了什么?问题是我们指定了XLIM伊林作为WGS84坐标(经度/纬度,单位:度),但科尔德斯夫需要这些坐标与目标投影在同一个CRS中,这就是我们例子中的莫氏投影。莫维德以米为单位,所以我们实际上在X轴上指定了-20米到45米的范围,在Y轴上指定了30米到73米的范围,在投影中心附近有一个很小的光斑。

为了解决这个问题,我们需要先将显示窗口的坐标转换为目标CRS。第一,让我们直观地了解一下我们想要做什么:

莫维德投影中的欧洲展示窗概述

我们看到的是整体世界地图数据集投影到我们的目标CRS(标准莫氏投影)。有两点,a=(-20°)30°)和b=(45°,73°)定义了我们的显示窗口,用红线突出显示。显示窗口为梯形,因为由经度/纬度坐标定义的最初矩形显示窗口沿子午线弯曲,就像我们以前的欧洲五花八门一样。当你看到这些轴时,您将看到这里不再显示学位。相反,分划显示目标CRS,它有单位米(这就是为什么轴上的数字如此之大)。显示窗口A和B的角点必须转换为该CRS,同样,我们可以这样做:

起初,我们设定了目标CRS,并将整个世界地图数据集到该CRS。

目标crs<-'+proj=moll'worldmap_trans<-st_transform(worldmap,CRS=目标

下一步,我们将wgs84坐标中的显示窗口指定为经度/纬度。我们只指定左下角和右上角(点A和B)。通过使用EPSG代码4236.

Disp-Win_wgs84<-St_sfc(St_Point(C(-20,30)StPooPoT(C(45)73)CRS=4326)显示
为2个功能设置的几何图形几何类型:点尺寸:xybbox:xmin:-20 ymin:30 xmax:45 ymax:73epsg(srid):4326proj4字符串:+proj=longlat+datum=wgs84+无定义点(-20 30)点(45 73)

这些坐标可以通过STTH变换.

Disp Win_Trans<-ST_Transform(Disp Win_wgs84,crs=目标值
为2个功能设置的几何图形几何类型:点尺寸:xybbox:xmin:-1833617 ymin:3643854 xmax:2065900 ymax:8018072epsg(srid):naproj4字符串:+proj=moll+lon_0=0+x_0=0+y_0=0+ellps=wgs84+units=m+无定义点(-1833617 3643854)点(2065900 8018072)

我们可以从这些点中提取坐标,并将它们分别作为x和y比例的限制值传递。还要注意我设置了基准面=目标这样可以确保分划显示在目标CRS中。否则,ggplot2默认显示wgs84分划。

disp-win-coord<-st-u坐标(disp-win-trans)ggplot()+geom-sf(data=worldmap-trans)+coord-sf(xlim=disp-win-coord[,'x']ylm=显示坐标[,'y']基准面=目标expand=false)+主题

莫威德投影中的欧洲展示窗

这个作品,但是如果你仔细看,您会注意到显示窗口与之前在wgs84坐标(红色梯形)中指定的窗口略有不同。例如,土耳其完全不见了。这是因为坐标描述了莫氏投影中A和B之间的矩形。而不是原始投影的红色梯形。

计算给定中心点和缩放级别的显示窗口

不是指定感兴趣的矩形区域,我发现设置一个感兴趣的中心点并指定一个“缩放级别”更为舒适,它指定了该点周围应该显示多少区域。

我专注于如何为OpenStreetmap定义缩放级别:零度表示整个世界。1级表示世界地图的四分之一。两级显示世界地图的1/16,以此类推。放大到19级。所以如果Z是缩放级别,我们看到一个地区1/4 ^ z世界上。这意味着在经度轴上显示的范围是360°/2 ^ z(因为经度从-180°到+180°横跨全水平圆),纬度轴上的范围是180°/2 ^ z(纬度从-90°到+90°跨越半个垂直圆)。

我们设一个中心点ZooMyto,一动物层次计算经度和纬度的范围(隆纳斯潘拉斯潘

缩放至<-c(13.38,52.52)Berlinzoom_level<-3lon_span<-360/2 ^ zoom_levelat_span<-180/2 ^ zoom_level

现在,我们可以通过分别从缩放中心坐标中减去/添加上述范围的一半来计算显示窗口的经度和纬度范围。

lon_边界<-c(缩放到[1]-lon_范围/2,缩放到[1]+lon_span/2)lat_边界<-c(缩放到[2]-lat_span/2,缩放至[2]+纬度/2)

我们现在可以用指定的显示窗口为缩放级别3绘制地图,将缩放中心突出显示为红点:

ggplot()+geom_sf(data=worldmap)+geom_sf(data=st_sfc(st_point(zoom_to)),CRS=4326)color='red')+coord_sf(xlim=lon_边界,ylm=lat_边界)+theme_bw()。

在柏林3级放大

因此,在使用默认投影和wgs84坐标时,这是非常有效的。再来一个金宝搏网址投影怎么样?让我们把堪察加半岛放在地图的中心,设置缩放级别,并使用兰伯特方位角等面积投影(LAEA)以我们的缩放点为中心:

缩放至<-c(159.21,56.41)堪察加缩放中心水平<-2.5兰伯特方位角等面积投影围绕兴趣中心的目标-crs<-sprintf('+proj=laea+lon 0=f+lat 0=f',ZooMyto to [ 1 ],ZooMyto to〔2〕

当我们以前使用wgs84坐标时,我们计算了给定缩放级别下经度和纬度的显示范围。Z以度为单位,将经度(360°)的整圈除以2 ^ z和半圆(180°)的纬度相同。laea投影使用米作为单位而不是度,所以不是把一个360度的圆分开,我们用米来划分地球的整个周长,约为c=40075金宝搏网址016米,通过2 ^ z获取X轴的显示范围(对应于之前的经度范围)。和以前一样,我们使用半周长(假设地球是一个完美的球体,对于Y轴上显示的范围,所以我们得到C/2 ^(z+1).

c<-40075016.686 ~地球周长,单位:米x_span<-c/2 ^缩放水平span<-c/2 ^(缩放水平+1)

现在我们可以像以前一样计算显示窗口的左下角和右上角,减半X-SPAN钇铝石榴石从/到缩放中心坐标。但是,当然,缩放中心必须转换为目标CRS,也是。我们把变焦点放在投影的中心,在这种特殊情况下,我们已经知道它在(0米,在目标CRS中。无论如何,我会提供一个,因为当您将标准化的CRS与EPSG代码一起使用时,您的缩放点可能不是投影中心:

缩放到xy<-st_变换(st_sfc(st_point(zoom_to)),CRS=4326)crs=目标_crs)缩放到_xy
为1个特征设置的几何图形类型:点尺寸:xybbox:xmin:1.570701e-09 ymin:7.070809e-10 xmax:1.570701e-09 ymax:7.070809e-10epsg(srid):naproj4字符串:+proj=laea+lat_0=56.41+lon_0=159.21+x_0=0+y_0=0+ellps=wgs84+单位=m+无defspoint(1.570701e-09 7.070809e-10)

舍入误差,这证实了缩放点位于投影中心。我们现在可以计算显示窗口坐标,如前所述。

显示窗口<-st_sfc(st_点(st_坐标)(缩放至xy-c(x_跨度/2,YYSPAN/2))st_点(st_坐标(缩放到xy+c(x_跨度/2,YYSPAN/2))CRS=目标

现在将显示窗口坐标传递给科尔德斯夫,我们可以绘制结果:

ggplot()+geom_sf(data=worldmap)+geom_sf(data=zoom_to_xy,color='red')+coord_sf(xlim=st_坐标(显示窗口)[,'x'],ylm=st_坐标(显示窗口)[,'y'],CRS=目标CRS,数据=目标值+主题值

堪察加半岛2.5级变焦

你可以用不同的缩放级别来尝试,缩放中心点和投影。请注意,缩放级别和投影的某些组合将导致投影错误,因为有些投影只是在一定范围内指定的,而不是为整个世界指定的。我把完整的R脚本这个要点.

再一次,在变焦点是投影中心的特殊情况下,我们可以简化这个过程。还要注意,我必须将每个坐标ST点(ST点坐标(…),这似乎是多余的,但这是让它工作的唯一方法。似乎SF对象在对其应用向量运算时会丢失CRS信息。

留下评论作者,请关注他们博客上的链接和评论: 188bet appR-Bloggers–WZB数据科学博客.

188bet appR博客提供 每日电子邮件更新金宝搏网址 R新闻与 教程关于以下主题: 数据科学大数据, r作业,可视化(可视化) GGPROTT2箱形图地图动画)程序设计(程序) 演播室斯威夫特乳胶SQL日食吉特哈多普刮网)统计 回归主成分分析时间序列交易还有更多…



如果你走这么远,为什么不 订阅更新 从站点?选择您的口味: 电子邮件推特1188bet app,或 脸谱网

注释已关闭。

搜索R-Blo188bet appggers


赞助商

千万不要错过更新!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)