📄 ntf_generic.cpp
字号:
/* 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 + -