GDAL读取tif图片完成像素-经纬度的变换

本文介绍了如何使用GDAL库在Python中进行TIF文件中的像素点与WGS84坐标系之间的转换,以及如何从GPS坐标反向获取像素位置。代码示例展示了如何读取TIF文件并进行坐标转换操作。
摘要由CSDN通过智能技术生成

原理:

        TIF文件中包含像素点--WGS84坐标系的转换关系,以此可以换算到GPS坐标。

安装GDAL库:

        pip install osgeo

demo:
from osgeo import gdal

def uv2gps(u,v,raster):
    dataset = gdal.Open(raster)
    transform = dataset.GetGeoTransform()
    x_origin = transform[0]
    y_origin = transform[3]
    pixel_w = transform[1]
    pixel_h = transform[5]

    lat = x_origin + u * pixel_w
    lon = y_origin + v * pixel_h

    target = osr.SpatialReference()
    target.ImportFromEPSG(4326)

    transform = osr.CoordinateTransformation(dataset.GetSpatialRef(), target)
    lat, lon, _ = transform.TransformPoint(lat, lon, 0.0)

    return lat, lon


def gps2uv(lat, lon, raster):
    dataset = gdal.Open(raster)

    if dataset is None:
        print("Error: cannot open the raster dataset!")

    target_srs = osr.SpatialReference()
    target_srs.ImportFromEPSG(4326)

    transform = osr.CoordinateTransformation(target_srs, dataset.GetSpatialRef())
    raster_lat, raster_lon, _ = transform.TransformPoint(lat, lon, 0.0)
    geotransform = dataset.GetGeoTransform()

    u = int((raster_lat - geotransform[0]) / geotransform[1])
    v = int((raster_lon - geotransform[3]) / geotransform[5])

    return u, v

if __name__ == "__main__":
    u = 
    v = 
    lat = 
    lon = 

    ## 验证像素与GPS的对应关系
    raster = "path to tif"
    gps = uv2gps(u, v, raster)
    u, v = gps2uv(lat, lon, raster)
    print(gps)
    print(u, v)

注意:该代码只能读取包含地理信息的文件,倘若图片文件(比如JPG图片)中不包含像素到WGS84坐标系的转换,则无法使用改代码读取

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GDAL是一个开源的地理空间数据处理库,具有多种读取、写入、处理和分析地理空间数据的功能。读取一个tif文件中的任意一点高程值,可以使用GDAL中的RasterIO函数实现。 一般而言,读取tif文件中某一点的高程值需要知道该点的位置,即点的行列坐标。假设我们已经知道点的坐标位置,可以通过编写如下代码实现: 1. 导入需要的库 ```python import gdal import numpy as np ``` 2. 打开tif文件 ```python ds = gdal.Open('filename.tif') ``` 3. 获取tif文件中的高程数据 ```python band = ds.GetRasterBand(1) # 默认为第一波段 ``` 4. 定义需要查询的点的位置 ```python x = 100 # 列坐标 y = 50 # 行坐标 ``` 5. 读取该点高程值 ```python data = band.ReadAsArray(x, y, 1, 1) elevation = np.array(data)[0][0] ``` 以上代码中,第3步是获取tif文件中的高程数据,第4步定义了需要查询的点的位置,第5步是利用ReadAsArray函数读取该点的高程值,并将其存储在elevation变量中。 需要注意的是,上述代码针对的是单波段tif文件,如果是多波段文件,需要根据需要指定需要读取的波段。 ### 回答2: 在使用gdal读取tif文件中任意一点的高程值时,可以采用以下步骤: 1. 导入必要的Python库: ``` import gdal import numpy as np ``` 2. 打开tif文件和读取高程信息: ``` ds = gdal.Open('test.tif') band = ds.GetRasterBand(1) elevation = band.ReadAsArray().astype(np.float32) ``` 其中,'test.tif'是要读取tif文件路径,GetRasterBand(1)表示读取第一个波段的数据,astype(np.float32)将读取的数据类型转化为float32,以保证精度。 3. 获取tif文件的地理变换信息: ``` transform = ds.GetGeoTransform() ``` 地理变换信息包括图像左上角坐标、像元宽度和高度、像元旋转角度等,可以用来确定像素坐标和地理坐标之间的转换关系。 4. 定义查询点的坐标: ``` x, y = 500, 500 ``` 假设要查询的点的像素坐标为(500, 500)。 5. 将像素坐标转换为地理坐标: ``` x_geo = transform[0] + x * transform[1] + y * transform[2] y_geo = transform[3] + x * transform[4] + y * transform[5] ``` 根据地理变换信息和查询点的像素坐标计算出查询点的地理坐标。 6. 查询点的高程值: ``` elevation_val = elevation[y, x] ``` 根据查询点的像素坐标在读取的高程数据中获取高程值,其中y坐标在前,x坐标在后。 最终,可以得到像素坐标(500, 500)处的高程值elevation_val。以上是利用gdal读取tif文件中任意一点高程值的方法。 ### 回答3: gdal是开源的地理数据处理库,它提供了用于读写各种栅格图像格式的API,包括tif文件格式。要使用gdal读取tif文件中的高程值,可以采用以下步骤: 1. 导入gdal库和numpy库。 import gdal import numpy as np 2. 打开tif文件,并读取其中的高程数据。 dataset = gdal.Open('filename.tif', gdal.GA_ReadOnly) elevation = dataset.ReadAsArray() 3. 获取tif文件的坐标系及其转换规则。 geotransform = dataset.GetGeoTransform() projection = dataset.GetProjection() 4. 根据点的经纬度坐标求出它在tif文件中的像素坐标。 lon = 120.0 lat = 30.0 x = int((lon - geotransform[0]) / geotransform[1]) y = int((lat - geotransform[3]) / geotransform[5]) 5. 获取该像素的高程值。 elev = elevation[y, x] 通过以上步骤,我们就可以使用gdal读取tif文件中任意一点的高程值了。需要注意的是,以上代码只适用于tif文件的坐标系为经纬度,并且像素宽高相等的情况。如果tif文件的坐标系不是经纬度,就需要对经纬度坐标进行投影变换,如果像素宽高不等,则需要对坐标进行插值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值