ogr_feature.h

Go to the documentation of this file.
00001 /******************************************************************************
00002  * $Id: ogr_feature.h,v 1.31 2005/09/21 00:50:08 fwarmerdam Exp $
00003  *
00004  * Project:  OpenGIS Simple Features Reference Implementation
00005  * Purpose:  Class for representing a whole feature, and layer schemas.
00006  * Author:   Frank Warmerdam, warmerda@home.com
00007  *
00008  ******************************************************************************
00009  * Copyright (c) 1999,  Les Technologies SoftMap Inc.
00010  *
00011  * Permission is hereby granted, free of charge, to any person obtaining a
00012  * copy of this software and associated documentation files (the "Software"),
00013  * to deal in the Software without restriction, including without limitation
00014  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00015  * and/or sell copies of the Software, and to permit persons to whom the
00016  * Software is furnished to do so, subject to the following conditions:
00017  *
00018  * The above copyright notice and this permission notice shall be included
00019  * in all copies or substantial portions of the Software.
00020  *
00021  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00022  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00023  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
00024  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00025  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00026  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00027  * DEALINGS IN THE SOFTWARE.
00028  ******************************************************************************
00029  *
00030  * $Log: ogr_feature.h,v $
00031  * Revision 1.31  2005/09/21 00:50:08  fwarmerdam
00032  * Added Release
00033  *
00034  * Revision 1.30  2005/08/30 23:52:35  fwarmerdam
00035  * implement preliminary OFTBinary support
00036  *
00037  * Revision 1.29  2004/02/23 21:47:23  warmerda
00038  * Added GetUsedFields() and GetSWGExpr() methods on OGRFeatureQuery class
00039  *
00040  * Revision 1.28  2003/05/28 19:16:42  warmerda
00041  * fixed up argument names and stuff for docs
00042  *
00043  * Revision 1.27  2003/04/08 20:57:28  warmerda
00044  * added RemapFields on OGRFeature
00045  *
00046  * Revision 1.26  2003/03/04 05:46:31  warmerda
00047  * added EvaluateAgainstIndices for OGRFeatureQuery
00048  *
00049  * Revision 1.25  2003/01/08 22:03:44  warmerda
00050  * added StealGeometry() method on OGRFeature
00051  *
00052  * Revision 1.24  2002/10/09 14:31:06  warmerda
00053  * dont permit negative widths to be assigned to field definition
00054  *
00055  * Revision 1.23  2002/09/26 18:13:17  warmerda
00056  * moved some defs to ogr_core.h for sharing with ogr_api.h
00057  *
00058  * Revision 1.22  2002/08/07 21:37:47  warmerda
00059  * added indirect OGRFeaturedefn constructor/destructor
00060  *
00061  * Revision 1.21  2001/11/01 16:54:16  warmerda
00062  * added DestroyFeature
00063  *
00064  * Revision 1.20  2001/07/19 18:25:07  warmerda
00065  * expanded tabs
00066  *
00067  * Revision 1.19  2001/06/19 15:48:36  warmerda
00068  * added feature attribute query support
00069  *
00070  * Revision 1.18  2001/06/01 14:33:00  warmerda
00071  * added CreateFeature factory method
00072  *
00073  * Revision 1.17  2001/02/06 17:10:28  warmerda
00074  * export entry points from DLL
00075  *
00076  * Revision 1.16  2001/01/19 21:10:47  warmerda
00077  * replaced tabs
00078  *
00079  * Revision 1.15  2000/12/07 03:40:13  danmo
00080  * Removed stray comma in OGRFieldType enum defn
00081  *
00082  * Revision 1.14  2000/10/03 19:19:56  danmo
00083  * Made m_pszStyleString protected (was private)
00084  *
00085  * Revision 1.13  2000/10/03 18:14:29  danmo
00086  * Made OGRFeature::Get/SetStyleString() virtual
00087  *
00088  * Revision 1.12  2000/08/18 21:26:53  svillene
00089  * Add representation
00090  *
00091  * Revision 1.11  1999/11/26 03:05:38  warmerda
00092  * added unset field support
00093  *
00094  * Revision 1.10  1999/11/18 19:02:20  warmerda
00095  * expanded tabs
00096  *
00097  * Revision 1.9  1999/11/04 21:05:49  warmerda
00098  * Added the Set() method on OGRFieldDefn to set all info in one call,
00099  * and the SetFrom() method on OGRFeature to copy the contents of one
00100  * feature to another, even if of a different OGRFeatureDefn.
00101  *
00102  * Revision 1.8  1999/10/01 14:47:05  warmerda
00103  * added full family of get/set field methods with field names
00104  *
00105  * Revision 1.7  1999/08/30 14:52:33  warmerda
00106  * added support for StringList fields
00107  *
00108  * Revision 1.6  1999/08/26 17:38:00  warmerda
00109  * added support for real and integer lists
00110  *
00111  * Revision 1.5  1999/07/27 00:47:37  warmerda
00112  * Added FID to OGRFeature class
00113  *
00114  * Revision 1.4  1999/07/07 04:23:07  danmo
00115  * Fixed typo in  #define _OGR_..._H_INCLUDED  line
00116  *
00117  * Revision 1.3  1999/07/05 17:18:39  warmerda
00118  * added docs
00119  *
00120  * Revision 1.2  1999/06/11 19:21:27  warmerda
00121  * Fleshed out operational definitions
00122  *
00123  * Revision 1.1  1999/05/31 17:14:53  warmerda
00124  * New
00125  *
00126  */
00127 
00128 #ifndef _OGR_FEATURE_H_INCLUDED
00129 #define _OGR_FEATURE_H_INCLUDED
00130 
00131 #include "ogr_geometry.h"
00132 
00133 class OGRStyleTable;
00134 
00141 /************************************************************************/
00142 /*                             OGRFieldDefn                             */
00143 /************************************************************************/
00144 
00149 class CPL_DLL OGRFieldDefn
00150 {
00151   private:
00152     char                *pszName;
00153     OGRFieldType        eType;                  
00154     OGRJustification    eJustify;               
00155     int                 nWidth;                 /* zero is variable */
00156     int                 nPrecision;
00157     OGRField            uDefault;
00158 
00159     void                Initialize( const char *, OGRFieldType );
00160     
00161   public:
00162                         OGRFieldDefn( const char *, OGRFieldType );
00163                         OGRFieldDefn( OGRFieldDefn * );
00164                         ~OGRFieldDefn();
00165 
00166     void                SetName( const char * );
00167     const char         *GetNameRef() { return pszName; }
00168 
00169     OGRFieldType        GetType() { return eType; }
00170     void                SetType( OGRFieldType eTypeIn ) { eType = eTypeIn;}
00171     static const char  *GetFieldTypeName( OGRFieldType );
00172 
00173     OGRJustification    GetJustify() { return eJustify; }
00174     void                SetJustify( OGRJustification eJustifyIn )
00175                                                 { eJustify = eJustifyIn; }
00176 
00177     int                 GetWidth() { return nWidth; }
00178     void                SetWidth( int nWidthIn ) { nWidth = MAX(0,nWidthIn); }
00179 
00180     int                 GetPrecision() { return nPrecision; }
00181     void                SetPrecision( int nPrecisionIn )
00182                                                 { nPrecision = nPrecisionIn; }
00183 
00184     void                Set( const char *, OGRFieldType, int = 0, int = 0,
00185                              OGRJustification = OJUndefined );
00186 
00187     void                SetDefault( const OGRField * );
00188     const OGRField     *GetDefaultRef() { return &uDefault; }
00189 };
00190 
00191 /************************************************************************/
00192 /*                            OGRFeatureDefn                            */
00193 /************************************************************************/
00194 
00211 class CPL_DLL OGRFeatureDefn
00212 {
00213   private:
00214     int         nRefCount;
00215     
00216     int         nFieldCount;
00217     OGRFieldDefn **papoFieldDefn;
00218 
00219     OGRwkbGeometryType eGeomType;
00220 
00221     char        *pszFeatureClassName;
00222     
00223   public:
00224                 OGRFeatureDefn( const char * pszName = NULL );
00225     virtual    ~OGRFeatureDefn();
00226 
00227     const char  *GetName() { return pszFeatureClassName; }
00228 
00229     int         GetFieldCount() { return nFieldCount; }
00230     OGRFieldDefn *GetFieldDefn( int i );
00231     int         GetFieldIndex( const char * );
00232 
00233     void        AddFieldDefn( OGRFieldDefn * );
00234 
00235     OGRwkbGeometryType GetGeomType() { return eGeomType; }
00236     void        SetGeomType( OGRwkbGeometryType );
00237 
00238     OGRFeatureDefn *Clone();
00239 
00240     int         Reference() { return ++nRefCount; }
00241     int         Dereference() { return --nRefCount; }
00242     int         GetReferenceCount() { return nRefCount; }
00243     void        Release();
00244 
00245     static OGRFeatureDefn  *CreateFeatureDefn( const char *pszName = NULL );
00246     static void         DestroyFeatureDefn( OGRFeatureDefn * );
00247 };
00248 
00249 /************************************************************************/
00250 /*                              OGRFeature                              */
00251 /************************************************************************/
00252 
00257 class CPL_DLL OGRFeature
00258 {
00259   private:
00260 
00261     long                nFID;
00262     OGRFeatureDefn      *poDefn;
00263     OGRGeometry         *poGeometry;
00264     OGRField            *pauFields;
00265 
00266   protected: 
00267     char *              m_pszStyleString;
00268     OGRStyleTable       *m_poStyleTable;
00269     
00270     
00271   public:
00272                         OGRFeature( OGRFeatureDefn * );
00273     virtual            ~OGRFeature();                        
00274 
00275     OGRFeatureDefn     *GetDefnRef() { return poDefn; }
00276     
00277     OGRErr              SetGeometryDirectly( OGRGeometry * );
00278     OGRErr              SetGeometry( OGRGeometry * );
00279     OGRGeometry        *GetGeometryRef() { return poGeometry; }
00280     OGRGeometry        *StealGeometry();
00281 
00282     OGRFeature         *Clone();
00283     virtual OGRBoolean  Equal( OGRFeature * poFeature );
00284 
00285     int                 GetFieldCount() { return poDefn->GetFieldCount(); }
00286     OGRFieldDefn       *GetFieldDefnRef( int iField )
00287                                       { return poDefn->GetFieldDefn(iField); }
00288     int                 GetFieldIndex( const char * pszName)
00289                                       { return poDefn->GetFieldIndex(pszName);}
00290 
00291     int                 IsFieldSet( int iField )
00292                         { return
00293                               pauFields[iField].Set.nMarker1 != OGRUnsetMarker
00294                            || pauFields[iField].Set.nMarker2 != OGRUnsetMarker;
00295                               }
00296     
00297     void                UnsetField( int iField );
00298     
00299     OGRField           *GetRawFieldRef( int i ) { return pauFields + i; }
00300 
00301     int                 GetFieldAsInteger( int i );
00302     double              GetFieldAsDouble( int i );
00303     const char         *GetFieldAsString( int i );
00304     const int          *GetFieldAsIntegerList( int i, int *pnCount );
00305     const double       *GetFieldAsDoubleList( int i, int *pnCount );
00306     char              **GetFieldAsStringList( int i );
00307     GByte               *GetFieldAsBinary( int i, int *pnCount );
00308 
00309     int                 GetFieldAsInteger( const char *pszFName )
00310                       { return GetFieldAsInteger( GetFieldIndex(pszFName) ); }
00311     double              GetFieldAsDouble( const char *pszFName )
00312                       { return GetFieldAsDouble( GetFieldIndex(pszFName) ); }
00313     const char         *GetFieldAsString( const char *pszFName )
00314                       { return GetFieldAsString( GetFieldIndex(pszFName) ); }
00315     const int          *GetFieldAsIntegerList( const char *pszFName,
00316                                                int *pnCount )
00317                       { return GetFieldAsIntegerList( GetFieldIndex(pszFName),
00318                                                       pnCount ); }
00319     const double       *GetFieldAsDoubleList( const char *pszFName,
00320                                               int *pnCount )
00321                       { return GetFieldAsDoubleList( GetFieldIndex(pszFName),
00322                                                      pnCount ); }
00323     char              **GetFieldAsStringList( const char *pszFName )
00324                       { return GetFieldAsStringList(GetFieldIndex(pszFName)); }
00325 
00326     void                SetField( int i, int nValue );
00327     void                SetField( int i, double dfValue );
00328     void                SetField( int i, const char * pszValue );
00329     void                SetField( int i, int nCount, int * panValues );
00330     void                SetField( int i, int nCount, double * padfValues );
00331     void                SetField( int i, char ** papszValues );
00332     void                SetField( int i, OGRField * puValue );
00333     void                SetField( int i, int nCount, GByte * pabyBinary );
00334 
00335     void                SetField( const char *pszFName, int nValue )
00336                            { SetField( GetFieldIndex(pszFName), nValue ); }
00337     void                SetField( const char *pszFName, double dfValue )
00338                            { SetField( GetFieldIndex(pszFName), dfValue ); }
00339     void                SetField( const char *pszFName, const char * pszValue)
00340                            { SetField( GetFieldIndex(pszFName), pszValue ); }
00341     void                SetField( const char *pszFName, int nCount,
00342                                   int * panValues )
00343                          { SetField(GetFieldIndex(pszFName),nCount,panValues);}
00344     void                SetField( const char *pszFName, int nCount,
00345                                   double * padfValues )
00346                          {SetField(GetFieldIndex(pszFName),nCount,padfValues);}
00347     void                SetField( const char *pszFName, char ** papszValues )
00348                            { SetField( GetFieldIndex(pszFName), papszValues); }
00349     void                SetField( const char *pszFName, OGRField * puValue )
00350                            { SetField( GetFieldIndex(pszFName), puValue ); }
00351 
00352     long                GetFID() { return nFID; }
00353     virtual OGRErr      SetFID( long nFID );
00354 
00355     void                DumpReadable( FILE * );
00356 
00357     OGRErr              SetFrom( OGRFeature *, int = TRUE);
00358 
00359     OGRErr              RemapFields( OGRFeatureDefn *poNewDefn, 
00360                                      int *panRemapSource );
00361 
00362     virtual const char *GetStyleString();
00363     virtual void        SetStyleString(const char *);
00364     virtual void        SetStyleTable(OGRStyleTable *poStyleTable);
00365 
00366     static OGRFeature  *CreateFeature( OGRFeatureDefn * );
00367     static void         DestroyFeature( OGRFeature * );
00368 };
00369 
00370 /************************************************************************/
00371 /*                           OGRFeatureQuery                            */
00372 /************************************************************************/
00373 
00374 class OGRLayer;
00375 
00376 class CPL_DLL OGRFeatureQuery
00377 {
00378   private:
00379     OGRFeatureDefn *poTargetDefn;
00380     void           *pSWQExpr;
00381 
00382     char          **FieldCollector( void *, char ** );
00383     
00384   public:
00385                 OGRFeatureQuery();
00386                 ~OGRFeatureQuery();
00387 
00388     OGRErr      Compile( OGRFeatureDefn *, const char * );
00389     int         Evaluate( OGRFeature * );
00390 
00391     long       *EvaluateAgainstIndices( OGRLayer *, OGRErr * );
00392 
00393     char      **GetUsedFields();
00394 
00395     void       *GetSWGExpr() { return pSWQExpr; }
00396 };
00397 
00398 #endif /* ndef _OGR_FEATURE_H_INCLUDED */

Generated on Sun Jul 2 22:18:21 2006 for OGR by  doxygen 1.4.6