MySQL 8.0.39
Source Code Documentation
|
#include <spatial.h>
Classes | |
class | Class_info |
class | Flags_t |
Highest byte is stores byte order, dimension, nomem and geotype as follows: bo: byte order, 1 for little endian(ndr), 0 for big endian(xdr); Currently it must be always wkb_ndr since it is MySQL's portable geometry format. More... | |
class | wkb_container |
Constant storage for WKB. More... | |
class | wkb_parser |
WKB parser, designed to traverse through WKB data from beginning of the buffer towards the end using a set of scan_xxx(), get_xxx() and skip_xxx() routines, with safety tests to avoid going beyond the buffer end. More... | |
Public Types | |
enum | wkbType { wkb_invalid_type = 0 , wkb_first = 1 , wkb_point = 1 , wkb_linestring = 2 , wkb_polygon = 3 , wkb_multipoint = 4 , wkb_multilinestring = 5 , wkb_multipolygon = 6 , wkb_geometrycollection = 7 , wkb_polygon_inner_rings = 31 , wkb_last = 31 } |
enum | wkbByteOrder { wkb_xdr = 0 , wkb_ndr = 1 , wkb_invalid } |
enum | enum_coordinate_reference_system { coord_first = 1 , cartesian = 1 , coord_last = 1 } |
typedef Geometry *(* | create_geom_t) (char *) |
Callback which creates Geometry objects on top of a given placement. More... | |
Public Member Functions | |
virtual | ~Geometry () |
virtual const Class_info * | get_class_info () const |
virtual uint32 | get_data_size () const |
virtual bool | init_from_wkt (Gis_read_stream *trs, String *wkb) |
virtual uint | init_from_wkb (THD *thd, const char *wkb, uint len, wkbByteOrder bo, String *res) |
virtual bool | get_data_as_wkt (String *txt, wkb_parser *wkb) const |
virtual bool | get_mbr (MBR *mbr, wkb_parser *wkb) const |
bool | get_mbr (MBR *mbr) |
virtual bool | dimension (uint32 *dim, wkb_parser *wkb) const |
bool | dimension (uint32 *dim) const |
wkbType | get_type () const |
enum_coordinate_reference_system | get_coordsys () const |
virtual uint32 | feature_dimension () const |
virtual int | get_x (double *) const |
virtual int | get_y (double *) const |
virtual int | geom_length (double *) const |
virtual int | is_closed (int *) const |
virtual int | num_interior_ring (uint32 *) const |
virtual int | num_points (uint32 *) const |
virtual int | num_geometries (uint32 *) const |
virtual int | copy_points (String *) const |
virtual int | start_point (String *) const |
virtual int | end_point (String *) const |
virtual int | exterior_ring (String *) const |
virtual int | point_n (uint32 num, String *result) const |
virtual int | interior_ring_n (uint32 num, String *result) const |
virtual int | geometry_n (uint32 num, String *result) const |
virtual bool | reverse_coordinates ()=0 |
Reverses the coordinates of a geometry. More... | |
virtual bool | validate_coordinate_range (double srs_angular_unit, bool *long_out_of_range, bool *lat_out_of_range, double *out_of_range_value)=0 |
Check that the coordinates of a geometry is within the valid range. More... | |
bool | as_wkt (String *wkt, wkb_parser *wkb) const |
bool | as_wkt (String *wkt) const |
bool | as_wkb (String *wkb, bool shallow_copy) const |
Write this geometry's WKB byte string into specified buffer, the SRID is not written into the buffer. More... | |
bool | as_geometry (String *wkb, bool shallow_copy) const |
Write this geometry's GEOMETRY byte string into specified buffer, the SRID will be written before the WKB string to form a GEOMETRY byte string. More... | |
void | set_data_ptr (const void *data, size_t data_len) |
void | set_data_ptr (const wkb_container *c) |
void * | get_data_ptr () const |
bool | envelope (String *result) const |
bool | envelope (MBR *mbr) const |
bool | is_polygon_ring () const |
bool | is_polygon_outer_ring () const |
bool | is_polygon_inner_ring () const |
bool | has_geom_header_space () const |
void | has_geom_header_space (bool b) |
bool | is_components_no_overlapped () const |
void | set_components_no_overlapped (bool b) |
void | set_props (uint16 flag) |
uint16 | get_props () const |
void | set_srid (gis::srid_t id) |
gis::srid_t | get_srid () const |
const void * | normalize_ring_order () |
In place normalize polygons' rings, making outer ring CCW and inner rings CW by reversing the ring's points in the WKB buffer inplace. More... | |
Geometry () | |
Geometry (const void *ptr, size_t len, const Flags_t &flags, gis::srid_t srid) | |
Constructor used as BG adapter or by default constructors of children classes. More... | |
Geometry (const Geometry &geo) | |
Geometry & | operator= (const Geometry &rhs) |
Assignment operator for Geometry class, assignment operators of children classes calls this to do general assignment. More... | |
void * | get_ptr () const |
char * | get_cptr () const |
uchar * | get_ucptr () const |
Geometry * | get_owner () const |
void | set_owner (Geometry *o) |
void | set_byte_order (Geometry::wkbByteOrder bo) |
void | set_dimension (char dim) |
void | set_geotype (Geometry::wkbType gt) |
void | set_nbytes (size_t n) const |
void | set_ownmem (bool b) |
Set whether this object has its own memory. More... | |
bool | get_ownmem () const |
Returns whether this object has its own memory. More... | |
Geometry::wkbByteOrder | get_byte_order () const |
char | get_dimension () const |
Geometry::wkbType | get_geotype () const |
uint32 | get_ogc_geotype () const |
Build an OGC standard type value from m_flags.zm and m_flags.geotype. More... | |
size_t | get_nbytes () const |
void | set_ptr (const void *ptr) |
bool | is_bg_adapter () const |
Whether the Geometry object is created to be used by Boost Geometry or only by MySQL. More... | |
void | set_bg_adapter (bool b) const |
Set whether this object is a BG adapter. More... | |
virtual void | donate_data () |
Flags_t | get_flags () const |
void | set_flags (const Flags_t &flags) |
Static Public Member Functions | |
static Geometry * | create_by_typeid (Geometry_buffer *buffer, int type_id) |
static Geometry * | construct (Geometry_buffer *buffer, const char *data, uint32 data_len, bool has_srid=true) |
Construct a Geometry object using GEOMETRY byte string. More... | |
static Geometry * | construct (Geometry_buffer *buffer, const String *str, bool has_srid=true) |
static Geometry * | create_from_wkt (Geometry_buffer *buffer, Gis_read_stream *trs, String *wkt, bool init_stream=true, bool check_trailing=true) |
Read wkt text from trs, and write little endian wkb encoding into 'wkt', and create a Geometry instance in 'buffer'. More... | |
static Geometry * | create_from_wkb (THD *thd, Geometry_buffer *buffer, const char *wkb, uint32 len, String *res, bool init) |
Read from 'wkb' (which contains WKB encoded in either endianness) the geometry data, and write WKB of returned Geometry object in little endianness into 'res', and also create geometry object on 'buffer' and return it. More... | |
static bool | is_valid_opengis_geotype (uint32 gtype) |
Check if a given geometry type is a valid geometry type according to OpenGIS. More... | |
static bool | is_valid_geotype (uint32 gtype) |
Check if a given geometry type is a valid internal geometry type. More... | |
static bool | is_valid_geotype (Geometry::wkbType gt) |
Check if a given geometry type is a valid internal geometry type. More... | |
static bool | is_well_formed (const char *from, size_t length, wkbType type, wkbByteOrder bo) |
Verify that a string is a well-formed GEOMETRY string. More... | |
Static Public Attributes | |
static const uint32 | MAX_GEOM_WKB_LENGTH = 0x3fffffff |
static const gis::srid_t | default_srid = 0 |
static String | bad_geometry_data |
static Class_info * | ci_collection [wkb_last+1] |
Protected Member Functions | |
void | append_points (String *txt, uint32 n_points, wkb_parser *wkb, uint32 offset, bool bracket_pt=false) const |
Append N points from packed format to text Before calling this function, caller must have already checked that wkb's buffer is complete and not truncated. More... | |
bool | create_point (String *result, wkb_parser *wkb) const |
Create a point from data. More... | |
bool | get_mbr_for_points (MBR *mbr, wkb_parser *wkb, uint offset) const |
Get most bounding rectangle (mbr) for X points. More... | |
bool | is_length_verified () const |
void | set_length_verified (bool b) const |
bool | polygon_is_wkb_form () const |
In a polygon usable by boost geometry, the m_ptr points to the outer ring object, and m_inn_rings points to the inner rings, thus the polygon's data isn't stored in a single WKB. More... | |
void | polygon_is_wkb_form (bool b) |
bool | has_out_of_line_components () const |
If call Gis_wkb_vector<T>::resize() to add a component to X, the geometry may have a geometry not stored inside the WKB buffer of X, hence X has out of line component. More... | |
void | has_out_of_line_components (bool b) |
void | clear_wkb_data () |
virtual void | shallow_push (const Geometry *) |
Static Protected Member Functions | |
static Class_info * | find_class (int type_id) |
static Class_info * | find_class (const char *name, size_t len) |
Protected Attributes | |
Geometry * | m_owner |
The topmost (root) geometry object, whose m_ptr is the 1st byte of a wkb memory buffer. More... | |
void * | m_ptr |
Pointer to the geometry's wkb data's 1st byte, right after its wkb header if any. More... | |
Static Protected Attributes | |
static const int | POLYGON_OUTER_RING = 0x1 |
static const int | POLYGON_INNER_RING = 0x2 |
static const int | IS_BOOST_GEOMETRY_ADAPTER = 0x4 |
static const int | GEOM_LENGTH_VERIFIED = 0x8 |
static const int | HAS_OUT_OF_LINE_COMPONENTS = 0x10 |
static const int | POLYGON_IN_WKB_FORM = 0x20 |
static const int | HAS_GEOM_HEADER_SPACE = 0x40 |
static const int | MULTIPOLYGON_NO_OVERLAPPED_COMPS = 0x80 |
Private Attributes | |
Flags_t | m_flags |
Flags and meta information about this object. More... | |
gis::srid_t | m_srid |
Srid of this object. More... | |
Friends | |
void | parse_wkb_data (Geometry *geom, const char *p, size_t num_geoms) |
Parse the wkb buffer to build the component vector m_geo_vect for geom. More... | |
typedef Geometry *(* Geometry::create_geom_t) (char *) |
Callback which creates Geometry objects on top of a given placement.
enum Geometry::wkbType |
|
virtual |
|
inline |
|
inline |
Constructor used as BG adapter or by default constructors of children classes.
ptr | WKB buffer address, or NULL for an empty object. |
len | WKB buffer length in bytes. |
flags | the flags to set, no field is used for now except geotype. |
srid | srid of the geometry. |
Geometry::Geometry | ( | const Geometry & | geo | ) |
|
protected |
Append N points from packed format to text Before calling this function, caller must have already checked that wkb's buffer is complete and not truncated.
[out] | txt | Append points here |
n_points | Number of points | |
wkb | Packed data | |
offset | Offset between points | |
bracket_pt | whether to bracket the point coordinate with (), multipoint need so. |
bool Geometry::as_geometry | ( | String * | buf, |
bool | shallow_copy | ||
) | const |
Write this geometry's GEOMETRY byte string into specified buffer, the SRID will be written before the WKB string to form a GEOMETRY byte string.
buf | The buffer to write GEOMETRY byte string into. |
shallow_copy | Whether do shallow copy by using this object's memory without owning it or duplicating the byte string. |
bool Geometry::as_wkb | ( | String * | wkb, |
bool | shallow_copy | ||
) | const |
Write this geometry's WKB byte string into specified buffer, the SRID is not written into the buffer.
wkb | The buffer to write WKB byte string into. |
shallow_copy | Whether do shallow copy by using this object's memory without owning it or duplicating the byte string. |
|
inline |
|
inline |
|
protected |
|
static |
Construct a Geometry object using GEOMETRY byte string.
This function is called by all GIS functions to make a Geometry object from a GEOMETRY byte string, which can come from table storage, or returned from other GIS function, or directly provided by user via client.
The WKB can be of either endianness — when user directly pass WKB byte string to us, he/she can pass big endian WKB, otherwise the WKB is always little endian. And we should reject big endian WKB because all the rest of the GIS code assumes the internal WKB data being always little endian.
buffer | The place where the Geometry object is constructed on. |
data | is a byte string with an optional srid prepending a WKB format byte string, which is called a GEOMETRY byte string and which is the inner storage format of all geometries in MySQL. |
data_len | number of bytes of the byte string referred by data. |
has_srid | whether data argument starts with an srid or not. By default it's true, if false, data starts with WKB header, and caller is responsible to specify an srid to this object later. |
|
inlinestatic |
|
inlinevirtual |
|
static |
|
static |
Read from 'wkb' (which contains WKB encoded in either endianness) the geometry data, and write WKB of returned Geometry object in little endianness into 'res', and also create geometry object on 'buffer' and return it.
The returned Geometry object points to bytes (without WKB HEADER) in 'res'.
thd | Thread context. |
buffer | the place to create the returned Geometry object at. |
wkb | the input WKB buffer which contains WKB of either endianness. |
len | the number of bytes of WKB in 'wkb'. |
res | the buffer to write little endian WKB into. |
init_stream | Whether set WKB buffer pointer to returned Geometry object. |
|
static |
Read wkt text from trs, and write little endian wkb encoding into 'wkt', and create a Geometry instance in 'buffer'.
If 'init_stream' is true, shallow assign data in 'wkt' to the Geometry object to be returned.
buffer | Place to create the returned Geometry object at. |
trs | WKT read stream. |
wkb | Little endian WKB buffer for WKB data of the returned Geometry object. |
init_stream | Whether set WKB buffer pointer to returned Geometry object. |
check_trailing | Whether to flag an error (by returning nullptr) if there are trailing bytes in the string. |
|
protected |
Create a point from data.
[out] | result | Put result here |
wkb | Data for point is here. |
|
inline |
|
inlinevirtual |
Reimplemented in Gis_geometry_collection.
|
inlinevirtual |
Reimplemented in Gis_wkb_vector< T >, Gis_wkb_vector< Gis_point >, Gis_wkb_vector< Gis_line_string >, Gis_wkb_vector< Gis_polygon >, and Gis_polygon.
|
inlinevirtual |
Reimplemented in Gis_line_string.
bool Geometry::envelope | ( | MBR * | mbr | ) | const |
bool Geometry::envelope | ( | String * | result | ) | const |
|
inlinevirtual |
Reimplemented in Gis_polygon.
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
staticprotected |
|
inlinestaticprotected |
|
inlinevirtual |
Reimplemented in Gis_line_string, and Gis_multi_line_string.
Reimplemented in Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inline |
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inline |
|
inline |
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inline |
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
protected |
Get most bounding rectangle (mbr) for X points.
[out] | mbr | Result |
wkb | Data for point is here. | |
offset | Offset between points |
|
inline |
|
inline |
Build an OGC standard type value from m_flags.zm and m_flags.geotype.
For now m_flags.zm is always 0 so simply call get_geotype(). We don't directly store the OGC defined values in order to save more bits of m_flags for other purposes; and also separating zm settings from basic geometry types is easier for coding and geometry type identification.
When we start to support Z/M settings we need to modify all code which call write_wkb_header and write_geometry_header to pass to them an OGC standard type value returned by this function or built similarly. And by doing so our internal runtime geometry type encoding will work consistently with OGC defined standard geometry type values in byte strings of WKB format.
|
inline |
|
inline |
Returns whether this object has its own memory.
If so, the memory is released when this object is destroyed.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinevirtual |
Reimplemented in Gis_point.
|
inlinevirtual |
Reimplemented in Gis_point.
|
inline |
|
inline |
|
inlineprotected |
If call Gis_wkb_vector<T>::resize() to add a component to X, the geometry may have a geometry not stored inside the WKB buffer of X, hence X has out of line component.
For such an X, user should call Gis_wkb_vector<T>::reassemble() before fetching its WKB data.
|
inlineprotected |
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inlinevirtual |
Reimplemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
Reimplemented in Gis_polygon.
|
inline |
Whether the Geometry object is created to be used by Boost Geometry or only by MySQL.
There are some operations that only work for one type and can or must be skipped otherwise.
|
inlinevirtual |
Reimplemented in Gis_line_string, and Gis_multi_line_string.
|
inline |
|
inlineprotected |
|
inline |
|
inline |
|
inline |
|
inlinestatic |
Check if a given geometry type is a valid internal geometry type.
Both OpenGIS standard geometry types and internal geometry types of MySQL are regarded as valid.
gt | geometry type to check |
true | valid geometry type |
false | invalid geometry type |
|
inlinestatic |
Check if a given geometry type is a valid internal geometry type.
Both OpenGIS standard geometry types and internal geometry types of MySQL are regarded as valid.
gtype | geometry type to check |
true | valid geometry type |
false | invalid geometry type |
|
inlinestatic |
Check if a given geometry type is a valid geometry type according to OpenGIS.
Internal geometry types of MySQL are regarded as invalid.
gtype | geometry type to check |
true | valid geometry type |
false | invalid geometry type |
|
static |
Verify that a string is a well-formed GEOMETRY string.
This does not check if the geometry is geometrically valid.
from | String to check |
length | Length of string |
type | Expected type of geometry, or Geometry::wkb_invalid_type if any type is allowed |
bo | byte order |
const void * Geometry::normalize_ring_order | ( | ) |
In place normalize polygons' rings, making outer ring CCW and inner rings CW by reversing the ring's points in the WKB buffer inplace.
This function can not be made a virtual function since BG adapter geometry objects may also need it.
|
inlinevirtual |
Reimplemented in Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inlinevirtual |
Reimplemented in Gis_polygon.
|
inlinevirtual |
Reimplemented in Gis_line_string.
Assignment operator for Geometry class, assignment operators of children classes calls this to do general assignment.
Reimplemented in Gis_line_string.
|
inlineprotected |
In a polygon usable by boost geometry, the m_ptr points to the outer ring object, and m_inn_rings points to the inner rings, thus the polygon's data isn't stored in a single WKB.
Users should call Gis_polygon::to_wkb_unparsed()
before getting the polygon's wkb data, Gis_polygon::to_wkb_unparsed()
will form a single WKB for the polygon and refer to it with m_ptr, and release the outer ring object and the inner rings objects, and such an polygon isn't usable by BG any more, it's exactly what we got with Geometry::create_from_wkt
/ Geometry::create_from_wkt
.
|
inlineprotected |
|
pure virtual |
Reverses the coordinates of a geometry.
Switches the coordinates of the wkb string pointed to by the Geometry. Ex: Used on a POINT(5,2), the result would be POINT(2, 5).
false | coordinate reversal was successful |
true | coordinate reversal was unsuccessful |
Implemented in Gis_point, Gis_wkb_vector< T >, Gis_wkb_vector< Gis_point >, Gis_wkb_vector< Gis_line_string >, Gis_wkb_vector< Gis_polygon >, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, and Gis_geometry_collection.
|
inline |
Set whether this object is a BG adapter.
b | true if it's a BG adapter, false otherwise. Have to declare this as const because even when a Geometry object's const adapter member function is called, it's regarded as a BG adapter object. |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlineprotected |
|
inline |
|
inline |
|
inline |
Set whether this object has its own memory.
If so, the memory is released when this object is destroyed.
b | true if this object has its own memory, false otherwise. |
|
inline |
|
inline |
|
inline |
|
inlineprotectedvirtual |
Reimplemented in Gis_wkb_vector< T >, Gis_wkb_vector< Gis_point >, Gis_wkb_vector< Gis_line_string >, and Gis_wkb_vector< Gis_polygon >.
|
inlinevirtual |
Reimplemented in Gis_line_string.
|
pure virtual |
Check that the coordinates of a geometry is within the valid range.
Checks if the coordinates in a geometry are within allowed range of a geographic spatial reference system. Valid range for longitude and latitude coordinates in geographic spatial reference systems are (-180, 180) and [-90, 90] degrees, respectively.
[in] | srs_angular_unit | Unit to radians conversion factor. |
[out] | long_out_of_range | Longitude is out of range. |
[out] | lat_out_of_range | Latitude is out of range. |
[out] | out_of_range_value | The value that is out of range. |
false | Coordinates are within allowed range. |
true | Coordinates are not within allowed range, or an error occurred during range checking. |
Implemented in Gis_point, Gis_line_string, Gis_polygon, Gis_multi_point, Gis_multi_line_string, Gis_multi_polygon, Gis_geometry_collection, Gis_wkb_vector< T >, Gis_wkb_vector< Gis_point >, Gis_wkb_vector< Gis_line_string >, and Gis_wkb_vector< Gis_polygon >.
|
friend |
Parse the wkb buffer to build the component vector m_geo_vect for geom.
Set each geometry's wkb pointer into the Geometry objects inside m_geo_vect. Make it a standalone function in order to be able to access classes defined after class template Gis_wkb_vector.
geom | the geometry to analyze and parse. |
p | points to the geometry's wkb data's 1st byte, right after its wkb header if any. |
num_geoms | number of following geometries, to be used only when parsing the WKB of a polygon's inner rings because there is no WKB header for the inner rings only. |
|
static |
|
static |
|
static |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
mutableprivate |
Flags and meta information about this object.
Make it mutable to modify some flags in const member functions.
|
protected |
The topmost (root) geometry object, whose m_ptr is the 1st byte of a wkb memory buffer.
other geometry objects hold m_ptr which points inside somewhere in the memory buffer. when updating a geometry object, need to ask m_owner to reallocate memory if needed for new data.
|
protected |
Pointer to the geometry's wkb data's 1st byte, right after its wkb header if any.
If the geometry is wkb_polygon, this field is a Gis_polygon_ring* pointer, pointing to the outer ring. Outer ring's wkb data is in the same wkb buffer as the inner rings, so we can get the wkb header from the outer ring like ((Geometry*)m_ptr)->get_ptr().
|
private |
Srid of this object.
|
static |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |