ultimatepp/bazaar/plugin/gdal/ogr/ogrfeaturedefn.cpp
cxl 23ff1e7e82 .gdal moved to bazaar
git-svn-id: svn://ultimatepp.org/upp/trunk@9273 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2015-12-07 13:36:24 +00:00

1397 lines
45 KiB
C++

/******************************************************************************
* $Id: ogrfeaturedefn.cpp 28807 2015-03-28 14:46:31Z rouault $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRFeatureDefn class implementation.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 1999, Les Technologies SoftMap Inc.
* Copyright (c) 2009-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.
****************************************************************************/
#include "ogr_feature.h"
#include "ogr_api.h"
#include "ogr_p.h"
#include "ograpispy.h"
CPL_CVSID("$Id: ogrfeaturedefn.cpp 28807 2015-03-28 14:46:31Z rouault $");
/************************************************************************/
/* OGRFeatureDefn() */
/************************************************************************/
/**
* \brief Constructor.
*
* The OGRFeatureDefn maintains a reference count, but this starts at
* zero. It is mainly intended to represent a count of OGRFeature's
* based on this definition.
*
* This method is the same as the C function OGR_FD_Create().
*
* @param pszName the name to be assigned to this layer/class. It does not
* need to be unique.
*/
OGRFeatureDefn::OGRFeatureDefn( const char * pszName )
{
pszFeatureClassName = CPLStrdup( pszName );
nRefCount = 0;
nFieldCount = 0;
papoFieldDefn = NULL;
nGeomFieldCount = 1;
papoGeomFieldDefn = (OGRGeomFieldDefn**) CPLMalloc(sizeof(OGRGeomFieldDefn*));
papoGeomFieldDefn[0] = new OGRGeomFieldDefn("", wkbUnknown);
bIgnoreStyle = FALSE;
}
/************************************************************************/
/* OGR_FD_Create() */
/************************************************************************/
/**
* \brief Create a new feature definition object to hold the field definitions.
*
* The OGRFeatureDefn maintains a reference count, but this starts at
* zero, and should normally be incremented by the owner.
*
* This function is the same as the C++ method
* OGRFeatureDefn::OGRFeatureDefn().
*
* @param pszName the name to be assigned to this layer/class. It does not
* need to be unique.
* @return handle to the newly created feature definition.
*/
OGRFeatureDefnH OGR_FD_Create( const char *pszName )
{
return (OGRFeatureDefnH) new OGRFeatureDefn( pszName );
}
/************************************************************************/
/* ~OGRFeatureDefn() */
/************************************************************************/
OGRFeatureDefn::~OGRFeatureDefn()
{
if( nRefCount != 0 )
{
CPLDebug( "OGRFeatureDefn",
"OGRFeatureDefn %s with a ref count of %d deleted!\n",
pszFeatureClassName, nRefCount );
}
CPLFree( pszFeatureClassName );
for( int i = 0; i < nFieldCount; i++ )
{
delete papoFieldDefn[i];
}
CPLFree( papoFieldDefn );
for( int i = 0; i < nGeomFieldCount; i++ )
{
delete papoGeomFieldDefn[i];
}
CPLFree( papoGeomFieldDefn );
}
/************************************************************************/
/* OGR_FD_Destroy() */
/************************************************************************/
/**
* \brief Destroy a feature definition object and release all memory associated with it.
*
* This function is the same as the C++ method
* OGRFeatureDefn::~OGRFeatureDefn().
*
* @param hDefn handle to the feature definition to be destroyed.
*/
void OGR_FD_Destroy( OGRFeatureDefnH hDefn )
{
delete (OGRFeatureDefn *) hDefn;
}
/************************************************************************/
/* Release() */
/************************************************************************/
/**
* \fn void OGRFeatureDefn::Release();
*
* \brief Drop a reference to this object, and destroy if no longer referenced.
*/
void OGRFeatureDefn::Release()
{
CPLAssert( NULL != this );
if( Dereference() <= 0 )
delete this;
}
/************************************************************************/
/* OGR_FD_Release() */
/************************************************************************/
/**
* \brief Drop a reference, and destroy if unreferenced.
*
* This function is the same as the C++ method OGRFeatureDefn::Release().
*
* @param hDefn handle to the feature definition to be released.
*/
void OGR_FD_Release( OGRFeatureDefnH hDefn )
{
((OGRFeatureDefn *) hDefn)->Release();
}
/************************************************************************/
/* Clone() */
/************************************************************************/
/**
* \fn OGRFeatureDefn *OGRFeatureDefn::Clone();
*
* \brief Create a copy of this feature definition.
*
* Creates a deep copy of the feature definition.
*
* @return the copy.
*/
OGRFeatureDefn *OGRFeatureDefn::Clone()
{
int i;
OGRFeatureDefn *poCopy;
poCopy = new OGRFeatureDefn( GetName() );
GetFieldCount();
for( i = 0; i < nFieldCount; i++ )
poCopy->AddFieldDefn( GetFieldDefn( i ) );
/* There is a default geometry field created at OGRFeatureDefn instanciation */
poCopy->DeleteGeomFieldDefn(0);
GetGeomFieldCount();
for( i = 0; i < nGeomFieldCount; i++ )
poCopy->AddGeomFieldDefn( GetGeomFieldDefn( i ) );
return poCopy;
}
/************************************************************************/
/* GetName() */
/************************************************************************/
/**
* \fn const char *OGRFeatureDefn::GetName();
*
* \brief Get name of this OGRFeatureDefn.
*
* This method is the same as the C function OGR_FD_GetName().
*
* @return the name. This name is internal and should not be modified, or
* freed.
*/
const char * OGRFeatureDefn::GetName()
{
return pszFeatureClassName;
}
/************************************************************************/
/* OGR_FD_GetName() */
/************************************************************************/
/**
* \brief Get name of the OGRFeatureDefn passed as an argument.
*
* This function is the same as the C++ method OGRFeatureDefn::GetName().
*
* @param hDefn handle to the feature definition to get the name from.
* @return the name. This name is internal and should not be modified, or
* freed.
*/
const char *OGR_FD_GetName( OGRFeatureDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->GetName();
}
/************************************************************************/
/* GetFieldCount() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::GetFieldCount();
*
* \brief Fetch number of fields on this feature.
*
* This method is the same as the C function OGR_FD_GetFieldCount().
* @return count of fields.
*/
int OGRFeatureDefn::GetFieldCount()
{
return nFieldCount;
}
/************************************************************************/
/* OGR_FD_GetFieldCount() */
/************************************************************************/
/**
* \brief Fetch number of fields on the passed feature definition.
*
* This function is the same as the C++ OGRFeatureDefn::GetFieldCount().
*
* @param hDefn handle to the feature definition to get the fields count from.
* @return count of fields.
*/
int OGR_FD_GetFieldCount( OGRFeatureDefnH hDefn )
{
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetFieldCount(hDefn);
#endif
return ((OGRFeatureDefn *) hDefn)->GetFieldCount();
}
/************************************************************************/
/* GetFieldDefn() */
/************************************************************************/
/**
* \brief Fetch field definition.
*
* This method is the same as the C function OGR_FD_GetFieldDefn().
*
* Starting with GDAL 1.7.0, this method will also issue an error if the index
* is not valid.
*
* @param iField the field to fetch, between 0 and GetFieldCount()-1.
*
* @return a pointer to an internal field definition object or NULL if invalid index.
* This object should not be modified or freed by the application.
*/
OGRFieldDefn *OGRFeatureDefn::GetFieldDefn( int iField )
{
if( iField < 0 || iField >= GetFieldCount() )
{
CPLError(CE_Failure, CPLE_AppDefined, "Invalid index : %d", iField);
return NULL;
}
return papoFieldDefn[iField];
}
/************************************************************************/
/* OGR_FD_GetFieldDefn() */
/************************************************************************/
/**
* \brief Fetch field definition of the passed feature definition.
*
* This function is the same as the C++ method
* OGRFeatureDefn::GetFieldDefn().
*
* Starting with GDAL 1.7.0, this method will also issue an error if the index
* is not valid.
*
* @param hDefn handle to the feature definition to get the field definition
* from.
* @param iField the field to fetch, between 0 and GetFieldCount()-1.
*
* @return an handle to an internal field definition object or NULL if invalid index.
* This object should not be modified or freed by the application.
*/
OGRFieldDefnH OGR_FD_GetFieldDefn( OGRFeatureDefnH hDefn, int iField )
{
OGRFieldDefnH hFieldDefnH = (OGRFieldDefnH) ((OGRFeatureDefn *) hDefn)->GetFieldDefn( iField );
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetFieldDefn(hDefn, iField, hFieldDefnH);
#endif
return hFieldDefnH;
}
/************************************************************************/
/* AddFieldDefn() */
/************************************************************************/
/**
* \brief Add a new field definition.
*
* To add a new field definition to a layer definition, do not use this
* function directly, but use OGRLayer::CreateField() instead.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn. The OGRFieldDefn
* passed in is copied, and remains the responsibility of the caller.
*
* This method is the same as the C function OGR_FD_AddFieldDefn().
*
* @param poNewDefn the definition of the new field.
*/
void OGRFeatureDefn::AddFieldDefn( OGRFieldDefn * poNewDefn )
{
GetFieldCount();
papoFieldDefn = (OGRFieldDefn **)
CPLRealloc( papoFieldDefn, sizeof(void*)*(nFieldCount+1) );
papoFieldDefn[nFieldCount] = new OGRFieldDefn( poNewDefn );
nFieldCount++;
}
/************************************************************************/
/* OGR_FD_AddFieldDefn() */
/************************************************************************/
/**
* \brief Add a new field definition to the passed feature definition.
*
* To add a new field definition to a layer definition, do not use this
* function directly, but use OGR_L_CreateField() instead.
*
* This function should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn. The OGRFieldDefn
* passed in is copied, and remains the responsibility of the caller.
*
* This function is the same as the C++ method OGRFeatureDefn::AddFieldDefn().
*
* @param hDefn handle to the feature definition to add the field definition
* to.
* @param hNewField handle to the new field definition.
*/
void OGR_FD_AddFieldDefn( OGRFeatureDefnH hDefn, OGRFieldDefnH hNewField )
{
((OGRFeatureDefn *) hDefn)->AddFieldDefn( (OGRFieldDefn *) hNewField );
}
/************************************************************************/
/* DeleteFieldDefn() */
/************************************************************************/
/**
* \brief Delete an existing field definition.
*
* To delete an existing field definition from a layer definition, do not use this
* function directly, but use OGRLayer::DeleteField() instead.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn.
*
* This method is the same as the C function OGR_FD_DeleteFieldDefn().
*
* @param iField the index of the field defintion.
* @return OGRERR_NONE in case of success.
* @since OGR 1.9.0
*/
OGRErr OGRFeatureDefn::DeleteFieldDefn( int iField )
{
if (iField < 0 || iField >= GetFieldCount())
return OGRERR_FAILURE;
delete papoFieldDefn[iField];
papoFieldDefn[iField] = NULL;
if (iField < nFieldCount - 1)
{
memmove(papoFieldDefn + iField,
papoFieldDefn + iField + 1,
(nFieldCount - 1 - iField) * sizeof(void*));
}
nFieldCount--;
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_FD_DeleteFieldDefn() */
/************************************************************************/
/**
* \brief Delete an existing field definition.
*
* To delete an existing field definition from a layer definition, do not use this
* function directly, but use OGR_L_DeleteField() instead.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn.
*
* This method is the same as the C++ method OGRFeatureDefn::DeleteFieldDefn().
*
* @param hDefn handle to the feature definition.
* @param iField the index of the field defintion.
* @return OGRERR_NONE in case of success.
* @since OGR 1.9.0
*/
OGRErr OGR_FD_DeleteFieldDefn( OGRFeatureDefnH hDefn, int iField )
{
return ((OGRFeatureDefn *) hDefn)->DeleteFieldDefn( iField );
}
/************************************************************************/
/* ReorderFieldDefns() */
/************************************************************************/
/**
* \brief Reorder the field definitions in the array of the feature definition
*
* To reorder the field definitions in a layer definition, do not use this
* function directly, but use OGR_L_ReorderFields() instead.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn.
*
* This method is the same as the C function OGR_FD_ReorderFieldDefns().
*
* @param panMap an array of GetFieldCount() elements which
* is a permutation of [0, GetFieldCount()-1]. panMap is such that,
* for each field definition at position i after reordering,
* its position before reordering was panMap[i].
* @return OGRERR_NONE in case of success.
* @since OGR 1.9.0
*/
OGRErr OGRFeatureDefn::ReorderFieldDefns( int* panMap )
{
if (GetFieldCount() == 0)
return OGRERR_NONE;
OGRErr eErr = OGRCheckPermutation(panMap, nFieldCount);
if (eErr != OGRERR_NONE)
return eErr;
OGRFieldDefn** papoFieldDefnNew = (OGRFieldDefn**)
CPLMalloc(sizeof(OGRFieldDefn*) * nFieldCount);
for(int i=0;i<nFieldCount;i++)
{
papoFieldDefnNew[i] = papoFieldDefn[panMap[i]];
}
CPLFree(papoFieldDefn);
papoFieldDefn = papoFieldDefnNew;
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_FD_ReorderFieldDefns() */
/************************************************************************/
/**
* \brief Reorder the field definitions in the array of the feature definition
*
* To reorder the field definitions in a layer definition, do not use this
* function directly, but use OGR_L_ReorderFields() instead.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn.
*
* This method is the same as the C++ method OGRFeatureDefn::ReorderFieldDefns().
*
* @param hDefn handle to the feature definition.
* @param panMap an array of GetFieldCount() elements which
* is a permutation of [0, GetFieldCount()-1]. panMap is such that,
* for each field definition at position i after reordering,
* its position before reordering was panMap[i].
* @return OGRERR_NONE in case of success.
* @since OGR 1.9.0
*/
OGRErr OGR_FD_ReorderFieldDefn( OGRFeatureDefnH hDefn, int* panMap )
{
return ((OGRFeatureDefn *) hDefn)->ReorderFieldDefns( panMap );
}
/************************************************************************/
/* GetGeomFieldCount() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::GetGeomFieldCount();
*
* \brief Fetch number of geometry fields on this feature.
*
* This method is the same as the C function OGR_FD_GetGeomFieldCount().
* @return count of geometry fields.
*
* @since GDAL 1.11
*/
int OGRFeatureDefn::GetGeomFieldCount()
{
return nGeomFieldCount;
}
/************************************************************************/
/* OGR_FD_GetGeomFieldCount() */
/************************************************************************/
/**
* \brief Fetch number of geometry fields on the passed feature definition.
*
* This function is the same as the C++ OGRFeatureDefn::GetGeomFieldCount().
*
* @param hDefn handle to the feature definition to get the fields count from.
* @return count of geometry fields.
*
* @since GDAL 1.11
*/
int OGR_FD_GetGeomFieldCount( OGRFeatureDefnH hDefn )
{
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetGeomFieldCount(hDefn);
#endif
return ((OGRFeatureDefn *) hDefn)->GetGeomFieldCount();
}
/************************************************************************/
/* GetGeomFieldDefn() */
/************************************************************************/
/**
* \brief Fetch geometry field definition.
*
* This method is the same as the C function OGR_FD_GetGeomFieldDefn().
*
* @param iGeomField the geometry field to fetch, between 0 and GetGeomFieldCount()-1.
*
* @return a pointer to an internal field definition object or NULL if invalid index.
* This object should not be modified or freed by the application.
*
* @since GDAL 1.11
*/
OGRGeomFieldDefn *OGRFeatureDefn::GetGeomFieldDefn( int iGeomField )
{
if( iGeomField < 0 || iGeomField >= GetGeomFieldCount() )
{
CPLError(CE_Failure, CPLE_AppDefined, "Invalid index : %d", iGeomField);
return NULL;
}
return papoGeomFieldDefn[iGeomField];
}
/************************************************************************/
/* OGR_FD_GetGeomFieldDefn() */
/************************************************************************/
/**
* \brief Fetch geometry field definition of the passed feature definition.
*
* This function is the same as the C++ method
* OGRFeatureDefn::GetGeomFieldDefn().
*
* @param hDefn handle to the feature definition to get the field definition
* from.
* @param iGeomField the geometry field to fetch, between 0 and GetGeomFieldCount()-1.
*
* @return an handle to an internal field definition object or NULL if invalid index.
* This object should not be modified or freed by the application.
*
* @since GDAL 1.11
*/
OGRGeomFieldDefnH OGR_FD_GetGeomFieldDefn( OGRFeatureDefnH hDefn, int iGeomField )
{
OGRGeomFieldDefnH hGeomField =
(OGRGeomFieldDefnH) ((OGRFeatureDefn *) hDefn)->GetGeomFieldDefn( iGeomField );
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetGeomFieldDefn(hDefn, iGeomField, hGeomField);
#endif
return hGeomField;
}
/************************************************************************/
/* AddGeomFieldDefn() */
/************************************************************************/
/**
* \brief Add a new geometry field definition.
*
* To add a new geometry field definition to a layer definition, do not use this
* function directly, but use OGRLayer::CreateGeomField() instead.
*
* This method does an internal copy of the passed geometry field definition,
* unless bCopy is set to FALSE (in which case it takes ownership of the
* field definition.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn. The OGRGeomFieldDefn
* passed in is copied, and remains the responsibility of the caller.
*
* This method is the same as the C function OGR_FD_AddGeomFieldDefn().
*
* @param poNewDefn the definition of the new geometry field.
* @param bCopy whether poNewDefn should be copied.
*
* @since GDAL 1.11
*/
void OGRFeatureDefn::AddGeomFieldDefn( OGRGeomFieldDefn * poNewDefn,
int bCopy )
{
GetGeomFieldCount();
papoGeomFieldDefn = (OGRGeomFieldDefn **)
CPLRealloc( papoGeomFieldDefn, sizeof(void*)*(nGeomFieldCount+1) );
papoGeomFieldDefn[nGeomFieldCount] = (bCopy) ?
new OGRGeomFieldDefn( poNewDefn ) : poNewDefn;
nGeomFieldCount++;
}
/************************************************************************/
/* OGR_FD_AddGeomFieldDefn() */
/************************************************************************/
/**
* \brief Add a new field definition to the passed feature definition.
*
* To add a new field definition to a layer definition, do not use this
* function directly, but use OGR_L_CreateGeomField() instead.
*
* This function should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn. The OGRGeomFieldDefn
* passed in is copied, and remains the responsibility of the caller.
*
* This function is the same as the C++ method OGRFeatureDefn::AddGeomFieldDefn().
*
* @param hDefn handle to the feature definition to add the geometry field definition
* to.
* @param hNewGeomField handle to the new field definition.
*
* @since GDAL 1.11
*/
void OGR_FD_AddGeomFieldDefn( OGRFeatureDefnH hDefn, OGRGeomFieldDefnH hNewGeomField )
{
((OGRFeatureDefn *) hDefn)->AddGeomFieldDefn( (OGRGeomFieldDefn *) hNewGeomField );
}
/************************************************************************/
/* DeleteGeomFieldDefn() */
/************************************************************************/
/**
* \brief Delete an existing geometry field definition.
*
* To delete an existing field definition from a layer definition, do not use this
* function directly, but use OGRLayer::DeleteGeomField() instead.
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn.
*
* This method is the same as the C function OGR_FD_DeleteGeomFieldDefn().
*
* @param iGeomField the index of the geometry field defintion.
* @return OGRERR_NONE in case of success.
*
* @since GDAL 1.11
*/
OGRErr OGRFeatureDefn::DeleteGeomFieldDefn( int iGeomField )
{
if (iGeomField < 0 || iGeomField >= GetGeomFieldCount())
return OGRERR_FAILURE;
delete papoGeomFieldDefn[iGeomField];
papoGeomFieldDefn[iGeomField] = NULL;
if (iGeomField < nGeomFieldCount - 1)
{
memmove(papoGeomFieldDefn + iGeomField,
papoGeomFieldDefn + iGeomField + 1,
(nGeomFieldCount - 1 - iGeomField) * sizeof(void*));
}
nGeomFieldCount--;
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_FD_DeleteGeomFieldDefn() */
/************************************************************************/
/**
* \brief Delete an existing geometry field definition.
*
* To delete an existing geometry field definition from a layer definition, do not use this
* function directly, but use OGR_L_DeleteGeomField() instead (*not implemented yet*)
*
* This method should only be called while there are no OGRFeature
* objects in existance based on this OGRFeatureDefn.
*
* This method is the same as the C++ method OGRFeatureDefn::DeleteGeomFieldDefn().
*
* @param hDefn handle to the feature definition.
* @param iGeomField the index of the geometry field defintion.
* @return OGRERR_NONE in case of success.
*
* @since GDAL 1.11
*/
OGRErr OGR_FD_DeleteGeomFieldDefn( OGRFeatureDefnH hDefn, int iGeomField )
{
return ((OGRFeatureDefn *) hDefn)->DeleteGeomFieldDefn( iGeomField );
}
/************************************************************************/
/* GetGeomFieldIndex() */
/************************************************************************/
/**
* \brief Find geometry field by name.
*
* The geometry field index of the first geometry field matching the passed
* field name (case insensitively) is returned.
*
* This method is the same as the C function OGR_FD_GetGeomFieldIndex().
*
* @param pszGeomFieldName the geometry field name to search for.
*
* @return the geometry field index, or -1 if no match found.
*/
int OGRFeatureDefn::GetGeomFieldIndex( const char * pszGeomFieldName )
{
GetGeomFieldCount();
for( int i = 0; i < nGeomFieldCount; i++ )
{
if( EQUAL(pszGeomFieldName, GetGeomFieldDefn(i)->GetNameRef() ) )
return i;
}
return -1;
}
/************************************************************************/
/* OGR_FD_GetGeomFieldIndex() */
/************************************************************************/
/**
* \brief Find geometry field by name.
*
* The geometry field index of the first geometry field matching the passed
* field name (case insensitively) is returned.
*
* This function is the same as the C++ method OGRFeatureDefn::GetGeomFieldIndex.
*
* @param hDefn handle to the feature definition to get field index from.
* @param pszGeomFieldName the geometry field name to search for.
*
* @return the geometry field index, or -1 if no match found.
*/
int OGR_FD_GetGeomFieldIndex( OGRFeatureDefnH hDefn,
const char *pszGeomFieldName )
{
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetGeomFieldIndex(hDefn, pszGeomFieldName);
#endif
return ((OGRFeatureDefn *)hDefn)->GetGeomFieldIndex( pszGeomFieldName );
}
/************************************************************************/
/* GetGeomType() */
/************************************************************************/
/**
* \fn OGRwkbGeometryType OGRFeatureDefn::GetGeomType();
*
* \brief Fetch the geometry base type.
*
* Note that some drivers are unable to determine a specific geometry
* type for a layer, in which case wkbUnknown is returned. A value of
* wkbNone indicates no geometry is available for the layer at all.
* Many drivers do not properly mark the geometry
* type as 25D even if some or all geometries are in fact 25D. A few (broken)
* drivers return wkbPolygon for layers that also include wkbMultiPolygon.
*
* Starting with GDAL 1.11, this method returns GetGeomFieldDefn(0)->GetType().
*
* This method is the same as the C function OGR_FD_GetGeomType().
*
* @return the base type for all geometry related to this definition.
*/
OGRwkbGeometryType OGRFeatureDefn::GetGeomType()
{
if( GetGeomFieldCount() == 0 )
return wkbNone;
OGRwkbGeometryType eType = GetGeomFieldDefn(0)->GetType();
if( eType == (wkbUnknown | wkb25DBitInternalUse) && CSLTestBoolean(CPLGetConfigOption("QGIS_HACK", "NO")) )
eType = wkbUnknown;
return eType;
}
/************************************************************************/
/* OGR_FD_GetGeomType() */
/************************************************************************/
/**
* \brief Fetch the geometry base type of the passed feature definition.
*
* This function is the same as the C++ method OGRFeatureDefn::GetGeomType().
*
* Starting with GDAL 1.11, this method returns GetGeomFieldDefn(0)->GetType().
*
* @param hDefn handle to the feature definition to get the geometry type from.
* @return the base type for all geometry related to this definition.
*/
OGRwkbGeometryType OGR_FD_GetGeomType( OGRFeatureDefnH hDefn )
{
OGRwkbGeometryType eType = ((OGRFeatureDefn *) hDefn)->GetGeomType();
if( OGR_GT_IsNonLinear(eType) && !OGRGetNonLinearGeometriesEnabledFlag() )
{
eType = OGR_GT_GetLinear(eType);
}
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetGeomType(hDefn);
#endif
return eType;
}
/************************************************************************/
/* SetGeomType() */
/************************************************************************/
/**
* \brief Assign the base geometry type for this layer.
*
* All geometry objects using this type must be of the defined type or
* a derived type. The default upon creation is wkbUnknown which allows for
* any geometry type. The geometry type should generally not be changed
* after any OGRFeatures have been created against this definition.
*
* This method is the same as the C function OGR_FD_SetGeomType().
*
* Starting with GDAL 1.11, this method calls GetGeomFieldDefn(0)->SetType().
*
* @param eNewType the new type to assign.
*/
void OGRFeatureDefn::SetGeomType( OGRwkbGeometryType eNewType )
{
if( GetGeomFieldCount() > 0 )
{
if( GetGeomFieldCount() == 1 && eNewType == wkbNone )
DeleteGeomFieldDefn(0);
else
GetGeomFieldDefn(0)->SetType(eNewType);
}
else if( eNewType != wkbNone )
{
OGRGeomFieldDefn oGeomFieldDefn( "", eNewType );
AddGeomFieldDefn(&oGeomFieldDefn);
}
}
/************************************************************************/
/* OGR_FD_SetGeomType() */
/************************************************************************/
/**
* \brief Assign the base geometry type for the passed layer (the same as the feature definition).
*
* All geometry objects using this type must be of the defined type or
* a derived type. The default upon creation is wkbUnknown which allows for
* any geometry type. The geometry type should generally not be changed
* after any OGRFeatures have been created against this definition.
*
* This function is the same as the C++ method OGRFeatureDefn::SetGeomType().
*
* Starting with GDAL 1.11, this method calls GetGeomFieldDefn(0)->SetType().
*
* @param hDefn handle to the layer or feature definition to set the geometry
* type to.
* @param eType the new type to assign.
*/
void OGR_FD_SetGeomType( OGRFeatureDefnH hDefn, OGRwkbGeometryType eType )
{
((OGRFeatureDefn *) hDefn)->SetGeomType( eType );
}
/************************************************************************/
/* Reference() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::Reference();
*
* \brief Increments the reference count by one.
*
* The reference count is used keep track of the number of OGRFeature
* objects referencing this definition.
*
* This method is the same as the C function OGR_FD_Reference().
*
* @return the updated reference count.
*/
/************************************************************************/
/* OGR_FD_Reference() */
/************************************************************************/
/**
* \brief Increments the reference count by one.
*
* The reference count is used keep track of the number of OGRFeature
* objects referencing this definition.
*
* This function is the same as the C++ method OGRFeatureDefn::Reference().
*
* @param hDefn handle to the feature definition on witch OGRFeature are
* based on.
* @return the updated reference count.
*/
int OGR_FD_Reference( OGRFeatureDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->Reference();
}
/************************************************************************/
/* Dereference() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::Dereference();
*
* \brief Decrements the reference count by one.
*
* This method is the same as the C function OGR_FD_Dereference().
*
* @return the updated reference count.
*/
/************************************************************************/
/* OGR_FD_Dereference() */
/************************************************************************/
/**
* \brief Decrements the reference count by one.
*
* This function is the same as the C++ method OGRFeatureDefn::Dereference().
*
* @param hDefn handle to the feature definition on witch OGRFeature are
* based on.
* @return the updated reference count.
*/
int OGR_FD_Dereference( OGRFeatureDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->Dereference();
}
/************************************************************************/
/* GetReferenceCount() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::GetReferenceCount();
*
* \brief Fetch current reference count.
*
* This method is the same as the C function OGR_FD_GetReferenceCount().
*
* @return the current reference count.
*/
/************************************************************************/
/* OGR_FD_GetReferenceCount() */
/************************************************************************/
/**
* \brief Fetch current reference count.
*
* This function is the same as the C++ method
* OGRFeatureDefn::GetReferenceCount().
*
* @param hDefn handle to the feature definition on witch OGRFeature are
* based on.
* @return the current reference count.
*/
int OGR_FD_GetReferenceCount( OGRFeatureDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->GetReferenceCount();
}
/************************************************************************/
/* GetFieldIndex() */
/************************************************************************/
/**
* \brief Find field by name.
*
* The field index of the first field matching the passed field name (case
* insensitively) is returned.
*
* This method is the same as the C function OGR_FD_GetFieldIndex().
*
* @param pszFieldName the field name to search for.
*
* @return the field index, or -1 if no match found.
*/
int OGRFeatureDefn::GetFieldIndex( const char * pszFieldName )
{
GetFieldCount();
for( int i = 0; i < nFieldCount; i++ )
{
if( EQUAL(pszFieldName, GetFieldDefn(i)->GetNameRef() ) )
return i;
}
return -1;
}
/************************************************************************/
/* OGR_FD_GetFieldIndex() */
/************************************************************************/
/**
* \brief Find field by name.
*
* The field index of the first field matching the passed field name (case
* insensitively) is returned.
*
* This function is the same as the C++ method OGRFeatureDefn::GetFieldIndex.
*
* @param hDefn handle to the feature definition to get field index from.
* @param pszFieldName the field name to search for.
*
* @return the field index, or -1 if no match found.
*/
int OGR_FD_GetFieldIndex( OGRFeatureDefnH hDefn, const char *pszFieldName )
{
#ifdef OGRAPISPY_ENABLED
if( bOGRAPISpyEnabled )
OGRAPISpy_FD_GetFieldIndex(hDefn, pszFieldName);
#endif
return ((OGRFeatureDefn *)hDefn)->GetFieldIndex( pszFieldName );
}
/************************************************************************/
/* IsGeometryIgnored() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::IsGeometryIgnored();
*
* \brief Determine whether the geometry can be omitted when fetching features
*
* This method is the same as the C function OGR_FD_IsGeometryIgnored().
*
* Starting with GDAL 1.11, this method returns GetGeomFieldDefn(0)->IsIgnored().
*
* @return ignore state
*/
int OGRFeatureDefn::IsGeometryIgnored()
{
if( GetGeomFieldCount() == 0 )
return FALSE;
return GetGeomFieldDefn(0)->IsIgnored();
}
/************************************************************************/
/* OGR_FD_IsGeometryIgnored() */
/************************************************************************/
/**
* \brief Determine whether the geometry can be omitted when fetching features
*
* This function is the same as the C++ method
* OGRFeatureDefn::IsGeometryIgnored().
*
* Starting with GDAL 1.11, this method returns GetGeomFieldDefn(0)->IsIgnored().
*
* @param hDefn handle to the feature definition on witch OGRFeature are
* based on.
* @return ignore state
*/
int OGR_FD_IsGeometryIgnored( OGRFeatureDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->IsGeometryIgnored();
}
/************************************************************************/
/* SetGeometryIgnored() */
/************************************************************************/
/**
* \fn void OGRFeatureDefn::SetGeometryIgnored( int bIgnore );
*
* \brief Set whether the geometry can be omitted when fetching features
*
* This method is the same as the C function OGR_FD_SetGeometryIgnored().
*
* Starting with GDAL 1.11, this method calls GetGeomFieldDefn(0)->SetIgnored().
*
* @param bIgnore ignore state
*/
void OGRFeatureDefn::SetGeometryIgnored( int bIgnore )
{
if( GetGeomFieldCount() > 0 )
GetGeomFieldDefn(0)->SetIgnored(bIgnore);
}
/************************************************************************/
/* OGR_FD_SetGeometryIgnored() */
/************************************************************************/
/**
* \brief Set whether the geometry can be omitted when fetching features
*
* This function is the same as the C++ method
* OGRFeatureDefn::SetGeometryIgnored().
*
* Starting with GDAL 1.11, this method calls GetGeomFieldDefn(0)->SetIgnored().
*
* @param hDefn handle to the feature definition on witch OGRFeature are
* based on.
* @param bIgnore ignore state
*/
void OGR_FD_SetGeometryIgnored( OGRFeatureDefnH hDefn, int bIgnore )
{
((OGRFeatureDefn *) hDefn)->SetGeometryIgnored( bIgnore );
}
/************************************************************************/
/* IsStyleIgnored() */
/************************************************************************/
/**
* \fn int OGRFeatureDefn::IsStyleIgnored();
*
* \brief Determine whether the style can be omitted when fetching features
*
* This method is the same as the C function OGR_FD_IsStyleIgnored().
*
* @return ignore state
*/
/************************************************************************/
/* OGR_FD_IsStyleIgnored() */
/************************************************************************/
/**
* \brief Determine whether the style can be omitted when fetching features
*
* This function is the same as the C++ method
* OGRFeatureDefn::IsStyleIgnored().
*
* @param hDefn handle to the feature definition on which OGRFeature are
* based on.
* @return ignore state
*/
int OGR_FD_IsStyleIgnored( OGRFeatureDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->IsStyleIgnored();
}
/************************************************************************/
/* SetStyleIgnored() */
/************************************************************************/
/**
* \fn void OGRFeatureDefn::SetStyleIgnored( int bIgnore );
*
* \brief Set whether the style can be omitted when fetching features
*
* This method is the same as the C function OGR_FD_SetStyleIgnored().
*
* @param bIgnore ignore state
*/
/************************************************************************/
/* OGR_FD_SetStyleIgnored() */
/************************************************************************/
/**
* \brief Set whether the style can be omitted when fetching features
*
* This function is the same as the C++ method
* OGRFeatureDefn::SetStyleIgnored().
*
* @param hDefn handle to the feature definition on witch OGRFeature are
* based on.
* @param bIgnore ignore state
*/
void OGR_FD_SetStyleIgnored( OGRFeatureDefnH hDefn, int bIgnore )
{
((OGRFeatureDefn *) hDefn)->SetStyleIgnored( bIgnore );
}
/************************************************************************/
/* CreateFeatureDefn() */
/************************************************************************/
OGRFeatureDefn *OGRFeatureDefn::CreateFeatureDefn( const char *pszName )
{
return new OGRFeatureDefn( pszName );
}
/************************************************************************/
/* DestroyFeatureDefn() */
/************************************************************************/
void OGRFeatureDefn::DestroyFeatureDefn( OGRFeatureDefn *poDefn )
{
delete poDefn;
}
/************************************************************************/
/* IsSame() */
/************************************************************************/
/**
* \brief Test if the feature definition is identical to the other one.
*
* @param poOtherFeatureDefn the other feature definition to compare to.
* @return TRUE if the feature definition is identical to the other one.
*/
int OGRFeatureDefn::IsSame( OGRFeatureDefn * poOtherFeatureDefn )
{
if (strcmp(GetName(), poOtherFeatureDefn->GetName()) == 0 &&
GetFieldCount() == poOtherFeatureDefn->GetFieldCount() &&
GetGeomFieldCount() == poOtherFeatureDefn->GetGeomFieldCount())
{
int i;
for(i=0;i<nFieldCount;i++)
{
const OGRFieldDefn* poFldDefn = GetFieldDefn(i);
const OGRFieldDefn* poOtherFldDefn = poOtherFeatureDefn->GetFieldDefn(i);
if (!poFldDefn->IsSame(poOtherFldDefn))
{
return FALSE;
}
}
for(i=0;i<nGeomFieldCount;i++)
{
OGRGeomFieldDefn* poGFldDefn = GetGeomFieldDefn(i);
OGRGeomFieldDefn* poOtherGFldDefn =
poOtherFeatureDefn->GetGeomFieldDefn(i);
if (!poGFldDefn->IsSame(poOtherGFldDefn))
{
return FALSE;
}
}
return TRUE;
}
return FALSE;
}
/************************************************************************/
/* OGR_FD_IsSame() */
/************************************************************************/
/**
* \brief Test if the feature definition is identical to the other one.
*
* @param hFDefn handle to the feature definition on witch OGRFeature are
* based on.
* @param hOtherFDefn handle to the other feature definition to compare to.
* @return TRUE if the feature definition is identical to the other one.
*
* @since OGR 1.11
*/
int OGR_FD_IsSame( OGRFeatureDefnH hFDefn, OGRFeatureDefnH hOtherFDefn )
{
VALIDATE_POINTER1( hFDefn, "OGR_FD_IsSame", FALSE );
VALIDATE_POINTER1( hOtherFDefn, "OGR_FD_IsSame", FALSE );
return ((OGRFeatureDefn*)hFDefn)->IsSame((OGRFeatureDefn*)hOtherFDefn);
}