gdal plugin: calculate constant raster properties used in featureset up front at datasource creation (no real speed boost but less repeated code)
This commit is contained in:
parent
985e54379e
commit
00f473de63
4 changed files with 63 additions and 34 deletions
|
@ -48,6 +48,11 @@ using mapnik::datasource_exception;
|
||||||
*/
|
*/
|
||||||
inline GDALDataset *gdal_datasource::open_dataset() const
|
inline GDALDataset *gdal_datasource::open_dataset() const
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef MAPNIK_DEBUG
|
||||||
|
std::clog << "GDAL Plugin: opening: " << dataset_name_ << "\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
GDALDataset *dataset;
|
GDALDataset *dataset;
|
||||||
#if GDAL_VERSION_NUM >= 1600
|
#if GDAL_VERSION_NUM >= 1600
|
||||||
if (shared_dataset_)
|
if (shared_dataset_)
|
||||||
|
@ -88,18 +93,34 @@ gdal_datasource::gdal_datasource(parameters const& params)
|
||||||
|
|
||||||
GDALDataset *dataset = open_dataset();
|
GDALDataset *dataset = open_dataset();
|
||||||
|
|
||||||
// TODO: Make more class attributes from geotransform...
|
nbands_ = dataset->GetRasterCount();
|
||||||
width_ = dataset->GetRasterXSize();
|
width_ = dataset->GetRasterXSize();
|
||||||
height_ = dataset->GetRasterYSize();
|
height_ = dataset->GetRasterYSize();
|
||||||
|
|
||||||
|
|
||||||
double tr[6];
|
double tr[6];
|
||||||
dataset->GetGeoTransform(tr);
|
dataset->GetGeoTransform(tr);
|
||||||
double dx = tr[1];
|
if (tr[2] !=0 || tr[4] != 0)
|
||||||
double dy = tr[5];
|
{
|
||||||
|
throw datasource_exception("GDAL Plugin: only 'north up' images are supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
dx_ = tr[1];
|
||||||
|
dy_ = tr[5];
|
||||||
|
|
||||||
double x0 = tr[0];
|
double x0 = tr[0];
|
||||||
double y0 = tr[3];
|
double y0 = tr[3];
|
||||||
double x1 = tr[0] + width_ * dx + height_ *tr[2];
|
double x1 = tr[0] + width_ * dx_ + height_ *tr[2];
|
||||||
double y1 = tr[3] + width_ *tr[4] + height_ * dy;
|
double y1 = tr[3] + width_ *tr[4] + height_ * dy_;
|
||||||
|
|
||||||
|
/*
|
||||||
|
double x0 = tr[0] + (height_) * tr[2]; // minx
|
||||||
|
double y0 = tr[3] + (height_) * tr[5]; // miny
|
||||||
|
|
||||||
|
double x1 = tr[0] + (width_) * tr[1]; // maxx
|
||||||
|
double y1 = tr[3] + (width_) * tr[4]; // maxy
|
||||||
|
*/
|
||||||
|
|
||||||
extent_.init(x0,y0,x1,y1);
|
extent_.init(x0,y0,x1,y1);
|
||||||
GDALClose(dataset);
|
GDALClose(dataset);
|
||||||
|
|
||||||
|
@ -135,11 +156,11 @@ layer_descriptor gdal_datasource::get_descriptor() const
|
||||||
featureset_ptr gdal_datasource::features(query const& q) const
|
featureset_ptr gdal_datasource::features(query const& q) const
|
||||||
{
|
{
|
||||||
gdal_query gq = q;
|
gdal_query gq = q;
|
||||||
return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq, filter_factor_));
|
return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq, extent_, width_, height_, nbands_, dx_, dy_, filter_factor_));
|
||||||
}
|
}
|
||||||
|
|
||||||
featureset_ptr gdal_datasource::features_at_point(coord2d const& pt) const
|
featureset_ptr gdal_datasource::features_at_point(coord2d const& pt) const
|
||||||
{
|
{
|
||||||
gdal_query gq = pt;
|
gdal_query gq = pt;
|
||||||
return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq, filter_factor_));
|
return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq, extent_, width_, height_, nbands_, dx_, dy_, filter_factor_));
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,9 @@ private:
|
||||||
mapnik::layer_descriptor desc_;
|
mapnik::layer_descriptor desc_;
|
||||||
unsigned width_;
|
unsigned width_;
|
||||||
unsigned height_;
|
unsigned height_;
|
||||||
|
double dx_;
|
||||||
|
double dy_;
|
||||||
|
int nbands_;
|
||||||
bool shared_dataset_;
|
bool shared_dataset_;
|
||||||
double filter_factor_;
|
double filter_factor_;
|
||||||
inline GDALDataset *open_dataset() const;
|
inline GDALDataset *open_dataset() const;
|
||||||
|
|
|
@ -37,10 +37,18 @@ using mapnik::point_impl;
|
||||||
using mapnik::geometry2d;
|
using mapnik::geometry2d;
|
||||||
|
|
||||||
|
|
||||||
gdal_featureset::gdal_featureset(GDALDataset & dataset, int band, gdal_query q, double filter_factor)
|
gdal_featureset::gdal_featureset(GDALDataset & dataset, int band, gdal_query q,
|
||||||
|
mapnik::box2d<double> extent, double width, double height, int nbands,
|
||||||
|
double dx, double dy, double filter_factor)
|
||||||
: dataset_(dataset),
|
: dataset_(dataset),
|
||||||
band_(band),
|
band_(band),
|
||||||
gquery_(q),
|
gquery_(q),
|
||||||
|
raster_extent_(extent),
|
||||||
|
raster_width_(width),
|
||||||
|
raster_height_(height),
|
||||||
|
dx_(dx),
|
||||||
|
dy_(dy),
|
||||||
|
nbands_(nbands),
|
||||||
filter_factor_(filter_factor),
|
filter_factor_(filter_factor),
|
||||||
first_(true) {}
|
first_(true) {}
|
||||||
|
|
||||||
|
@ -84,34 +92,23 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
|
||||||
GDALRasterBand * blue = 0;
|
GDALRasterBand * blue = 0;
|
||||||
GDALRasterBand * alpha = 0;
|
GDALRasterBand * alpha = 0;
|
||||||
GDALRasterBand * grey = 0;
|
GDALRasterBand * grey = 0;
|
||||||
|
|
||||||
int nbands = dataset_.GetRasterCount();
|
|
||||||
|
|
||||||
unsigned raster_width = dataset_.GetRasterXSize();
|
/*
|
||||||
unsigned raster_height = dataset_.GetRasterYSize();
|
|
||||||
|
|
||||||
// TODO - pull from class attributes...
|
|
||||||
double tr[6];
|
double tr[6];
|
||||||
dataset_.GetGeoTransform(tr);
|
dataset_.GetGeoTransform(tr);
|
||||||
|
|
||||||
double dx = tr[1];
|
double dx = tr[1];
|
||||||
double dy = tr[5];
|
double dy = tr[5];
|
||||||
|
std::clog << "dx_: " << dx_ << " dx: " << dx << " dy_: " << dy_ << "dy: " << dy << "\n";
|
||||||
double x0 = tr[0] + (raster_height) * tr[2]; // minx
|
*/
|
||||||
double y0 = tr[3] + (raster_height) * tr[5]; // miny
|
|
||||||
|
CoordTransform t(raster_width_,raster_height_,raster_extent_,0,0);
|
||||||
double x1 = tr[0] + (raster_width) * tr[1]; // maxx
|
box2d<double> intersect = raster_extent_.intersect(q.get_bbox());
|
||||||
double y1 = tr[3] + (raster_width) * tr[4]; // maxy
|
|
||||||
|
|
||||||
box2d<double> raster_extent(x0,y0,x1,y1);
|
|
||||||
|
|
||||||
CoordTransform t(raster_width,raster_height,raster_extent,0,0);
|
|
||||||
box2d<double> intersect = raster_extent.intersect(q.get_bbox());
|
|
||||||
box2d<double> box = t.forward(intersect);
|
box2d<double> box = t.forward(intersect);
|
||||||
|
|
||||||
//size of resized output pixel in source image domain
|
//size of resized output pixel in source image domain
|
||||||
double margin_x = 1.0/(fabs(dx)*boost::get<0>(q.resolution()));
|
double margin_x = 1.0/(fabs(dx_)*boost::get<0>(q.resolution()));
|
||||||
double margin_y = 1.0/(fabs(dy)*boost::get<1>(q.resolution()));
|
double margin_y = 1.0/(fabs(dy_)*boost::get<1>(q.resolution()));
|
||||||
if (margin_x < 1)
|
if (margin_x < 1)
|
||||||
margin_x = 1.0;
|
margin_x = 1.0;
|
||||||
if (margin_y < 1)
|
if (margin_y < 1)
|
||||||
|
@ -126,10 +123,10 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
|
||||||
x_off = 0;
|
x_off = 0;
|
||||||
if (y_off < 0)
|
if (y_off < 0)
|
||||||
y_off = 0;
|
y_off = 0;
|
||||||
if (end_x > (int)raster_width)
|
if (end_x > (int)raster_width_)
|
||||||
end_x = raster_width;
|
end_x = raster_width_;
|
||||||
if (end_y > (int)raster_height)
|
if (end_y > (int)raster_height_)
|
||||||
end_y = raster_height;
|
end_y = raster_height_;
|
||||||
int width = end_x - x_off;
|
int width = end_x - x_off;
|
||||||
int height = end_y - y_off;
|
int height = end_y - y_off;
|
||||||
// don't process almost invisible data
|
// don't process almost invisible data
|
||||||
|
@ -142,7 +139,7 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
|
||||||
intersect = t.backward(feature_raster_extent);
|
intersect = t.backward(feature_raster_extent);
|
||||||
|
|
||||||
#ifdef MAPNIK_DEBUG
|
#ifdef MAPNIK_DEBUG
|
||||||
std::clog << "GDAL Plugin: Raster extent=" << raster_extent << "\n";
|
std::clog << "GDAL Plugin: Raster extent=" << raster_extent_ << "\n";
|
||||||
std::clog << "GDAL Plugin: View extent=" << intersect << "\n";
|
std::clog << "GDAL Plugin: View extent=" << intersect << "\n";
|
||||||
std::clog << "GDAL Plugin: Query resolution=" << boost::get<0>(q.resolution()) << "," << boost::get<1>(q.resolution()) << "\n";
|
std::clog << "GDAL Plugin: Query resolution=" << boost::get<0>(q.resolution()) << "," << boost::get<1>(q.resolution()) << "\n";
|
||||||
std::clog << boost::format("GDAL Plugin: StartX=%d StartY=%d Width=%d Height=%d \n") % x_off % y_off % width % height;
|
std::clog << boost::format("GDAL Plugin: StartX=%d StartY=%d Width=%d Height=%d \n") % x_off % y_off % width % height;
|
||||||
|
@ -201,7 +198,7 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
|
||||||
|
|
||||||
else // working with all bands
|
else // working with all bands
|
||||||
{
|
{
|
||||||
for (int i = 0; i < nbands; ++i)
|
for (int i = 0; i < nbands_; ++i)
|
||||||
{
|
{
|
||||||
GDALRasterBand * band = dataset_.GetRasterBand(i+1);
|
GDALRasterBand * band = dataset_.GetRasterBand(i+1);
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,9 @@ class gdal_featureset : public mapnik::Featureset
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
gdal_featureset(GDALDataset & dataset, int band, gdal_query q, double filter_factor);
|
gdal_featureset(GDALDataset & dataset, int band, gdal_query q,
|
||||||
|
mapnik::box2d<double> extent, double width, double height, int nbands,
|
||||||
|
double dx, double dy, double filter_factor);
|
||||||
virtual ~gdal_featureset();
|
virtual ~gdal_featureset();
|
||||||
mapnik::feature_ptr next();
|
mapnik::feature_ptr next();
|
||||||
private:
|
private:
|
||||||
|
@ -46,6 +48,12 @@ private:
|
||||||
GDALDataset & dataset_;
|
GDALDataset & dataset_;
|
||||||
int band_;
|
int band_;
|
||||||
gdal_query gquery_;
|
gdal_query gquery_;
|
||||||
|
mapnik::box2d<double> raster_extent_;
|
||||||
|
unsigned raster_width_;
|
||||||
|
unsigned raster_height_;
|
||||||
|
double dx_;
|
||||||
|
double dy_;
|
||||||
|
int nbands_;
|
||||||
double filter_factor_;
|
double filter_factor_;
|
||||||
bool first_;
|
bool first_;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue