pktools 2.6.7
Processing Kernel for geospatial data
ImgRasterGdal.h
1/**********************************************************************
2ImgRasterGdal.h: class to read raster files using GDAL API library
3Copyright (C) 2008-2012 Pieter Kempeneers
4
5This file is part of pktools
6
7pktools is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
11
12pktools is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with pktools. If not, see <http://www.gnu.org/licenses/>.
19***********************************************************************/
20#ifndef _IMGRASTERGDAL_H_
21#define _IMGRASTERGDAL_H_
22
23#include <typeinfo>
24#include <fstream>
25#include <sstream>
26#include <string>
27#include <vector>
28#include <list>
29#include <algorithm>
30#include <assert.h>
31#include "gdal_priv.h"
32
33enum RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };
34
39template<typename T1> GDALDataType getGDALDataType(){
40 if (typeid(T1) == typeid(char))
41 return GDT_Byte;
42 else if (typeid(T1) == typeid(unsigned char))
43 return GDT_Byte;
44 else if (typeid(T1) == typeid(unsigned short))
45 return GDT_UInt16;
46 else if (typeid(T1) == typeid(short))
47 return GDT_Int16;
48 else if (typeid(T1) == typeid(int))
49 return GDT_Int32;
50 else if (typeid(T1) == typeid(unsigned int))
51 return GDT_UInt32;
52 else if (typeid(T1) == typeid(long))
53 return GDT_Int32;
54 else if (typeid(T1) == typeid(unsigned long))
55 return GDT_UInt32;
56 else if (typeid(T1) == typeid(float))
57 return GDT_Float32;
58 else if (typeid(T1) == typeid(double))
59 return GDT_Float64;
60 else
61 return GDT_Byte;
62};
63
68{
69public:
71 ImgRasterGdal(void);
73 virtual ~ImgRasterGdal(void);
75 void setScale(double theScale, int band=0){
76 if(m_scale.size()!=nrOfBand()){//initialize
77 m_scale.resize(nrOfBand());
78 for(int iband=0;iband<nrOfBand();++iband)
79 m_scale[iband]=1.0;
80 }
81 m_scale[band]=theScale;
82 };
84 void setOffset(double theOffset, int band=0){
85 if(m_offset.size()!=nrOfBand()){
86 m_offset.resize(nrOfBand());
87 for(int iband=0;iband<nrOfBand();++iband)
88 m_offset[iband]=0.0;
89 }
90 m_offset[band]=theOffset;
91 };
92
94 virtual void close(void);
96 std::string getFileName() const {return m_filename;};
98 int nrOfCol(void) const { return m_ncol;};
100 int nrOfRow(void) const { return m_nrow;};
102 int nrOfBand(void) const { return m_nband;};
104 bool isGeoRef() const {double gt[6];getGeoTransform(gt);if(gt[5]<0) return true;else return false;};
106 std::string getProjection(void) const;
108 std::string getProjectionRef(void) const;
110 std::string getGeoTransform() const;
112 void getGeoTransform(double* gt) const;
114 CPLErr setGeoTransform(double* gt);
116 void copyGeoTransform(const ImgRasterGdal& imgSrc);
118 CPLErr setProjection(const std::string& projection);
120 CPLErr setProjectionProj4(const std::string& projection);
122 bool getBoundingBox (double& ulx, double& uly, double& lrx, double& lry) const;
124 bool getCenterPos(double& x, double& y) const;
126 double getUlx() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(ulx);};
128 double getUly() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(uly);};
130 double getLrx() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(lrx);};
132 double getLry() const {double ulx, uly, lrx,lry;getBoundingBox(ulx,uly,lrx,lry);return(lry);};
134 int getNoDataValues(std::vector<double>& noDataValues) const;
136 bool isNoData(double value) const{if(m_noDataValues.empty()) return false;else return find(m_noDataValues.begin(),m_noDataValues.end(),value)!=m_noDataValues.end();};
138 int pushNoDataValue(double noDataValue);
140 int setNoData(const std::vector<double> nodata){m_noDataValues=nodata; return(m_noDataValues.size());};
142 CPLErr GDALSetNoDataValue(double noDataValue, int band=0) {return getRasterBand(band)->SetNoDataValue(noDataValue);};
144 bool covers(double x, double y) const;
146 bool covers(double ulx, double uly, double lrx, double lry) const;
148 bool geo2image(double x, double y, double& i, double& j) const;
150 bool image2geo(double i, double j, double& x, double& y) const;
152 double getDeltaX(void) const {double gt[6];getGeoTransform(gt);return gt[1];};
154 double getDeltaY(void) const {double gt[6];getGeoTransform(gt);return -gt[5];};
156 GDALDataType getDataType(int band=0) const;
158 GDALRasterBand* getRasterBand(int band=0) const;
160 GDALColorTable* getColorTable(int band=0) const;
162 std::string getDriverDescription() const;
164 std::string getImageType() const{return getDriverDescription();};
166 std::string getInterleave() const;
168 std::string getCompression() const;
169 //Get a pointer to the GDAL dataset
170 GDALDataset* getDataset(){return m_gds;};
172 char** getMetadata();
174 char** getMetadata() const;
176 void getMetadata(std::list<std::string>& metadata) const;
178 std::string getDescription() const;
180 std::string getMetadataItem() const;
182 std::string getImageDescription() const;
183 int nrOfBlockX(int band=0)
184 {
185 int nXBlockSize, nYBlockSize;
186 getRasterBand(band)->GetBlockSize( &nXBlockSize, &nYBlockSize );
187 int nXBlocks = (nrOfCol() + nXBlockSize - 1) / nXBlockSize;
188 return nXBlocks;
189 }
190 int nrOfBlockY(int band=0)
191 {
192 int nXBlockSize, nYBlockSize;
193 getRasterBand(band)->GetBlockSize( &nXBlockSize, &nYBlockSize );
194 int nYBlocks = (nrOfRow() + nYBlockSize - 1) / nYBlockSize;
195 return nYBlocks;
196 }
197
198 friend class ImgReaderGdal;
199 friend class ImgWriterGdal;
200
201protected:
203 std::string m_filename;
205 GDALDataset *m_gds;
213 GDALDataType m_dataType;
215 double m_gt[6];
216 //projection string in wkt format
217 std::string m_projection;
219 std::vector<double> m_noDataValues;
221 std::vector<double> m_scale;
223 std::vector<double> m_offset;
224
225private:
226};
227
228#endif // _IMGRASTERGDAL_H_
double getDeltaY(void) const
Get the pixel cell spacing in y.
int setNoData(const std::vector< double > nodata)
Set the no data values of this dataset using a standard template library (stl) vector as input.
virtual void close(void)
Close the image.
int nrOfRow(void) const
Get the number of rows of this dataset.
bool isGeoRef() const
Is this dataset georeferenced (pixel size in y must be negative) ?
std::string getDriverDescription() const
Get the GDAL driver description of this dataset.
bool geo2image(double x, double y, double &i, double &j) const
Convert georeferenced coordinates (x and y) to image coordinates (column and row)
bool getCenterPos(double &x, double &y) const
Get the center position of this dataset in georeferenced coordinates.
std::string getProjection(void) const
Get the projection string (deprecated, use getProjectionRef instead)
int m_nband
number of bands in this dataset
int m_ncol
number of columns in this dataset
bool isNoData(double value) const
Check if value is nodata in this dataset.
std::string m_filename
filename of this dataset
double getUly() const
Get the upper left corner y (georeferenced) coordinate of this dataset.
char ** getMetadata()
Get the metadata of this dataset.
int getNoDataValues(std::vector< double > &noDataValues) const
Get the no data values of this dataset as a standard template library (stl) vector.
GDALDataset * m_gds
instance of the GDAL dataset of this dataset
std::string getGeoTransform() const
Get the geotransform data for this dataset as a string.
GDALColorTable * getColorTable(int band=0) const
Get the GDAL color table for this dataset as an instance of the GDALColorTable class.
CPLErr setGeoTransform(double *gt)
Set the geotransform data for this dataset.
double getLrx() const
Get the lower right corner x (georeferenced) coordinate of this dataset.
int nrOfBand(void) const
Get the number of bands of this dataset.
std::string getCompression() const
Get the compression from the metadata of this dataset.
void setScale(double theScale, int band=0)
Set scale for a specific band when writing the raster data values. The scaling and offset are applied...
Definition: ImgRasterGdal.h:75
void copyGeoTransform(const ImgRasterGdal &imgSrc)
Copy geotransform information from another georeferenced image.
int m_nrow
number of rows in this dataset
std::vector< double > m_offset
Vector containing the offset factor to be applied (one offset value for each band)
std::string getProjectionRef(void) const
Get the projection reference.
virtual ~ImgRasterGdal(void)
destructor
CPLErr setProjectionProj4(const std::string &projection)
Set the projection for this dataset from user input (supports epsg:<number> format)
std::string getImageDescription() const
Get the image description from the metadata of this dataset.
int nrOfCol(void) const
Get the number of columns of this dataset.
Definition: ImgRasterGdal.h:98
double getDeltaX(void) const
Get the pixel cell spacing in x.
void setOffset(double theOffset, int band=0)
Set offset for a specific band when writing the raster data values. The scaling and offset are applie...
Definition: ImgRasterGdal.h:84
std::vector< double > m_noDataValues
no data values for this dataset
std::string getInterleave() const
Get the band coding (interleave)
GDALRasterBand * getRasterBand(int band=0) const
Get the GDAL rasterband for this dataset.
ImgRasterGdal(void)
default constructor
int pushNoDataValue(double noDataValue)
Push a no data value for this dataset.
double getLry() const
Get the lower right corner y (georeferenced) coordinate of this dataset.
std::vector< double > m_scale
Vector containing the scale factor to be applied (one scale value for each band)
bool image2geo(double i, double j, double &x, double &y) const
Convert image coordinates (column and row) to georeferenced coordinates (x and y)
CPLErr GDALSetNoDataValue(double noDataValue, int band=0)
Set the GDAL (internal) no data value for this data set. Only a single no data value per band is supp...
std::string getImageType() const
Get the image type (implemented as the driver description)
std::string getMetadataItem() const
Get metadata item of this dataset.
double m_gt[6]
geotransform information of this dataset
GDALDataType getDataType(int band=0) const
Get the GDAL datatype for this dataset.
CPLErr setProjection(const std::string &projection)
Set the projection for this dataset in well known text (wkt) format.
bool covers(double x, double y) const
Check if a geolocation is covered by this dataset. Only the bounding box is checked,...
GDALDataType m_dataType
GDAL data type for this dataset.
std::string getFileName() const
Get the filename of this dataset.
Definition: ImgRasterGdal.h:96
double getUlx() const
Get the upper left corner x (georeferenced) coordinate of this dataset.
std::string getDescription() const
Get the image description from the driver of this dataset.
bool getBoundingBox(double &ulx, double &uly, double &lrx, double &lry) const
Get the bounding box of this dataset in georeferenced coordinates.