geometry 对象定义及构造

geometry 类型

定义geometry列,可以不指定子类型,则表示可以存储任意子类型。

-- 指定srid 为 4326
create table testgeoms ( id int primary key, geom geometry);

geometry列,也可以指定子类型,支持的类型名见下一小节,示例如下:

-- 指定 geom 列存储 linestring
create table testlinestring (id serial, geom geometry(linestring, 4326) );

指定子类型时,可带单引号、双引号或不带引号,也不区分大小写。

geometry 子类型

geometry 有16种子类型,包括:

geometry 类型

子类型

描述

构成

POINT

/

LINESTRING

线,折线

由点串构成

POLYGON

由 n 个部分组成,每个部分是首尾相连的线串

POLYHEDRALSURFACE

多面体表面

由 n 个部分组成,每个部分都是一个 Polygon

MULTIPOINT

多点

由 n 个 Point 子对象组成

MULTILINESTRING

多线

由 n 个 LineString 子对象组成

MULTIPOLYGON

多面

由 n 个 Polygon 子对象组成

CIRCULARSTRING

线,由圆弧连接而成

用点串描述。三个点确定一段圆弧,前一个圆弧的最后一个点与后一个圆弧的第一个点共用;特别地,如果圆弧的第一个点与第三个点重合,则第一,二个点作为直径,以此来表达圆形

COMPOUNDCURVE

复合线

由 n 个部分组成,每个部分可以是LineString 或 CircularString,且前一部分的最后一个点与后续部分的第一个点重合,保证复合线对象的连续性

BEZIERSTRING

贝塞尔曲线

由n+1个点确定一段n阶贝塞尔曲线

MULTICURVE

多(曲)线

由 n 个子对象组成,每个子对象可以是CircularString 或 LineString 或 CompoundCurve

CURVEPOLYGON

复合面

由 n 个部分组成,每个部分是首尾相连的 CircularString 或 LineString 或 CompoundCurve。与 Polygon 类似,都表达一个闭合的区域,区别在于是否有CircularString对象参与构造

MULTISURFACE

多面

由 n 个子对象组成,每个子对象可以是Polygon 或 CurvePolygon 类型。与 MultiPolygon类似,都表达多面对象,区别在于是否有CircularString对象参与构造

GEOMETRYCOLLECTION

复合对象

由任意子类型构成

TRIANGLE

三角形

由首尾相连的4个点构成

TIN

不规则三角网

由 n 个 Triangle 组成

以上每种类型,可以指定是否带Z或M值。例如,点可以指定为:POINT、POINTZ、POINTM、POINTZM。
以上16种子类型,有一部分容易理清其关系,见下图左;当加入新的类型 CircularStringBezierString 后,衍生出带参数化对象的线和面,以及贝塞尔曲线,进而构成PostGIS的全部16种子类型,见下图右。
PostGIS-GeometryType

PostGIS-GeometryType

构造示例:Point LineString Polygon

Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon容易理解,构造示例如下:

-- 指定 srid 为 4326
CREATE TABLE testgeomobj (id serial, geom geometry NOT NULL);

-- Point 对象
INSERT INTO testgeomobj (geom) VALUES ('SRID=4326;POINT(-95.363151 29.763374)');
INSERT INTO testgeomobj (geom) VALUES ('SRID=4326;POINT(-95.363151 29.763374)');
-- MultiPoint 对象
INSERT INTO testgeomobj (geom) VALUES ('SRID=4326;MULTIPOINT(-95.4 29.8,-95.4 29.8)');

-- LineString 对象
insert into testgeomobj (geom) values ('SRID=4326;LINESTRING(-71.1031880899493 42.3152774590236,-71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307,-71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248)');
-- MultiLineString 对象
insert into testgeomobj (geom) values ('SRID=4326;MultiLineString (
(-71.1031880899493 42.3152774590236,-71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307,-71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248),
(-71.1766585052917 42.3912909739571, -71.1766820268866 42.391370174323896, -71.1766063012595 42.3913825660754, -71.17658265830809 42.391303365353096)
)');

-- Polygon 对象
insert into testgeomobj(geom) values ('SRID=4326;
POLYGON (
(-71.1776585052917 42.3902909739571, -71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754, -71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571),
(-71.1766585052917 42.3912909739571, -71.1766820268866 42.391370174323896, -71.1766063012595 42.3913825660754, -71.17658265830809 42.391303365353096, -71.1766585052917 42.3912909739571)
)');
-- MultiPolygon 对象
insert into testgeomobj(geom) values ('SRID=4326; MultiPolygon (
((-71.1776585052917 42.3902909739571, -71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754, -71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571)),
((-71.1766585052917 42.3912909739571, -71.1766820268866 42.391370174323896, -71.1766063012595 42.3913825660754, -71.17658265830809 42.391303365353096, -71.1766585052917 42.3912909739571))
)');

构造示例:CircularString CompoundCurve

CREATE TABLE testgeom (id serial,geom geometry NOT NULL);
-- CircularString:由四段组成,见下图左
INSERT INTO testgeom (geom) VALUES ('CIRCULARSTRING(0 2, -1 1, 0 0, 0.5 0, 1 0, 2 1, 1 2, 0.5 2, 0 2)');
-- CompoundCurve:由圆弧和折线段组成,'LINESTRING'关键字可省略,生成的图形见下图右
INSERT INTO testgeom (geom) VALUES ('COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),LINESTRING(1 0, 2 0))');

CircularString CompoundCurve

构造示例:CurvePolygon

-- 由首尾相连的圆弧线串和折线构成
insert INTO testgeom (geom) VALUES('CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))');

构造示例:PolyhedralSurface

PolyhedralSurface 由n个 Polygon 构成,PolyhedralSurface 对象不一定是闭合的,可以用ST_IsClosed() 方法判断。

-- PolyhedralSurface 对象
INSERT INTO testgeom (geom) VALUES ('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )');

SELECT ST_IsClosed(geom) from testgeom;

构造示例:BezierString

-- 三阶贝塞尔曲线
insert INTO testgeom (geom) VALUES('BEZIERSTRING(1 1, 2 2, 3 2, 3 1)');