| 1 | #include <iostream> | 
|---|
| 2 |  | 
|---|
| 3 | #include <boost/geometry/geometry.hpp> | 
|---|
| 4 |  | 
|---|
| 5 | #include <boost/geometry/geometries/point_xy.hpp> | 
|---|
| 6 | #include <boost/geometry/geometries/polygon.hpp> | 
|---|
| 7 | #include <boost/geometry/geometries/multi_polygon.hpp> | 
|---|
| 8 |  | 
|---|
| 9 | #include <boost/geometry/algorithms/buffer.hpp> | 
|---|
| 10 |  | 
|---|
| 11 | #include <boost/geometry/strategies/cartesian/buffer_join_miter.hpp> | 
|---|
| 12 | #include <boost/geometry/strategies/cartesian/buffer_end_flat.hpp> | 
|---|
| 13 | #include <boost/geometry/strategies/cartesian/buffer_point_square.hpp> | 
|---|
| 14 | #include <boost/geometry/strategies/cartesian/buffer_side_straight.hpp> | 
|---|
| 15 |  | 
|---|
| 16 | #include <boost/geometry/io/wkt/read.hpp> | 
|---|
| 17 | #include <boost/geometry/io/wkt/write.hpp> | 
|---|
| 18 |  | 
|---|
| 19 | using namespace std; | 
|---|
| 20 |  | 
|---|
| 21 | int main(int argc, char** argv) | 
|---|
| 22 | { | 
|---|
| 23 | typedef double coordinate_type; | 
|---|
| 24 | typedef boost::geometry::model::d2::point_xy<coordinate_type> point_xy_type; | 
|---|
| 25 | typedef boost::geometry::model::polygon<point_xy_type> polygon_type; | 
|---|
| 26 | boost::geometry::strategy::buffer::end_flat end_strategy; | 
|---|
| 27 | boost::geometry::strategy::buffer::point_square point_strategy; | 
|---|
| 28 | boost::geometry::strategy::buffer::side_straight side_strategy; | 
|---|
| 29 |  | 
|---|
| 30 | vector<string> polygon_geometries; | 
|---|
| 31 | polygon_geometries.push_back("POLYGON((897866.5 6272518.7,897882.5 6272519.2,897882.6 6272519,897883.3 6272508.7,897883.5 6272505.5,897855 6272503.5,897852.4 6272505.6,897850.1 6272517.6,897860.8 6272518.5,897866.5 6272518.7))"); | 
|---|
| 32 | polygon_geometries.push_back("POLYGON((898882.3 6271337.3,898895.7 6271339.9,898898 6271328.3,898881.6 6271325.1,898879.3 6271336.7,898882.3 6271337.3))"); | 
|---|
| 33 | polygon_geometries.push_back("POLYGON((897558.7 6272055,897552.5 6272054.2,897552.5 6272053.7,897546.1 6272052.7,897545.6 6272057.7,897560.7 6272059.6,897560.9 6272055.3,897558.7 6272055))"); | 
|---|
| 34 | polygon_geometries.push_back("POLYGON((898563.3 6272366.9,898554.7 6272379.2,898559.7 6272382.3,898561.6 6272379.4,898568.7 6272369.1,898563.8 6272366.2,898563.3 6272366.9))"); | 
|---|
| 35 |  | 
|---|
| 36 | for(unsigned int i=0;i<polygon_geometries.size();++i) | 
|---|
| 37 | { | 
|---|
| 38 | for(unsigned int j=0;j<100;++j) | 
|---|
| 39 | { | 
|---|
| 40 | double offset_distance = j/10.; | 
|---|
| 41 |  | 
|---|
| 42 | boost::geometry::strategy::buffer::distance_symmetric<coordinate_type> distance_strategy(offset_distance); | 
|---|
| 43 | boost::geometry::strategy::buffer::join_miter join_strategy(offset_distance); | 
|---|
| 44 |  | 
|---|
| 45 | polygon_type input; | 
|---|
| 46 | boost::geometry::model::multi_polygon<polygon_type> output; | 
|---|
| 47 |  | 
|---|
| 48 | boost::geometry::read_wkt(polygon_geometries[i], input); | 
|---|
| 49 | // Just to give it a try, but does not change anything | 
|---|
| 50 | //boost::geometry::correct(input); | 
|---|
| 51 |  | 
|---|
| 52 | /* | 
|---|
| 53 | for(unsigned int k=0;k<input.outer().size();++k) | 
|---|
| 54 | input.outer()[k] = point_xy_type(input.outer()[k].x() - input.outer()[0].x() , input.outer()[k].y() - input.outer()[0].y()); | 
|---|
| 55 | */ | 
|---|
| 56 |  | 
|---|
| 57 | boost::geometry::buffer(input, output, distance_strategy, side_strategy, join_strategy, end_strategy, point_strategy); | 
|---|
| 58 |  | 
|---|
| 59 | if(output.size() == 0) | 
|---|
| 60 | cout << "Unable to offset (" << offset_distance << ") input polygon with index " << i << endl; | 
|---|
| 61 | } | 
|---|
| 62 | } | 
|---|
| 63 |  | 
|---|
| 64 | return 0; | 
|---|
| 65 | } | 
|---|