From ab101401cd7cb57f10fee37a41e2920f5d70a82b Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Wed, 3 Nov 2010 13:19:15 +0000 Subject: [PATCH] + simplify geometry implementation + removed multiple geometry typedefs + use geometry_type + revert to storing vertices in vector_vertex (previous implementation using std::vector was fragmenting heap causing performance issues with large geometries) + FIXME: hit_test is broken! --- bindings/python/mapnik_feature.cpp | 2 +- bindings/python/mapnik_geometry.cpp | 14 +- demo/viewer/mapwidget.cpp | 4 +- include/mapnik/feature.hpp | 4 +- include/mapnik/geometry.hpp | 280 ++---------------- include/mapnik/hit_test_filter.hpp | 2 +- include/mapnik/memory_datasource.hpp | 17 +- include/mapnik/memory_featureset.hpp | 2 +- include/mapnik/metawriter.hpp | 2 +- include/mapnik/svg/svg_generator.hpp | 2 +- include/mapnik/svg/svg_output_grammars.hpp | 24 +- include/mapnik/vertex_vector.hpp | 54 +--- plugins/input/gdal/gdal_featureset.cpp | 7 +- plugins/input/kismet/kismet_featureset.cpp | 4 +- plugins/input/occi/occi_featureset.cpp | 32 +- plugins/input/occi/occi_featureset.hpp | 4 +- plugins/input/ogr/ogr_converter.cpp | 28 +- plugins/input/osm/osm_featureset.cpp | 184 ++++++------ plugins/input/postgis/postgisfs.cpp | 2 +- .../rasterlite/rasterlite_featureset.cpp | 2 +- plugins/input/shape/shape_featureset.cpp | 26 +- .../input/shape/shape_index_featureset.cpp | 22 +- plugins/input/shape/shape_io.cpp | 31 +- plugins/input/shape/shape_io.hpp | 14 +- plugins/input/sqlite/sqlite_featureset.cpp | 4 - .../templates/helloworld/hello_featureset.cpp | 2 +- src/agg/process_building_symbolizer.cpp | 12 +- src/agg/process_line_pattern_symbolizer.cpp | 4 +- src/agg/process_line_symbolizer.cpp | 4 +- src/agg/process_markers_symbolizer.cpp | 6 +- src/agg/process_point_symbolizer.cpp | 4 +- .../process_polygon_pattern_symbolizer.cpp | 4 +- src/agg/process_polygon_symbolizer.cpp | 4 +- src/agg/process_shield_symbolizer.cpp | 6 +- src/agg/process_text_symbolizer.cpp | 4 +- src/cairo_renderer.cpp | 42 +-- src/memory_datasource.cpp | 15 +- src/placement_finder.cpp | 2 +- src/svg/process_symbolizers.cpp | 66 ++--- src/wkb.cpp | 12 +- utils/pgsql2sqlite/pgsql2sqlite.hpp | 2 +- 41 files changed, 333 insertions(+), 623 deletions(-) diff --git a/bindings/python/mapnik_feature.cpp b/bindings/python/mapnik_feature.cpp index 0070340e5..215c6e875 100644 --- a/bindings/python/mapnik_feature.cpp +++ b/bindings/python/mapnik_feature.cpp @@ -33,7 +33,7 @@ #include #include -mapnik::geometry2d & (mapnik::Feature::*get_geom1)(unsigned) = &mapnik::Feature::get_geometry; +mapnik::geometry_type & (mapnik::Feature::*get_geom1)(unsigned) = &mapnik::Feature::get_geometry; namespace { diff --git a/bindings/python/mapnik_geometry.cpp b/bindings/python/mapnik_geometry.cpp index 29776d2b9..fe8b525f0 100644 --- a/bindings/python/mapnik_geometry.cpp +++ b/bindings/python/mapnik_geometry.cpp @@ -29,12 +29,12 @@ void export_geometry() { using namespace boost::python; - using mapnik::geometry2d; - - class_("Geometry2d",no_init) - .def("envelope",&geometry2d::envelope) - // .def("__str__",&geometry2d::to_string) - .def("type",&geometry2d::type) - // TODO add other geometry2d methods + using mapnik::geometry_type; + + class_("GeometryType",no_init) + .def("envelope",&geometry_type::envelope) + // .def("__str__",&geometry_type::to_string) + .def("type",&geometry_type::type) + // TODO add other geometry_type methods ; } diff --git a/demo/viewer/mapwidget.cpp b/demo/viewer/mapwidget.cpp index 2e3b956ff..12e4d0ecb 100644 --- a/demo/viewer/mapwidget.cpp +++ b/demo/viewer/mapwidget.cpp @@ -177,11 +177,11 @@ void MapWidget::mousePressEvent(QMouseEvent* e) itr->second.to_string().c_str())); } } - typedef mapnik::coord_transform2 path_type; + typedef mapnik::coord_transform2 path_type; for (unsigned i=0; inum_geometries();++i) { - mapnik::geometry2d & geom = feat->get_geometry(i); + mapnik::geometry_type & geom = feat->get_geometry(i); path_type path(t,geom,prj_trans); if (geom.num_points() > 0) { diff --git a/include/mapnik/feature.hpp b/include/mapnik/feature.hpp index 7dcea825a..6b5f84d71 100644 --- a/include/mapnik/feature.hpp +++ b/include/mapnik/feature.hpp @@ -102,7 +102,7 @@ public: box2d result; for (unsigned i=0;i box = geom.envelope(); @@ -160,7 +160,7 @@ public: } }; -typedef feature Feature; +typedef feature Feature; inline std::ostream& operator<< (std::ostream & out,Feature const& f) { diff --git a/include/mapnik/geometry.hpp b/include/mapnik/geometry.hpp index 008b8a451..d85b66401 100644 --- a/include/mapnik/geometry.hpp +++ b/include/mapnik/geometry.hpp @@ -35,115 +35,16 @@ #include namespace mapnik { -enum GeomType { + +enum eGeomType { Point = 1, LineString = 2, Polygon = 3 }; - -template -class geometry : private boost::noncopyable -{ -public: - typedef T vertex_type; - typedef typename vertex_type::type value_type; -public: - geometry () {} - - box2d envelope() const - { - box2d result; - double x(0); - double y(0); - rewind(0); - for (unsigned i=0;i -class point : public geometry -{ - typedef geometry geometry_base; - typedef typename geometry::vertex_type vertex_type; - typedef typename geometry::value_type value_type; -private: - vertex_type pt_; -public: - point() : geometry() {} - - int type() const - { - return Point; - } - double area() const - { - return 0; - } - - void label_position(double *x, double *y) const - { - *x = pt_.x; - *y = pt_.y; - } - - void move_to(value_type x,value_type y) - { - pt_.x = x; - pt_.y = y; - } - - void line_to(value_type ,value_type ) {} - - unsigned num_points() const - { - return 1; - } - - unsigned vertex(double* x, double* y) const - { - *x = pt_.x; - *y = pt_.y; - return SEG_LINETO; - } - - void rewind(unsigned ) const {} - - bool hit_test(value_type x,value_type y, double tol) const - { - return point_in_circle(pt_.x,pt_.y, x,y,tol); - } - - void set_capacity(size_t) {} - virtual ~point() {} -}; - -template class Container=vertex_vector2> -class polygon //: public geometry +template class Container=vertex_vector> +class geometry { public: typedef T vertex_type; @@ -151,31 +52,20 @@ public: typedef Container container_type; private: container_type cont_; + eGeomType type_; mutable unsigned itr_; public: - - typedef typename container_type::const_iterator iterator; - - iterator begin() const - { - return cont_.begin(); - } - - iterator end() const - { - return cont_.end(); - } - - polygon() - : //geometry_base(), - itr_(0) + + geometry(eGeomType type) + : type_(type), + itr_(0) {} - - int type() const + + eGeomType type() const { - return Polygon; + return type_; } - + double area() const { double sum = 0.0; @@ -340,18 +230,20 @@ public: itr_=0; } - bool hit_test(value_type x,value_type y, double tol) const + bool hit_test(value_type x, value_type y, double tol) const { + // FIXME !!!!!!!!! + // FIXME: this is a workaround around the regression metioned in // http://trac.mapnik.org/ticket/560, not a definitive solution - if (cont_.size() > 1) { - return point_inside_path(x,y,cont_.begin(),cont_.end()); - } else if (cont_.size() == 1) { + //if (cont_.size() > 1) { + // return point_inside_path(x,y,cont_.begin(),cont_.end()); + //} else if (cont_.size() == 1) { // Handle points - double x0=boost::get<0>(*cont_.begin()); - double y0=boost::get<1>(*cont_.begin()); - return distance(x, y, x0, y0) <= abs(tol); - } + // double x0=boost::get<0>(*cont_.begin()); + // double y0=boost::get<1>(*cont_.begin()); + // return distance(x, y, x0, y0) <= abs(tol); + //} return false; } @@ -359,132 +251,12 @@ public: { cont_.set_capacity(size); } - //virtual ~polygon() {} }; -template class Container=vertex_vector2> -class line_string : public geometry -{ - typedef geometry geometry_base; - typedef typename geometry_base::value_type value_type; - typedef typename geometry::vertex_type vertex_type; - typedef Container container_type; -private: - container_type cont_; - mutable unsigned itr_; -public: - line_string() - : geometry_base(), - itr_(0) - {} - - int type() const - { - return LineString; - } +typedef geometry geometry_type; +typedef boost::shared_ptr geometry_ptr; +typedef boost::ptr_vector geometry_containter; - double area() const - { - return 0; - } - - void label_position(double *x, double *y) const - { - // calculate mid point on line string - double x0=0; - double y0=0; - double x1=0; - double y1=0; - - unsigned size = cont_.size(); - if (size == 1) - { - cont_.get_vertex(0,x,y); - } - else if (size == 2) - { - cont_.get_vertex(0,&x0,&y0); - cont_.get_vertex(1,&x1,&y1); - *x = 0.5 * (x1 + x0); - *y = 0.5 * (y1 + y0); - } - else - { - double len=0.0; - for (unsigned pos = 1; pos < size; ++pos) - { - cont_.get_vertex(pos-1,&x0,&y0); - cont_.get_vertex(pos,&x1,&y1); - double dx = x1 - x0; - double dy = y1 - y0; - len += std::sqrt(dx * dx + dy * dy); - } - double midlen = 0.5 * len; - double dist = 0.0; - for (unsigned pos = 1; pos < size;++pos) - { - cont_.get_vertex(pos-1,&x0,&y0); - cont_.get_vertex(pos,&x1,&y1); - double dx = x1 - x0; - double dy = y1 - y0; - double seg_len = std::sqrt(dx * dx + dy * dy); - if (( dist + seg_len) >= midlen) - { - double r = (midlen - dist)/seg_len; - *x = x0 + (x1 - x0) * r; - *y = y0 + (y1 - y0) * r; - break; - } - dist += seg_len; - } - } - } - void line_to(value_type x,value_type y) - { - cont_.push_back(x,y,SEG_LINETO); - } - - void move_to(value_type x,value_type y) - { - cont_.push_back(x,y,SEG_MOVETO); - } - - unsigned num_points() const - { - return cont_.size(); - } - - unsigned vertex(double* x, double* y) const - { - return cont_.get_vertex(itr_++,x,y); - } - - void rewind(unsigned ) const - { - itr_=0; - } - - bool hit_test(value_type x,value_type y, double tol) const - { - return point_on_path(x,y,cont_.begin(),cont_.end(),tol); - } - - void set_capacity(size_t size) - { - cont_.set_capacity(size); - } - virtual ~line_string() {} -}; - -//typedef point point_impl; -//typedef line_string line_string_impl; -typedef polygon point_impl; -typedef polygon line_string_impl; -typedef polygon polygon_impl; - -typedef polygon_impl geometry2d; -typedef boost::shared_ptr geometry_ptr; -typedef boost::ptr_vector geometry_containter; } #endif //GEOMETRY_HPP diff --git a/include/mapnik/hit_test_filter.hpp b/include/mapnik/hit_test_filter.hpp index d990b97be..702d7d250 100644 --- a/include/mapnik/hit_test_filter.hpp +++ b/include/mapnik/hit_test_filter.hpp @@ -40,7 +40,7 @@ public: { for (unsigned i=0;i features_; + std::vector features_; }; // This class implements a simple way of displaying point-based data // TODO -- possible redesign, move into separate file // -class MAPNIK_DECL point_datasource : public mapnik::memory_datasource { +class MAPNIK_DECL point_datasource : public memory_datasource { public: point_datasource() : feat_id(0) {} - void add_point(double x, double y, const char* key, const char* value) { - mapnik::feature_ptr feature(mapnik::feature_factory::create(feat_id++)); - mapnik::geometry2d * pt = new mapnik::point_impl; - pt->move_to(x,y); - feature->add_geometry(pt); - mapnik::transcoder tr("utf-8"); - (*feature)[key] = tr.transcode(value); - this->push(feature); - } - - int type() const { return mapnik::datasource::Vector; } + void add_point(double x, double y, const char* key, const char* value); + inline int type() const { return datasource::Vector; } private: int feat_id; diff --git a/include/mapnik/memory_featureset.hpp b/include/mapnik/memory_featureset.hpp index ec2661161..f8f97e38d 100644 --- a/include/mapnik/memory_featureset.hpp +++ b/include/mapnik/memory_featureset.hpp @@ -44,7 +44,7 @@ public: while (pos_ != end_) { for (unsigned i=0; i<(*pos_)->num_geometries();++i) { - geometry2d & geom = (*pos_)->get_geometry(i); + geometry_type & geom = (*pos_)->get_geometry(i); #ifdef MAPNIK_DEBUG std::clog << "bbox_=" << bbox_ << ", geom.envelope=" << geom.envelope() << "\n"; #endif diff --git a/include/mapnik/metawriter.hpp b/include/mapnik/metawriter.hpp index 86946bda4..1d2a8c16b 100644 --- a/include/mapnik/metawriter.hpp +++ b/include/mapnik/metawriter.hpp @@ -71,7 +71,7 @@ public: class metawriter { public: - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; metawriter(metawriter_properties dflt_properties) : dflt_properties_(dflt_properties) {} virtual ~metawriter() {}; /** Output a rectangular area. diff --git a/include/mapnik/svg/svg_generator.hpp b/include/mapnik/svg/svg_generator.hpp index 02d009b81..df5972ecb 100644 --- a/include/mapnik/svg/svg_generator.hpp +++ b/include/mapnik/svg/svg_generator.hpp @@ -44,7 +44,7 @@ namespace mapnik { namespace svg { template class svg_generator : private boost::noncopyable { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef svg::svg_root_attributes_grammar root_attributes_grammar; typedef svg::svg_rect_attributes_grammar rect_attributes_grammar; diff --git a/include/mapnik/svg/svg_output_grammars.hpp b/include/mapnik/svg/svg_output_grammars.hpp index a1dc77656..381a79ed3 100644 --- a/include/mapnik/svg/svg_output_grammars.hpp +++ b/include/mapnik/svg/svg_output_grammars.hpp @@ -104,38 +104,38 @@ BOOST_FUSION_ADAPT_CLASS( ) /*! - * mapnik::geometry2d is adapted to conform to the concepts + * mapnik::geometry_type is adapted to conform to the concepts * required by Karma to be recognized as a container of * attributes for output generation. */ namespace boost { namespace spirit { namespace traits { template <> - struct is_container + struct is_container : mpl::true_ {}; template <> - struct container_iterator + struct container_iterator { - typedef mapnik::geometry2d::iterator type; + typedef mapnik::geometry_type::iterator type; }; template <> - struct begin_container + struct begin_container { - static mapnik::geometry2d::iterator - call(mapnik::geometry2d const& g) + static mapnik::geometry_type::iterator + call(mapnik::geometry_type const& g) { return g.begin(); } }; template <> - struct end_container + struct end_container { - static mapnik::geometry2d::iterator - call(mapnik::geometry2d const& g) + static mapnik::geometry_type::iterator + call(mapnik::geometry_type const& g) { return g.end(); } @@ -191,7 +191,7 @@ namespace mapnik { namespace svg { }; template - struct svg_path_data_grammar : karma::grammar + struct svg_path_data_grammar : karma::grammar { typedef path_coordinate_transformer coordinate_transformer; typedef mapnik::vertex_vector2::vertex_type vertex_type; @@ -234,7 +234,7 @@ namespace mapnik { namespace svg { path_vertex_transformed_y = double_[_1 = _a][bind(&coordinate_transformer::current_y, &ct_, _a)]; } - karma::rule svg_path; + karma::rule svg_path; karma::rule path_vertex; karma::rule path_vertex_command; karma::rule > path_vertex_component_x, path_vertex_component_y; diff --git a/include/mapnik/vertex_vector.hpp b/include/mapnik/vertex_vector.hpp index 017239dd5..72f7e1d0a 100644 --- a/include/mapnik/vertex_vector.hpp +++ b/include/mapnik/vertex_vector.hpp @@ -75,10 +75,10 @@ public: value_type** vertexs=vertexs_ + num_blocks_ - 1; while ( num_blocks_-- ) { - delete [] *vertexs; + ::operator delete(*vertexs); --vertexs; } - delete [] vertexs_; + ::operator delete(vertexs_); } } unsigned size() const @@ -121,66 +121,26 @@ private: { if (block >= max_blocks_) { - value_type** new_vertexs = new value_type* [(max_blocks_ + grow_by) * 2]; + value_type** new_vertexs = + static_cast(::operator new (sizeof(value_type*)*((max_blocks_ + grow_by) * 2))); unsigned char** new_commands = (unsigned char**)(new_vertexs + max_blocks_ + grow_by); if (vertexs_) { std::memcpy(new_vertexs,vertexs_,max_blocks_ * sizeof(value_type*)); std::memcpy(new_commands,commands_,max_blocks_ * sizeof(unsigned char*)); - delete [] vertexs_; + ::operator delete(vertexs_); } vertexs_ = new_vertexs; commands_ = new_commands; max_blocks_ += grow_by; } - vertexs_[block] = new value_type [block_size * 2 + block_size / (sizeof(value_type))]; + vertexs_[block] = static_cast(::operator new(sizeof(value_type)*(block_size * 2 + block_size / (sizeof(value_type))))); + commands_[block] = (unsigned char*)(vertexs_[block] + block_size*2); ++num_blocks_; } }; -template -struct vertex_vector2 //: boost::noncopyable -{ - typedef typename T::type value_type; - typedef boost::tuple vertex_type; - typedef typename std::vector::const_iterator const_iterator; - vertex_vector2() {} - unsigned size() const - { - return cont_.size(); - } - - void push_back (value_type x,value_type y,unsigned command) - { - cont_.push_back(vertex_type(x,y,command)); - } - unsigned get_vertex(unsigned pos,value_type* x,value_type* y) const - { - if (pos >= cont_.size()) return SEG_END; - vertex_type const& c = cont_[pos]; - *x = boost::get<0>(c); - *y = boost::get<1>(c); - return boost::get<2>(c); - } - - const_iterator begin() const - { - return cont_.begin(); - } - - const_iterator end() const - { - return cont_.end(); - } - - void set_capacity(size_t size) - { - cont_.reserve(size); - } -private: - std::vector cont_; -}; } #endif //VERTEX_VECTOR_HPP diff --git a/plugins/input/gdal/gdal_featureset.cpp b/plugins/input/gdal/gdal_featureset.cpp index 727f6aa43..b5db9e5fc 100644 --- a/plugins/input/gdal/gdal_featureset.cpp +++ b/plugins/input/gdal/gdal_featureset.cpp @@ -33,8 +33,7 @@ using mapnik::box2d; using mapnik::Feature; using mapnik::feature_ptr; using mapnik::CoordTransform; -using mapnik::point_impl; -using mapnik::geometry2d; +using mapnik::geometry_type; using mapnik::datasource_exception; @@ -345,7 +344,7 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt) double det2 = gt[2]*Y + gt[5]*X; unsigned x = det2/det, y = det1/det; - if(0<=x && xmove_to(pt.x, pt.y); feature->add_geometry(point); (*feature)["value"] = value; diff --git a/plugins/input/kismet/kismet_featureset.cpp b/plugins/input/kismet/kismet_featureset.cpp index 77ed9ad32..d82708388 100644 --- a/plugins/input/kismet/kismet_featureset.cpp +++ b/plugins/input/kismet/kismet_featureset.cpp @@ -72,8 +72,8 @@ feature_ptr kismet_featureset::next() { value = "wlan_crypted"; } - - mapnik::geometry2d * pt = new mapnik::point_impl; + + mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::Point); pt->move_to(knd.bestlon_, knd.bestlat_); feature->add_geometry(pt); (*feature)[key] = tr_->transcode(value.c_str ()); diff --git a/plugins/input/occi/occi_featureset.cpp b/plugins/input/occi/occi_featureset.cpp index 08175295b..e7361827e 100644 --- a/plugins/input/occi/occi_featureset.cpp +++ b/plugins/input/occi/occi_featureset.cpp @@ -44,7 +44,7 @@ using mapnik::feature_ptr; using mapnik::point_impl; using mapnik::line_string_impl; using mapnik::polygon_impl; -using mapnik::geometry2d; +using mapnik::geometry_type; using mapnik::geometry_utils; using mapnik::transcoder; using mapnik::datasource_exception; @@ -243,7 +243,7 @@ void occi_featureset::convert_point (SDOGeometry* geom, feature_ptr feature, int SDOPointType* sdopoint = geom->getSdo_point(); if (sdopoint && ! sdopoint->isNull()) { - geometry2d* point = new point_impl; + geometry_type* point = new geometry_type(mapnik::Point); point->move_to (sdopoint->getX(), sdopoint->getY()); @@ -259,10 +259,10 @@ void occi_featureset::convert_linestring (SDOGeometry* geom, feature_ptr feature if (ord_size >= dimensions) { - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity (ord_size); - fill_geometry2d (line, elem_info, ordinates, dimensions, false); + fill_geometry_type (line, elem_info, ordinates, dimensions, false); feature->add_geometry (line); } @@ -276,10 +276,10 @@ void occi_featureset::convert_polygon (SDOGeometry* geom, feature_ptr feature, i if (ord_size >= dimensions) { - geometry2d * poly = new polygon_impl; + geometry_type * poly = new geometry_type(mapnik::Polygon); poly->set_capacity (ord_size); - fill_geometry2d (poly, elem_info, ordinates, dimensions, false); + fill_geometry_type (poly, elem_info, ordinates, dimensions, false); feature->add_geometry (poly); } @@ -293,9 +293,9 @@ void occi_featureset::convert_multipoint (SDOGeometry* geom, feature_ptr feature if (ord_size >= dimensions) { - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); - fill_geometry2d (point, elem_info, ordinates, dimensions, true); + fill_geometry_type (point, elem_info, ordinates, dimensions, true); feature->add_geometry (point); } @@ -320,10 +320,10 @@ void occi_featureset::convert_multilinestring (SDOGeometry* geom, feature_ptr fe if (ord_size >= dimensions) { - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity (ord_size); - fill_geometry2d (line, elem_info, ordinates, dimensions, false); + fill_geometry_type (line, elem_info, ordinates, dimensions, false); feature->add_geometry (line); } @@ -348,10 +348,10 @@ void occi_featureset::convert_multipolygon (SDOGeometry* geom, feature_ptr featu if (ord_size >= dimensions) { - geometry2d * poly = new polygon_impl; + geometry_type * poly = new geometry_type(mapnik::Polygon); poly->set_capacity (ord_size); - fill_geometry2d (poly, elem_info, ordinates, dimensions, false); + fill_geometry_type (poly, elem_info, ordinates, dimensions, false); feature->add_geometry (poly); } @@ -383,7 +383,7 @@ void occi_featureset::convert_collection (SDOGeometry* geom, feature_ptr feature } */ -void occi_featureset::fill_geometry2d (geometry2d * geom, +void occi_featureset::fill_geometry_type (geometry_type * geom, const std::vector& elem_info, const std::vector& ordinates, const int dimensions, @@ -447,7 +447,7 @@ void occi_featureset::fill_geometry2d (geometry2d * geom, if (is_linear_element) { - fill_geometry2d (geom, + fill_geometry_type (geom, offset - 1, next_offset - 1, ordinates, @@ -462,7 +462,7 @@ void occi_featureset::fill_geometry2d (geometry2d * geom, } else { - fill_geometry2d (geom, + fill_geometry_type (geom, offset - 1, ord_size, ordinates, @@ -472,7 +472,7 @@ void occi_featureset::fill_geometry2d (geometry2d * geom, } } -void occi_featureset::fill_geometry2d (geometry2d * geom, +void occi_featureset::fill_geometry_type (geometry_type * geom, const int real_offset, const int next_offset, const std::vector& ordinates, diff --git a/plugins/input/occi/occi_featureset.hpp b/plugins/input/occi/occi_featureset.hpp index b64e806c2..4a13abb82 100644 --- a/plugins/input/occi/occi_featureset.hpp +++ b/plugins/input/occi/occi_featureset.hpp @@ -58,12 +58,12 @@ class occi_featureset : public mapnik::Featureset void convert_multipolygon (SDOGeometry* geom, mapnik::feature_ptr feature, int dims); //void convert_multipolygon_2 (SDOGeometry* geom, mapnik::feature_ptr feature, int dims); //void convert_collection (SDOGeometry* geom, mapnik::feature_ptr feature, int dims); - void fill_geometry2d (mapnik::geometry2d * geom, + void fill_geometry_type (mapnik::geometry_type * geom, const std::vector& elem_info, const std::vector& ordinates, const int dimensions, const bool is_point_geom); - void fill_geometry2d (mapnik::geometry2d * geom, + void fill_geometry_type (mapnik::geometry_type * geom, const int real_offset, const int next_offset, const std::vector& ordinates, diff --git a/plugins/input/ogr/ogr_converter.cpp b/plugins/input/ogr/ogr_converter.cpp index 41fc4e489..a25592b14 100644 --- a/plugins/input/ogr/ogr_converter.cpp +++ b/plugins/input/ogr/ogr_converter.cpp @@ -37,17 +37,7 @@ using std::endl; using mapnik::feature_ptr; using mapnik::geometry_utils; -using mapnik::geometry2d; -using mapnik::point_impl; -using mapnik::line_string_impl; -using mapnik::polygon_impl; - -/* -using mapnik::query; -using mapnik::box2d; -using mapnik::CoordTransform; -using mapnik::Feature; -*/ +using mapnik::geometry_type; void ogr_converter::convert_geometry (OGRGeometry* geom, feature_ptr feature, bool multiple_geometries) { @@ -102,7 +92,7 @@ void ogr_converter::convert_geometry (OGRGeometry* geom, feature_ptr feature, bo void ogr_converter::convert_point (OGRPoint* geom, feature_ptr feature) { - geometry2d* point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to (geom->getX(), geom->getY()); feature->add_geometry (point); } @@ -110,7 +100,7 @@ void ogr_converter::convert_point (OGRPoint* geom, feature_ptr feature) void ogr_converter::convert_linestring (OGRLineString* geom, feature_ptr feature) { int num_points = geom->getNumPoints (); - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity (num_points); line->move_to (geom->getX (0), geom->getY (0)); for (int i=1;igetNumPoints (); } - geometry2d * poly = new polygon_impl; + geometry_type * poly = new geometry_type(mapnik::Polygon); poly->set_capacity (num_points + capacity); poly->move_to (exterior->getX (0), exterior->getY (0)); for (int i=1;igetNumGeometries (); - geometry2d* point = new point_impl; - + geometry_type * point = new geometry_type(mapnik::Point); + for (int i=0;i(geom->getGeometryRef (i)); @@ -188,9 +178,9 @@ void ogr_converter::convert_multilinestring (OGRMultiLineString* geom, feature_p num_points += ls->getNumPoints (); } - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity (num_points); - + for (int i=0;i(geom->getGeometryRef (i)); @@ -231,7 +221,7 @@ void ogr_converter::convert_multipolygon (OGRMultiPolygon* geom, feature_ptr fea } } - geometry2d * poly = new polygon_impl; + geometry_type * poly = new geometry_type(mapnik::Polygon); poly->set_capacity (capacity); for (int i=0;i osm_featureset::osm_featureset(const filterT& filter, - osm_dataset * dataset, - const std::set& - attribute_names, - std::string const& encoding) - : filter_(filter), - query_ext_(), - tr_(new transcoder(encoding)), - count_(0), - dataset_ (dataset), - attribute_names_ (attribute_names) + osm_dataset * dataset, + const std::set& + attribute_names, + std::string const& encoding) + : filter_(filter), + query_ext_(), + tr_(new transcoder(encoding)), + count_(0), + dataset_ (dataset), + attribute_names_ (attribute_names) { - dataset_->rewind(); + dataset_->rewind(); } template feature_ptr osm_featureset::next() { - osm_item * cur_item = dataset_->next_item(); - feature_ptr feature; - bool success=false; - if(cur_item != NULL) - { - if(dataset_->current_item_is_node()) - { - feature= feature_ptr(new Feature(count_++)); - double lat = static_cast(cur_item)->lat; - double lon = static_cast(cur_item)->lon; - geometry2d * point = new point_impl; - point->move_to(lon,lat); - feature->add_geometry(point); - success=true; - } - else if (dataset_->current_item_is_way()) - { - bounds b = static_cast(cur_item)->get_bounds(); - - // Loop until we find a feature which passes the filter - while(cur_item != NULL && - !filter_.pass(box2d(b.w,b.s,b.e,b.n))) - { - cur_item = dataset_->next_item(); - if(cur_item!=NULL) - b = static_cast(cur_item)->get_bounds(); - } - - if(cur_item != NULL) - { - if(static_cast(cur_item)->nodes.size()) - { - feature=feature_ptr(new Feature(count_++)); - geometry2d *geom; - if(static_cast(cur_item)->is_polygon()) - geom=new polygon_impl; - else - geom=new line_string_impl; + osm_item * cur_item = dataset_->next_item(); + feature_ptr feature; + bool success=false; + if(cur_item != NULL) + { + if(dataset_->current_item_is_node()) + { + feature= feature_ptr(new Feature(count_++)); + double lat = static_cast(cur_item)->lat; + double lon = static_cast(cur_item)->lon; + geometry_type * point = new geometry_type(mapnik::Point); + point->move_to(lon,lat); + feature->add_geometry(point); + success=true; + } + else if (dataset_->current_item_is_way()) + { + bounds b = static_cast(cur_item)->get_bounds(); + + // Loop until we find a feature which passes the filter + while(cur_item != NULL && + !filter_.pass(box2d(b.w,b.s,b.e,b.n))) + { + cur_item = dataset_->next_item(); + if(cur_item!=NULL) + b = static_cast(cur_item)->get_bounds(); + } + + if(cur_item != NULL) + { + if(static_cast(cur_item)->nodes.size()) + { + feature=feature_ptr(new Feature(count_++)); + geometry_type *geom; + if(static_cast(cur_item)->is_polygon()) + geom=new geometry_type(mapnik::Polygon); + else + geom=new geometry_type(mapnik::LineString); + + geom->set_capacity(static_cast(cur_item)-> + nodes.size()); + geom->move_to(static_cast(cur_item)-> + nodes[0]->lon, + static_cast(cur_item)-> + nodes[0]->lat); + + for(unsigned int count=1; count(cur_item) + ->nodes.size(); count++) + { + geom->line_to(static_cast(cur_item) + ->nodes[count]->lon, + static_cast(cur_item) + ->nodes[count]->lat); + } + feature->add_geometry(geom); + success=true; + } + } + } + + // can feature_ptr be compared to NULL? - no + if(success) + { + std::map::iterator i= + cur_item->keyvals.begin(); - geom->set_capacity(static_cast(cur_item)-> - nodes.size()); - geom->move_to(static_cast(cur_item)-> - nodes[0]->lon, - static_cast(cur_item)-> - nodes[0]->lat); - - for(unsigned int count=1; count(cur_item) - ->nodes.size(); count++) - { - geom->line_to(static_cast(cur_item) - ->nodes[count]->lon, - static_cast(cur_item) - ->nodes[count]->lat); - } - feature->add_geometry(geom); - success=true; - } - } - } - - // can feature_ptr be compared to NULL? - no - if(success) - { - std::map::iterator i= - cur_item->keyvals.begin(); - - // add the keyvals to the feature. the feature seems to be a map - // of some sort so this should work - see dbf_file::add_attribute() - while(i != cur_item->keyvals.end()) - { - //only add if in the specified set of attribute names - if(attribute_names_.find(i->first) != attribute_names_.end()) - (*feature)[i->first] = tr_->transcode(i->second.c_str()); - i++; - } - return feature; - } - } - return feature_ptr(); + // add the keyvals to the feature. the feature seems to be a map + // of some sort so this should work - see dbf_file::add_attribute() + while(i != cur_item->keyvals.end()) + { + //only add if in the specified set of attribute names + if(attribute_names_.find(i->first) != attribute_names_.end()) + (*feature)[i->first] = tr_->transcode(i->second.c_str()); + i++; + } + return feature; + } + } + return feature_ptr(); } diff --git a/plugins/input/postgis/postgisfs.cpp b/plugins/input/postgis/postgisfs.cpp index 562928d11..f4131fa52 100644 --- a/plugins/input/postgis/postgisfs.cpp +++ b/plugins/input/postgis/postgisfs.cpp @@ -36,7 +36,7 @@ using boost::bad_lexical_cast; using boost::trim_copy; using std::string; using mapnik::Feature; -using mapnik::geometry2d; +using mapnik::geometry_type; using mapnik::byte; using mapnik::geometry_utils; diff --git a/plugins/input/rasterlite/rasterlite_featureset.cpp b/plugins/input/rasterlite/rasterlite_featureset.cpp index 957324e12..7564473f0 100644 --- a/plugins/input/rasterlite/rasterlite_featureset.cpp +++ b/plugins/input/rasterlite/rasterlite_featureset.cpp @@ -34,7 +34,7 @@ using mapnik::Feature; using mapnik::feature_ptr; using mapnik::CoordTransform; using mapnik::point_impl; -using mapnik::geometry2d; +using mapnik::geometry_type; using mapnik::query; diff --git a/plugins/input/shape/shape_featureset.cpp b/plugins/input/shape/shape_featureset.cpp index 7c8ef0d4e..55b9ddfe6 100644 --- a/plugins/input/shape/shape_featureset.cpp +++ b/plugins/input/shape/shape_featureset.cpp @@ -74,7 +74,7 @@ shape_featureset::shape_featureset(const filterT& filter, template feature_ptr shape_featureset::next() { - using mapnik::point_impl; + using mapnik::geometry_type; std::streampos pos=shape_.shp().pos(); if (pos < std::streampos(file_length_ * 2)) @@ -86,7 +86,7 @@ feature_ptr shape_featureset::next() { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); ++count_; @@ -96,7 +96,7 @@ feature_ptr shape_featureset::next() double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); shape_.shp().skip(8); //m - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); ++count_; @@ -113,7 +113,7 @@ feature_ptr shape_featureset::next() { shape_.shp().skip(8); } - geometry2d * point=new point_impl; + geometry_type * point=new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); ++count_; @@ -146,7 +146,7 @@ feature_ptr shape_featureset::next() { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); } @@ -160,7 +160,7 @@ feature_ptr shape_featureset::next() { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); } @@ -177,7 +177,7 @@ feature_ptr shape_featureset::next() { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); } @@ -197,42 +197,42 @@ feature_ptr shape_featureset::next() } case shape_io::shape_polyline: { - geometry2d * line = shape_.read_polyline(); + geometry_type * line = shape_.read_polyline(); feature->add_geometry(line); ++count_; break; } case shape_io::shape_polylinem: { - geometry2d * line = shape_.read_polylinem(); + geometry_type * line = shape_.read_polylinem(); feature->add_geometry(line); ++count_; break; } case shape_io::shape_polylinez: { - geometry2d * line = shape_.read_polylinez(); + geometry_type * line = shape_.read_polylinez(); feature->add_geometry(line); ++count_; break; } case shape_io::shape_polygon: { - geometry2d * poly = shape_.read_polygon(); + geometry_type * poly = shape_.read_polygon(); feature->add_geometry(poly); ++count_; break; } case shape_io::shape_polygonm: { - geometry2d * poly = shape_.read_polygonm(); + geometry_type * poly = shape_.read_polygonm(); feature->add_geometry(poly); ++count_; break; } case shape_io::shape_polygonz: { - geometry2d * poly = shape_.read_polygonz(); + geometry_type * poly = shape_.read_polygonz(); feature->add_geometry(poly); ++count_; break; diff --git a/plugins/input/shape/shape_index_featureset.cpp b/plugins/input/shape/shape_index_featureset.cpp index e9b0c17c3..3a0112c9e 100644 --- a/plugins/input/shape/shape_index_featureset.cpp +++ b/plugins/input/shape/shape_index_featureset.cpp @@ -91,7 +91,7 @@ template feature_ptr shape_index_featureset::next() { using mapnik::feature_factory; - using mapnik::point_impl; + using mapnik::geometry_type; if (itr_!=ids_.end()) { int pos=*itr_++; @@ -103,7 +103,7 @@ feature_ptr shape_index_featureset::next() { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); ++count_; @@ -114,7 +114,7 @@ feature_ptr shape_index_featureset::next() double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); shape_.shp().skip(8);// skip m - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); ++count_; @@ -131,7 +131,7 @@ feature_ptr shape_index_featureset::next() { shape_.shp().skip(8); } - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); ++count_; @@ -156,7 +156,7 @@ feature_ptr shape_index_featureset::next() { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); - geometry2d * point = new point_impl; + geometry_type * point = new geometry_type(mapnik::Point); point->move_to(x,y); feature->add_geometry(point); } @@ -166,42 +166,42 @@ feature_ptr shape_index_featureset::next() } case shape_io::shape_polyline: { - geometry2d * line = shape_.read_polyline(); + geometry_type * line = shape_.read_polyline(); feature->add_geometry(line); ++count_; break; } case shape_io::shape_polylinem: { - geometry2d * line = shape_.read_polylinem(); + geometry_type * line = shape_.read_polylinem(); feature->add_geometry(line); ++count_; break; } case shape_io::shape_polylinez: { - geometry2d * line = shape_.read_polylinez(); + geometry_type * line = shape_.read_polylinez(); feature->add_geometry(line); ++count_; break; } case shape_io::shape_polygon: { - geometry2d * poly = shape_.read_polygon(); + geometry_type * poly = shape_.read_polygon(); feature->add_geometry(poly); ++count_; break; } case shape_io::shape_polygonm: { - geometry2d * poly = shape_.read_polygonm(); + geometry_type * poly = shape_.read_polygonm(); feature->add_geometry(poly); ++count_; break; } case shape_io::shape_polygonz: { - geometry2d * poly = shape_.read_polygonz(); + geometry_type * poly = shape_.read_polygonz(); feature->add_geometry(poly); ++count_; break; diff --git a/plugins/input/shape/shape_io.cpp b/plugins/input/shape/shape_io.cpp index b30ccfc32..d13b3ed1f 100644 --- a/plugins/input/shape/shape_io.cpp +++ b/plugins/input/shape/shape_io.cpp @@ -27,6 +27,7 @@ using mapnik::datasource_exception; +using mapnik::geometry_type; const std::string shape_io::SHP = ".shp"; const std::string shape_io::DBF = ".dbf"; @@ -106,14 +107,13 @@ dbf_file& shape_io::dbf() return dbf_; } -geometry2d * shape_io::read_polyline() +geometry_type * shape_io::read_polyline() { - using mapnik::line_string_impl; shape_file::record_type record(reclength_*2-36); shp_.read_record(record); int num_parts=record.read_ndr_integer(); int num_points=record.read_ndr_integer(); - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity(num_points + num_parts); if (num_parts == 1) { @@ -161,14 +161,13 @@ geometry2d * shape_io::read_polyline() return line; } -geometry2d * shape_io::read_polylinem() +geometry_type * shape_io::read_polylinem() { - using mapnik::line_string_impl; shape_file::record_type record(reclength_*2-36); shp_.read_record(record); int num_parts=record.read_ndr_integer(); int num_points=record.read_ndr_integer(); - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity(num_points + num_parts); if (num_parts == 1) { @@ -224,14 +223,13 @@ geometry2d * shape_io::read_polylinem() return line; } -geometry2d * shape_io::read_polylinez() +geometry_type * shape_io::read_polylinez() { - using mapnik::line_string_impl; shape_file::record_type record(reclength_*2-36); shp_.read_record(record); int num_parts=record.read_ndr_integer(); int num_points=record.read_ndr_integer(); - geometry2d * line = new line_string_impl; + geometry_type * line = new geometry_type(mapnik::LineString); line->set_capacity(num_points + num_parts); if (num_parts == 1) { @@ -294,15 +292,14 @@ geometry2d * shape_io::read_polylinez() return line; } -geometry2d * shape_io::read_polygon() +geometry_type * shape_io::read_polygon() { - using mapnik::polygon_impl; shape_file::record_type record(reclength_*2-36); shp_.read_record(record); int num_parts=record.read_ndr_integer(); int num_points=record.read_ndr_integer(); std::vector parts(num_parts); - geometry2d * poly = new polygon_impl; + geometry_type * poly = new geometry_type(mapnik::Polygon); poly->set_capacity(num_points + num_parts); for (int i=0;i parts(num_parts); - geometry2d * poly = new polygon_impl; + geometry_type * poly = new geometry_type(mapnik::Polygon); poly->set_capacity(num_points + num_parts); for (int i=0;i parts(num_parts); - geometry2d * poly=new polygon_impl; + geometry_type * poly=new geometry_type(mapnik::Polygon); poly->set_capacity(num_points + num_parts); for (int i=0;i #include -using mapnik::geometry2d; - struct shape_io : boost::noncopyable { static const std::string SHP; @@ -89,12 +87,12 @@ public: void move_to(int id); int type() const; const box2d& current_extent() const; - geometry2d * read_polyline(); - geometry2d * read_polylinem(); - geometry2d * read_polylinez(); - geometry2d * read_polygon(); - geometry2d * read_polygonm(); - geometry2d * read_polygonz(); + mapnik::geometry_type * read_polyline(); + mapnik::geometry_type * read_polylinem(); + mapnik::geometry_type * read_polylinez(); + mapnik::geometry_type * read_polygon(); + mapnik::geometry_type * read_polygonm(); + mapnik::geometry_type * read_polygonz(); }; #endif //SHAPE_IO_HPP diff --git a/plugins/input/sqlite/sqlite_featureset.cpp b/plugins/input/sqlite/sqlite_featureset.cpp index 878b4453a..9c70d5f4f 100644 --- a/plugins/input/sqlite/sqlite_featureset.cpp +++ b/plugins/input/sqlite/sqlite_featureset.cpp @@ -41,10 +41,6 @@ using mapnik::box2d; using mapnik::CoordTransform; using mapnik::Feature; using mapnik::feature_ptr; -using mapnik::point_impl; -using mapnik::line_string_impl; -using mapnik::polygon_impl; -using mapnik::geometry2d; using mapnik::geometry_utils; using mapnik::transcoder; diff --git a/plugins/input/templates/helloworld/hello_featureset.cpp b/plugins/input/templates/helloworld/hello_featureset.cpp index f3e53173a..b850e467b 100644 --- a/plugins/input/templates/helloworld/hello_featureset.cpp +++ b/plugins/input/templates/helloworld/hello_featureset.cpp @@ -24,7 +24,7 @@ mapnik::feature_ptr hello_featureset::next() mapnik::coord2d center = box_.center(); // create a new geometry - mapnik::geometry2d * point = new mapnik::point_impl; + mapnik::geometry_type * point = new mapnik::point_impl; // we use path type geometries in Mapnik to fit nicely with AGG and Cairo // here we stick an x,y pair into the geometry diff --git a/src/agg/process_building_symbolizer.cpp b/src/agg/process_building_symbolizer.cpp index 20d62f7a1..b3b98c3ff 100644 --- a/src/agg/process_building_symbolizer.cpp +++ b/src/agg/process_building_symbolizer.cpp @@ -54,8 +54,8 @@ void agg_renderer::process(building_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; - typedef coord_transform3 path_type_roof; + typedef coord_transform2 path_type; + typedef coord_transform3 path_type_roof; typedef agg::renderer_base ren_base; typedef agg::renderer_scanline_aa_solid renderer; @@ -78,11 +78,11 @@ void agg_renderer::process(building_symbolizer const& sym, for (unsigned i=0;i 2) { - boost::scoped_ptr frame(new line_string_impl); - boost::scoped_ptr roof(new polygon_impl); + boost::scoped_ptr frame(new geometry_type(LineString)); + boost::scoped_ptr roof(new geometry_type(Polygon)); std::deque face_segments; double x0(0); double y0(0); @@ -109,7 +109,7 @@ void agg_renderer::process(building_symbolizer const& sym, std::deque::const_iterator itr=face_segments.begin(); for (;itr!=face_segments.end();++itr) { - boost::scoped_ptr faces(new polygon_impl); + boost::scoped_ptr faces(new geometry_type(Polygon)); faces->move_to(itr->get<0>(),itr->get<1>()); faces->line_to(itr->get<2>(),itr->get<3>()); faces->line_to(itr->get<2>(),itr->get<3>() + height); diff --git a/src/agg/process_line_pattern_symbolizer.cpp b/src/agg/process_line_pattern_symbolizer.cpp index 883720fa1..e85d852ce 100644 --- a/src/agg/process_line_pattern_symbolizer.cpp +++ b/src/agg/process_line_pattern_symbolizer.cpp @@ -48,7 +48,7 @@ void agg_renderer::process(line_pattern_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef agg::line_image_pattern pattern_type; typedef agg::renderer_base renderer_base; typedef agg::renderer_outline_image renderer_type; @@ -72,7 +72,7 @@ void agg_renderer::process(line_pattern_symbolizer const& sym, metawriter_with_properties writer = sym.get_metawriter(); for (unsigned i=0;i 1) { path_type path(t_,geom,prj_trans); diff --git a/src/agg/process_line_symbolizer.cpp b/src/agg/process_line_symbolizer.cpp index bfed7721f..3205b1353 100644 --- a/src/agg/process_line_symbolizer.cpp +++ b/src/agg/process_line_symbolizer.cpp @@ -50,7 +50,7 @@ void agg_renderer::process(line_symbolizer const& sym, proj_transform const& prj_trans) { typedef agg::renderer_base ren_base; - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef agg::renderer_outline_aa renderer_oaa; typedef agg::rasterizer_outline_aa rasterizer_outline_aa; typedef agg::renderer_scanline_aa_solid renderer; @@ -73,7 +73,7 @@ void agg_renderer::process(line_symbolizer const& sym, metawriter_with_properties writer = sym.get_metawriter(); for (unsigned i=0;i 1) { path_type path(t_,geom,prj_trans); diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp index 99c3c13ef..67087d88e 100644 --- a/src/agg/process_markers_symbolizer.cpp +++ b/src/agg/process_markers_symbolizer.cpp @@ -49,7 +49,7 @@ void agg_renderer::process(markers_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef agg::pixfmt_rgba32 pixfmt; typedef agg::renderer_base renderer_base; typedef agg::renderer_scanline_aa_solid renderer_solid; @@ -94,7 +94,7 @@ void agg_renderer::process(markers_symbolizer const& sym, for (unsigned i=0; i::process(markers_symbolizer const& sym, for (unsigned i=0; i::process(point_symbolizer const& sym, for (unsigned i=0; i::process(point_symbolizer const& sym, { for (unsigned i=0; i::process(polygon_pattern_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef agg::renderer_base ren_base; typedef agg::wrap_mode_repeat wrap_x_type; typedef agg::wrap_mode_repeat wrap_y_type; @@ -108,7 +108,7 @@ void agg_renderer::process(polygon_pattern_symbolizer const& sym, metawriter_with_properties writer = sym.get_metawriter(); for (unsigned i=0;i 2) { path_type path(t_,geom,prj_trans); diff --git a/src/agg/process_polygon_symbolizer.cpp b/src/agg/process_polygon_symbolizer.cpp index 6cbf3eab1..e284a5c32 100644 --- a/src/agg/process_polygon_symbolizer.cpp +++ b/src/agg/process_polygon_symbolizer.cpp @@ -44,7 +44,7 @@ void agg_renderer::process(polygon_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef agg::renderer_base ren_base; typedef agg::renderer_scanline_aa_solid renderer; @@ -66,7 +66,7 @@ void agg_renderer::process(polygon_symbolizer const& sym, metawriter_with_properties writer = sym.get_metawriter(); for (unsigned i=0;i 2) { path_type path(t_,geom,prj_trans); diff --git a/src/agg/process_shield_symbolizer.cpp b/src/agg/process_shield_symbolizer.cpp index 2b0b57d09..4621223df 100644 --- a/src/agg/process_shield_symbolizer.cpp +++ b/src/agg/process_shield_symbolizer.cpp @@ -43,7 +43,7 @@ void agg_renderer::process(shield_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; typedef agg::pixfmt_rgba32 pixfmt; typedef agg::renderer_base renderer_base; typedef agg::renderer_scanline_aa_solid renderer_solid; @@ -143,7 +143,7 @@ void agg_renderer::process(shield_symbolizer const& sym, for (unsigned i=0;i 0 ) { path_type path(t_,geom,prj_trans); @@ -274,7 +274,7 @@ void agg_renderer::process(shield_symbolizer const& sym, unsigned num_geom = feature.num_geometries(); for (unsigned i=0;i 0 ) { path_type path(t_,geom,prj_trans); diff --git a/src/agg/process_text_symbolizer.cpp b/src/agg/process_text_symbolizer.cpp index c6f1c943b..a621609d9 100644 --- a/src/agg/process_text_symbolizer.cpp +++ b/src/agg/process_text_symbolizer.cpp @@ -40,7 +40,7 @@ void agg_renderer::process(text_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; expression_ptr name_expr = sym.get_name(); if (!name_expr) return; @@ -89,7 +89,7 @@ void agg_renderer::process(text_symbolizer const& sym, unsigned num_geom = feature.num_geometries(); for (unsigned i=0;i 0) // don't bother with empty geometries { placement text_placement(info,sym,scale_factor_); diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index fb7e2bf91..01cd598c5 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -568,7 +568,7 @@ void cairo_renderer_base::process(polygon_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; cairo_context context(context_); @@ -576,7 +576,7 @@ void cairo_renderer_base::process(polygon_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 2) { @@ -600,8 +600,8 @@ void cairo_renderer_base::process(building_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; - typedef coord_transform3 path_type_roof; + typedef coord_transform2 path_type; + typedef coord_transform3 path_type_roof; cairo_context context(context_); @@ -610,12 +610,12 @@ void cairo_renderer_base::process(building_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 2) { - boost::scoped_ptr frame(new line_string_impl); - boost::scoped_ptr roof(new polygon_impl); + boost::scoped_ptr frame(new line_string_impl); + boost::scoped_ptr roof(new polygon_impl); std::deque face_segments; double x0(0); double y0(0); @@ -649,7 +649,7 @@ void cairo_renderer_base::process(building_symbolizer const& sym, std::deque::const_iterator itr = face_segments.begin(); for (; itr != face_segments.end(); ++itr) { - boost::scoped_ptr faces(new polygon_impl); + boost::scoped_ptr faces(new polygon_impl); faces->move_to(itr->get<0>(), itr->get<1>()); faces->line_to(itr->get<2>(), itr->get<3>()); @@ -703,7 +703,7 @@ void cairo_renderer_base::process(line_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; cairo_context context(context_); mapnik::stroke const& stroke_ = sym.get_stroke(); @@ -712,7 +712,7 @@ void cairo_renderer_base::process(line_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 1) { @@ -756,7 +756,7 @@ void cairo_renderer_base::process(point_symbolizer const& sym, { for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); double x; double y; double z = 0; @@ -791,7 +791,7 @@ void cairo_renderer_base::process(shield_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; expression_ptr name_expr = sym.get_name(); if (!name_expr) return; @@ -831,7 +831,7 @@ void cairo_renderer_base::process(shield_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 0) // don't bother with empty geometries { @@ -921,7 +921,7 @@ void cairo_renderer_base::process(line_pattern_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature); boost::optional image = mapnik::image_cache::instance()->find(filename,true); @@ -939,7 +939,7 @@ void cairo_renderer_base::process(line_pattern_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 1) { @@ -990,7 +990,7 @@ void cairo_renderer_base::process(polygon_pattern_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; cairo_context context(context_); std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature); @@ -1006,7 +1006,7 @@ void cairo_renderer_base::process(polygon_pattern_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 2) { @@ -1067,7 +1067,7 @@ void cairo_renderer_base::process(markers_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; arrow arrow_; cairo_context context(context_); @@ -1076,7 +1076,7 @@ void cairo_renderer_base::process(markers_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 1) { @@ -1163,7 +1163,7 @@ void cairo_renderer_base::process(text_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { - typedef coord_transform2 path_type; + typedef coord_transform2 path_type; expression_ptr name_expr = sym.get_name(); if (!name_expr) return; value_type result = boost::apply_visitor(evaluate(feature),*name_expr); @@ -1203,7 +1203,7 @@ void cairo_renderer_base::process(text_symbolizer const& sym, for (unsigned i = 0; i < feature.num_geometries(); ++i) { - geometry2d const& geom = feature.get_geometry(i); + geometry_type const& geom = feature.get_geometry(i); if (geom.num_points() > 0) // don't bother with empty geometries { diff --git a/src/memory_datasource.cpp b/src/memory_datasource.cpp index 3d585d476..eaf736550 100644 --- a/src/memory_datasource.cpp +++ b/src/memory_datasource.cpp @@ -37,7 +37,7 @@ struct accumulate_extent { for (unsigned i=0;inum_geometries();++i) { - geometry2d & geom = feat->get_geometry(i); + geometry_type & geom = feat->get_geometry(i); if ( first_ ) { first_ = false; @@ -100,4 +100,17 @@ size_t memory_datasource::size() const { return features_.size(); } + +// point_datasource + +void point_datasource::add_point(double x, double y, const char* key, const char* value) +{ + feature_ptr feature(feature_factory::create(feat_id++)); + geometry_type * pt = new geometry_type(Point); + pt->move_to(x,y); + feature->add_geometry(pt); + transcoder tr("utf-8"); + (*feature)[key] = tr.transcode(value); + this->push(feature); + } } diff --git a/src/placement_finder.cpp b/src/placement_finder.cpp index eade6379d..10211322b 100644 --- a/src/placement_finder.cpp +++ b/src/placement_finder.cpp @@ -942,7 +942,7 @@ void placement_finder::clear() detector_.clear(); } -typedef coord_transform2 PathType; +typedef coord_transform2 PathType; typedef label_collision_detector4 DetectorType; template class placement_finder; diff --git a/src/svg/process_symbolizers.cpp b/src/svg/process_symbolizers.cpp index 824888617..1cbdf7a21 100644 --- a/src/svg/process_symbolizers.cpp +++ b/src/svg/process_symbolizers.cpp @@ -26,43 +26,43 @@ namespace mapnik { - template - bool svg_renderer::process(rule_type::symbolizers const& syms, - Feature const& feature, - proj_transform const& prj_trans) +template +bool svg_renderer::process(rule_type::symbolizers const& syms, + Feature const& feature, + proj_transform const& prj_trans) +{ + // svg renderer supports processing of multiple symbolizers. + + typedef coord_transform2 path_type; + + // process each symbolizer to collect its (path) information. + // path information (attributes from line_ and polygon_ symbolizers) + // is collected with the path_attributes_ data member. + BOOST_FOREACH(symbolizer const& sym, syms) { - // svg renderer supports processing of multiple symbolizers. + boost::apply_visitor(symbol_dispatch(*this, feature, prj_trans), sym); + } - typedef coord_transform2 path_type; + // generate path output for each geometry of the current feature. + for(unsigned i=0; i 1) + { + path_type path(t_, geom, prj_trans); + generator_.generate_path(path, path_attributes_); + } + } - // process each symbolizer to collect its (path) information. - // path information (attributes from line_ and polygon_ symbolizers) - // is collected with the path_attributes_ data member. - BOOST_FOREACH(symbolizer const& sym, syms) - { - boost::apply_visitor(symbol_dispatch(*this, feature, prj_trans), sym); - } + // set the previously collected values back to their defaults + // for the feature that will be processed next. + path_attributes_.reset(); - // generate path output for each geometry of the current feature. - for(unsigned i=0; i 1) - { - path_type path(t_, geom, prj_trans); - generator_.generate_path(path, path_attributes_); - } - } + return true; +}; - // set the previously collected values back to their defaults - // for the feature that will be processed next. - path_attributes_.reset(); - - return true; - }; - - template bool svg_renderer >::process(rule_type::symbolizers const& syms, - Feature const& feature, - proj_transform const& prj_trans); +template bool svg_renderer >::process(rule_type::symbolizers const& syms, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/wkb.cpp b/src/wkb.cpp index 81709071f..08c7bebd7 100644 --- a/src/wkb.cpp +++ b/src/wkb.cpp @@ -203,7 +203,7 @@ private: void read_point(Feature & feature) { - geometry2d * pt = new geometry2d;//new point; + geometry_type * pt = new geometry_type(Point); double x = read_double(); double y = read_double(); pt->move_to(x,y); @@ -222,7 +222,7 @@ private: void read_multipoint_2(Feature & feature) { - geometry2d * pt = new geometry2d;//point; + geometry_type * pt = new geometry_type(Point); int num_points = read_integer(); for (int i=0;i; + geometry_type * line = new geometry_type(LineString); int num_points=read_integer(); CoordinateArray ar(num_points); read_coords(ar); @@ -261,7 +261,7 @@ private: void read_multilinestring_2(Feature & feature) { - geometry2d * line = new geometry2d;//line_string; + geometry_type * line = new geometry_type(LineString); int num_lines=read_integer(); unsigned capacity = 0; for (int i=0;i; + geometry_type * poly = new geometry_type(Polygon); int num_rings=read_integer(); unsigned capacity = 0; for (int i=0;i; + geometry_type * poly = new geometry_type(Polygon); int num_polys=read_integer(); unsigned capacity = 0; for (int i=0;i 0) { - geometry2d const& geom=feat.get_geometry(0); + geometry_type const& geom=feat.get_geometry(0); box2d bbox = geom.envelope(); if (valid_envelope(bbox)) {