📄 ogrdodsgrid.cpp
字号:
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 + -