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

📄 ogrlinestring.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    char        szToken[OGR_WKT_TOKEN_MAX];    const char  *pszInput = *ppszInput;    if( paoPoints != NULL )    {        nPointCount = 0;        CPLFree( paoPoints );        paoPoints = NULL;                CPLFree( padfZ );        padfZ = NULL;    }/* -------------------------------------------------------------------- *//*      Read and verify the ``LINESTRING'' keyword token.               *//* -------------------------------------------------------------------- */    pszInput = OGRWktReadToken( pszInput, szToken );    if( !EQUAL(szToken,getGeometryName()) )        return OGRERR_CORRUPT_DATA;/* -------------------------------------------------------------------- *//*      Check for EMPTY or (EMPTY).                                     *//* -------------------------------------------------------------------- */    const char *pszPreScan;    pszPreScan = OGRWktReadToken( pszInput, szToken );    if( EQUAL(szToken,"EMPTY") )    {        *ppszInput = (char *) pszPreScan;        return OGRERR_NONE;    }    if( !EQUAL(szToken,"(") )        return OGRERR_CORRUPT_DATA;        pszPreScan = OGRWktReadToken( pszPreScan, szToken );    if( EQUAL(szToken,"EMPTY") )    {        pszPreScan = OGRWktReadToken( pszPreScan, szToken );        *ppszInput = (char *) pszPreScan;                if( !EQUAL(szToken,")") )            return OGRERR_CORRUPT_DATA;        else            return OGRERR_NONE;    }/* -------------------------------------------------------------------- *//*      Read the point list.                                            *//* -------------------------------------------------------------------- */    int      nMaxPoint = 0;    nPointCount = 0;    pszInput = OGRWktReadPoints( pszInput, &paoPoints, &padfZ, &nMaxPoint,                                 &nPointCount );    if( pszInput == NULL )        return OGRERR_CORRUPT_DATA;    *ppszInput = (char *) pszInput;    if( padfZ == NULL )        nCoordDimension = 2;    else        nCoordDimension = 3;        return OGRERR_NONE;}/************************************************************************//*                            exportToWkt()                             *//*                                                                      *//*      Translate this structure into it's well known text format       *//*      equivelent.  This could be made alot more CPU efficient!        *//************************************************************************/OGRErr OGRLineString::exportToWkt( char ** ppszDstText ) const{    int         nMaxString = nPointCount * 40 * 3 + 20;    int         nRetLen = 0;/* -------------------------------------------------------------------- *//*      Handle special empty case.                                      *//* -------------------------------------------------------------------- */    if( nPointCount == 0 )    {        CPLString osEmpty;        osEmpty.Printf("%s EMPTY",getGeometryName());        *ppszDstText = CPLStrdup(osEmpty);        return OGRERR_NONE;    }/* -------------------------------------------------------------------- *//*      General case.                                                   *//* -------------------------------------------------------------------- */    *ppszDstText = (char *) VSIMalloc( nMaxString );    if( *ppszDstText == NULL )        return OGRERR_NOT_ENOUGH_MEMORY;    sprintf( *ppszDstText, "%s (", getGeometryName() );    for( int i = 0; i < nPointCount; i++ )    {        if( nMaxString <= (int) strlen(*ppszDstText+nRetLen) + 32 + nRetLen )        {            CPLDebug( "OGR",                       "OGRLineString::exportToWkt() ... buffer overflow.\n"                      "nMaxString=%d, strlen(*ppszDstText) = %d, i=%d\n"                      "*ppszDstText = %s",                       nMaxString, strlen(*ppszDstText), i, *ppszDstText );            VSIFree( *ppszDstText );            *ppszDstText = NULL;            return OGRERR_NOT_ENOUGH_MEMORY;        }                if( i > 0 )            strcat( *ppszDstText + nRetLen, "," );        nRetLen += strlen(*ppszDstText + nRetLen);        if( getCoordinateDimension() == 3 )            OGRMakeWktCoordinate( *ppszDstText + nRetLen,                                  paoPoints[i].x,                                  paoPoints[i].y,                                  padfZ[i],                                  nCoordDimension );        else            OGRMakeWktCoordinate( *ppszDstText + nRetLen,                                  paoPoints[i].x,                                  paoPoints[i].y,                                  0.0,                                  nCoordDimension );        nRetLen += strlen(*ppszDstText + nRetLen);    }    strcat( *ppszDstText+nRetLen, ")" );    return OGRERR_NONE;}/************************************************************************//*                             get_Length()                             *//*                                                                      *//*      For now we return a simple euclidian 2D distance.               *//************************************************************************/double OGRLineString::get_Length() const{    double      dfLength = 0;    int         i;    for( i = 0; i < nPointCount-1; i++ )    {        double      dfDeltaX, dfDeltaY;        dfDeltaX = paoPoints[i+1].x - paoPoints[i].x;        dfDeltaY = paoPoints[i+1].y - paoPoints[i].y;        dfLength += sqrt(dfDeltaX*dfDeltaX + dfDeltaY*dfDeltaY);    }        return dfLength;}/************************************************************************//*                             StartPoint()                             *//************************************************************************/void OGRLineString::StartPoint( OGRPoint * poPoint ) const{    getPoint( 0, poPoint );}/************************************************************************//*                              EndPoint()                              *//************************************************************************/void OGRLineString::EndPoint( OGRPoint * poPoint ) const{    getPoint( nPointCount-1, poPoint );}/************************************************************************//*                               Value()                                *//*                                                                      *//*      Get an interpolated point at some distance along the curve.     *//************************************************************************/void OGRLineString::Value( double dfDistance, OGRPoint * poPoint ) const{    double      dfLength = 0;    int         i;    if( dfDistance < 0 )    {        StartPoint( poPoint );        return;    }    for( i = 0; i < nPointCount-1; i++ )    {        double      dfDeltaX, dfDeltaY, dfSegLength;        dfDeltaX = paoPoints[i+1].x - paoPoints[i].x;        dfDeltaY = paoPoints[i+1].y - paoPoints[i].y;        dfSegLength = sqrt(dfDeltaX*dfDeltaX + dfDeltaY*dfDeltaY);        if (dfSegLength > 0)        {            if( (dfLength <= dfDistance) && ((dfLength + dfSegLength) >=                                              dfDistance) )            {                double      dfRatio;                dfRatio = (dfDistance - dfLength) / dfSegLength;                poPoint->setX( paoPoints[i].x * (1 - dfRatio)                               + paoPoints[i+1].x * dfRatio );                poPoint->setY( paoPoints[i].y * (1 - dfRatio)                               + paoPoints[i+1].y * dfRatio );                if( getCoordinateDimension() == 3 )                    poPoint->setZ( padfZ[i] * (1 - dfRatio)                                   + padfZ[i] * dfRatio );                                return;            }            dfLength += dfSegLength;        }    }        EndPoint( poPoint );}/************************************************************************//*                            getEnvelope()                             *//************************************************************************/void OGRLineString::getEnvelope( OGREnvelope * psEnvelope ) const{    double      dfMinX, dfMinY, dfMaxX, dfMaxY;    if( nPointCount == 0 )        return;        dfMinX = dfMaxX = paoPoints[0].x;    dfMinY = dfMaxY = paoPoints[0].y;    for( int iPoint = 1; iPoint < nPointCount; iPoint++ )    {        if( dfMaxX < paoPoints[iPoint].x )            dfMaxX = paoPoints[iPoint].x;        if( dfMaxY < paoPoints[iPoint].y )            dfMaxY = paoPoints[iPoint].y;        if( dfMinX > paoPoints[iPoint].x )            dfMinX = paoPoints[iPoint].x;        if( dfMinY > paoPoints[iPoint].y )            dfMinY = paoPoints[iPoint].y;    }    psEnvelope->MinX = dfMinX;    psEnvelope->MaxX = dfMaxX;    psEnvelope->MinY = dfMinY;    psEnvelope->MaxY = dfMaxY;}/************************************************************************//*                               Equals()                                *//************************************************************************/OGRBoolean OGRLineString::Equals( OGRGeometry * poOther ) const{    OGRLineString       *poOLine = (OGRLineString *) poOther;        if( poOLine == this )        return TRUE;        if( poOther->getGeometryType() != getGeometryType() )        return FALSE;    // we should eventually test the SRS.    if( getNumPoints() != poOLine->getNumPoints() )        return FALSE;    for( int iPoint = 0; iPoint < getNumPoints(); iPoint++ )    {        if( getX(iPoint) != poOLine->getX(iPoint)            || getY(iPoint) != poOLine->getY(iPoint)             || getZ(iPoint) != poOLine->getZ(iPoint) )            return FALSE;    }    return TRUE;}/************************************************************************//*                             transform()                              *//************************************************************************/OGRErr OGRLineString::transform( OGRCoordinateTransformation *poCT ){#ifdef DISABLE_OGRGEOM_TRANSFORM    return OGRERR_FAILURE;#else    double      *xyz;    int         i;/* -------------------------------------------------------------------- *//*      Because we don't want to partially transform this geometry      *//*      (if some points fail after some have succeeded) we will         *//*      instead make a copy of the points to operate on.                *//* -------------------------------------------------------------------- */    xyz = (double *) CPLMalloc(sizeof(double) * nPointCount * 3);    if( xyz == NULL )        return OGRERR_NOT_ENOUGH_MEMORY;    for( i = 0; i < nPointCount; i++ )    {        xyz[i  ] = paoPoints[i].x;        xyz[i+nPointCount] = paoPoints[i].y;        if( padfZ )            xyz[i+nPointCount*2] = padfZ[i];        else            xyz[i+nPointCount*2] = 0.0;    }/* -------------------------------------------------------------------- *//*      Transform and reapply.                                          *//* -------------------------------------------------------------------- */    if( !poCT->Transform( nPointCount, xyz, xyz + nPointCount,                           xyz+nPointCount*2 ) )    {        CPLFree( xyz );        return OGRERR_FAILURE;    }    else    {        setPoints( nPointCount, xyz, xyz+nPointCount, xyz+nPointCount*2 );        CPLFree( xyz );        assignSpatialReference( poCT->GetTargetCS() );        return OGRERR_NONE;    }#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -