www.pudn.com > mitab.rar > ogrfeaturedefn.cpp
/******************************************************************************
* $Id: ogrfeaturedefn.cpp,v 1.12 2003/09/18 21:31:34 warmerda Exp $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRFeatureDefn class implementation.
* Author: Frank Warmerdam, warmerda@home.com
*
******************************************************************************
* Copyright (c) 1999, Les Technologies SoftMap Inc.
*
* 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.
******************************************************************************
*
* $Log: ogrfeaturedefn.cpp,v $
* Revision 1.12 2003/09/18 21:31:34 warmerda
* Fixed docs for GetGeomType().
*
* Revision 1.11 2003/05/28 19:16:42 warmerda
* fixed up argument names and stuff for docs
*
* Revision 1.10 2003/04/08 20:57:06 warmerda
* added Clone
*
* Revision 1.9 2003/04/03 23:39:11 danmo
* Small updates to C API docs (Normand S.)
*
* Revision 1.8 2003/03/31 15:55:42 danmo
* Added C API function docs
*
* Revision 1.7 2002/09/26 18:12:38 warmerda
* added C support
*
* Revision 1.6 2002/08/07 21:37:47 warmerda
* added indirect OGRFeaturedefn constructor/destructor
*
* Revision 1.5 2001/07/18 05:03:05 warmerda
* added CPL_CVSID
*
* Revision 1.4 1999/10/01 14:46:38 warmerda
* don't blow assertion trying to get non-existant fields
*
* Revision 1.3 1999/08/28 03:12:06 warmerda
* Improve debug message for left over reference count message.
*
* Revision 1.2 1999/07/05 17:19:52 warmerda
* added docs
*
* Revision 1.1 1999/06/11 19:21:02 warmerda
* New
*/
#include "ogr_feature.h"
#include "ogr_api.h"
#include "ogr_p.h"
CPL_CVSID("$Id: ogrfeaturedefn.cpp,v 1.12 2003/09/18 21:31:34 warmerda Exp $");
/************************************************************************/
/* OGRFeatureDefn() */
/************************************************************************/
/**
* 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;
eGeomType = wkbUnknown;
}
/************************************************************************/
/* OGR_FD_Create() */
/************************************************************************/
/**
* Create a new feature definition object to held the field definitions.
*
* 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 function is the same as the CPP 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 );
}
/************************************************************************/
/* OGR_FD_Destroy() */
/************************************************************************/
/**
* Destroy a feature definition object and release all memory
* associated with it.
*
* This function is the same as the CPP method
* OGRFeatureDefn::~OGRFeatureDefn().
*
* @param hDefn handle to the feature definition to be destroyed.
*/
void OGR_FD_Destroy( OGRFeatureDefnH hDefn )
{
delete (OGRFeatureDefn *) hDefn;
}
/************************************************************************/
/* Clone() */
/************************************************************************/
/**
* \fn OGRFeatureDefn *OGRFeatureDefn::Clone();
*
* Create a copy of this feature definition.
*
* Creates a deep copy of the feature definition.
*
* @return the copy.
*/
OGRFeatureDefn *OGRFeatureDefn::Clone()
{
OGRFeatureDefn *poCopy;
poCopy = new OGRFeatureDefn( GetName() );
poCopy->SetGeomType( GetGeomType() );
for( int i = 0; i < GetFieldCount(); i++ )
poCopy->AddFieldDefn( GetFieldDefn( i ) );
return poCopy;
}
/************************************************************************/
/* GetName() */
/************************************************************************/
/**
* \fn const char *OGRFeatureDefn::GetName();
*
* 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.
*/
/************************************************************************/
/* OGR_FD_GetName() */
/************************************************************************/
/**
* Get name of the OGRFeatureDefn passed as an argument.
*
* This function is the same as the CPP 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();
*
* Fetch number of fields on this feature.
*
* This method is the same as the C function OGR_FD_GetFieldCount().
* @return count of fields.
*/
/************************************************************************/
/* OGR_FD_GetFieldCount() */
/************************************************************************/
/**
* Fetch number of fields on the passed feature definition.
*
* This function is the same as the CPP 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 )
{
return ((OGRFeatureDefn *) hDefn)->GetFieldCount();
}
/************************************************************************/
/* GetFieldDefn() */
/************************************************************************/
/**
* Fetch field definition.
*
* This method is the same as the C function OGR_FD_GetFieldDefn().
*
* @param iField the field to fetch, between 0 and GetFieldCount()-1.
*
* @return a pointer to an internal field definition object. This object
* should not be modified or freed by the application.
*/
OGRFieldDefn *OGRFeatureDefn::GetFieldDefn( int iField )
{
if( iField < 0 || iField >= nFieldCount )
{
return NULL;
}
return papoFieldDefn[iField];
}
/************************************************************************/
/* OGR_FD_GetFieldDefn() */
/************************************************************************/
/**
* Fetch field definition of the passed feature definition.
*
* This function is the same as the CPP method
* OGRFeatureDefn::GetFieldDefn().
*
* @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. This object
* should not be modified or freed by the application.
*/
OGRFieldDefnH OGR_FD_GetFieldDefn( OGRFeatureDefnH hDefn, int iField )
{
return ((OGRFeatureDefn *) hDefn)->GetFieldDefn( iField );
}
/************************************************************************/
/* AddFieldDefn() */
/************************************************************************/
/**
* Add a new field definition.
*
* 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 )
{
papoFieldDefn = (OGRFieldDefn **)
CPLRealloc( papoFieldDefn, sizeof(void*)*(nFieldCount+1) );
papoFieldDefn[nFieldCount] = new OGRFieldDefn( poNewDefn );
nFieldCount++;
}
/************************************************************************/
/* OGR_FD_AddFieldDefn() */
/************************************************************************/
/**
* Add a new field definition to the passed feature definition.
*
* 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 CPP 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 );
}
/************************************************************************/
/* GetGeomType() */
/************************************************************************/
/**
* \fn OGRwkbGeometryType OGRFeatureDefn::GetGeomType();
*
* 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.
*
* This method is the same as the C function OGR_FD_GetGeomType().
*
* @return the base type for all geometry related to this definition.
*/
/************************************************************************/
/* OGR_FD_GetGeomType() */
/************************************************************************/
/**
* Fetch the geometry base type of the passed feature definition.
*
* This function is the same as the CPP method OGRFeatureDefn::GetGeomType().
*
* @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( OGRFieldDefnH hDefn )
{
return ((OGRFeatureDefn *) hDefn)->GetGeomType();
}
/************************************************************************/
/* SetGeomType() */
/************************************************************************/
/**
* 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().
*
* @param eNewType the new type to assign.
*/
void OGRFeatureDefn::SetGeomType( OGRwkbGeometryType eNewType )
{
eGeomType = eNewType;
}
/************************************************************************/
/* OGR_FD_SetGeomType() */
/************************************************************************/
/**
* 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 CPP method OGRFeatureDefn::SetGeomType().
*
* @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();
*
* 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() */
/************************************************************************/
/**
* 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 CPP 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();
*
* 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() */
/************************************************************************/
/**
* Decrements the reference count by one.
*
* This function is the same as the CPP 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();
*
* Fetch current reference count.
*
* This method is the same as the C function OGR_FD_GetReferenceCount().
*
* @return the current reference count.
*/
/************************************************************************/
/* OGR_FD_GetReferenceCount() */
/************************************************************************/
/**
* Fetch current reference count.
*
* This function is the same as the CPP method
* OGRFeatureDefn::GetReferenceCount().
*
* @param hDefn hanlde 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() */
/************************************************************************/
/**
* 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 )
{
for( int i = 0; i < nFieldCount; i++ )
{
if( EQUAL(pszFieldName, papoFieldDefn[i]->GetNameRef() ) )
return i;
}
return -1;
}
/************************************************************************/
/* OGR_FD_GetFieldIndex() */
/************************************************************************/
/**
* 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 CPP 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 )
{
return ((OGRFeatureDefn *)hDefn)->GetFieldIndex( pszFieldName );
}
/************************************************************************/
/* CreateFeatureDefn() */
/************************************************************************/
OGRFeatureDefn *OGRFeatureDefn::CreateFeatureDefn( const char *pszName )
{
return new OGRFeatureDefn( pszName );
}
/************************************************************************/
/* DestroyFeatureDefn() */
/************************************************************************/
void OGRFeatureDefn::DestroyFeatureDefn( OGRFeatureDefn *poDefn )
{
delete poDefn;
}