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

📄 ntf_estlayers.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{    if( CSLCount((char **) papoGroup) < 2         || papoGroup[0]->GetType() != NRT_POINTREC        || (papoGroup[1]->GetType() != NRT_GEOMETRY            && papoGroup[1]->GetType() != NRT_GEOMETRY3D) )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // POINT_ID    poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) );    // FEAT_CODE    poFeature->SetField( 1, papoGroup[0]->GetField( 17, 20 ) );    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1]));    // Attributes     poReader->ApplyAttributeValues( poFeature, papoGroup,                                    "HT", 2,                                    NULL );    // Set HEIGHT/elevation    OGRPoint    *poPoint = (OGRPoint *) poFeature->GetGeometryRef();        if( poPoint != NULL && poPoint->getCoordinateDimension() == 3 )    {        poFeature->SetField( 2, poPoint->getZ() );    }    else if( poPoint != NULL )    {        poFeature->SetField( 2, poFeature->GetFieldAsDouble(2) * 0.01 );        poPoint->setZ( poFeature->GetFieldAsDouble(2) );    }        return poFeature;}/************************************************************************//*                      TranslateProfileLine()                          *//************************************************************************/static OGRFeature *TranslateProfileLine( NTFFileReader *poReader,                                         OGRNTFLayer *poLayer,                                         NTFRecord **papoGroup ){    if( CSLCount((char **) papoGroup) < 2        || papoGroup[0]->GetType() != NRT_LINEREC        || (papoGroup[1]->GetType() != NRT_GEOMETRY            && papoGroup[1]->GetType() != NRT_GEOMETRY3D) )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // LINE_ID    poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) );    // FEAT_CODE    poFeature->SetField( 1, papoGroup[0]->GetField( 17, 20 ) );    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1]));    // Attributes     poReader->ApplyAttributeValues( poFeature, papoGroup,                                    "HT", 2,                                    NULL );        // Set HEIGHT/elevation    OGRLineString *poLine = (OGRLineString *) poFeature->GetGeometryRef();        poFeature->SetField( 2, poFeature->GetFieldAsDouble(2) * 0.01 );    if( poLine != NULL && poLine->getCoordinateDimension() == 2 )    {        for( int i = 0; i < poLine->getNumPoints(); i++ )        {            poLine->setPoint( i, poLine->getX(i), poLine->getY(i),                              poFeature->GetFieldAsDouble(2) );        }    }    else if( poLine != NULL )    {        double  dfAccum = 0.0;                for( int i = 0; i < poLine->getNumPoints(); i++ )        {            dfAccum += poLine->getZ(i);        }        poFeature->SetField( 2, dfAccum / poLine->getNumPoints() );    }        return poFeature;}/************************************************************************//*                      TranslateLandlinePoint()                        *//************************************************************************/static OGRFeature *TranslateLandlinePoint( NTFFileReader *poReader,                                           OGRNTFLayer *poLayer,                                           NTFRecord **papoGroup ){    if( CSLCount((char **) papoGroup) < 2        || papoGroup[0]->GetType() != NRT_POINTREC        || papoGroup[1]->GetType() != NRT_GEOMETRY )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // POINT_ID    poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) );    // FEAT_CODE    poFeature->SetField( 1, papoGroup[0]->GetField( 17, 20 ) );    // ORIENT    poFeature->SetField( 2, atoi(papoGroup[0]->GetField( 11, 16 )) * 0.1 );    // DISTANCE    poReader->ApplyAttributeValues( poFeature, papoGroup,                                    "DT", 3,                                    NULL );    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1]));    // CHG_DATE (optional)    if( poFeature->GetFieldIndex("CHG_DATE") == 4 )    {        poFeature->SetField( 4, papoGroup[0]->GetField( 23, 28 ) );    }    // CHG_TYPE (optional)    if( poFeature->GetFieldIndex("CHG_TYPE") == 5 )    {        poFeature->SetField( 5, papoGroup[0]->GetField( 22, 22 ) );    }    return poFeature;}/************************************************************************//*                       TranslateLandlineLine()                        *//************************************************************************/static OGRFeature *TranslateLandlineLine( NTFFileReader *poReader,                                          OGRNTFLayer *poLayer,                                          NTFRecord **papoGroup ){    if( CSLCount((char **) papoGroup) != 2        || papoGroup[0]->GetType() != NRT_LINEREC        || papoGroup[1]->GetType() != NRT_GEOMETRY )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // LINE_ID    poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) );    // FEAT_CODE    poFeature->SetField( 1, papoGroup[0]->GetField( 17, 20 ) );    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1]));    // CHG_DATE (optional)    if( poFeature->GetFieldIndex("CHG_DATE") == 2 )    {        poFeature->SetField( 2, papoGroup[0]->GetField( 23, 28 ) );    }    // CHG_TYPE (optional)    if( poFeature->GetFieldIndex("CHG_TYPE") == 3 )    {        poFeature->SetField( 3, papoGroup[0]->GetField( 22, 22 ) );    }    return poFeature;}/************************************************************************//*                       TranslateLandlineName()                        *//************************************************************************/static OGRFeature *TranslateLandlineName( NTFFileReader *poReader,                                          OGRNTFLayer *poLayer,                                          NTFRecord **papoGroup ){    if( CSLCount((char **) papoGroup) != 3         || papoGroup[0]->GetType() != NRT_NAMEREC        || papoGroup[1]->GetType() != NRT_NAMEPOSTN        || papoGroup[2]->GetType() != NRT_GEOMETRY )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );            // NAME_ID    poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) );            // TEXT_CODE    poFeature->SetField( 1, papoGroup[0]->GetField( 9, 12 ) );            // TEXT    int         nNumChar = atoi(papoGroup[0]->GetField(13,14));    poFeature->SetField( 2, papoGroup[0]->GetField( 15, 15+nNumChar-1) );        // FONT    poFeature->SetField( 3, atoi(papoGroup[1]->GetField( 3, 6 )) );    // TEXT_HT    poFeature->SetField( 4, atoi(papoGroup[1]->GetField(7,9)) * 0.1 );            // DIG_POSTN    poFeature->SetField( 5, atoi(papoGroup[1]->GetField(10,10)) );            // ORIENT    poFeature->SetField( 6, atof(papoGroup[1]->GetField( 11, 14 )) * 0.1 );    // TEXT_HT_GROUND    poFeature->SetField( 7, poFeature->GetFieldAsDouble(4)                         * poReader->GetPaperToGround() );    // CHG_DATE (optional)    if( poFeature->GetFieldIndex("CHG_DATE") == 7 )    {        poFeature->SetField( 8, papoGroup[0]->GetField( 15+nNumChar+2,                                                        15+nNumChar+2+5) );    }    // CHG_TYPE (optional)    if( poFeature->GetFieldIndex("CHG_TYPE") == 9 )    {        poFeature->SetField( 9, papoGroup[0]->GetField( 15+nNumChar+1,                                                         15+nNumChar+1 ) );    }    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[2]));    return poFeature;}/************************************************************************//*                           EstablishLayer()                           *//*                                                                      *//*      Establish one layer based on a simplified description of the    *//*      fields to be present.                                           *//************************************************************************/void NTFFileReader::EstablishLayer( const char * pszLayerName,                                    OGRwkbGeometryType eGeomType,                                    NTFFeatureTranslator pfnTranslator,                                    int nLeadRecordType,                                    NTFGenericClass *poClass,                                    ... ){    va_list     hVaArgs;    OGRFeatureDefn *poDefn;    OGRNTFLayer         *poLayer;/* -------------------------------------------------------------------- *//*      Does this layer already exist?  If so, we do nothing            *//*      ... note that we don't check the definition.                    *//* -------------------------------------------------------------------- */    poLayer = poDS->GetNamedLayer(pszLayerName);/* ==================================================================== *//*      Create a new layer matching the request if we don't aleady      *//*      have one.                                                       *//* ==================================================================== */    if( poLayer == NULL )    {/* -------------------------------------------------------------------- *//*      Create a new feature definition.                                *//* -------------------------------------------------------------------- */        poDefn = new OGRFeatureDefn( pszLayerName );        poDefn->SetGeomType( eGeomType );/* -------------------------------------------------------------------- *//*      Fetch definitions of each field in turn.                        *//* -------------------------------------------------------------------- */        va_start(hVaArgs, poClass);        while( TRUE )        {            const char  *pszFieldName = va_arg(hVaArgs, const char *);            OGRFieldType     eType;            int          nWidth, nPrecision;                        if( pszFieldName == NULL )                break;                        eType = (OGRFieldType) va_arg(hVaArgs, int);            nWidth = va_arg(hVaArgs, int);            nPrecision = va_arg(hVaArgs, int);                        OGRFieldDefn         oFieldDefn( pszFieldName, eType );            oFieldDefn.SetWidth( nWidth );            oFieldDefn.SetPrecision( nPrecision );                        poDefn->AddFieldDefn( &oFieldDefn );        }                va_end(hVaArgs);/* -------------------------------------------------------------------- *//*      Add attributes collected in the generic class survey.           *//* -------------------------------------------------------------------- */        if( poClass != NULL )        {            for( int iGAtt = 0; iGAtt < poClass->nAttrCount; iGAtt++ )            {                const char      *pszFormat = poClass->papszAttrFormats[iGAtt];                OGRFieldDefn    oFieldDefn( poClass->papszAttrNames[iGAtt],                                            OFTInteger );                if( EQUALN(pszFormat,"I",1) )                {                    oFieldDefn.SetType( OFTInteger );                    oFieldDefn.SetWidth( poClass->panAttrMaxWidth[iGAtt] );                }                else if( EQUALN(pszFormat,"D",1)                         || EQUALN(pszFormat,"A",1) )                {                    oFieldDefn.SetType( OFTString );                    oFieldDefn.SetWidth( poClass->panAttrMaxWidth[iGAtt] );                }                else if( EQUALN(pszFormat,"R",1) )                {                    oFieldDefn.SetType( OFTReal );                    oFieldDefn.SetWidth( poClass->panAttrMaxWidth[iGAtt]+1 );                    if( pszFormat[2] == ',' )                        oFieldDefn.SetPrecision(atoi(pszFormat+3));                    else if( pszFormat[3] == ',' )                        oFieldDefn.SetPrecision(atoi(pszFormat+4));                }                poDefn->AddFieldDefn( &oFieldDefn );                /*                 ** If this field can appear multiple times, create an                ** additional attribute to hold lists of values.  This                ** is always created as a variable length string field.                */                if( poClass->pabAttrMultiple[iGAtt] )                {                    char szName[128];                    sprintf( szName, "%s_LIST",                              poClass->papszAttrNames[iGAtt] );                    OGRFieldDefn oFieldDefnL( szName, OFTString );                    poDefn->AddFieldDefn( &oFieldDefnL );                }            }        }/* -------------------------------------------------------------------- *//*      Add the

⌨️ 快捷键说明

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