LSTSWB 2020-09-20 17:43 采纳率: 0%
浏览 216

GDAL读取数据dem存在误差

使用GDAL读取dem值,直接用RasterIO读取到指针,然后根据行列号,来找到某个点的位置,但是读取到的数据和在Arcgis中读到的数据会有一点误差,这是因为什么呢?求大佬解答,贴上代码

float *read_tiff(float Xgeo, float Ygeo,int &band_num, int &nImgSizeX, int &nImgSizeY, int &dx, int &dy, float &elevation, GDALDataType bit) {
    int num_image_size = 0;

    float *pafScanblock;
    const char* file_path_name = "E:\\study\\dem.tif";
    GDALDataset *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *)GDALOpen(file_path_name, GA_ReadOnly);
    GDALRasterBand *poBand1;
    poBand1 = poDataset->GetRasterBand(1);


    band_num = poDataset->GetRasterCount();
    printf("band:%d\n", band_num);
    //获取图像的尺寸
    nImgSizeX = poDataset->GetRasterXSize();
    nImgSizeY = poDataset->GetRasterYSize();
    printf("nImgSizeX: %d\n", nImgSizeX);

    //获取坐标变换系数
    double trans[6];
    CPLErr aaa = poDataset->GetGeoTransform(trans);
    bit = GDALDataType(poBand1->GetRasterDataType());
    printf("bit:%d\n", bit);


    double dTemp = trans[2] * trans[4] - trans[1] * trans[5];
    //行列号
    double dCol = 0.0, dRow = 0.0;
    dRow = (trans[4] * (Xgeo - trans[0]) - trans[1] * (Ygeo - trans[3])) / dTemp;
    dCol = (trans[2] * (Ygeo - trans[3]) - trans[5] * (Xgeo - trans[0])) / dTemp;
    dx = (int)dCol;
    dy = (int)dRow;

    int nXBlockSize, nYBlockSize;
    poBand1->GetBlockSize(&nXBlockSize, &nYBlockSize);
    //printf("X:%d\n,Y:%d\n", nXBlockSize, nYBlockSize);
    pafScanblock = (float *)CPLMalloc(sizeof(float)*nImgSizeX*nImgSizeY);//建议能小则小否则会造成内存不足的情况
    //pafScanblock = new float[nImgSizeX*nImgSizeY];
    //pafScanblock = (float *)CPLMalloc(nImgSizeX*nImgSizeY);
    poBand1->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, pafScanblock, nImgSizeX, nImgSizeY, bit, 0, 0);
    //poBand1->ReadBlock(333, 20, pafScanblock);
    elevation = *pafScanblock;
    //cout << setprecision(15) << Xgeo << "  " << Ygeo << "  " << elevation << endl;
    //printf("dem:%f\n", elevation);
    return pafScanblock;
    //return nImgSizeX;
    //return nImgSizeY;
    //return bit;
    //return trans[6];
    CPLFree(pafScanblock);
    //关闭文件   
    GDALClose((GDALDatasetH)poDataset);
}
int main()
{

    int nImgWidth = 0;
    int nImgHeight = 0;
    int nImgBandNum = 0;
    float Xgeo = 397169.238;
    float Ygeo = 5639747.561;
    int dx = 0;
    int dy = 0;
    float dem = 0;
    int band_num = 0;
    GDALDataType bit=GDT_Float32;
    float *pafScanblock = read_tiff(Xgeo, Ygeo,band_num, nImgWidth, nImgHeight, dx, dy, dem,bit);
    printf("nImgWidth:%d\n", nImgWidth);
    printf("nImgHeight:%d\n", nImgHeight);
    printf("dx:%d\n", dx);
    printf("dy:%d\n", dy);
    int x = nImgWidth * (dy - 1) + dx;
    float ccccc = pafScanblock[x];
    printf("dem:%f\n", ccccc);

    return 0;
}
  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-09-21 10:36
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程