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

📄 ogrdodsgrid.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        AttrTable *poField = poOGRLayerInfo->find_container("x_field");        if( poField != NULL )        {            oXField.Initialize( poField );            oXField.iFieldIndex =                 poFeatureDefn->GetFieldIndex( oXField.pszFieldName );        }        poField = poOGRLayerInfo->find_container("y_field");        if( poField != NULL )        {            oYField.Initialize( poField );            oYField.iFieldIndex =                 poFeatureDefn->GetFieldIndex( oYField.pszFieldName );        }        poField = poOGRLayerInfo->find_container("z_field");        if( poField != NULL )        {            oZField.Initialize( poField );            oZField.iFieldIndex =                 poFeatureDefn->GetFieldIndex( oZField.pszFieldName );        }    }/* -------------------------------------------------------------------- *//*      If we have no layerinfo, then check if there are obvious x/y    *//*      fields.                                                         *//* -------------------------------------------------------------------- */    else    {        if( poFeatureDefn->GetFieldIndex( "lat" ) != -1            && poFeatureDefn->GetFieldIndex( "lon" ) != -1 )        {            oXField.Initialize( "lon", "dds" );            oXField.iFieldIndex = poFeatureDefn->GetFieldIndex( "lon" );            oYField.Initialize( "lat", "dds" );            oYField.iFieldIndex = poFeatureDefn->GetFieldIndex( "lat" );        }        else if( poFeatureDefn->GetFieldIndex( "latitude" ) != -1                 && poFeatureDefn->GetFieldIndex( "longitude" ) != -1 )        {            oXField.Initialize( "longitude", "dds" );            oXField.iFieldIndex = poFeatureDefn->GetFieldIndex( "longitude" );            oYField.Initialize( "latitude", "dds" );            oYField.iFieldIndex = poFeatureDefn->GetFieldIndex( "latitude" );        }    }/* -------------------------------------------------------------------- *//*      Set the layer geometry type if we have point inputs.            *//* -------------------------------------------------------------------- */    if( oZField.iFieldIndex >= 0 )        poFeatureDefn->SetGeomType( wkbPoint25D );    else if( oXField.iFieldIndex >= 0 && oYField.iFieldIndex >= 0 )        poFeatureDefn->SetGeomType( wkbPoint );    else        poFeatureDefn->SetGeomType( wkbNone );}/************************************************************************//*                         ~OGRDODSGridLayer()                          *//************************************************************************/OGRDODSGridLayer::~OGRDODSGridLayer(){    delete[] paoArrayRefs;    delete[] paoDimensions;}/************************************************************************//*                         ArrayEntryToField()                          *//************************************************************************/int OGRDODSGridLayer::ArrayEntryToField( Array *poArray, void *pRawData,                                          int iArrayIndex,                                         OGRFeature *poFeature, int iField){    switch( poArray->var()->type() )    {      case dods_byte_c:      {          GByte *pabyRawData = (GByte *) pRawData;          poFeature->SetField( iField, pabyRawData[iArrayIndex] );      }      break;      case dods_int16_c:      {          GInt16 *panRawData = (GInt16 *) pRawData;          poFeature->SetField( iField, panRawData[iArrayIndex] );      }      break;      case dods_uint16_c:      {          GUInt16 *panRawData = (GUInt16 *) pRawData;          poFeature->SetField( iField, panRawData[iArrayIndex] );      }      break;      case dods_int32_c:      {          GInt32 *panRawData = (GInt32 *) pRawData;          poFeature->SetField( iField, panRawData[iArrayIndex] );      }      break;      case dods_uint32_c:      {          GUInt32 *panRawData = (GUInt32 *) pRawData;          poFeature->SetField( iField, (int) panRawData[iArrayIndex] );      }      break;      case dods_float32_c:      {          float * pafRawData = (float *) pRawData;          poFeature->SetField( iField, pafRawData[iArrayIndex] );      }      break;      case dods_float64_c:      {          double * padfRawData = (double *) pRawData;          poFeature->SetField( iField, padfRawData[iArrayIndex] );      }      break;      default:        return FALSE;    }    return TRUE;}								       /************************************************************************//*                             GetFeature()                             *//************************************************************************/OGRFeature *OGRDODSGridLayer::GetFeature( long nFeatureId ){    if( nFeatureId < 0 || nFeatureId >= nMaxRawIndex )        return NULL;/* -------------------------------------------------------------------- *//*      Ensure we have the dataset.                                     *//* -------------------------------------------------------------------- */    if( !ProvideDataDDS() )        return NULL;/* -------------------------------------------------------------------- *//*      Create the feature being read.                                  *//* -------------------------------------------------------------------- */    OGRFeature *poFeature;    poFeature = new OGRFeature( poFeatureDefn );    poFeature->SetFID( nFeatureId );    m_nFeaturesRead++;/* -------------------------------------------------------------------- *//*      Establish the values for the various dimension indices.         *//* -------------------------------------------------------------------- */    int iDim;    int nRemainder = nFeatureId;    for( iDim = nDimCount-1; iDim >= 0; iDim-- )    {        paoDimensions[iDim].iLastValue =             (nRemainder % paoDimensions[iDim].nDimEntries)             * paoDimensions[iDim].nDimStride             + paoDimensions[iDim].nDimStart;        nRemainder = nRemainder / paoDimensions[iDim].nDimEntries;        if( poTargetGrid == NULL )            poFeature->SetField( iDim, paoDimensions[iDim].iLastValue );    }    CPLAssert( nRemainder == 0 );/* -------------------------------------------------------------------- *//*      For grids, we need to apply the values of the dimensions        *//*      looked up in the corresponding map.                             *//* -------------------------------------------------------------------- */    if( poTargetGrid != NULL )    {        for( iDim = 0; iDim < nDimCount; iDim++ )        {            ArrayEntryToField( paoDimensions[iDim].poMap,                                paoDimensions[iDim].pRawData,                                paoDimensions[iDim].iLastValue,                                poFeature, iDim );        }    }/* -------------------------------------------------------------------- *//*      Process all the regular data fields.                            *//* -------------------------------------------------------------------- */    int iArray;    for( iArray = 0; iArray < nArrayRefCount; iArray++ )    {        OGRDODSArrayRef *poRef = paoArrayRefs + iArray;        ArrayEntryToField( poRef->poArray, poRef->pRawData, nFeatureId,                            poFeature, poRef->iFieldIndex );    }/* -------------------------------------------------------------------- *//*      Do we have geometry information?                                *//* -------------------------------------------------------------------- */    if( oXField.iFieldIndex >= 0 && oYField.iFieldIndex >= 0 )    {        OGRPoint *poPoint = new OGRPoint();        poPoint->setX( poFeature->GetFieldAsDouble( oXField.iFieldIndex ) );        poPoint->setY( poFeature->GetFieldAsDouble( oYField.iFieldIndex ) );        if( oZField.iFieldIndex >= 0 )            poPoint->setZ( poFeature->GetFieldAsDouble(oZField.iFieldIndex) );        poFeature->SetGeometryDirectly( poPoint );    }    return poFeature;}/************************************************************************//*                           ProvideDataDDS()                           *//************************************************************************/int OGRDODSGridLayer::ProvideDataDDS(){    if( bDataLoaded )        return poTargetVar != NULL;    int bResult = OGRDODSLayer::ProvideDataDDS();    if( !bResult )        return bResult;    int iArray;    for( iArray=0; iArray < nArrayRefCount; iArray++ )    {        OGRDODSArrayRef *poRef = paoArrayRefs + iArray;        BaseType *poTarget = oDataDDS.var( poRef->pszName );        // Reset ref array pointer to point in DataDDS result.        if( poTarget->type() == dods_grid_c )        {            Grid *poGrid = dynamic_cast<Grid *>( poTarget );            poRef->poArray = dynamic_cast<Array *>(poGrid->array_var());            if( iArray == 0 )                poTargetGrid = poGrid;        }        else if( poTarget->type() == dods_array_c )        {            poRef->poArray = dynamic_cast<Array *>( poTarget );        }        else        {            CPLAssert( FALSE );            return FALSE;        }        if( iArray == 0 )            poTargetArray = poRef->poArray;        // Allocate appropriate raw data array, and pull out data into it.        poRef->pRawData = CPLMalloc( poRef->poArray->width() );        poRef->poArray->buf2val( &(poRef->pRawData) );    }                    // Setup pointers to each of the map objects.    if( poTargetGrid != NULL )    {        int iMap;        Grid::Map_iter iterMap;        for( iterMap = poTargetGrid->map_begin(), iMap = 0;             iterMap != poTargetGrid->map_end();              iterMap++, iMap++ )        {            paoDimensions[iMap].poMap = dynamic_cast<Array *>(*iterMap);            paoDimensions[iMap].pRawData =                 CPLMalloc( paoDimensions[iMap].poMap->width() );            paoDimensions[iMap].poMap->buf2val( &(paoDimensions[iMap].pRawData) );        }    }        return bResult;}/************************************************************************//*                          GetFeatureCount()                           *//************************************************************************/int OGRDODSGridLayer::GetFeatureCount( int bForce ){    if( m_poFilterGeom == NULL && m_poAttrQuery == NULL )        return nMaxRawIndex;    else        return OGRDODSLayer::GetFeatureCount( bForce );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -