【Python&RS】遥感影像的像素坐标转地理坐标(仿射变换)

文章介绍了如何利用Python的GDAL库和遥感影像的仿射地理变换参数,将像素坐标转换为地理或投影坐标。通过获取数据集的仿射地理变换参数,可以计算出像素位置对应的地理坐标,反之亦然。此外,代码示例展示了获取和使用这些参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

        Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数据格式,如常见的TIFF、ENVI、HFA、HDF4等。因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载、栅格转面等。

        本次介绍如何通过遥感影像的仿射地理变换参数将像素坐标转为地理/投影坐标,在ENVI或者ArcGIS中都是自动转换,所以你在点击影像的某一像元时,它就会显示对应的地理/投影坐标。但如果你想用Python去实现,就需要使用影像的放射地理参数。

一、获取仿射地理变换参数

        之前发布【Python&RS】GDAL计算遥感影像光谱指数(如NDVI、NDWI、EVI等)时就已经用过这部分代码,没啥好说的,就是获取影像的基本参数。代码中除了仿射地理变换参数其他没啥用,但我习惯全部输出。

def Get_data(filepath):
    """
    :param filepath: 输入影像的路径
    :return: 返回仿射地理变换参数
    """
    ds = gdal.Open(filepath)  # 打开数据集dataset
    ds_width = ds.RasterXSize  # 获取数据宽度
    ds_height = ds.RasterYSize  # 获取数据高度
    ds_bands = ds.RasterCount  # 获取波段数
    ds_geo = ds.GetGeoTransform()  # 获取仿射地理变换参数
    ds_prj = ds.GetProjection()  # 获取投影信息
    print("影像的宽度为:" + str(ds_width))
    print("影像的高度为:" + str(ds_height))
    print("仿射地理变换参数为:" + str(ds_geo))
    print("投影坐标系为:" + str(ds_prj))
    return ds_geo
    # data = ds.ReadAsArray(0, 0, ds_width, ds_height)  # 以数组的形式读取整个数据集

二、像素坐标转地理/投影坐标

        这里先介绍一下仿射地理变换参数(3497294, 0.1, 0.0, 3438148, 0.0, -0.1),这样大家可以更直观的明白代码的意思。

        0:图像左上角的X坐标
        1:图像东西方向分辨率
        2:旋转角度,如果图像北方朝上,该值为0
        3:图像左上角的Y坐标
        4:旋转角度,如果图像北方朝上,该值为0
        5:图像南北方向分辨率

def Pixel_Coordinate(x, y, ds_geo):
    """
    :param x: 输入x像素坐标
    :param y: 输入y像素坐标
    :param ds_geo: 输入仿射地理变换参数
    :return: 返回x,y的地理/投影坐标
    """
    x_geo = ds_geo[0]+ds_geo[1]*x + y*ds_geo[2]
    y_geo = ds_geo[3]+ds_geo[4]*x + y*ds_geo[5]
    print(x_geo, y_geo)
    return x_geo, y_geo

        从代码中我们可以看到使用仿射地理变换参数将像素坐标转成地理坐标时,就是将左上角的x,y值加上x,y的像素坐标乘以分辨率(即实际距离),然后再加上偏转就行了。这和我之前写的通过图片中心点地理坐标推算整张图片所有像素点地理坐标的原理是一样的,只不过这里的仿射地理变换参数是影像自带的,而之前写的【Python&GIS】根据像素坐标计算图片某点的地理/投影坐标中的偏转角度是自己算出来的。

三、地理/投影坐标转像素坐标

def Coordinate_Pixel(x_geo, y_geo, ds_geo):
    """
    :param x_geo: 输入x地理坐标
    :param y_geo: 输入y地理坐标
    :param ds_geo: 输入仿射地理变换参数
    :return: 返回x,y像素坐标
    """
    y = ((y_geo - ds_geo[3] - ds_geo[4] / ds_geo[1] * x_geo + ds_geo[4] / ds_geo[1] * ds_geo[
        0]) / (ds_geo[5] - ds_geo[4] / ds_geo[1] * ds_geo[2]))
    x = ((x_geo - ds_geo[0] - y * ds_geo[2]) / ds_geo[1])
    return int(x), int(y)

 本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

### 遥感图像畸变校正方法及工具 遥感图像的畸变通常由多种因素引起,包括传感器特性、大气效应以及地形起伏等。为了获得高质量的地理空间数据,需要对这些畸变进行校正。 #### 几何校正概述 几何校正是遥感图像处理中的重要环节之一,其目的是消除由于传感器姿态变化、地球曲率等因素引起的像元位置偏差。几何校正可以分为两大类:辐射校正和几何校正[^1]。对于遥感图像而言,几何校正主要涉及以下几个方面: 1. **投影变换** 投影变换用于将原始影像换到特定的地图投影坐标系下。这一过程中常用的工具有ENVI软件中的“Map Projection”功能模块。通过该模块可以选择不同的地图投影方式(如UTM、Albers等),并完成相应的重采样操作。 2. **正射校正** 正射校正是指通过对遥感影像施加地面高程信息来补偿因地形起伏造成的视差影响的过程。正如所提到的内容,在ENVI中实现正射校正时需指定地面控制点(GCPs),即带有三维坐标的参照物[X,Y,Z]。具体来说,用户可以通过手动选取或者加载已有的GCP文件来进行精确调整。 3. **多项式拟合法** 当采用Image-to-Map方式进行几何精校准时,可选用不同阶次(一般为一至三阶)的多项式函数描述输入图像与目标参考之间的关系。这种方法简单易行且适用范围广,但在复杂场景下的精度可能有限。 4. **RPC模型法** Rational Polynomial Coefficients (RPC) 是一种基于有理函数表达式的通用几何定位算法。相比传统依赖于大量实地测量得到的地控点方案,RPC技术仅需少量甚至无需额外采集外部辅助资料即可达到较高水平的位置匹配效果。目前许多商用平台都支持此选项作为高级别的自动化解决方案的一部分。 #### 常见工具介绍 除了上述提及的ENVI之外,还有其他一些广泛使用的GIS/RS软件也提供了强大的图像校正能力: - **ERDAS IMAGINE**: 它同样具备完整的从基础预处理到深入分析的功能集,并以其灵活多样的插件扩展机制著称; - **ArcGIS Pro with Spatial Analyst Extension**: 结合Esri自家开发的产品线优势,能够无缝衔接矢量栅格混合运算需求; - **QGIS + GRASS GIS Plugins**: 开源免费的选择适合预算紧张的研究人员探索开源生态系统的潜力; 无论选择哪种具体的实施路径和技术手段,都需要充分考虑项目实际条件约束比如可用资源数量质量状况等等要素综合评判后再做决定。 ```python # 示例代码展示如何读取GeoTIFF文件并应用仿射变换矩阵执行简单的平移缩放旋操作 from osgeo import gdal, ogr import numpy as np def apply_geometric_correction(input_file, output_file): dataset = gdal.Open(input_file) # 获取原图尺寸大小 cols = dataset.RasterXSize rows = dataset.RasterYSize # 创建新的空白图片对象准备写入结果数据 driver = gdal.GetDriverByName('GTiff') outRaster = driver.Create(output_file, cols, rows, 1, gdal.GDT_Float32) # 设置输出影像的空间参考系统(SRS)同源保持一致 geotransform = (-cols / 2., 0.5, 0, rows / 2., 0, -0.5) outRaster.SetGeoTransform(geotransform) srs = ogr.osr.SpatialReference() srs.ImportFromEPSG(4326) outRaster.SetProjection(srs.ExportToWms()) band = dataset.GetRasterBand(1).ReadAsArray().astype(np.float32) adjusted_band = perform_transformation(band) # 自定义变换逻辑待补充完善 outband = outRaster.GetRasterBand(1) outband.WriteArray(adjusted_band) del outRaster apply_geometric_correction("input_image.tif", "output_corrected_image.tif") ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RS迷途小书童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值