使用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;
}