使用GDAL / OGR C ++将GeoTiff的XY点重新投影到Lat / Long

时间:2018-04-17 22:43:07

标签: c++ gdal ogr

我使用GDAL / OGR API(C ++)将XY点重新投影到给定Tiff的Lat / Long坐标。

我现在能够实现它,但是,我得到的坐标不符合我想要获得的实际坐标。

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

事实上,使用命令行中的gdaltranslate工具,给出正确的corrdinates,因为我发送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,以获得真正的Lat / Long坐标。我需要吗?

1 个答案:

答案 0 :(得分: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()调用来调用它。