📄 ntf_estlayers.cpp
字号:
poFeature->SetField( 6, nNumLink, anGeomList ); // RingStart poFeature->SetField( 7, nRings, anRingStart ); /* -------------------------------------------------------------------- *//* collect information for whole complex polygon. *//* -------------------------------------------------------------------- */ // POLY_ID poFeature->SetField( 0, atoi(papoGroup[iRec]->GetField( 3, 8 )) ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 1, "PI", 2, "HA", 3, NULL ); // point geometry for seed. poFeature->SetGeometryDirectly( poReader->ProcessGeometry(papoGroup[iRec+2])); // Try to assemble polygon geometry. poReader->FormPolygonFromCache( poFeature ); return poFeature;}/************************************************************************//* TranslateBoundarylineLink() *//************************************************************************/static OGRFeature *TranslateBoundarylineLink( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) != 2 || papoGroup[0]->GetType() != NRT_GEOMETRY || papoGroup[1]->GetType() != NRT_ATTREC ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[0], &nGeomId)); // GEOM_ID poFeature->SetField( 0, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 1, "LK", 2, "HW", 3, NULL ); return poFeature;}/************************************************************************//* TranslateBL2000Poly() *//************************************************************************/static OGRFeature *TranslateBL2000Poly( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){/* ==================================================================== *//* Traditional POLYGON record groups. *//* ==================================================================== */ if( CSLCount((char **) papoGroup) == 3 && papoGroup[0]->GetType() == NRT_POLYGON && papoGroup[1]->GetType() == NRT_ATTREC && papoGroup[2]->GetType() == NRT_CHAIN ) { 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( 3, 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( 4, 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( 5, nNumLinks, anList ); // RingStart int nRingList = 0; poFeature->SetField( 6, 1, &nRingList ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "PI", 1, "HA", 2, NULL ); // 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 + 2 ) return NULL; if( papoGroup[iRec]->GetType() != NRT_CPOLY || papoGroup[iRec+1]->GetType() != NRT_ATTREC ) 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( 3, nNumLink ); // DIR poFeature->SetField( 4, nNumLink, anDirList ); // GEOM_ID_OF_LINK poFeature->SetField( 5, nNumLink, anGeomList ); // RingStart poFeature->SetField( 6, nRings, anRingStart ); /* -------------------------------------------------------------------- *//* collect information for whole complex polygon. *//* -------------------------------------------------------------------- */ // POLY_ID poFeature->SetField( 0, atoi(papoGroup[iRec]->GetField( 3, 8 )) ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "PI", 1, "HA", 2, NULL ); // Try to assemble polygon geometry. poReader->FormPolygonFromCache( poFeature ); return poFeature;}/************************************************************************//* TranslateBL2000Link() *//************************************************************************/static OGRFeature *TranslateBL2000Link( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) != 3 || papoGroup[0]->GetType() != NRT_LINEREC || papoGroup[1]->GetType() != NRT_GEOMETRY || papoGroup[2]->GetType() != NRT_ATTREC ) 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( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "LK", 3, NULL ); return poFeature;}/************************************************************************//* TranslateBL2000Collection() *//************************************************************************/static OGRFeature *TranslateBL2000Collection( 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 / COLL_ID_REFS int i, anList[MAX_LINK], anCollList[MAX_LINK]; int nPolys=0, nCollections=0; for( i = 0; i < nNumLinks; i++ ) { if( atoi(papoGroup[0]->GetField( 13+i*8, 14+i*8 )) == 34 ) anCollList[nCollections++] = atoi(papoGroup[0]->GetField( 15+i*8, 20+i*8 )); else anList[nPolys++] = atoi(papoGroup[0]->GetField( 15+i*8, 20+i*8 )); } poFeature->SetField( 2, nPolys, anList ); poFeature->SetField( 10, nCollections, anCollList ); // Attributes // Node that _CODE_DESC values are automatically applied if // the target fields exist. poReader->ApplyAttributeValues( poFeature, papoGroup, "AI", 3, "OP", 4, "NM", 5, "TY", 6, "AC", 7, "NB", 8, "NA", 9, NULL ); return poFeature;}/************************************************************************//* TranslateMeridianPoint() *//************************************************************************/static OGRFeature *TranslateMeridianPoint( 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, "OS", 4, "JN", 5, "RT", 6, "SI", 7, "PI", 8, "NM", 9, "DA", 10, NULL ); return poFeature;}/************************************************************************//* TranslateMeridianLine() *//************************************************************************/static OGRFeature *TranslateMeridianLine( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_LINEREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -