s57featuredefns.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 534 行 · 第 1/2 页
CPP
534 行
poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* For lines we want to capture the point links for the first *//* and last nodes. *//* -------------------------------------------------------------------- */ if( nRCNM == RCNM_VE ) { oField.Set( "NAME_RCNM_0", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "NAME_RCID_0", OFTInteger, 8, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "ORNT_0", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "USAG_0", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "TOPI_0", OFTInteger, 1, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "MASK_0", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "NAME_RCNM_1", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "NAME_RCID_1", OFTInteger, 8, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "ORNT_1", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "USAG_1", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "TOPI_1", OFTInteger, 1, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "MASK_1", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField ); } return poFDefn;}/************************************************************************//* S57GenerateObjectClassDefn() *//************************************************************************/OGRFeatureDefn *S57GenerateObjectClassDefn( S57ClassRegistrar *poCR, int nOBJL, int nOptionFlags ){ OGRFeatureDefn *poFDefn = NULL; char **papszGeomPrim; if( !poCR->SelectClass( nOBJL ) ) return NULL; /* -------------------------------------------------------------------- *//* Create the feature definition based on the object class *//* acronym. *//* -------------------------------------------------------------------- */ poFDefn = new OGRFeatureDefn( poCR->GetAcronym() ); poFDefn->Reference();/* -------------------------------------------------------------------- *//* Try and establish the geometry type. If more than one *//* geometry type is allowed we just fall back to wkbUnknown. *//* -------------------------------------------------------------------- */ papszGeomPrim = poCR->GetPrimitives(); if( CSLCount(papszGeomPrim) == 0 ) { poFDefn->SetGeomType( wkbNone ); } else if( CSLCount(papszGeomPrim) > 1 ) { // leave as unknown geometry type. } else if( papszGeomPrim[0][0] == 'P' ) { if( EQUAL(poCR->GetAcronym(),"SOUNDG") ) { if( nOptionFlags & S57M_SPLIT_MULTIPOINT ) poFDefn->SetGeomType( wkbPoint25D ); else poFDefn->SetGeomType( wkbMultiPoint ); } else poFDefn->SetGeomType( wkbPoint ); } else if( papszGeomPrim[0][0] == 'A' ) { poFDefn->SetGeomType( wkbPolygon ); } else if( papszGeomPrim[0][0] == 'L' ) { poFDefn->SetGeomType( wkbLineString ); } /* -------------------------------------------------------------------- *//* Add the standard attributes. *//* -------------------------------------------------------------------- */ S57GenerateStandardAttributes( poFDefn, nOptionFlags );/* -------------------------------------------------------------------- *//* Add the attributes specific to this object class. *//* -------------------------------------------------------------------- */ char **papszAttrList = poCR->GetAttributeList(); for( int iAttr = 0; papszAttrList != NULL && papszAttrList[iAttr] != NULL; iAttr++ ) { int iAttrIndex = poCR->FindAttrByAcronym( papszAttrList[iAttr] ); if( iAttrIndex == -1 ) { CPLDebug( "S57", "Can't find attribute %s from class %s:%s.\n", papszAttrList[iAttr], poCR->GetAcronym(), poCR->GetDescription() ); continue; } OGRFieldDefn oField( papszAttrList[iAttr], OFTInteger ); switch( poCR->GetAttrType( iAttrIndex ) ) { case SAT_ENUM: case SAT_INT: oField.SetType( OFTInteger ); break; case SAT_FLOAT: oField.SetType( OFTReal ); break; case SAT_CODE_STRING: case SAT_FREE_TEXT: oField.SetType( OFTString ); break; case SAT_LIST: oField.SetType( OFTString ); break; } poFDefn->AddFieldDefn( &oField ); }/* -------------------------------------------------------------------- *//* Do we need to add DEPTH attributes to soundings? *//* -------------------------------------------------------------------- */ if( EQUAL(poCR->GetAcronym(),"SOUNDG") && (nOptionFlags & S57M_ADD_SOUNDG_DEPTH) ) { OGRFieldDefn oField( "DEPTH", OFTReal ); poFDefn->AddFieldDefn( &oField ); } return poFDefn;}/************************************************************************//* S57GenerateStandardAttributes() *//* *//* Attach standard feature attributes to a feature definition. *//************************************************************************/void S57GenerateStandardAttributes( OGRFeatureDefn *poFDefn, int nOptionFlags ){ OGRFieldDefn oField( "", OFTInteger );/* -------------------------------------------------------------------- *//* RCID *//* -------------------------------------------------------------------- */ oField.Set( "RCID", OFTInteger, 10, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* PRIM *//* -------------------------------------------------------------------- */ oField.Set( "PRIM", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* GRUP *//* -------------------------------------------------------------------- */ oField.Set( "GRUP", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* OBJL *//* -------------------------------------------------------------------- */ oField.Set( "OBJL", OFTInteger, 5, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* RVER *//* -------------------------------------------------------------------- */ oField.Set( "RVER", OFTInteger, 3, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* AGEN *//* -------------------------------------------------------------------- */ oField.Set( "AGEN", OFTInteger, 5, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* FIDN *//* -------------------------------------------------------------------- */ oField.Set( "FIDN", OFTInteger, 10, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* FIDS *//* -------------------------------------------------------------------- */ oField.Set( "FIDS", OFTInteger, 5, 0 ); poFDefn->AddFieldDefn( &oField );/* -------------------------------------------------------------------- *//* LNAM - only generated when LNAM strings are being used. *//* -------------------------------------------------------------------- */ if( nOptionFlags & S57M_LNAM_REFS ) { oField.Set( "LNAM", OFTString, 16, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "LNAM_REFS", OFTStringList, 16, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "FFPT_RIND", OFTIntegerList, 1, 0 ); poFDefn->AddFieldDefn( &oField ); // We should likely include FFPT_COMT here. }/* -------------------------------------------------------------------- *//* Values from FSPT field. *//* -------------------------------------------------------------------- */ if( nOptionFlags & S57M_RETURN_LINKAGES ) { oField.Set( "NAME_RCNM", OFTIntegerList, 3, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "NAME_RCID", OFTIntegerList, 10, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "ORNT", OFTIntegerList, 1, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "USAG", OFTIntegerList, 1, 0 ); poFDefn->AddFieldDefn( &oField ); oField.Set( "MASK", OFTIntegerList, 3, 0 ); poFDefn->AddFieldDefn( &oField ); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?