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

📄 ntf_generic.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*                        AddGenericAttributes()                        *//************************************************************************/static void AddGenericAttributes( NTFFileReader * poReader,                                  NTFRecord **papoGroup,                                  OGRFeature * poFeature ){    char        **papszTypes, **papszValues;    if( !poReader->ProcessAttRecGroup( papoGroup, &papszTypes, &papszValues ) )        return;    for( int iAtt = 0; papszTypes != NULL && papszTypes[iAtt] != NULL; iAtt++ )    {        int             iField;                if( EQUAL(papszTypes[iAtt],"TX") )            iField = poFeature->GetFieldIndex("TEXT");        else if( EQUAL(papszTypes[iAtt],"FC") )            iField = poFeature->GetFieldIndex("FEAT_CODE");        else            iField = poFeature->GetFieldIndex(papszTypes[iAtt]);        if( iField == -1 )            continue;        poReader->ApplyAttributeValue( poFeature, iField, papszTypes[iAtt],                                       papszTypes, papszValues );/* -------------------------------------------------------------------- *//*      Do we have a corresponding list field we should be              *//*      accumulating this into?                                         *//* -------------------------------------------------------------------- */        char  szListName[128];        int   iListField;        sprintf( szListName, "%s_LIST",                  poFeature->GetFieldDefnRef(iField)->GetNameRef() );        iListField = poFeature->GetFieldIndex( szListName );/* -------------------------------------------------------------------- *//*      Yes, so perform processing similar to ApplyAttributeValue(),    *//*      and append to list value.                                       *//* -------------------------------------------------------------------- */        if( iListField != -1 )        {            char        *pszAttLongName, *pszAttValue, *pszCodeDesc;                        poReader->ProcessAttValue( papszTypes[iAtt], papszValues[iAtt],                                       &pszAttLongName, &pszAttValue,                                        &pszCodeDesc );            if( poFeature->IsFieldSet( iListField ) )            {                poFeature->SetField( iListField,                     CPLSPrintf( "%s,%s",                                 poFeature->GetFieldAsString( iListField ),                                 pszAttValue ) );            }            else            {                poFeature->SetField( iListField, pszAttValue );            }        }    }    CSLDestroy( papszTypes );    CSLDestroy( papszValues );}/************************************************************************//*                        TranslateGenericNode()                        *//************************************************************************/static OGRFeature *TranslateGenericNode( NTFFileReader *poReader,                                         OGRNTFLayer *poLayer,                                         NTFRecord **papoGroup ){    if( CSLCount((char **) papoGroup) < 2        || papoGroup[0]->GetType() != NRT_NODEREC        || (papoGroup[1]->GetType() != NRT_GEOMETRY            && papoGroup[1]->GetType() != NRT_GEOMETRY3D) )    {        return NULL;    }            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // NODE_ID    poFeature->SetField( "NODE_ID", atoi(papoGroup[0]->GetField( 3, 8 )) );    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1]));    poFeature->SetField( "GEOM_ID", papoGroup[1]->GetField(3,8) );    // NUM_LINKS    int         nLinkCount=0;    int         *panLinks = NULL;    if( papoGroup[0]->GetLength() > 18 )    {        nLinkCount = atoi(papoGroup[0]->GetField(15,18));        panLinks = (int *) CPLCalloc(sizeof(int),nLinkCount);    }    poFeature->SetField( "NUM_LINKS", nLinkCount );    // GEOM_ID_OF_LINK    int      iLink;    for( iLink = 0; iLink < nLinkCount; iLink++ )        panLinks[iLink] = atoi(papoGroup[0]->GetField(20+iLink*12,                                                      25+iLink*12));    poFeature->SetField( "GEOM_ID_OF_LINK", nLinkCount, panLinks );    // DIR    for( iLink = 0; iLink < nLinkCount; iLink++ )        panLinks[iLink] = atoi(papoGroup[0]->GetField(19+iLink*12,                                                      19+iLink*12));    poFeature->SetField( "DIR", nLinkCount, panLinks );    // should we add LEVEL and/or ORIENT?    CPLFree( panLinks );    return poFeature;}/************************************************************************//*                     TranslateGenericCollection()                     *//************************************************************************/static OGRFeature *TranslateGenericCollection( NTFFileReader *poReader,                                               OGRNTFLayer *poLayer,                                               NTFRecord **papoGroup ){    if( CSLCount((char **) papoGroup) < 1         || papoGroup[0]->GetType() != NRT_COLLECT )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // COLL_ID    poFeature->SetField( "COLL_ID", atoi(papoGroup[0]->GetField( 3, 8 )) );    // NUM_PARTS    int         nPartCount=0;    int         *panParts = NULL;    if( papoGroup[0]->GetLength() > 18 )    {        nPartCount = atoi(papoGroup[0]->GetField(9,12));        panParts = (int *) CPLCalloc(sizeof(int),nPartCount);    }    poFeature->SetField( "NUM_PARTS", nPartCount );    // TYPE    int      iPart;    for( iPart = 0; iPart < nPartCount; iPart++ )        panParts[iPart] = atoi(papoGroup[0]->GetField(13+iPart*8,                                                      14+iPart*8));    poFeature->SetField( "TYPE", nPartCount, panParts );    // ID    for( iPart = 0; iPart < nPartCount; iPart++ )        panParts[iPart] = atoi(papoGroup[0]->GetField(15+iPart*8,                                                      20+iPart*8));    poFeature->SetField( "ID", nPartCount, panParts );    CPLFree( panParts );    // ATTREC Attributes    AddGenericAttributes( poReader, papoGroup, poFeature );    return poFeature;}/************************************************************************//*                        TranslateGenericText()                        *//************************************************************************/static OGRFeature *TranslateGenericText( NTFFileReader *poReader,                                         OGRNTFLayer *poLayer,                                         NTFRecord **papoGroup ){    int         iRec;        if( CSLCount((char **) papoGroup) < 2        || papoGroup[0]->GetType() != NRT_TEXTREC )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // TEXT_ID    poFeature->SetField( "TEXT_ID", atoi(papoGroup[0]->GetField( 3, 8 )) );    // Geometry    for( iRec = 0; papoGroup[iRec] != NULL; iRec++ )    {        if( papoGroup[iRec]->GetType() == NRT_GEOMETRY            || papoGroup[iRec]->GetType() == NRT_GEOMETRY3D )        {            poFeature->SetGeometryDirectly(                poReader->ProcessGeometry(papoGroup[iRec]));            poFeature->SetField( "GEOM_ID", papoGroup[iRec]->GetField(3,8) );            break;        }    }    // ATTREC Attributes    AddGenericAttributes( poReader, papoGroup, poFeature );    // TEXTREP information    for( iRec = 0; papoGroup[iRec] != NULL; iRec++ )    {        NTFRecord       *poRecord = papoGroup[iRec];                if( poRecord->GetType() == NRT_TEXTREP )        {            poFeature->SetField( "FONT", atoi(poRecord->GetField(9,12)) );            poFeature->SetField( "TEXT_HT",                                 atoi(poRecord->GetField(13,15)) * 0.1 );            poFeature->SetField( "TEXT_HT_GROUND",                                 atoi(poRecord->GetField(13,15))                                 * 0.1 * poReader->GetPaperToGround() );            poFeature->SetField( "DIG_POSTN",                                 atoi(poRecord->GetField(16,16)) );            poFeature->SetField( "ORIENT",                                 atoi(poRecord->GetField(17,20)) * 0.1 );            break;        }    }    return poFeature;}/************************************************************************//*                        TranslateGenericName()                        *//************************************************************************/static OGRFeature *TranslateGenericName( NTFFileReader *poReader,                                         OGRNTFLayer *poLayer,                                         NTFRecord **papoGroup ){    int         iRec;        if( CSLCount((char **) papoGroup) < 2        || papoGroup[0]->GetType() != NRT_NAMEREC )        return NULL;            OGRFeature  *poFeature = new OGRFeature( poLayer->GetLayerDefn() );    // NAME_ID    poFeature->SetField( "NAME_ID", atoi(papoGroup[0]->GetField( 3, 8 )) );    // TEXT_CODE    poFeature->SetField( "TEXT_CODE", papoGroup[0]->GetField( 8, 12 ) );    // TEXT    int nNumChar = atoi(papoGroup[0]->GetField(13,14));    poFeature->SetField( "TEXT", papoGroup[0]->GetField( 15, 15+nNumChar-1));    // Geometry    for( iRec = 0; papoGroup[iRec] != NULL; iRec++ )    {        if( papoGroup[iRec]->GetType() == NRT_GEOMETRY            || papoGroup[iRec]->GetType() == NRT_GEOMETRY3D )        {            poFeature->SetGeometryDirectly(                poReader->ProcessGeometry(papoGroup[iRec]));            poFeature->SetField( "GEOM_ID", papoGroup[iRec]->GetField(3,8) );            break;        }    }    // ATTREC Attributes    AddGenericAttributes( poReader, papoGroup, poFeature );    // NAMEPOSTN information    for( iRec = 0; papoGroup[iRec] != NULL; iRec++ )    {        NTFRecord       *poRecord = papoGroup[iRec];                if( poRecord->GetType() == NRT_NAMEPOSTN )        {            poFeature->SetField( "FONT", atoi(poRecord->GetField(3,6)) );            poFeature->SetField( "TEXT_HT",                                 atoi(poRecord->GetField(7,9)) * 0.1 );            poFeature->SetField( "TEXT_HT_GROUND",                                 atoi(poRecord->GetField(7,9))                                 * 0.1 * poReader->GetPaperToGround() );            poFeature->SetField( "DIG_POSTN",                                 atoi(poRecord->GetField(10,10)) );            poFeature->SetField( "ORIENT",                                 atoi(poRecord->GetField(11,14)) * 0.1 );            break;        }    }    return poFeature;}/************************************************************************//*                       TranslateGenericPoint()                        *//************************************************************************/static OGRFeature *TranslateGenericPoint( NTFFileReader *poReader,                                          OGRNTFLayer *poLayer,                                          NTFRecord **papoGroup ){    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( "POINT_ID", atoi(papoGroup[0]->GetField( 3, 8 )) );    // Geometry    poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1]));    poFeature->SetField( "GEOM_ID", papoGroup[1]->GetField(3,8) );    // ATTREC Attributes    AddGenericAttributes( poReader, papoGroup, poFeature );    // Handle singular attribute in pre-level 3 POINTREC.    if( poReader->GetNTFLevel() < 3 )    {        char    szValType[3];        strcpy( szValType, papoGroup[0]->GetField(9,10) );        if( !EQUAL(szValType,"  ") )        {            char        *pszProcessedValue;            if( poReader->ProcessAttValue(szValType,

⌨️ 快捷键说明

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