DYT/Tool/3rdParty_x64/include/ogr_feature.h
2024-11-22 23:19:31 +08:00

491 lines
21 KiB
C++

/******************************************************************************
* $Id: ogr_feature.h 33631 2016-03-04 06:28:09Z goatbar $
*
* 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;
private:
CPL_DISALLOW_COPY_ASSIGN(OGRFieldDefn);
};
/************************************************************************/
/* 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 * );
private:
CPL_DISALLOW_COPY_ASSIGN(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 * );
private:
CPL_DISALLOW_COPY_ASSIGN(OGRFeatureDefn);
};
/************************************************************************/
/* OGRFeature */
/************************************************************************/
/**
* A simple feature, including geometry and attributes.
*/
class CPL_DLL OGRFeature
{
private:
GIntBig nFID;
OGRFeatureDefn *poDefn;
OGRGeometry **papoGeometries;
OGRField *pauFields;
char *m_pszNativeData;
char *m_pszNativeMediaType;
bool SetFieldInternal( int i, OGRField * puValue );
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() CPL_WARN_UNUSED_RESULT;
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() CPL_WARN_UNUSED_RESULT;
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);
const char *GetNativeData() const { return m_pszNativeData; }
const char *GetNativeMediaType() const { return m_pszNativeMediaType; }
void SetNativeData( const char* pszNativeData );
void SetNativeMediaType( const char* pszNativeMediaType );
static OGRFeature *CreateFeature( OGRFeatureDefn * );
static void DestroyFeature( OGRFeature * );
private:
CPL_DISALLOW_COPY_ASSIGN(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 */