Python 3.x 如何使用python3在MODIS文件中创建lat和lon

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.

我有一些关于某个纬度和经度的解释,但在MODIS中,我既没有纬度也没有经度。我在互联网上漫游以创建纬度和经度,然后计算我的工作需要什么。我被告知最好的程序是python,我正在使用python3

我在这个网站上下载了数据(),更确切地说是这个(),帐户是必需的

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)。然后用数据访问我的数组,找出像素值。但我不能。谢谢