From 38e1570b8b60d94079fa5c58cc2cfbd9ce4be99f Mon Sep 17 00:00:00 2001 From: Alberto Valverde Date: Thu, 6 May 2010 07:21:11 +0000 Subject: [PATCH] added a max_value attribute to color_band to handle the case of the last band more gracefully --- bindings/python/mapnik_raster_colorizer.cpp | 11 ++++++++ include/mapnik/raster_colorizer.hpp | 31 +++++++++++++++++++-- src/load_map.cpp | 7 ++++- src/save_map.cpp | 2 ++ tests/python_tests/raster_colorizer_test.py | 14 ++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/bindings/python/mapnik_raster_colorizer.cpp b/bindings/python/mapnik_raster_colorizer.cpp index c7cfc72c8..07b47602e 100644 --- a/bindings/python/mapnik_raster_colorizer.cpp +++ b/bindings/python/mapnik_raster_colorizer.cpp @@ -48,6 +48,14 @@ namespace { { rc->append_band(v, c, m); } + void append_band5(raster_colorizer_ptr & rc, float v, float vm, color c, unsigned m) + { + rc->append_band(v, vm, c, m); + } + void append_band6(raster_colorizer_ptr & rc, float v, float vm, color c) + { + rc->append_band(v, vm, c); + } color_bands const& get_color_bands(raster_colorizer_ptr & rc) { return rc->get_color_bands(); @@ -67,6 +75,8 @@ void export_raster_colorizer() .def("append_band", append_band2, "TODO: Write docs") .def("append_band", append_band3, "TODO: Write docs") .def("append_band", append_band4, "TODO: Write docs") + .def("append_band", append_band5, "TODO: Write docs") + .def("append_band", append_band6, "TODO: Write docs") .def("get_color", &raster_colorizer::get_color, "TODO: Write docs") ; @@ -83,6 +93,7 @@ void export_raster_colorizer() (&color_band::get_color, return_value_policy())) .add_property("value", &color_band::get_value) + .add_property("max_value", &color_band::get_max_value) .def(self == self) .def("__str__",&color_band::to_string) ; diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp index 506224cb6..cdd22888f 100644 --- a/include/mapnik/raster_colorizer.hpp +++ b/include/mapnik/raster_colorizer.hpp @@ -37,11 +37,19 @@ namespace mapnik struct MAPNIK_DECL color_band { float value_; + float max_value_; color color_; unsigned midpoints_; bool is_interpolated_; color_band(float value, color c) : value_(value), + max_value_(value), + color_(c), + midpoints_(0), + is_interpolated_(false) {} + color_band(float value, float max_value, color c) + : value_(value), + max_value_(max_value), color_(c), midpoints_(0), is_interpolated_(false) {} @@ -57,18 +65,22 @@ struct MAPNIK_DECL color_band { return value_; } + const float get_max_value() const + { + return max_value_; + } const color& get_color() const { return color_; } bool operator==(color_band const& other) const { - return value_ == other.value_ && color_ == other.color_; + return value_ == other.value_ && color_ == other.color_ && max_value_ == other.max_value_; } std::string to_string() const { std::stringstream ss; - ss << color_.to_string() << " " << value_; + ss << color_.to_string() << " " << value_ << " " << max_value_; return ss.str(); } }; @@ -101,6 +113,8 @@ struct MAPNIK_DECL raster_colorizer ); } colors_.push_back(band); + if (colors_.size() > 0 && colors_.back().value_ == colors_.back().max_value_) + colors_.back().max_value_ = band.value_; } void append_band (color_band band, unsigned midpoints) { @@ -141,11 +155,22 @@ struct MAPNIK_DECL raster_colorizer append_band(color_band(value, c)); } + void append_band (float value, float max_value, color c) + { + append_band(color_band(value, max_value, c)); + } + void append_band (float value, color c, unsigned midpoints) { append_band(color_band(value, c), midpoints); } + void append_band (float value, float max_value, color c, unsigned midpoints) + { + append_band(color_band(value, max_value, c), midpoints); + } + + /* rgba = * if cs[pos].value <= value < cs[pos+1].value: cs[pos].color * otherwise: transparent @@ -168,7 +193,7 @@ struct MAPNIK_DECL raster_colorizer } lo--; if ((0 <= lo && lo < last) || - (lo==last && colors_[last].value_==value)) + (lo==last && (colors_[last].value_==value || valueappend_band(value, *c, midpoints); + optional max_value = get_opt_attr(cb, "max_value"); + if (max_value) { + rc->append_band(value, *max_value, *c, midpoints); + } else { + rc->append_band(value, *c, midpoints); + } } else if (cb_tag.first != "" && cb_tag.first != "" ) diff --git a/src/save_map.cpp b/src/save_map.cpp index ad58e293d..6860c243c 100644 --- a/src/save_map.cpp +++ b/src/save_map.cpp @@ -59,6 +59,8 @@ void serialize_raster_colorizer(ptree & sym_node, ptree::value_type("ColorBand", ptree()) )->second; set_attr(band_node, "value", cb[i].get_value()); + if (cb[i].get_value() != cb[i].get_max_value()) + set_attr(band_node, "max_value", cb[i].get_max_value()); set_attr(band_node, "midpoints", cb[i].get_midpoints()); optional c = cb[i].get_color(); if (c) set_attr(band_node, "color", * c); diff --git a/tests/python_tests/raster_colorizer_test.py b/tests/python_tests/raster_colorizer_test.py index 492523471..29084dc04 100644 --- a/tests/python_tests/raster_colorizer_test.py +++ b/tests/python_tests/raster_colorizer_test.py @@ -30,3 +30,17 @@ def test_get_color(): eq_(colorizer.get_color(200), bands[-1][1]) # values greater than the last value are mapped to "transparent" eq_(colorizer.get_color(201), mapnik2.Color("transparent")) + +def test_get_color_with_max_value(): + colorizer = mapnik2.RasterColorizer() + c1 = mapnik2.Color("#0044cc") + colorizer.append_band(0, c1) + c2 = mapnik2.Color("#0055dd") + colorizer.append_band(1, 2, c2) + + eq_(colorizer.get_color(-1), mapnik2.Color("transparent")) + eq_(colorizer.get_color(0), c1) + eq_(colorizer.get_color(0.5), c1) + eq_(colorizer.get_color(1), c2) + eq_(colorizer.get_color(1.5), c2) + eq_(colorizer.get_color(2), mapnik2.Color("transparent"))