⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrpolygon.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -