ultimatepp/bazaar/plugin/gdal/ogr/ogrmulticurve.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

178 lines
6.9 KiB
C++

/******************************************************************************
* $Id: ogrmulticurve.cpp 27960 2014-11-14 18:31:32Z rouault $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRMultiCurve class.
* Author: Even Rouault <even dot rouault at spatialys dot com>
*
******************************************************************************
* Copyright (c) 2014, Even Rouault <even dot rouault at spatialys dot com>
*
* 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_api.h"
CPL_CVSID("$Id: ogrmulticurve.cpp 27960 2014-11-14 18:31:32Z rouault $");
/************************************************************************/
/* OGRMultiCurve() */
/************************************************************************/
/**
* \brief Create an empty multi curve collection.
*/
OGRMultiCurve::OGRMultiCurve()
{
}
/************************************************************************/
/* ~OGRMultiCurve() */
/************************************************************************/
OGRMultiCurve::~OGRMultiCurve()
{
}
/************************************************************************/
/* getGeometryType() */
/************************************************************************/
OGRwkbGeometryType OGRMultiCurve::getGeometryType() const
{
if( getCoordinateDimension() == 3 )
return wkbMultiCurveZ;
else
return wkbMultiCurve;
}
/************************************************************************/
/* getDimension() */
/************************************************************************/
int OGRMultiCurve::getDimension() const
{
return 1;
}
/************************************************************************/
/* getGeometryName() */
/************************************************************************/
const char * OGRMultiCurve::getGeometryName() const
{
return "MULTICURVE";
}
/************************************************************************/
/* isCompatibleSubType() */
/************************************************************************/
OGRBoolean OGRMultiCurve::isCompatibleSubType( OGRwkbGeometryType eGeomType ) const
{
return OGR_GT_IsCurve(eGeomType);
}
/************************************************************************/
/* addCurveDirectlyFromWkt() */
/************************************************************************/
OGRErr OGRMultiCurve::addCurveDirectlyFromWkt( OGRGeometry* poSelf, OGRCurve* poCurve )
{
return ((OGRMultiCurve*)poSelf)->addGeometryDirectly(poCurve);
}
/************************************************************************/
/* importFromWkt() */
/* */
/* Instantiate from well known text format. */
/************************************************************************/
OGRErr OGRMultiCurve::importFromWkt( char ** ppszInput )
{
int bIsMultiCurve = (wkbFlatten(getGeometryType()) == wkbMultiCurve);
return importCurveCollectionFromWkt( ppszInput,
TRUE, /* bAllowEmptyComponent */
bIsMultiCurve, /* bAllowLineString */
bIsMultiCurve, /* bAllowCurve */
bIsMultiCurve, /* bAllowCompoundCurve */
addCurveDirectlyFromWkt );
}
/************************************************************************/
/* exportToWkt() */
/************************************************************************/
OGRErr OGRMultiCurve::exportToWkt( char ** ppszDstText,
CPL_UNUSED OGRwkbVariant eWkbVariant ) const
{
return exportToWktInternal( ppszDstText, wkbVariantIso, "LINESTRING" );
}
/************************************************************************/
/* hasCurveGeometry() */
/************************************************************************/
OGRBoolean OGRMultiCurve::hasCurveGeometry(int bLookForNonLinear) const
{
if( bLookForNonLinear )
return OGRGeometryCollection::hasCurveGeometry(TRUE);
return TRUE;
}
/************************************************************************/
/* CastToMultiLineString() */
/************************************************************************/
/**
* \brief Cast to multi line string.
*
* This method should only be called if the multicurve actually only contains
* instances of OGRLineString. This can be verified if hasCurveGeometry(TRUE)
* returns FALSE. It is not intended to approximate circular curves. For that
* use getLinearGeometry().
*
* The passed in geometry is consumed and a new one returned (or NULL in case
* of failure).
*
* @param poMS the input geometry - ownership is passed to the method.
* @return new geometry.
*/
OGRMultiLineString* OGRMultiCurve::CastToMultiLineString(OGRMultiCurve* poMC)
{
for(int i=0;i<poMC->nGeomCount;i++)
{
poMC->papoGeoms[i] = OGRCurve::CastToLineString( (OGRCurve*)poMC->papoGeoms[i] );
if( poMC->papoGeoms[i] == NULL )
{
delete poMC;
return NULL;
}
}
return (OGRMultiLineString*) TransferMembersAndDestroy(poMC, new OGRMultiLineString());
}