Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - 空间数据支持 » 空间数据 » 教程:试用空间要素

 

第 4 课:查询空间数据

本课将以切合实际的示例来指导您使用某些空间方法查询数据。还将学习如何计算距离,其中将涉及向数据库中添加测量单位。

前提条件

本课假定您已完成前面的所有课程。请参见第 1 课:安装附加测量单位和空间参照系

本课假定您拥有在本教程(教程:试用空间要素)开头的“特权”部分中列出的角色和特权。

上下文和注释

对 SpatialContacts 和 Massdata 表中的一个或两个执行查询。SpatialContacts 已存在于数据库中,用于保存人们的姓名和联系信息—其中许多人住在马萨诸塞州。

 查询空间数据
  1. 在 Interactive SQL 中,创建名为 [@Mass_01775] 的变量,用于保存邮政编码地区 01775 的关联几何。

    CREATE VARIABLE @Mass_01775 ST_Geometry;
    SELECT geometry INTO @Mass_01775
    FROM Massdata
    WHERE ZIP = '01775';
  2. 假设您想要在 SpatialContacts 表中查找邮政编码地区 01775 及其周边邮政编码地区中的所有联系人信息。要达到这个目的,可以使用 ST_Intersects 方法,该方法可返回与指定的几何相交或与其完全相同的几何。您将在 Interactive SQL 中执行以下语句:

    SELECT c.Surname, c.GivenName, c.Street, c.City, c.PostalCode, z.geometry
    FROM Massdata z, GROUPO.SpatialContacts c
    WHERE
    c.PostalCode = z.ZIP
    AND z.geometry.ST_Intersects( @Mass_01775 ) = 1;

    请参见类型 ST_Geometry 的 ST_Intersects 方法

  3. Massdata.geometry 中的所有行都与同一空间参照系 (SRID 4269) 相关联,这是因为创建几何列并将数据装载到其中时为列分配了 SRID 4269。

    但您仍可以创建未声明的 ST_Geometry 列(即,未指派 SRID 的列)。有时,您可能需要在单个列中存储与不同 SRS 相关联的空间值。此时,在对这些值进行运算时,将分别使用与各个值相关联的空间参照系。

    不过,使用未声明的列存在着一个风险,即:数据库服务器不会阻止您更改与未声明列中的数据相关联的空间参照系。

    但如果列已具有声明的 SRID,则数据库服务器将不允许您修改与其中的数据相关联的空间参照系。必须先卸载数据,再截断声明列中的数据,然后再更改空间参照系,最后再重新装载数据。

    无论列声明与否,都可通过 ST_SRID 方法来确定与列中的值相关联的 SRID。例如,以下语句可显示指派给 Massdata.geometry 列中各行的 SRID:

    SELECT geometry.ST_SRID()
    FROM Massdata;
  4. 可以使用 ST_CoveredBy 方法来检查某一几何是否完全位于另一几何中。例如,Massdata.CenterPoint(T_Point 类型)包含邮政编码地区中心的经度/纬度坐标,而 Massdata.geometry 则包含反映邮政编码地区的多边形。可通过在 Interactive SQL 中执行以下查询进行快速检查,来确保所有 CenterPoint 值均已设置在其邮政编码地区之内:

    SELECT * FROM Massdata
    WHERE NOT(CenterPoint.ST_CoveredBy(geometry) = 1);

    未返回任何行,说明所有 CenterPoint 值都包含在 Massdata.geometry 中的对应相关联几何中,当然,此项检查并不会验证这些值是否为真正的中心。如果想执行此验证,需要将数据投影到平面地球空间参照系,然后使用 ST_Centroid 方法检查 CenterPoint 值。稍后将在本教程中介绍投影内容。

  5. 可以使用 ST_Distance 方法测量两个邮政编码地区中心点间的距离。例如,假设您希望得到邮政编码地区 01775 方圆 100 英里之内的邮政编码列表,则可在 Interactive SQL 中执行以下查询:

    SELECT c.PostalCode, c.City,  
           z.CenterPoint.ST_Distance( ( SELECT CenterPoint 
                                FROM Massdata WHERE ZIP = '01775' ),
                              'Statute mile' ) dist,
           z.CenterPoint
    FROM Massdata z, GROUPO.SpatialContacts c
    WHERE c.PostalCode = z.ZIP
      AND dist <= 100
    ORDER BY dist;
  6. 如果是否知道确切的距离并不重要,则可改用 ST_WithinDistance 方法来构造查询,此方法对于某些数据集(尤其是对于大型几何)的性能更佳:

    SELECT c.PostalCode, c.City, z.CenterPoint
    FROM Massdata z, GROUPO.SpatialContacts c
    WHERE c.PostalCode = z.ZIP
      AND z.CenterPoint.ST_WithinDistance( ( SELECT CenterPoint
                                FROM Massdata WHERE ZIP = '01775' ),
                              100, 'Statute mile' ) = 1
    ORDER BY c.PostalCode;

结果

已对空间数据执行查询。

 另请参见