⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrsdtslayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*      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 + -