?? ogrlinestring.cpp
字號(hào):
/******************************************************************************
* $Id: ogrlinestring.cpp 10646 2007-01-18 02:38:10Z warmerdam $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The OGRLineString 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 <assert.h>
CPL_CVSID("$Id: ogrlinestring.cpp 10646 2007-01-18 02:38:10Z warmerdam $");
/************************************************************************/
/* OGRLineString() */
/************************************************************************/
/**
* Create an empty line string.
*/
OGRLineString::OGRLineString()
{
nPointCount = 0;
paoPoints = NULL;
padfZ = NULL;
}
/************************************************************************/
/* ~OGRLineString() */
/************************************************************************/
OGRLineString::~OGRLineString()
{
if( paoPoints != NULL )
OGRFree( paoPoints );
if( padfZ != NULL )
OGRFree( padfZ );
}
/************************************************************************/
/* getGeometryType() */
/************************************************************************/
OGRwkbGeometryType OGRLineString::getGeometryType() const
{
if( getCoordinateDimension() == 3 )
return wkbLineString25D;
else
return wkbLineString;
}
/************************************************************************/
/* flattenTo2D() */
/************************************************************************/
void OGRLineString::flattenTo2D()
{
Make2D();
}
/************************************************************************/
/* getGeometryName() */
/************************************************************************/
const char * OGRLineString::getGeometryName() const
{
return "LINESTRING";
}
/************************************************************************/
/* clone() */
/************************************************************************/
OGRGeometry *OGRLineString::clone() const
{
OGRLineString *poNewLineString;
poNewLineString = new OGRLineString();
poNewLineString->assignSpatialReference( getSpatialReference() );
poNewLineString->setPoints( nPointCount, paoPoints, padfZ );
poNewLineString->setCoordinateDimension( getCoordinateDimension() );
return poNewLineString;
}
/************************************************************************/
/* empty() */
/************************************************************************/
void OGRLineString::empty()
{
setNumPoints( 0 );
}
/************************************************************************/
/* getDimension() */
/************************************************************************/
int OGRLineString::getDimension() const
{
return 1;
}
/************************************************************************/
/* setCoordinateDimension() */
/************************************************************************/
void OGRLineString::setCoordinateDimension( int nNewDimension )
{
nCoordDimension = nNewDimension;
if( nNewDimension == 2 )
Make2D();
else if( nNewDimension == 3 )
Make3D();
}
/************************************************************************/
/* WkbSize() */
/* */
/* Return the size of this object in well known binary */
/* representation including the byte order, and type information. */
/************************************************************************/
int OGRLineString::WkbSize() const
{
return 5 + 4 + 8 * nPointCount * getCoordinateDimension();
}
/************************************************************************/
/* Make2D() */
/************************************************************************/
void OGRLineString::Make2D()
{
if( padfZ != NULL )
{
OGRFree( padfZ );
padfZ = NULL;
}
nCoordDimension = 2;
}
/************************************************************************/
/* Make3D() */
/************************************************************************/
void OGRLineString::Make3D()
{
if( padfZ == NULL )
{
if( nPointCount == 0 )
padfZ = (double *) OGRCalloc(sizeof(double),1);
else
padfZ = (double *) OGRCalloc(sizeof(double),nPointCount);
}
nCoordDimension = 3;
}
/************************************************************************/
/* getPoint() */
/************************************************************************/
/**
* Fetch a point in line string.
*
* This method relates to the SFCOM ILineString::get_Point() method.
*
* @param i the vertex to fetch, from 0 to getNumPoints()-1.
* @param poPoint a point to initialize with the fetched point.
*/
void OGRLineString::getPoint( int i, OGRPoint * poPoint ) const
{
assert( i >= 0 );
assert( i < nPointCount );
assert( poPoint != NULL );
poPoint->setX( paoPoints[i].x );
poPoint->setY( paoPoints[i].y );
if( getCoordinateDimension() == 3 && padfZ != NULL )
poPoint->setZ( padfZ[i] );
}
/**
* \fn int OGRLineString::getNumPoints() const;
*
* Fetch vertex count.
*
* Returns the number of vertices in the line string.
*
* @return vertex count.
*/
/**
* \fn double OGRLineString::getX( int iVertex ) const;
*
* Get X at vertex.
*
* Returns the X value at the indicated vertex. If iVertex is out of range a
* crash may occur, no internal range checking is performed.
*
* @param iVertex the vertex to return, between 0 and getNumPoints()-1.
*
* @return X value.
*/
/**
* \fn double OGRLineString::getY( int iVertex ) const;
*
* Get Y at vertex.
*
* Returns the Y value at the indicated vertex. If iVertex is out of range a
* crash may occur, no internal range checking is performed.
*
* @param iVertex the vertex to return, between 0 and getNumPoints()-1.
*
* @return X value.
*/
/************************************************************************/
/* getZ() */
/************************************************************************/
/**
* Get Z at vertex.
*
* Returns the Z (elevation) value at the indicated vertex. If no Z
* value is available, 0.0 is returned. If iVertex is out of range a
* crash may occur, no internal range checking is performed.
*
* @param iVertex the vertex to return, between 0 and getNumPoints()-1.
*
* @return Z value.
*/
double OGRLineString::getZ( int iVertex ) const
{
if( padfZ != NULL && iVertex >= 0 && iVertex < nPointCount
&& nCoordDimension >= 3 )
return( padfZ[iVertex] );
else
return 0.0;
}
/************************************************************************/
/* setNumPoints() */
/************************************************************************/
/**
* Set number of points in geometry.
*
* This method primary exists to preset the number of points in a linestring
* geometry before setPoint() is used to assign them to avoid reallocating
* the array larger with each call to addPoint().
*
* This method has no SFCOM analog.
*
* @param nNewPointCount the new number of points for geometry.
*/
void OGRLineString::setNumPoints( int nNewPointCount )
{
if( nNewPointCount == 0 )
{
OGRFree( paoPoints );
paoPoints = NULL;
OGRFree( padfZ );
padfZ = NULL;
nPointCount = 0;
return;
}
if( nNewPointCount > nPointCount )
{
paoPoints = (OGRRawPoint *)
OGRRealloc(paoPoints, sizeof(OGRRawPoint) * nNewPointCount);
assert( paoPoints != NULL );
memset( paoPoints + nPointCount,
0, sizeof(OGRRawPoint) * (nNewPointCount - nPointCount) );
if( getCoordinateDimension() == 3 )
{
padfZ = (double *)
OGRRealloc( padfZ, sizeof(double)*nNewPointCount );
memset( padfZ + nPointCount, 0,
sizeof(double) * (nNewPointCount - nPointCount) );
}
}
nPointCount = nNewPointCount;
}
/************************************************************************/
/* setPoint() */
/************************************************************************/
/**
* Set the location of a vertex in line string.
*
* If iPoint is larger than the number of necessary the number of existing
* points in the line string, the point count will be increased to
* accomodate the request.
*
* There is no SFCOM analog to this method.
*
* @param iPoint the index of the vertex to assign (zero based).
* @param poPoint the value to assign to the vertex.
*/
void OGRLineString::setPoint( int iPoint, OGRPoint * poPoint )
{
setPoint( iPoint, poPoint->getX(), poPoint->getY(), poPoint->getZ() );
}
/************************************************************************/
/* setPoint() */
/************************************************************************/
/**
* Set the location of a vertex in line string.
*
* If iPoint is larger than the number of necessary the number of existing
* points in the line string, the point count will be increased to
* accomodate the request.
*
* There is no SFCOM analog to this method.
*
* @param iPoint the index of the vertex to assign (zero based).
* @param xIn input X coordinate to assign.
* @param yIn input Y coordinate to assign.
* @param zIn input Z coordinate to assign (defaults to zero).
*/
void OGRLineString::setPoint( int iPoint, double xIn, double yIn, double zIn )
{
if( getCoordinateDimension() == 2 )
Make3D();
if( iPoint >= nPointCount )
setNumPoints( iPoint+1 );
paoPoints[iPoint].x = xIn;
paoPoints[iPoint].y = yIn;
if( zIn != 0.0 )
{
Make3D();
padfZ[iPoint] = zIn;
}
else if( getCoordinateDimension() == 3 )
{
padfZ[iPoint] = 0.0;
}
}
void OGRLineString::setPoint( int iPoint, double xIn, double yIn )
{
if( iPoint >= nPointCount )
setNumPoints( iPoint+1 );
paoPoints[iPoint].x = xIn;
paoPoints[iPoint].y = yIn;
}
/************************************************************************/
/* addPoint() */
/************************************************************************/
/**
* Add a point to a line string.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -