Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92491456
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-05-11 22:36:30

19.4.4. 填充空间列

创建了空间列后,可用空间数据填充它们。

值应以内部几何格式保存,但你也能将其从WKTWKB格式转换为内部几何格式。在下面的示例中,介绍了通过将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. 获取空间数据

对于表中保存的几何值,能够以内部格式获取。你也能将其转换为WKTWKB格式。

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程序,如mysqlMySQLCC

·         以任何语言编写的、支持MySQL客户端API的应用程序。

19.5.1. Geometry格式转换函数

MySQL支持下述用于在内部格式和WKTWKB格式间转换几何值的函数:

  • 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函数

属于该组的每个函数均将几何值作为其参量,并返回几何值的定性或定量属性。某些函数限制了其参量类型。如果参量是不正确的几何类型,这类函数将返回NULL。例如,如果对象类型既不是Polygon也不是MultiPolygonArea()将返回NULL

19.5.2.1. 通用几何函数

本节列出的函数不限制其参量,可接受任何类型的几何值。

  • Dimension(g)

    返回几何值g的固有维数。结果可以是-1012。(关于这些值的含义,请参见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函数
 

PointXY坐标构成,可使用下述函数获得它们:

  • X(p)

    以双精度数值返回点pX坐标值。

    mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | X(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    |                                 56.7 |
    +--------------------------------------+
    
  • Y(p)

    以双精度数值返回点pY坐标值。

    mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | Y(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    |                                53.34 |
    +--------------------------------------+
    

19.5.2.3. LineString函数

LineStringPoint值组成。你可以提取LineString的特定点,计数它所包含的点数,或获取其长度。

  • EndPoint(ls)

    返回LineString1s的最后一个点的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)

    以双精度数值返回LineString1s在相关的空间参考系中的长度。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT GLength(GeomFromText(@ls));
    +----------------------------+
    | GLength(GeomFromText(@ls)) |
    +----------------------------+
    |            2.8284271247462 |
    +----------------------------+
    
  • NumPoints(ls)

    返回LineString1s中的点数。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT NumPoints(GeomFromText(@ls));
    +------------------------------+
    | NumPoints(GeomFromText(@ls)) |
    +------------------------------+
    |                            3 |
    +------------------------------+
    
  • PointN(ls,n)

    返回LineString1s中的第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)

    返回LineString1s的第一个点的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)

    如果LineStringls是封闭的(即其StartPoint()EndPoint()值相同)和简单的(未通过相同的点1次以上)返回1。如果ls不是环,返回0,如果它是NULL,返回-1

19.5.2.4. MultiLineString函数

  • GLength(mls)

    以双精度数值形式返回MultiLineStringm1s的长度。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)

    如果MultiLineStringm1s是封闭的(即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)

    以双精度数值形式返回Polygonpoly的面积,根据在其空间参考系中的测量值。

    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形式返回Polygonpoly的外环。

    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形式返回Polygonpoly的第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)

    返回Polygonpoly的内环的数目。

    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 |
    +---------------------------------------+
    
阅读(678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~