空间几何类型

神通数据库支持两种表达空间对象的标准方法:Well-Known Text (WKT) 格式和Well-Known Binary (WKB)格式

这两种格式都包含了关于构成该对象所需要的对象的类型和坐标信息。WKT表示空间对象特征的样例如下:

  • POINT(0 0)
  • LINESTRING(0 0,1 1,1 2)
  • POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
  • MULTIPOINT((0 0),(1 2))
  • MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
  • MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
  • GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
  • SRID=32632;POINT(0 0) -- XY with SRID

其中 SRID 代表空间参照系统,是一个整型数字,用于限制字段类型的坐标系。SRID在创建用于插入数据库空间对象时的是必需的。默认是0(未定义的球面)

下表是空间几何类型的基本表述和存储方式:

类型名 表示 存储空间
spheroid 椭圆面的格式 65字节
geometry 二维空间数据类型 变长长度,最大长度为16777215个字节
box3d 用来返回一个几何对象或一系列几何对象的3维扩展区域 52字节
box2d 是一中包含x min,ymin,xmax,ymax的二维几何类型, 反映封闭箱子状几何对象的范围 65字节
box2df 是双精度box2d 16字节
gidx 是双精度box3d 变长长度
geometry_dump 一种包含geom和path[]路径数组两个字段的复合数据类型 变长长度
valid_detail 返回几何类型是否有效以及无效原因和无效的几何对象的复合数据类型 变长长度
geography 表示椭圆空间数据类型 变长长度,最大长度为16777215个字节

注解

注: 以上空间数据传输到驱动的格式都是以cstring的形式。

spheroid

spheroid 是椭球体的标准定义形式(wkt 称为椭球体),椭圆面格式为:SPHEROID[<NAME>,<SEMI-MAJORAXIS>,<INVERSE FLATTENING>]

其中, NAME 表示椭圆名称,SEMI-MAJORAXIS表示长半轴 INVERSE FLATTENING表示椭圆面展开的倒数

如果 a 代表椭球面的长半轴,b代表椭球面的短半轴, f 代表INVERSE FLATTENING,则f=a/(a-b)

格式:

 
SPHEROID["name",A,rf] | SPHEROID("name",A,rf)

例如:

select 'SPHEROID["GRS_1980",6378137,298.257222101]'::SPHEROID;
SPHEROID(spheroid)      |
------------------------
SPHEROID("GRS_1980",6378|
137,298.257222101)      |
总数目:1

geometry

geometry — 二维空间数据类型。是一个基本的 oscargis空间数据类型,用于表示欧几里得空间坐标系的一种几何特征(例如点、线等等 以上样例)

如:

select ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)');
ST_GEOMFROMTEXT(geometry)      |
-------------------------------
010200000003000000000000000000F|
03F000000000000F03F00000000000|
000000000000000000000000000000|
000F0BF000000000000F03F        |
总数目:1

--将结果以WKT的格式输出
select ST_AsText(ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)'));
ST_ASTEXT(text)      |
---------------------
LINESTRING(1 1,0 0,-1|
 1)                  |
总数目:1


select ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)',32632);--带有空间坐标参考系
ST_GEOMFROMTEXT(geometry)      |
-------------------------------
0102000020787F00000300000000000|
0000000F03F000000000000F03F000|
000000000000000000000000000000|
00000000000F0BF000000000000F03|
F                              |
总数目:1

--将结果以WKT的格式输出
select ST_AsText(ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)',32632));
ST_ASTEXT(text)      |
---------------------
LINESTRING(1 1,0 0,-1|
 1)                  |
总数目:1

geometry到其它类型的转换方式

目标类型 转换方式
box 自动
box2d 自动
box3d 自动
bytea 自动
geography 自动
text 自动

box3d

box3d是一种用于表示包裹一个几何对象或一系列几何对象的封闭“箱子”空间数据类型。包含 x min, ymin, zmin, xmax, ymax, zmax,反映三维的几何类型,通常用来返回一个几何对象或一

系列几何对象的3维扩展区域。

 
{A B, C D} | {A1 B1 C1,A2 B2 C2}

例如:

select 'BOX3D(-1 -1,1 1)'::box3d;
BOX3D(box3d)      |
------------------
BOX3D(-1 -1 0,1 1 |
0)                |
总数目:1

select 'BOX3D(-1 -1 -1,1 1 2)'::box3d;
BOX3D(box3d)      |
------------------
BOX3D(-1 -1 -1,1 1|
 2)               |
总数目:1

BOX3D到其他类型转换方式

目标类型 转换方式
box 自动
box2d 自动
geometry 自动

box2d

box2d是一种用于表示包裹一个几何对象或一系列几何对象的封闭“箱子”空间数据类型。是一中包含 x min, ymin, xmax, ymax的二维几何类型,反映封闭箱子状几何对象的范围。

 
{A B, C D}

例如:

select 'BOX(-1 -1,1 1)'::box2d;
BOX2D(box2d)      |
------------------
BOX(-1 -1,1 1)    |
总数目:1
select 'BOX(-1 -1 -1,1 1 1)'::box2d;
ERROR, box2d parser - couldn't parse.  It should look like: BOX(xmin ymin,xmax ymax)


box2df

BOX2DF是双精度box2d

目前 box2df_in 函数还不完善,暂时没有实现,不能进行类型转换,但是可以做函数参数,如

&&(box2df,box2df) — 如果两个 2D 浮点精度边界框 (BOX2DF) 彼此相交,则返回 TRUE。

SELECT ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(2,2)) && ST_MakeBox2D(ST_MakePoint(1,1), ST_MakePoint(3,3)) AS overlaps;
OVERLAPS(boolean)      |
-----------------------
true                   |
总数目:1

SELECT 'BOX(-1.2 -1,1.5 1)'::box2d && 'BOX(-1 -1.2,1.5 1)'::box2d AS overlaps;
OVERLAPS(boolean)      |
-----------------------
true                   |
总数目:1

gidx

GIDX是双精度box3d

目前 gidx_in 函数还不完善,暂时没有实现

--boolean &&&( gidx A , geometry B );
SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_MakePoint(1,1,1) AS overlaps;
OVERLAPS(boolean)      |
-----------------------
true                   |
总数目:1

geometry_dump

geometry_dump是一种包含geom和路径两个字段的空间数据类型。-geom(包含一个几何类型对象),path[](是一个含有被导出的几何对象位 置信息的1-d(d表示维度)数组)是一个复合数据类型,可以根据数组原理,导航获取路径某个位置的元素,可以反映一个复杂的几何对象的 组合部分和定位部分。

ST_Dump*系列的函数使用该类型的几何对象作为输出类型, 以便把一个更复杂的几何对象分解为的组合部分和定位部分。

例如:

SELECT ST_Dump(ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))'));
ST_DUMP(GEOMETRY_DUMP)      |
----------------------------
({1},01080000000300000000000|
000000000000000000000000000|
000000000000F03F00000000000|
0F03F000000000000F03F000000|
0000000000)                 |
----------------------------
({2},01020000000200000000000|
0000000F03F0000000000000000|
000000000000000000000000000|
0F03F)                      |
总数目:2

valid_detail

返回几何类型是否有效以及无效原因和无效的几何对象是哪些 由一个布尔值(有效)表示几何是否有效,一个 varchar(原因)表示它无效的原因,一个几何(位置)指出它在哪里无效。 用于替代和改进 ST_IsValid 和 ST_IsValidReason 的组合以生成无效几何的详细报告。

例如:

SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')),ST_IsValidReason(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))'), 2);
ST_ISVALID(boolean)      |ST_ISVALIDREASON(text)      |
-----------------------------------------------------
false                    |Self-intersection           |
总数目:1

SELECT ST_IsValidDetail(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))'));
ST_ISVALIDDETAIL(VALID_DETAIL)      |
------------------------------------
(f,Self-intersection,010100000000000|
000000000000000000000000000)        |
总数目:1

geography

geography — 椭圆空间数据类型。是一种在地球参考系中代表一种几何对象的空间数据类型

drop table t_in_out;
create table t_in_out(id int, g text);
insert into t_in_out VALUES (1,'LINESTRING(124.983539 1.419224,91.181596 29.647798)'::text );


select g::geography from t_in_out;
G(geography)      |
------------------
0102000020E6100000|
02000000CBD58F4DF|
23E5F40412C9B3924|
B5F63F6745D4449FC|
B56400A6AF816D6A5|
3D40              |
总数目:1

--将结果以WKT的格式输出
select ST_AsText(g::geography) from t_in_out;
ST_ASTEXT(text)      |
---------------------
LINESTRING(124.983539|
 1.419224,91.181596 |
29.647798)           |
总数目:1
drop table t_in_out;

geography到其它类型的转换:

目标类型 转换方式
geometry 显示转换
bytea 自动
text 自动

注解

什么时候使用geography 类型而不是geometry 数据类型?

GEOGRAPHY类型允许你以经度/维度坐标的方式存储数据,但这是有代价的:支持 GEOGRAPHY类型的函数要比支持

GEOMETRY类型的函数要少一些,而前者会多花一些CPU时间来执行。

如果数据中只是包含了一个小范围区域,考虑到性能和功能的可用性,选择一个合适的投影系,并使用GEOMETRY类型是最佳选择。

如果数据中包含的是全球性数据或者包含了一个州的数据,GEOGRAPHY类型能够构建一个不需要考虑投影细节的应用系统。

数据以经度/维度格式存储,使用支持GEOGRAPHY类型的函数。

注解

类型修饰符。GIS 几何类型中引入了类型修饰符的概念。

比如 GIS 几何类型 geometry(point) 是允许插入 point 类型,判断的依据是,在 GIS 库中会将 point 的转为对应的长度 即 typmod 依此来判断输入的类型是否合理。

注:修饰符也可以指定 srid 即空间参考系:

CREATE TABLE multicurve_table (name VARCHAR(128), geom GEOMETRY(MULTICURVE, 4326));