From e93bfa7a5a47aee64cd3f39f108cb7bdbc8a5873 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Fri, 3 Jun 2011 05:55:28 +0000 Subject: [PATCH] add a grid_view class to allow subsetting of grids for metatiling --- include/mapnik/grid/grid.hpp | 16 ++- include/mapnik/grid/grid_view.hpp | 205 ++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 include/mapnik/grid/grid_view.hpp diff --git a/include/mapnik/grid/grid.hpp b/include/mapnik/grid/grid.hpp index 063be08c0..48003a650 100644 --- a/include/mapnik/grid/grid.hpp +++ b/include/mapnik/grid/grid.hpp @@ -26,7 +26,7 @@ // mapnik #include #include -//#include +#include #include #include #include @@ -223,13 +223,17 @@ public: return data_.getData(); } - -/* - inline mapnik::grid_view get_view(unsigned x,unsigned y, unsigned w,unsigned h) + inline const value_type* getRow(unsigned row) const { - return mapnik::grid_view(x,y,w,h,data_,key_,resolution_,names_,f_keys_,features_); + return data_.getRow(row); } -*/ + + inline mapnik::grid_view get_view(unsigned x, unsigned y, unsigned w, unsigned h) + { + return mapnik::grid_view(x,y,w,h, + data_,key_,resolution_,names_,f_keys_,features_); + } + private: diff --git a/include/mapnik/grid/grid_view.hpp b/include/mapnik/grid/grid_view.hpp new file mode 100644 index 000000000..28be7a30d --- /dev/null +++ b/include/mapnik/grid/grid_view.hpp @@ -0,0 +1,205 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2011 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$ + +#ifndef MAPNIK_GRID_VIEW_HPP +#define MAPNIK_GRID_VIEW_HPP + +#include +#include +#include +#include + +// stl +#include +#include +#include +#include +#include +#include + + +namespace mapnik { + +template +class hit_grid_view +{ +public: + typedef T data_type; + typedef typename T::pixel_type value_type; + typedef std::string lookup_type; + typedef std::map feature_key_type; + typedef std::map key_type; + typedef std::map feature_properties_type; + typedef std::map feature_type; + + hit_grid_view(unsigned x, unsigned y, + unsigned width, unsigned height, + T const& data, + std::string const& key, + unsigned resolution, + std::set const& names, + feature_key_type const& f_keys, + feature_type const& features + ) + : x_(x), + y_(y), + width_(width), + height_(height), + data_(data), + key_(key), + resolution_(resolution), + names_(names), + f_keys_(f_keys), + features_(features) + + { + std::clog << "w,h" << width_ << " " << height_ << "\n"; + if (x_ >= data_.width()) + x_=data_.width()-1; + + if (y_ >= data_.height()) + x_=data_.height()-1; + + if (x_ + width_ > data_.width()) + width_= data_.width() - x_; + + if (y_ + height_ > data_.height()) + height_= data_.height() - y_; + std::clog << "w,h" << width_ << " " << height_ << "\n"; + } + + ~hit_grid_view() {} + + hit_grid_view(hit_grid_view const& rhs) + : x_(rhs.x_), + y_(rhs.y_), + width_(rhs.width_), + height_(rhs.height_), + data_(rhs.data_), + key_(rhs.key_), + resolution_(rhs.resolution_), + names_(rhs.names_), + f_keys_(rhs.f_keys_), + features_(rhs.features_) + {} + + hit_grid_view & operator=(hit_grid_view const& rhs) + { + if (&rhs==this) return *this; + x_ = rhs.x_; + y_ = rhs.y_; + width_ = rhs.width_; + height_ = rhs.height_; + data_ = rhs.data_; + key_ = rhs.key_; + resolution_ = rhs.resolution_; + names_ = rhs.names_; + f_keys_ = rhs.f_keys_; + features_ = rhs.features_; + } + + inline unsigned x() const + { + return x_; + } + + inline unsigned y() const + { + return y_; + } + + inline unsigned width() const + { + return width_; + } + + inline unsigned height() const + { + return height_; + } + + inline const value_type* getRow(unsigned row) const + { + return data_.getRow(row + y_) + x_; + } + + inline T& data() + { + return data_; + } + + inline T const& data() const + { + return data_; + } + + inline const unsigned char* raw_data() const + { + return data_.getBytes(); + } + + std::set const& property_names() const + { + return names_; + } + + inline const feature_type& get_grid_features() const + { + return features_; + } + + inline const feature_key_type& get_feature_keys() const + { + return f_keys_; + } + + inline const lookup_type& get_key() const + { + return key_; + } + + inline unsigned int get_resolution() const + { + return resolution_; + } + +private: + unsigned x_; + unsigned y_; + unsigned width_; + unsigned height_; + T const& data_; + std::string const& key_; + unsigned int resolution_; + std::set const& names_; + feature_key_type const& f_keys_; + feature_type const& features_; +}; + +typedef hit_grid_view > grid_view; + +} + +#endif // MAPNIK_GRID_VIEW_HPP +