diff --git a/doc/doxy/Doxyfile b/doc/doxy/Doxyfile index 8c6ec4b8d..c64ecaa9a 100644 --- a/doc/doxy/Doxyfile +++ b/doc/doxy/Doxyfile @@ -57,7 +57,6 @@ ALIASES = qbk{1}="\xmlonly \1 \endxmlonly" \ tparam_radius="numeric type for radius (of sphere, earth)" \ tparam_container="container type, for example std::vector, std::deque" \ tparam_dimension_required="Dimension, this template parameter is required. Should contain \\[0 .. n-1\\] for an n-dimensional geometry" \ - tparam_first_point="first point type" \ tparam_functor="Function or class with operator()" \ tparam_output_collection="output collection, either a multi-geometry, or a std::vector / std::deque etc" \ tparam_geometry="Any type fulfilling a Geometry Concept" \ @@ -67,8 +66,10 @@ ALIASES = qbk{1}="\xmlonly \1 \endxmlonly" \ tparam_out{1}="A valid output iterator type, accepting geometries of \1 Concept" \ tparam_point="Any type fulfilling a Point Concept" \ tparam_range_point="Any type fulfilling a Range Concept where it range_value type fulfills the Point Concept" \ - tparam_first_point="point type" \ + tparam_first_point="first point type" \ + tparam_first_box="first box type" \ tparam_second_point="second point type" \ + tparam_second_box="second box type" \ tparam_segment_point="segment point type" \ tparam_strategy{1}="Any type fulfilling a \1 Strategy Concept" \ tparam_strategy_overlay="Compound strategy for segment intersection" \ @@ -176,9 +177,13 @@ WARN_LOGFILE = INPUT = . .. ../../../../boost/geometry/core \ ../../../../boost/geometry/algorithms \ ../../../../boost/geometry/algorithms/detail \ - ../../../../boost/geometry/algorithms/detail/overlay \ + ../../../../boost/geometry/algorithms/detail/distance \ ../../../../boost/geometry/algorithms/detail/equals \ + ../../../../boost/geometry/algorithms/detail/overlay \ + ../../../../boost/geometry/algorithms/detail/relate \ ../../../../boost/geometry/algorithms/detail/sections \ + ../../../../boost/geometry/algorithms/detail/turns \ + ../../../../boost/geometry/algorithms/detail/within \ ../../../../boost/geometry/arithmetic \ ../../../../boost/geometry/geometries/concepts \ ../../../../boost/geometry/geometries \ diff --git a/doc/geometry.qbk b/doc/geometry.qbk index 7ff1d6512..d57e3cfaa 100644 --- a/doc/geometry.qbk +++ b/doc/geometry.qbk @@ -113,6 +113,7 @@ Boost.Geometry contains contributions by: * Federico Fern\u00E1ndez (preliminary version of R-tree spatial index) * Karsten Ahnert (patch for cross-track distance) * Mats Taraldsvik (documentation: adapting a legacy model) +* Samuel Debionne (variant support for distance) [include imports.qbk] diff --git a/doc/html/img/index/rtree/knn_box_box.png b/doc/html/img/index/rtree/knn_box_box.png new file mode 100644 index 000000000..6f70f884d Binary files /dev/null and b/doc/html/img/index/rtree/knn_box_box.png differ diff --git a/doc/html/img/index/rtree/knn_pt_box.png b/doc/html/img/index/rtree/knn_pt_box.png new file mode 100644 index 000000000..af9c14874 Binary files /dev/null and b/doc/html/img/index/rtree/knn_pt_box.png differ diff --git a/doc/html/img/index/rtree/knn_seg_box.png b/doc/html/img/index/rtree/knn_seg_box.png new file mode 100644 index 000000000..13288d1ac Binary files /dev/null and b/doc/html/img/index/rtree/knn_seg_box.png differ diff --git a/doc/html/img/index/rtree/rtree_pt.png b/doc/html/img/index/rtree/rtree_pt.png new file mode 100644 index 000000000..8c3f5807e Binary files /dev/null and b/doc/html/img/index/rtree/rtree_pt.png differ diff --git a/doc/html/img/index/rtree/rtree_pt_disjoint_box.png b/doc/html/img/index/rtree/rtree_pt_disjoint_box.png new file mode 100644 index 000000000..e82275f1a Binary files /dev/null and b/doc/html/img/index/rtree/rtree_pt_disjoint_box.png differ diff --git a/doc/html/img/index/rtree/rtree_pt_intersects_box.png b/doc/html/img/index/rtree/rtree_pt_intersects_box.png new file mode 100644 index 000000000..46baf009b Binary files /dev/null and b/doc/html/img/index/rtree/rtree_pt_intersects_box.png differ diff --git a/doc/html/img/index/rtree/rtree_pt_knn_box.png b/doc/html/img/index/rtree/rtree_pt_knn_box.png new file mode 100644 index 000000000..237de694c Binary files /dev/null and b/doc/html/img/index/rtree/rtree_pt_knn_box.png differ diff --git a/doc/html/img/index/rtree/rtree_pt_knn_pt.png b/doc/html/img/index/rtree/rtree_pt_knn_pt.png new file mode 100644 index 000000000..55d0a2d38 Binary files /dev/null and b/doc/html/img/index/rtree/rtree_pt_knn_pt.png differ diff --git a/doc/html/img/index/rtree/rtree_pt_knn_seg.png b/doc/html/img/index/rtree/rtree_pt_knn_seg.png new file mode 100644 index 000000000..fc3e13811 Binary files /dev/null and b/doc/html/img/index/rtree/rtree_pt_knn_seg.png differ diff --git a/doc/html/img/index/rtree/rtree_seg.png b/doc/html/img/index/rtree/rtree_seg.png new file mode 100644 index 000000000..080433318 Binary files /dev/null and b/doc/html/img/index/rtree/rtree_seg.png differ diff --git a/doc/html/img/index/rtree/rtree_seg_disjoint_box.png b/doc/html/img/index/rtree/rtree_seg_disjoint_box.png new file mode 100644 index 000000000..72cc1e71a Binary files /dev/null and b/doc/html/img/index/rtree/rtree_seg_disjoint_box.png differ diff --git a/doc/html/img/index/rtree/rtree_seg_intersects_box.png b/doc/html/img/index/rtree/rtree_seg_intersects_box.png new file mode 100644 index 000000000..b6135eeda Binary files /dev/null and b/doc/html/img/index/rtree/rtree_seg_intersects_box.png differ diff --git a/doc/html/img/index/rtree/rtree_seg_knn_box.png b/doc/html/img/index/rtree/rtree_seg_knn_box.png new file mode 100644 index 000000000..251117688 Binary files /dev/null and b/doc/html/img/index/rtree/rtree_seg_knn_box.png differ diff --git a/doc/html/img/index/rtree/rtree_seg_knn_pt.png b/doc/html/img/index/rtree/rtree_seg_knn_pt.png new file mode 100644 index 000000000..8def78502 Binary files /dev/null and b/doc/html/img/index/rtree/rtree_seg_knn_pt.png differ diff --git a/doc/html/img/index/rtree/rtree_seg_knn_seg.png b/doc/html/img/index/rtree/rtree_seg_knn_seg.png new file mode 100644 index 000000000..68891d685 Binary files /dev/null and b/doc/html/img/index/rtree/rtree_seg_knn_seg.png differ diff --git a/doc/imports.qbk b/doc/imports.qbk index 8ef073ab1..3d4706f2e 100644 --- a/doc/imports.qbk +++ b/doc/imports.qbk @@ -105,6 +105,8 @@ [import src/examples/geometries/register/multi_polygon.cpp] [import src/examples/io/svg.cpp] +[import src/examples/io/wkt.cpp] +[import src/examples/io/read_wkt.cpp] [import src/examples/views/box_view.cpp] [import src/examples/views/segment_view.cpp] diff --git a/doc/index/introduction.qbk b/doc/index/introduction.qbk index cb7bcf1d3..8e20ff903 100644 --- a/doc/index/introduction.qbk +++ b/doc/index/introduction.qbk @@ -51,7 +51,7 @@ The examples of structures of trees created by use of different algorithms and e [table [[] [Linear algorithm] [Quadratic algorithm] [R*-tree] [Packing algorithm]] [[*Example structure*] [[$img/index/rtree/linear.png]] [[$img/index/rtree/quadratic.png]] [[$img/index/rtree/rstar.png]] [[$img/index/rtree/bulk.png]]] -[[*1M Values inserts*] [1.76s] [2.47s] [6.19s] [1.67s]] +[[*1M Values inserts*] [1.76s] [2.47s] [6.19s] [0.64s]] [[*100k spatial queries*] [2.21s] [0.51s] [0.12s] [0.07s]] [[*100k knn queries*] [6.37s] [2.09s] [0.64s] [0.52s]] ] diff --git a/doc/index/rtree/creation.qbk b/doc/index/rtree/creation.qbk index 0cb5d998b..6ea609b08 100644 --- a/doc/index/rtree/creation.qbk +++ b/doc/index/rtree/creation.qbk @@ -30,13 +30,20 @@ __rtree__ has 5 parameters but only 2 are required: __rtree__ may store `__value__`s of any type as long as passed function objects know how to interpret those `__value__`s, that is extract an `__indexable__` that the __rtree__ can handle and compare `__value__`s. +The `__indexable__` is a type adapted to Point, Box or Segment concept. +The examples of rtrees storing `__value__`s translatable to various `__indexable__`s are presented below. + +[table +[[rtree] [rtree] [rtree]] +[[[$img/index/rtree/rtree_pt.png]] [[$img/index/rtree/rstar.png]] [[$img/index/rtree/rtree_seg.png]]] +] By default function objects `index::indexable` and `index::equal_to` are defined for some typically used `__value__` types which may be stored without defining any additional classes. By default the rtree may store pure `__indexable__`s, pairs and tuples. In the case of those two collection types, the `__indexable__` must be the first stored type. -* `__indexable__ = __point__ | __box__` -* `__value__ = Indexable | std::pair<__indexable__, T> | tuple<__indexable__, ...>` +* `__indexable__ = __point__ | __box__ | Segment` +* `__value__ = Indexable | std::pair<__indexable__, T> | boost::tuple<__indexable__, ...> [ | std::tuple<__indexable__, ...> ]` By default `boost::tuple<...>` is supported on all compilers. If the compiler supports C++11 tuples and variadic templates then `std::tuple<...>` may be used "out of the box" as well. @@ -46,6 +53,7 @@ Examples of default `__value__` types: geometry::model::point<...> geometry::model::point_xy<...> geometry::model::box<...> + geometry::model::segment<...> std::pair, unsigned> boost::tuple, int, float> @@ -55,7 +63,7 @@ The predefined `index::indexable` returns const reference to the `__index The predefined `index::equal_to`: -* for `__point__` and `__box__` - compares `__value__`s with geometry::equals(). +* for `__point__`, `__box__` and `Segment` - compares `__value__`s with geometry::equals(). * for `std::pair<...>` - compares both components of the `__value__`. The first value stored in the pair is compared before the second one. If the value stored in the pair is a Geometry, `geometry::equals()` is used. For other types it uses `operator==()`. * for `tuple<...>` - compares all components of the `__value__`. If the component is a `Geometry`, `geometry::equals()` diff --git a/doc/index/rtree/query.qbk b/doc/index/rtree/query.qbk index 7f76d7054..4f7d3ffb2 100644 --- a/doc/index/rtree/query.qbk +++ b/doc/index/rtree/query.qbk @@ -73,6 +73,11 @@ Examples of some basic queries may be found in the tables below. The query regio [[[$img/index/rtree/intersects_ring.png]] [[$img/index/rtree/intersects_poly.png]] [[$img/index/rtree/intersects_mpoly.png]] [[$img/index/rtree/intersects_segment.png]] [[$img/index/rtree/intersects_linestring.png]]] ] +[table +[[intersects(Box)] [disjoint(Box)] [intersects(Box)] [disjoint(Box)]] +[[[$img/index/rtree/rtree_pt_intersects_box.png]] [[$img/index/rtree/rtree_pt_disjoint_box.png]] [[$img/index/rtree/rtree_seg_intersects_box.png]] [[$img/index/rtree/rtree_seg_disjoint_box.png]]] +] + Spatial predicates are generated by functions defined in `boost::geometry::index` namespace. rt.query(index::contains(box), std::back_inserter(result)); @@ -91,20 +96,36 @@ All spatial predicates may be negated, e.g.: [h4 Nearest neighbours queries] -Nearest neighbours queries returns `__value__`s which are closest to some point in space. -The example of k-NN query is presented below. 5 `__value__`s nearest to the point are orange. +Nearest neighbours queries returns `__value__`s which are closest to some Geometry. +The examples of k-NN queries are presented below. 5 `__value__`s nearest to the Geometry are orange. -[$img/index/rtree/knn.png] +[table +[[nearest(Point, k)] [nearest(Box, k)] [nearest(Segment, k)]] +[[[$img/index/rtree/knn_pt_box.png]] [[$img/index/rtree/knn_box_box.png]] [[$img/index/rtree/knn_seg_box.png]]] +] +[table +[[nearest(Point, k)] [nearest(Box, k)] [nearest(Segment, k)] [nearest(Point, k)] [nearest(Box, k)] [nearest(Segment, k)]] +[[[$img/index/rtree/rtree_pt_knn_pt.png]] [[$img/index/rtree/rtree_pt_knn_box.png]] [[$img/index/rtree/rtree_pt_knn_seg.png]] + [[$img/index/rtree/rtree_seg_knn_pt.png]] [[$img/index/rtree/rtree_seg_knn_box.png]] [[$img/index/rtree/rtree_seg_knn_seg.png]]] +] To perform the knn query one must pass the nearest predicate generated by the `nearest()` function defined in `boost::geometry::index` namespace. -The following query returns `k` `__value__`s closest to some point in space. -For non-point `__indexable__`s the shortest distance is calculated. +For non-point `__indexable__`s the shortest distance is calculated using `bg::comparable_distance()` function. +The following query returns `k` `__value__`s closest to some Point in space. std::vector<__value__> returned_values; - __point__ pt(...); + __point__ pt(/*...*/); rt.query(bgi::nearest(pt, k), std::back_inserter(returned_values)); +The same way different query Geometries can be used: + + __box__ box(/*...*/); + rt.query(bgi::nearest(box, k), std::back_inserter(returned_values)); + + Segment seg(/*...*/); + rt.query(bgi::nearest(seg, k), std::back_inserter(returned_values)); + [h4 User-defined unary predicate] The user may pass a `UnaryPredicate` - function, function object or lambda expression taking const reference to Value and returning bool. diff --git a/doc/quickref.xml b/doc/quickref.xml index fff476c40..9e20847d3 100644 --- a/doc/quickref.xml +++ b/doc/quickref.xml @@ -741,7 +741,7 @@ overlaps(Geometry const &) within(Geometry const &) satisfies(UnaryPredicate const &) - nearest(Point const &, unsigned) + nearest(Geometry const &, unsigned)