From 81fbe706a620758d88be727e5e6e1696a8631b88 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Fri, 17 Nov 2006 02:01:21 +0000 Subject: [PATCH] fixed scale_denomitator --- include/mapnik/feature_style_processor.hpp | 2 +- include/mapnik/scale_denominator.hpp | 3 +-- src/layer.cpp | 2 +- src/scale_denominator.cpp | 27 +++++----------------- 4 files changed, 9 insertions(+), 25 deletions(-) diff --git a/include/mapnik/feature_style_processor.hpp b/include/mapnik/feature_style_processor.hpp index 24dc90fae..30d14ee21 100644 --- a/include/mapnik/feature_style_processor.hpp +++ b/include/mapnik/feature_style_processor.hpp @@ -76,7 +76,7 @@ namespace mapnik try { projection proj(m_.srs()); // map projection - double scale_denom = scale_denominator(m_,proj); + double scale_denom = scale_denominator(m_,proj.is_geographic()); std::clog << "scale denominator = " << scale_denom << "\n"; std::vector::const_iterator itr = m_.layers().begin(); diff --git a/include/mapnik/scale_denominator.hpp b/include/mapnik/scale_denominator.hpp index 16e3a906a..92fd52c50 100644 --- a/include/mapnik/scale_denominator.hpp +++ b/include/mapnik/scale_denominator.hpp @@ -26,6 +26,5 @@ namespace mapnik { class Map; - class projection; - MAPNIK_DECL double scale_denominator(Map const& map,projection const& prj); + MAPNIK_DECL double scale_denominator(Map const& map, bool geographic); } diff --git a/src/layer.cpp b/src/layer.cpp index 2e66bb91d..f90e81e4f 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -173,7 +173,7 @@ namespace mapnik bool Layer::isVisible(double scale) const { - return isActive() && scale >= minZoom_ && scale < maxZoom_; + return isActive() && scale >= minZoom_ - 1e-6 && scale < maxZoom_ + 1e-6; } void Layer::setSelectable(bool selectable) diff --git a/src/scale_denominator.cpp b/src/scale_denominator.cpp index 2c6b2b6a8..01515b6d0 100644 --- a/src/scale_denominator.cpp +++ b/src/scale_denominator.cpp @@ -23,32 +23,17 @@ //$Id$ #include #include -#include -#include #include namespace mapnik { - static const double dpi = 90.0; // display resolution + static const double pi = 3.14159265359; + static const double meters_per_degree = 6378137 * 2 * pi/ 360; - double scale_denominator(Map const& map,projection const& prj) + double scale_denominator(Map const& map, bool geographic) { - double map_width = map.getWidth(); - double map_height = map.getHeight(); - Envelope const& extent = map.getCurrentExtent(); - double x0 = extent.minx(); - double y0 = extent.miny(); - double x1 = extent.maxx(); - double y1 = extent.maxy(); - - if (!prj.is_geographic()) - { - prj.inverse(x0,y0); - prj.inverse(x1,y1); - } - great_circle_distance distance; - double d1 = distance(coord2d(x0,y0),coord2d(x1, y1)); - double d0 = sqrt(map_width * map_width + map_height * map_height) / dpi * 0.0254; - return d1 / d0; + double denom = map.scale() / 0.00028; + if (geographic) denom *= meters_per_degree; + return denom; } }