123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 |
- /******************************************************************************
- * $Id: ogr_feature.h 28968 2015-04-21 19:00:02Z rouault $
- *
- * Project: OpenGIS Simple Features Reference Implementation
- * Purpose: Class for representing a whole feature, and layer schemas.
- * Author: Frank Warmerdam, warmerdam@pobox.com
- *
- ******************************************************************************
- * Copyright (c) 1999, Les Technologies SoftMap Inc.
- * Copyright (c) 2008-2013, Even Rouault <even dot rouault at mines-paris dot org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- ****************************************************************************/
- #ifndef _OGR_FEATURE_H_INCLUDED
- #define _OGR_FEATURE_H_INCLUDED
- #include "ogr_geometry.h"
- #include "ogr_featurestyle.h"
- #include "cpl_atomic_ops.h"
- /**
- * \file ogr_feature.h
- *
- * Simple feature classes.
- */
- /************************************************************************/
- /* OGRFieldDefn */
- /************************************************************************/
- /**
- * Definition of an attribute of an OGRFeatureDefn. A field is described by :
- * <ul>
- * <li>a name. See SetName() / GetNameRef()</li>
- * <li>a type: OFTString, OFTInteger, OFTReal, ... See SetType() / GetType()</li>
- * <li>a subtype (optional): OFSTBoolean, ... See SetSubType() / GetSubType()</li>
- * <li>a width (optional): maximal number of characters. See SetWidth() / GetWidth()</li>
- * <li>a precision (optional): number of digits after decimal point. See SetPrecision() / GetPrecision()</li>
- * <li>a NOT NULL constraint (optional). See SetNullable() / IsNullable()</li>
- * <li>a default value (optional). See SetDefault() / GetDefault()</li>
- * <li>a boolean to indicate whether it should be ignored when retrieving features. See SetIgnored() / IsIgnored()</li>
- * </ul>
- */
- class CPL_DLL OGRFieldDefn
- {
- private:
- char *pszName;
- OGRFieldType eType;
- OGRJustification eJustify;
- int nWidth; /* zero is variable */
- int nPrecision;
- char *pszDefault;
-
- int bIgnore;
- OGRFieldSubType eSubType;
-
- int bNullable;
- void Initialize( const char *, OGRFieldType );
-
- public:
- OGRFieldDefn( const char *, OGRFieldType );
- OGRFieldDefn( OGRFieldDefn * );
- ~OGRFieldDefn();
- void SetName( const char * );
- const char *GetNameRef() { return pszName; }
- OGRFieldType GetType() { return eType; }
- void SetType( OGRFieldType eTypeIn );
- static const char *GetFieldTypeName( OGRFieldType );
- OGRFieldSubType GetSubType() { return eSubType; }
- void SetSubType( OGRFieldSubType eSubTypeIn );
- static const char *GetFieldSubTypeName( OGRFieldSubType );
- OGRJustification GetJustify() { return eJustify; }
- void SetJustify( OGRJustification eJustifyIn )
- { eJustify = eJustifyIn; }
- int GetWidth() { return nWidth; }
- void SetWidth( int nWidthIn ) { nWidth = MAX(0,nWidthIn); }
- int GetPrecision() { return nPrecision; }
- void SetPrecision( int nPrecisionIn )
- { nPrecision = nPrecisionIn; }
- void Set( const char *, OGRFieldType, int = 0, int = 0,
- OGRJustification = OJUndefined );
- void SetDefault( const char* );
- const char *GetDefault() const;
- int IsDefaultDriverSpecific() const;
- int IsIgnored() { return bIgnore; }
- void SetIgnored( int bIgnoreIn ) { bIgnore = bIgnoreIn; }
- int IsNullable() const { return bNullable; }
- void SetNullable( int bNullableIn ) { bNullable = bNullableIn; }
- int IsSame( const OGRFieldDefn * ) const;
- };
- /************************************************************************/
- /* OGRGeomFieldDefn */
- /************************************************************************/
- /**
- * Definition of a geometry field of an OGRFeatureDefn. A geometry field is
- * described by :
- * <ul>
- * <li>a name. See SetName() / GetNameRef()</li>
- * <li>a type: wkbPoint, wkbLineString, ... See SetType() / GetType()</li>
- * <li>a spatial reference system (optional). See SetSpatialRef() / GetSpatialRef()</li>
- * <li>a NOT NULL constraint (optional). See SetNullable() / IsNullable()</li>
- * <li>a boolean to indicate whether it should be ignored when retrieving features. See SetIgnored() / IsIgnored()</li>
- * </ul>
- *
- * @since OGR 1.11
- */
- class CPL_DLL OGRGeomFieldDefn
- {
- protected:
- char *pszName;
- OGRwkbGeometryType eGeomType; /* all values possible except wkbNone */
- OGRSpatialReference* poSRS;
- int bIgnore;
- int bNullable;
- void Initialize( const char *, OGRwkbGeometryType );
- public:
- OGRGeomFieldDefn(const char *pszNameIn,
- OGRwkbGeometryType eGeomTypeIn);
- OGRGeomFieldDefn( OGRGeomFieldDefn * );
- virtual ~OGRGeomFieldDefn();
- void SetName( const char * );
- const char *GetNameRef() { return pszName; }
- OGRwkbGeometryType GetType() { return eGeomType; }
- void SetType( OGRwkbGeometryType eTypeIn );
- virtual OGRSpatialReference* GetSpatialRef();
- void SetSpatialRef(OGRSpatialReference* poSRSIn);
- int IsIgnored() { return bIgnore; }
- void SetIgnored( int bIgnoreIn ) { bIgnore = bIgnoreIn; }
- int IsNullable() const { return bNullable; }
- void SetNullable( int bNullableIn ) { bNullable = bNullableIn; }
- int IsSame( OGRGeomFieldDefn * );
- };
- /************************************************************************/
- /* OGRFeatureDefn */
- /************************************************************************/
- /**
- * Definition of a feature class or feature layer.
- *
- * This object contains schema information for a set of OGRFeatures. In
- * table based systems, an OGRFeatureDefn is essentially a layer. In more
- * object oriented approaches (such as SF CORBA) this can represent a class
- * of features but doesn't necessarily relate to all of a layer, or just one
- * layer.
- *
- * This object also can contain some other information such as a name and
- * potentially other metadata.
- *
- * It is essentially a collection of field descriptions (OGRFieldDefn class).
- * Starting with GDAL 1.11, in addition to attribute fields, it can also
- * contain multiple geometry fields (OGRGeomFieldDefn class).
- *
- * It is reasonable for different translators to derive classes from
- * OGRFeatureDefn with additional translator specific information.
- */
- class CPL_DLL OGRFeatureDefn
- {
- protected:
- volatile int nRefCount;
-
- int nFieldCount;
- OGRFieldDefn **papoFieldDefn;
- int nGeomFieldCount;
- OGRGeomFieldDefn **papoGeomFieldDefn;
- char *pszFeatureClassName;
- int bIgnoreStyle;
-
- public:
- OGRFeatureDefn( const char * pszName = NULL );
- virtual ~OGRFeatureDefn();
- virtual const char *GetName();
- virtual int GetFieldCount();
- virtual OGRFieldDefn *GetFieldDefn( int i );
- virtual int GetFieldIndex( const char * );
- virtual void AddFieldDefn( OGRFieldDefn * );
- virtual OGRErr DeleteFieldDefn( int iField );
- virtual OGRErr ReorderFieldDefns( int* panMap );
- virtual int GetGeomFieldCount();
- virtual OGRGeomFieldDefn *GetGeomFieldDefn( int i );
- virtual int GetGeomFieldIndex( const char * );
- virtual void AddGeomFieldDefn( OGRGeomFieldDefn *, int bCopy = TRUE );
- virtual OGRErr DeleteGeomFieldDefn( int iGeomField );
- virtual OGRwkbGeometryType GetGeomType();
- virtual void SetGeomType( OGRwkbGeometryType );
- virtual OGRFeatureDefn *Clone();
- int Reference() { return CPLAtomicInc(&nRefCount); }
- int Dereference() { return CPLAtomicDec(&nRefCount); }
- int GetReferenceCount() { return nRefCount; }
- void Release();
- virtual int IsGeometryIgnored();
- virtual void SetGeometryIgnored( int bIgnore );
- virtual int IsStyleIgnored() { return bIgnoreStyle; }
- virtual void SetStyleIgnored( int bIgnore ) { bIgnoreStyle = bIgnore; }
- virtual int IsSame( OGRFeatureDefn * poOtherFeatureDefn );
- static OGRFeatureDefn *CreateFeatureDefn( const char *pszName = NULL );
- static void DestroyFeatureDefn( OGRFeatureDefn * );
- };
- /************************************************************************/
- /* OGRFeature */
- /************************************************************************/
- /**
- * A simple feature, including geometry and attributes.
- */
- class CPL_DLL OGRFeature
- {
- private:
- GIntBig nFID;
- OGRFeatureDefn *poDefn;
- OGRGeometry **papoGeometries;
- OGRField *pauFields;
- protected:
- char * m_pszStyleString;
- OGRStyleTable *m_poStyleTable;
- char * m_pszTmpFieldValue;
-
- public:
- OGRFeature( OGRFeatureDefn * );
- virtual ~OGRFeature();
- OGRFeatureDefn *GetDefnRef() { return poDefn; }
-
- OGRErr SetGeometryDirectly( OGRGeometry * );
- OGRErr SetGeometry( OGRGeometry * );
- OGRGeometry *GetGeometryRef();
- OGRGeometry *StealGeometry();
- int GetGeomFieldCount()
- { return poDefn->GetGeomFieldCount(); }
- OGRGeomFieldDefn *GetGeomFieldDefnRef( int iField )
- { return poDefn->GetGeomFieldDefn(iField); }
- int GetGeomFieldIndex( const char * pszName)
- { return poDefn->GetGeomFieldIndex(pszName); }
- OGRGeometry* GetGeomFieldRef(int iField);
- OGRGeometry* StealGeometry(int iField);
- OGRGeometry* GetGeomFieldRef(const char* pszFName);
- OGRErr SetGeomFieldDirectly( int iField, OGRGeometry * );
- OGRErr SetGeomField( int iField, OGRGeometry * );
- OGRFeature *Clone();
- virtual OGRBoolean Equal( OGRFeature * poFeature );
- int GetFieldCount() { return poDefn->GetFieldCount(); }
- OGRFieldDefn *GetFieldDefnRef( int iField )
- { return poDefn->GetFieldDefn(iField); }
- int GetFieldIndex( const char * pszName)
- { return poDefn->GetFieldIndex(pszName);}
- int IsFieldSet( int iField );
-
- void UnsetField( int iField );
-
- OGRField *GetRawFieldRef( int i ) { return pauFields + i; }
- int GetFieldAsInteger( int i );
- GIntBig GetFieldAsInteger64( int i );
- double GetFieldAsDouble( int i );
- const char *GetFieldAsString( int i );
- const int *GetFieldAsIntegerList( int i, int *pnCount );
- const GIntBig *GetFieldAsInteger64List( int i, int *pnCount );
- const double *GetFieldAsDoubleList( int i, int *pnCount );
- char **GetFieldAsStringList( int i );
- GByte *GetFieldAsBinary( int i, int *pnCount );
- int GetFieldAsDateTime( int i,
- int *pnYear, int *pnMonth, int *pnDay,
- int *pnHour, int *pnMinute, int *pnSecond,
- int *pnTZFlag );
- int GetFieldAsDateTime( int i,
- int *pnYear, int *pnMonth, int *pnDay,
- int *pnHour, int *pnMinute, float *pfSecond,
- int *pnTZFlag );
- int GetFieldAsInteger( const char *pszFName )
- { return GetFieldAsInteger( GetFieldIndex(pszFName) ); }
- GIntBig GetFieldAsInteger64( const char *pszFName )
- { return GetFieldAsInteger64( GetFieldIndex(pszFName) ); }
- double GetFieldAsDouble( const char *pszFName )
- { return GetFieldAsDouble( GetFieldIndex(pszFName) ); }
- const char *GetFieldAsString( const char *pszFName )
- { return GetFieldAsString( GetFieldIndex(pszFName) ); }
- const int *GetFieldAsIntegerList( const char *pszFName,
- int *pnCount )
- { return GetFieldAsIntegerList( GetFieldIndex(pszFName),
- pnCount ); }
- const GIntBig *GetFieldAsInteger64List( const char *pszFName,
- int *pnCount )
- { return GetFieldAsInteger64List( GetFieldIndex(pszFName),
- pnCount ); }
- const double *GetFieldAsDoubleList( const char *pszFName,
- int *pnCount )
- { return GetFieldAsDoubleList( GetFieldIndex(pszFName),
- pnCount ); }
- char **GetFieldAsStringList( const char *pszFName )
- { return GetFieldAsStringList(GetFieldIndex(pszFName)); }
- void SetField( int i, int nValue );
- void SetField( int i, GIntBig nValue );
- void SetField( int i, double dfValue );
- void SetField( int i, const char * pszValue );
- void SetField( int i, int nCount, int * panValues );
- void SetField( int i, int nCount, const GIntBig * panValues );
- void SetField( int i, int nCount, double * padfValues );
- void SetField( int i, char ** papszValues );
- void SetField( int i, OGRField * puValue );
- void SetField( int i, int nCount, GByte * pabyBinary );
- void SetField( int i, int nYear, int nMonth, int nDay,
- int nHour=0, int nMinute=0, float fSecond=0.f,
- int nTZFlag = 0 );
- void SetField( const char *pszFName, int nValue )
- { SetField( GetFieldIndex(pszFName), nValue ); }
- void SetField( const char *pszFName, GIntBig nValue )
- { SetField( GetFieldIndex(pszFName), nValue ); }
- void SetField( const char *pszFName, double dfValue )
- { SetField( GetFieldIndex(pszFName), dfValue ); }
- void SetField( const char *pszFName, const char * pszValue)
- { SetField( GetFieldIndex(pszFName), pszValue ); }
- void SetField( const char *pszFName, int nCount,
- int * panValues )
- { SetField(GetFieldIndex(pszFName),nCount,panValues);}
- void SetField( const char *pszFName, int nCount,
- const GIntBig * panValues )
- { SetField(GetFieldIndex(pszFName),nCount,panValues);}
- void SetField( const char *pszFName, int nCount,
- double * padfValues )
- {SetField(GetFieldIndex(pszFName),nCount,padfValues);}
- void SetField( const char *pszFName, char ** papszValues )
- { SetField( GetFieldIndex(pszFName), papszValues); }
- void SetField( const char *pszFName, OGRField * puValue )
- { SetField( GetFieldIndex(pszFName), puValue ); }
- void SetField( const char *pszFName,
- int nYear, int nMonth, int nDay,
- int nHour=0, int nMinute=0, float fSecond=0.f,
- int nTZFlag = 0 )
- { SetField( GetFieldIndex(pszFName),
- nYear, nMonth, nDay,
- nHour, nMinute, fSecond, nTZFlag ); }
- GIntBig GetFID() { return nFID; }
- virtual OGRErr SetFID( GIntBig nFIDIn );
- void DumpReadable( FILE *, char** papszOptions = NULL );
- OGRErr SetFrom( OGRFeature *, int = TRUE);
- OGRErr SetFrom( OGRFeature *, int *, int = TRUE );
- OGRErr SetFieldsFrom( OGRFeature *, int *, int = TRUE );
- OGRErr RemapFields( OGRFeatureDefn *poNewDefn,
- int *panRemapSource );
- OGRErr RemapGeomFields( OGRFeatureDefn *poNewDefn,
- int *panRemapSource );
- int Validate( int nValidateFlags,
- int bEmitError );
- void FillUnsetWithDefault(int bNotNullableOnly,
- char** papszOptions );
- virtual const char *GetStyleString();
- virtual void SetStyleString( const char * );
- virtual void SetStyleStringDirectly( char * );
- virtual OGRStyleTable *GetStyleTable() { return m_poStyleTable; }
- virtual void SetStyleTable(OGRStyleTable *poStyleTable);
- virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable);
- static OGRFeature *CreateFeature( OGRFeatureDefn * );
- static void DestroyFeature( OGRFeature * );
- };
- /************************************************************************/
- /* OGRFeatureQuery */
- /************************************************************************/
- class OGRLayer;
- class swq_expr_node;
- class swq_custom_func_registrar;
- class CPL_DLL OGRFeatureQuery
- {
- private:
- OGRFeatureDefn *poTargetDefn;
- void *pSWQExpr;
- char **FieldCollector( void *, char ** );
- GIntBig *EvaluateAgainstIndices( swq_expr_node*, OGRLayer *, GIntBig& nFIDCount);
-
- int CanUseIndex( swq_expr_node*, OGRLayer * );
-
- public:
- OGRFeatureQuery();
- ~OGRFeatureQuery();
- OGRErr Compile( OGRFeatureDefn *, const char *,
- int bCheck = TRUE, swq_custom_func_registrar* poCustomFuncRegistrar = NULL );
- int Evaluate( OGRFeature * );
- GIntBig *EvaluateAgainstIndices( OGRLayer *, OGRErr * );
-
- int CanUseIndex( OGRLayer * );
- char **GetUsedFields();
- void *GetSWQExpr() { return pSWQExpr; }
- };
- #endif /* ndef _OGR_FEATURE_H_INCLUDED */
|