正投影 Python

0 投票
1 回答
5512 浏览
提问于 2025-04-17 15:05

我用正交投影来绘制地图。
我使用这个程序:

from mpl_toolkits.basemap import Basemap
import numpy as np    
import matplotlib.pyplot as plt   
import os, sys    
from sys import argv   
import pylab    
from mpl_toolkits.basemap import Basemap, shiftgrid    
from matplotlib import mpl     
from matplotlib import rcParams    
import matplotlib.pyplot as plt    
import matplotlib.mlab as mlab    
import matplotlib.patches as patches    
import matplotlib.path as path    
import matplotlib.dates as dt    
from numpy import linalg    
import netCDF4    
import time    
import datetime as d   
import sys    
import math    
from mpl_toolkits.axes_grid1 import make_axes_locatable   
from pylab import *


nc = netCDF4.Dataset ('tt.nc')    
latvar = nc.variables['lat']    
lat = latvar[:]    
lon = nc.variables['lon'][:]    
lat_0=30;lon_0=-25    
m1 = Basemap(projection='ortho',lon_0=-25,lat_0=30,resolution='l')    
m = Basemap(projection='ortho',lon_0=lon_0,lat_0=lat_0,resolution='l',\
    llcrnrx=0.,llcrnry=0.,urcrnrx=m1.urcrnrx/2.,urcrnry=m1.urcrnry/2.)

X, Y = m(lon, lat)    
O_x_1=nc.variables['O3']   
h=9    
lev=0    
minOzone=0    
maxOzone=40    
plotOzone = m.pcolor(X,Y,O_x_1[h,lev,:,:],vmin=minOzone,vmax=maxOzone)
ax=colorbar(plotOzone, shrink=0.8,norm=(0,40))    
m.drawcoastlines()   
m.drawparallels(np.arange(-90.,120.,30.))    
m.drawmeridians(np.arange(0.,420.,60.))    
plt.show()

我该怎么做才能把我的地图中心放在欧洲呢?

我已经尝试过调整lat_0和lon_0,但结果并不是我想要的……

我无法添加图形来展示我得到的结果和我想要的效果……

谢谢!

1 个回答

5

lat_0 和 lon_0 是用来设置地图投影的起点,而不是地图的范围。通常来说,起点应该选择失真最小的地方,所以你不希望起点偏离你关注区域的中心太远。如果你不指定地图的范围,Basemap 会自动把地图中心放在这个起点上。

如果你知道想要的范围(或者叫边界框),可以把地图中心调整到你想要的位置。这意味着如果你知道在“正射投影”中的角落坐标,就可以使用你例子中的一些关键词(比如 llcrnrx 等)。不过在 Basemap 1.0.6 版本中,我用 'llcrnrlon' 这些关键词没有成功,它们似乎是让你输入地理坐标(经纬度)来定义范围。

另外一种方法是直接获取坐标轴,然后手动设置 x 和 y 的限制。这样做的好处是你可以在声明 Basemap 对象之后再进行设置,这样你就可以用它来进行坐标转换。下面是一个例子:

from mpl_toolkits.basemap import Basemap

fig = plt.figure(figsize=(5,5))

m = Basemap(projection='ortho',lon_0=5,lat_0=35,resolution='l')

m.drawcoastlines()
m.drawparallels(np.arange(-90.,120.,15.))
m.drawmeridians(np.arange(0.,420.,30.))

# your extent in lat/lon (dec degrees)
ulx = -10
uly = 65
lrx = 65
lry = 35

# transform coordinates to map projection
xmin, ymin = m(ulx, lry)
xmax, ymax = m(lrx, uly)

# set the axes limits
ax = plt.gca()
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)

确保在地图声明中选择的投影符合你的需求,我选择了一个位于欧洲的起点。

enter image description here

撰写回答