MySQL 5.1参考手册 :: 19. 中的空间扩展(2)
时间:2008-05-11 来源:sdccf
19.4.4. 填充空间列
创建了空间列后,可用空间数据填充它们。
值应以内部几何格式保存,但你也能将其从WKT或WKB格式转换为内部几何格式。在下面的示例中,介绍了通过将WKT值转换为内部几何格式以便将几何值插入表中的方法。
你可以在INSERT语句中执行直接转换操作:
INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (GeomFromText(@g));
也可以在INSERT之前执行转换操作:
SET @g = GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);
在下面的示例中,将多个复杂的几何值插入到了表中:
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (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 (GeomFromText(@g));
SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomFromText(@g));
在前面的所有示例中,均采用了GeomFromText()来创建几何值。你也可以使用与类型相关的函数:
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (PointFromText(@g));
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (LineStringFromText(@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 (PolygonFromText(@g));
SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomCollFromText(@g));
注意,如果客户端应用程序打算使用几何值的WKB表示,它需要在队列中将正确构造的WKB发送至服务器。但是,存在数种满足该要求的方法。例如:
· 用十六进制文字语法插入POINT(1 1)值:
· mysql> INSERT INTO geom VALUES
· -> (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
· ODBC应用程序能够发送WKB表达式,并使用具有BLOB类型的参量将其绑定到占位符:
· INSERT INTO geom VALUES (GeomFromWKB(?))
其他编程接口或许也支持类似的占位符机制。
在C程序中,可以使用mysql_real_escape_string()转义二进制值,并将结果包含在将发送至服务器的查询字符串。请参见25.2.3.52节,“mysql_real_escape_string()”19.4.5. 获取空间数据
19.4.5.1. 以内部格式获取空间数据 19.4.5.2. 以WKT格式获取空间数据 19.4.5.3. 以格式获取空间数据 对于表中保存的几何值,能够以内部格式获取。你也能将其转换为WKT或WKB格式。19.4.5.1. 以内部格式获取空间数据
在表对表传输中,使用内部格式来获取几何值可能是有用的。CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;
19.4.5.2. 以WKT格式获取空间数据
AsText()函数能够将几何值从内部格式转换为WKT字符串。SELECT AsText(g) FROM geom;
19.4.5.3. 以格式获取空间数据
AsBinary()函数能够将几何值从内部格式转换为包含WKB值的BLOB。SELECT AsBinary(g) FROM geom;
19.5. 分析空间信息
19.5.1. Geometry格式转换函数 19.5.2. Geometry函数 19.5.3. 从已有Geometry创建新Geometry的函数 19.5.4. 测试几何对象间空间关系的函数 19.5.5. 关于几何最小边界矩形(MBR)的关系 19.5.6. 测试几何类之间空间关系的函数 用值填充了空间列后,即可查询和分析它们。MySQL提供了一组在空间数据上执行各种操作的函数。根据它们所执行的操作类型,可以将这些函数分为四种主要类别:· 用于在各种格式间转换几何值的函数。
· 用于访问几何值定性或定量属性的函数。
· 描述两种几何值之间关系的函数。
· 从已有Geometry创建新Geometry的函数
空间分析函数可用于很多场合下,如:
· 任何交互式SQL程序,如mysql或MySQLCC。
· 以任何语言编写的、支持MySQL客户端API的应用程序。
19.5.1. Geometry格式转换函数
MySQL支持下述用于在内部格式和WKT或WKB格式间转换几何值的函数:
-
AsBinary(g)
将采用内部几何格式的值转换为其WKB表示,并返回二进制结果。
SELECT AsBinary(g) FROM geom;
-
AsText(g)
将采用内部几何格式的值转换为其WKT表示,并返回字符串结果。
mysql> SET @g = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(GeomFromText(@g)); +--------------------------+ | AsText(GeomFromText(@g)) | +--------------------------+ | LINESTRING(1 1,2 2,3 3) | +--------------------------+
-
GeomFromText(wkt[,srid])
将字符串值从其WKT表示转换为内部几何格式,并返回结果。也支持多种与类型相关的函数,如PointFromText()和LineFromText(),请参见19.4.2.1节,“使用WKT函数创建Geometry(几何)值”。
-
GeomFromWKB(wkb[,srid])
将二进制值从其WKB表示转换为内部几何格式,并返回结果。也支持多种与类型相关的函数,如PointFromWKB()和LineFromWKB(),请参见19.4.2.2节,“使用WKB函数创建Geometry(几何)值”。
19.5.2. Geometry函数
19.5.2.1. 通用几何函数 19.5.2.2. Point函数19.5.2.3. LineString函数 19.5.2.4. MultiLineString函数 19.5.2.5. Polygon函数 19.5.2.6. MultiPolygon函数 19.5.2.7. GeometryCollection函数 属于该组的每个函数均将几何值作为其参量,并返回几何值的定性或定量属性。某些函数限制了其参量类型。如果参量是不正确的几何类型,这类函数将返回NULL。例如,如果对象类型既不是Polygon也不是MultiPolygon,Area()将返回NULL。
19.5.2.1. 通用几何函数
本节列出的函数不限制其参量,可接受任何类型的几何值。
-
Dimension(g)
返回几何值g的固有维数。结果可以是-1、0、1或2。(关于这些值的含义,请参见19.2.2节,“类Geometry”)。
mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)')); +------------------------------------------------+ | Dimension(GeomFromText('LineString(1 1,2 2)')) | +------------------------------------------------+ | 1 | +------------------------------------------------+
-
Envelope(g)
返回几何值g的最小边界矩形(MBR)。结果以Polygon值的形式返回。
多边形(polygon)是由边界框的顶点定义的:POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))); +-------------------------------------------------------+ | AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) | +-------------------------------------------------------+ | POLYGON((1 1,2 1,2 2,1 2,1 1)) | +-------------------------------------------------------+
-
GeometryType(g)
以字符串形式返回几何类型的名称,几何实例g是几何类型的成员。该名称与可实例化几何子类之一对应。
mysql> SELECT GeometryType(GeomFromText('POINT(1 1)')); +------------------------------------------+ | GeometryType(GeomFromText('POINT(1 1)')) | +------------------------------------------+ | POINT | +------------------------------------------+
-
SRID(g)
返回指明了几何值g的空间参考系统ID的整数。
在MySQL中,SRID值仅是与几何值相关的整数。所有计算均是在欧几里得(平面)几何中进行的。
mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101)); +-----------------------------------------------+ | SRID(GeomFromText('LineString(1 1,2 2)',101)) | +-----------------------------------------------+ | 101 | +-----------------------------------------------+
OpenGIS规范还定义了下述函数,MySQL未实施这类函数:
-
Boundary(g)
返回几何值g的组合边界的闭包的几何对象。
-
IsEmpty(g)
如果几何值g为空的几何对象,返回1,如果非空,返回0,如果参量为NULL,返回-1。如果几何对象是空的,它表示空的点集合。
-
IsSimple(g)
目前该函数是占位符,不应使用它。如果实施了它,其行为与下段所给出的描述类似。
如果几何值g没有异常的几何点(如自相交或自相切),返回1。如果参量不是简单参量,IsSimple()返回0,如果参量是NULL,返回-1。
对于本章前面介绍的每个可实例化几何类,均包含特定的条件,这类条件会使类实例被分类为非简单的。
19.5.2.2. Point函数
Point由X和Y坐标构成,可使用下述函数获得它们:
-
X(p)
以双精度数值返回点p的X坐标值。
mysql> SELECT X(GeomFromText('Point(56.7 53.34)')); +--------------------------------------+ | X(GeomFromText('Point(56.7 53.34)')) | +--------------------------------------+ | 56.7 | +--------------------------------------+
-
Y(p)
以双精度数值返回点p的Y坐标值。
mysql> SELECT Y(GeomFromText('Point(56.7 53.34)')); +--------------------------------------+ | Y(GeomFromText('Point(56.7 53.34)')) | +--------------------------------------+ | 53.34 | +--------------------------------------+
19.5.2.3. LineString函数
LineString由Point值组成。你可以提取LineString的特定点,计数它所包含的点数,或获取其长度。
-
EndPoint(ls)
返回LineString值1s的最后一个点的Point。
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(EndPoint(GeomFromText(@ls))); +-------------------------------------+ | AsText(EndPoint(GeomFromText(@ls))) | +-------------------------------------+ | POINT(3 3) | +-------------------------------------+
-
GLength(ls)
以双精度数值返回LineString值1s在相关的空间参考系中的长度。
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT GLength(GeomFromText(@ls)); +----------------------------+ | GLength(GeomFromText(@ls)) | +----------------------------+ | 2.8284271247462 | +----------------------------+
-
NumPoints(ls)
返回LineString值1s中的点数。
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT NumPoints(GeomFromText(@ls)); +------------------------------+ | NumPoints(GeomFromText(@ls)) | +------------------------------+ | 3 | +------------------------------+
-
PointN(ls,n)
返回LineString值1s中的第n个点。点编号从1开始。
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(PointN(GeomFromText(@ls),2)); +-------------------------------------+ | AsText(PointN(GeomFromText(@ls),2)) | +-------------------------------------+ | POINT(2 2) | +-------------------------------------+
-
StartPoint(ls)
返回LineString值1s的第一个点的Point。
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(StartPoint(GeomFromText(@ls))); +---------------------------------------+ | AsText(StartPoint(GeomFromText(@ls))) | +---------------------------------------+ | POINT(1 1) | +---------------------------------------+
OpenGIS规范还定义了下述函数,MySQL尚未实施这些函数:
-
IsRing(ls)
如果LineString值ls是封闭的(即其StartPoint()和EndPoint()值相同)和简单的(未通过相同的点1次以上)返回1。如果ls不是环,返回0,如果它是NULL,返回-1。
19.5.2.4. MultiLineString函数
-
GLength(mls)
以双精度数值形式返回MultiLineString值m1s的长度。mls的长度等于其元素的长度之和。
mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))'; mysql> SELECT GLength(GeomFromText(@mls)); +-----------------------------+ | GLength(GeomFromText(@mls)) | +-----------------------------+ | 4.2426406871193 | +-----------------------------+
-
IsClosed(mls)
如果MultiLineString值m1s是封闭的(即StartPoint()和EndPoint()值对m1s中的每个LineString是相同的)返回1。如果mls是非封闭的,返回0,如果它是NULL,返回-1。
mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))'; mysql> SELECT IsClosed(GeomFromText(@mls)); +------------------------------+ | IsClosed(GeomFromText(@mls)) | +------------------------------+ | 0 | +------------------------------+
19.5.2.5. Polygon函数
-
Area(poly)
以双精度数值形式返回Polygon值poly的面积,根据在其空间参考系中的测量值。
mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))'; mysql> SELECT Area(GeomFromText(@poly)); +---------------------------+ | Area(GeomFromText(@poly)) | +---------------------------+ | 4 | +---------------------------+
-
ExteriorRing(poly)
以LineString形式返回Polygon值poly的外环。
mysql> SET @poly = -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly))); +-------------------------------------------+ | AsText(ExteriorRing(GeomFromText(@poly))) | +-------------------------------------------+ | LINESTRING(0 0,0 3,3 3,3 0,0 0) | +-------------------------------------------+
-
InteriorRingN(poly,n)
以LineString形式返回Polygon值poly的第n个内环。环编号从1开始。
mysql> SET @poly = -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1)); +----------------------------------------------+ | AsText(InteriorRingN(GeomFromText(@poly),1)) | +----------------------------------------------+ | LINESTRING(1 1,1 2,2 2,2 1,1 1) | +----------------------------------------------+
-
NumInteriorRings(poly)
返回Polygon值poly的内环的数目。
mysql> SET @poly = -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT NumInteriorRings(GeomFromText(@poly)); +---------------------------------------+ | NumInteriorRings(GeomFromText(@poly)) | +---------------------------------------+ | 1 | +---------------------------------------+