?? ogrpolygon.cpp
字號:
/******************************************************************************
* $Id: ogrpolygon.cpp 11427 2007-05-07 19:16:26Z warmerdam $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRPolygon geometry class.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 1999, Frank Warmerdam
*
* 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_geometry.h"
#include "ogr_p.h"
#include "ogr_geos.h"
#include "ogr_api.h"
CPL_CVSID("$Id: ogrpolygon.cpp 11427 2007-05-07 19:16:26Z warmerdam $");
/************************************************************************/
/* OGRPolygon() */
/************************************************************************/
/**
* Create an empty polygon.
*/
OGRPolygon::OGRPolygon()
{
nRingCount = 0;
papoRings = NULL;
}
/************************************************************************/
/* ~OGRPolygon() */
/************************************************************************/
OGRPolygon::~OGRPolygon()
{
empty();
}
/************************************************************************/
/* clone() */
/************************************************************************/
OGRGeometry *OGRPolygon::clone() const
{
OGRPolygon *poNewPolygon;
poNewPolygon = new OGRPolygon;
poNewPolygon->assignSpatialReference( getSpatialReference() );
for( int i = 0; i < nRingCount; i++ )
{
poNewPolygon->addRing( papoRings[i] );
}
return poNewPolygon;
}
/************************************************************************/
/* empty() */
/************************************************************************/
void OGRPolygon::empty()
{
if( papoRings != NULL )
{
for( int i = 0; i < nRingCount; i++ )
{
delete papoRings[i];
}
OGRFree( papoRings );
}
papoRings = NULL;
nRingCount = 0;
}
/************************************************************************/
/* getGeometryType() */
/************************************************************************/
OGRwkbGeometryType OGRPolygon::getGeometryType() const
{
if( getCoordinateDimension() == 3 )
return wkbPolygon25D;
else
return wkbPolygon;
}
/************************************************************************/
/* getDimension() */
/************************************************************************/
int OGRPolygon::getDimension() const
{
return 2;
}
/************************************************************************/
/* flattenTo2D() */
/************************************************************************/
void OGRPolygon::flattenTo2D()
{
for( int iRing = 0; iRing < nRingCount; iRing++ )
papoRings[iRing]->flattenTo2D();
nCoordDimension = 2;
}
/************************************************************************/
/* getGeometryName() */
/************************************************************************/
const char * OGRPolygon::getGeometryName() const
{
return "POLYGON";
}
/************************************************************************/
/* getExteriorRing() */
/************************************************************************/
/**
* Fetch reference to external polygon ring.
*
* Note that the returned ring pointer is to an internal data object of
* the OGRPolygon. It should not be modified or deleted by the application,
* and the pointer is only valid till the polygon is next modified. Use
* the OGRGeometry::clone() method to make a separate copy within the
* application.
*
* Relates to the SFCOM IPolygon::get_ExteriorRing() method.
*
* @return pointer to external ring. May be NULL if the OGRPolygon is empty.
*/
OGRLinearRing *OGRPolygon::getExteriorRing()
{
if( nRingCount > 0 )
return papoRings[0];
else
return NULL;
}
const OGRLinearRing *OGRPolygon::getExteriorRing() const
{
if( nRingCount > 0 )
return papoRings[0];
else
return NULL;
}
/************************************************************************/
/* getNumInteriorRings() */
/************************************************************************/
/**
* Fetch the number of internal rings.
*
* Relates to the SFCOM IPolygon::get_NumInteriorRings() method.
*
* @return count of internal rings, zero or more.
*/
int OGRPolygon::getNumInteriorRings() const
{
if( nRingCount > 0 )
return nRingCount-1;
else
return 0;
}
/************************************************************************/
/* getInteriorRing() */
/************************************************************************/
/**
* Fetch reference to indicated internal ring.
*
* Note that the returned ring pointer is to an internal data object of
* the OGRPolygon. It should not be modified or deleted by the application,
* and the pointer is only valid till the polygon is next modified. Use
* the OGRGeometry::clone() method to make a separate copy within the
* application.
*
* Relates to the SFCOM IPolygon::get_InternalRing() method.
*
* @param iRing internal ring index from 0 to getNumInternalRings() - 1.
*
* @return pointer to external ring. May be NULL if the OGRPolygon is empty.
*/
OGRLinearRing *OGRPolygon::getInteriorRing( int iRing )
{
if( iRing < 0 || iRing >= nRingCount-1 )
return NULL;
else
return papoRings[iRing+1];
}
const OGRLinearRing *OGRPolygon::getInteriorRing( int iRing ) const
{
if( iRing < 0 || iRing >= nRingCount-1 )
return NULL;
else
return papoRings[iRing+1];
}
/************************************************************************/
/* addRing() */
/************************************************************************/
/**
* Add a ring to a polygon.
*
* If the polygon has no external ring (it is empty) this will be used as
* the external ring, otherwise it is used as an internal ring. The passed
* OGRLinearRing remains the responsibility of the caller (an internal copy
* is made).
*
* This method has no SFCOM analog.
*
* @param poNewRing ring to be added to the polygon.
*/
void OGRPolygon::addRing( OGRLinearRing * poNewRing )
{
papoRings = (OGRLinearRing **) OGRRealloc( papoRings,
sizeof(void*) * (nRingCount+1));
papoRings[nRingCount] = new OGRLinearRing( poNewRing );
nRingCount++;
if( poNewRing->getCoordinateDimension() == 3 )
nCoordDimension = 3;
}
/************************************************************************/
/* addRingDirectly() */
/************************************************************************/
/**
* Add a ring to a polygon.
*
* If the polygon has no external ring (it is empty) this will be used as
* the external ring, otherwise it is used as an internal ring. Ownership
* of the passed ring is assumed by the OGRPolygon, but otherwise this
* method operates the same as OGRPolygon::AddRing().
*
* This method has no SFCOM analog.
*
* @param poNewRing ring to be added to the polygon.
*/
void OGRPolygon::addRingDirectly( OGRLinearRing * poNewRing )
{
papoRings = (OGRLinearRing **) OGRRealloc( papoRings,
sizeof(void*) * (nRingCount+1));
papoRings[nRingCount] = poNewRing;
nRingCount++;
if( poNewRing->getCoordinateDimension() == 3 )
nCoordDimension = 3;
}
/************************************************************************/
/* WkbSize() */
/* */
/* Return the size of this object in well known binary */
/* representation including the byte order, and type information. */
/************************************************************************/
int OGRPolygon::WkbSize() const
{
int nSize = 9;
int b3D = getCoordinateDimension() == 3;
for( int i = 0; i < nRingCount; i++ )
{
nSize += papoRings[i]->_WkbSize( b3D );
}
return nSize;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -