item_geofunc.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:9k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000-2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* This file defines all spatial functions */
  14. #ifdef HAVE_SPATIAL
  15. #ifdef USE_PRAGMA_INTERFACE
  16. #pragma interface /* gcc class implementation */
  17. #endif
  18. class Item_geometry_func: public Item_str_func
  19. {
  20. public:
  21.   Item_geometry_func() :Item_str_func() {}
  22.   Item_geometry_func(Item *a) :Item_str_func(a) {}
  23.   Item_geometry_func(Item *a,Item *b) :Item_str_func(a,b) {}
  24.   Item_geometry_func(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  25.   Item_geometry_func(List<Item> &list) :Item_str_func(list) {}
  26.   void fix_length_and_dec();
  27. };
  28. class Item_func_geometry_from_text: public Item_geometry_func
  29. {
  30. public:
  31.   Item_func_geometry_from_text(Item *a) :Item_geometry_func(a) {}
  32.   Item_func_geometry_from_text(Item *a, Item *srid) :Item_geometry_func(a, srid) {}
  33.   const char *func_name() const { return "geometryfromtext"; }
  34.   String *val_str(String *);
  35. };
  36. class Item_func_geometry_from_wkb: public Item_geometry_func
  37. {
  38. public:
  39.   Item_func_geometry_from_wkb(Item *a): Item_geometry_func(a) {}
  40.   Item_func_geometry_from_wkb(Item *a, Item *srid): Item_geometry_func(a, srid) {}
  41.   const char *func_name() const { return "geometryfromwkb"; }
  42.   String *val_str(String *);
  43. };
  44. class Item_func_as_wkt: public Item_str_func
  45. {
  46. public:
  47.   Item_func_as_wkt(Item *a): Item_str_func(a) {}
  48.   const char *func_name() const { return "astext"; }
  49.   String *val_str(String *);
  50.   void fix_length_and_dec();
  51. };
  52. class Item_func_as_wkb: public Item_geometry_func
  53. {
  54. public:
  55.   Item_func_as_wkb(Item *a): Item_geometry_func(a) {}
  56.   const char *func_name() const { return "aswkb"; }
  57.   String *val_str(String *);
  58. };
  59. class Item_func_geometry_type: public Item_str_func
  60. {
  61. public:
  62.   Item_func_geometry_type(Item *a): Item_str_func(a) {}
  63.   String *val_str(String *);
  64.   const char *func_name() const { return "geometrytype"; }
  65.   void fix_length_and_dec() 
  66.   {
  67.      max_length=20; // "GeometryCollection" is the most long
  68.   };
  69. };
  70. class Item_func_centroid: public Item_geometry_func
  71. {
  72. public:
  73.   Item_func_centroid(Item *a): Item_geometry_func(a) {}
  74.   const char *func_name() const { return "centroid"; }
  75.   String *val_str(String *);
  76. };
  77. class Item_func_envelope: public Item_geometry_func
  78. {
  79. public:
  80.   Item_func_envelope(Item *a): Item_geometry_func(a) {}
  81.   const char *func_name() const { return "envelope"; }
  82.   String *val_str(String *);
  83. };
  84. class Item_func_point: public Item_geometry_func
  85. {
  86. public:
  87.   Item_func_point(Item *a, Item *b): Item_geometry_func(a, b) {}
  88.   Item_func_point(Item *a, Item *b, Item *srid): Item_geometry_func(a, b, srid) {}
  89.   const char *func_name() const { return "point"; }
  90.   String *val_str(String *);
  91. };
  92. class Item_func_spatial_decomp: public Item_geometry_func
  93. {
  94.   enum Functype decomp_func;
  95. public:
  96.   Item_func_spatial_decomp(Item *a, Item_func::Functype ft) :
  97.    Item_geometry_func(a) { decomp_func = ft; }
  98.   const char *func_name() const 
  99.   { 
  100.     switch (decomp_func)
  101.     {
  102.       case SP_STARTPOINT:
  103.         return "startpoint";
  104.       case SP_ENDPOINT:
  105.         return "endpoint";
  106.       case SP_EXTERIORRING:
  107.         return "exteriorring";
  108.       default:
  109. DBUG_ASSERT(0);  // Should never happened
  110.         return "spatial_decomp_unknown"; 
  111.     }
  112.   }
  113.   String *val_str(String *);
  114. };
  115. class Item_func_spatial_decomp_n: public Item_geometry_func
  116. {
  117.   enum Functype decomp_func_n;
  118. public:
  119.   Item_func_spatial_decomp_n(Item *a, Item *b, Item_func::Functype ft):
  120.    Item_geometry_func(a, b) { decomp_func_n = ft; }
  121.   const char *func_name() const 
  122.   { 
  123.     switch (decomp_func_n)
  124.     {
  125.       case SP_POINTN:
  126.         return "pointn";
  127.       case SP_GEOMETRYN:
  128.         return "geometryn";
  129.       case SP_INTERIORRINGN:
  130.         return "interiorringn";
  131.       default:
  132. DBUG_ASSERT(0);  // Should never happened
  133.         return "spatial_decomp_n_unknown"; 
  134.     }
  135.   }
  136.   String *val_str(String *);
  137. };
  138. class Item_func_spatial_collection: public Item_geometry_func
  139. {
  140.   String tmp_value;
  141.   enum Geometry::wkbType coll_type; 
  142.   enum Geometry::wkbType item_type;
  143. public:
  144.   Item_func_spatial_collection(
  145.      List<Item> &list, enum Geometry::wkbType ct, enum Geometry::wkbType it):
  146.   Item_geometry_func(list)
  147.   {
  148.     coll_type=ct;
  149.     item_type=it;
  150.   }
  151.   String *val_str(String *);
  152.   const char *func_name() const { return "multipoint"; }
  153. };
  154. /*
  155.   Spatial relations
  156. */
  157. class Item_func_spatial_rel: public Item_bool_func2
  158. {
  159.   enum Functype spatial_rel;
  160. public:
  161.   Item_func_spatial_rel(Item *a,Item *b, enum Functype sp_rel) :
  162.     Item_bool_func2(a,b) { spatial_rel = sp_rel; }
  163.   longlong val_int();
  164.   enum Functype functype() const 
  165.   { 
  166.     switch (spatial_rel) {
  167.     case SP_CONTAINS_FUNC:
  168.       return SP_WITHIN_FUNC;
  169.     case SP_WITHIN_FUNC:
  170.       return SP_CONTAINS_FUNC;
  171.     default:
  172.       return spatial_rel;
  173.     }
  174.   }
  175.   enum Functype rev_functype() const { return spatial_rel; }
  176.   const char *func_name() const 
  177.   { 
  178.     switch (spatial_rel) {
  179.     case SP_CONTAINS_FUNC:
  180.       return "contains";
  181.     case SP_WITHIN_FUNC:
  182.       return "within";
  183.     case SP_EQUALS_FUNC:
  184.       return "equals";
  185.     case SP_DISJOINT_FUNC:
  186.       return "disjoint";
  187.     case SP_INTERSECTS_FUNC:
  188.       return "intersects";
  189.     case SP_TOUCHES_FUNC:
  190.       return "touches";
  191.     case SP_CROSSES_FUNC:
  192.       return "crosses";
  193.     case SP_OVERLAPS_FUNC:
  194.       return "overlaps";
  195.     default:
  196.       DBUG_ASSERT(0);  // Should never happened
  197.       return "sp_unknown"; 
  198.     }
  199.     }
  200.   void print(String *str) { Item_func::print(str); }
  201. };
  202. class Item_func_isempty: public Item_bool_func
  203. {
  204. public:
  205.   Item_func_isempty(Item *a): Item_bool_func(a) {}
  206.   longlong val_int();
  207.   optimize_type select_optimize() const { return OPTIMIZE_NONE; }
  208.   const char *func_name() const { return "isempty"; }
  209. };
  210. class Item_func_issimple: public Item_bool_func
  211. {
  212. public:
  213.   Item_func_issimple(Item *a): Item_bool_func(a) {}
  214.   longlong val_int();
  215.   optimize_type select_optimize() const { return OPTIMIZE_NONE; }
  216.   const char *func_name() const { return "issimple"; }
  217. };
  218. class Item_func_isclosed: public Item_bool_func
  219. {
  220. public:
  221.   Item_func_isclosed(Item *a): Item_bool_func(a) {}
  222.   longlong val_int();
  223.   optimize_type select_optimize() const { return OPTIMIZE_NONE; }
  224.   const char *func_name() const { return "isclosed"; }
  225. };
  226. class Item_func_dimension: public Item_int_func
  227. {
  228.   String value;
  229. public:
  230.   Item_func_dimension(Item *a): Item_int_func(a) {}
  231.   longlong val_int();
  232.   const char *func_name() const { return "dimension"; }
  233.   void fix_length_and_dec() { max_length=10; }
  234. };
  235. class Item_func_x: public Item_real_func
  236. {
  237.   String value;
  238. public:
  239.   Item_func_x(Item *a): Item_real_func(a) {}
  240.   double val();
  241.   const char *func_name() const { return "x"; }
  242. };
  243. class Item_func_y: public Item_real_func
  244. {
  245.   String value;
  246. public:
  247.   Item_func_y(Item *a): Item_real_func(a) {}
  248.   double val();
  249.   const char *func_name() const { return "y"; }
  250. };
  251. class Item_func_numgeometries: public Item_int_func
  252. {
  253.   String value;
  254. public:
  255.   Item_func_numgeometries(Item *a): Item_int_func(a) {}
  256.   longlong val_int();
  257.   const char *func_name() const { return "numgeometries"; }
  258.   void fix_length_and_dec() { max_length=10; }
  259. };
  260. class Item_func_numinteriorring: public Item_int_func
  261. {
  262.   String value;
  263. public:
  264.   Item_func_numinteriorring(Item *a): Item_int_func(a) {}
  265.   longlong val_int();
  266.   const char *func_name() const { return "numinteriorrings"; }
  267.   void fix_length_and_dec() { max_length=10; }
  268. };
  269. class Item_func_numpoints: public Item_int_func
  270. {
  271.   String value;
  272. public:
  273.   Item_func_numpoints(Item *a): Item_int_func(a) {}
  274.   longlong val_int();
  275.   const char *func_name() const { return "numpoints"; }
  276.   void fix_length_and_dec() { max_length=10; }
  277. };
  278. class Item_func_area: public Item_real_func
  279. {
  280.   String value;
  281. public:
  282.   Item_func_area(Item *a): Item_real_func(a) {}
  283.   double val();
  284.   const char *func_name() const { return "area"; }
  285. };
  286. class Item_func_glength: public Item_real_func
  287. {
  288.   String value;
  289. public:
  290.   Item_func_glength(Item *a): Item_real_func(a) {}
  291.   double val();
  292.   const char *func_name() const { return "glength"; }
  293. };
  294. class Item_func_srid: public Item_int_func
  295. {
  296.   String value;
  297. public:
  298.   Item_func_srid(Item *a): Item_int_func(a) {}
  299.   longlong val_int();
  300.   const char *func_name() const { return "srid"; }
  301.   void fix_length_and_dec() { max_length= 10; }
  302. };
  303. #define GEOM_NEW(obj_constructor) new obj_constructor
  304. #else /*HAVE_SPATIAL*/
  305. #define GEOM_NEW(obj_constructor) NULL
  306. #endif