|
MySQL 5.1参考手册 :: 19. 中的空间扩展(2)
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()”
对于表中保存的几何值,能够以内部格式获取。你也能将其转换为 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. 分析空间信息
用值填充了空间列后,即可查询和分析它们。 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(几何)值”。
属于该组的每个函数均将几何值作为其参量,并返回几何值的定性或定量属性。某些函数限制了其参量类型。如果参量是不正确的几何类型,这类函数将返回 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。 对于本章前面介绍的每个可实例化几何类,均包含特定的条件,这类条件会使类实例被分类为非简单的。
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 |
+--------------------------------------+
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尚未实施这些函数:
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 |
+------------------------------+
-
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 |
+---------------------------------------+
|
|
|
发表于: 2008-05-11 ,修改于: 2008-05-11 22:36,已浏览56次,有评论0条
推荐
投诉
|
|
| |