From Trajce Nikolov, added support for extract a region for geospatial imagery

This commit is contained in:
Robert Osfield
2007-10-04 08:54:41 +00:00
parent ce24d0c76f
commit a7c67fe287
3 changed files with 42 additions and 9 deletions

View File

@@ -20,21 +20,23 @@
#include <gdalwarper.h>
#include <ogr_spatialref.h>
#include <osgDB/ImageOptions>
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<GDALDataset*>(GDALOpen(getFileName().c_str(),GA_ReadOnly));
setUpLocator();
}
@@ -60,7 +62,7 @@ void DataSetLayer::close()
if (_dataset)
{
GDALClose(static_cast<GDALDatasetH>(_dataset));
_dataset = 0;
}
}
@@ -79,15 +81,39 @@ osgTerrain::ImageLayer* DataSetLayer::extractImageLayer(unsigned int sourceMinX,
{
if (!_dataset || sourceMaxX<sourceMinX || sourceMaxY<sourceMinY) return 0;
osg::notify(osg::NOTICE)<<"DataSetLayer::extractImageLayer("<<sourceMinX<<", "<<sourceMinY<<", "<<sourceMaxX<<", "<<sourceMaxY<<", target:"<<targetWidth<<", "<<targetHeight<<") not yet implemented"<<std::endl;
if (!_gdalReader) return 0;
return 0;
osg::ref_ptr<osgDB::ImageOptions> 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<osgDB::ReaderWriter*>(rw);
}
void DataSetLayer::setUpLocator()
{
if (!isOpen()) return;
const char* pszSourceSRS = _dataset->GetProjectionRef();
if (!pszSourceSRS || strlen(pszSourceSRS)==0) pszSourceSRS = _dataset->GetGCPProjection();

View File

@@ -15,6 +15,7 @@
#define DATASETLAYER 1
#include <osgTerrain/Layer>
#include <osgDB/ReaderWriter>
#include <gdal_priv.h>
@@ -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;
};
}

View File

@@ -53,6 +53,7 @@ class ReaderWriterGDAL : public osgDB::ReaderWriter
// open a DataSetLayer.
osg::ref_ptr<GDALPlugin::DataSetLayer> dataset = new GDALPlugin::DataSetLayer(fileName);
dataset->setGdalReader(this);
if (dataset->isOpen()) return dataset.release();