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 经度/纬度)。
sqlCREATE TABLE ptgeogwgs(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POINT) );生成具有NAD83经纬度二维点地理的表。
sqlCREATE TABLE ptgeognad83(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POINT,4269) );创建一个包含3D (XYZ) POINT和默认SRID 4326的表。
sqlCREATE TABLE ptzgeogwgs84(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(POINTZ,4326) );生成具有二维线串地理的表,SRID默认值为4326。
sqlCREATE TABLE lgeog(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geog geography(LINESTRING) );使用SRID 4267(NAD 1927 经纬度)创建包含二维多边形地理的表。
sqlCREATE 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 |
+--------+