簡體   English   中英

Matplotlib:使用spstere投影專注於特定的lon / lat

[英]Matplotlib: Focus on specific lon/lat using spstere projection

我試圖使用Python中的matplotlib包中的'spstere'投影將我的地圖聚焦在南極洲的特定區域。 我可以繪制整個南極洲,但這次我想“放大”並仔細觀察大陸的特定區域。

使用其他投影的類似示例( Pyplot等高線圖 - clabel間距 ; 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'proj一起使用,但是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')

任何幫助將非常感謝!

使用Polar 'spstere' Projection'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()

在此輸入圖像描述

請注意, 'spstere'始終以南'spstere'中心。
為了得到一個不以南極為中心的地圖,你需要使用"stere"投影。 設置"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()

在此輸入圖像描述

使用這些點(-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)

在此輸入圖像描述

如果不需要這種啟發式方法,您可以通過在'spstere'投影中創建虛擬地圖來自動執行此過程,從相關矩形計算坐標( llcrnrlon=-100,urcrnrlon=-30,llcrnrlat=-90,urcrnrlat=-55.0 ),並創建一個新底圖stere與之投影。 以下功能取自ActiveState站點 (作者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()

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM