相关文章推荐
打篮球的铁链  ·  https证书:该证书并非来自可信的授权中心 ...·  1 年前    · 
月球上的匕首  ·  go get报错:fatal: could ...·  2 年前    · 
大气的电池  ·  CMake入门笔记系列(一):CMake编译 ...·  2 年前    · 
想表白的四季豆  ·  python处理gz压缩文件,解压并转化为j ...·  2 年前    · 
Code  ›  基于GDAL对MODIS数据进行重投影开发者社区
安全气囊 大数据 modis
https://cloud.tencent.com/developer/article/2185398
热心肠的烈酒
2 年前
作者头像
GIS与遥感开发平台
0 篇文章

基于GDAL对MODIS数据进行重投影

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > GIS与遥感开发平台 > 基于GDAL对MODIS数据进行重投影

基于GDAL对MODIS数据进行重投影

作者头像
GIS与遥感开发平台
发布 于 2022-12-03 09:55:56
867 0
发布 于 2022-12-03 09:55:56
举报

MODIS数据进行重投影

由于MODIS数据采用的是SIN正弦投影 ,我们平常一般都是采用地理坐标,一般我们都会对MODIS数据进行重投影。MODIS Reprojection Tools(MRT)是专门用来对MODIS数据进行处理的,但是总感觉这软件操作起来麻烦。 所以今天我们就介绍一下两种基于Python中的GDAL对MODIS进行重投影的方法。

gdal.Warp

gdal.Warp是一个很好用的函数们可以用来重投影、影像裁剪等。用它对MODIS数据进行重投影很简单。

from osgeo import gdal
import numpy as np
from osgeo import osr
#使用gdal.Warp对MODIS数据进行重投影。
modis_lai=gdal.Open(r'D:\DATA\MODIS\LAI\MCD15A3H.A2020181.h13v11.006.2020188204620.hdf')
subdataset_one = modis_lai.GetSubDatasets()[0][0] # 第一个子数据集合
gdal.Warp(r'D:\code\reprojection.tif', subdataset_one, dstSRS='EPSG:4326')

gdal.ReprojectImage

gdal.ReprojectImage需要我们自己计算转换参数。

from osgeo import gdal
import numpy as np
from osgeo import osr
#使用gdal.Warp对MODIS数据进行重投影。
modis_lai=gdal.Open(r'D:\DATA\MODIS\LAI\MCD15A3H.A2020181.h13v11.006.2020188204620.hdf')
subdataset_one = modis_lai.GetSubDatasets()[0][0] # 第一个子数据集合
def reproject(src_file, dst_file, p_width, p_height, epsg_to):
    :param src_file: 输入文件
    :param dst_file: 输出文件
    :param p_width: 输出图像像素宽度
    :param p_height: 输出图像像素高度
    :param epsg_to: 输出图像EPSG坐标代码
    :return:
    # 首先,读取输入数据,然后获得输入数据的投影,放射变换参数,以及图像宽高等信息
    src_ds = gdal.Open(src_file)
    src_srs = osr.SpatialReference()
    src_srs.ImportFromWkt(src_ds.GetProjection())
    srs_trans = src_ds.GetGeoTransform()
    x_size = src_ds.RasterXSize
    y_size = src_ds.RasterYSize
    # 获得输出数据的投影,建立两个投影直接的转换关系
    dst_srs = osr.SpatialReference()
    dst_srs.ImportFromEPSG(epsg_to)
    tx = osr.CoordinateTransformation(src_srs, dst_srs)
    # 计算输出图像四个角点的坐标
    (uly, ulx, _) = tx.TransformPoint(srs_trans[0], srs_trans[3])
    (ury, urx, _) = tx.TransformPoint(srs_trans[0] + srs_trans[1] * x_size, srs_trans[3])
    (lly, llx, _) = tx.TransformPoint(srs_trans[0], srs_trans[3] + srs_trans[5] * y_size)
    (lry, lrx, _) = tx.TransformPoint(srs_trans[0] + srs_trans[1] * x_size + srs_trans[2] * y_size,
                                      srs_trans[3] + srs_trans[4] * x_size + srs_trans[5] * y_size)
    min_x = min(ulx, urx, llx, lrx)
    max_x = max(ulx, urx, llx, lrx)
    min_y = min(uly, ury, lly, lry)
    max_y = max(uly, ury, lly, lry)
    # 创建输出图像,需要计算输出图像的尺寸(重投影以后图像的尺寸会发生变化)
    driver = gdal.GetDriverByName('GTiff')
    dst_ds = driver.Create(dst_file,
                           int((max_x - min_x) / p_width),
                           int((max_y - min_y) / p_height),
                           1, gdal.GDT_Float32)
    dst_trans = (min_x, p_width, srs_trans[2],
                 max_y, srs_trans[4], -p_height)
    # 设置GeoTransform和Projection信息
    dst_ds.SetGeoTransform(dst_trans)
    dst_ds.SetProjection(dst_srs.ExportToWkt())
    # 进行投影转换
    gdal.ReprojectImage(src_ds, dst_ds,
                        src_srs.ExportToWkt(), dst_srs.ExportToWkt(),
                        gdal.GRA_Bilinear)
    dst_ds.GetRasterBand(1).SetNoDataValue(0)  # 设置NoData值
    dst_ds.FlushCache()
    del src_ds
 
推荐文章
打篮球的铁链  ·  https证书:该证书并非来自可信的授权中心_问答-阿里云开发者社区
1 年前
月球上的匕首  ·  go get报错:fatal: could not read Username ... terminal prompts disabled_fatal: could not read username for [filtered] term_jeevi的博客-
2 年前
大气的电池  ·  CMake入门笔记系列(一):CMake编译过程详解 | Micro CMake for C++ - 知乎
2 年前
想表白的四季豆  ·  python处理gz压缩文件,解压并转化为json_大蛇王的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号