📄 ntf_raster.cpp
字号:
{ pafElev[iPixel] = (float) (dfVOffset + dfVScale * atoi(poRecord->GetField(84+iPixel*4,87+iPixel*4))); } } /* -------------------------------------------------------------------- *//* Handle PROFILE *//* -------------------------------------------------------------------- */ else if( pafElev != NULL && GetProductId() == NPC_LANDFORM_PROFILE_DTM ) { for( int iPixel = 0; iPixel < nRasterXSize; iPixel++ ) { pafElev[iPixel] = (float) (atoi(poRecord->GetField(19+iPixel*5,23+iPixel*5)) * GetZMult()); } } delete poRecord; return CE_None;}/************************************************************************//* ==================================================================== *//* OGRNTFRasterLayer *//* ==================================================================== *//************************************************************************//************************************************************************//* OGRNTFRasterLayer *//************************************************************************/OGRNTFRasterLayer::OGRNTFRasterLayer( OGRNTFDataSource *poDSIn, NTFFileReader * poReaderIn ){ char szLayerName[128]; sprintf( szLayerName, "DTM_%s", poReaderIn->GetTileName() ); poFeatureDefn = new OGRFeatureDefn( szLayerName ); poFeatureDefn->SetGeomType( wkbPoint25D ); OGRFieldDefn oHeight( "HEIGHT", OFTInteger ); oHeight.SetWidth(5); poFeatureDefn->AddFieldDefn( &oHeight ); poReader = poReaderIn; poDS = poDSIn; poFilterGeom = NULL; pafColumn = (float *) CPLCalloc(sizeof(float), poReader->GetRasterYSize()); iColumnOffset = -1; iCurrentFC = 0;/* -------------------------------------------------------------------- *//* Check for DEM subsampling, and compute total feature count *//* accordingly. *//* -------------------------------------------------------------------- */ if( poDS->GetOption( "DEM_SAMPLE" ) == NULL ) nDEMSample = 1; else nDEMSample = MAX(1,atoi(poDS->GetOption("DEM_SAMPLE"))); nFeatureCount = (poReader->GetRasterXSize() / nDEMSample) * (poReader->GetRasterYSize() / nDEMSample);}/************************************************************************//* ~OGRNTFRasterLayer() *//************************************************************************/OGRNTFRasterLayer::~OGRNTFRasterLayer(){ delete poFeatureDefn; if( poFilterGeom != NULL ) delete poFilterGeom;}/************************************************************************//* SetSpatialFilter() *//************************************************************************/void OGRNTFRasterLayer::SetSpatialFilter( OGRGeometry * poGeomIn ){ if( poFilterGeom != NULL ) { delete poFilterGeom; poFilterGeom = NULL; } if( poGeomIn != NULL ) poFilterGeom = poGeomIn->clone();}/************************************************************************//* ResetReading() *//************************************************************************/void OGRNTFRasterLayer::ResetReading(){ iCurrentFC = 0;}/************************************************************************//* GetNextFeature() *//************************************************************************/OGRFeature *OGRNTFRasterLayer::GetNextFeature(){ if( iCurrentFC == 0 ) iCurrentFC = 1; else { int iReqColumn, iReqRow; iReqColumn = (iCurrentFC - 1) / poReader->GetRasterYSize(); iReqRow = iCurrentFC - iReqColumn * poReader->GetRasterXSize() - 1; if( iReqRow + nDEMSample > poReader->GetRasterYSize() ) { iReqRow = 0; iReqColumn += nDEMSample; } else { iReqRow += nDEMSample; } iCurrentFC = iReqColumn * poReader->GetRasterYSize() + iReqRow + 1; } return GetFeature( (long) iCurrentFC );}/************************************************************************//* GetFeature() *//************************************************************************/OGRFeature *OGRNTFRasterLayer::GetFeature( long nFeatureId ){ int iReqColumn, iReqRow; /* -------------------------------------------------------------------- *//* Is this in the range of legal feature ids (pixels)? *//* -------------------------------------------------------------------- */ if( nFeatureId < 1 || nFeatureId > poReader->GetRasterXSize()*poReader->GetRasterYSize() ) { return NULL; }/* -------------------------------------------------------------------- *//* Do we need to load a different column. *//* -------------------------------------------------------------------- */ iReqColumn = (nFeatureId - 1) / poReader->GetRasterYSize(); iReqRow = nFeatureId - iReqColumn * poReader->GetRasterXSize() - 1; if( iReqColumn != iColumnOffset ) { iColumnOffset = iReqColumn; if( poReader->ReadRasterColumn( iReqColumn, pafColumn ) != CE_None ) return NULL; } /* -------------------------------------------------------------------- *//* Create a corresponding feature. *//* -------------------------------------------------------------------- */ OGRFeature *poFeature = new OGRFeature( poFeatureDefn ); double *padfGeoTransform = poReader->GetGeoTransform(); poFeature->SetFID( nFeatureId ); // NOTE: unusual use of GeoTransform - the pixel origin is the // bottom left corner! poFeature->SetGeometryDirectly( new OGRPoint( padfGeoTransform[0] + padfGeoTransform[1] * iReqColumn, padfGeoTransform[3] + padfGeoTransform[5] * iReqRow, pafColumn[iReqRow] ) ); poFeature->SetField( 0, (int) pafColumn[iReqRow] ); return poFeature;}/************************************************************************//* GetFeatureCount() *//* *//* If a spatial filter is in effect, we turn control over to *//* the generic counter. Otherwise we return the total count. *//* Eventually we should consider implementing a more efficient *//* way of counting features matching a spatial query. *//************************************************************************/int OGRNTFRasterLayer::GetFeatureCount( int bForce ){ return nFeatureCount;}/************************************************************************//* GetSpatialRef() *//************************************************************************/OGRSpatialReference *OGRNTFRasterLayer::GetSpatialRef(){ return poDS->GetSpatialRef();}/************************************************************************//* TestCapability() *//************************************************************************/int OGRNTFRasterLayer::TestCapability( const char * pszCap ){ if( EQUAL(pszCap,OLCRandomRead) ) return TRUE; else if( EQUAL(pszCap,OLCSequentialWrite) || EQUAL(pszCap,OLCRandomWrite) ) return FALSE; else if( EQUAL(pszCap,OLCFastFeatureCount) ) return TRUE; else if( EQUAL(pszCap,OLCFastSpatialFilter) ) return FALSE; else return FALSE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -