python调用HEG工具批量处理MODIS数据的方法及注意事项


Posted in Python onFebruary 18, 2020

下面的代码主要用于使用python语言调用NASA官方的MODIS处理工具HEG进行投影坐标转换与重采样批量处理
主要参考

  • HEG的用户手册:https://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEG215/EED2-TP-030_Rev01_HEG_UsersGuide_2.15.pdf
  • HEG批处理帮助:https://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEG_Batch_job_Help.htm

主要的注意事项如下:

  1. 首先按照官方指南安装HEG工具,具体安装步骤可参考我的上篇博客:https://www.cnblogs.com/yhpan/p/11298595.html
  2. 根据HEG用户手册批量生成批处理参数文件,可以在HEG工具中生成一个文件,拿来自己改改用用
  3. 具体调用哪一个工具,参数文件如何写,请一定仔细阅读用户手册,东西全都在上面。一般常用的是resample.exe和swtif.exe,如果实在无法判断可以先用HEG的GUI处理一个自己的数据,保存一个prm文件,然后根据这个文件中的参数,对照着用户手册一个一个的找,就可以了。
  4. 生成参数文件写入时一定要注意,设定换行符为‘\n',fo=open(prmfilename,'w',newline='\n'),否则由于在windows系统下默认换行符为‘\r\n',程序无法运行成功

下面是源码分享

# -*- coding: utf-8 -*-
"""
Created on Sun Feb 16 11:27:19 2020
调用HEG相关工具批处理MODIS数据,主要完成投影坐标转换与重采样
@author: pan
"""
import os

# 设置HEG相关环境变量
os.environ['MRTDATADIR']='D:/MyApps/HEG/HEG_Win/data'
os.environ['PGSHOME']='D:/MyApps/HEG/HEG_Win/TOOLKIT_MTD'
os.environ['MRTBINDIR']='D:/MyApps/HEG/HEG_Win/bin'

# 设置HEG的bin路径
hegpath = 'D:/MyApps/HEG/HEG_Win/bin'
# 指定处理模块的可执行程序文件路径,此处采用resample.exe,可以根据具体的处理问题设置
hegdo = os.path.join(hegpath, 'resample.exe')
hegdo = hegdo.replace('\\', '/') # 全路径以“/”连接

# 指定输入数据的路径
inpath = r'C:\Users\pan\Desktop\Py_ex\data\hdf'
inpath = inpath.replace('\\', '/')
# 指定输出数据的路径
outpath = r'C:\Users\pan\Desktop\Py_ex\data\hdf\out'
outpath = outpath.replace('\\', '/')
# os.chdir(inpath) #改变当前工作目录到输入数据目录

# 获取当前文件夹下的所有hdf文件
allfiles = os.listdir(inpath)
allhdffiles = []
for eachfile in allfiles:
  if os.path.splitext(eachfile)[1] =='.hdf':
    allhdffiles.append(eachfile)
print('--'*20)
print('文件数量为:', len(allhdffiles),',所有hdf文件如下')
print(' '+'\n '.join(allhdffiles))
print('--'*20)

# prm文件设置模块,需要首先在HEG工具中生成一个参考的prm文件,示例如下
# 设置prm文件存储路径
prmpath = r"C:\Users\pan\Desktop\Py_ex\data\hdf\prm"
prmpath = prmpath.replace('\\', '/')
for eachhdf in allhdffiles:
  prm=['NUM_RUNS = 1\n',
   'BEGIN\n',
   'INPUT_FILENAME = ' + inpath+'/'+eachhdf+'\n',
   'OBJECT_NAME = MODIS_Grid_8Day_1km_LST|\n',
   'FIELD_NAME = LST_Day_1km\n',
   'BAND_NUMBER = 1\n','SPATIAL_SUBSET_UL_CORNER = ( 90.0 -180.0 )\n',
   'SPATIAL_SUBSET_LR_CORNER = ( -90.0 180 )\n',
   'RESAMPLING_TYPE = BI\n',
   'OUTPUT_PROJECTION_TYPE = ALBERS\n',
   'ELLIPSOID_CODE = WGS84\n',
   'OUTPUT_PROJECTION_PARAMETERS = ( 0.0 0.0 25.0 47.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 )\n',
   'OUTPUT_PIXEL_SIZE = 500.0\n',
   'OUTPUT_FILENAME = ' + outpath+'/'+eachhdf+'_out.tif\n',
   'OUTPUT_TYPE = GEO\n',
   'END\n']
  prmfilename=prmpath +'/'+ eachhdf+'.prm'
  prmfilename=prmfilename.replace('\\', '/')
  #这里一定要注意,设定换行符为‘\n',否则由于在windows系统下默认换行符为‘\r\n',则无法运行成功
  fo=open(prmfilename,'w',newline='\n')
  fo.writelines(prm)
  fo.close()

for eachhdf in allhdffiles:
  prmfilepath=prmpath +'\\'+ eachhdf + '.prm'
  prmfilepath=prmfilepath.replace('\\', '/')
  try:
    resamplefiles = '{0} -P {1}'.format(hegdo, prmfilepath)
    os.system(resamplefiles)    
    print(eachhdf + ' has finished')
  except:
    # 提示错误信息
    print(eachhdf + 'was wrong')

总结

以上所述是小编给大家介绍的python调用HEG工具批量处理MODIS数据的方法及注意事项,希望对大家有所帮助!

Python 相关文章推荐
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
浅析Python 条件控制语句
Jul 15 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 Python
Python turtle编写简单的球类小游戏
Mar 31 Python
将pytorch转成longtensor的简单方法
Feb 18 #Python
python实现查找所有程序的安装信息
Feb 18 #Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 #Python
Pytorch mask_select 函数的用法详解
Feb 18 #Python
pytorch masked_fill报错的解决
Feb 18 #Python
python分别打包出32位和64位应用程序
Feb 18 #Python
pandas和spark dataframe互相转换实例详解
Feb 18 #Python
You might like
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
PHP简单日历实现方法
2016/07/20 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
浅谈$('div a') 与$('div>a')的区别
2016/07/18 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
python统计中文字符数量的两种方法
2019/01/31 Python
django 类视图的使用方法详解
2019/07/24 Python
Django实现基于类的分页功能
2019/10/31 Python
详解python中docx库的安装过程
2019/11/08 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
我的求职择业计划书
2014/04/04 职场文书
二年级评语大全
2014/04/23 职场文书
爱我中华演讲稿
2014/05/20 职场文书
捐款感谢信
2015/01/20 职场文书
中秋节慰问信
2015/02/15 职场文书
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis