本文整理汇总了C++中DDFFieldDefn类的典型用法代码示例。如果您正苦于以下问题:C++ DDFFieldDefn类的具体用法?C++ DDFFieldDefn怎么用?C++ DDFFieldDefn使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了DDFFieldDefn类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Read
int SDTSRawPolygon::Read( DDFRecord * poRecord )
{
/* ==================================================================== */
/* Loop over fields in this record, looking for those we */
/* recognise, and need. */
/* ==================================================================== */
for( int iField = 0; iField < poRecord->GetFieldCount(); iField++ )
{
DDFField *poField = poRecord->GetField( iField );
if( poField == nullptr )
return FALSE;
DDFFieldDefn* poFieldDefn = poField->GetFieldDefn();
if( poFieldDefn == nullptr )
return FALSE;
const char *pszFieldName = poFieldDefn->GetName();
if( EQUAL(pszFieldName,"POLY") )
{
oModId.Set( poField );
}
else if( EQUAL(pszFieldName,"ATID") )
{
ApplyATID( poField );
}
}
return TRUE;
}
示例2: Set
int SDTSModId::Set( DDFField *poField )
{
const char *pachData = poField->GetData();
DDFFieldDefn *poDefn = poField->GetFieldDefn();
if( poDefn->GetSubfieldCount() >= 2
&& poDefn->GetSubfield(0)->GetWidth() == 4 )
{
if( strlen(pachData) < 5 )
return FALSE;
memcpy( szModule, pachData, 4 );
szModule[4] = '\0';
nRecord = atoi( pachData + 4 );
}
else
{
DDFSubfieldDefn *poSF
= poField->GetFieldDefn()->FindSubfieldDefn( "MODN" );
if( poSF == nullptr )
return FALSE;
int nBytesRemaining;
pachData = poField->GetSubfieldData(poSF, &nBytesRemaining);
if( pachData == nullptr )
return FALSE;
snprintf( szModule, sizeof(szModule), "%s",
poSF->ExtractStringData( pachData, nBytesRemaining, nullptr) );
poSF = poField->GetFieldDefn()->FindSubfieldDefn( "RCID" );
if( poSF != nullptr )
{
pachData = poField->GetSubfieldData(poSF, &nBytesRemaining);
if( pachData != nullptr )
nRecord = poSF->ExtractIntData( pachData, nBytesRemaining, nullptr);
}
}
if( poDefn->GetSubfieldCount() == 3 )
{
DDFSubfieldDefn *poSF = poField->GetFieldDefn()->FindSubfieldDefn( "OBRP" );
if( poSF != nullptr )
{
int nBytesRemaining;
pachData
= poField->GetSubfieldData(poSF, &nBytesRemaining);
if( pachData != nullptr )
{
snprintf( szOBRP, sizeof(szOBRP), "%s",
poSF->ExtractStringData( pachData, nBytesRemaining, nullptr) );
}
}
}
return FALSE;
}
示例3: Set
int SDTSModId::Set( DDFField *poField )
{
const char *pachData = poField->GetData();
DDFFieldDefn *poDefn = poField->GetFieldDefn();
if( poDefn->GetSubfieldCount() >= 2
&& poDefn->GetSubfield(0)->GetWidth() == 4 )
{
memcpy( szModule, pachData, 4 );
szModule[4] = '\0';
nRecord = atoi( pachData + 4 );
}
else
{
DDFSubfieldDefn *poSF;
int nBytesRemaining;
const char *pachData;
poSF = poField->GetFieldDefn()->FindSubfieldDefn( "MODN" );
pachData = poField->GetSubfieldData(poSF, &nBytesRemaining);
strncpy( szModule,
poSF->ExtractStringData( pachData, nBytesRemaining, NULL),
sizeof(szModule) );
szModule[sizeof(szModule)-1] = '\0';
poSF = poField->GetFieldDefn()->FindSubfieldDefn( "RCID" );
pachData = poField->GetSubfieldData(poSF, &nBytesRemaining);
nRecord = poSF->ExtractIntData( pachData, nBytesRemaining, NULL);
}
if( poDefn->GetSubfieldCount() == 3 )
{
DDFSubfieldDefn *poSF;
poSF = poField->GetFieldDefn()->FindSubfieldDefn( "OBRP" );
if( poSF != NULL )
{
int nBytesRemaining;
const char *pachData;
pachData = poField->GetSubfieldData(poSF, &nBytesRemaining);
strncpy( szOBRP,
poSF->ExtractStringData( pachData, nBytesRemaining, NULL),
sizeof(szOBRP) );
szOBRP[sizeof(szOBRP)-1] = '\0';
}
}
return FALSE;
}
示例4: ViewRecordField
static void ViewRecordField( DDFField * poField )
{
int nBytesRemaining;
const char *pachFieldData;
DDFFieldDefn *poFieldDefn = poField->GetFieldDefn();
// Report general information about the field.
printf( " Field %s: %s\n",
poFieldDefn->GetName(), poFieldDefn->GetDescription() );
// Get pointer to this fields raw data. We will move through
// it consuming data as we report subfield values.
pachFieldData = poField->GetData();
nBytesRemaining = poField->GetDataSize();
/* -------------------------------------------------------- */
/* Loop over the repeat count for this fields */
/* subfields. The repeat count will almost */
/* always be one. */
/* -------------------------------------------------------- */
int iRepeat;
for( iRepeat = 0; iRepeat < poField->GetRepeatCount(); iRepeat++ )
{
/* -------------------------------------------------------- */
/* Loop over all the subfields of this field, advancing */
/* the data pointer as we consume data. */
/* -------------------------------------------------------- */
int iSF;
for( iSF = 0; iSF < poFieldDefn->GetSubfieldCount(); iSF++ )
{
DDFSubfieldDefn *poSFDefn = poFieldDefn->GetSubfield( iSF );
int nBytesConsumed;
nBytesConsumed = ViewSubfield( poSFDefn, pachFieldData,
nBytesRemaining );
nBytesRemaining -= nBytesConsumed;
pachFieldData += nBytesConsumed;
}
}
}
示例5: Read
int SDTSRawPoint::Read( SDTS_IREF * poIREF, DDFRecord * poRecord )
{
/* ==================================================================== */
/* Loop over fields in this record, looking for those we */
/* recognise, and need. */
/* ==================================================================== */
for( int iField = 0; iField < poRecord->GetFieldCount(); iField++ )
{
DDFField *poField = poRecord->GetField( iField );
if( poField == nullptr )
return FALSE;
DDFFieldDefn* poFieldDefn = poField->GetFieldDefn();
if( poFieldDefn == nullptr )
return FALSE;
const char *pszFieldName = poFieldDefn->GetName();
if( EQUAL(pszFieldName,"PNTS") )
oModId.Set( poField );
else if( EQUAL(pszFieldName,"ATID") )
ApplyATID( poField );
else if( EQUAL(pszFieldName,"ARID") )
{
oAreaId.Set( poField );
}
else if( EQUAL(pszFieldName,"SADR") )
{
poIREF->GetSADR( poField, 1, &dfX, &dfY, &dfZ );
}
}
return TRUE;
}
示例6: main
int main( int nArgc, char ** papszArgv )
{
DDFModule oModule;
const char *pszFilename = NULL;
int bFSPTHack = FALSE;
int bXML = FALSE;
/* -------------------------------------------------------------------- */
/* Check arguments. */
/* -------------------------------------------------------------------- */
for( int iArg = 1; iArg < nArgc; iArg++ )
{
if( EQUAL(papszArgv[iArg],"-fspt_repeating") )
bFSPTHack = TRUE;
else if( EQUAL(papszArgv[iArg],"-xml") )
bXML = TRUE;
else
pszFilename = papszArgv[iArg];
}
if( pszFilename == NULL )
{
printf( "Usage: 8211dump [-xml] [-fspt_repeating] filename\n" );
exit( 1 );
}
/* -------------------------------------------------------------------- */
/* Open file. */
/* -------------------------------------------------------------------- */
if( !oModule.Open( pszFilename ) )
exit( 1 );
/* -------------------------------------------------------------------- */
/* Apply FSPT hack if required. */
/* -------------------------------------------------------------------- */
if( bFSPTHack )
{
DDFFieldDefn *poFSPT = oModule.FindFieldDefn( "FSPT" );
if( poFSPT == NULL )
fprintf( stderr,
"unable to find FSPT field to set repeating flag.\n" );
else
poFSPT->SetRepeatingFlag( TRUE );
}
/* -------------------------------------------------------------------- */
/* Dump header, and all records. */
/* -------------------------------------------------------------------- */
DDFRecord *poRecord;
if( bXML )
{
printf("<DDFModule>\n");
int nFieldDefnCount = oModule.GetFieldCount();
for( int i = 0; i < nFieldDefnCount; i++ )
{
DDFFieldDefn* poFieldDefn = oModule.GetField(i);
const char* pszDataStructCode;
switch( poFieldDefn->GetDataStructCode() )
{
case dsc_elementary:
pszDataStructCode = "elementary";
break;
case dsc_vector:
pszDataStructCode = "vector";
break;
case dsc_array:
pszDataStructCode = "array";
break;
case dsc_concatenated:
pszDataStructCode = "concatenated";
break;
default:
pszDataStructCode = "(unknown)";
break;
}
const char* pszDataTypeCode;
switch( poFieldDefn->GetDataTypeCode() )
{
case dtc_char_string:
pszDataTypeCode = "char_string";
break;
case dtc_implicit_point:
pszDataTypeCode = "implicit_point";
break;
case dtc_explicit_point:
pszDataTypeCode = "explicit_point";
break;
case dtc_explicit_point_scaled:
pszDataTypeCode = "explicit_point_scaled";
//.........这里部分代码省略.........
示例7: Close
//.........这里部分代码省略.........
}
}
/* -------------------------------------------------------------------- */
/* If the header is invalid, then clean up, report the error */
/* and return. */
/* -------------------------------------------------------------------- */
if( !bValid )
{
CPL_IGNORE_RET_VAL(VSIFCloseL( fpDDF ));
fpDDF = NULL;
if( !bFailQuietly )
CPLError( CE_Failure, CPLE_AppDefined,
"File `%s' does not appear to have\n"
"a valid ISO 8211 header.\n",
pszFilename );
return FALSE;
}
/* -------------------------------------------------------------------- */
/* Read the whole record info memory. */
/* -------------------------------------------------------------------- */
char *pachRecord = (char *) CPLMalloc(_recLength);
memcpy( pachRecord, achLeader, nLeaderSize );
if( (int)VSIFReadL( pachRecord+nLeaderSize, 1, _recLength-nLeaderSize, fpDDF )
!= _recLength - nLeaderSize )
{
if( !bFailQuietly )
CPLError( CE_Failure, CPLE_FileIO,
"Header record is short on DDF file `%s'.",
pszFilename );
return FALSE;
}
/* -------------------------------------------------------------------- */
/* First make a pass counting the directory entries. */
/* -------------------------------------------------------------------- */
int nFieldEntryWidth, nFDCount = 0;
nFieldEntryWidth = _sizeFieldLength + _sizeFieldPos + _sizeFieldTag;
for( i = nLeaderSize; i < _recLength; i += nFieldEntryWidth )
{
if( pachRecord[i] == DDF_FIELD_TERMINATOR )
break;
nFDCount++;
}
/* -------------------------------------------------------------------- */
/* Allocate, and read field definitions. */
/* -------------------------------------------------------------------- */
for( i = 0; i < nFDCount; i++ )
{
char szTag[128];
int nEntryOffset = nLeaderSize + i*nFieldEntryWidth;
int nFieldLength, nFieldPos;
strncpy( szTag, pachRecord+nEntryOffset, _sizeFieldTag );
szTag[_sizeFieldTag] = '\0';
nEntryOffset += _sizeFieldTag;
nFieldLength = DDFScanInt( pachRecord+nEntryOffset, _sizeFieldLength );
nEntryOffset += _sizeFieldLength;
nFieldPos = DDFScanInt( pachRecord+nEntryOffset, _sizeFieldPos );
if (_fieldAreaStart+nFieldPos < 0 ||
_recLength - (_fieldAreaStart+nFieldPos) < nFieldLength)
{
if( !bFailQuietly )
CPLError( CE_Failure, CPLE_FileIO,
"Header record invalid on DDF file `%s'.",
pszFilename );
CPLFree( pachRecord );
return FALSE;
}
DDFFieldDefn *poFDefn = new DDFFieldDefn();
if( poFDefn->Initialize( this, szTag, nFieldLength,
pachRecord+_fieldAreaStart+nFieldPos ) )
AddField( poFDefn );
else
delete poFDefn;
}
CPLFree( pachRecord );
/* -------------------------------------------------------------------- */
/* Record the current file offset, the beginning of the first */
/* data record. */
/* -------------------------------------------------------------------- */
nFirstRecordOffset = (long)VSIFTellL( fpDDF );
return TRUE;
}
示例8: mk_s57
void mk_s57()
{
DDFModule oModule;
DDFFieldDefn *poFDefn;
oModule.Initialize();
/* -------------------------------------------------------------------- */
/* Create the '0000' definition. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "0000", "", "0001DSIDDSIDDSSI0001DSPM0001VRIDVRIDATTVVRIDVRPCVRIDVRPTVRIDSGCCVRIDSG2DVRIDSG3D0001FRIDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRIDFFPTFRIDFSPCFRIDFSPT", dsc_elementary, dtc_char_string );
oModule.AddField( poFDefn );
/* -------------------------------------------------------------------- */
/* Create the '0001' definition. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "0001", "ISO 8211 Record Identifier", "",
dsc_elementary, dtc_bit_string,
"(b12)" );
oModule.AddField( poFDefn );
/* -------------------------------------------------------------------- */
/* Create the DSID field. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "DSID", "Data set identification field", "",
dsc_vector, dtc_mixed_data_type );
poFDefn->AddSubfield( "RCNM", "b11" );
poFDefn->AddSubfield( "RCID", "b14" );
poFDefn->AddSubfield( "EXPP", "b11" );
poFDefn->AddSubfield( "INTU", "b11" );
poFDefn->AddSubfield( "DSNM", "A" );
poFDefn->AddSubfield( "EDTN", "A" );
poFDefn->AddSubfield( "UPDN", "A" );
poFDefn->AddSubfield( "UADT", "A(8)" );
poFDefn->AddSubfield( "ISDT", "A(8)" );
poFDefn->AddSubfield( "STED", "R(4)" );
poFDefn->AddSubfield( "PRSP", "b11" );
poFDefn->AddSubfield( "PSDN", "A" );
poFDefn->AddSubfield( "PRED", "A" );
poFDefn->AddSubfield( "PROF", "b11" );
poFDefn->AddSubfield( "AGEN", "b12" );
poFDefn->AddSubfield( "COMT", "A" );
oModule.AddField( poFDefn );
/* -------------------------------------------------------------------- */
/* Create the DSSI field. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "DSSI", "Data set structure information field", "",
dsc_vector, dtc_mixed_data_type );
poFDefn->AddSubfield( "DSTR", "b11" );
poFDefn->AddSubfield( "AALL", "b11" );
poFDefn->AddSubfield( "NALL", "b11" );
poFDefn->AddSubfield( "NOMR", "b14" );
poFDefn->AddSubfield( "NOCR", "b14" );
poFDefn->AddSubfield( "NOGR", "b14" );
poFDefn->AddSubfield( "NOLR", "b14" );
poFDefn->AddSubfield( "NOIN", "b14" );
poFDefn->AddSubfield( "NOCN", "b14" );
poFDefn->AddSubfield( "NOED", "b14" );
poFDefn->AddSubfield( "NOFA", "b14" );
oModule.AddField( poFDefn );
/* -------------------------------------------------------------------- */
/* Create the DSPM field. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "DSPM", "Data set parameter field", "",
dsc_vector, dtc_mixed_data_type );
poFDefn->AddSubfield( "RCNM", "b11" );
poFDefn->AddSubfield( "RCID", "b14" );
poFDefn->AddSubfield( "HDAT", "b11" );
poFDefn->AddSubfield( "VDAT", "b11" );
poFDefn->AddSubfield( "SDAT", "b11" );
poFDefn->AddSubfield( "CSCL", "b14" );
poFDefn->AddSubfield( "DUNI", "b11" );
poFDefn->AddSubfield( "HUNI", "b11" );
poFDefn->AddSubfield( "PUNI", "b11" );
poFDefn->AddSubfield( "COUN", "b11" );
poFDefn->AddSubfield( "COMF", "b14" );
poFDefn->AddSubfield( "SOMF", "b14" );
poFDefn->AddSubfield( "COMT", "A" );
oModule.AddField( poFDefn );
//.........这里部分代码省略.........
示例9: mk_catalog
void mk_catalog()
{
DDFModule oModule;
DDFFieldDefn *poFDefn;
oModule.Initialize();
/* -------------------------------------------------------------------- */
/* Create the '0000' definition. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "0000", "", "0001CATD",
dsc_elementary,
dtc_char_string );
oModule.AddField( poFDefn );
/* -------------------------------------------------------------------- */
/* Create the '0000' definition. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "0001", "ISO 8211 Record Identifier", "",
dsc_elementary, dtc_bit_string,
"(b12)" );
oModule.AddField( poFDefn );
/* -------------------------------------------------------------------- */
/* Create the CATD field. */
/* -------------------------------------------------------------------- */
poFDefn = new DDFFieldDefn();
poFDefn->Create( "CATD", "Catalog Directory field", "",
dsc_vector, dtc_mixed_data_type );
poFDefn->AddSubfield( "RCNM", "A(2)" );
poFDefn->AddSubfield( "RCID", "I(10)" );
poFDefn->AddSubfield( "FILE", "A" );
poFDefn->AddSubfield( "LFIL", "A" );
poFDefn->AddSubfield( "VOLM", "A" );
poFDefn->AddSubfield( "IMPL", "A(3)" );
poFDefn->AddSubfield( "SLAT", "R" );
poFDefn->AddSubfield( "WLON", "R" );
poFDefn->AddSubfield( "NLAT", "R" );
poFDefn->AddSubfield( "ELON", "R" );
poFDefn->AddSubfield( "CRCS", "A" );
poFDefn->AddSubfield( "COMT", "A" );
oModule.AddField( poFDefn );
oModule.Dump( stdout );
oModule.Create( "out.ddf" );
/* -------------------------------------------------------------------- */
/* Create a record. */
/* -------------------------------------------------------------------- */
DDFRecord *poRec = new DDFRecord( &oModule );
DDFField *poField;
poField = poRec->AddField( oModule.FindFieldDefn( "0001" ) );
poRec->SetFieldRaw( poField, 0, "\0\0\036", 3 );
poField = poRec->AddField( oModule.FindFieldDefn( "CATD" ) );
poRec->SetStringSubfield( "CATD", 0, "RCNM", 0, "CD" );
poRec->SetIntSubfield ( "CATD", 0, "RCID", 0, 1 );
poRec->SetStringSubfield( "CATD", 0, "FILE", 0, "CATALOG.030" );
poRec->SetStringSubfield( "CATD", 0, "VOLM", 0, "V01X01" );
poRec->SetStringSubfield( "CATD", 0, "IMPL", 0, "ASC" );
poRec->SetStringSubfield( "CATD", 0, "COMT", 0,
"Exchange Set Catalog file" );
poRec->Write();
delete poRec;
/* -------------------------------------------------------------------- */
/* Create a record. */
/* -------------------------------------------------------------------- */
poRec = new DDFRecord( &oModule );
poField = poRec->AddField( oModule.FindFieldDefn( "0001" ) );
poRec->SetFieldRaw( poField, 0, "\1\0\036", 3 );
poField = poRec->AddField( oModule.FindFieldDefn( "CATD" ) );
poRec->SetStringSubfield( "CATD", 0, "RCNM", 0, "CD" );
poRec->SetIntSubfield ( "CATD", 0, "RCID", 0, 2 );
poRec->SetStringSubfield( "CATD", 0, "FILE", 0, "No410810.000" );
poRec->SetStringSubfield( "CATD", 0, "VOLM", 0, "V01X01" );
poRec->SetStringSubfield( "CATD", 0, "IMPL", 0, "BIN" );
poRec->SetFloatSubfield ( "CATD", 0, "SLAT", 0, 59.000005 );
poRec->SetFloatSubfield ( "CATD", 0, "WLON", 0, 4.999996 );
poRec->SetFloatSubfield ( "CATD", 0, "NLAT", 0, 59.500003 );
poRec->SetFloatSubfield ( "CATD", 0, "ELON", 0, 5.499997 );
poRec->SetStringSubfield( "CATD", 0, "CRCS", 0, "555C3AD4" );
poRec->Write();
delete poRec;
}
示例10: WriteAttrRecordToDBF
static void
WriteAttrRecordToDBF( DBFHandle hDBF, int iRecord,
SDTSTransfer * poTransfer, DDFField * poSR )
{
/* -------------------------------------------------------------------- */
/* Process each subfield in the record. */
/* -------------------------------------------------------------------- */
DDFFieldDefn *poFDefn = poSR->GetFieldDefn();
for( int iSF=0; iSF < poFDefn->GetSubfieldCount(); iSF++ )
{
DDFSubfieldDefn *poSFDefn = poFDefn->GetSubfield( iSF );
int iField;
int nMaxBytes;
const char * pachData = poSR->GetSubfieldData(poSFDefn,
&nMaxBytes);
/* -------------------------------------------------------------------- */
/* Identify the related DBF field, if any. */
/* -------------------------------------------------------------------- */
for( iField = 0; iField < hDBF->nFields; iField++ )
{
if( EQUALN(poSFDefn->GetName(),
hDBF->pszHeader+iField*32,10) )
break;
}
if( iField == hDBF->nFields )
iField = -1;
/* -------------------------------------------------------------------- */
/* Handle each of the types. */
/* -------------------------------------------------------------------- */
switch( poSFDefn->GetType() )
{
case DDFString:
const char *pszValue;
pszValue = poSFDefn->ExtractStringData(pachData, nMaxBytes,
NULL);
if( iField != -1 )
DBFWriteStringAttribute(hDBF, iRecord, iField, pszValue );
break;
case DDFFloat:
double dfValue;
dfValue = poSFDefn->ExtractFloatData(pachData, nMaxBytes,
NULL);
if( iField != -1 )
DBFWriteDoubleAttribute( hDBF, iRecord, iField, dfValue );
break;
case DDFInt:
int nValue;
nValue = poSFDefn->ExtractIntData(pachData, nMaxBytes, NULL);
if( iField != -1 )
DBFWriteIntegerAttribute( hDBF, iRecord, iField, nValue );
break;
default:
break;
}
} /* next subfield */
}
示例11: AddPrimaryAttrToDBFSchema
static void
AddPrimaryAttrToDBFSchema( DBFHandle hDBF, SDTSTransfer *poTransfer,
char ** papszModuleList )
{
for( int iModule = 0;
papszModuleList != NULL && papszModuleList[iModule] != NULL;
iModule++ )
{
SDTSAttrReader *poAttrReader;
/* -------------------------------------------------------------------- */
/* Get a reader on the desired module. */
/* -------------------------------------------------------------------- */
poAttrReader = (SDTSAttrReader *)
poTransfer->GetLayerIndexedReader(
poTransfer->FindLayer( papszModuleList[iModule] ) );
if( poAttrReader == NULL )
{
printf( "Unable to open attribute module %s, skipping.\n" ,
papszModuleList[iModule] );
continue;
}
poAttrReader->Rewind();
/* -------------------------------------------------------------------- */
/* Read the first record so we can clone schema information off */
/* of it. */
/* -------------------------------------------------------------------- */
SDTSAttrRecord *poAttrFeature;
poAttrFeature = (SDTSAttrRecord *) poAttrReader->GetNextFeature();
if( poAttrFeature == NULL )
{
fprintf( stderr,
"Didn't find any meaningful attribute records in %s.\n",
papszModuleList[iModule] );
continue;
}
/* -------------------------------------------------------------------- */
/* Clone schema off the first record. Eventually we need to */
/* get the information out of the DDR record, but it isn't */
/* clear to me how to accomplish that with the SDTS++ API. */
/* */
/* The following approach may fail (dramatically) if some */
/* records do not include all subfields. Furthermore, no */
/* effort is made to make DBF field names unique. The SDTS */
/* attributes often have names much beyond the 14 character dbf */
/* limit which may result in non-unique attributes. */
/* -------------------------------------------------------------------- */
DDFFieldDefn *poFDefn = poAttrFeature->poATTR->GetFieldDefn();
int iSF;
DDFField *poSR = poAttrFeature->poATTR;
for( iSF=0; iSF < poFDefn->GetSubfieldCount(); iSF++ )
{
DDFSubfieldDefn *poSFDefn = poFDefn->GetSubfield( iSF );
int nWidth = poSFDefn->GetWidth();
switch( poSFDefn->GetType() )
{
case DDFString:
if( nWidth == 0 )
{
int nMaxBytes;
const char * pachData = poSR->GetSubfieldData(poSFDefn,
&nMaxBytes);
nWidth = strlen(poSFDefn->ExtractStringData(pachData,
nMaxBytes, NULL ));
}
DBFAddField( hDBF, poSFDefn->GetName(), FTString, nWidth, 0 );
break;
case DDFInt:
if( nWidth == 0 )
nWidth = 9;
DBFAddField( hDBF, poSFDefn->GetName(), FTInteger, nWidth, 0 );
break;
case DDFFloat:
DBFAddField( hDBF, poSFDefn->GetName(), FTDouble, 18, 6 );
break;
default:
fprintf( stderr,
"Dropping attribute `%s' of module `%s'. "
"Type unsupported\n",
poSFDefn->GetName(),
papszModuleList[iModule] );
break;
}
}
//.........这里部分代码省略.........
示例12: bPolygonsBuilt
OGRSDTSLayer::OGRSDTSLayer( SDTSTransfer * poTransferIn, int iLayerIn,
OGRSDTSDataSource * poDSIn ) :
bPolygonsBuilt(FALSE)
{
poDS = poDSIn;
poTransfer = poTransferIn;
iLayer = iLayerIn;
poReader = poTransfer->GetLayerIndexedReader( iLayer );
/* -------------------------------------------------------------------- */
/* Define the feature. */
/* -------------------------------------------------------------------- */
int iCATDEntry = poTransfer->GetLayerCATDEntry( iLayer );
poFeatureDefn =
new OGRFeatureDefn(poTransfer->GetCATD()->GetEntryModule(iCATDEntry));
SetDescription( poFeatureDefn->GetName() );
poFeatureDefn->Reference();
poFeatureDefn->GetGeomFieldDefn(0)->SetSpatialRef(poDS->GetSpatialRef());
OGRFieldDefn oRecId( "RCID", OFTInteger );
poFeatureDefn->AddFieldDefn( &oRecId );
if( poTransfer->GetLayerType(iLayer) == SLTPoint )
{
poFeatureDefn->SetGeomType( wkbPoint );
}
else if( poTransfer->GetLayerType(iLayer) == SLTLine )
{
poFeatureDefn->SetGeomType( wkbLineString );
oRecId.SetName( "SNID" );
poFeatureDefn->AddFieldDefn( &oRecId );
oRecId.SetName( "ENID" );
poFeatureDefn->AddFieldDefn( &oRecId );
}
else if( poTransfer->GetLayerType(iLayer) == SLTPoly )
{
poFeatureDefn->SetGeomType( wkbPolygon );
}
else if( poTransfer->GetLayerType(iLayer) == SLTAttr )
{
poFeatureDefn->SetGeomType( wkbNone );
}
/* -------------------------------------------------------------------- */
/* Add schema from referenced attribute records. */
/* -------------------------------------------------------------------- */
char **papszATIDRefs = NULL;
if( poTransfer->GetLayerType(iLayer) != SLTAttr )
papszATIDRefs = poReader->ScanModuleReferences();
else
papszATIDRefs = CSLAddString( papszATIDRefs,
poTransfer->GetCATD()->GetEntryModule(iCATDEntry) );
for( int iTable = 0;
papszATIDRefs != NULL && papszATIDRefs[iTable] != NULL;
iTable++ )
{
SDTSAttrReader *poAttrReader;
DDFFieldDefn *poFDefn;
/* -------------------------------------------------------------------- */
/* Get the attribute table reader, and the associated user */
/* attribute field. */
/* -------------------------------------------------------------------- */
int nLayerIdx = poTransfer->FindLayer( papszATIDRefs[iTable] );
if( nLayerIdx < 0 )
continue;
poAttrReader = (SDTSAttrReader *)
poTransfer->GetLayerIndexedReader(nLayerIdx);
if( poAttrReader == NULL )
continue;
poFDefn = poAttrReader->GetModule()->FindFieldDefn( "ATTP" );
if( poFDefn == NULL )
poFDefn = poAttrReader->GetModule()->FindFieldDefn( "ATTS" );
if( poFDefn == NULL )
continue;
/* -------------------------------------------------------------------- */
/* Process each user subfield on the attribute table into an */
/* OGR field definition. */
/* -------------------------------------------------------------------- */
for( int iSF=0; iSF < poFDefn->GetSubfieldCount(); iSF++ )
{
DDFSubfieldDefn *poSFDefn = poFDefn->GetSubfield( iSF );
int nWidth = poSFDefn->GetWidth();
char *pszFieldName;
if( poFeatureDefn->GetFieldIndex( poSFDefn->GetName() ) != -1 )
pszFieldName = CPLStrdup( CPLSPrintf( "%s_%s",
papszATIDRefs[iTable],
poSFDefn->GetName() ) );
else
//.........这里部分代码省略.........
示例13: AssignAttrRecordToFeature
static void
AssignAttrRecordToFeature( OGRFeature * poFeature,
CPL_UNUSED SDTSTransfer * poTransfer,
DDFField * poSR )
{
/* -------------------------------------------------------------------- */
/* Process each subfield in the record. */
/* -------------------------------------------------------------------- */
DDFFieldDefn *poFDefn = poSR->GetFieldDefn();
for( int iSF=0; iSF < poFDefn->GetSubfieldCount(); iSF++ )
{
DDFSubfieldDefn *poSFDefn = poFDefn->GetSubfield( iSF );
int iField;
int nMaxBytes;
const char * pachData = poSR->GetSubfieldData(poSFDefn,
&nMaxBytes);
/* -------------------------------------------------------------------- */
/* Indentify this field on the feature. */
/* -------------------------------------------------------------------- */
iField = poFeature->GetFieldIndex( poSFDefn->GetName() );
/* -------------------------------------------------------------------- */
/* Handle each of the types. */
/* -------------------------------------------------------------------- */
switch( poSFDefn->GetType() )
{
case DDFString:
const char *pszValue;
pszValue = poSFDefn->ExtractStringData(pachData, nMaxBytes,
NULL);
if( iField != -1 )
poFeature->SetField( iField, pszValue );
break;
case DDFFloat:
double dfValue;
dfValue = poSFDefn->ExtractFloatData(pachData, nMaxBytes,
NULL);
if( iField != -1 )
poFeature->SetField( iField, dfValue );
break;
case DDFInt:
int nValue;
nValue = poSFDefn->ExtractIntData(pachData, nMaxBytes, NULL);
if( iField != -1 )
poFeature->SetField( iField, nValue );
break;
default:
break;
}
} /* next subfield */
}
示例14: main
int main( int nArgc, char ** papszArgv )
{
DDFModule oModule;
const char *pszFilename = nullptr;
int bFSPTHack = FALSE;
for( int iArg = 1; iArg < nArgc; iArg++ )
{
if( EQUAL(papszArgv[iArg],"-fspt_repeating") )
bFSPTHack = TRUE;
else
pszFilename = papszArgv[iArg];
}
if( pszFilename == nullptr )
{
printf( "Usage: 8211view filename\n" );
exit( 1 );
}
/* -------------------------------------------------------------------- */
/* Open the file. Note that by default errors are reported to */
/* stderr, so we don't bother doing it ourselves. */
/* -------------------------------------------------------------------- */
if( !oModule.Open( pszFilename ) )
{
exit( 1 );
}
if( bFSPTHack )
{
DDFFieldDefn *poFSPT = oModule.FindFieldDefn( "FSPT" );
if( poFSPT == nullptr )
fprintf( stderr,
"unable to find FSPT field to set repeating flag.\n" );
else
poFSPT->SetRepeatingFlag( TRUE );
}
/* -------------------------------------------------------------------- */
/* Loop reading records till there are none left. */
/* -------------------------------------------------------------------- */
DDFRecord *poRecord = nullptr;
int iRecord = 0;
while( (poRecord = oModule.ReadRecord()) != nullptr )
{
printf( "Record %d (%d bytes)\n",
++iRecord, poRecord->GetDataSize() );
/* ------------------------------------------------------------ */
/* Loop over each field in this particular record. */
/* ------------------------------------------------------------ */
for( int iField = 0; iField < poRecord->GetFieldCount(); iField++ )
{
DDFField *poField = poRecord->GetField( iField );
ViewRecordField( poField );
}
}
}
示例15: main
int main(int nArgc, char* papszArgv[])
{
const char *pszFilename = NULL, *pszOutFilename = NULL;
DDFModule oModule;
/* -------------------------------------------------------------------- */
/* Check arguments. */
/* -------------------------------------------------------------------- */
for( int iArg = 1; iArg < nArgc; iArg++ )
{
if( pszFilename == NULL )
pszFilename = papszArgv[iArg];
else if( pszOutFilename == NULL )
pszOutFilename = papszArgv[iArg];
else
{
pszFilename = NULL;
break;
}
}
if( pszFilename == NULL )
{
printf( "Usage: 8211createfromxml filename.xml outfilename\n" );
exit( 1 );
}
CPLXMLNode* poRoot = CPLParseXMLFile( pszFilename );
if( poRoot == NULL )
{
fprintf(stderr, "Cannot parse XML file '%s'\n", pszFilename);
exit( 1 );
}
CPLXMLNode* poXMLDDFModule = CPLSearchXMLNode(poRoot, "=DDFModule");
if( poXMLDDFModule == NULL )
{
fprintf(stderr, "Cannot find DDFModule node in XML file '%s'\n", pszFilename);
exit( 1 );
}
/* Compute the size of the DDFField tag */
CPLXMLNode* psIter = poXMLDDFModule->psChild;
int nSizeFieldTag = 0;
while( psIter != NULL )
{
if( psIter->eType == CXT_Element &&
strcmp(psIter->pszValue, "DDFFieldDefn") == 0 )
{
const char* pszTag = CPLGetXMLValue(psIter, "tag", "");
if( nSizeFieldTag == 0 )
nSizeFieldTag = (int)strlen(pszTag);
else if( nSizeFieldTag != (int)strlen(pszTag) )
{
fprintf(stderr, "All fields have not the same tag size\n");
exit( 1 );
}
}
psIter = psIter->psNext;
}
char chInterchangeLevel = '3';
char chLeaderIden = 'L';
char chCodeExtensionIndicator = 'E';
char chVersionNumber = '1';
char chAppIndicator = ' ';
const char *pszExtendedCharSet = " ! ";
int nSizeFieldLength = 3;
int nSizeFieldPos = 4;
chInterchangeLevel = CPLGetXMLValue(poXMLDDFModule, "_interchangeLevel", CPLSPrintf("%c", chInterchangeLevel))[0];
chLeaderIden = CPLGetXMLValue(poXMLDDFModule, "_leaderIden", CPLSPrintf("%c", chLeaderIden))[0];
chCodeExtensionIndicator = CPLGetXMLValue(poXMLDDFModule, "_inlineCodeExtensionIndicator", CPLSPrintf("%c", chCodeExtensionIndicator))[0];
chVersionNumber = CPLGetXMLValue(poXMLDDFModule, "_versionNumber", CPLSPrintf("%c", chVersionNumber))[0];
chAppIndicator = CPLGetXMLValue(poXMLDDFModule, "_appIndicator", CPLSPrintf("%c", chAppIndicator))[0];
char szExtendedCharSet[4];
snprintf(szExtendedCharSet, sizeof(szExtendedCharSet), "%s", CPLGetXMLValue(poXMLDDFModule, "_extendedCharSet", pszExtendedCharSet));
pszExtendedCharSet = szExtendedCharSet;
nSizeFieldLength = atoi(CPLGetXMLValue(poXMLDDFModule, "_sizeFieldLength", CPLSPrintf("%d", nSizeFieldLength)));
nSizeFieldPos = atoi(CPLGetXMLValue(poXMLDDFModule, "_sizeFieldPos", CPLSPrintf("%d", nSizeFieldPos)));
nSizeFieldTag = atoi(CPLGetXMLValue(poXMLDDFModule, "_sizeFieldTag", CPLSPrintf("%d", nSizeFieldTag)));
oModule.Initialize(chInterchangeLevel,
chLeaderIden,
chCodeExtensionIndicator,
chVersionNumber,
chAppIndicator,
pszExtendedCharSet,
nSizeFieldLength,
nSizeFieldPos,
nSizeFieldTag);
oModule.SetFieldControlLength(atoi(CPLGetXMLValue(poXMLDDFModule, "_fieldControlLength", CPLSPrintf("%d", oModule.GetFieldControlLength()))));
int bCreated = FALSE;
/* Create DDFFieldDefn and DDFRecord elements */
psIter = poXMLDDFModule->psChild;
while( psIter != NULL )
{
if( psIter->eType == CXT_Element &&
//.........这里部分代码省略.........