简介
Basemap简介
Matplotlib是Python常用的数据绘制包。它基于NumPy的数组运算功能。 Matplotlib绘图功能强大,可以轻易的画出各种统计图形,比如散点图,条行图,饼图等。 Matplotlib常与Numpy和Scipy相配合,用于许多研究领域。他们是免费工具,但其功能足可以与科研界的大佬Matlab竞争。
Matplotlib中的Basemap它具有专业标准的地图绘制工具。它可以与matplotlib的一般绘图功能相结合,并在地图上绘制数据。 Matplotlib的Basemap工具包是一个用于在Python中的地图上绘制2D数据的库。它在功能上类似于MATLAB地图工具箱,IDL地图工具,GrADS或通用地图工具。 PyNGL和CDAT是在Python中提供类似功能的类库。 Basemap本身不会进行任何绘图,但提供了将坐标转换为25个不同地图投影之一的功能。 Matplotlib也可以用于绘制变换坐标中的轮廓,图像,向量,线或点。 提供了海岸线,河流和政治边界数据集(来自通用地图工具),以及绘制它们的方法。 在Baseap底层使用了GEOS库,用来将海岸线和边界特征剪切到所需的地图投影区域。 Basemap提供读取shapefile的功能。
Basemap适合地球科学家,特别是海洋学家和气象学家的需求。 最初编写Basemap是用来帮助和研究气候和天气预报的,当时CDAT是Python中唯一的用于绘制地图投影数据。 多年来,Basemap的功能随着各个学科(如生物学,地质学和地球物理学)的科学家的要求和贡献的新功能而演变。
Basemap是Matplotlib的一个子包,负责地图绘制。在数据可视化过程中,我们需要将数据在地图上画出来。 比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。
Basemap 在 2020 年前随着 Python 2.7 版本一直有更新维护的。2020 年以后 Python 2.7 将停止更新,Basemap 会按照官方计划也迁移到 Cartopy 模块。
安装
Basemap是Python的软件包,但是目前由于其与操作系统底层的一些类库耦合比较紧密, 无法直接通过 PIP 工具进行安装。
在 Debain Stretch中,可以使用下面的命令进行安装:
# apt install python3-mpltoolkits.basemap
或者,自行下载源代码编译安装。源代码可以直接下载压缩包,或者使用 Git 使用源代码。
要注意的是,Basemap使用了GEOS库,在编译安装Basemap时,
要将环境变量 GEOS_DIR
指向 libgeos_c
和 geos_c.h
的位置
(如果 libgeos_c
在 /usr/local/lib
中, geos_c.h
在 /usr/local/include
中,
则将 GEOS_DIR
设置为 /usr/local
)。
安装时,请按照下列步骤进行操作:
解开Basemap版本X.Y.Z源tar.gz文件,和cd到底图-XY.Z目录。
安装GEOS库。如果你已经安装上了,只需设置。然后转到下一步。如果没有,可以通过下面步骤从包含在底图中的源代码构建它:
cd geos-3.3.3
export GEOS_DIR=<where you want the libs and headers to go>
./configure --prefix=$GEOS_DIR
make; make install
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
导入库中包括Basemap库和matplotlib。两者都是必要的:
map = Basemap()
使用具有许多选项的Basemap类创建地图。 在没有传递任何选项的情况下,地图具有以经度=0和纬度= 0为中心的Plate Carrée投影。
在Mercator投影发明之前,航海中使用的是最简单的Plate Carrée投影(现在天地图还在用), 最早由Ptolemy发明,投影公式简单到不能再简单了:x=lon, y=lat。 但这个投影既不等角也不等积,特别在高纬度地区,与实际相差很大,所以并不实用。
map.drawcoastlines()
plt.show()
设置地图后,我们可以画出我们想要的。在这种情况下,海岸线图层,已经与库,使用方法drawcoastlines()
最后,地图必须显示已保存。使用mathplotlib的方法。在这个例子中,plt.show()
表示打开一个窗口来查看结果。
plt.savefig('file_name')
表示会将地图保存到图像文件中。这点以后不再赘述,书中还是以一般情况下还是使用 show()
方法来说明。
plt.savefig('xx_test.png')
在上面的使用中,我们没有声明地图的投影参数。 The default value is cyl, or Cylindrical Equidistant projection, also known as Equirectangular projection or Plate Carrée
更改投影很容易,只需将投影参数和lat_0和lon_0添加到“地图”中。
下面我们换另外一种投影 ortho
,看一下效果。 关于 Basemap 中投影的设置与使用,在后面会详细说明。
即使有新的投影,地图仍然有点空,所以让我们用一些颜色填充海洋和大陆,方法 fillcontinents()
和 drawmapboundary()
将做到:
map = Basemap(projection='ortho',lat_0=0, lon_0=105)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color= 'coral',lake_color='aqua')
map.drawcoastlines()
map.drawcountries()
plt.show()
用蓝色填充海洋,用陆地颜色填充大陆。整合在一起后,会发现海洋与大陆有着明显的区别。
map = Basemap(projection='ortho',lat_0=0, lon_0=-15)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color= 'coral',lake_color='aqua')
map.drawcoastlines()
map.drawcountries()
plt.show()
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
import os
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
注意要确保分辨率的值是小写L,表示“低”,不是数字1。
my_map = Basemap(resolution='i', projection='merc', llcrnrlat=10.0, urcrnrlat=55.0, llcrnrlon=60., urcrnrlon=140.0)
使用具有许多选项的Basemap类创建映射,并且传递选项数据。
my_map.drawcoastlines()
plt.show()
my_map.drawcountries()
my_map.fillcontinents(color='coral', lake_color='aqua')
my_map.drawmapboundary(color='k', linewidth=1.0, fill_color='b', zorder=None, ax=None)
plt.show()
数据中没有海洋, 则海洋作为背景处理。
在上图中你应该看到大陆被充满了。现在让我们来清理地球的边缘:
my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color='coral')
my_map.drawmapboundary()
my_map.drawmeridians(np.arange(0, 360, 8))
my_map.drawparallels(np.arange(-90, 90, 6))
my_map.drawmapboundary(color='k', linewidth=1.0, fill_color='b', zorder=None, ax=None)
plt.show()
绘制经线,0度开始360度结束,8个步长。纬线-90开始,90结束,6个步长。且海洋作为背景处理。
下面是另外一个投影的例子。与上个例子类似。步长为30.
my_map = Basemap(projection='ortho', lat_0=0, lon_0=-100, resolution='l', area_thresh=1000.0)
my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color='coral')
my_map.drawmapboundary()
my_map.drawmeridians(np.arange(0, 360, 30))
my_map.drawparallels(np.arange(-90, 90, 30))
my_map.drawmapboundary(color='k', linewidth=1.0, fill_color='b', zorder=None, ax=None)
plt.show()
设置地图投影
为了在二维地图上表示地球的曲面,则需要进行地图投影。地图投影的方法有许多种,每种方法都有自己的优点和缺点。
Basemap提供了24种地图投影方法。
有些是全球性的,有些只能代表区域。
在创建Basemap类实例时,必须指定所需的地图投影和地图投影将描述的地球表面部分的信息。
有两种基本的方法。一个是提供矩形映射投影区域的四个角的每一个的纬度和经度值。
另一个是提供地图投影区域中心的 lat/lon
值以及地图投影坐标中的区域的宽度和高度。
类变量 supported_projections
是一个字典(非 Python 数据结构中的字典,自然语言中的字典之意,实际上是 Python 的字符串),
包含有关Basemap支持的所有投影的信息。
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
import mpl_toolkits.basemap
print(mpl_toolkits.basemap.supported_projections)
键是短名称(与在创建Basemap类实例时用于定义投影的projection关键字一起使用),对应的后面是长的、更具描述性的名称。 类变量projection_params是一个字典,提供可用于定义每个投影的属性的参数列表。 以下是说明如何设置每个支持的投影的示例。 注意,许多地图投影具有两个期望的属性之一 - 它们可以是等面积(保留特征的面积)或保形(保留特征的形状)。 因为没有地图投影可以同时具有两者,所以在使用的时候选择哪种投影要在两者之间的做许多妥协。
所有地图必须进行地图投影。投影及其特征都是在创建对象 Basemap 时要明确的。 这样做与其他库(如 GDAL)有很大的不同,理解这一点对于使用Basemap是非常重要的。
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='cyl')
map.drawcoastlines()
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
plt.show()
projection
参数是设置地图投影时要使用的。 默认值为cyl或圆柱等距投影,等距投影也称为等方矩形投影或板卡雷。
许多投影需要额外的参数:
map = Basemap(projection='aeqd', lon_0=180, lat_0=50)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral', lake_color='aqua')
map.drawcoastlines()
plt.show()
该地图在欧洲区域已经具有以经度= 10和纬度= 50为中心的等距投影。一些投影需要更多参数,在手册的每个投影页中都有描述。 Basemap对象具有字段proj4string,该字段具有要与proj4一起使用的字符串,用于计算投影参数。
使用EPSG设置投影
EPSG代码是使用数字代码来命名投影的标准的。
Basemap允许使用此表示法来创建地图,但仅在某些情况下。
若要使用它,需要将epsg参数传递给带有代码的Basemap构造函数。
Basemap支持的epsg代码在文件 /mpl_toolkit /basemap/data/epsg
中。
即使所需的epsg出现在文件中,但有时库并不能使用投影,例如:
ValueError:23031不是受支持的EPSG代码
这里并没有很好地支持名称为“utm”的投影(即23031或15831),但可以使用名为tmerc的投影。首先要做的是打开文件,然后寻找一个合适的选项。
map = Basemap(projection='mbtfpq', lon_0=105)
用‘mbtfpq’投影。
map.drawcoastlines()
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
plt.show()
my_map = Basemap(projection='ortho', lat_0=0, lon_0=-100,
resolution='l', area_thresh=1000.0)
my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color='coral')
my_map.drawmapboundary()
my_map.drawmeridians(np.arange(0, 360, 30))
my_map.drawparallels(np.arange(-90, 90, 30))
plt.show()
map = Basemap(projection='cyl')
map.drawcoastlines()
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
plt.show()
左下角和右上角以经度 - 纬度为单位作为参数而非地图单位原来参数。这就是为什么一些投影失败的原因,因为经度 - 纬度的正方形可能不会在投影单位中给出良好的边界框。 在该示例中,使用的是UTM(横向墨卡托投影)。在这种情况下,边界框方法更容易,因为从地图中心计算UTM单位的宽度要困难得多。 注:使用sinu,moll,hammer,npstere,spstere,nplaea,splaea,npaeqd,spaeqd,robin,eck4,kav7或mbtfpq投影时,则此方法不能使用。
map = Basemap(projection='mbtfpq', lon_0=105)
map.drawcoastlines()
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
plt.show()
map = Basemap(projection='sinu', lon_0=105, lat_0=39)
map.drawcoastlines()
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
plt.show()
在这种情况下,投影的中心,投影的宽度和高度作为参数传递。找到投影中心很容易,只是通过它在经度 - 纬度。但是大小有点棘手: 单位是以米为单位的投影单位,点(0,0)是左下角,点(宽度,高度)是右上角。因此,位置的原点不是由GDAL中的投影定义的。投影只是定义所使用的单位的大小,而不是原点。 该示例使用绘图函数来显示几个点的位置,以显示坐标从0到宽度和高度的范围。
绘制地图背景
Basemap包括GSSH海岸线数据集,以及来自GMT的河流、州和国家边界的数据集。这些数据集可用于在地图上以几种不同的分辨率绘制海岸线,河流和政治边界。相关的底图方法是:
- drawcoastlines():绘制海岸线。
- fillcontinents():为大陆内部着色(通过填充海岸线多边形)。不幸的是,fillcontinents方法并不总是做正确的。因为Matplotlib总是尝试填充多边形的内部。在某些情况下,海岸线多边形的内部可以是模糊的,并且有时需要填充外部而不是内部。在这些情况下,建议的解决方法是使用drawlsmask()方法覆盖具有为陆地和水域指定的不同颜色的图像。
- drawcountries():绘制国家边界。
- drawstates():绘制北美的州界。
- drawrivers():绘制河流。
绘制地图并不只包括绘制海岸线和政治边界,也包括地图背景的绘制。Basemap提供了绘制地图背景的几个方法:
- drawlsmask():绘制高分辨率海陆掩码作为图像,指定土地和海洋颜色。陆地海面掩模源自GSHHS海岸线数据,并且有多个海岸线选项和像素大小可供选择。
- bluemarble():绘制一张NASA蓝色大理石图像作为地图背景。
- shadedrelief():绘制一个阴影浮雕图像作为地图背景。
- etopo():绘制etopo浮雕图像作为地图背景。
- warpimage():使用abitrary图像作为地图背景。图像必须是全球的,从国际数据线向东,南极向北,以纬度/经度坐标覆盖世界。
1、使用arcgis REST API服务下载并绘制图像。
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(llcrnrlon=3.75,llcrnrlat=39.75,urcrnrlon=4.35,urcrnrlat=40.15, epsg=5520)
#http://server.arcgisonline.com/arcgis/rest/services
map.arcgisimage(service='ESRI_Imagery_World_2D', xpixels = 1500, verbose= True)
plt.show()
下面使用了另外一种底图:
map.arcgisimage(service='World_Shaded_Relief', xpixels = 1500, verbose= True)
plt.show()
arcgisimage(server='http://server.arcgisonline.com/ArcGIS', service='ESRI_Imagery_World_2D',
xpixels=400, ypixels=None, dpi=96, verbose=False, **kwargs)
- 服务器可以使用相同的REST API连接到另一个服务器。
- 服务器显示的是绘制的层。要获取可用图层的完整列表,请检查API网。
- xpixels实际上是用来设置图像的缩放。数字越大将会要求图像更大,所以图像将有更多的细节。因此,当缩放更大时,xsize必须更大以保持分辨率 。
- y像素可以用于强制图像在y方向上具有与以宽高比定义的像素不同数量的像素。默认情况下,宽高比保持不变,这似乎是一个很好的价值。
- dpi是输出的图像分辨率。更改其值将更改像素数,但不会更改缩放级别。
- verbose打印用于获取远程图像的URL。
- 使用这种方法的一个重要的点是,投影必须使用epsg参数设置,除非使用底图表示法中的4326或cyl。
2、bluemarble
在地图上绘制bluemarble图像。
bluemarble(ax=None, scale=None, **kwargs)
- 该比例对于降低原始图像分辨率以加速处理是有用的。将图像的大小除以4值为0.5。
- 图像的最终投影被扭曲,所以所有投影方法均正常工作。
map = Basemap(llcrnrlon=-10.5,llcrnrlat=33,urcrnrlon=10.,urcrnrlat=46.,
resolution='i', projection='cass', lat_0 = 39.5, lon_0 = 0.)
map.bluemarble()
map.drawcoastlines()
plt.show()
map = Basemap()
map.drawcoastlines()
plt.show()
4、drawcounties
从库包括的图层绘制国家边界。
drawcounties(linewidth=0.1, linestyle=’solid’, color=’k’, antialiased=1, facecolor=’none’, ax=None, zorder=None, drawbounds=False)
- 线宽集。线宽以像素为单位。
- linestyle设置线型。默认情况下是固体,但可以是虚线,或任何matplotlib其他选项。
- 颜色默认为k(black)。遵循matplotlib约定。
- 抗锯齿默认为true。
- zorder设置图层位置。默认情况下,顺序由Basemap设置。
注:facecolor参数,它应该是县的颜色,但在一些Basemap版本不能运行。
注意:
- 分辨率是固定的,不依赖于传递给类构造函数的分辨率。
- 海岸线是另一个功能,而乡镇海岸线不被认为是海岸线,因此有必要把这个方法和其他的方法结合起来以获得好的地图。
# map = Basemap(llcrnrlon=-93.,llcrnrlat=40.,urcrnrlon=-75.,urcrnrlat=50.,
# resolution='i', projection='tmerc', lat_0 = 40., lon_0 = -80)
# map.drawmapboundary(fill_color='aqua')
# map.fillcontinents(color='#cc9955', lake_color='aqua')
# map.drawcounties()
# plt.show()
5、drawcountries
从库中包含的图层绘制国家/地区边界。
drawcountries(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
- 线宽集。线宽以像素为单位。
- linestyle设置线型。默认情况下是固体,但可以是虚线,或任何matplotlib选项。
- 颜色默认为k(black)。遵循matplotlib约定。
- 抗锯齿默认为true zorder设置图层位置。默认情况下,顺序由Basemap设置。
注意:
- 创建Basemap实例时会产生具有更好或粗糙分辨率的图层。
- 海岸线是另一个功能,乡镇海岸线不是通常的海岸线,因此要结合其它函数来绘制地图。
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcountries()
plt.show()
没有绘制海岸线,结果有些奇怪:
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
# map.drawmapboundary(fill_color='aqua')
# map.fillcontinents(color='coral',lake_color='aqua')
map.drawcountries()
plt.show()
6、Drawlsmask
Drawlsmask是绘制湖泊,陆地和海洋的方法。尽量避免使用fillcontinents和drawmapboundary方法。此外,Drawlsmask可以将数据源更改为自定义点阵列。 与其他方法的不同之处在于,在此方法中无法设置zorder。
drawlsmask(land_color=‘0.8’, ocean_color=’w’, lsmask=None, lsmask_lons=None, lsmask_lats=None, lakes=True, resolution=’l’, grid=5, **kwargs)
- land_color设置给土地的颜色(默认为灰色)
- ocean_color设置海洋的颜色(默认为白色)
- lsmask具有备用数据的阵列。如果为“无”,则将采用库中的默认数据。该数组必须包含海洋的0和土地的1
- lsmask_lons替换陆地海面掩码的经度
- lsmask_lats替代陆地海面的纬度
- 分辨率可以更改由Basemap实例定义的数据的分辨率
- grid栅格数组栅格分辨率,单位为弧度。默认值为5分钟
plt.figure(121)
map = Basemap(projection='ortho',lon_0=0,lat_0=0,resolution='c')
map.drawmapboundary()
plt.figure(122)
map = Basemap(projection='sinu',lon_0=0,resolution='c')
map.drawmapboundary(fill_color='aqua')
plt.show()
8、Drawmeridians
在地图上绘制经线。
drawmeridians(meridians, color=’k’, linewidth=1.0, zorder=None, dashes=[1, 1], labels=[0, 0, 0, 0], labelstyle=None, fmt=’%g’, xoffset=None, yoffset=None, ax=None, latmax=None, **kwargs)
- 经线是一个有经度的列表。如果值是整数,则可以使用range()创建。如果你需要浮点数,np.arange()是一个不错的选择
- color设置线的颜色。
- 线宽集。线宽以像素为单位
- zorder可以设置线的位置,土地覆盖经线,或相反。
- dashing可以设置dash样式。第一个元素是要绘制的像素数,第二个是要跳过的像素数
- 更改绘制标签的位置。将值设置为1使得标签在地图的所选边上绘制。四个位置是[左,右,上,下]
map = Basemap(projection='aeqd',
lon_0=0.0, lat_0=0,
width=25000000, height=25000000)
map.drawmeridians(range(0, 360, 20))
plt.show()
9、parallels
在地图上绘制纬线。
drawparallels(circles, color=’k’, linewidth=1.0, zorder=None, dashes=[1, 1], labels=[0, 0, 0, 0], labelstyle=None, fmt=’%g’, xoffset=None, yoffset=None, ax=None, latmax=None, **kwargs)
- rallels是要绘制的纬度的列表。如果值是整数,则可以使用range()创建。如果你需要浮点数,np.arange()是一个不错的选择。
- color设置线的颜色。
- 线宽集,当然,线宽以像素为单位
- order可以设置线的位置,以便能够例如使得平面覆盖纬线或相反。
- 设置dashing样式。第一个元素是要绘制的像素数,第二个是要跳过的像素数。
- 标签更改绘制标签的位置。将值设置为1使得标签在地图的所选边上绘制。四个位置是[左,右,上,下]。
map = Basemap(projection='poly',
lon_0=0.0, lat_0=0,
llcrnrlon=-80.,llcrnrlat=-40,urcrnrlon=80.,urcrnrlat=40.)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
map.drawparallels(range(-90, 100, 10), linewidth=2, dashes=[4, 2], labels=[1,0,0,1], color='r', zorder=0 )
plt.show()
map = Basemap(llcrnrlon=-93.,llcrnrlat=40.,urcrnrlon=-75.,urcrnrlat=50.,
resolution='i', projection='tmerc', lat_0 = 40., lon_0 = -80)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='#ddaa66', lake_color='#0000ff')
map.drawcountries()
map.drawrivers(color='#0000ff')
plt.show()
11、drawstates
从库包括的图层中绘制北美州界。也可以绘制澳大利亚州的边界。
drawstates(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
- 线宽集,当然,线宽以像素为单位
- linestyle设置线型。默认情况下是固体,也可以是虚线,或任何matplotlib选项
- 颜色默认为k(black)。还遵循matplotlib约定
- 抗锯齿默认为true
- zorder设置图层位置。默认情况下,顺序由Basemap设置
注意:
- 分辨率是固定的,不依赖于传递给类构造函数的分辨率参数
- 国家边框未绘制,如果方法不与绘图帐户一起使用,将创建一个奇怪的效果
map = Basemap(width=12000000,height=9000000,
rsphere=(6378137.00,6356752.3142),\
resolution='l',area_thresh=1000.,projection='lcc',\
lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='#ddaa66', lake_color='aqua')
map.drawcountries()
map.drawstates(color='0.5')
plt.show()
map = Basemap(llcrnrlon=-10.5,llcrnrlat=33,urcrnrlon=10.,urcrnrlat=46.,
resolution='i', projection='cass', lat_0 = 39.5, lon_0 = 0.)
map.etopo()
map.drawcoastlines()
plt.show()
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
#Fill the globe with a blue color
map.drawmapboundary(fill_color='aqua')
#Fill the continents with the land color
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
plt.show()
# map = Basemap(llcrnrlon=-10.5,llcrnrlat=33,urcrnrlon=10.,urcrnrlat=46.,
# resolution='i', projection='cass', lat_0 = 39.5, lon_0 = 0.)
# map.shadedrelief()
# map.drawcoastlines()
# plt.show()
from PIL import Image
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
tmpdir = '/tmp'
size = [600, 300]
im = Image.open("/gdata/pillow.png")
im2 = im.resize(size, Image.ANTIALIAS)
im2.save(tmpdir+'/resized.png', "PNG")
map.warpimage(tmpdir+'/resized.png')
map.drawcoastlines()
plt.show()
%matplotlib inline
import os
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
para = {
'projection': 'merc',
'lat_0': 38.8,
'lon_0': 121.3,
'resolution': 'l',
'area_thresh': 1000.0,
'llcrnrlon': 118,
'llcrnrlat': 36.6,
'urcrnrlon': 124.6,
'urcrnrlat': 40.7
}
定义para函数。并且定义投影等参数。
my_map = Basemap(**para)
使用具有许多选项的Basemap类来创建para函数的映射。
my_map.drawcoastlines()
my_map.drawcountries()
plt.show()
请注意,lat_0和lon_0给出的地图的中心,一定是你放大了的区域内。
并注意地图放大后图像比较不美观,并且缺少岛屿的西部。让我们将分辨率更改为“H”为“高”,我们可以看到:
para['resolution'] = 'h'
将para函数分辨率更改为h即分辨率为高
my_map = Basemap(**para)
my_map.drawcoastlines()
my_map.drawcountries()
plt.show()
这是改进之后的图像,但我们仍然缺少一个整个岛屿的西部。这是因为area_thresh设置。此设置规定了在地图上显示的地图项必须有多大。当前设置只显示地图大于1000平方公里的功能。这是对世界低分辨率地图的一个合理的设置,但它对小尺度地图而言是个不好的选择。让我们将该设置更改为0.1,并查看我们获得的详细信息:
para['area_thresh'] = .1
这是才一个有意义的地图。我们可以看到Kruzof岛,Baranof西部的大岛和该地区的许多其他岛屿。低于area_thresh = 0.1的设置将不会在此缩放级别添加任何新的详细信息。
my_map = Basemap(**para)
my_map.drawcoastlines()
my_map.drawcountries()
plt.show()
Basemap是一个令人难以置信的灵活包。如果你想要与其他设置一起使用,请查看Basemap文档。接下来,我们将学习如何在地图上绘制点。
import helper; helper.info()