Как можно эмулировать transform_vector базовой карты в cartopy - PullRequest
1 голос
/ 20 июня 2019

Я хочу использовать функцию transform_vector базовой карты и ее способность возвращать x и y в картопе для построения зазубрин

Это код в базовой карте

u1, v1, x1, y1 = bm.transform_vector(u, v, self.lons, self.lats, 16, 16, 
                                     returnxy=True)

bm.barbs(x1, y1, u1, v1,
         barbcolor='firebrick', flagcolor='firebrick', pivot='middle',
         linewidths=1)

Я хочу добиться этогов cartopy, но transform_vectors в cartopy не имеет опции returnxy, так как я могу это сделать?Предположим, у нас уже есть u, v, self.lons и self.lats

1 Ответ

1 голос
/ 22 июня 2019

Поскольку Cartopy не предоставляет ни одного шага для удовлетворения ваших требований, вам необходимо создать функцию, которая объединяет в себе необходимые операции.Здесь я предлагаю рабочий код, который делает то, что вам нужно.Ищите функцию vectrans() внутри кода.

import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs
import numpy as np

num = 12   # number of points to plot for demo
scale = 7  # scale to get proper sizes of barbs
# generate (u,v) vector components
us, vs = (np.random.random([num])-0.5)*scale, (np.random.random([num])-0.5)*scale
# generate (lons,lats) accompanying the vectors
lons = np.linspace(-120, 170, num)
lats = np.ones(num)*40
# create source and target projections
srcProj = ccrs.PlateCarree()  # basic values: long, lat (equivalent)
tgtProj = ccrs.Robinson()

# here is a function to emulate `transform_vector`
def vectrans(u, v, lons, lats):
    u_tgt, v_tgt = tgtProj.transform_vectors(srcProj, lons, lats, u, v)
    xyz = tgtProj.transform_points(srcProj, lons, lats)
    x_tgt = xyz[:,0]
    y_tgt = xyz[:,1]
    return x_tgt, y_tgt, u_tgt, v_tgt

# setup fig/axis and plot the meshgrid of points
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=tgtProj)
ax.add_feature(cartopy.feature.LAND, facecolor='lightgray')

# use vectrans() to get values for barbs plotting
tgt_x, tgt_y, u_tgt, v_tgt = vectrans(us, vs, lons, lats)

# plot points and barbs
ax.scatter(tgt_x, tgt_y, s=7, c="k", zorder=10)
ax.barbs(tgt_x, tgt_y, u_tgt, v_tgt, barbcolor='firebrick', flagcolor='firebrick', pivot='middle',
         linewidths=1, zorder=11)
ax.set_global()
plt.show()

enter image description here

...