Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // Spatial query predicates Chris@16: // Chris@101: // Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland. Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_INDEX_PREDICATES_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_PREDICATES_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: /*! Chris@16: \defgroup predicates Predicates (boost::geometry::index::) Chris@16: */ Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { Chris@16: Chris@16: /*! Chris@16: \brief Generate \c contains() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::within(Geometry, Indexable) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::contains(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: contains(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::contains_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate \c covered_by() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::covered_by(Indexable, Geometry) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::covered_by(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: covered_by(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::covered_by_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate \c covers() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::covered_by(Geometry, Indexable) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::covers(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: covers(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::covers_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate \c disjoint() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::disjoint(Indexable, Geometry) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::disjoint(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: disjoint(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::disjoint_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate \c intersects() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::intersects(Indexable, Geometry) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::intersects(box), std::back_inserter(result)); Chris@16: bgi::query(spatial_index, bgi::intersects(ring), std::back_inserter(result)); Chris@16: bgi::query(spatial_index, bgi::intersects(polygon), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: intersects(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::intersects_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate \c overlaps() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::overlaps(Indexable, Geometry) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::overlaps(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: overlaps(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::overlaps_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: #ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL Chris@16: Chris@16: /*! Chris@16: \brief Generate \c touches() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::touches(Indexable, Geometry) Chris@16: returns true. Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: touches(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::touches_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL Chris@16: Chris@16: /*! Chris@16: \brief Generate \c within() predicate. Chris@16: Chris@16: Generate a predicate defining Value and Geometry relationship. Chris@16: Value will be returned by the query if bg::within(Indexable, Geometry) Chris@16: returns true. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::within(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam Geometry The Geometry type. Chris@16: Chris@16: \param g The Geometry object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::spatial_predicate Chris@16: within(Geometry const& g) Chris@16: { Chris@101: return detail::predicates::spatial_predicate Chris@101: < Chris@101: Geometry, Chris@101: detail::predicates::within_tag, Chris@101: false Chris@101: >(g); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate satisfies() predicate. Chris@16: Chris@16: A wrapper around user-defined UnaryPredicate checking if Value should be returned by spatial query. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bool is_red(Value const& v) { return v.is_red(); } Chris@16: Chris@16: struct is_red_o { Chris@16: template bool operator()(Value const& v) { return v.is_red(); } Chris@16: } Chris@16: Chris@16: // ... Chris@16: Chris@16: rt.query(index::intersects(box) && index::satisfies(is_red), Chris@16: std::back_inserter(result)); Chris@16: Chris@16: rt.query(index::intersects(box) && index::satisfies(is_red_o()), Chris@16: std::back_inserter(result)); Chris@16: Chris@16: #ifndef BOOST_NO_CXX11_LAMBDAS Chris@16: rt.query(index::intersects(box) && index::satisfies([](Value const& v) { return v.is_red(); }), Chris@16: std::back_inserter(result)); Chris@16: #endif Chris@16: \endverbatim Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \tparam UnaryPredicate A type of unary predicate function or function object. Chris@16: Chris@16: \param pred The unary predicate function or function object. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::satisfies Chris@16: satisfies(UnaryPredicate const& pred) Chris@16: { Chris@101: return detail::predicates::satisfies(pred); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief Generate nearest() predicate. Chris@16: Chris@16: When nearest predicate is passed to the query, k-nearest neighbour search will be performed. Chris@101: \c nearest() predicate takes a \c Geometry from which distances to \c Values are calculated Chris@101: and the maximum number of \c Values that should be returned. Internally Chris@101: boost::geometry::comparable_distance() is used to perform the calculation. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::nearest(pt, 5), std::back_inserter(result)); Chris@16: bgi::query(spatial_index, bgi::nearest(pt, 5) && bgi::intersects(box), std::back_inserter(result)); Chris@101: bgi::query(spatial_index, bgi::nearest(box, 5), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \warning Chris@16: Only one \c nearest() predicate may be used in a query. Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@101: \param geometry The geometry from which distance is calculated. Chris@16: \param k The maximum number of values to return. Chris@16: */ Chris@101: template inline Chris@101: detail::predicates::nearest Chris@101: nearest(Geometry const& geometry, unsigned k) Chris@16: { Chris@101: return detail::predicates::nearest(geometry, k); Chris@16: } Chris@16: Chris@16: #ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL Chris@16: Chris@16: /*! Chris@16: \brief Generate path() predicate. Chris@16: Chris@16: When path predicate is passed to the query, the returned values are k values along the path closest to Chris@16: its begin. \c path() predicate takes a \c Segment or a \c Linestring defining the path and the maximum Chris@16: number of \c Values that should be returned. Chris@16: Chris@16: \par Example Chris@16: \verbatim Chris@16: bgi::query(spatial_index, bgi::path(segment, 5), std::back_inserter(result)); Chris@16: bgi::query(spatial_index, bgi::path(linestring, 5) && bgi::intersects(box), std::back_inserter(result)); Chris@16: \endverbatim Chris@16: Chris@16: \warning Chris@16: Only one distance predicate (\c nearest() or \c path()) may be used in a query. Chris@16: Chris@16: \ingroup predicates Chris@16: Chris@16: \param linestring The path along which distance is calculated. Chris@16: \param k The maximum number of values to return. Chris@16: */ Chris@16: template inline Chris@101: detail::predicates::path Chris@16: path(SegmentOrLinestring const& linestring, unsigned k) Chris@16: { Chris@101: return detail::predicates::path(linestring, k); Chris@16: } Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL Chris@16: Chris@101: namespace detail { namespace predicates { Chris@16: Chris@16: // operator! generators Chris@16: Chris@16: template inline Chris@16: satisfies Chris@16: operator!(satisfies const& p) Chris@16: { Chris@16: return satisfies(p); Chris@16: } Chris@16: Chris@16: template inline Chris@16: spatial_predicate Chris@16: operator!(spatial_predicate const& p) Chris@16: { Chris@16: return spatial_predicate(p.geometry); Chris@16: } Chris@16: Chris@16: // operator&& generators Chris@16: Chris@16: template inline Chris@16: boost::tuples::cons< Chris@16: Pred1, Chris@16: boost::tuples::cons Chris@16: > Chris@16: operator&&(Pred1 const& p1, Pred2 const& p2) Chris@16: { Chris@16: /*typedef typename boost::mpl::if_c::value, Pred1, Pred1 const&>::type stored1; Chris@16: typedef typename boost::mpl::if_c::value, Pred2, Pred2 const&>::type stored2;*/ Chris@16: namespace bt = boost::tuples; Chris@16: Chris@16: return Chris@16: bt::cons< Pred1, bt::cons > Chris@16: ( p1, bt::cons(p2, bt::null_type()) ); Chris@16: } Chris@16: Chris@16: template inline Chris@101: typename tuples::push_back< Chris@101: boost::tuples::cons, Pred Chris@16: >::type Chris@16: operator&&(boost::tuples::cons const& t, Pred const& p) Chris@16: { Chris@16: //typedef typename boost::mpl::if_c::value, Pred, Pred const&>::type stored; Chris@16: namespace bt = boost::tuples; Chris@16: Chris@16: return Chris@101: tuples::push_back< Chris@101: bt::cons, Pred Chris@16: >::apply(t, p); Chris@16: } Chris@16: Chris@101: }} // namespace detail::predicates Chris@16: Chris@16: }}} // namespace boost::geometry::index Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_PREDICATES_HPP