gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:02:25 26 4
gpt4 key购买 nike

我正在使用 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 以获得真正的纬度/经度坐标。我需要吗?

最佳答案

您以错误的方式创建了 空间引用。您应该使用 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() 调用来调用它。

关于c++ - 使用 GDAL/OGR C++ 将 GeoTiff 的 XY 点重新投影到 Lat/Long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49888551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com