?? ogrfeature.cpp
字號:
/******************************************************************************
* $Id: ogrfeature.cpp 11087 2007-03-27 03:55:12Z warmerdam $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRFeature 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.
****************************************************************************/
#include "ogr_feature.h"
#include "ogr_api.h"
#include "ogr_p.h"
CPL_CVSID("$Id: ogrfeature.cpp 11087 2007-03-27 03:55:12Z warmerdam $");
/************************************************************************/
/* OGRFeature() */
/************************************************************************/
/**
* Constructor
*
* Note that the OGRFeature will increment the reference count of it's
* defining OGRFeatureDefn. Destruction of the OGRFeatureDefn before
* destruction of all OGRFeatures that depend on it is likely to result in
* a crash.
*
* This method is the same as the C function OGR_F_Create().
*
* @param poDefnIn feature class (layer) definition to which the feature will
* adhere.
*/
OGRFeature::OGRFeature( OGRFeatureDefn * poDefnIn )
{
m_pszStyleString = NULL;
m_poStyleTable = NULL;
m_pszTmpFieldValue = NULL;
poDefnIn->Reference();
poDefn = poDefnIn;
nFID = OGRNullFID;
poGeometry = NULL;
// we should likely be initializing from the defaults, but this will
// usually be a waste.
pauFields = (OGRField *) CPLCalloc( poDefn->GetFieldCount(),
sizeof(OGRField) );
for( int i = 0; i < poDefn->GetFieldCount(); i++ )
{
pauFields[i].Set.nMarker1 = OGRUnsetMarker;
pauFields[i].Set.nMarker2 = OGRUnsetMarker;
}
}
/************************************************************************/
/* OGR_F_Create() */
/************************************************************************/
/**
* Feature factory.
*
* Note that the OGRFeature will increment the reference count of it's
* defining OGRFeatureDefn. Destruction of the OGRFeatureDefn before
* destruction of all OGRFeatures that depend on it is likely to result in
* a crash.
*
* This function is the same as the C++ method OGRFeature::OGRFeature().
*
* @param hDefn handle to the feature class (layer) definition to
* which the feature will adhere.
*
* @return an handle to the new feature object with null fields and
* no geometry.
*/
OGRFeatureH OGR_F_Create( OGRFeatureDefnH hDefn )
{
return (OGRFeatureH) new OGRFeature( (OGRFeatureDefn *) hDefn );
}
/************************************************************************/
/* ~OGRFeature() */
/************************************************************************/
OGRFeature::~OGRFeature()
{
if( poGeometry != NULL )
delete poGeometry;
for( int i = 0; i < poDefn->GetFieldCount(); i++ )
{
OGRFieldDefn *poFDefn = poDefn->GetFieldDefn(i);
if( !IsFieldSet(i) )
continue;
switch( poFDefn->GetType() )
{
case OFTString:
if( pauFields[i].String != NULL )
VSIFree( pauFields[i].String );
break;
case OFTBinary:
if( pauFields[i].Binary.paData != NULL )
VSIFree( pauFields[i].Binary.paData );
break;
case OFTStringList:
CSLDestroy( pauFields[i].StringList.paList );
break;
case OFTIntegerList:
case OFTRealList:
CPLFree( pauFields[i].IntegerList.paList );
break;
default:
// should add support for wide strings.
break;
}
}
poDefn->Release();
CPLFree( pauFields );
CPLFree(m_pszStyleString);
CPLFree(m_pszTmpFieldValue);
}
/************************************************************************/
/* OGR_F_Destroy() */
/************************************************************************/
/**
* Destroy feature
*
* The feature is deleted, but within the context of the GDAL/OGR heap.
* This is necessary when higher level applications use GDAL/OGR from a
* DLL and they want to delete a feature created within the DLL. If the
* delete is done in the calling application the memory will be freed onto
* the application heap which is inappropriate.
*
* This function is the same as the C++ method OGRFeature::DestroyFeature().
*
* @param hFeat handle to the feature to destroy.
*/
void OGR_F_Destroy( OGRFeatureH hFeat )
{
delete (OGRFeature *) hFeat;
}
/************************************************************************/
/* CreateFeature() */
/************************************************************************/
/**
* Feature factory.
*
* This is essentially a feature factory, useful for
* applications creating features but wanting to ensure they
* are created out of the OGR/GDAL heap.
*
* @param poDefn Feature definition defining schema.
*
* @return new feature object with null fields and no geometry. May be
* deleted with delete.
*/
OGRFeature *OGRFeature::CreateFeature( OGRFeatureDefn *poDefn )
{
return new OGRFeature( poDefn );
}
/************************************************************************/
/* DestroyFeature() */
/************************************************************************/
/**
* Destroy feature
*
* The feature is deleted, but within the context of the GDAL/OGR heap.
* This is necessary when higher level applications use GDAL/OGR from a
* DLL and they want to delete a feature created within the DLL. If the
* delete is done in the calling application the memory will be freed onto
* the application heap which is inappropriate.
*
* This method is the same as the C function OGR_F_Destroy().
*
* @param poFeature the feature to delete.
*/
void OGRFeature::DestroyFeature( OGRFeature *poFeature )
{
delete poFeature;
}
/************************************************************************/
/* GetDefnRef() */
/************************************************************************/
/**
* \fn OGRFeatureDefn *OGRFeature::GetDefnRef();
*
* Fetch feature definition.
*
* This method is the same as the C function OGR_F_GetDefnRef().
*
* @return a reference to the feature definition object.
*/
/************************************************************************/
/* OGR_F_GetDefnRef() */
/************************************************************************/
/**
* Fetch feature definition.
*
* This function is the same as the C++ method OGRFeature::GetDefnRef().
*
* @param hFeat handle to the feature to get the feature definition from.
*
* @return an handle to the feature definition object on which feature
* depends.
*/
OGRFeatureDefnH OGR_F_GetDefnRef( OGRFeatureH hFeat )
{
return ((OGRFeature *) hFeat)->GetDefnRef();
}
/************************************************************************/
/* SetGeometryDirectly() */
/************************************************************************/
/**
* Set feature geometry.
*
* This method updates the features geometry, and operate exactly as
* SetGeometry(), except that this method assumes ownership of the
* passed geometry.
*
* This method is the same as the C function OGR_F_SetGeometryDirectly().
*
* @param poGeomIn new geometry to apply to feature. Passing NULL value here
* is correct and it will result in deallocation of currently assigned geometry
* without assigning new one.
*
* @return OGRERR_NONE if successful, or OGR_UNSUPPORTED_GEOMETRY_TYPE if
* the geometry type is illegal for the OGRFeatureDefn (checking not yet
* implemented).
*/
OGRErr OGRFeature::SetGeometryDirectly( OGRGeometry * poGeomIn )
{
delete poGeometry;
poGeometry = poGeomIn;
// I should be verifying that the geometry matches the defn's type.
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_F_SetGeometryDirectly() */
/************************************************************************/
/**
* Set feature geometry.
*
* This function updates the features geometry, and operate exactly as
* SetGeometry(), except that this function assumes ownership of the
* passed geometry.
*
* This function is the same as the C++ method
* OGRFeature::SetGeometryDirectly.
*
* @param hFeat handle to the feature on which to apply the geometry.
* @param hGeom handle to the new geometry to apply to feature.
*
* @return OGRERR_NONE if successful, or OGR_UNSUPPORTED_GEOMETRY_TYPE if
* the geometry type is illegal for the OGRFeatureDefn (checking not yet
* implemented).
*/
OGRErr OGR_F_SetGeometryDirectly( OGRFeatureH hFeat, OGRGeometryH hGeom )
{
return ((OGRFeature *) hFeat)->SetGeometryDirectly((OGRGeometry *) hGeom);
}
/************************************************************************/
/* SetGeometry() */
/************************************************************************/
/**
* Set feature geometry.
*
* This method updates the features geometry, and operate exactly as
* SetGeometryDirectly(), except that this method does not assume ownership
* of the passed geometry, but instead makes a copy of it.
*
* This method is the same as the C function OGR_F_SetGeometry().
*
* @param poGeomIn new geometry to apply to feature. Passing NULL value here
* is correct and it will result in deallocation of currently assigned geometry
* without assigning new one.
*
* @return OGRERR_NONE if successful, or OGR_UNSUPPORTED_GEOMETRY_TYPE if
* the geometry type is illegal for the OGRFeatureDefn (checking not yet
* implemented).
*/
OGRErr OGRFeature::SetGeometry( OGRGeometry * poGeomIn )
{
delete poGeometry;
if( poGeomIn != NULL )
poGeometry = poGeomIn->clone();
else
poGeometry = NULL;
// I should be verifying that the geometry matches the defn's type.
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_F_SetGeometry() */
/************************************************************************/
/**
* Set feature geometry.
*
* This function updates the features geometry, and operate exactly as
* SetGeometryDirectly(), except that this function does not assume ownership
* of the passed geometry, but instead makes a copy of it.
*
* This function is the same as the C++ OGRFeature::SetGeometry().
*
* @param hFeat handle to the feature on which new geometry is applied to.
* @param hGeom handle to the new geometry to apply to feature.
*
* @return OGRERR_NONE if successful, or OGR_UNSUPPORTED_GEOMETRY_TYPE if
* the geometry type is illegal for the OGRFeatureDefn (checking not yet
* implemented).
*/
OGRErr OGR_F_SetGeometry( OGRFeatureH hFeat, OGRGeometryH hGeom )
{
return ((OGRFeature *) hFeat)->SetGeometry((OGRGeometry *) hGeom);
}
/************************************************************************/
/* StealGeometry() */
/************************************************************************/
/**
* Take away ownership of geometry.
*
* Fetch the geometry from this feature, and clear the reference to the
* geometry on the feature. This is a mechanism for the application to
* take over ownship of the geometry from the feature without copying.
* Sort of an inverse to SetGeometryDirectly().
*
* After this call the OGRFeature will have a NULL geometry.
*
* @return the pointer to the geometry.
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -