C++ 变量几何算法断言失败
我想要一个地理区域几何图形的C++ 变量几何算法断言失败,c++,boost,boost-geometry,C++,Boost,Boost Geometry,我想要一个地理区域几何图形的std::vector。其中一些区域是连续的,并由多边形表示。有些区域是不连续的,由多个多边形表示。我的计划是使用std::vector来处理这种差异 polygon和multipolygon都满足了几何概念,因此我们应该能够调用任意一个的信封。这是可行的,但我似乎无法在变体上调用信封 我不认为这与此有关,因为我使用的是boost版本1.55.0 注释行后面的if语句是可行的,但它看起来像是一个黑客。有没有一种方法可以让它在不枚举变量中的不同类型的情况下工作?您可以使
std::vector
。其中一些区域是连续的,并由多边形表示。有些区域是不连续的,由多个多边形表示。我的计划是使用std::vector
来处理这种差异
polygon
和multipolygon
都满足了几何概念,因此我们应该能够调用任意一个的信封。这是可行的,但我似乎无法在变体上调用信封
我不认为这与此有关,因为我使用的是boost版本1.55.0
注释行后面的if语句是可行的,但它看起来像是一个黑客。有没有一种方法可以让它在不枚举变量中的不同类型的情况下工作?您可以使用boost::static\u visitor
创建一个多态函数,对变量进行调度:
static const envelope_ generic_envelope { };
// ...
generic_envelope(county,bb);
其中信封
定义为:
struct envelope_ : boost::static_visitor<void> {
template <typename... T> //dispatch
void operator()(boost::variant<T...> const& v, box& bb) const {
boost::apply_visitor(boost::bind(*this, ::_1, boost::ref(bb)), v);
}
template <typename T> // relay
void operator()(T const& v, box& bb) const {
bg::envelope(v, bb);
}
};
结构信封:boost::static\u访问者{
模板//发送
void操作符()(boost::variant const&v,box&bb)const{
boost::apply_visitor(boost::bind(*this,::_1,boost::ref(bb)),v);
}
模板//中继
void运算符()(T常量和v、长方体和bb)常量{
bg::信封(v,bb);
}
};
查看它
完整程序
供日后参考:
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <boost/variant.hpp>
#include <boost/bind.hpp>
namespace bg = boost::geometry;
typedef bg::model::point<double, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef bg::model::polygon<point, true, true> polygon; //cw, closed polygon
typedef bg::model::multi_polygon<polygon> multipolygon;
typedef boost::variant<polygon,multipolygon> star_polygon;
struct envelope_ : boost::static_visitor<void>
{
template <typename... T> //dispatch
void operator()(boost::variant<T...> const& v, box& bb) const {
boost::apply_visitor(boost::bind(*this, ::_1, boost::ref(bb)), v);
}
template <typename T> // relay
void operator()(T const& v, box& bb) const {
bg::envelope(v, bb);
}
};
int main(void){
static const envelope_ generic_envelope { };
polygon staunton_county;
bg::read_wkt("POLYGON ((-79.091666 38.132142, -79.09711 38.184771,"
" -79.02301 38.195777, -79.049779 38.121112, -79.091666 38.132142))",
staunton_county);
multipolygon dickson_county;
bg::read_wkt("MULTIPOLYGON (((-87.151995 36.289037, -87.146906 36.293344,"
" -87.144172 36.292142, -87.142315 36.294607, -87.139332 36.292418,"
" -87.14237199999999 36.290684, -87.151995 36.289037)),"
" ((-87.20424199999999 35.959186, -87.53453 35.993074,"
" -87.56679800000001 36.177857, -87.513533 36.334713,"
" -87.286501 36.321933, -87.17730299999999 36.314145,"
" -87.14987600000001 36.176878, -87.182573 36.049726,"
" -87.20424199999999 35.959186)))",
dickson_county);
box bb;
bg::envelope(staunton_county,bb);
std::cout << bg::dsv(bb) << std::endl;
bg::envelope(dickson_county,bb);;
std::cout << bg::dsv(bb) << std::endl;
star_polygon county;
county = staunton_county;
generic_envelope(county,bb);
std::cout << bg::dsv(bb) << std::endl;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
名称空间bg=boost::geometry;
typedef bg::model::point;
typedef bg::model::box;
typedef bg::model::polygon polygon//闭多边形
typedef bg::model::multi_多边形multipolygon;
typedef boost::variant star_多边形;
结构信封:boost::static\u访问者
{
模板//发送
void操作符()(boost::variant const&v,box&bb)const{
boost::apply_visitor(boost::bind(*this,::_1,boost::ref(bb)),v);
}
模板//中继
void运算符()(T常量和v、长方体和bb)常量{
bg::信封(v,bb);
}
};
内部主(空){
静态常数包络{泛型{};
斯汤顿乌县;
bg::read_wkt(“多边形(-79.091666 38.132142,--79.09711 38.184771,”
" -79.02301 38.195777, -79.049779 38.121112, -79.091666 38.132142))",
斯汤顿尤县);
多边形迪克森县;
bg::read_wkt(“多多边形((-87.151995 36.289037,--87.146906 36.293344,”
" -87.144172 36.292142, -87.142315 36.294607, -87.139332 36.292418,"
" -87.14237199999999 36.290684, -87.151995 36.289037)),"
" ((-87.20424199999999 35.959186, -87.53453 35.993074,"
" -87.56679800000001 36.177857, -87.513533 36.334713,"
" -87.286501 36.321933, -87.17730299999999 36.314145,"
" -87.14987600000001 36.176878, -87.182573 36.049726,"
" -87.20424199999999 35.959186)))",
迪克森县);
框bb;
bg::信封(斯丹顿尤县,bb);
std::你看起来只是包含boost变量定义的转发声明。你能在上面的代码段中包含include语句吗?@dma你完全正确。我忘了包含boost/variant.hpp。我现在收到一个新错误,所以我将更新帖子。如果它与你相关:.c++1y会吗如果为它更新了boost::apply\u visitor
,那么就可以让它更加简洁。。。
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <boost/variant.hpp>
#include <boost/bind.hpp>
namespace bg = boost::geometry;
typedef bg::model::point<double, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef bg::model::polygon<point, true, true> polygon; //cw, closed polygon
typedef bg::model::multi_polygon<polygon> multipolygon;
typedef boost::variant<polygon,multipolygon> star_polygon;
struct envelope_ : boost::static_visitor<void>
{
template <typename... T> //dispatch
void operator()(boost::variant<T...> const& v, box& bb) const {
boost::apply_visitor(boost::bind(*this, ::_1, boost::ref(bb)), v);
}
template <typename T> // relay
void operator()(T const& v, box& bb) const {
bg::envelope(v, bb);
}
};
int main(void){
static const envelope_ generic_envelope { };
polygon staunton_county;
bg::read_wkt("POLYGON ((-79.091666 38.132142, -79.09711 38.184771,"
" -79.02301 38.195777, -79.049779 38.121112, -79.091666 38.132142))",
staunton_county);
multipolygon dickson_county;
bg::read_wkt("MULTIPOLYGON (((-87.151995 36.289037, -87.146906 36.293344,"
" -87.144172 36.292142, -87.142315 36.294607, -87.139332 36.292418,"
" -87.14237199999999 36.290684, -87.151995 36.289037)),"
" ((-87.20424199999999 35.959186, -87.53453 35.993074,"
" -87.56679800000001 36.177857, -87.513533 36.334713,"
" -87.286501 36.321933, -87.17730299999999 36.314145,"
" -87.14987600000001 36.176878, -87.182573 36.049726,"
" -87.20424199999999 35.959186)))",
dickson_county);
box bb;
bg::envelope(staunton_county,bb);
std::cout << bg::dsv(bb) << std::endl;
bg::envelope(dickson_county,bb);;
std::cout << bg::dsv(bb) << std::endl;
star_polygon county;
county = staunton_county;
generic_envelope(county,bb);
std::cout << bg::dsv(bb) << std::endl;
}