簡體   English   中英

使用cartopy在其他項目中繪制投影數據

[英]Plotting projected data in other projectons using cartopy

這個問題涉及繪制一些使用Lambert Conformal(LCC)CRS的數據。 雖然這些問題特別適用於在多個投影中繪制LCC數據,但它也適用於一般的折紙使用,因為我希望更好地理解使用折疊繪圖的邏輯/過程。

下面是我正在嘗試做的一些代碼示例。 第一個例子是簡單地繪制一些LCC數據。 我使用的數據可在此鏈接中找到

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

proj = ccrs.LambertConformal(central_latitude = 25, 
                             central_longitude = 265, 
                             standard_parallels = (25, 25))

# Data and coordinates (from download link above)
with np.load('nam_218_20120414_1200_006.npz') as nam:
   dat = nam['dpc']
   lat = nam['lat']
   lon = nam['lon']

ax = plt.axes(projection = proj)
ax.pcolormesh(lon, lat, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
               category='cultural',
               name='admin_1_states_provinces_lines',
               scale='50m',
               facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
plt.show()

產生的情節可以在這里看到:

LCC地圖上的美國露點

使用cartopy時我的第一個困惑是為什么在繪圖時我總是要轉換為PlateCarree 我最初的想法是pcolormesh調用的transform關鍵字需要LCC投影信息而不是PlateCarree

接下來,如果我想在另一個投影中繪制我的LCC數據,例如正交,我會像下面這樣做嗎?

# First, transform from LCC to Orthographic
transform = proj.transform_points(ccrs.Orthographic(265,25), lon, lat)
x = transform[..., 0]
y = transform[..., 1]

ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(x, y, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
               category='cultural',
               name='admin_1_states_provinces_lines',
               scale='50m',
               facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()

產生的情節可以在這里看到:

美國露點地圖上的露點

我認為正交圖看起來是正確的,但我想確定我理解正確重新投影的過程。

總之,我想知道以下事項:

  1. 在繪圖時你總是要transformPlateCarree嗎? 為什么或者為什么不?
  2. 重新投影只是需要調用transform_points方法還是涉及其他步驟?

更新1

基於@swatchai的答案,似乎我的問題2的答案是不需要transform_points 可以在許多matplotlib繪圖方法中使用transform關鍵字參數。 這就是我原來的想法。 但是,跳過transform_points並不適用於我。 見下面的例子:

ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(lon, lat, dat, transform = proj)
ax.add_feature(cf.NaturalEarthFeature(
               category='cultural',
               name='admin_1_states_provinces_lines',
               scale='50m',
               facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()

這產生了這個情節:

正交圖沒有transform_points步驟

問題似乎是lat和lon輸入沒有轉換成網格坐標,所以它們只能繪制在圖的極小區域內。 那么,要擴展問題2,如果您應該跳過transform_points ,那么基於我上面的例子,是否存在cartopy繪圖方法中的錯誤? 或者我還缺少一步?

在Cartopy中,ccrs.PlateCarree()是最基本的地圖投影,有時稱為非投影投影,即以度為單位的地理位置(緯度,長度) - >變為網格值y = lat; 在PlateCarree地圖上x = long。

這段代碼:

import cartopy.crs as ccrs
axm = plt.axes( projection = ccrs.xxxx() ) 

創建一個軸axm用於在xxxx投影中繪制地圖。 在axm上繪制數據時,默認坐標是該投影的網格(x,y)(通常以米為單位)。 這就是為什么你需要transform=ccrs.PlateCarree()來聲明你的輸入(x,y)確實在(long,lat)度,或者換句話說,在(x,y)PlateCarree網格坐標中。

如果您的目標投影是正交,而數據是LambertConformal,

ax = plt.axes(projection = ccrs.Orthographic(265,25))
lccproj = ccrs.LambertConformal(central_latitude = 25, 
                         central_longitude = 265, 
                         standard_parallels = (25, 25))

您可以使用繪圖數據

ax.pcolormesh(x, y, dat, transform = lccproj)

在進行繪圖時,根本不需要使用transform_points()。 但是在某些情況下想要訪問轉換后的坐標時非常有用。

需要在地理和投影(或網格)坐標之間進行重要區分。 可以在此處找到更詳細的描述。 重要的是,有助於回答問題1的是,緯度和經度是地理坐標,而以米為單位的點是投影坐標。

示例數據來自的數值天氣模型在其計算中使用Lambert Conformal投影( 此處更多)。 但是,輸出的坐標是緯度和經度。 如果您對空間數據缺乏經驗,那么當它們實際上是地理坐標時,您最終可能會認為緯度/經度對是LCC 投影坐標; 在模型集成期間使用LCC內容。

要回答問題1,不,您不必總是使用PlateCarree作為源CRS。 但是,您總是使用PlateCarree獲取緯度和經度數據(這是這種情況)。 這樣,cartopy將正確地將您的lat / lon值轉換為投影坐標(以米為單位),並且能夠在繪圖期間輕松地transform數據transform為其他投影。 這個問題最終是Update 1中看似空白的情節的原因。通過說源數據在transform具有LCC投影坐標,cartopy取得lat / lon輸入並將它們解釋為具有米的單位。 確實繪制了數據,但范圍太小,以至於如果不將繪圖范圍更改為與數據相同,則無法看到它們。

關於問題2,不,使用transform_points不是必需的。 以這樣的方式設置了紙箱,使得在具有最小中間步驟的多個投影中容易繪圖。 正如@swatchai所提到的,有時您可能想要使用實際的投影坐標,並且使用transform_points方法將允許您這樣做。 transform_points用於在原始帖子中生成第二個繪圖時,它基本上是手動執行在transform使用PlateCarree正確處理輸入坐標時自動完成的操作。

最后,@ ajdawson對繪圖時如何使用projectiontransform做了一個重要的澄清。 一旦了解了源坐標的含義,此信息也很有用。 評論引用如下:

一般來說, projection告訴圖紙繪制的地圖應該是什么樣的,並且transform告訴圖解您的數據所代表的坐標系。您可以將projection設置為您喜歡的任何投影,但transform需要匹配您的數據使用的任何坐標系。

暫無
暫無

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

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