Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >栅格数据投影转换

栅格数据投影转换

作者头像
卡尔曼和玻尔兹曼谁曼
发布于 2019-01-22 01:43:03
发布于 2019-01-22 01:43:03
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

使用GDAL提供的命令行工具进行转换

GDAL提供了gdalwarp命令可以方便地让我们进行影像拼接,重投影,裁剪,格式转换等功能

比如,我们需要将MODIS数据的Sinusoidal投影转为UTM投影,我们可以这样操作。

我需要转换的地区位于UTM的49度带内,我查看了一下其EPSG的编码为:EPSG:32649(WGS 84 / UTM zone 49N)

注:推荐大家一个网站,可以查阅各种投影的定义:http://spatialreference.org

然后,终端中执行如下命令:

gdalinfo MOD09A1.A2017361.h28v06.006.2018005034659.hdf (用于查看MODIS数据中的波段名称与地址,这里我们只转换第一波段)

gdalwarp -t_srs EPSG:32649 HDF4_EOS:EOS_GRID:"MOD09A1.A2017361.h28v06.006.2018005034659.hdf":MOD_Grid_500m_Surface_Reflectance:sur_refl_b01 MODSI_WARP_32649.tif-t_srs参数用于指定输出投影信息,可以是EPSG,或者OGC WKT,或者PROJ4格式,后面分别是输入数据和输出数据文件名)

使用代码进行转换

使用命令行转换,当然有两种方法啦:

第一,直接在代码中调用命令行工具的接口(比较懒的人,像我,当然直接用第一种啦,有现成的工具为什么不用);

第二,自己做投影转换之后的坐标计算,主要是计算重投影之后的GeoTransform参数,有了GeoTransform参数以及投影的定义,我们就可以通过SetGeoTransform()SetProjection()投影转换了.

下面我给出具体的实现代码:

第一种方法直接调用gdal.Warp()方法,该方法其实就是对gdalwarp命令的封装,第一个参数是输出文件,第二个参数是输入文件或者输入的Dataset,后面的都是可选参数(dstSRS参数指定输出投影)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from osgeo import gdal

root_ds = gdal.Open('MOD09A1.A2017361.h28v06.006.2018005034659.hdf')
# 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息
# tuple中的第一个元素描述的是数据子集的全路径
ds_list = root_ds.GetSubDatasets()

# 取出第1个数据子集(MODIS反射率产品的第一个波段)进行转换
# 第一个参数是输出数据,第二个参数是输入数据,后面可以跟多个可选项
gdal.Warp('reprojection.tif', ds_list[0][0], dstSRS='EPSG:32649')

# 关闭数据集
root_ds = None

在介绍第二种方法之前,我们有必要回忆一下之前说过的GDAL反射变换的六参数模型:

放射变换使用如下的公式表示栅格图上坐标和地理坐标的关系:

Xgeo=GT(0)+Xpixel∗GT(1)+Yline∗GT(2)Ygeo=GT(3)+Xpixel∗GT(4)+Yline∗GT(5)Xgeo=GT(0)+Xpixel∗GT(1)+Yline∗GT(2)Ygeo=GT(3)+Xpixel∗GT(4)+Yline∗GT(5)

\begin{matrix} X_{geo} = GT(0) + X_{pixel} * GT(1) + Y_{line} * GT(2) \\ Y_{geo} = GT(3) + X_{pixel} * GT(4) + Y_{line} * GT(5) \\ \end{matrix} (Xge0Xge0X_{ge0}, Yge0Yge0Y_{ge0})表示对应于图上坐标(XpixelXpixelX_{pixel}, YlineYlineY_{line})的实际地理坐标。对一个上北下南的图像,GT(2)和GT(4)等于0, GT(1)是像元的宽度, GT(5)是像元的高度的相反数。(GT(0),GT(3))坐标对表示左上角像元的左上角坐标。

通过这个放射变换,我们可以得到图上所有像元对应的地理坐标。

好了,所以我们需要计算对于上面的六参数,我们主要需要计算重投影以后图像左上角的坐标(最小的X坐标值和最大的Y坐标值),这个转换我们可以通过osr.CoordinateTransformation类进行,下面给出实现代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from osgeo import gdal
from osgeo import osr

# root_ds = gdal.Open('/Users/tanzhenyu/Resources/DataWare/MODIS/MOD09A1.A2017361.h28v06.006.2018005034659.hdf')
# # 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息
# # tuple中的第一个元素描述的是数据子集的全路径
# ds_list = root_ds.GetSubDatasets()
#
# # 取出第1个数据子集(MODIS反射率产品的第一个波段)进行转换
# # 第一个参数是输出数据,第二个参数是输入数据,后面可以跟多个可选项
# gdal.Warp('reprojection.tif', ds_list[0][0], dstSRS='EPSG:32649')
#
# # 关闭数据集
# root_ds = None


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
    d_type = src_ds.GetRasterBand(1).DataType

    # 获得输出数据的投影,建立两个投影直接的转换关系
    dst_srs = osr.SpatialReference()
    dst_srs.ImportFromEPSG(epsg_to)
    tx = osr.CoordinateTransformation(src_srs, dst_srs)

    # 计算输出图像四个角点的坐标
    (ulx, uly, _) = tx.TransformPoint(srs_trans[0], srs_trans[3])
    (urx, ury, _) = tx.TransformPoint(srs_trans[0] + srs_trans[1] * x_size, srs_trans[3])
    (llx, lly, _) = tx.TransformPoint(srs_trans[0], srs_trans[3] + srs_trans[5] * y_size)
    (lrx, lry, _) = 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, d_type)
    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
    del dst_ds


if __name__ == '__main__':
    src_file = 'HDF4_EOS:EOS_GRID:"MOD09A1.A2017361.h28v06.006.2018005034659.hdf":MOD_Grid_500m_Surface_Reflectance:sur_refl_b01'
    dst_file = 'reprojection.tif'
    reproject(src_file, dst_file, 450, 450, 32649)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于GDAL对MODIS数据进行重投影
gdal.Warp是一个很好用的函数们可以用来重投影、影像裁剪等。用它对MODIS数据进行重投影很简单。
GIS与遥感开发平台
2022/12/03
2.1K0
栅格数据裁剪
在进行遥感影像处理的时候,我们经常需要进行裁剪的工作,来看看如何使用GDAL工具进行这项操作吧!
卡尔曼和玻尔兹曼谁曼
2019/03/23
2.5K0
矢量数据投影转换
接着上一篇博文中,我们得到了WGS84坐标系下的中国省区图,而我们一般中国地图中使用的是割圆锥投影。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.9K0
GIS:GDAL实现对栅格文件的转换
我们常常在图像处理过程中遇到不同软件或程序要求输入的图像格式不同(有些程序或软件支持的数据格式不是常用的Tiff,Img等数据格式),因此需要对不同的数据格式相互进行转换。 我这里以GTiff(.tif)数据转换为PCRaster(.map)数据为例。首先需要安装GDAL,我这里是在Anaconda上直接安装了基于Python的GDAL,可以在下面网站自行下载,https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal 例如下面对应的就是Python3.8版本的GDAL。
Freedom123
2024/03/29
3230
python+GDAL+numpy,点图层提取栅格像元数据
这部强调:投影坐标一定要一致(shp和栅格)!!!投影坐标一定要一致(shp和栅格)!!!投影坐标一定要一致(shp和栅格)!!!CRS.from_epsg('32650')!CRS.from_epsg('32650')!!CRS.from_epsg('32650')!!
一个有趣的灵魂W
2020/09/15
1.7K0
python+GDAL+numpy,点图层提取栅格像元数据
带你玩转 3D 检测和分割(二):核心组件分析之坐标系和 Box
我们在前文玩转 MMDetection3D (一)中介绍了整个框架的大致流程,从这篇文章开始我们将会带来 MMDetection3D 中各种核心组件的解析,而在 3D 检测中最重要的核心组件之一就是坐标系和 Box 。
OpenMMLab 官方账号
2022/04/08
2.4K0
带你玩转 3D 检测和分割(二):核心组件分析之坐标系和 Box
Python | GDAL处理影像
注意读取数据的数组下标不要越界!GDAL并不会自动帮你处理下标越界的问题,它只会报错。因此特别当你想用部分读取的方式处理一个很大的文件时,对边界的处理需要你特别的注意,必须正好读完不能越界也不能少读。
GIS与遥感开发平台
2022/04/29
4.6K0
Python | GDAL处理影像
利用gdal、rasterio将modis文件进行格式转换、投影转换
modis的hdf文件在存储上有优势,但是在实际使用过程中存在一定的弊端。例如本次重点讲解的NDVI-16D-1km、MAIAC-1D-1km两类文件,其中maiac的文件在aod属性中包含4个波段的文件,需要将4个波段最大化的利用起来。而ndvi文件则较为简单只需要把hdf文件中对应部分取用即可。
一个有趣的灵魂W
2020/09/15
2.1K0
利用gdal、rasterio将modis文件进行格式转换、投影转换
MOD043km的hdf数据转为tif
gdal.open(r'D:/Thesis/ML/modis3km/MOD04_3K.A2018001.0320.061.2018003202214.hdf')
一个有趣的灵魂W
2020/09/15
2K0
MOD043km的hdf数据转为tif
大栅格数据如何更快运算
这两周我在使用python进行大量的栅格数据的运算,在运算过程中遇到了数据量超级大但算力不足的问题。通过这两周的探索,也慢慢找到了一些加快栅格数据计算的方法,和读者分享。
自学气象人
2023/06/21
4040
大栅格数据如何更快运算
使用GDAL进行影像投影坐标、地理坐标、图上坐标的转换
我使用GDAL库写了四个函数分别进行投影坐标与地理坐标(经纬度)之间的转换,投影坐标和图上坐标(行列号)之间的转换。有需要的朋友可以参考。 直接上代码吧,因为代码很简单(Python版本)。
卡尔曼和玻尔兹曼谁曼
2019/01/22
8.8K0
使用GDAL进行影像投影坐标、地理坐标、图上坐标的转换
栅格数据创建与保存
使用Python进行栅格数据处理,很多时候,我们会将GDAL的Dataset对象转化为NumPy的ndarray对象,这样我们可以使用很多通用的Python库对数据进行处理,然后再借助GDAL库将数据写回到文件。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.7K0
使用Rasterio读取栅格数据
有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了。不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点。
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.1K0
GPM 降雨量数据处理 -R(坐标系转换)
今天给大家介绍下,R处理NASA下载的降雨量数据 在进行环境数据分析时候,经常需要用到降雨量的信息,而NASA提供了每年,每个月甚至每天的降雨量数据。 如何下载NASA降雨量数据,见此链接。
Jamesjin63
2022/10/25
1.2K0
GPM 降雨量数据处理 -R(坐标系转换)
栅格数据格式转换
我们可以在终端中使用gdal --formats命令查看安装的GDAL库支持的栅格数据格式
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.8K0
Swath数据几何校正(Python)
可以看出直接把这个数据放到ArcGIS里面,已经偏的不行了。这景数据的实际覆盖范围其实是我国的西南部以及部分东南亚区域。
GIS与遥感开发平台
2023/03/08
9730
Swath数据几何校正(Python)
读取HDF或者NetCDF格式的栅格数据
HDF(Hierarchical Data Format)由NCSA(National Center for Supercomputing Applications)设计提出,官方对其定义是:HDF5 is a unique technology suite that makes possible the management of extremely large and complex data collections.
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.8K0
使用Rasterio做投影变换
在之前GDAL系列文章中的《栅格数据投影转换》提到过,做投影转换最重要的是计算数据在目标空间参考系统中的放射变换参数(GeoTransform)和图像的尺寸(行数和列数)。而且我们使用GDAL基本库自己写代码进行了计算。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.3K0
地科Python数据分析案例 | 绘制黄土高原局部区域的沟壑覆盖度分析图
黄土高原位于中国中部偏北部,为中国四大高原之一。黄土高原是世界上水土流失最严重和生态环境最脆弱的地区之一,除许多石质山地外,大部分区域为厚层黄土覆盖,经流水长期强烈侵蚀,逐渐形成千沟万壑、地形支离破碎的特殊自然景观。
陈南GISer
2023/11/03
1.1K0
地科Python数据分析案例 | 绘制黄土高原局部区域的沟壑覆盖度分析图
Basemap系列教程:使用 shapefiles 文件裁剪栅格
此例使用了STRM的海拔数据。只要了解一下网站设置,很容易使用 ,当然也可以直接下载数据[注1-2]。
bugsuse
2020/04/20
1.9K1
推荐阅读
相关推荐
基于GDAL对MODIS数据进行重投影
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验