📄 ogrpolygon.cpp
字号:
nCumulativeLength += strlen(papszRings[iRing] + 11);
nNonEmptyRings++;
}
/* -------------------------------------------------------------------- */
/* If we have no valid rings, return POLYGON EMPTY. */
/* -------------------------------------------------------------------- */
if( nNonEmptyRings == 0 )
{
CPLFree( papszRings );
*ppszDstText = CPLStrdup("POLYGON EMPTY");
return OGRERR_NONE;
}
/* -------------------------------------------------------------------- */
/* Allocate exactly the right amount of space for the */
/* aggregated string. */
/* -------------------------------------------------------------------- */
*ppszDstText = (char *) VSIMalloc(nCumulativeLength + nNonEmptyRings + 11);
if( *ppszDstText == NULL )
return OGRERR_NOT_ENOUGH_MEMORY;
/* -------------------------------------------------------------------- */
/* Build up the string, freeing temporary strings as we go. */
/* -------------------------------------------------------------------- */
strcpy( *ppszDstText, "POLYGON (" );
for( iRing = 0; iRing < nRingCount; iRing++ )
{
if( papszRings[iRing] == NULL )
continue;
if( iRing > 0 )
strcat( *ppszDstText, "," );
strcat( *ppszDstText, papszRings[iRing] + 11 );
VSIFree( papszRings[iRing] );
}
strcat( *ppszDstText, ")" );
CPLFree( papszRings );
return OGRERR_NONE;
}
/************************************************************************/
/* Centroid() */
/************************************************************************/
/**
* Compute the polygon centroid.
*
* The centroid location is applied to the passed in OGRPoint object.
*
* @return OGRERR_NONE on success or OGRERR_FAILURE on error.
*/
int OGRPolygon::Centroid( OGRPoint *poPoint ) const
{
if( poPoint == NULL )
return OGRERR_FAILURE;
#ifndef HAVE_GEOS
// notdef ... not implemented yet.
return OGRERR_FAILURE;
#else
GEOSGeom hThisGeosGeom = NULL;
GEOSGeom hOtherGeosGeom = NULL;
hThisGeosGeom = exportToGEOS();
if( hThisGeosGeom != NULL )
{
hOtherGeosGeom = GEOSGetCentroid( hThisGeosGeom );
OGRPoint *poCentroid = (OGRPoint *)
OGRGeometryFactory::createFromGEOS( hOtherGeosGeom );
GEOSGeom_destroy( hThisGeosGeom );
GEOSGeom_destroy( hOtherGeosGeom );
if( poPoint == NULL
|| wkbFlatten(poPoint->getGeometryType()) != wkbPoint )
return OGRERR_FAILURE;
poPoint->setX( poCentroid->getX() );
poPoint->setY( poCentroid->getY() );
delete poCentroid;
return OGRERR_NONE;
}
else
{
return OGRERR_FAILURE;
}
#endif /* HAVE_GEOS */
}
/************************************************************************/
/* OGR_G_Centroid() */
/************************************************************************/
int OGR_G_Centroid( OGRGeometryH hPolygon, OGRGeometryH hCentroidPoint )
{
OGRPolygon *poPoly = ((OGRPolygon *) hPolygon);
OGRPoint *poCentroid = ((OGRPoint *) hCentroidPoint);
if( poCentroid == NULL )
return OGRERR_FAILURE;
if( wkbFlatten(poCentroid->getGeometryType()) != wkbPoint )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Passed wrong geometry type as centroid argument." );
return OGRERR_FAILURE;
}
if( wkbFlatten(poPoly->getGeometryType()) != wkbPolygon )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Invoked Centroid() on non-Polygon." );
return OGRERR_FAILURE;
}
return poPoly->Centroid( poCentroid );
}
/************************************************************************/
/* PointOnSurface() */
/************************************************************************/
int OGRPolygon::PointOnSurface( OGRPoint * ) const
{
// notdef ... not implemented yet.
return OGRERR_FAILURE;
}
/************************************************************************/
/* getEnvelope() */
/************************************************************************/
void OGRPolygon::getEnvelope( OGREnvelope * psEnvelope ) const
{
OGREnvelope oRingEnv;
if( nRingCount == 0 )
return;
papoRings[0]->getEnvelope( psEnvelope );
for( int iRing = 1; iRing < nRingCount; iRing++ )
{
papoRings[iRing]->getEnvelope( &oRingEnv );
if( psEnvelope->MinX > oRingEnv.MinX )
psEnvelope->MinX = oRingEnv.MinX;
if( psEnvelope->MinY > oRingEnv.MinY )
psEnvelope->MinY = oRingEnv.MinY;
if( psEnvelope->MaxX < oRingEnv.MaxX )
psEnvelope->MaxX = oRingEnv.MaxX;
if( psEnvelope->MaxY < oRingEnv.MaxY )
psEnvelope->MaxY = oRingEnv.MaxY;
}
}
/************************************************************************/
/* Equal() */
/************************************************************************/
OGRBoolean OGRPolygon::Equals( OGRGeometry * poOther ) const
{
OGRPolygon *poOPoly = (OGRPolygon *) poOther;
if( poOPoly == this )
return TRUE;
if( poOther->getGeometryType() != getGeometryType() )
return FALSE;
if( getNumInteriorRings() != poOPoly->getNumInteriorRings() )
return FALSE;
if( !getExteriorRing()->Equals( poOPoly->getExteriorRing() ) )
return FALSE;
// we should eventually test the SRS.
for( int iRing = 0; iRing < getNumInteriorRings(); iRing++ )
{
if( !getInteriorRing(iRing)->Equals(poOPoly->getInteriorRing(iRing)) )
return FALSE;
}
return TRUE;
}
/************************************************************************/
/* transform() */
/************************************************************************/
OGRErr OGRPolygon::transform( OGRCoordinateTransformation *poCT )
{
#ifdef DISABLE_OGRGEOM_TRANSFORM
return OGRERR_FAILURE;
#else
for( int iRing = 0; iRing < nRingCount; iRing++ )
{
OGRErr eErr;
eErr = papoRings[iRing]->transform( poCT );
if( eErr != OGRERR_NONE )
{
if( iRing != 0 )
{
CPLDebug("OGR",
"OGRPolygon::transform() failed for a ring other\n"
"than the first, meaning some rings are transformed\n"
"and some are not!\n" );
return OGRERR_FAILURE;
}
return eErr;
}
}
assignSpatialReference( poCT->GetTargetCS() );
return OGRERR_NONE;
#endif
}
/************************************************************************/
/* IsPointOnSurface() */
/************************************************************************/
OGRBoolean OGRPolygon::IsPointOnSurface( const OGRPoint * pt) const
{
if ( NULL == pt)
return 0;
for( int iRing = 0; iRing < nRingCount; iRing++ )
{
if ( papoRings[iRing]->isPointInRing(pt) )
{
return 1;
}
}
return 0;
}
/************************************************************************/
/* closeRings() */
/************************************************************************/
void OGRPolygon::closeRings()
{
for( int iRing = 0; iRing < nRingCount; iRing++ )
papoRings[iRing]->closeRings();
}
/************************************************************************/
/* get_Area() */
/************************************************************************/
/**
* Compute area of polygon.
*
* The area is computed as the area of the outer ring less the area of all
* internal rings.
*
* @return computed area.
*/
double OGRPolygon::get_Area() const
{
double dfArea = 0.0;
if( getExteriorRing() != NULL )
{
int iRing;
dfArea = getExteriorRing()->get_Area();
for( iRing = 0; iRing < getNumInteriorRings(); iRing++ )
dfArea -= getInteriorRing( iRing )->get_Area();
}
return dfArea;
}
/************************************************************************/
/* setCoordinateDimension() */
/************************************************************************/
void OGRPolygon::setCoordinateDimension( int nNewDimension )
{
for( int iRing = 0; iRing < nRingCount; iRing++ )
papoRings[iRing]->setCoordinateDimension( nNewDimension );
OGRGeometry::setCoordinateDimension( nNewDimension );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -