mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
4b04c84f09
Updates according to last changes Docs/gis.txt: Updates according to last changes
874 lines
31 KiB
Text
874 lines
31 KiB
Text
|
||
OpenGIS <http://www.opengis.org> support in MySQL
|
||
|
||
------------------------------------------------------------------------
|
||
Note: Blue colored lines among the text is features not implemented yet.
|
||
They are:
|
||
|
||
* Spatial Reference Systems and their IDs (SRIDs) related things:
|
||
o Functions like Length() and Area() assume planar coordinate
|
||
system.
|
||
o All objects are currently considered to be in the same
|
||
planar coordinate system.
|
||
* Function Length() on LineString and MultiLineString currently
|
||
should be called as GLength().
|
||
* No binary constructors like GeomFromWKB().
|
||
|
||
We also have to add "PostGIS compatibility" sections.
|
||
|
||
|
||
1 Introduction
|
||
|
||
MySQL implements a subset of *SQL2 with Geometry Types* environment
|
||
proposed by OpenGIS consortium's *Simple Features Specification For
|
||
SQL*. In this environment a geometry-valued column is implemented as a
|
||
column whose SQL type is drawn from the set of Geometry Types. SQL
|
||
server supports both textual and binary access to geometry.
|
||
|
||
|
||
2 OpenGIS Geometry Model in MySQL
|
||
|
||
MySQL supports the Open GIS Geometry Model based hierarcy of spatial
|
||
objects classes, which consists of:
|
||
|
||
* Geometry
|
||
o *Point*
|
||
o Curve
|
||
+ *LineString*
|
||
o Surface
|
||
+ *Polygon*
|
||
o *GeometryCollection*
|
||
+ *MultiPoint*
|
||
+ MultiCurve
|
||
# *MultiLineString*
|
||
+ MultiSurface
|
||
# *MultiPolygon*
|
||
|
||
The base *Geometry* class has subclasses for Point, Curve, Surface and
|
||
GeometryCollection.
|
||
|
||
Geometry, Curve, Surface, MultiCurve and MultiSurface are defined to be
|
||
non-instantiable classes, it is not possible to create an object of
|
||
these classes.
|
||
|
||
Point, LineString, Polygon, GeometryCollection, MultiPoint,
|
||
MultiLineString, MultiPolygon are instantiable classes (bolded on the
|
||
hierarcy tree). MySQL provides a number of functions to construct
|
||
instances of these classes.
|
||
|
||
TODO: Each spatial object is associated with a Spatial Reference System,
|
||
which describes the coordinate space in which the geometric object is
|
||
defined.
|
||
|
||
|
||
2.1 Geometry
|
||
|
||
Geometry is the root class of the hierarchy. Geometry is an abstract
|
||
(non-instantiable) class. The instantiable subclasses of Geometry
|
||
defined in this specification are restricted to 0, 1 and two-dimensional
|
||
geometric objects that exist in two-dimensional coordinate space. All
|
||
instantiable geometry classes are defined so that valid instances of a
|
||
geometry class are topologically closed (i.e. all defined geometries
|
||
include their boundary).
|
||
|
||
|
||
2.2 Point
|
||
|
||
A *Point* is a 0-dimensional geometry and represents a single location
|
||
in coordinate space. A Point in the case of 2D has a x-coordinate value
|
||
and a y-coordinate value. In the case of more dimensions, a Point has a
|
||
coordinate value for each dimension. The boundary of a Point is the
|
||
empty set.
|
||
|
||
|
||
2.3 Curve
|
||
|
||
A *Curve* is a one-dimensional geometric object usually stored as a
|
||
sequence of points, with the subclass of Curve specifying the form of
|
||
the interpolation between points. MySQL implementation defines only one
|
||
subclass of Curve, LineString, which uses linear interpolation between
|
||
points.
|
||
|
||
A Curve is simple if it does not pass through the same point twice. A
|
||
Curve is closed if its start point is equal to its end point. The
|
||
boundary of a closed Curve is empty. A Curve that is simple and closed
|
||
is a Ring. The boundary of a non-closed Curve consists of its two end
|
||
points. A Curve is defined as topologically closed.
|
||
|
||
|
||
2.4 LineString, Line, LinearRing
|
||
|
||
A LineString is a Curve with linear interpolation between points. Each
|
||
consecutive pair of points defines a line segment. A Line is a
|
||
LineString with exactly 2 points. A LinearRing is a LineString that is
|
||
both closed and simple.
|
||
|
||
|
||
2.5 Surface
|
||
|
||
A *Surface* is a two-dimensional geometric object. The OpenGIS Abstract
|
||
Specification defines a simple Surface as consisting of a single 'patch'
|
||
that is associated with one 'exterior boundary' and 0 or more 'interior'
|
||
boundaries. Simple surfaces in three-dimensional space are isomorphic to
|
||
planar surfaces. Polyhedral surfaces are formed by 'stitching' together
|
||
simple surfaces along their boundaries, polyhedral surfaces in
|
||
three-dimensional space may not be planar as a whole.
|
||
|
||
The boundary of a simple Surface is the set of closed curves
|
||
corresponding to its exterior and interior boundaries.
|
||
|
||
The only instantiable subclass of Surface defined in this specification,
|
||
Polygon, is a simple Surface that is planar.
|
||
|
||
|
||
2.6 Polygon
|
||
|
||
A Polygon is a planar Surface, defined by 1 exterior boundary and 0 or
|
||
more interior boundaries. Each interior boundary defines a hole in the
|
||
Polygon. The assertions for polygons (the rules that define valid
|
||
polygons) are:
|
||
|
||
* Polygons are topologically closed.
|
||
* The boundary of a Polygon consists of a set of LinearRings (i.e.
|
||
LineStrings which are both simple and closed) that make up its
|
||
exterior and interior boundaries.
|
||
* No two rings in the boundary cross, the rings in the boundary of a
|
||
Polygon may intersect at a Point but only as a tangent.
|
||
* A Polygon may not have cut lines, spikes or punctures.
|
||
* The Interior of every Polygon is a connected point set.
|
||
* The Exterior of a Polygon with 1 or more holes is not connected.
|
||
Each hole defines a connected component of the Exterior.
|
||
|
||
In the above assertions, Interior, Closure and Exterior have the
|
||
standard topological definitions. The combination of 1 and 3 make a
|
||
Polygon a Regular Closed point set. Polygons are simple geometries.
|
||
|
||
|
||
2.6 GeometryCollection
|
||
|
||
A *GeometryCollection* is a geometry that is a collection of 1 or more
|
||
geometries of any class. All the elements in a GeometryCollection must
|
||
be in the same Spatial Reference (i.e. in the same coordinate system).
|
||
GeometryCollection places no other constraints on its elements. However
|
||
subclasses of GeometryCollection described below may restrict membership
|
||
based on dimension and may also place other constraints on the degree of
|
||
spatial overlap between elements.
|
||
|
||
|
||
2.7 MultiPoint
|
||
|
||
A *MultiPoint* is a 0 dimensional geometric collection. The elements of
|
||
a MultiPoint are restricted to Points. The points are not connected or
|
||
ordered. A MultiPoint is simple if no two Points in the MultiPoint are
|
||
equal (have identical coordinate values). The boundary of a MultiPoint
|
||
is the empty set.
|
||
|
||
|
||
2.8 MultiCurve
|
||
|
||
A MultiCurve is a one-dimensional geometry collection whose elements are
|
||
Curves. MultiCurve is a non-instantiable class, it defines a set of
|
||
methods for its subclasses and is included for reasons of extensibility.
|
||
|
||
A MultiCurve is simple if and only if all of its elements are simple,
|
||
the only intersections between any two elements occur at points that are
|
||
on the boundaries of both elements.
|
||
|
||
The boundary of a MultiCurve is obtained by applying the "mod 2 union
|
||
rule": A point is in the boundary of a MultiCurve if it is in the
|
||
boundaries of an odd number of elements of the MultiCurve.
|
||
|
||
A MultiCurve is closed if all of its elements are closed. The boundary
|
||
of a closed MultiCurve is always empty. A MultiCurve is defined as
|
||
topologically closed.
|
||
|
||
|
||
2.9 MultiLineString
|
||
|
||
A *MultiLineString* is a MultiCurve whose elements are LineStrings.
|
||
|
||
|
||
2.10 MultiSurface
|
||
|
||
A MultiSurface is a two-dimensional geometric collection whose elements
|
||
are surfaces. The interiors of any two surfaces in a MultiSurface may
|
||
not intersect. The boundaries of any two elements in a MultiSurface may
|
||
intersect at most at a finite number of points.
|
||
|
||
MultiSurface is a non-instantiable class in this specification, it
|
||
defines a set of methods for its subclasses and is included for reasons
|
||
of extensibility. The instantiable subclass of MultiSurface is
|
||
MultiPolygon, corresponding to a collection of Polygons.
|
||
|
||
|
||
2.11 MultiPolygon
|
||
|
||
A MultiPolygon is a MultiSurface whose elements are Polygons.
|
||
|
||
The assertions for MultiPolygons are :
|
||
|
||
* The interiors of 2 Polygons that are elements of a MultiPolygon
|
||
may not intersect.
|
||
* The Boundaries of any 2 Polygons that are elements of a
|
||
MultiPolygon may not cross and may touch at only a finite number
|
||
of points. (Note that crossing is prevented by assertion 1 above).
|
||
* A MultiPolygon is defined as topologically closed.
|
||
* A MultiPolygon may not have cut lines, spikes or punctures, a
|
||
MultiPolygon is a Regular, Closed point set.
|
||
* The interior of a MultiPolygon with more than 1 Polygon is not
|
||
connected, the number of connected components of the interior of a
|
||
MultiPolygon is equal to the number of Polygons in the MultiPolygon.
|
||
|
||
The boundary of a MultiPolygon is a set of closed curves (LineStrings)
|
||
corresponding to the boundaries of its element Polygons. Each Curve in
|
||
the boundary of the MultiPolygon is in the boundary of exactly 1 element
|
||
Polygon, and every Curve in the boundary of an element Polygon is in the
|
||
boundary of the MultiPolygon.
|
||
|
||
|
||
3 Exchange of spatial data
|
||
|
||
MySQL provides binary and textual mechanismes to exchange spatial data.
|
||
Exchange is provided via so called Well Known Binary (WKB) and Well
|
||
Known Textual (WKT) representations of spatial data proposed by OpenGIS
|
||
specifications.
|
||
|
||
|
||
3.1 Well-known Text representation (WKT)
|
||
|
||
The Well-known Text (WKT) representation of Geometry is designed to
|
||
exchange geometry data in textual format.
|
||
|
||
WKT is defined below in Bechus-Naur forms:
|
||
|
||
* the notation {}* denotes 0 or more repetitions of the tokens
|
||
within the braces;
|
||
* the braces do not appear in the output token list.
|
||
|
||
The text representation of the implemented instantiable geometric types
|
||
conforms to this grammar:
|
||
|
||
<Geometry Tagged Text> :=
|
||
<Point Tagged Text>
|
||
| <LineString Tagged Text>
|
||
| <Polygon Tagged Text>
|
||
| <MultiPoint Tagged Text>
|
||
| <MultiLineString Tagged Text>
|
||
| <MultiPolygon Tagged Text>
|
||
| <GeometryCollection Tagged Text>
|
||
|
||
<Point Tagged Text> :=
|
||
|
||
POINT <Point Text>
|
||
|
||
<LineString Tagged Text> :=
|
||
|
||
LINESTRING <LineString Text>
|
||
|
||
<Polygon Tagged Text> :=
|
||
|
||
POLYGON <Polygon Text>
|
||
|
||
<MultiPoint Tagged Text> :=
|
||
|
||
MULTIPOINT <Multipoint Text>
|
||
|
||
<MultiLineString Tagged Text> :=
|
||
|
||
MULTILINESTRING <MultiLineString Text>
|
||
|
||
<MultiPolygon Tagged Text> :=
|
||
|
||
MULTIPOLYGON <MultiPolygon Text>
|
||
|
||
<GeometryCollection Tagged Text> :=
|
||
|
||
GEOMETRYCOLLECTION <GeometryCollection Text>
|
||
|
||
<Point Text> := EMPTY | ( <Point> )
|
||
|
||
<Point> := <x> <y>
|
||
|
||
<x> := double precision literal
|
||
|
||
<y> := double precision literal
|
||
|
||
<LineString Text> := EMPTY
|
||
|
||
| ( <Point > {, <Point > }* )
|
||
|
||
<Polygon Text> := EMPTY
|
||
|
||
| ( <LineString Text > {, < LineString Text > }*)
|
||
|
||
<Multipoint Text> := EMPTY
|
||
|
||
| ( <Point Text > {, <Point Text > }* )
|
||
|
||
<MultiLineString Text> := EMPTY
|
||
|
||
| ( <LineString Text > {, < LineString Text > }* )
|
||
|
||
<MultiPolygon Text> := EMPTY
|
||
|
||
| ( < Polygon Text > {, < Polygon Text > }* )
|
||
|
||
<GeometryCollection Text> := EMPTY
|
||
|
||
| ( <Geometry Tagged Text> {, <Geometry Tagged Text> }* )
|
||
|
||
|
||
WKT examples
|
||
|
||
Examples of textual representations of Geometry objects are shown below:
|
||
|
||
* |POINT(10 10)| - a Point
|
||
* |LINESTRING( 10 10, 20 20, 30 40)| - a LineString with three points
|
||
* |POLYGON((10 10, 10 20, 20 20,20 15, 10 10))| - a Polygon with one
|
||
exterior ring and 0 interior rings
|
||
* |MULTIPOINT(10 10, 20 20)| - a MultiPoint with two Points
|
||
* |MULTILINESTRING((10 10, 20 20), (15 15, 30 15))| - a
|
||
MultiLineString with two LineStrings
|
||
* |MULTIPOLYGON(((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70
|
||
70, 80 60, 60 60 ) ))| - a MultiPolygon with two Polygons
|
||
* |GEOMETRYCOLLECTION( POINT (10 10),POINT (30 30), LINESTRING (15
|
||
15, 20 20))| - a GeometryCollection consisting of two Points and
|
||
one LineString
|
||
|
||
|
||
3.2 Well-known Binary representation (WKB)
|
||
|
||
Well Known Binary Representations is proposed by OpenGIS specifications
|
||
to exchange geometry data in binary format. This is WKB description:
|
||
|
||
// Basic Type definitions
|
||
// byte : 1 byte
|
||
// uint32 : 32 bit unsigned integer (4 bytes)
|
||
// double : double precision number (8 bytes)
|
||
// Building Blocks : Point, LinearRing
|
||
|
||
Point {
|
||
double [numDimentions];
|
||
};
|
||
|
||
LinearRing {
|
||
uint32 numPoints;
|
||
Point points[numPoints];
|
||
}
|
||
|
||
enum wkbGeometryType {
|
||
wkbPoint = 1,
|
||
wkbLineString = 2,
|
||
wkbPolygon = 3,
|
||
wkbMultiPoint = 4,
|
||
wkbMultiLineString = 5,
|
||
wkbMultiPolygon = 6,
|
||
wkbGeometryCollection = 7
|
||
};
|
||
|
||
enum wkbByteOrder {
|
||
wkbXDR = 0, // Big Endian
|
||
wkbNDR = 1 // Little Endian
|
||
};
|
||
|
||
WKBPoint {
|
||
byte byteOrder;
|
||
uint32 wkbType; // 1
|
||
Point point;
|
||
}
|
||
|
||
WKBLineString {
|
||
byte byteOrder;
|
||
uint32 wkbType; // 2
|
||
uint32 numPoints;
|
||
Point points[numPoints];
|
||
}
|
||
|
||
WKBPolygon {
|
||
byte byteOrder;
|
||
uint32 wkbType; // 3
|
||
uint32 numRings;
|
||
LinearRing rings[numRings];
|
||
}
|
||
|
||
WKBMultiPoint {
|
||
byte byteOrder;
|
||
uint32 wkbType; // 4
|
||
uint32 num_wkbPoints;
|
||
WKBPoint WKBPoints[num_wkbPoints];
|
||
}
|
||
|
||
WKBMultiLineString {
|
||
byte byteOrder;
|
||
uint32 wkbType; // 5
|
||
uint32 num_wkbLineStrings;
|
||
WKBLineString WKBLineStrings[num_wkbLineStrings];
|
||
}
|
||
|
||
wkbMultiPolygon {
|
||
byte byteOrder;
|
||
uint32 wkbType; // 6
|
||
uint32 num_wkbPolygons;
|
||
WKBPolygon wkbPolygons[num_wkbPolygons];
|
||
}
|
||
|
||
WKBGeometry {
|
||
union {
|
||
WKBPoint point;
|
||
WKBLineString linestring;
|
||
WKBPolygon polygon;
|
||
WKBGeometryCollection collection;
|
||
WKBMultiPoint mpoint;
|
||
WKBMultiLineString mlinestring;
|
||
WKBMultiPolygon mpolygon;
|
||
}
|
||
|
||
};
|
||
|
||
WKBGeometryCollection {
|
||
byte byte_order;
|
||
uint32 wkbType; // 7
|
||
uint32 num_wkbGeometries;
|
||
WKBGeometry wkbGeometries[num_wkbGeometries];
|
||
}
|
||
|
||
|
||
3.3 MySQL data types for spatial objects
|
||
|
||
MySQL implementation of OpenGIS provides the *GEOMETRY* data type to be
|
||
used in CREATE TABLE statements. For example, this statement creates a
|
||
table *geom* with spatial field *g*:
|
||
|
||
CREATE TABLE geom (
|
||
g Geometry;
|
||
);
|
||
|
||
A field of *GEOMETRY* type can store a spatial objects of any OpenGIS
|
||
geometry class described above.
|
||
|
||
|
||
3.4 Internal spatial data representation
|
||
|
||
Internally (in *.MYD* files) spatial objects are stored in *WKB*,
|
||
combined with object's *SRID* (a numeric ID of Spatial Reference System
|
||
object associated with). During spatial analysis, for example,
|
||
calculating the fact that one object crosses another one, only those
|
||
with the same *SRID* are accepted.
|
||
|
||
*SRID* may affect a way in which various spatial characteristics are
|
||
calculated. For example, in different coordinate systems distance
|
||
between two objects may differ even objects have the same coordinates,
|
||
like distance on plane coordinate system and distance on geocentric
|
||
(coordinates on Earth surface) systems are different things.
|
||
|
||
There is a plan to provide a number of commonly used coordinate systems
|
||
in MySQL OpenGIS implementation.
|
||
|
||
|
||
3.5 INSERTing spatial objects
|
||
|
||
Spatial data can be INSERTed using a spatial constructor. The term
|
||
*spatial constructor* is used in this manual to refer to any function
|
||
which can construct a value of GEOMETRY type, i.e. an internal MySQL
|
||
representation of spatial data.
|
||
|
||
|
||
3.5.1 Textual spatial constructors
|
||
|
||
Textual spatial constructors take a gemometry description in WKT and
|
||
built GEOMETRY value.
|
||
|
||
* |*GeomFromText(geometryTaggedText String [, SRID
|
||
Integer]):Geometry *| - constructs a Geometry value from its
|
||
well-known textual representation.
|
||
|
||
|*GeomFromText()*| function accepts a WKT of any Geometry class as
|
||
it's first argument.
|
||
|
||
For construction of Geometry values restricted to a particular
|
||
subclass, an implementation also provides a class-specific
|
||
construction function for each instantiable subtype as described
|
||
in the list below:
|
||
|
||
* |*PointFromText(pointTaggedText String [,SRID Integer]):Point *| -
|
||
constructs a Point
|
||
|
||
* |*LineFromText(lineStringTaggedText String [,SRID
|
||
Integer]):LineString *| - constructs a LineString
|
||
|
||
. |*LineStringFromText()*| - synonym for LineFromText().
|
||
|
||
* |*PolyFromText(polygonTaggedText String [,SRID Integer]):Polygon
|
||
*|- constructs a Polygon
|
||
|
||
|*PolygonFromText()*| - synonym for PolyFromText().
|
||
|
||
* |*MPointFromText(multiPointTaggedText String [,SRID
|
||
Integer]):MultiPoint *| - constructs a MultiPoint
|
||
|
||
|*MultiPointFromText()*| - synonym for MPointFromText().
|
||
|
||
* |*MLineFromText(multiLineStringTaggedText String [,SRID
|
||
Integer]):MultiLineString *| - constructs a MultiLineString
|
||
|
||
|*MultiLineStringFromText()*| - synonym for MLineFromText().
|
||
|
||
* |*MPolyFromText(multiPolygonTaggedText String [,SRID
|
||
Integer]):MultiPolygon *| - constructs a MultiPolygon
|
||
|
||
|*MultiPolygonFromText()*| - synonym for MPolyFromText().
|
||
|
||
* |*GeomCollFromText(geometryCollectionTaggedText String [,SRID
|
||
Integer]):GeomCollection *| - constructs a GeometryCollection
|
||
|
||
Usage examples:
|
||
|
||
INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'))
|
||
INSERT INTO geom VALUES (GeomFromText('LINESTRING(0 0,1 1,2 2)'))
|
||
INSERT INTO geom VALUES (GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))'))
|
||
INSERT INTO geom VALUES (GeomFromText('GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))'))
|
||
|
||
The second argument of spatial constructirs, described above, is
|
||
currently ignored, It will be used to specify SRID in the future.
|
||
Nowdays, it is added for reasons of compatibility with OpenGIS
|
||
specifications and PostGIS implementation.
|
||
|
||
As an optional feature, an implementation may also support building of
|
||
Polygon or MultiPolygon values given an arbitrary collection of possibly
|
||
intersecting rings or closed LineString values. Implementations that
|
||
support this feature should include the following functions:
|
||
|
||
* |*BdPolyFromText(multiLineStringTaggedText String, SRID
|
||
Integer):Polygon *| - constructs a Polygon given an arbitrary
|
||
collection of closed linestrings as a MultiLineString text
|
||
representation.
|
||
* |*BdMPolyFromText(multiLineStringTaggedText String, SRID
|
||
Integer):MultiPolygon *| - constructs a MultiPolygon given an
|
||
arbitrary collection of closed linestrings as a MultiLineString
|
||
text representation.
|
||
|
||
|
||
3.5.2 Binary spatial constructors
|
||
|
||
* |*GeomFromWKB(WKBGeometry Binary, SRID Integer):Geometry *| -
|
||
constructs a Geometry value given its well-known binary
|
||
representation.
|
||
|
||
|*GeomFromWKB()*| function can accept in it's first argument a WKB
|
||
of Geometry of any class. For construction of Geometry values
|
||
restricted to a particular subclass, an implementation also
|
||
provides a class-specific construction function for each
|
||
instantiable subclass as described in the list below:
|
||
|
||
* |*PointFromWKB(WKBPoint Binary, SRID Integer):Point - *|constructs
|
||
a Point
|
||
* |* LineFromWKB(WKBLineString Binary, SRID Integer):LineString *| -
|
||
constructs a LineString
|
||
* |* PolyFromWKB(WKBPolygon Binary, SRID Integer):Polygon *| -
|
||
constructs a Polygon
|
||
* |* MPointFromWKB(WKBMultiPoint Binary, SRID Integer):MultiPoint *|
|
||
- constructs a MultiPoint
|
||
* |* MLineFromWKB(WKBMultiLineString Binary, SRID
|
||
Integer):MultiLineString *| - constructs a MultiLineString
|
||
* |* MPolyFromWKB(WKBMultiPolygon Binary, SRID Integer):
|
||
MultiPolygon *| - constructs a MultiPolygon
|
||
* |* GeomCollFromWKB(WKBGeometryCollection Binary, SRID Integer):
|
||
GeomCollection *| - constructs a GeometryCollection
|
||
|
||
As an optional feature, an implementation may also support the uilding'
|
||
of Polygon or MultiPolygon values given an arbitrary collection of
|
||
possibly intersecting rings or closed LineString values. Implementations
|
||
that support this feature should include the following functions:
|
||
|
||
* |* BdPolyFromWKB (WKBMultiLineString Binary,SRID Integer): Polygon
|
||
*| - constructs a Polygon given an arbitrary collection of closed
|
||
linestrings as a MultiLineString binary representation.
|
||
* |*BdMPolyFromWKB(WKBMultiLineString Binary, SRID
|
||
Integer):MultiPolygon *| - constructs a MultiPolygon given an
|
||
arbitrary collection of closed linestrings as a MultiLineString
|
||
binary representation.
|
||
|
||
Inserting in *WKB* assumes that |GeomFromWKB()| function argument
|
||
contains a buffer with a correctly formed spatial object in WKB. In ODBC
|
||
applications it can be done using binding of argument. One also can
|
||
insert object in *WKB* using |mysql_escape_string()| in |libmysqlclient|
|
||
applications.
|
||
|
||
For example:
|
||
|
||
INSERT INTO geom VALUES (GeomFromWKB(buf,SRID));
|
||
|
||
where |buf| is a binary buffer with a spatial object in *WKB*
|
||
representation.
|
||
|
||
|
||
3.5 SELECTing spatial objects
|
||
|
||
Spatial objects are selected either in *WKT* or *WKB* representation by
|
||
use of AsText() and AsBinary() functions correspondently.
|
||
|
||
|
||
mysql> select AsText(g) as g from geom;
|
||
+-------------------------+
|
||
| g |
|
||
+-------------------------+
|
||
| POINT(1 1) |
|
||
| LINESTRING(0 0,1 1,2 2) |
|
||
+-------------------------+
|
||
2 rows in set (0.00 sec)
|
||
|
||
mysql>
|
||
|
||
The query:
|
||
|
||
SELECT AsBinary(g) FROM geom
|
||
|
||
returns a BLOB which contains *WKB* representation of object.
|
||
|
||
|
||
4 Functions for spatial analysis
|
||
|
||
|
||
4.1 Basic functions on Geometry
|
||
|
||
* |*AsText(g:Geometry):String*| - Exports this Geometry to a
|
||
specific well-known text representation of Geometry.
|
||
* |*AsBinary(g:Geometry):Binary*| - Exports this Geometry to a
|
||
specific well-known binary representation of Geometry.
|
||
* |*GeometryType(g:Geometry):String*| - Returns the name of the
|
||
instantiable subtype of Geometry of which this Geometry instance
|
||
is a member. The name of the instantiable subtype of Geometry is
|
||
returned as a string.
|
||
* |*Dimension(g:Geometry):Integer*| - The inherent dimension of this
|
||
Geometry object, which must be less than or equal to the
|
||
coordinate dimension. This specification is restricted to
|
||
geometries in two-dimensional coordinate space.
|
||
* |*IsEmpty(g:Geometry):Integer*| - Returns 1 (TRUE) if this
|
||
Geometry is the empty geometry . If true, then this Geometry
|
||
represents the empty point set, , for the coordinate space.
|
||
* |*IsSimple(g:Geometry):Integer *| - Returns 1 (TRUE) if this
|
||
Geometry has no anomalous geometric points, such as self
|
||
intersection or self tangency. The description of each
|
||
instantiable geometric class includes the specific conditions that
|
||
cause an instance of that class to be classified as not simple.
|
||
* |*SRID(g:Geometry):Integer*| - Returns the Spatial Reference
|
||
System ID for this Geometry.
|
||
* |*Distance(g1:Geometry,g2:Geometry):Double*| - the shortest
|
||
distance between any two points in the two geometries.
|
||
|
||
|
||
4.2 Functions for specific geometry type
|
||
|
||
|
||
GeometryCollection functions
|
||
|
||
* *NumGeometries(g:GeometryCollection ):Integer * -Returns the
|
||
number of geometries in this GeometryCollection.
|
||
* *GeometryN(g:GeometryCollection,N:integer):Geometry * -Returns the
|
||
Nth geometry in this GeometryCollection.
|
||
|
||
|
||
Point functions
|
||
|
||
* *X(p:Point):Double* -The x-coordinate value for this Point.
|
||
* *Y(p:Point):Double* -The y-coordinate value for this Point.
|
||
|
||
|
||
LineString functions
|
||
|
||
* *StartPoint(l:LineString):Point* The start point of this LineString.
|
||
* *EndPoint(l:LineString):Point* The end point of this LineString.
|
||
* *PointN(l:LineString,N:Integer):Point* Returns the specified point
|
||
N in this Linestring.
|
||
* *Length(l:LineString):Double* The length of this LineString in its
|
||
associated spatial reference.
|
||
* *IsRing(l:LineString):Integer* Returns 1 (TRUE) if this LineString
|
||
is closed (StartPoint ( ) = EndPoint ( )) and this LineString is
|
||
simple (does not pass through the same point more than once).
|
||
* *IsClosed(l:LineString):Integer* Returns 1 (TRUE) if this
|
||
LineString is closed (StartPoint ( ) = EndPoint ( )).
|
||
* *NumPoints(l:LineString):Integer* The number of points in this
|
||
LineString.
|
||
|
||
|
||
MultiLineString functions
|
||
|
||
* *Length(m:MultiLineString):Double* The Length of this
|
||
MultiLineString which is equal to the sum of the lengths of the
|
||
elements.
|
||
* *IsClosed(m:MultiLineString):Integer* Returns 1 (TRUE) if this
|
||
MultiLineString is closed (StartPoint() = EndPoint() for each
|
||
LineString in this MultiLineString)
|
||
|
||
|
||
Polygon functions
|
||
|
||
* *Area(p:Polygon):Double* The area of this Polygon, as measured in
|
||
the spatial reference system of this Polygon.
|
||
* *Centroid(p:Polygon):Point* The mathematical centroid for this
|
||
Polygon as a Point. The result is not guaranteed to be on this
|
||
Polygon.
|
||
* *PointOnSurface(p:Polygon):Point* A point guaranteed to be on this
|
||
Polygon.
|
||
* *NumInteriorRing(p:Polygon):Integer* Returns the number of
|
||
interior rings in this Polygon.
|
||
* *ExteriorRing(p:Polygon):LineString* Returns the exterior ring of
|
||
this Polygon as a LineString.
|
||
* *InteriorRingN(p:Polygon,N:Integer):LineString* Returns the Nth
|
||
interior ring for this Polygon as a LineString.
|
||
|
||
|
||
MultiPolygon functions
|
||
|
||
* *Area(m:MultuSurface):Double* The area of this MultiPolygon, as
|
||
measured in the spatial reference system of this MultiPolygon.
|
||
* *Centroid(m:MultyPolygon):Point* The mathematical centroid for
|
||
this MultiPolygon as a Point. The result is not guaranteed to be
|
||
on this MultiPolygon.
|
||
* *PointOnSurface(m:MultuPolygon):Point* A Point guaranteed to be on
|
||
this MultiPolygon.
|
||
|
||
Notes: /functions for specific geometry type retrun NULL if passed
|
||
object type is incorrect. For example Area() returns NULL if object type
|
||
is neither Polygon nor MultiPolygon/
|
||
|
||
|
||
4.3 Spatial operations (compound spatial constructors)
|
||
|
||
* |*Envelope(g:Geometry):Geometry*|The minimum bounding box for this
|
||
Geometry, returned as a Geometry. The polygon is defined by the
|
||
corner points of the bounding box
|
||
|POLYGON((MINX,MINY),(MAXX,MINY),(MAXX,MAXY),(MINX,MAXY),(MINX,MINY))|.
|
||
|
||
* |*Boundary(g:Geometry):Geometry*| - returns the closure of the
|
||
combinatorial boundary of this Geometry.
|
||
* |*Intersection(g1,g2:Geometry):Geometry*| - a geometry that
|
||
represents the point set intersection of g1 with g2.
|
||
* |*Union(g1,g2:Geometry):Geometry*| - a geometry that represents
|
||
the point set union of g1 with g2.
|
||
* |*Difference(g1,g2:Geometry):Geometry*| - a geometry that
|
||
represents the point set difference of g1 with g2.
|
||
* |*SymDifference(g1,g2:Geometry):Geometry*| - a geometry that
|
||
represents the point set symmetric difference of g1 with g2.
|
||
* |*Buffer(g:Geometry,distance:Double):Geometry*| - a geometry that
|
||
represents all points whose distance from g is less than or equal
|
||
to distance.
|
||
* |*ConvexHull(g:Geometry):Geometry*| - a geometry that represents
|
||
the convex hull of g.
|
||
|
||
|
||
4.4 Functions for testing Spatial Relations between geometric objects
|
||
|
||
* |*Equals(g1,g2)*| - Returns 1 if g1 is spatially equal to g2.
|
||
* |*Disjoint(g1,g2)*| - Returns 1 if g1 is spatially disjoint from g2.
|
||
* |*Intersects(g1,g2)*| - Returns 1 if g1 spatially intersects g2.
|
||
* |*Touches(g1,g2)*| - Returns 1 if g1 spatially touches g2.
|
||
* |*Crosses(g1,g2)*| - Returns 1 if g1 spatially crosses g2.
|
||
* |*Within(g1,g2)*| - Returns 1 if g1 is spatially within g2.
|
||
* |*Contains(g1,g2)*| - Returns 1 if g1 spatially contains g2.
|
||
* |*Overlaps(g1,g2)*| - Returns 1 if g1 spatially overlaps g2.
|
||
|
||
|
||
5 Optimizing spatial analysis
|
||
|
||
|
||
5.1 MBR
|
||
|
||
MBR is a minimal bounding rectangle (box) for spatial object. It can be
|
||
represented as a set of min and max values of each dimension.
|
||
|
||
For example:
|
||
|
||
(Xmin,Xmax,Ymin,Ymax)
|
||
|
||
|
||
5.2 Using SPATIAL indexes
|
||
|
||
To optimize spatial object relationships analysis it is possible to
|
||
create a spatial index on geometry field using R-tree algorythm. R-tree
|
||
based spatial indexes store MBRs of spatial objects as a key values.
|
||
|
||
CREATE SPATIAL INDEX gind ON geom (g);
|
||
|
||
Or together with table definition:
|
||
|
||
CREATE TABLE geom (
|
||
g GEOMETRY,
|
||
SPATIAL INDEX(g)
|
||
);
|
||
|
||
Optimizer attaches R-tree based SPATIAL index when a query with spatial
|
||
objects relationship functions is executed in WHERE clause.
|
||
|
||
For example:
|
||
|
||
SELECT geom.name FROM geom
|
||
WHERE Within(geom.g,GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))',SRID));
|
||
|
||
|
||
8 OpenGIS extensions implemented in MySQL
|
||
|
||
MySQL provides it's own constructors to build geometry objects:
|
||
|
||
* |*Point(double,double,SRID)*| - constructs a geometry of Point
|
||
class using it's coordinates and SRID.
|
||
* |*MultiPoint(Point,Point,...,Point)*| - constructs a MultiPoint
|
||
using Points. When any argument is not a geometry of Point class
|
||
the return value is NULL.
|
||
* |*LineString(Point,Point,...,Point)*| - constructs a LineString
|
||
from a number of Points. When any argument is not a geometry of
|
||
Point class the return value is NULL. When the number of Points is
|
||
less than two the return value is NULL.
|
||
* |*MultiLineString(LineString,LineString,...,LineString)*| -
|
||
constructs a MultiLineString using using LineStrings. When any
|
||
argument is not a geometry of LineStringClass return value is NULL.
|
||
* |*Polygon(LineString,LineString,...,LineString)*| - constructs a
|
||
Polygon from a number of LineStrings. When any argument is not a
|
||
LinearRing (i.e. not closed and simple geometry of class
|
||
LineString) the return value is NULL.
|
||
* |*MultiPolygon(Polygon,Polygon,...,Polygon)*| - constructs a
|
||
MultiPolygon from a set of Polygons. When any argument is not a
|
||
Polygon, the rerurn value is NULL.
|
||
* |*GeometryCollection(Geometry,Geometry,..,Geometry)*| - constucts
|
||
a GeometryCollection. When any argument is not a valid geometry
|
||
object of any instantiable class, the return value is NULL.
|
||
|
||
The above functions (except Point()) return NULL if arguments are not in
|
||
the same spatial reference system (i.e. have different SRIDs).
|
||
|
||
|
||
Examples:
|
||
|
||
INSERT INTO geom SELECT Point(x,y,SRID) FROM coords;
|
||
SELECT AsText(g) FROM geom WHERE
|
||
Contains(Polygon(LineString(Point(0,0),Point(0,1),Point(1,1),Point(1,0),Point(0,0)),SRID),geom.g);
|
||
|
||
|
||
9 Things that differ in MySQL implemention and OpenGIS specifications
|
||
|
||
|
||
9.1 Single GEOMETRY type
|
||
|
||
Besides a GEOMETRY type, OpenGIS consortium specifications suggest the
|
||
implementation of several spatial field types correspondent to every
|
||
instansiable object subclass. For example a *Point* type is proposed to
|
||
restrict data stored in a field of this type to only Point OpenGIS
|
||
subclass. MySQL provides an implementation of single GEOMETRY type which
|
||
doesn't restrict objects to certain OpenGIS subclass. Other proposed
|
||
spatial field types are mapped into GEOMETRY type, so all these types
|
||
can be used as a symonym for GEOMETRY: POINT, MULTIPOINT, LINESTRING,
|
||
MULTILINESTRING, POLYGON, MULTIPOLYGON.
|
||
|
||
|
||
9.2 No additional Metadata Views
|
||
|
||
OpenGIS specifications propose several additional metadata views. For
|
||
example, a system view named GEOMETRY_COLUMNS contains a description of
|
||
geometry columns, one row for each geometry column in the database.
|
||
|
||
|
||
9.3 No functions to add/drop spatial columns
|
||
|
||
OpenGIS assumes that columns can be added/dropped using
|
||
AddGeometryColumn() and DropGeometryColumn() functions correspondently.
|
||
In MySQL implementation one should use ALTER TABLE instead.
|