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

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - 空间数据支持 » 使用空间数据 » 教程:试用空间要素

 

第 6 课:投影空间数据

本课指导您如何将数据投影到使用平面地球模型的空间参照系中,以便计算面积和距离测量值。

从 ESRI shapefile 向数据库中装载数据时,已为 Massdata 中的空间值指派了 SRID 4269(NAD83 空间参照系)。SRID 4269 是球形地球空间参照系。然而,某些计算操作(例如,计算几何面积)和某些空间谓语在球形地球模型中不被支持。如果数据当前与球形地球空间参照系相关联,则可创建一个用于将数值投影到平面地球空间参照系的新空间列,然后对该列执行计算操作。

 ♦ 投影数据
  1. 要测量表示邮政编码地区的多边形的面积,必须先将 Massdata.geometry 中的数据投影到平面地球空间参照系。

    要选择合适的 SRID 以将 Massdata.geometry 中的数据投影到其中,请使用 Interactive SQL 按如下方式查询 ST_SPATIAL_REFERENCE_SYSTEMS 统一视图,以获得包含 "马萨诸塞州" 字样的 SRID:

    SELECT * FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE srs_name LIKE '%massachusetts%';

    此查询可返回几个适用于马萨诸塞州数据的 SRID。本教程中将使用 3586

  2. 现在,必须创建一个名为 Massdata.proj_geometry 的列,然后用 ST_Transform 方法将几何投影到该列,进而投影到 3586 中。为此,请在 Interactive SQL 中执行以下语句:

    ALTER TABLE Massdata 
    ADD proj_geometry 
     AS ST_Geometry(SRID=3586)
     COMPUTE( geometry.ST_Transform( 3586 ) );

    请参见类型 ST_Geometry 的 ST_Transform 方法

  3. 可以使用 Massdata.proj_geometry 计算面积。例如,在 Interactive SQL 中执行以下语句:

    SELECT zip, proj_geometry.ST_ToMultiPolygon().ST_Area('Statute Mile') AS area
    FROM Massdata
    ORDER BY area DESC;
    注意

    球形地球空间参照系不支持 ST_Area,但支持 ST_Distance,不过,仅限于计算点几何之间的距离。

  4. 要想了解投影至另一空间参照系对距离计算的影响,可使用以下查询在球形地球模型(更精确)或投影平面地球模型上计算邮政编码地区中心点间的距离。两种模型所得出的计算结果毫无差异,因为所选投影适合该数据集。

    SELECT M1.zip, M2.zip,
           M1.CenterPoint.ST_Distance( M2.CenterPoint, 'Statute Mile' ) dist_round_earth, 
           M1.CenterPoint.ST_Transform( 3586 ).ST_Distance( M2.CenterPoint.ST_Transform( 3586 ), 
           'Statute Mile' ) dist_flat_earth
    FROM Massdata M1, Massdata M2
    WHERE M1.ZIP = '01775'
    ORDER BY dist_round_earth DESC;
  5. 假设您想查找与邮政编码地区 01775 相毗邻的邮政编码地区。要达到此目的,需要使用 ST_Touches 方法。ST_Touches 方法用于对几何进行比较,以了解某一几何是否与另一几何相接触但不与之相重叠。注意,ST_Touches 返回的结果不包括与邮政编码 01775 相对应的行(这不同于 ST_Intersects 方法)。

    DROP VARIABLE @Mass_01775;
    CREATE VARIABLE @Mass_01775 ST_Geometry;
    SELECT geometry INTO @Mass_01775
    FROM Massdata
    WHERE ZIP = '01775';
    
    SELECT record_number, proj_geometry 
    FROM Massdata 
    WHERE proj_geometry.ST_Touches( @Mass_01775.ST_Transform( 3586 ) ) = 1;

    请参见类型 ST_Geometry 的 ST_Touches 方法

  6. 可以使用 ST_UnionAggr 方法返回表示一组邮政编码地区联合的几何。例如,假设您想获得一个反映 01775 所毗邻的邮政编码区域(但不包括 01775 区域)联合的几何。

    在 Interactive SQL 中,单击 [工具] » [空间查看器],然后执行以下查询:

    SELECT ST_Geometry::ST_UnionAggr(proj_geometry) 
    FROM Massdata
    WHERE proj_geometry.ST_Touches( @Mass_01775.ST_Transform( 3586 ) ) = 1;

    双击结果即可对其进行查看。

    如果收到错误消息,指出无法从数据库读取整列内容,则需要增大 Interactive SQL 的 [截断长度] 设定值。要执行此操作,请在 Interactive SQL 中单击 [工具] » [选项] » [SQL Anywhere],然后将 [截断长度] 设置成较大的数字。然后再次执行查询并查看几何。

    请参见类型 ST_Geometry 的 ST_UnionAggr 方法

  7. 现在已完成 "试用空间要素" 教程。

  8. 要将示例数据库 (demo.db) 恢复至其初始状态,请按重新创建示例数据库 (demo.db)中的步骤进行操作。