2017-07-25 32 views
2

我想使用Python中matplotlib軟件包的'spstere'投影將我的地圖集中在南極洲的特定區域。我能夠繪製整個南極洲,但是這次我想'放大'並仔細觀察一下大陸的一個特定區域。Matplotlib:使用spstere投影專注於特定的lon/lat

使用其他投影的相似示例(Pyplot contour plot - clabel spacing; http://matplotlib.org/basemap/api/basemap_api.html; https://matplotlib.org/basemap/users/examples.html)可以在線獲得,但我無法將它們應用於南極洲的'spstere'投影。

我基本上要關注我的地圖上的南極半島,從

llcrnrlon=-100,urcrnrlon=-30,llcrnrlat=-90,urcrnrlat=-55.0

我曾嘗試使用此代碼與「spstere大致可以跨越的區域凸出但是Python只考慮到帳戶boundinglat和lon_0。我試圖改變boundinglat和lon_0的值,但它也不起作用。

任何想法我可以去?我也嘗試過使用其他投影,例如'cyl',但沒有像'spstere'proj那樣得到一個漂亮的方形,我得到了一個水平矩形。

m = Basemap(projection='cyl',lon_0=0,lat_0=0,\ 
     llcrnrlon=-180,urcrnrlon=180,llcrnrlat=-90,urcrnrlat=-55.0,resolution='c') 

任何幫助將不勝感激!

回答

2

使用極地立體投影'spstere',您可以通過使用極地立體投影'spstere'獲得南極地區。 boundinglat=-60

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 

m = Basemap(projection='spstere',boundinglat=-60,lon_0=180,resolution='c') 
m.drawcoastlines() 

plt.show() 

enter image description here

注意'spstere'在南極總是居中。
爲了製作一張不以南極爲中心的地圖,您需要使用"stere"投影。設置"stere"投影的角落並不重要。

因此,人們可以在'spstere'投影中使用一個圖並找出一些將包含感興趣區域的點。在這種情況下,

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import numpy as np 

m = Basemap(projection='spstere',boundinglat=-50, 
      lon_0=180+(-100+-30)/2.,resolution='c') 

m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0]) 
m.drawparallels(np.arange(-90,90,5)) 
m.drawcoastlines() 

xll, yll = m(-150,-70) # <-- find those points by looking at meridians and parallels 
xur, yur = m(-30,-55) 
m.scatter([xll,xur], [yll, yur], c="crimson") 
plt.show() 

enter image description here

使用這些點,(-150,-70, -30,-55),作爲地圖的角落,然後你可以用繪製投影'stere'的地圖。

m = Basemap(projection='stere',resolution='c', 
      lat_0=-90, lon_0=(-100+-30)/2., lat_ts=(-90.+-55.)/2., 
      llcrnrlon=-150,urcrnrlon=-30,llcrnrlat=-70,urcrnrlat=-55) 

enter image description here

如果這種啓發式方法是不是願意,你可以通過創建'spstere'投影的虛擬地圖自動執行此過程,計算從問題(llcrnrlon=-100,urcrnrlon=-30,llcrnrlat=-90,urcrnrlat=-55.0)矩形的座標,並創建一個新底圖在stere與他們投影。以下功能取自ActiveState site(作者PG)。

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import numpy as np 

def polar_stere(lon_w, lon_e, lat_s, lat_n, **kwargs): 
    '''Returns a Basemap object (NPS/SPS) focused in a region. 
    lon_w, lon_e, lat_s, lat_n -- Graphic limits in geographical coordinates. 
            W and S directions are negative. 
    **kwargs -- Aditional arguments for Basemap object. 
    ''' 
    lon_0 = lon_w + (lon_e - lon_w)/2. 
    ref = lat_s if abs(lat_s) > abs(lat_n) else lat_n 
    lat_0 = np.copysign(90., ref) 
    proj = 'npstere' if lat_0 > 0 else 'spstere' 
    prj = Basemap(projection=proj, lon_0=lon_0, lat_0=lat_0, 
          boundinglat=0, resolution='c') 
    lons = [lon_w, lon_e, lon_w, lon_e, lon_0, lon_0] 
    lats = [lat_s, lat_s, lat_n, lat_n, lat_s, lat_n] 
    x, y = prj(lons, lats) 
    ll_lon, ll_lat = prj(min(x), min(y), inverse=True) 
    ur_lon, ur_lat = prj(max(x), max(y), inverse=True) 
    return Basemap(projection='stere', lat_0=lat_0, lon_0=lon_0, 
          llcrnrlon=ll_lon, llcrnrlat=ll_lat, 
          urcrnrlon=ur_lon, urcrnrlat=ur_lat, **kwargs) 

llcrnrlon=-100 
urcrnrlon=-30 
llcrnrlat=-90 
urcrnrlat=-55.0 
m = polar_stere(llcrnrlon, urcrnrlon, llcrnrlat, urcrnrlat) 

m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0]) 
m.drawparallels(np.arange(-90,90,30),labels=[1,1,1,1]) 
m.drawcoastlines() 

plt.show() 

enter image description here

+0

這是輝煌的。正是我需要的。感謝您的詳細解答! – jb16006