Python 3.x 如何使用python3在MODIS文件中创建lat和lon
我有一些关于某个纬度和经度的解释,但在MODIS中,我既没有纬度也没有经度。我在互联网上漫游以创建纬度和经度,然后计算我的工作需要什么。我被告知最好的程序是python,我正在使用python3 我在这个网站上下载了数据(),更确切地说是这个(),帐户是必需的Python 3.x 如何使用python3在MODIS文件中创建lat和lon,python-3.x,satellite,pyhdf,Python 3.x,Satellite,Pyhdf,我有一些关于某个纬度和经度的解释,但在MODIS中,我既没有纬度也没有经度。我在互联网上漫游以创建纬度和经度,然后计算我的工作需要什么。我被告知最好的程序是python,我正在使用python3 我在这个网站上下载了数据(),更确切地说是这个(),帐户是必需的 import numpy as np import pyhdf import matplotlib.pyplot as plt from pyhdf.SD import SD, SDC import satpy import pyhdf.
import numpy as np
import pyhdf
import matplotlib.pyplot as plt
from pyhdf.SD import SD, SDC
import satpy
import pyhdf.SD
# Read
#MOD09Q1 = './MOD09Q1.A2017081.h13v12.005.2017090201940.hdf'
MOD09A1 = './MOD09A1.A2017081.h13v12.005.2017090201940.hdf'
MOD09A1 = SD(MOD09A1, SDC.READ)
#MOD09Q1 = SD(MOD09Q1, SDC.READ)
datasets_dic = MOD09A1.datasets()
for idx,sds in enumerate(datasets_dic.keys()):
print (idx,sds)
# function
def calibrate(h5):
attr = h5.attributes()
FillValue = attr['_FillValue']
scale_factor = attr['scale_factor']
valid_range = attr['valid_range']
data = h5.get()
data_c = data * scale_factor
data_c[data==FillValue] = np.nan
data_c = np.maximum(data_c, 0.0)
data_c = np.minimum(data_c, 1.0)
return data_c
#select
#b01 = MOD09Q1.select('sur_refl_b01')
b02 = MOD09Q1.select('sur_refl_b02')
b03 = MOD09A1.select('sur_refl_b03')
b04 = MOD09A1.select('sur_refl_b04')
b05 = MOD09A1.select('sur_refl_b05')
b06 = MOD09A1.select('sur_refl_b06')
b07 = MOD09A1.select('sur_refl_b07')
T_sup = MOD11A2.select('sur_refl_b07')
#b07 = MOD09A1.select('sur_refl_b07')
#b07 = MOD09A1.select('sur_refl_b07')
band02 = calibra(b02)
In [10]: b01.attributes()
Out[10]:
{'calibrated_nt': 5,
'valid_range': [-100, 16000],
'units': 'reflectance',
'add_offset': 0.0,
'scale_factor_err': 0.0,
'long_name': 'Surface_reflectance_for_band_1',
'_FillValue': -28672,
'add_offset_err': 0.0,
'scale_factor': 0.0001}
更新
import os
import re
import matplotlib as mpl
import matplotlib.pyplot as plt
#from mpl_toolkits.basemap import Basemap
#import mpl_toolkits.basemap.pyproj as pyproj
import numpy as np
from pyhdf.SD import SD, SDC
import gdal
USE_GDAL = False
# Identify the data field.
DATAFIELD_NAME = 'sur_refl_b01'
GRID_NAME = 'MOD_Grid_500m_Surface_Reflectance'
from pyhdf.SD import SD, SDC
hdf = SD(FILE_NAME, SDC.READ)
# Read dataset.
data2D = hdf.select(DATAFIELD_NAME)
data = data2D[:,:].astype(np.float64)
# Read global attribute.
fattrs = hdf.attributes(full=1)
ga = fattrs["StructMetadata.0"]
gridmeta = ga[0]
# Construct the grid. The needed information is in a global attribute
# called 'StructMetadata.0'. Use regular expressions to tease out the
# extents of the grid.
ul_regex = re.compile(r'''UpperLeftPointMtrs=\(
(?P<upper_left_x>[+-]?\d+\.\d+)
,
(?P<upper_left_y>[+-]?\d+\.\d+)
\)''', re.VERBOSE)
match = ul_regex.search(gridmeta)
x0 = np.float(match.group('upper_left_x'))
y0 = np.float(match.group('upper_left_y'))
lr_regex = re.compile(r'''LowerRightMtrs=\(
(?P<lower_right_x>[+-]?\d+\.\d+)
,
(?P<lower_right_y>[+-]?\d+\.\d+)
\)''', re.VERBOSE)
match = lr_regex.search(gridmeta)
x1 = np.float(match.group('lower_right_x'))
y1 = np.float(match.group('lower_right_y'))
ny, nx = data.shape
xinc = (x1 - x0) / nx
yinc = (y1 - y0) / ny
x = np.linspace(x0, x0 + xinc*nx, nx)
y = np.linspace(y0, y0 + yinc*ny, ny)
xv, yv = np.meshgrid(x, y)
# In basemap, the sinusoidal projection is global, so we won't use it.
# Instead we'll convert the grid back to lat/lons.
sinu = pyproj.Proj("+proj=sinu +R=6371007.181 +nadgrids=@null +wktext")
wgs84 = pyproj.Proj("+init=EPSG:4326")
lon, lat= pyproj.transform(sinu, wgs84, xv, yv)
Out[14]: lat
array([[-30. , -30. , -30. , ..., -30. ,
-30. , -30. ],
[-30.0041684 , -30.0041684 , -30.0041684 , ..., -30.0041684 ,
-30.0041684 , -30.0041684 ],
[-30.0083368 , -30.0083368 , -30.0083368 , ..., -30.0083368 ,
-30.0083368 , -30.0083368 ],
...,
[-39.99166319, -39.99166319, -39.99166319, ..., -39.99166319,
-39.99166319, -39.99166319],
[-39.99583159, -39.99583159, -39.99583159, ..., -39.99583159,
-39.99583159, -39.99583159],
[-40. , -40. , -40. , ..., -40. ,
-40. , -40. ]])
Out[15]: lon
array([[-57.73502691, -57.73021365, -57.7254004 , ..., -46.19764805,
-46.19283479, -46.18802153],
[-57.73745225, -57.73263879, -57.72782533, ..., -46.19958872,
-46.19477526, -46.1899618 ],
[-57.73987809, -57.73506443, -57.73025076, ..., -46.2015298 ,
-46.19671613, -46.19190247],
...,
[-65.26239707, -65.25695627, -65.25151547, ..., -52.22079926,
-52.21535845, -52.20991765],
[-65.26638035, -65.26093921, -65.25549808, ..., -52.22398654,
-52.21854541, -52.21310428],
[-65.27036446, -65.26492299, -65.25948153, ..., -52.22717449,
-52.22173303, -52.21629157]])
纬度和经度边界作为大量字符串的一部分存储在文件元数据中。您可以访问与类似的完整字符串,特别是调用ArchiveMetadata.0文件属性:
all\u metadata=indata.attributes()[“ArchiveMetadata.0”]
您需要分析结果字符串以获得NORTHBOUNDINGCOORDINATE、SOUTHBOUNDINGCOORDINATE、EASTBOUNDINGCOORDINATE和WESTBOUNDINGCOORDINATE的值。模块将能够做到这一点。一旦你有了这些,你可以使用它们来创建1D纬度和经度阵列,如果你需要它们是2D来匹配你的数据,你可以创建一个。对于那些希望下载这些数据而不需要帐户的人,也可以通过NASA LAADS存档在上获得。你能更具体地介绍一下你的用例吗?您是否需要将1km MODIS地理定位插值为500m以用于此数据?或者您正在创建一个500米的全球网格?另外,您使用集合5数据(.005.在您的文件名中)而不是集合6是否有特定的原因?谢谢您的网站。我下面的文章使用的是MODIS第5版。我想做1km的lat/lon,从站点获取lat和lon,检查数据是否正确,然后进行验证。谢谢。那么,我是否正确理解您希望从HDF网格属性中获取纬度/经度边界框,然后使用这些属性创建与数据形状相同的纬度和经度数组?是的,我希望这样做。我创建了一个带纬度的数组,另一个带经度的数组,但我无法加入meshgrid。我尝试使用.loc[]表示纬度和经度,但它在数组中不起作用,仅在df.numpy中起作用。其中是用于根据numpy数组中的某些条件查找索引的函数是的,但我需要获取所需纬度和经度的数字。在np中,我捕捉到的是分开的纬度和经度。是的,这些索引给出了与这些纬度/经度相对应的数据的x和y像素地址。我很高兴你能在数据框中工作。祝你分析顺利!我不能使用np.where。我需要做的是访问纬度-30.275,经度等于-53.147。但是我有一个带有lat的数组和另一个带有lon的数组,两个带有(2400)。然后用数据访问我的数组,找出像素值。但我不能。谢谢