📄 ntf_estlayers.cpp
字号:
CSLDestroy( papszOSODRList ); CSLDestroy( papszTypes ); CSLDestroy( papszValues ); } return poFeature;}/************************************************************************//* TranslateOscarComment() *//************************************************************************/static OGRFeature *TranslateOscarComment( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) != 1 || papoGroup[0]->GetType() != NRT_COMMENT ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // RECORD_TYPE poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 4 )) ); // RECORD_ID poFeature->SetField( 1, papoGroup[0]->GetField( 5, 17 ) ); // CHANGE_TYPE poFeature->SetField( 2, papoGroup[0]->GetField( 18, 18 ) ); return poFeature;}/************************************************************************//* TranslateOscarNetworkPoint() *//************************************************************************/static OGRFeature *TranslateOscarNetworkPoint( 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 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "OD", 3, "JN", 4, "SN", 5, "RT", 6, NULL ); return poFeature;}/************************************************************************//* TranslateOscarNetworkLine() *//************************************************************************/static OGRFeature *TranslateOscarNetworkLine( 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 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "OD", 3, "PN", 4, "LL", 5, "RN", 6, NULL ); return poFeature;}/************************************************************************//* TranslateBasedataPoint() *//************************************************************************/static OGRFeature *TranslateBasedataPoint( 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 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); // GEOM_ID poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "PN", 3, "NU", 4, "CM", 5, "UN", 6, "OR", 7, NULL ); return poFeature;}/************************************************************************//* TranslateBasedataLine() *//************************************************************************/static OGRFeature *TranslateBasedataLine( 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 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); // GEOM_ID poFeature->SetField( 2, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 1, "PN", 3, "NU", 4, "RB", 5, NULL ); return poFeature;}/************************************************************************//* TranslateBoundarylineCollection() *//************************************************************************/static OGRFeature *TranslateBoundarylineCollection( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) != 2 || papoGroup[0]->GetType() != NRT_COLLECT || papoGroup[1]->GetType() != NRT_ATTREC ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // COLL_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // NUM_PARTS int nNumLinks = atoi(papoGroup[0]->GetField( 9, 12 )); if( nNumLinks > MAX_LINK ) { CPLError( CE_Failure, CPLE_AppDefined, "MAX_LINK exceeded in ntf_estlayers.cpp." ); return poFeature; } poFeature->SetField( 1, nNumLinks ); // POLY_ID int i, anList[MAX_LINK]; for( i = 0; i < nNumLinks; i++ ) anList[i] = atoi(papoGroup[0]->GetField( 15+i*8, 20+i*8 )); poFeature->SetField( 2, nNumLinks, anList ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "AI", 3, "OP", 4, "NM", 5, NULL ); return poFeature;}/************************************************************************//* TranslateBoundarylinePoly() *//************************************************************************/static OGRFeature *TranslateBoundarylinePoly( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){/* ==================================================================== *//* Traditional POLYGON record groups. *//* ==================================================================== */ if( CSLCount((char **) papoGroup) == 4 && papoGroup[0]->GetType() == NRT_POLYGON && papoGroup[1]->GetType() == NRT_ATTREC && papoGroup[2]->GetType() == NRT_CHAIN && papoGroup[3]->GetType() == NRT_GEOMETRY ) { OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // POLY_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // NUM_PARTS int nNumLinks = atoi(papoGroup[2]->GetField( 9, 12 )); if( nNumLinks > MAX_LINK ) { CPLError( CE_Failure, CPLE_AppDefined, "MAX_LINK exceeded in ntf_estlayers.cpp." ); return poFeature; } poFeature->SetField( 4, nNumLinks ); // DIR int i, anList[MAX_LINK]; for( i = 0; i < nNumLinks; i++ ) anList[i] = atoi(papoGroup[2]->GetField( 19+i*7, 19+i*7 )); poFeature->SetField( 5, nNumLinks, anList ); // GEOM_ID_OF_LINK for( i = 0; i < nNumLinks; i++ ) anList[i] = atoi(papoGroup[2]->GetField( 13+i*7, 18+i*7 )); poFeature->SetField( 6, nNumLinks, anList ); // RingStart int nRingList = 0; poFeature->SetField( 7, 1, &nRingList ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 1, "PI", 2, "HA", 3, NULL ); // Read point geometry poFeature->SetGeometryDirectly( poReader->ProcessGeometry(papoGroup[3])); // Try to assemble polygon geometry. poReader->FormPolygonFromCache( poFeature ); return poFeature; }/* ==================================================================== *//* CPOLYGON Group *//* ==================================================================== *//* -------------------------------------------------------------------- *//* First we do validation of the grouping. *//* -------------------------------------------------------------------- */ int iRec; for( iRec = 0; papoGroup[iRec] != NULL && papoGroup[iRec+1] != NULL && papoGroup[iRec]->GetType() == NRT_POLYGON && papoGroup[iRec+1]->GetType() == NRT_CHAIN; iRec += 2 ) {} if( CSLCount((char **) papoGroup) != iRec + 3 ) return NULL; if( papoGroup[iRec]->GetType() != NRT_CPOLY || papoGroup[iRec+1]->GetType() != NRT_ATTREC || papoGroup[iRec+2]->GetType() != NRT_GEOMETRY ) return NULL;/* -------------------------------------------------------------------- *//* Collect the chains for each of the rings, and just aggregate *//* these into the master list without any concept of where the *//* boundaries are. The boundary information will be emmitted *//* in the RingStart field. *//* -------------------------------------------------------------------- */ OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); int nNumLink = 0; int anDirList[MAX_LINK*2], anGeomList[MAX_LINK*2]; int anRingStart[MAX_LINK], nRings = 0; for( iRec = 0; papoGroup[iRec] != NULL && papoGroup[iRec+1] != NULL && papoGroup[iRec]->GetType() == NRT_POLYGON && papoGroup[iRec+1]->GetType() == NRT_CHAIN; iRec += 2 ) { int i, nLineCount; nLineCount = atoi(papoGroup[iRec+1]->GetField(9,12)); anRingStart[nRings++] = nNumLink; for( i = 0; i < nLineCount && nNumLink < MAX_LINK*2; i++ ) { anDirList[nNumLink] = atoi(papoGroup[iRec+1]->GetField( 19+i*7, 19+i*7 )); anGeomList[nNumLink] = atoi(papoGroup[iRec+1]->GetField( 13+i*7, 18+i*7 )); nNumLink++; } if( nNumLink == MAX_LINK*2 ) { CPLError( CE_Failure, CPLE_AppDefined, "MAX_LINK exceeded in ntf_estlayers.cpp." ); delete poFeature; return NULL; } } // NUM_PART poFeature->SetField( 4, nNumLink ); // DIR poFeature->SetField( 5, nNumLink, anDirList ); // GEOM_ID_OF_LINK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -