📄 ogrsdtslayer.cpp
字号:
/* 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 */}/************************************************************************//* GetNextUnfilteredFeature() *//************************************************************************/OGRFeature * OGRSDTSLayer::GetNextUnfilteredFeature(){/* -------------------------------------------------------------------- *//* If not done before we need to assemble the geometry for a *//* polygon layer. *//* -------------------------------------------------------------------- */ if( poTransfer->GetLayerType(iLayer) == SLTPoly ) { ((SDTSPolygonReader *) poReader)->AssembleRings(poTransfer); }/* -------------------------------------------------------------------- *//* Fetch the next sdts style feature object from the reader. *//* -------------------------------------------------------------------- */ SDTSFeature *poSDTSFeature = poReader->GetNextFeature(); OGRFeature *poFeature; if( poSDTSFeature == NULL ) return NULL;/* -------------------------------------------------------------------- *//* Create the OGR feature. *//* -------------------------------------------------------------------- */ poFeature = new OGRFeature( poFeatureDefn ); m_nFeaturesRead++; switch( poTransfer->GetLayerType(iLayer) ) {/* -------------------------------------------------------------------- *//* Translate point feature specific information and geometry. *//* -------------------------------------------------------------------- */ case SLTPoint: { SDTSRawPoint *poPoint = (SDTSRawPoint *) poSDTSFeature; poFeature->SetGeometryDirectly( new OGRPoint( poPoint->dfX, poPoint->dfY, poPoint->dfZ ) ); } break;/* -------------------------------------------------------------------- *//* Translate line feature specific information and geometry. *//* -------------------------------------------------------------------- */ case SLTLine: { SDTSRawLine *poLine = (SDTSRawLine *) poSDTSFeature; OGRLineString *poOGRLine = new OGRLineString(); poOGRLine->setPoints( poLine->nVertices, poLine->padfX, poLine->padfY, poLine->padfZ ); poFeature->SetGeometryDirectly( poOGRLine ); poFeature->SetField( "SNID", (int) poLine->oStartNode.nRecord ); poFeature->SetField( "ENID", (int) poLine->oEndNode.nRecord ); } break;/* -------------------------------------------------------------------- *//* Translate polygon feature specific information and geometry. *//* -------------------------------------------------------------------- */ case SLTPoly: { SDTSRawPolygon *poPoly = (SDTSRawPolygon *) poSDTSFeature; OGRPolygon *poOGRPoly = new OGRPolygon(); for( int iRing = 0; iRing < poPoly->nRings; iRing++ ) { OGRLinearRing *poRing = new OGRLinearRing(); int nVertices; if( iRing == poPoly->nRings - 1 ) nVertices = poPoly->nVertices - poPoly->panRingStart[iRing]; else nVertices = poPoly->panRingStart[iRing+1] - poPoly->panRingStart[iRing]; poRing->setPoints( nVertices, poPoly->padfX + poPoly->panRingStart[iRing], poPoly->padfY + poPoly->panRingStart[iRing], poPoly->padfZ + poPoly->panRingStart[iRing] ); poOGRPoly->addRingDirectly( poRing ); } poFeature->SetGeometryDirectly( poOGRPoly ); } break; default: break; }/* -------------------------------------------------------------------- *//* Set attributes for any indicated attribute records. *//* -------------------------------------------------------------------- */ int iAttrRecord; for( iAttrRecord = 0; iAttrRecord < poSDTSFeature->nAttributes; iAttrRecord++) { DDFField *poSR; poSR = poTransfer->GetAttr( poSDTSFeature->paoATID+iAttrRecord ); AssignAttrRecordToFeature( poFeature, poTransfer, poSR ); }/* -------------------------------------------------------------------- *//* If this record is an attribute record, attach the local *//* attributes. *//* -------------------------------------------------------------------- */ if( poTransfer->GetLayerType(iLayer) == SLTAttr ) { AssignAttrRecordToFeature( poFeature, poTransfer, ((SDTSAttrRecord *) poSDTSFeature)->poATTR); } /* -------------------------------------------------------------------- *//* Translate the record id. *//* -------------------------------------------------------------------- */ poFeature->SetFID( poSDTSFeature->oModId.nRecord ); poFeature->SetField( 0, (int) poSDTSFeature->oModId.nRecord ); if( poFeature->GetGeometryRef() != NULL ) poFeature->GetGeometryRef()->assignSpatialReference( poDS->GetSpatialRef() ); if( !poReader->IsIndexed() ) delete poSDTSFeature; return poFeature;}/************************************************************************//* GetNextFeature() *//************************************************************************/OGRFeature *OGRSDTSLayer::GetNextFeature(){ OGRFeature *poFeature = NULL; /* -------------------------------------------------------------------- *//* Read features till we find one that satisfies our current *//* spatial criteria. *//* -------------------------------------------------------------------- */ while( TRUE ) { poFeature = GetNextUnfilteredFeature(); if( poFeature == NULL ) break; if( (m_poFilterGeom == NULL || FilterGeometry( poFeature->GetGeometryRef() ) ) && (m_poAttrQuery == NULL || m_poAttrQuery->Evaluate( poFeature )) ) break; delete poFeature; } return poFeature;}/************************************************************************//* TestCapability() *//************************************************************************/int OGRSDTSLayer::TestCapability( const char * pszCap ){ if( EQUAL(pszCap,OLCRandomRead) ) return FALSE; else if( EQUAL(pszCap,OLCSequentialWrite) || EQUAL(pszCap,OLCRandomWrite) ) return FALSE; else if( EQUAL(pszCap,OLCFastFeatureCount) ) return FALSE; else if( EQUAL(pszCap,OLCFastSpatialFilter) ) return FALSE; else return FALSE;}/************************************************************************//* GetSpatialRef() *//************************************************************************/OGRSpatialReference * OGRSDTSLayer::GetSpatialRef(){ return poDS->GetSpatialRef();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -