[英]Why are Basemap south polar stereographic map projection coordinates not agreeing with those of data sets in the same projection?
一些基於衛星的地球觀測產品提供緯度/經度信息,而其他產品提供給定網格投影內的X / Y坐標(並且還有一些具有兩者,參見示例)。 我在第二種情況下的方法是設置一個底圖貼圖,該貼圖具有與數據提供者給定的相同參數(投影,橢圓體,貼圖原點),其方式是給定的X / Y值等於底圖坐標。 但是,如果我這樣做,地理定位與包括Basemap海岸線在內的其他數據集不一致。 我從不同的可靠來源獲得了三種不同的數據集。 對於最小的例子,我使用美國地質調查局提供的Landsat數據,其中包括南極立體網格的X / Y坐標和圖像所有四個角的相應緯度/經度坐標。
從我們得到的Landsat元文件(ID:LC82171052016079LGN00):
CORNER_UL_LAT_PRODUCT = -66.61490 CORNER_UL_LON_PRODUCT = -61.31816 CORNER_UR_LAT_PRODUCT = -68.74325 CORNER_UR_LON_PRODUCT = -58.04533 CORNER_LL_LAT_PRODUCT = -67.68721 CORNER_LL_LON_PRODUCT = -67.01109 CORNER_LR_LAT_PRODUCT = -69.94052 CORNER_LR_LON_PRODUCT = -64.18581 CORNER_UL_PROJECTION_X_PRODUCT = -2259300.000 CORNER_UL_PROJECTION_Y_PRODUCT = 1236000.000 CORNER_UR_PROJECTION_X_PRODUCT = -1981500.000 CORNER_UR_PROJECTION_Y_PRODUCT = 1236000.000 CORNER_LL_PROJECTION_X_PRODUCT = -2259300.000 CORNER_LL_PROJECTION_Y_PRODUCT = 958500.000 CORNER_LR_PROJECTION_X_PRODUCT = -1981500.000 CORNER_LR_PROJECTION_Y_PRODUCT = 958500.000
...
GROUP = PROJECTION_PARAMETERS MAP_PROJECTION = “PS” DATUM = “WGS84” ELLIPSOID = “WGS84” VERTICAL_LON_FROM_POLE = 0.00000 TRUE_SCALE_LAT = -71.00000 FALSE_EASTING = 0 FALSE_NORTHING = 0 GRID_CELL_SIZE_PANCHROMATIC = 15.00 GRID_CELL_SIZE_REFLECTIVE = 30.00 GRID_CELL_SIZE_THERMAL = 30.00 ORIENTATION = “NORTH_UP” RESAMPLING_OPTION = “CUBIC_CONVOLUTION” END_GROUP = PROJECTION_PARAMETERS
通過使用具有正確地圖投影的底圖,我們應該能夠從X / Y值導出角點lat / lon值:
import numpy as np
from mpl_toolkits.basemap import Basemap
m=Basemap(resolution='h',projection='spstere', ellps='WGS84', boundinglat=-60,lon_0=180, lat_ts=-71)
x_crn=np.array([-2259300,-1981500,-2259300,-1981500])# upper left, upper right, lower left, lower right
y_crn=np.array([1236000, 1236000, 958500, 958500])# upper left, upper right, lower left, lower right
x0, y0= m(0, -90)
#Basemap coordinates at the south pole
#note that (0,0) of the Basemap is in a corner of the map,
#while other data sets use the south pole.
#This is easy to take into account:
lon_crn, lat_crn = m(x0-x_crn, y0-y_crn, inverse=True)
print 'lon_crn: '+str(lon_crn)
print 'lat_crn: '+str(lat_crn)
哪個回報:
lon_crn: [-61.31816102 -58.04532791 -67.01108782 -64.1858106 ]
lat_crn: [-67.23548626 -69.3099076 -68.28071626 -70.47651326]
正如你所看到的那樣,經度與圖元文件中的經度一致,但緯度是低的。
我可以通過以下方式估算緯度:
lat_crn=(lat_crn+90.)*1.0275-90.
但這真的不令人滿意。
如果使用圖元文件中的X / Y角坐標(紅色底圖drawcoastlines()
),則這是圖像的定位方式: 這就是使用角落lat / lon的樣子:
在這種情況下,我可以簡單地使用緯度/經度坐標,但如前所述,存在僅由X / Y坐標提供的數據集( 如此 ),這使得依賴底圖投影非常重要。 我知道還有其他模塊可以將數據重新投影為潛在的解決方法,但它應該可以在沒有其他模塊的情況下工作,並且重新投影本身可能會引入錯誤。
由於這個問題出現在不同的數據集中,我想相信它是底圖模塊中的一個錯誤,但我也可能會一次又一次地犯同樣的錯誤或者有錯誤的期望。
我做了一些實驗,似乎改變lat_ts
對projection='spstere'
沒有影響。 事實上,似乎隱含地假設投影緯度為lat_ts=-90.
無論你指定什么價值。
我使用projection='stere'
取得了更大的成功,因此您將在示例中構建Basemap,如下所示:
m=Basemap(width=5400000., height=5400000., projection='stere',
ellps='WGS84', lon_0=180., lat_0=-90., lat_ts=-71.)
您可能更喜歡設置角的緯度和經度,而不是應用程序的繪圖的寬度和高度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.