00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00030 #include "../inc/Ogr.h"
00031
00032 Ogr::Ogr( void )
00033 {
00034 OGRRegisterAll();
00035 }
00036
00037 Ogr::~Ogr( void )
00038 {
00039
00040 }
00041
00042 bool Ogr::OpenSource( string filename, string &epsg, string &query, string &error )
00043 {
00044 sourceSRS = NULL;
00045
00046 sourceName = filename;
00047
00048 sourceData = OGROpen( sourceName.c_str(), 0, NULL );
00049
00050 if( sourceData != NULL )
00051 {
00052 sourceLayer = OGR_DS_GetLayer( sourceData, 0 );
00053
00054 if( sourceLayer != NULL )
00055 {
00056 sourceLayerDefn = OGR_L_GetLayerDefn( sourceLayer );
00057
00058 sourceLayerName = OGR_FD_GetName( sourceLayerDefn );
00059
00060 sourceLayerGeom = OGR_FD_GetGeomType( sourceLayerDefn );
00061
00062 sourceGeom = OGR_L_GetSpatialFilter( sourceLayer );
00063
00064 sourceSRS = OGR_L_GetSpatialRef( sourceLayer );
00065
00066 if( sourceSRS != NULL && ! Error( OSRAutoIdentifyEPSG( sourceSRS ), error ) )
00067 {
00068 epsg = OSRGetAttrValue( sourceSRS, "AUTHORITY", 1 );
00069 }
00070 else
00071 {
00072 error = "unable to open source spatial reference";
00073 }
00074
00075 query = "SELECT * FROM " + sourceLayerName;
00076 }
00077 else
00078 {
00079 error = "unable to open source layer";
00080
00081 return false;
00082 }
00083 }
00084 else
00085 {
00086 error = "unable to open source data";
00087
00088 return false;
00089 }
00090
00091 return true;
00092 }
00093
00094 bool Ogr::CloseSource( void )
00095 {
00096 if( sourceData != NULL )
00097 {
00098 OGR_DS_Destroy( sourceData );
00099 }
00100 else
00101 {
00102 return false;
00103 }
00104
00105 return true;
00106 }
00107
00108 bool Ogr::OpenDriver( string drivername, string error )
00109 {
00110 formatDriver = OGRGetDriverByName( drivername.c_str() );
00111
00112 if( formatDriver == NULL )
00113 {
00114 error = "unable to find driver";
00115
00116 return false;
00117 }
00118
00119 return true;
00120 }
00121
00122 bool Ogr::OpenTarget( string filename, int projection, bool update )
00123 {
00124 struct stat fileInfo;
00125
00126 targetSRS = NULL;
00127
00128 targetName = filename;
00129
00130 if( projection > 0 )
00131 {
00132 targetSRS = OSRNewSpatialReference( NULL );
00133
00134 if( Error( OSRImportFromEPSG( targetSRS, projection ), error ) )
00135 {
00136 error.insert( 0, "unable to create spatial reference : " );
00137 }
00138 }
00139
00140 if( update )
00141 {
00142 if( stat( targetName.c_str(), &fileInfo ) == 0 )
00143 {
00144 targetData = OGR_Dr_Open( formatDriver, targetName.c_str(), 1 );
00145 }
00146 else
00147 {
00148 error = "file doesn't exist";
00149
00150 return false;
00151 }
00152 }
00153 else
00154 {
00155 if( stat( targetName.c_str(), &fileInfo ) == 0 )
00156 {
00157 if( remove( targetName.c_str() ) != 0 )
00158 {
00159 error = "unable to delete source data";
00160 }
00161 }
00162
00163 targetData = OGR_Dr_CreateDataSource( formatDriver, targetName.c_str(), 0 );
00164 }
00165
00166 if( targetData != NULL )
00167 {
00168 if( update )
00169 {
00170 targetLayer = OGR_DS_GetLayer( targetData, 0 );
00171 }
00172 else
00173 {
00174 if( targetSRS != NULL )
00175 {
00176 targetLayer = OGR_DS_CreateLayer( targetData, sourceLayerName.c_str(), targetSRS, sourceLayerGeom, NULL );
00177 }
00178 else
00179 {
00180 targetLayer = OGR_DS_CreateLayer( targetData, sourceLayerName.c_str(), sourceSRS, sourceLayerGeom, NULL );
00181 }
00182 }
00183 }
00184 else
00185 {
00186 error = "unable to create target data";
00187
00188 return false;
00189 }
00190
00191 return true;
00192 }
00193
00194 bool Ogr::CloseTarget( void )
00195 {
00196 if( targetData != NULL )
00197 {
00198 OGR_DS_Destroy( targetData );
00199 }
00200 else
00201 {
00202 return false;
00203 }
00204
00205 return true;
00206 }
00207
00208 bool Ogr::Execute( string query )
00209 {
00210 int featuresCount = 0;
00211
00212 if( Prepare( featuresCount, query ) )
00213 {
00214 while( Process() ) ;
00215
00216 CloseTarget();
00217
00218 CloseSource();
00219 }
00220 else
00221 {
00222 return false;
00223 }
00224
00225 return true;
00226 }
00227
00228 bool Ogr::Prepare( int &featuresCount, string query )
00229 {
00230 OGRFeatureDefnH featDefn = OGR_L_GetLayerDefn( sourceLayer );
00231
00232 for( int i = 0; i < OGR_FD_GetFieldCount( sourceLayerDefn ); i ++ )
00233 {
00234 OGRFieldDefnH field = OGR_FD_GetFieldDefn( featDefn, i );
00235
00236 if( Error( OGR_L_CreateField( targetLayer, field, 0 ), error ) )
00237 {
00238 return false;
00239 }
00240 }
00241
00242 if( query.size() > 0 )
00243 {
00244 OGRLayerH squeryLayer = OGR_DS_ExecuteSQL( sourceData, query.c_str(), NULL, "" );
00245
00246 if( squeryLayer != NULL )
00247 {
00248 sourceLayer = squeryLayer;
00249 }
00250 }
00251
00252 OGR_L_ResetReading( sourceLayer );
00253
00254 featuresCount = OGR_L_GetFeatureCount( sourceLayer, 1 );
00255
00256 return true;
00257 }
00258
00259 bool Ogr::Process( void )
00260 {
00261 OGRFeatureH feature;
00262
00263 if( ( ( feature = OGR_L_GetNextFeature( sourceLayer ) ) != NULL ) )
00264 {
00265 if( targetSRS )
00266 {
00267 Error( OGR_G_TransformTo( OGR_F_GetGeometryRef( feature ), targetSRS ), error );
00268 }
00269
00270 Error( OGR_L_CreateFeature( targetLayer, feature ), error );
00271
00272 OGR_F_Destroy( feature );
00273 }
00274 else
00275 {
00276 return false;
00277 }
00278
00279 return true;
00280 }
00281
00282 bool Ogr::Error( OGRErr code, string &type )
00283 {
00284 switch( code )
00285 {
00286 case OGRERR_NONE :
00287 {
00288 return false;
00289 }
00290 break;
00291
00292 case OGRERR_NOT_ENOUGH_DATA :
00293 {
00294 type = "not enough data";
00295 }
00296 break;
00297
00298 case OGRERR_NOT_ENOUGH_MEMORY :
00299 {
00300 type = "not enough memory";
00301 }
00302 break;
00303
00304 case OGRERR_UNSUPPORTED_GEOMETRY_TYPE :
00305 {
00306 type = "unsupported geometry type";
00307 }
00308 break;
00309
00310 case OGRERR_UNSUPPORTED_OPERATION :
00311 {
00312 type = "unsupported operation";
00313 }
00314 break;
00315
00316 case OGRERR_CORRUPT_DATA :
00317 {
00318 type = "corrupt data";
00319 }
00320 break;
00321
00322 case OGRERR_FAILURE :
00323 {
00324 type = "failure";
00325 }
00326 break;
00327
00328 case OGRERR_UNSUPPORTED_SRS :
00329 {
00330 type = "unsupported srs";
00331 }
00332 break;
00333
00334 default :
00335 {
00336 type = "unknown";
00337 }
00338 break;
00339 }
00340
00341 return true;
00342 }