📄 ntf_estlayers.cpp
字号:
{ 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 + -