00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _OGR_FEATURE_H_INCLUDED
00031 #define _OGR_FEATURE_H_INCLUDED
00032
00033 #include "ogr_geometry.h"
00034 #include "ogr_featurestyle.h"
00035 #include "cpl_atomic_ops.h"
00036
00043
00044
00045
00046
00051 class CPL_DLL OGRFieldDefn
00052 {
00053 private:
00054 char *pszName;
00055 OGRFieldType eType;
00056 OGRJustification eJustify;
00057 int nWidth;
00058 int nPrecision;
00059 OGRField uDefault;
00060
00061 int bIgnore;
00062
00063 void Initialize( const char *, OGRFieldType );
00064
00065 public:
00066 OGRFieldDefn( const char *, OGRFieldType );
00067 OGRFieldDefn( OGRFieldDefn * );
00068 ~OGRFieldDefn();
00069
00070 void SetName( const char * );
00071 const char *GetNameRef() { return pszName; }
00072
00073 OGRFieldType GetType() { return eType; }
00074 void SetType( OGRFieldType eTypeIn ) { eType = eTypeIn;}
00075 static const char *GetFieldTypeName( OGRFieldType );
00076
00077 OGRJustification GetJustify() { return eJustify; }
00078 void SetJustify( OGRJustification eJustifyIn )
00079 { eJustify = eJustifyIn; }
00080
00081 int GetWidth() { return nWidth; }
00082 void SetWidth( int nWidthIn ) { nWidth = MAX(0,nWidthIn); }
00083
00084 int GetPrecision() { return nPrecision; }
00085 void SetPrecision( int nPrecisionIn )
00086 { nPrecision = nPrecisionIn; }
00087
00088 void Set( const char *, OGRFieldType, int = 0, int = 0,
00089 OGRJustification = OJUndefined );
00090
00091 void SetDefault( const OGRField * );
00092 const OGRField *GetDefaultRef() { return &uDefault; }
00093
00094 int IsIgnored() { return bIgnore; }
00095 void SetIgnored( int bIgnore ) { this->bIgnore = bIgnore; }
00096
00097 int IsSame( const OGRFieldDefn * ) const;
00098 };
00099
00100
00101
00102
00103
00120 class CPL_DLL OGRFeatureDefn
00121 {
00122 private:
00123 volatile int nRefCount;
00124
00125 int nFieldCount;
00126 OGRFieldDefn **papoFieldDefn;
00127
00128 OGRwkbGeometryType eGeomType;
00129
00130 char *pszFeatureClassName;
00131
00132 int bIgnoreGeometry;
00133 int bIgnoreStyle;
00134
00135 public:
00136 OGRFeatureDefn( const char * pszName = NULL );
00137 virtual ~OGRFeatureDefn();
00138
00139 const char *GetName() { return pszFeatureClassName; }
00140
00141 int GetFieldCount() { return nFieldCount; }
00142 OGRFieldDefn *GetFieldDefn( int i );
00143 int GetFieldIndex( const char * );
00144
00145 void AddFieldDefn( OGRFieldDefn * );
00146 OGRErr DeleteFieldDefn( int iField );
00147 OGRErr ReorderFieldDefns( int* panMap );
00148
00149 OGRwkbGeometryType GetGeomType() { return eGeomType; }
00150 void SetGeomType( OGRwkbGeometryType );
00151
00152 OGRFeatureDefn *Clone();
00153
00154 int Reference() { return CPLAtomicInc(&nRefCount); }
00155 int Dereference() { return CPLAtomicDec(&nRefCount); }
00156 int GetReferenceCount() { return nRefCount; }
00157 void Release();
00158
00159 int IsGeometryIgnored() { return bIgnoreGeometry; }
00160 void SetGeometryIgnored( int bIgnore ) { bIgnoreGeometry = bIgnore; }
00161 int IsStyleIgnored() { return bIgnoreStyle; }
00162 void SetStyleIgnored( int bIgnore ) { bIgnoreStyle = bIgnore; }
00163
00164 int IsSame( const OGRFeatureDefn * poOtherFeatureDefn ) const;
00165
00166 static OGRFeatureDefn *CreateFeatureDefn( const char *pszName = NULL );
00167 static void DestroyFeatureDefn( OGRFeatureDefn * );
00168 };
00169
00170
00171
00172
00173
00178 class CPL_DLL OGRFeature
00179 {
00180 private:
00181
00182 long nFID;
00183 OGRFeatureDefn *poDefn;
00184 OGRGeometry *poGeometry;
00185 OGRField *pauFields;
00186
00187 protected:
00188 char * m_pszStyleString;
00189 OGRStyleTable *m_poStyleTable;
00190 char * m_pszTmpFieldValue;
00191
00192 public:
00193 OGRFeature( OGRFeatureDefn * );
00194 virtual ~OGRFeature();
00195
00196 OGRFeatureDefn *GetDefnRef() { return poDefn; }
00197
00198 OGRErr SetGeometryDirectly( OGRGeometry * );
00199 OGRErr SetGeometry( OGRGeometry * );
00200 OGRGeometry *GetGeometryRef() { return poGeometry; }
00201 OGRGeometry *StealGeometry();
00202
00203 OGRFeature *Clone();
00204 virtual OGRBoolean Equal( OGRFeature * poFeature );
00205
00206 int GetFieldCount() { return poDefn->GetFieldCount(); }
00207 OGRFieldDefn *GetFieldDefnRef( int iField )
00208 { return poDefn->GetFieldDefn(iField); }
00209 int GetFieldIndex( const char * pszName)
00210 { return poDefn->GetFieldIndex(pszName);}
00211
00212 int IsFieldSet( int iField ) const;
00213
00214 void UnsetField( int iField );
00215
00216 OGRField *GetRawFieldRef( int i ) { return pauFields + i; }
00217
00218 int GetFieldAsInteger( int i );
00219 double GetFieldAsDouble( int i );
00220 const char *GetFieldAsString( int i );
00221 const int *GetFieldAsIntegerList( int i, int *pnCount );
00222 const double *GetFieldAsDoubleList( int i, int *pnCount );
00223 char **GetFieldAsStringList( int i ) const;
00224 GByte *GetFieldAsBinary( int i, int *pnCount );
00225 int GetFieldAsDateTime( int i,
00226 int *pnYear, int *pnMonth, int *pnDay,
00227 int *pnHour, int *pnMinute, int *pnSecond,
00228 int *pnTZFlag );
00229
00230 int GetFieldAsInteger( const char *pszFName )
00231 { return GetFieldAsInteger( GetFieldIndex(pszFName) ); }
00232 double GetFieldAsDouble( const char *pszFName )
00233 { return GetFieldAsDouble( GetFieldIndex(pszFName) ); }
00234 const char *GetFieldAsString( const char *pszFName )
00235 { return GetFieldAsString( GetFieldIndex(pszFName) ); }
00236 const int *GetFieldAsIntegerList( const char *pszFName,
00237 int *pnCount )
00238 { return GetFieldAsIntegerList( GetFieldIndex(pszFName),
00239 pnCount ); }
00240 const double *GetFieldAsDoubleList( const char *pszFName,
00241 int *pnCount )
00242 { return GetFieldAsDoubleList( GetFieldIndex(pszFName),
00243 pnCount ); }
00244 char **GetFieldAsStringList( const char *pszFName )
00245 { return GetFieldAsStringList(GetFieldIndex(pszFName)); }
00246
00247 void SetField( int i, int nValue );
00248 void SetField( int i, double dfValue );
00249 void SetField( int i, const char * pszValue );
00250 void SetField( int i, int nCount, int * panValues );
00251 void SetField( int i, int nCount, double * padfValues );
00252 void SetField( int i, char ** papszValues );
00253 void SetField( int i, OGRField * puValue );
00254 void SetField( int i, int nCount, GByte * pabyBinary );
00255 void SetField( int i, int nYear, int nMonth, int nDay,
00256 int nHour=0, int nMinute=0, int nSecond=0,
00257 int nTZFlag = 0 );
00258
00259 void SetField( const char *pszFName, int nValue )
00260 { SetField( GetFieldIndex(pszFName), nValue ); }
00261 void SetField( const char *pszFName, double dfValue )
00262 { SetField( GetFieldIndex(pszFName), dfValue ); }
00263 void SetField( const char *pszFName, const char * pszValue)
00264 { SetField( GetFieldIndex(pszFName), pszValue ); }
00265 void SetField( const char *pszFName, int nCount,
00266 int * panValues )
00267 { SetField(GetFieldIndex(pszFName),nCount,panValues);}
00268 void SetField( const char *pszFName, int nCount,
00269 double * padfValues )
00270 {SetField(GetFieldIndex(pszFName),nCount,padfValues);}
00271 void SetField( const char *pszFName, char ** papszValues )
00272 { SetField( GetFieldIndex(pszFName), papszValues); }
00273 void SetField( const char *pszFName, OGRField * puValue )
00274 { SetField( GetFieldIndex(pszFName), puValue ); }
00275 void SetField( const char *pszFName,
00276 int nYear, int nMonth, int nDay,
00277 int nHour=0, int nMinute=0, int nSecond=0,
00278 int nTZFlag = 0 )
00279 { SetField( GetFieldIndex(pszFName),
00280 nYear, nMonth, nDay,
00281 nHour, nMinute, nSecond, nTZFlag ); }
00282
00283 long GetFID() { return nFID; }
00284 virtual OGRErr SetFID( long nFID );
00285
00286 void DumpReadable( FILE *, char** papszOptions = NULL );
00287
00288 OGRErr SetFrom( OGRFeature *, int = TRUE);
00289 OGRErr SetFrom( OGRFeature *, int *, int = TRUE );
00290 OGRErr SetFieldsFrom( OGRFeature *, int *, int = TRUE );
00291
00292 OGRErr RemapFields( OGRFeatureDefn *poNewDefn,
00293 int *panRemapSource );
00294
00295 virtual const char *GetStyleString();
00296 virtual void SetStyleString( const char * );
00297 virtual void SetStyleStringDirectly( char * );
00298 virtual OGRStyleTable *GetStyleTable() { return m_poStyleTable; }
00299 virtual void SetStyleTable(OGRStyleTable *poStyleTable);
00300 virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable)
00301 { if ( m_poStyleTable ) delete m_poStyleTable;
00302 m_poStyleTable = poStyleTable; }
00303
00304 static OGRFeature *CreateFeature( OGRFeatureDefn * );
00305 static void DestroyFeature( OGRFeature * );
00306 };
00307
00308
00309
00310
00311
00312 class OGRLayer;
00313 class swq_expr_node;
00314
00315 class CPL_DLL OGRFeatureQuery
00316 {
00317 private:
00318 OGRFeatureDefn *poTargetDefn;
00319 void *pSWQExpr;
00320
00321 char **FieldCollector( void *, char ** );
00322
00323 long *EvaluateAgainstIndices( swq_expr_node*, OGRLayer *, int& nFIDCount);
00324
00325 int CanUseIndex( swq_expr_node*, OGRLayer * );
00326
00327 public:
00328 OGRFeatureQuery();
00329 ~OGRFeatureQuery();
00330
00331 OGRErr Compile( OGRFeatureDefn *, const char * );
00332 int Evaluate( OGRFeature * );
00333
00334 long *EvaluateAgainstIndices( OGRLayer *, OGRErr * );
00335
00336 int CanUseIndex( OGRLayer * );
00337
00338 char **GetUsedFields();
00339
00340 void *GetSWGExpr() { return pSWQExpr; }
00341 };
00342
00343 #endif