本课指导您如何将数据投影到使用平面地球模型的空间参照系中,以便计算面积和距离测量值。
从 ESRI shapefile 向数据库中装载数据时,已为 Massdata 中的空间值指派了 SRID 4269(NAD83 空间参照系)。SRID 4269 是球形地球空间参照系。然而,某些计算操作(例如,计算几何面积)和某些空间谓语在球形地球模型中不被支持。如果数据当前与球形地球空间参照系相关联,则可创建一个用于将数值投影到平面地球空间参照系的新空间列,然后对该列执行计算操作。
要测量表示邮政编码地区的多边形的面积,必须先将 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。
现在,必须创建一个名为 Massdata.proj_geometry 的列,然后用 ST_Transform 方法将几何投影到该列,进而投影到 3586 中。为此,请在 Interactive SQL 中执行以下语句:
ALTER TABLE Massdata ADD proj_geometry AS ST_Geometry(SRID=3586) COMPUTE( geometry.ST_Transform( 3586 ) ); |
可以使用 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,不过,仅限于计算点几何之间的距离。
要想了解投影至另一空间参照系对距离计算的影响,可使用以下查询在球形地球模型(更精确)或投影平面地球模型上计算邮政编码地区中心点间的距离。两种模型所得出的计算结果毫无差异,因为所选投影适合该数据集。
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; |
假设您想查找与邮政编码地区 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_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],然后将 [截断长度] 设置成较大的数字。然后再次执行查询并查看几何。
现在已完成 "试用空间要素" 教程。
要将示例数据库 (demo.db) 恢复至其初始状态,请按重新创建示例数据库 (demo.db)中的步骤进行操作。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |