巨菜的阿豪 2023-10-16 17:23 采纳率: 50%
浏览 8
已结题

tif文件的处理与gdal开发

一个tif文件,c++开发,使用了gdal库GDALDataset::GetProjectionRef() 、GDALDataset::GetGeoTransform()获取其坐标系、仿射变换矩阵,返回值都为空。
问题:
1.如何给这个个tif文件用代码手段加上 坐标系 和 仿射变换矩阵?
2.我使用了如下方式将数据集添加了坐标系,但每次重新打开tif文件,数据集都没有坐标系得重新写入,有办法彻底写入tif文件吗?再次打开该tif文件就能直接获取坐标系。

GDALDataset *poDSRef;
const char* in_srs_wktTmp1=poDSRef->GetProjectionRef();//=NULL
const char* in_srs_wktTmp= "PROJCS[\"CGCS2000_3_Degree_GK_CM_120E\".....AUTHORITY[\"EPSG\",\"4549\"]]";
//建立数据集坐标系,但下次项目运行读取就没有了。
int test=poDSRef->SetProjection(in_srs_wktTmp);
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-17 07:49
    关注

    【以下回答由 GPT 生成】

    import gdal
    
    # 问题1: 如何通过代码为这个tif文件添加坐标系和仿射变换矩阵?
    # 打开tif文件
    dataset = gdal.Open('path/to/your/tif')
    if dataset is None:
        print('无法打开tif文件')
    
    # 获取坐标系和仿射变换矩阵
    projection = dataset.GetProjection()
    geotransform = dataset.GetGeoTransform()
    
    # 如果返回的值为空,说明tif文件没有定义坐标系和仿射变换矩阵
    if projection == '' or geotransform == (0.0, 1.0, 0.0, 0.0, 0.0, 1.0):
        # 设置坐标系
        srs = gdal.osr.SpatialReference()
        srs.ImportFromEPSG(4326)  # 例如,设置为WGS84坐标系
        dataset.SetProjection(srs.ExportToWkt())
    
        # 设置仿射变换矩阵
        geotransform = (xmin, pixel_width, 0, ymax, 0, -pixel_height)  # 根据实际情况设置
        dataset.SetGeoTransform(geotransform)
    
        # 关闭并重新打开tif文件
        del dataset
        dataset = gdal.Open('path/to/your/tif')
        if dataset is None:
            print('无法打开tif文件')
    
    # 获取更新后的坐标系和仿射变换矩阵
    projection = dataset.GetProjection()
    geotransform = dataset.GetGeoTransform()
    
    print('坐标系: ', projection)
    print('仿射变换矩阵: ', geotransform)
    
    
    # 问题2: 我尝试使用以下方式为数据集添加坐标系,但每次重新打开tif文件后,数据集都没有坐标系,
    #      需要重新写入。有没有办法可以彻底将坐标系写入tif文件中,这样再次打开该tif文件时就能直接获取坐标系?
    
    # 方法1:使用SetProjection()和SetGeoTransform()方法来设置坐标系和仿射变换矩阵,
    # 然后使用gdal.Dataset.GetTifOptions()方法来保存设置的信息到tif文件中
    
    # 方法2:使用gdal_translate命令行工具来设置坐标系和仿射变换矩阵,
    # 并通过-gcp参数指定控制点坐标,这样能够在重新打开tif文件时直接获取坐标系
    
    # 方法3:将tif文件转换为其他带有坐标系信息的格式(如GeoTIFF),
    # 然后再转换回tif格式,这样能够确保坐标系信息得到正确保存
    
    # 注意:以上方法中,如果tif文件是只读模式打开的,无法直接修改坐标系和仿射变换矩阵。需要使用CreateCopy()方法创建一个新的tif文件。
    

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月18日
  • 创建了问题 10月16日

悬赏问题

  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来