GDAL GeoTiff在指定像素处获得高程帮助C ++

时间:2014-05-19 09:28:33

标签: c++ gdal elevation geotiff altitude

我对英语的理解不太好,而且我不是最好的C ++程序员,所以我决定在这里提出一个问题来补偿这一点。

我正试图从我从此页面下载的GeoTiff图像中提升:http://terracolor.net/sample_imagery.html

我通过GDAL lib从Image中获取了一些信息,但我不确定这究竟是什么。是颜色吗?这是坐标吗?这是什么统一的? 我也被我能读到的不同乐队弄糊涂了。也许过去使用过GDAL的人可以解释一下这是什么。我最终想要的是在给定像素处的高度,例如米。

这是我的代码:

int ofApp::getAlt(int x,int y){ 
GDALDataset  *poDataset;

GDALAllRegister();

poDataset = (GDALDataset *) GDALOpen( "data/test.tif", GA_ReadOnly );
if( poDataset == NULL )
{
    cout << "no" << endl;
}else{
    GDALRasterBand  *poBand;
    int             nBlockXSize, nBlockYSize;
    int             bGotMin, bGotMax;
    double          adfMinMax[2];

    //printf( "Size is %dx%dx%d\n", poDataset->GetRasterXSize(), poDataset->GetRasterYSize(), poDataset->GetRasterCount() );

    poBand = poDataset->GetRasterBand( 3 );
    poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );

    adfMinMax[0] = poBand->GetMinimum( &bGotMin );
    adfMinMax[1] = poBand->GetMaximum( &bGotMax );
    if( ! (bGotMin && bGotMax) )
        GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);

    float *pafScanline;
    int   nXSize = poBand->GetXSize();

    pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
    poBand->RasterIO( GF_Read, x, y, 1, 1, 
                      pafScanline, nXSize, 1, GDT_Float32, 
                      0, 0 );

    //cout << "vvv" << pafScanline[0] << endl;
    //printf( "value %f \n", pafScanline[0]);
    return pafScanline[0];
 }
 }

2 个答案:

答案 0 :(得分:0)

Terracolor提供的这些GeoTIFF文件似乎包含颜色信息,而不是高程。这些文件在RGB空间中具有像素颜色,有三个波段(1:红色,2:绿色,3:蓝色)。 您可以使用与您的示例类似的代码处理GeoTIFF文件,但您需要读取三个波段。数据类型是Byte,而不是GDT_Float32。 在使用GDAL处理它们之前,我建议使用数据提供程序进行检查,或者使用GIS软件(如QGIS)打开其中一些栅格图层。 .tif文件似乎带有.txt文件中的元数据。

答案 1 :(得分:0)

你是对的。什么简单的错误。我使用的这些图像没有像其中的带这样的高程数据。我现在使用来自http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp的图像,这些图像在一个乐队中提供我需要的所需数据。然后我可以使用我的函数来读出它。