📄 ogrpolygon.cpp
字号:
CPLFree( paoPoints ); CPLFree( padfZ ); if( szToken[0] != ')' ) return OGRERR_CORRUPT_DATA; *ppszInput = (char *) pszInput; return OGRERR_NONE;}/************************************************************************//* exportToWkt() *//* *//* Translate this structure into it's well known text format *//* equivelent. This could be made alot more CPU efficient! *//************************************************************************/OGRErr OGRPolygon::exportToWkt( char ** ppszDstText ) const{ char **papszRings; int iRing, nCumulativeLength = 0, nNonEmptyRings = 0; OGRErr eErr;/* -------------------------------------------------------------------- *//* Build a list of strings containing the stuff for each ring. *//* -------------------------------------------------------------------- */ papszRings = (char **) CPLCalloc(sizeof(char *),nRingCount); for( iRing = 0; iRing < nRingCount; iRing++ ) { papoRings[iRing]->setCoordinateDimension( getCoordinateDimension() ); if( papoRings[iRing]->getNumPoints() == 0 ) { papszRings[iRing] = NULL; continue; } eErr = papoRings[iRing]->exportToWkt( &(papszRings[iRing]) ); if( eErr != OGRERR_NONE ) return eErr; CPLAssert( EQUALN(papszRings[iRing],"LINEARRING (", 12) ); 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 + -