00001 #include "pickGridValue.h"
00002
00003
00004 using namespace std;
00005
00006 double readValue ( void *data, GDALDataType type, int index )
00007 {
00008 double val;
00009
00010 switch ( type )
00011 {
00012 case GDT_Byte:
00013 return (double) ((GByte *)data)[index];
00014 break;
00015 case GDT_UInt16:
00016 return (double) ((GUInt16 *)data)[index];
00017 break;
00018 case GDT_Int16:
00019 return (double) ((GInt16 *)data)[index];
00020 break;
00021 case GDT_UInt32:
00022 return (double) ((GUInt32 *)data)[index];
00023 break;
00024 case GDT_Int32:
00025 return (double) ((GInt32 *)data)[index];
00026 break;
00027 case GDT_Float32:
00028 return (double) ((float *)data)[index];
00029 break;
00030 case GDT_Float64:
00031 val = ((double *)data)[index];
00032 return (double) ((double *)data)[index];
00033 break;
00034 default:
00035 cout<<"Data type "<<type<<" is not supported";
00036 }
00037 return 0.0;
00038 }
00039
00040 static double Xmax, Xmin, Ymax, Ymin;
00041 static double Xres, Yres;
00042
00043 void getExtent(GDALDataset *temp, double *ranges){
00044
00045 double adfGeoTransform[6];
00046 temp->GetGeoTransform(adfGeoTransform);
00047 double myXMaxDouble = adfGeoTransform[0] + temp->GetRasterXSize() * adfGeoTransform[1] + temp->GetRasterYSize() * adfGeoTransform[2];
00048 double myYMinDouble = adfGeoTransform[3] + temp->GetRasterXSize() * adfGeoTransform[4] + temp->GetRasterYSize() * adfGeoTransform[5];
00049
00050 Xmax = myXMaxDouble;
00051
00052
00053 Xmin = adfGeoTransform[0];
00054 Ymax = adfGeoTransform[3];
00055 Ymin = myYMinDouble;
00056
00057 int rasterXDimInt = temp->GetRasterXSize();
00058 int rasterYDimInt = temp->GetRasterYSize();
00059
00060 Xres = (Xmax - Xmin) / rasterXDimInt;
00061
00062 Yres = (Ymax - Ymin) / rasterYDimInt;
00063
00064 ranges[0]=Xmin;
00065 ranges[1]=Xmax;
00066 ranges[2]=Ymin;
00067 ranges[3]=Ymax;
00068 ranges[4]=Xres;
00069 ranges[5]=Yres;
00070 return;
00071
00072 }
00073
00074
00075 double getRasterValue(GDALDataset* layer, int bandNumber, double x, double y, double *ranges){
00076
00077
00078
00079
00080
00081
00082
00083 GDALRasterBand *band = layer->GetRasterBand(bandNumber);
00084 GDALDataType type = band->GetRasterDataType();
00085 int size = GDALGetDataTypeSize(type) / 8;
00086 void *data = CPLMalloc(size);
00087 int col = (int) floor( (x-ranges[0])/ranges[4] );
00088 int row = (int) floor( (ranges[3]-y)/ranges[5] );
00089
00090
00091
00092 CPLErr err = band->RasterIO(GF_Read, col, row, 1, 1, data, 1, 1, type, 0, 0);
00093
00094 return readValue(data, type, 0);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126