geometry::multi_point - derive from std::vector<point<T>> instead of line_string<T>

This commit is contained in:
artemp 2016-04-12 10:12:16 +02:00
parent fb385180cf
commit 2e0d83aa91
6 changed files with 33 additions and 13 deletions

View file

@ -36,7 +36,14 @@
namespace mapnik { namespace geometry {
template <typename T>
struct multi_point : line_string<T> {};
struct multi_point : std::vector<point<T>>
{
multi_point() = default;
explicit multi_point(std::size_t size)
: std::vector<point<T> >(size) {}
inline std::size_t num_points() const { return std::vector<point<T>>::size(); }
inline void add_coord(T x, T y) { std::vector<point<T>>::template emplace_back(x,y);}
};
template <typename T>
struct multi_line_string : std::vector<line_string<T>> {};

View file

@ -332,7 +332,11 @@ struct geom_reproj_visitor {
template <typename T>
bool operator() (multi_point<T> & mp) const
{
return (*this) (static_cast<line_string<T> &>(mp));
if (proj_trans_.forward(mp) > 0)
{
return false;
}
return true;
}
template <typename T>

View file

@ -26,12 +26,13 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/util/noncopyable.hpp>
// stl
#include <vector>
namespace mapnik {
namespace geometry {
template <typename T> struct point;
template <typename T> struct line_string;
}
class projection;
template <typename T> class box2d;
@ -50,8 +51,8 @@ public:
bool backward (double *x, double *y , double *z, int point_count, int offset = 1) const;
bool forward (geometry::point<double> & p) const;
bool backward (geometry::point<double> & p) const;
unsigned int forward (geometry::line_string<double> & ls) const;
unsigned int backward (geometry::line_string<double> & ls) const;
unsigned int forward (std::vector<geometry::point<double>> & ls) const;
unsigned int backward (std::vector<geometry::point<double>> & ls) const;
bool forward (box2d<double> & box) const;
bool backward (box2d<double> & box) const;
bool forward (box2d<double> & box, int points) const;

View file

@ -26,7 +26,7 @@
// mapnik
#include <mapnik/global.hpp> // for M_PI on windows
#include <mapnik/enumeration.hpp>
#include <mapnik/geometry.hpp>
#include <mapnik/geometry/point.hpp>
#pragma GCC diagnostic push
#include <mapnik/warning_ignore.hpp>
@ -35,6 +35,7 @@
// stl
#include <cmath>
#include <vector>
namespace mapnik {
@ -93,9 +94,9 @@ static inline bool merc2lonlat(double * x, double * y , int point_count)
return true;
}
static inline bool lonlat2merc(geometry::line_string<double> & ls)
static inline bool lonlat2merc(std::vector<geometry::point<double>> & ls)
{
for(auto & p : ls)
for (auto& p : ls)
{
if (p.x > 180) p.x = 180;
else if (p.x < -180) p.x = -180;
@ -108,7 +109,7 @@ static inline bool lonlat2merc(geometry::line_string<double> & ls)
return true;
}
static inline bool merc2lonlat(geometry::line_string<double> & ls)
static inline bool merc2lonlat(std::vector<geometry::point<double>> & ls)
{
for (auto & p : ls)
{

View file

@ -102,7 +102,7 @@ bool proj_transform::forward (geometry::point<double> & p) const
return forward(&(p.x), &(p.y), &z, 1);
}
unsigned int proj_transform::forward (geometry::line_string<double> & ls) const
unsigned int proj_transform::forward (std::vector<geometry::point<double>> & ls) const
{
std::size_t size = ls.size();
if (size == 0) return 0;
@ -242,7 +242,7 @@ bool proj_transform::backward (geometry::point<double> & p) const
return backward(&(p.x), &(p.y), &z, 1);
}
unsigned int proj_transform::backward (geometry::line_string<double> & ls) const
unsigned int proj_transform::backward (std::vector<geometry::point<double>> & ls) const
{
std::size_t size = ls.size();
if (size == 0) return 0;

View file

@ -119,7 +119,7 @@ struct geometry_equal_visitor
}
template <typename T>
void operator() (line_string<T> const& ls1, line_string<T> const& ls2) const
void operator() (std::vector<point<T>> const& ls1, std::vector<point<T>> const& ls2) const
{
if (ls1.size() != ls2.size())
{
@ -149,12 +149,19 @@ struct geometry_equal_visitor
}
}
template <typename T>
void operator() (line_string<T> const& ls1, line_string<T> const& ls2) const
{
(*this)(static_cast<std::vector<point<T>> const&>(ls1), static_cast<std::vector<point<T>> const&>(ls2));
}
template <typename T>
void operator() (multi_point<T> const& mp1, multi_point<T> const& mp2) const
{
(*this)(static_cast<line_string<T> const&>(mp1), static_cast<line_string<T> const&>(mp2));
(*this)(static_cast<std::vector<point<T>> const&>(mp1), static_cast<std::vector<point<T>> const&>(mp2));
}
template <typename T>
void operator() (multi_line_string<T> const& mls1, multi_line_string<T> const& mls2) const
{