当前位置: 首页 > 工具软件 > PostGIS > 使用案例 >

PostGIS:GIS对象

闾丘德业
2023-12-01

       PostGIS支持的GIS对象是OpenGIS Consortium (OGC)定义的“简单特性”的超集。
       PostGIS支持OGC“SQL简单特性”规范中指定的所有对象和函数。
       PostGIS扩展了标准,支持3DZ、3DM和4D坐标。

OpenGIS WKB and 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 INTO geotable ( the_geom, the_name )
VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');

PostGIS的EWKB, EWKT和规范形式

OGC格式只支持2D几何图形,并且相关的SRID“从未”嵌入到输入/输出表示中。 PostGIS扩展格式目前是OGC扩展格式的超集(每个有效的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 INTO geotable ( the_geom, the_name )
VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )

PostgreSQL类型的“规范形式”是你通过简单查询(不需要任何函数调用)得到的表示,以及通过简单的插入、更新或复制保证可以接受的表示。 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-MM第3部分

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)

CIRCULARSTRING是基本的曲线类型,类似于线性世界中的LINESTRING。 一个单独的线段需要三个点,起始点和终点点(第一和第三个)以及弧线上的任何其他点。 但对于一个闭合的圆,它的起点和终点是相同的。 在这种情况下,第二点一定是圆弧的中心(即圆的对边)。 要将弧链在一起,前一个弧的最后一个点将成为下一个弧的第一个点,就像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)).

MULTICURVE是曲线的集合,它可以包括线性弦、圆形弦或复合弦。

  • 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)))

这是曲面的集合,可以是(线性)多边形或曲线多边形。

SQL-MM实现中的所有浮点比较都按照指定的公差执行,目前为1E-8。

 类似资料: