Python+GDAL 计算图像四个角的经纬度

本文介绍如何利用Python和GDAL库,在WGS UTM投影坐标系下计算图像四个角的投影坐标,并转换为WGS1984格式的经纬度坐标。通过GetGeoTransform方法获取地理信息,然后进行坐标转换。内容包括代码示例和验证过程。

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

本文参考了文末的三个博客并进行修改和总结,在ArcGIS中验证了结果

本文使用的图像是基于WGS UTM投影坐标系,计算出的结果为投影坐标(M),需要将结果转为WGS1984坐标系才可得到经纬度坐标

首先输出图像的投影信息,查看图像的投影格式

# 输出图像的投影信息
print(ds.GetProjectionRef())

输出结果如下所示,是UTM投影格式,如果是WGS1984地理坐标系算出来应该直接是经纬度坐标,不用转换

PROJCS["WGS 84 / UTM zone 44N",
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",81],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
UNIT["metre",1,AUTHORITY["EPSG","9001"]],
AXIS["Easting",EAST],
AXIS["Northing",NORTH],
AUTHORITY["EPSG","32644"]]

1.首先计算图像四个角的投影坐标,代码如下

GetGeoTransform方法可以读取地理信息,返回六个参数

GT(0) 左上像素左上角的x坐标。
GT(1) w-e像素分辨率/像素宽度。
GT(2) 行旋转(通常为零)。
GT(3) 左上像素左上角的y坐标。
GT(4) 列旋转(通常为零)。
GT(5) n-s像素分辨率/像素高度(北上图像为负值)

from osgeo import gdal

def project_xy(tif_path):
    dataset = gdal.Open(tif_path)
    geo_information = dataset.GetGeoTransform()
    col = dataset.RasterXSize  # 行数
    row = dataset.RasterYSize  # 列数
    # band = dataset.RasterCount  # 波段

    # 左上角经纬度方向投影坐标
    top_left_corner_lon = geo_information[0]
    top_left_corner_lat = geo_information[3]

    # 左下角经纬度方向投影坐标
    bottom_left_corner_lon = geo_information[0] + row * geo_information[2]
    bottom_left_corner_lat = geo_information[3] + row * geo_information[5]

    # 右上角经纬度方向投影坐标
    top_right_corner_lon = geo_information[0] + col * geo_information[1]
    top_right_corner_lat = geo_information[3] + col * geo_information[4]

    # 右下角经纬度方向投影坐标
    bottom_right_corner_lon = geo_information[0] + col * geo_information[1] + row * geo_information[2
GDAL 4.0版本中,从遥感图像数据获取左上的地理坐标通常需要以下几个步骤: 1. **加载数据**: 使用`gdal.Open()`函数打开遥感图像文件,例如: ```python from osgeo import gdal raster = gdal.Open("path_to_your_raster.tif") ``` 2. **获取GeoTransform**: `GetGeoTransform()`函数会返回6个值,用于描述栅格数据的地理空间变换。如前所述,你需要它们来构建坐标转换矩阵。例如: ```python transform = raster.GetGeoTransform() ``` 3. **创建左上坐标**: 根据`transform`数组,可以推算出左上的像素坐标: ```python x_pixel, y_pixel = 0, 0 lon, lat, _ = transform * (x_pixel, y_pixel, 1) ``` 4. **转换到地理坐标**: 这里假设已经知道了投影信息,因为`GetGeoTransform`并未包含完整的地理坐标系信息。通常需要额外读取`.prj`文件或通过`raster.GetProjectionRef()`获取。如果你使用的是UTM投影,需要加上UTM带号;如果是WGS84,则不需要额外操作。如果投影复杂,可能需要使用GDAL的坐标系统转换函数`gdal.Transformer.TransformPoints()`。 5. **处理精度**: 获得的结果可能是浮数,可能需要四舍五入或格式化成所需的精度。 完整示例: ```python import numpy as np from osgeo import gdal # ... (以上部分) # 获取投影信息 projection = raster.GetProjectionRef() # 如果是UTM投影,添加带号 utm_zone = extract_UTM_zone_from_projection(projection) projection = f'+proj=utm +zone={utm_zone} +datum=WGS84' # 创建坐标转换器 transformer = osr.CoordinateTransformation(raster.GetSpatialRef(), osr.SpatialReference(projection)) # 转换像素坐标到地理坐标 geocoords = transformer.TransformPoints([(x_pixel, y_pixel)]) # 精确到所需经纬度精度 lat, lon = round(geocoords[0][1], 6), round(geocoords[0][0], 6) print(f"左上坐标:{lon}, {lat}") ``` 注意:这个示例假设你知道如何提取UTM带号以及处理投影信息。实际应用中,可能需要根据具体的数据和需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值