【问题标题】:Reproject XY points of GeoTiff to Lat/Long using GDAL/OGR C++使用 GDAL/OGR C++ 将 GeoTiff 的 XY 点重新投影到纬度/经度
【发布时间】:2018-04-17 22:43:07
【问题描述】:

我正在使用 GDAL/OGR API (C++) 将 XY 点从给定的 Tiff 重新投影到纬度/经度坐标。

我现在可以实现它,但是,我得到的坐标与我试图得到的实际坐标不对应。

我意识到该方法不是读取输入数据集,因此,没有“起点”。

事实上,使用命令行中的gdaltranslate 工具可以提供正确的坐标,因为我将 Tiff 作为参数发送。不幸的是,我不能使用这个命令。

以下是我的代码(到目前为止)和gdaltranslate 的示例,作为输出:

C++ 方法:

void reproject_coords(string map_biomass) {
        GDALDataset *dataset;
        GDALAllRegister();
        string ds = map_biomass;
        dataset = (GDALDataset *) GDALOpen(ds.c_str(), GA_ReadOnly);

        OGRSpatialReference source(dataset->GetMetadata()), target;
        OGRCoordinateTransformation *poCT;

        target.importFromEPSG(4326);
        //source.AutoIdentifyEPSG();
        //source.SetWellKnownGeogCS("32643");
        double x = 1794, y = 6644;

        //source.dumpReadable();
        poCT = OGRCreateCoordinateTransformation(&source, &target);

        if( poCT == NULL || !poCT->Transform( 1, &x, &y ) )
            printf( "Transformation failed.\n" );
        else
            printf( "(%f,%f)\n",
                    x, y );
}

输入:x = 1794 y = 6644
输出:(70.527326,0.059926)

命令行:

gdaltransform Karnataka_biomass.tif -t_srs EPSG:4326 -s_srs EPSG:32643

输入:x = 1794 y = 6644 输出:75.7461474090405 12.4826172522718

问题是是否有任何方法可以“读取”C++ 方法中的 Tiff 以获得真正的纬度/经度坐标。我需要吗?

【问题讨论】:

    标签: c++ gdal ogr


    【解决方案1】:

    您以错误的方式创建 空间参考。您应该使用方法 GetProjectionRef() 而不是 GetMetaData():

    OGRSpatialReference source(dataset->GetProjectionRef()), target;
    

    这应该在您的 GeoTIFF 中使用相同的 SRS 初始化源空间参考。

    如果您只需要转换点,则无需使用 GeoTIFF。您只需初始化两个 OGRSpatialReference 对象并转换一个 OGRPoint

    更新 #1

    这是一个例子:

    GDALAllRegister();
    
    OGRSpatialReference source, target;
    
    source.importFromEPSG(32643);
    target.importFromEPSG(4326);
    
    OGRPoint p;
    p.setX(1794);
    p.setY(6644);
    p.assignSpatialReference(&source);
    
    p.transformTo(&target);
    
    // transformed coordinates
    cout << p.getX() << " | " << p.getY();
    

    然而,请注意你的结果是正确的,你会得到与上面的代码相同的结果。当您查看转换后的 GeoTIFF 时看到不同值的原因是因为 gdaltransform 可能需要对其进行旋转/重新缩放,并且由于图像始终是矩形的,因此它可能会选择不同的左上角来完成此操作。

    更新 #2

    OP 澄清说他不想投射单个点,而是投射整个图像。此任务可以使用 GDALWarp API(教程here)来完成。

    作为替代方案,仍然可以使用 gdaltransform 实用程序,通过 system() 调用来调用它。

    【讨论】:

    • 我用GetProjectionRef() 替换了GetMetaData(),但我得到了相同的坐标。我正在尝试使用 OGRPoint 方法,但我遇到了麻烦。你有一个例子吗?提前致谢。
    • 我明白了,那么,在这种情况下我该怎么办?寻找不同的方法?
    • 这取决于你的目标是什么。如果您想改变这一点,正确的方法是我向您展示的方法。否则,您能否澄清一下您想要获得的确切信息?
    • 当然,我在 Tiff 的基础上创建了多个点。然后,我创建 PNG,它们只不过是从 实际点 开始的搜索路线。为了在谷歌地图中显示图像,我试图获得准确的纬度/经度坐标。这可以使用gdaltransform 来实现,但是,我需要自动,换句话说,没有用户交互。
    • 我明白了,那么您有两个选择:使用 GDALWarp API(有一个教程here)或使用 QProcess 调用 gdaltransform 命令.
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2015-06-18
    相关资源
    最近更新 更多