/***************************************************************************** * * This file is part of Mapnik (c++ mapping toolkit) * * Copyright (C) 2006 Artem Pavlenko * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *****************************************************************************/ //$Id: raster_datasource.cc 44 2005-04-22 18:53:54Z pavlenko $ // boost #include #include // mapnik #include #include "raster_featureset.hpp" #include "raster_info.hpp" #include "raster_datasource.hpp" using mapnik::datasource; using mapnik::parameters; using mapnik::ImageReader; DATASOURCE_PLUGIN(raster_datasource) using std::clog; using std::endl; using boost::lexical_cast; using boost::bad_lexical_cast; using mapnik::layer_descriptor; using mapnik::featureset_ptr; using mapnik::query; using mapnik::coord2d; using mapnik::datasource_exception; raster_datasource::raster_datasource(const parameters& params, bool bind) : datasource(params), desc_(*params.get("type"),"utf-8") { #ifdef MAPNIK_DEBUG std::cout << "\nRaster Plugin: Initializing...\n"; #endif boost::optional file=params.get("file"); if (!file) throw datasource_exception("missing parameter "); boost::optional base=params.get("base"); if (base) filename_ = *base + "/" + *file; else filename_ = *file; format_=*params_.get("format","tiff"); boost::optional lox = params_.get("lox"); boost::optional loy = params_.get("loy"); boost::optional hix = params_.get("hix"); boost::optional hiy = params_.get("hiy"); if (lox && loy && hix && hiy) { extent_.init(*lox,*loy,*hix,*hiy); } else throw datasource_exception(" are required"); if (bind) { this->bind(); } } void raster_datasource::bind() const { if (is_bound_) return; if (!boost::filesystem::exists(filename_)) throw datasource_exception(filename_ + " does not exist"); try { std::auto_ptr reader(mapnik::get_image_reader(filename_, format_)); if (reader.get()) { width_ = reader->width(); height_ = reader->height(); #ifdef MAPNIK_DEBUG std::cout << "Raster Plugin: RASTER SIZE(" << width_ << "," << height_ << ")\n"; #endif } } catch (...) { std::cerr << "Exception caught\n"; } is_bound_ = true; } raster_datasource::~raster_datasource() {} int raster_datasource::type() const { return datasource::Raster; } std::string raster_datasource::name_="raster"; std::string raster_datasource::name() { return name_; } mapnik::Envelope raster_datasource::envelope() const { return extent_; } layer_descriptor raster_datasource::get_descriptor() const { return desc_; } featureset_ptr raster_datasource::features(query const& q) const { if (!is_bound_) bind(); mapnik::CoordTransform t(width_,height_,extent_,0,0); mapnik::Envelope intersect=extent_.intersect(q.get_bbox()); mapnik::Envelope ext=t.forward(intersect); unsigned width = int(ext.width() + 0.5); unsigned height = int(ext.height() + 0.5); #ifdef MAPNIK_DEBUG std::cout << "Raster Plugin: BOX SIZE(" << width << " " << height << ")\n"; #endif if (width * height > 1024*1024) { #ifdef MAPNIK_DEBUG std::cout << "Raster Plugin: TILED policy\n"; #endif tiled_file_policy policy(filename_,format_, 1024, extent_,q.get_bbox(), width_,height_); return featureset_ptr(new raster_featureset(policy,extent_,q)); } else { #ifdef MAPNIK_DEBUG std::cout << "Raster Plugin: SINGLE FILE\n"; #endif raster_info info(filename_,format_,extent_,width_,height_); single_file_policy policy(info); return featureset_ptr(new raster_featureset(policy,extent_,q)); } } featureset_ptr raster_datasource::features_at_point(coord2d const&) const { return featureset_ptr(); }