我使用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坐标。我需要吗?
答案 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()调用来调用它。