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)