Mysql空间数据&空间索引(spatial)(3)
12.5.2.12 MultiSurface Class
AMultiSurfaceis a geometry collection composed of surface elements.不可实例化.唯一可实例化的子类是 MultiPolygon.
MultiSurfaceAssertions
其中的Surfaces没有内部相交
其中的Surface相交点数有限.
12.5.2.13 MultiPolygon Class
AMultiPolygonis aMultiSurfaceobject composed ofPolygonelements.
MultiPolygonExamples
可以用来表示地区湖系统
MultiPolygonAssertions
没有两个Polygon内部相交。
两个Polygon不可以相交(相交也是在前面一个条件中禁止的)或者接触无限个点
一个MultiPolygon可能没有切线,spikes,或者穿孔. MultiPolygon 是 一个规则的,closed的点集合
AMultiPolygon有不止一个Polygon有不连接的内部. The number of connected components of the interior of aMultiPolygonis equal to the number ofPolygonvalues in theMultiPolygon.
MultiPolygonProperties
二维
AMultiPolygon的边界是一系列的closed curves (LineStringvalues) corresponding to the boundaries of itsPolygonelements.
EachCurvein the boundary of theMultiPolygonis in the boundary of exactly onePolygonelement.
EveryCurvein the boundary of anPolygonelement is in the boundary of theMultiPolygon.
12.5.3 Using Spatial Data
这个章节描述如何创建包含空间数据类型列的表,以及如何操作空间信息.
12.5.3.1 Supported Spatial Data Formats
有两个标准的空间数据格式被用来表示集合对象Two standard spatial data formats are used to represent geometry objects in queries:
Well-Known Text (WKT) format
Well-Known Binary (WKB) format
在内部,MySQL存储几何值到一个既不是WKT也不是WKB的格式。
12.5.3.1.1 Well-Known Text (WKT) Format
The Well-Known Text (WKT) 用来表示将ASCII表格中的几何数据换成几何值。OpenGIS规格提供了一个巴科斯范式语法来定义写入WKT值得规则。
Examples of WKT representations of geometry objects:
APoint:
POINT(15 20)
点坐标之间没有用逗号分隔。这个和 SQLPoint()方法不同,后者需要用逗号隔开坐标.注意使用适当的语法到给定空间操作的上下文。例如下面的语句都是从Point对象中取出X坐标。第一个直接使用Point() 函数,第二个使用WKT的GeomFormText()转换Point
The first produces the object directly using thePoint()function. The second uses a WKT representation converted to aPointwithGeomFromText().
mysql> SELECT ST_X(Point(15, 20));
+---------------------+
| ST_X(POINT(15, 20)) |
+---------------------+
| 15 |
+---------------------+
mysql> SELECT ST_X(ST_GeomFromText(‘POINT(15 20)’));
±--------------------------------------+
| ST_X(ST_GeomFromText(‘POINT(15 20)’)) |
±--------------------------------------+
| 15 |
±--------------------------------------+
ALineString有四个点:
LINESTRING(0 0, 10 10, 20 25, 50 60)
点和点直接由逗号分开
A带有一个外部圈和一个内部圈的Polygon
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
多点:
MULTIPOINT(0 0, 20 20, 60 60)
在5.7.9中,空间函数例如 ST_MPointFromText()andST_GeomFromText() 接受WKT格式化的MutilPoint数值中使用圆括号把点包裹起来.例如下面两个函数调用都是有效的。但是,在5.7.9之前的版本,第二种方式会产生错误:
ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)')
ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
在5.7.9中,输出的MultiPoint值会使用圆括号把每个点包裹起来
mysql> SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
+---------------------------------+
| ST_AsText(ST_GeomFromText(@mp)) |
+---------------------------------+
| MULTIPOINT((1 1),(2 2),(3 3)) |
+---------------------------------+
5.7.9之前的输出不会带有括号
mysql> SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
+---------------------------------+
| ST_AsText(ST_GeomFromText(@mp)) |
+---------------------------------+
| MULTIPOINT(1 1,2 2,3 3) |
+---------------------------------+
AMultiLineStringwith twoLineStringvalues:
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
AMultiPolygonwith twoPolygonvalues:
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
AGeometryCollectionconsisting of twoPointvalues and oneLineString:
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
12.5.3.1.2 Well-Known Binary (WKB) Format
The Well-Known Binary (WKB) 使用转换几何数据成二进制流representation of geometric values is used for exchanging geometry data as binary streams represented byBLOBvalues containing geometric WKB information. WKB 使用1-byte 无符号整数,4-byte无符号整数,和8-byte 双精度数字。一个byte是8bit。例如,一个WKB值表示POINT(1,1)用21byte组成这个序列,每一个由两个十六进制表示。
0101000000000000000000F03F000000000000F03F
这个序列由以下组件组成:
Byte order: 01
WKB type: 01000000
X coordinate: 000000000000F03F
Y coordinate: 000000000000F03F
Component representation is as follows:
byte是由0/1表示低位高位存储。 这种方法也被称为Network Data Representation (NDR) and External Data Representation (XDR), respectively.
The WKB type是用来表明几何体类型. 值从1到7分别表示 Point,LineString,Polygon,MultiPoint,MultiLineString,MultiPolygon, andGeometryCollection.
一个Point值有X,Y坐标。每个坐标由一个双精度数值表示
12.5.3.2 Creating Spatial Columns
MySQL 提供了一个标准的方法去为几何类型创建空间列。例如, 在 CREATE TABLEorALTER TABLE中. 空间列在 MyISAM,InnoDB,NDB, andARCHIVEtables 中支持.
使用CREATE TABLE 语法创建一个带有空间列的表
CREATE TABLE geom (g GEOMETRY);
使用 ALTER TABLE 语法添加或者删除一个表中的空间列
ALTER TABLE geom ADD pt POINT;
ALTER TABLE geom DROP pt;
12.5.3.3 填充Populating Spatial Columns
创建空间列之后,你可以填充进去空间数据。数值必须存储为内部几何格式的值。但是你可以转换成 Well-Known Text (WKT) or Well-Known Binary (WKB) 格式。下面例子展示如何插入几何值到一个表中。使用WKT转换成内部几何格式:
直接在INSERT 语句中执行转换
INSERT INTO geom VALUES (ST_GeomFromText('POINT(1 1)'));
SET @g = ‘POINT(1 1)’;
INSERT INTO geom VALUES (ST_GeomFromText(@g));
在INSERT 之前执行转换
SET @g = ST_GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);
下面的例子插入了更加复杂的几何数据到表中
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (ST_GeomFromText(@g));
SET @g = ‘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 (ST_GeomFromText(@g));
SET @g =‘GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))’;
INSERT INTO geom VALUES (ST_GeomFromText(@g));
前面的语句使用了