用 boost::geometry 扩展多边形?
Expand polygons with boost::geometry?
我知道可以 add/subtract 不同的多边形 to/from 通过 boost::geometry 相互连接,示例可以在 web 的不同位置找到。现在我想做的是不同的事情:
我有一个 2D 多边形,我想按给定大小 expand/shrink。所以我不是在谈论一个简单的缩放操作,而是一个函数,它从输入数据中计算出一个新的多边形:
在扩展函数的情况下,必须在输入多边形的角处添加新的坐标点,例如在这个位置的圆角或平角
如果输入多边形的收缩函数向量太小而无法“生存”收缩操作,则必须完全删除它们
我的问题:boost::geometry 可以进行这样的操作吗?如果是,如何做到这一点?
谢谢!
此功能在 OGC 简单功能规范中称为“缓冲”。
Boost Geometry 支持大多数 2D 笛卡尔几何(您可以通过转换轻松完成其余部分),并且仅在其他坐标系中指向。
可用策略:
- 加入策略:join_round (cartesian)
- 加入策略:join_miter (cartesian)
- 结束策略:end_round (cartesian)
- 结束策略:end_flat (cartesian)
- 距离策略:distance_symmetric
- 距离策略:distance_asymmetric
- 点策略:point_circle (cartesian)
- 点策略:point_square (cartesian)
- 点策略:geographic_point_circle (geographic)
- 侧面策略:side_straight (cartesian)
这是示例代码
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/geometries.hpp>
int main()
{
typedef double coordinate_type;
typedef boost::geometry::model::d2::point_xy<coordinate_type> point;
typedef boost::geometry::model::polygon<point> polygon;
// Declare strategies
const double buffer_distance = 1.0;
const int points_per_circle = 36;
boost::geometry::strategy::buffer::distance_symmetric<coordinate_type> distance_strategy(buffer_distance);
boost::geometry::strategy::buffer::join_round join_strategy(points_per_circle);
boost::geometry::strategy::buffer::end_round end_strategy(points_per_circle);
boost::geometry::strategy::buffer::point_circle circle_strategy(points_per_circle);
boost::geometry::strategy::buffer::side_straight side_strategy;
// Declare output
boost::geometry::model::multi_polygon<polygon> result;
// Declare/fill a linestring
boost::geometry::model::linestring<point> ls;
boost::geometry::read_wkt("LINESTRING(0 0,4 5,7 4,10 6)", ls);
// Create the buffer of a linestring
boost::geometry::buffer(ls, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
// Declare/fill a multi point
boost::geometry::model::multi_point<point> mp;
boost::geometry::read_wkt("MULTIPOINT((3 3),(4 4),(6 2))", mp);
// Create the buffer of a multi point
boost::geometry::buffer(mp, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
// Declare/fill a multi_polygon
boost::geometry::model::multi_polygon<polygon> mpol;
boost::geometry::read_wkt("MULTIPOLYGON(((0 1,2 5,5 3,0 1)),((1 1,5 2,5 0,1 1)))", mpol);
// Create the buffer of a multi polygon
boost::geometry::buffer(mpol, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
return 0;
}
积分可以这样“一起成长”
带圆角的线串示例:
我知道可以 add/subtract 不同的多边形 to/from 通过 boost::geometry 相互连接,示例可以在 web 的不同位置找到。现在我想做的是不同的事情:
我有一个 2D 多边形,我想按给定大小 expand/shrink。所以我不是在谈论一个简单的缩放操作,而是一个函数,它从输入数据中计算出一个新的多边形:
在扩展函数的情况下,必须在输入多边形的角处添加新的坐标点,例如在这个位置的圆角或平角
如果输入多边形的收缩函数向量太小而无法“生存”收缩操作,则必须完全删除它们
我的问题:boost::geometry 可以进行这样的操作吗?如果是,如何做到这一点?
谢谢!
此功能在 OGC 简单功能规范中称为“缓冲”。
Boost Geometry 支持大多数 2D 笛卡尔几何(您可以通过转换轻松完成其余部分),并且仅在其他坐标系中指向。
可用策略:
- 加入策略:join_round (cartesian)
- 加入策略:join_miter (cartesian)
- 结束策略:end_round (cartesian)
- 结束策略:end_flat (cartesian)
- 距离策略:distance_symmetric
- 距离策略:distance_asymmetric
- 点策略:point_circle (cartesian)
- 点策略:point_square (cartesian)
- 点策略:geographic_point_circle (geographic)
- 侧面策略:side_straight (cartesian)
这是示例代码
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/geometries.hpp>
int main()
{
typedef double coordinate_type;
typedef boost::geometry::model::d2::point_xy<coordinate_type> point;
typedef boost::geometry::model::polygon<point> polygon;
// Declare strategies
const double buffer_distance = 1.0;
const int points_per_circle = 36;
boost::geometry::strategy::buffer::distance_symmetric<coordinate_type> distance_strategy(buffer_distance);
boost::geometry::strategy::buffer::join_round join_strategy(points_per_circle);
boost::geometry::strategy::buffer::end_round end_strategy(points_per_circle);
boost::geometry::strategy::buffer::point_circle circle_strategy(points_per_circle);
boost::geometry::strategy::buffer::side_straight side_strategy;
// Declare output
boost::geometry::model::multi_polygon<polygon> result;
// Declare/fill a linestring
boost::geometry::model::linestring<point> ls;
boost::geometry::read_wkt("LINESTRING(0 0,4 5,7 4,10 6)", ls);
// Create the buffer of a linestring
boost::geometry::buffer(ls, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
// Declare/fill a multi point
boost::geometry::model::multi_point<point> mp;
boost::geometry::read_wkt("MULTIPOINT((3 3),(4 4),(6 2))", mp);
// Create the buffer of a multi point
boost::geometry::buffer(mp, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
// Declare/fill a multi_polygon
boost::geometry::model::multi_polygon<polygon> mpol;
boost::geometry::read_wkt("MULTIPOLYGON(((0 1,2 5,5 3,0 1)),((1 1,5 2,5 0,1 1)))", mpol);
// Create the buffer of a multi polygon
boost::geometry::buffer(mpol, result,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
return 0;
}
积分可以这样“一起成长”
带圆角的线串示例: