1 #ifndef SQL_GIS_INTERSECTS_FUNCTOR_H_INCLUDED 2 #define SQL_GIS_INTERSECTS_FUNCTOR_H_INCLUDED 3 4 // Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. 5 // 6 // This program is free software; you can redistribute it and/or modify 7 // it under the terms of the GNU General Public License, version 2.0, 8 // as published by the Free Software Foundation. 9 // 10 // This program is also distributed with certain software (including 11 // but not limited to OpenSSL) that is licensed under separate terms, 12 // as designated in a particular file or component or in included license 13 // documentation. The authors of MySQL hereby grant you an additional 14 // permission to link the program and your derivative works with the 15 // separately licensed software that they have included with MySQL. 16 // 17 // This program is distributed in the hope that it will be useful, 18 // but WITHOUT ANY WARRANTY; without even the implied warranty of 19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 // GNU General Public License, version 2.0, for more details. 21 // 22 // You should have received a copy of the GNU General Public License 23 // along with this program; if not, write to the Free Software 24 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 25 26 /// @file 27 /// 28 /// This file declares the intersects functor interface. 29 /// 30 /// The functor is not intended for use directly by MySQL code. It should be 31 /// used indirectly through the gis::intersects() function. 32 /// 33 /// @see gis::intersects 34 35 #include <boost/geometry.hpp> 36 37 #include "sql/gis/box.h" 38 #include "sql/gis/functor.h" 39 #include "sql/gis/geometries.h" 40 #include "sql/gis/geometries_traits.h" 41 42 namespace gis { 43 44 /// Intersects functor that calls Boost.Geometry with the correct parameter 45 /// types. 46 /// 47 /// The functor throws exceptions and is therefore only intended used to 48 /// implement intersects or other geographic functions. It should not be used 49 /// directly by other MySQL code. 50 class Intersects : public Functor<bool> { 51 private: 52 /// Semi-major axis of ellipsoid. 53 double m_semi_major; 54 /// Semi-minor axis of ellipsoid. 55 double m_semi_minor; 56 /// Strategy used for P/L and P/A. 57 boost::geometry::strategy::within::geographic_winding<Geographic_point> 58 m_geographic_pl_pa_strategy; 59 /// Strategy used for L/L, L/A and A/A. 60 boost::geometry::strategy::intersection::geographic_segments<> 61 m_geographic_ll_la_aa_strategy; 62 63 public: 64 /// Creates a new Intersects functor. 65 /// 66 /// @param semi_major Semi-major axis of ellipsoid. 67 /// @param semi_minor Semi-minor axis of ellipsoid. 68 Intersects(double semi_major, double semi_minor); 69 bool operator()(const Geometry *g1, const Geometry *g2) const override; 70 bool operator()(const Box *b1, const Box *b2) const; 71 bool eval(const Geometry *g1, const Geometry *g2) const; 72 73 ////////////////////////////////////////////////////////////////////////////// 74 75 // intersects(Cartesian_point, *) 76 77 bool eval(const Cartesian_point *g1, const Cartesian_point *g2) const; 78 bool eval(const Cartesian_point *g1, const Cartesian_linestring *g2) const; 79 bool eval(const Cartesian_point *g1, const Cartesian_polygon *g2) const; 80 bool eval(const Cartesian_point *g1, 81 const Cartesian_geometrycollection *g2) const; 82 bool eval(const Cartesian_point *g1, const Cartesian_multipoint *g2) const; 83 bool eval(const Cartesian_point *g1, 84 const Cartesian_multilinestring *g2) const; 85 bool eval(const Cartesian_point *g1, const Cartesian_multipolygon *g2) const; 86 87 ////////////////////////////////////////////////////////////////////////////// 88 89 // intersects(Cartesian_linestring, *) 90 91 bool eval(const Cartesian_linestring *g1, const Cartesian_point *g2) const; 92 bool eval(const Cartesian_linestring *g1, 93 const Cartesian_linestring *g2) const; 94 bool eval(const Cartesian_linestring *g1, const Cartesian_polygon *g2) const; 95 bool eval(const Cartesian_linestring *g1, 96 const Cartesian_geometrycollection *g2) const; 97 bool eval(const Cartesian_linestring *g1, 98 const Cartesian_multipoint *g2) const; 99 bool eval(const Cartesian_linestring *g1, 100 const Cartesian_multilinestring *g2) const; 101 bool eval(const Cartesian_linestring *g1, 102 const Cartesian_multipolygon *g2) const; 103 104 ////////////////////////////////////////////////////////////////////////////// 105 106 // intersects(Cartesian_polygon, *) 107 108 bool eval(const Cartesian_polygon *g1, const Cartesian_point *g2) const; 109 bool eval(const Cartesian_polygon *g1, const Cartesian_linestring *g2) const; 110 bool eval(const Cartesian_polygon *g1, const Cartesian_polygon *g2) const; 111 bool eval(const Cartesian_polygon *g1, 112 const Cartesian_geometrycollection *g2) const; 113 bool eval(const Cartesian_polygon *g1, const Cartesian_multipoint *g2) const; 114 bool eval(const Cartesian_polygon *g1, 115 const Cartesian_multilinestring *g2) const; 116 bool eval(const Cartesian_polygon *g1, 117 const Cartesian_multipolygon *g2) const; 118 119 ////////////////////////////////////////////////////////////////////////////// 120 121 // intersects(Cartesian_geometrycollection, *) 122 123 bool eval(const Cartesian_geometrycollection *g1, const Geometry *g2) const; 124 125 ////////////////////////////////////////////////////////////////////////////// 126 127 // intersects(Cartesian_multipoint, *) 128 129 bool eval(const Cartesian_multipoint *g1, const Cartesian_point *g2) const; 130 bool eval(const Cartesian_multipoint *g1, 131 const Cartesian_linestring *g2) const; 132 bool eval(const Cartesian_multipoint *g1, const Cartesian_polygon *g2) const; 133 bool eval(const Cartesian_multipoint *g1, 134 const Cartesian_geometrycollection *g2) const; 135 bool eval(const Cartesian_multipoint *g1, 136 const Cartesian_multipoint *g2) const; 137 bool eval(const Cartesian_multipoint *g1, 138 const Cartesian_multilinestring *g2) const; 139 bool eval(const Cartesian_multipoint *g1, 140 const Cartesian_multipolygon *g2) const; 141 142 ////////////////////////////////////////////////////////////////////////////// 143 144 // intersects(Cartesian_multilinestring, *) 145 146 bool eval(const Cartesian_multilinestring *g1, 147 const Cartesian_point *g2) const; 148 bool eval(const Cartesian_multilinestring *g1, 149 const Cartesian_linestring *g2) const; 150 bool eval(const Cartesian_multilinestring *g1, 151 const Cartesian_polygon *g2) const; 152 bool eval(const Cartesian_multilinestring *g1, 153 const Cartesian_geometrycollection *g2) const; 154 bool eval(const Cartesian_multilinestring *g1, 155 const Cartesian_multipoint *g2) const; 156 bool eval(const Cartesian_multilinestring *g1, 157 const Cartesian_multilinestring *g2) const; 158 bool eval(const Cartesian_multilinestring *g1, 159 const Cartesian_multipolygon *g2) const; 160 161 ////////////////////////////////////////////////////////////////////////////// 162 163 // intersects(Cartesian_multipolygon, *) 164 165 bool eval(const Cartesian_multipolygon *g1, const Cartesian_point *g2) const; 166 bool eval(const Cartesian_multipolygon *g1, 167 const Cartesian_linestring *g2) const; 168 bool eval(const Cartesian_multipolygon *g1, 169 const Cartesian_polygon *g2) const; 170 bool eval(const Cartesian_multipolygon *g1, 171 const Cartesian_geometrycollection *g2) const; 172 bool eval(const Cartesian_multipolygon *g1, 173 const Cartesian_multipoint *g2) const; 174 bool eval(const Cartesian_multipolygon *g1, 175 const Cartesian_multilinestring *g2) const; 176 bool eval(const Cartesian_multipolygon *g1, 177 const Cartesian_multipolygon *g2) const; 178 179 ////////////////////////////////////////////////////////////////////////////// 180 181 // intersects(Geographic_point, *) 182 183 bool eval(const Geographic_point *g1, const Geographic_point *g2) const; 184 bool eval(const Geographic_point *g1, const Geographic_linestring *g2) const; 185 bool eval(const Geographic_point *g1, const Geographic_polygon *g2) const; 186 bool eval(const Geographic_point *g1, 187 const Geographic_geometrycollection *g2) const; 188 bool eval(const Geographic_point *g1, const Geographic_multipoint *g2) const; 189 bool eval(const Geographic_point *g1, 190 const Geographic_multilinestring *g2) const; 191 bool eval(const Geographic_point *g1, 192 const Geographic_multipolygon *g2) const; 193 194 ////////////////////////////////////////////////////////////////////////////// 195 196 // intersects(Geographic_linestring, *) 197 198 bool eval(const Geographic_linestring *g1, const Geographic_point *g2) const; 199 bool eval(const Geographic_linestring *g1, 200 const Geographic_linestring *g2) const; 201 bool eval(const Geographic_linestring *g1, 202 const Geographic_polygon *g2) const; 203 bool eval(const Geographic_linestring *g1, 204 const Geographic_geometrycollection *g2) const; 205 bool eval(const Geographic_linestring *g1, 206 const Geographic_multipoint *g2) const; 207 bool eval(const Geographic_linestring *g1, 208 const Geographic_multilinestring *g2) const; 209 bool eval(const Geographic_linestring *g1, 210 const Geographic_multipolygon *g2) const; 211 212 ////////////////////////////////////////////////////////////////////////////// 213 214 // intersects(Geographic_polygon, *) 215 216 bool eval(const Geographic_polygon *g1, const Geographic_point *g2) const; 217 bool eval(const Geographic_polygon *g1, 218 const Geographic_linestring *g2) const; 219 bool eval(const Geographic_polygon *g1, const Geographic_polygon *g2) const; 220 bool eval(const Geographic_polygon *g1, 221 const Geographic_geometrycollection *g2) const; 222 bool eval(const Geographic_polygon *g1, 223 const Geographic_multipoint *g2) const; 224 bool eval(const Geographic_polygon *g1, 225 const Geographic_multilinestring *g2) const; 226 bool eval(const Geographic_polygon *g1, 227 const Geographic_multipolygon *g2) const; 228 229 ////////////////////////////////////////////////////////////////////////////// 230 231 // intersects(Geographic_geometrycollection, *) 232 233 bool eval(const Geographic_geometrycollection *g1, const Geometry *g2) const; 234 235 ////////////////////////////////////////////////////////////////////////////// 236 237 // intersects(Geographic_multipoint, *) 238 239 bool eval(const Geographic_multipoint *g1, const Geographic_point *g2) const; 240 bool eval(const Geographic_multipoint *g1, 241 const Geographic_linestring *g2) const; 242 bool eval(const Geographic_multipoint *g1, 243 const Geographic_polygon *g2) const; 244 bool eval(const Geographic_multipoint *g1, 245 const Geographic_geometrycollection *g2) const; 246 bool eval(const Geographic_multipoint *g1, 247 const Geographic_multipoint *g2) const; 248 bool eval(const Geographic_multipoint *g1, 249 const Geographic_multilinestring *g2) const; 250 bool eval(const Geographic_multipoint *g1, 251 const Geographic_multipolygon *g2) const; 252 253 ////////////////////////////////////////////////////////////////////////////// 254 255 // intersects(Geographic_multilinestring, *) 256 257 bool eval(const Geographic_multilinestring *g1, 258 const Geographic_point *g2) const; 259 bool eval(const Geographic_multilinestring *g1, 260 const Geographic_linestring *g2) const; 261 bool eval(const Geographic_multilinestring *g1, 262 const Geographic_polygon *g2) const; 263 bool eval(const Geographic_multilinestring *g1, 264 const Geographic_geometrycollection *g2) const; 265 bool eval(const Geographic_multilinestring *g1, 266 const Geographic_multipoint *g2) const; 267 bool eval(const Geographic_multilinestring *g1, 268 const Geographic_multilinestring *g2) const; 269 bool eval(const Geographic_multilinestring *g1, 270 const Geographic_multipolygon *g2) const; 271 272 ////////////////////////////////////////////////////////////////////////////// 273 274 // intersects(Geographic_multipolygon, *) 275 276 bool eval(const Geographic_multipolygon *g1, 277 const Geographic_point *g2) const; 278 bool eval(const Geographic_multipolygon *g1, 279 const Geographic_linestring *g2) const; 280 bool eval(const Geographic_multipolygon *g1, 281 const Geographic_polygon *g2) const; 282 bool eval(const Geographic_multipolygon *g1, 283 const Geographic_geometrycollection *g2) const; 284 bool eval(const Geographic_multipolygon *g1, 285 const Geographic_multipoint *g2) const; 286 bool eval(const Geographic_multipolygon *g1, 287 const Geographic_multilinestring *g2) const; 288 bool eval(const Geographic_multipolygon *g1, 289 const Geographic_multipolygon *g2) const; 290 291 ////////////////////////////////////////////////////////////////////////////// 292 293 // intersects(Box, Box) 294 295 bool eval(const Cartesian_box *b1, const Cartesian_box *b2) const; 296 bool eval(const Geographic_box *b1, const Geographic_box *b2) const; 297 }; 298 299 } // namespace gis 300 301 #endif // SQL_GIS_INTERSECTS_FUNCTOR_H_INCLUDED 302