00001 #include "gdalfrmt.h" 00002 #include <iostream> 00003 #include "TraceLog.h" 00004 00005 GDALFrmt::GDALFrmt( ) { 00006 GDALAllRegister(); 00007 mDataSet = NULL; 00008 } 00009 00010 GDALFrmt::~GDALFrmt( ) { 00011 if ( mDataSet ) 00012 GDALClose( mDataSet ); 00013 } 00014 00015 void* GDALFrmt::getBand( int iband, 00016 int x1, 00017 int y1, 00018 int w1, 00019 int h1, 00020 int w2, 00021 int h2, 00022 ScaleType ) const { 00023 int dSize = 1; 00024 00025 if ( mBandSet[iband].type == ImageFormat::UINT16 || 00026 mBandSet[iband].type == ImageFormat::INT16 ) 00027 dSize = 2; 00028 00029 unsigned char *data = new unsigned char[ w2 * h2 * dSize ]; 00030 00031 GDALRasterBand *poBand = mDataSet->GetRasterBand( iband +1 ); 00032 if ( !poBand ) { 00033 delete [] data; 00034 return NULL; 00035 } 00036 00037 GDALDataType dt; 00038 switch ( mBandSet[iband].type ) { 00039 case ImageFormat::UINT8: 00040 dt = GDT_Byte; 00041 break; 00042 00043 case ImageFormat::UINT16: 00044 dt = GDT_UInt16; 00045 break; 00046 00047 case ImageFormat::INT16: 00048 dt = GDT_Int16; 00049 break; 00050 00051 default: 00052 return data; 00053 } 00054 00055 poBand->RasterIO( GF_Read, x1, y1, w1, h1, data, w2, h2, dt, 0, 0 ); 00056 return(void*)data; 00057 } 00058 00059 void GDALFrmt::getLL( int, 00060 double &i, 00061 double &j ) { 00062 double set[6]; 00063 OGRSpatialReference poORIG, *poLL; 00064 const char *pszUTM_WKT; 00065 00066 pszUTM_WKT = mDataSet->GetProjectionRef(); 00067 00068 if ( poORIG.importFromWkt( (char**)&pszUTM_WKT ) != OGRERR_NONE ) 00069 return; 00070 00071 if ( mDataSet->GetGeoTransform( set ) == CE_Failure ) 00072 return; 00073 00074 double dfGeorefX = set[0] + (set[1] * i) + (set[2] * j); 00075 double dfGeorefY = set[3] + (set[4] * i) + (set[5] * j); 00076 00077 poLL = poORIG.CloneGeogCS(); 00078 00079 OGRCoordinateTransformation *poTransform = NULL; 00080 poTransform = OGRCreateCoordinateTransformation( &poORIG, poLL ); 00081 00082 if ( !poTransform ) 00083 return; 00084 00085 poTransform->Transform( 1, &dfGeorefX, &dfGeorefY ); 00086 00087 i = dfGeorefX; 00088 j = dfGeorefY; 00089 00090 delete poLL; 00091 delete poTransform; 00092 } 00093 00094 void GDALFrmt::getXY( int, 00095 double &i, 00096 double &j ) { 00097 OGRSpatialReference poORIG, *poLL; 00098 double set[6]; 00099 const char *pszUTM_WKT; 00100 00101 00102 pszUTM_WKT = mDataSet->GetProjectionRef(); 00103 00104 if ( poORIG.importFromWkt( (char**)&pszUTM_WKT ) != OGRERR_NONE ) 00105 return; 00106 00107 if ( mDataSet->GetGeoTransform( set ) == CE_Failure ) 00108 return; 00109 00110 poLL = poORIG.CloneGeogCS(); 00111 OGRCoordinateTransformation *poTransform = NULL; 00112 poTransform = OGRCreateCoordinateTransformation( poLL, &poORIG ); 00113 if ( !poTransform ) { 00114 std::cerr << "GV_GDAL: Failed to get geotransform\n"; 00115 return; 00116 } 00117 00118 poTransform->Transform( 1, &i, &j ); 00119 00120 // set[0] + (set[1] * i) + (set[2] * j); 00121 // set[3] + (set[4] * i) + (set[5] * j); 00122 i = (i - set[0]) / set[1]; 00123 j = (j - set[3]) / set[5]; 00124 00125 delete poLL; 00126 // delete poORIG; 00127 delete poTransform; 00128 } 00129 00130 bool GDALFrmt::open( std::string fname ) { 00131 int gotMin, gotMax; 00132 int dims[2]; 00133 int nBand; 00134 double minmax[2]; 00135 char buf[150]; 00136 int i=0; 00137 double spattr[6]; 00138 bool isLL = false; 00139 const char *pszUTM_WKT; 00140 00141 OGRSpatialReference poOGR; 00142 GDALRasterBand *poBand; 00143 mFName = fname; 00144 00145 mDataSet = (GDALDataset*)GDALOpen( fname.c_str(), GA_ReadOnly ); 00146 if ( !mDataSet ) 00147 return false; 00148 00149 nBand = mDataSet->GetRasterCount(); 00150 mDataSet->GetGeoTransform( spattr ); 00151 pszUTM_WKT = mDataSet->GetProjectionRef(); 00152 if ( poOGR.importFromWkt( (char**)&pszUTM_WKT ) == OGRERR_NONE ) 00153 isLL = poOGR.IsGeographic(); 00154 00155 for ( i=0; i < nBand; i++ ) { 00156 poBand = mDataSet->GetRasterBand( i+1 ); 00157 if ( !poBand ) 00158 continue; 00159 00160 dims[0] = poBand->GetXSize(); 00161 dims[1] = poBand->GetYSize(); 00162 00163 minmax[0] = poBand->GetMinimum( &gotMin ); 00164 minmax[1] = poBand->GetMaximum( &gotMax ); 00165 if ( !(gotMin && gotMax) ) 00166 GDALComputeRasterMinMax( poBand, true, minmax ); 00167 00168 sprintf( buf, "Band %d", i ); 00169 00170 ImageFormat::DataType dt; 00171 switch ( poBand->GetRasterDataType() ) { 00172 case GDT_Byte: 00173 dt = ImageFormat::UINT8; 00174 break; 00175 00176 case GDT_UInt16: 00177 dt = ImageFormat::UINT16; 00178 break; 00179 00180 case GDT_Int16: 00181 dt = ImageFormat::INT16; 00182 break; 00183 00184 default: 00185 dt = ImageFormat::NOT_DEFINED; 00186 break; 00187 } 00188 00189 BandInf b; 00190 b.width = dims[0]; 00191 b.height = dims[1]; 00192 b.type = dt; 00193 b.name = buf; 00194 b.min = minmax[0]; 00195 b.max = minmax[1]; 00196 b.ndims = 2; 00197 b.res = spattr[5]; 00198 if ( b.res < 0 ) 00199 b.res *= -1; 00200 00201 if ( isLL ) 00202 b.res *= 75000; 00203 mBandSet.push_back( b ); 00204 } 00205 00206 if ((int)mBandSet.size()) { 00207 double x = mBandSet[0].width / 2; 00208 double y = mBandSet[0].height / 2; 00209 getLL( 0, x, y ); 00210 mImageInf.mCenterLat = y; 00211 mImageInf.mCenterLon = x; 00212 } 00213 mImageInf.mLocURL = fname ; 00214 00215 return true; 00216 } 00217 00218
Home |
Search |
Disclaimers & Privacy |
Contact Us GLIMSView Maintainer: dsoltesz@usgs.gov |