❝PostGIS支持的GIS对象是OpenGIS联盟(OGC)定义的“简单特性”的超集。PostGIS支持OGC“simplefeaturesforsql”规范中指定的所有对象和函数。
❞
PostGIS扩展了OpenGIS标准,支持3DZ、3DM和4D坐标。
OpenGIS 的 WKB 和 WKT
OpenGIS规范定义了两种表示空间对象的标准方法:众所周知的文本(WKT)形式和众所周知的二进制(WKB)形式。WKT和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))
OpenGIS规范还要求空间对象的内部存储格式包括空间参考系统标识符(SRID)。创建空间对象以插入数据库时需要SRID。
这些格式的输入/输出可通过以下接口获得:
bytea WKB = ST_AsBinary(geometry);
text WKT = ST_AsText(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);
geometry = ST_GeometryFromText(text WKT, SRID);
例如,用于创建和插入OGC空间对象的有效insert语句为:
INSERT INTO geotable ( the_geom, the_name )
VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');
PostGIS 的EWKB, EWKT and规范形式
PostGIS扩展格式目前是OGC-one的超集(每个有效的WKB/WKT都是有效的EWKB/EWKT),但这在未来可能会有所不同,特别是如果OGC推出的新格式与我们的扩展冲突。因此,您不应该依赖此功能!
PostGIS EWKB/EWKT添加3DM、3DZ、4D坐标支持和嵌入式SRID信息。
要素的扩展空间对象的文本表示(EWKT)示例如下。
POINT(0 0 0) -- XYZ
SRID=32632;POINT(0 0) -- XY with SRID
POINTM(0 0 0) -- XYM
POINT(0 0 0 0) -- XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID
MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))
GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
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)) )
TRIANGLE ((0 0, 0 9, 9 0, 0 0))
TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
使用以下接口可以在这些格式之间进行转换:
bytea EWKB = ST_AsEWKB(geometry);
text EWKT = ST_AsEWKT(geometry);
geometry = ST_GeomFromEWKB(bytea EWKB);
geometry = ST_GeomFromEWKT(text EWKT);
例如,用于创建和插入PostGIS空间对象的有效insert语句为:
INSERT INTO geotable ( the_geom, the_name )
VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )
PostgreSQL类型的“规范形式”是通过一个简单的查询(没有任何函数调用)得到的表示形式,以及通过简单的insert、update或copy保证可以接受的表示形式。对于PostGIS的“几何体”类型:
- Output
- binary: EWKB
ascii: HEXEWKB (EWKB in hex form)
- Input
- binary: EWKB
ascii: HEXEWKB|EWKT
例如,在标准的ascii输入/输出过程中,此语句读取EWKT并返回HEXEWKB:
=# SELECT 'SRID=4;POINT(0 0)'::geometry;
geometry
----------------------------------------------------
01010000200400000000000000000000000000000000000000
(1 row)
SQL多媒体应用部分
SQL多媒体应用空间规范通过定义一系列循环插值曲线扩展了SQL规范的简单功能。SQL-MM定义包括3DM、3DZ和4D坐标,但不允许嵌入SRID信息。众所周知的文本扩展尚未得到完全支持。一些简单的曲线几何图形示例如下:
CIRCULARSTRING(0 0, 1 1, 1 0)
CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
#循环字符串是基本的曲线类型,类似于线性世界中的线串。单个线段需要三个点,起点和终点(第一个和第三个)以及圆弧上的任何其他点。例外情况是闭合圆的起点和终点相同。在这种情况下,第二点必须是圆弧的中心,即圆的另一边。要将圆弧链在一起,上一个圆弧的最后一个点将成为下一个圆弧的第一个点,就像在LINESTRING中一样。这意味着有效的循环字符串的点数必须大于1。
COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))
#复合曲线是一条既有曲线(圆形)段又有直线段的连续曲线。这意味着,除了具有良好的组件外,每个组件的端点(除了最后一个)必须与以下组件的起点重合。
CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))
#曲线多边形中的复合曲线示例:CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )
#曲线多边形就像一个多边形,有一个外圈和零个或多个内环。不同的是,环可以是圆形字符串、线性字符串或复合字符串的形式。
#从PostGIS 1.4开始,PostGIS支持曲线多边形中的复合曲线。
MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4))
#多曲线是曲线的集合,可以包括线性字符串、圆形字符串或复合字符串。
MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11)))
#这是曲面的集合,可以是(线性)多边形或曲线多边形。




