From a7c67fe2870ea9583800503ea244ca10ba98f5c8 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 4 Oct 2007 08:54:41 +0000 Subject: [PATCH] From Trajce Nikolov, added support for extract a region for geospatial imagery --- src/osgPlugins/gdal/DataSetLayer.cpp | 44 +++++++++++++++++++----- src/osgPlugins/gdal/DataSetLayer.h | 6 ++++ src/osgPlugins/gdal/ReaderWriterGDAL.cpp | 1 + 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/osgPlugins/gdal/DataSetLayer.cpp b/src/osgPlugins/gdal/DataSetLayer.cpp index 67440e46b..2658f15cb 100644 --- a/src/osgPlugins/gdal/DataSetLayer.cpp +++ b/src/osgPlugins/gdal/DataSetLayer.cpp @@ -20,21 +20,23 @@ #include #include +#include + using namespace GDALPlugin; DataSetLayer::DataSetLayer(): - _dataset(0) +_dataset(0), _gdalReader(0) { } DataSetLayer::DataSetLayer(const std::string& fileName): - _dataset(0) +_dataset(0), _gdalReader(0) { openFile(fileName); } DataSetLayer::DataSetLayer(const DataSetLayer& dataSetLayer,const osg::CopyOp& copyop): - ProxyLayer(dataSetLayer) +ProxyLayer(dataSetLayer), _gdalReader(dataSetLayer._gdalReader) { if (dataSetLayer._dataset) open(); } @@ -49,9 +51,9 @@ void DataSetLayer::open() if (_dataset) return; if (getFileName().empty()) return; - + _dataset = static_cast(GDALOpen(getFileName().c_str(),GA_ReadOnly)); - + setUpLocator(); } @@ -60,7 +62,7 @@ void DataSetLayer::close() if (_dataset) { GDALClose(static_cast(_dataset)); - + _dataset = 0; } } @@ -79,15 +81,39 @@ osgTerrain::ImageLayer* DataSetLayer::extractImageLayer(unsigned int sourceMinX, { if (!_dataset || sourceMaxX imageOptions = new osgDB::ImageOptions; + imageOptions->_sourceImageWindowMode = osgDB::ImageOptions::PIXEL_WINDOW; + imageOptions->_sourcePixelWindow.windowX = sourceMinX; + imageOptions->_sourcePixelWindow.windowY = sourceMinY; + imageOptions->_sourcePixelWindow.windowWidth = sourceMaxX-sourceMinX; + imageOptions->_sourcePixelWindow.windowHeight = sourceMaxY-sourceMinY; + imageOptions->_destinationPixelWindow.windowX = 0; + imageOptions->_destinationPixelWindow.windowY = 0; + imageOptions->_destinationPixelWindow.windowWidth = targetWidth; + imageOptions->_destinationPixelWindow.windowHeight = targetHeight; + + osgDB::ReaderWriter::ReadResult result = _gdalReader->readImage(getFileName(),imageOptions.get()); + osg::Image* image = result.getImage(); + if (!image) return 0; + + osgTerrain::ImageLayer* layer = new osgTerrain::ImageLayer; + layer->setFileName(getFileName()); + layer->setImage(image); + + return layer; +} + +void DataSetLayer::setGdalReader(const osgDB::ReaderWriter* rw) +{ + _gdalReader = const_cast(rw); } void DataSetLayer::setUpLocator() { if (!isOpen()) return; - + const char* pszSourceSRS = _dataset->GetProjectionRef(); if (!pszSourceSRS || strlen(pszSourceSRS)==0) pszSourceSRS = _dataset->GetGCPProjection(); diff --git a/src/osgPlugins/gdal/DataSetLayer.h b/src/osgPlugins/gdal/DataSetLayer.h index f7ff1c358..d27995d10 100644 --- a/src/osgPlugins/gdal/DataSetLayer.h +++ b/src/osgPlugins/gdal/DataSetLayer.h @@ -15,6 +15,7 @@ #define DATASETLAYER 1 #include +#include #include @@ -45,6 +46,8 @@ class DataSetLayer : public osgTerrain::ProxyLayer virtual osgTerrain::ImageLayer* extractImageLayer(unsigned int sourceMinX, unsigned int sourceMinY, unsigned int sourceMaxX, unsigned int sourceMaxY, unsigned int targetWidth=0, unsigned int targetHeight=0); + void setGdalReader(const osgDB::ReaderWriter* rw); + protected: virtual ~DataSetLayer(); @@ -53,6 +56,9 @@ class DataSetLayer : public osgTerrain::ProxyLayer GDALDataset* _dataset; + osgDB::ReaderWriter* _gdalReader; + + }; } diff --git a/src/osgPlugins/gdal/ReaderWriterGDAL.cpp b/src/osgPlugins/gdal/ReaderWriterGDAL.cpp index 7ac1f59b6..6e161f7bf 100644 --- a/src/osgPlugins/gdal/ReaderWriterGDAL.cpp +++ b/src/osgPlugins/gdal/ReaderWriterGDAL.cpp @@ -53,6 +53,7 @@ class ReaderWriterGDAL : public osgDB::ReaderWriter // open a DataSetLayer. osg::ref_ptr dataset = new GDALPlugin::DataSetLayer(fileName); + dataset->setGdalReader(this); if (dataset->isOpen()) return dataset.release();