Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


GEOGRAPHY类型

📄字数 2.2K
👁️阅读量 加载中...

功能说明

GEOGRAPHY数据类型,即地理数据类型,称为地理坐标,或大地坐标,或“lat/lon”(纬度/经度),或“lon/lat”(经度/纬度),是以角度单位表示的球坐标。

语法格式

sql
GEOGRAPHY[(TYPMOD,SRID)]

参数说明

  • TYPMOD:空间类型修饰符,即几何子类型。
    • 可以是点、线串、面、多点、多线、多面、几何集合。
    • 不支持曲线、三角形或多面体表面。
  • SRID:空间参考系统标识符,默认为:4326(WGS84大地测量),并且所有计算均使用WGS84执行。

使用说明

  • 地理类型基于球面模型,球体上两点之间的最短路径是一个大圆弧。
  • 地理函数(面积、距离、长度、交点等)使用球体上的弧计算,结果更精确。
  • 通过SRID与空间参考系统相关联,可使用SPATIAL_REF_SYS表中定义的任何大地测量空间参考系统。
  • 不推荐将GEOGRAPHY类型作为主键、分区建、约束使用。
  • GEOGRAPHY类型支持UNION ALL操作,但不支持UNION操作。

地理类型与几何类型区别

  • 地理类型的函数少于几何类型。
  • 地理类型支持存储经度/纬度坐标,基于球面模型,计算更精确,更占用CPU资源。
  • 根据工作范围选择数据类型,以确保性能和功能的最大化。
  • 对于局限于较小的地理区域数据集,如州、县或直辖市,推荐使用投影和几何类型。
  • 对于覆盖全球或广大大陆的数据集,推荐使用地理数据类型。

示例

创建地理表

包含存储WGS84大地坐标系的2D POINT的地理列:

sql
CREATE TABLE global_points (
    id INT IDENTITY(1,1) PRIMARY KEY,
    NAME VARCHAR(64),
    LOCATION geography(POINT,4326)
  );

以下是生成包含地理列的表的示例:

  • 生成一个具有二维点地理的表,默认情况下SRID为4326(WGS84 经度/纬度)。

    sql
    CREATE TABLE ptgeogwgs(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POINT) );
  • 生成具有NAD83经纬度二维点地理的表。

    sql
    CREATE TABLE ptgeognad83(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POINT,4269) );
  • 创建一个包含3D (XYZ) POINT和默认SRID 4326的表。

    sql
    CREATE TABLE ptzgeogwgs84(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POINTZ,4326) );
  • 生成具有二维线串地理的表,SRID默认值为4326。

    sql
    CREATE TABLE lgeog(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(LINESTRING) );
  • 使用SRID 4267(NAD 1927 经纬度)创建包含二维多边形地理的表。

    sql
    CREATE TABLE lgeognad27(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POLYGON,4267) );

查询地理字段

地理字段在GEOGRAPHY_COLUMNS视图中注册。 查询GEOGRAPHY_COLUMNS视图并看到该表已列出:

sql
SQL> SELECT * FROM GEOGRAPHY_COLUMNS;

+-----------------+----------------+------------------+--------------------+-----------------+------+------------+
| F_TABLE_CATALOG | F_TABLE_SCHEMA |   F_TABLE_NAME   | F_GEOGRAPHY_COLUMN | COORD_DIMENSION | SRID |    TYPE    |
+-----------------+----------------+------------------+--------------------+-----------------+------+------------+
| SYSTEM          | SYSDBA         | GLOBAL_POINTS    | LOCATION           | 2               | 4326 | POINT      |
| SYSTEM          | SYSDBA         | PTGEOGWGS        | GEOG               | 2               | 4326 | POINT      |
| SYSTEM          | SYSDBA         | PTGEOGNAD83      | GEOG               | 2               | 4269 | POINT      |
| SYSTEM          | SYSDBA         | PTZGEOGWGS84     | GEOG               | 3               | 4326 | POINTZ     |
| SYSTEM          | SYSDBA         | LGEOG            | GEOG               | 2               | 4326 | LINESTRING |
| SYSTEM          | SYSDBA         | LGEOGNAD27       | GEOG               | 2               | 4267 | POLYGON    |
+-----------------+----------------+------------------+--------------------+-----------------+------+------------+

创建空间索引

sql
CREATE INDEX global_points_gix ON global_points USING GIST ( location );

使用地理表

使用与几何数据类型相同的方式将数据插入地理表中。也可以使用EWKT和EWKB格式以指定地理值。

sql
-- 向表global_points中插入数据
INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)');
INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)');
INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');

SPATIAL_REF_SYS表中列出的任何大地测量(经/纬度)空间参考系统都可以指定为地理 SRID。

sql
SQL> SELECT to_char(st_asewkt('SRID=4490;POINT(-123 34)'::geography));

+--------------------------+
|          EXPR1           |
+--------------------------+
| SRID=4490;POINT(-123 34) |
+--------------------------+

查询和测量功能以米为单位,因此距离参数以米为单位(面积为平方米)。

sql
-- 查询1000km 内的城市
SQL> SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);

+--------+
|  NAME  |
+--------+
| Town   |
| Forest |
+--------+