Tissot 指示图或 Tissot 歪曲椭圆是在地图上显示圆,展示了这些圆是如何适应投影的(即,在不同的位置出现了球面相同的曲率)。通常,不同的位置会出现不同的扭曲度。
tissot(lon_0, lat_0, radius_deg, npts, ax=None, **kwargs)
注意:
如果在地图的边缘,圆被分割了(比如从 -179 到 179),此方法不会很好的解决此问题。
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
for lon in range(0, 360, 20):
for lat in range(-60, 90, 30):
map.tissot(lon, lat, 4, 50)
plt.show()
Orthographic 投影的 Tissot 图
Mercator 投影的 Tissot 图
Albers Equal Area 投影的 Tissot 图
给一个 cylindrical 投影中的标量矩阵及经纬度坐标点,插值这些点到新的矩阵中。
transform_scalar(datin, lons, lats, nx, ny, returnxy=False, checkbounds=False, order=1, masked=False)
注意:
当输入矩阵是不规则的 longitude-latitude 网格(例如,不是 cylindric 投影),此方法将不能正确使用,因为longitude-latitude 网格不是规则的。解决方法见 interp
from mpl_toolkits.basemap import Basemap
from mpl_toolkits.basemap import shiftgrid
import matplotlib.pyplot as plt
from osgeo import gdal
import numpy as np
fig=plt.figure(figsize=(9, 3))
map = Basemap(projection='merc',
lat_0=0,
resolution='h',
llcrnrlon=32,
llcrnrlat=31,
urcrnrlon=33,
urcrnrlat=32)
ds = gdal.Open("../sample_files/dem.tiff")
data = ds.ReadAsArray()
lons = np.linspace(0, 40, data.shape[1])
lats = np.linspace(0, 35, data.shape[0])
ax = fig.add_subplot(121)
ax.set_title('Without transform_scalar')
llons, llats = np.meshgrid(lons, lats)
x, y = map(llons, llats)
map.pcolormesh(x, y, data, vmin=900, vmax=950)
map.drawcoastlines()
ax = fig.add_subplot(122)
ax.set_title('Applying transform_scalar')
data_interp, x, y = map.transform_scalar(data, lons, lats, 40, 40, returnxy=True)
map.pcolormesh(x, y, data_interp, vmin=900, vmax=950)
map.drawcoastlines()
plt.show()
1) 使用 meshgrid 转换经纬度为 二维数组
2) 使用 basemap 实例转换经纬度为 mercator 投影
3) 使用 pcolormesh 绘制结果,并且设置最大值和最小值,因此两幅图的结果是相同的
注意:
mask似乎并没有效果。
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(9, 3))
map = Basemap(projection='robin',
lat_0=0, lon_0=0)
lons = np.arange(-180, 190, 60)
lats = np.arange(-90, 100, 30)
data = np.indices((lats.shape[0], lons.shape[0]))
data = data[0] + data[1]
llons, llats = np.meshgrid(lons, lats)
ax = fig.add_subplot(121)
ax.set_title('Without transform_scalar')
x, y = map(llons, llats)
map.pcolormesh(x, y, data, cmap='Paired')
map.drawcoastlines()
ax = fig.add_subplot(122)
ax.set_title('Applying transform_scalar')
data_interp, x, y = map.transform_scalar(data, lons, lats, 50, 30, returnxy=True, masked=True)
map.pcolormesh(x, y, data_interp, cmap='Paired')
map.drawcoastlines()
plt.show()
给定向量场的 东西 和 南北 方向分量以及经纬度点,然后对向量进行旋转,使向量场在地图投影上以适当的方向显示。
一些函数(比如 barbs,quiver,streamplot)使用的是向量数据,要求向量分量是地图坐标系(比如 u 是左右方向,v 是上下方向)。如果可用数据是地理学坐标系的(比如东西方向,南北方向),这些坐标必须进行转换,否则所绘制的向量方向会很怪异。这就是 rotate_vertor 方法的目的。
当绘制 barbs,quiver,streamline 时,可用点很少时,需要插值这些点到一个新的矩阵中,从而获取更多的元素以进行绘图。
rotate_vector 方法也能完成同样的工作,但并没有对点进行插值。
transform_vector(uin, vin, lons, lats, nx, ny, returnxy=False, checkbounds=False, order=1, masked=False)
注意:
当输入矩阵是不规则的 longitude-latitude 网格(例如,不是 cylindric 投影),此方法将不能正确使用,因为longitude-latitude 网格不是规则的。解决方法见 interp
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from osgeo import gdal
import numpy as np
map = Basemap(projection='sinu',
lat_0=0, lon_0=0)
lons = np.linspace(-180, 180, 8)
lats = np.linspace(-90, 90, 8)
v10 = np.ones((lons.shape)) * 15
u10 = np.zeros((lons.shape))
u10, v10 = np.meshgrid(u10, v10)
u10_rot, v10_rot, x_rot, y_rot = map.transform_vector(u10, v10,
lons, lats,
15, 15,
returnxy=True)
map.drawmapboundary(fill_color='#9999FF')
map.fillcontinents(color='#ddaa66', lake_color='#9999FF', zorder = 0)
map.drawcoastlines(color = '0.15')
#Drawing the original points
lons, lats = np.meshgrid(lons, lats)
x, y = map(lons, lats)
map.barbs(x, y, u10, v10,
pivot='middle', barbcolor='#333333')
#Drawing the rotated & interpolated points
map.barbs(x_rot, y_rot, u10_rot, v10_rot,
pivot='middle', barbcolor='#ff5555')
plt.show()