PostGIS介绍
一、相关缩写
OGC——Open Geospatial Consortium(开放地理空间联盟),负责制订GIS领域的标准
二、PostGIS的扩展
PostGIS是利用Postgresql的扩展机制,在Postgresql的基础上增加了表达地理信息的空间数据类型和操作这些类型的函数。
三、PostGIS支持的数据类型
1、OpenGIS Consortium (OGC)定义了两种标准方式来表达空间对象,分别是WKT( Well-Known Text)和WKB(Well-Known Binary)。WKT其实等价于编程语言中的类型的字面量,而WKB是空间对象在数据库中的存储格式。常用数据类型如下:
• 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))
2、OGC定义的空间对象只是2D(二维)的,这在实际使用中,并不足够。PostGIS在此基础上,定义了EWKT(Extended Well-Known Tex)和EWKB(Extended Well-Known Binary),以此来支持3dm、3dz和4d 等坐标类型并支持嵌入 SRID 信息。例子如下:
2、OGC定义的空间对象只是2D(二维)的,这在实际使用中,并不足够。PostGIS在此基础上,定义了EWKT(Extended Well-Known Tex)和EWKB(Extended Well-Known Binary),以此来支持3dm、3dz和4d 等坐标类型并支持嵌入 SRID 信息。例子如下:
• 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))
3、为了配合SQL进行简单查询(类似select * from table),还有一种canonical格式,这个格式其实是WKB的16进制表示。这个格式其实也可以用在Insert和Update语句中。
4、geometry(几何)和geography(地理)
geometry是所有几何体的父类(记住,Postgresql是一个对象数据库),简单的说,geometry是基于欧几里得几何进行计算(欧几里得几何的典型特点是是两点间最短路径是一条直线),而geography是为了基于球面几何(典型特点是,两点间最短路径是一条圆弧)执行一些更复杂的操作而创建的。
使用AddGeometryColumn函数来添加geometry类型,而geography类型需要特别的语法,如下:
3、为了配合SQL进行简单查询(类似select * from table),还有一种canonical格式,这个格式其实是WKB的16进制表示。这个格式其实也可以用在Insert和Update语句中。
4、geometry(几何)和geography(地理)
geometry是所有几何体的父类(记住,Postgresql是一个对象数据库),简单的说,geometry是基于欧几里得几何进行计算(欧几里得几何的典型特点是是两点间最短路径是一条直线),而geography是为了基于球面几何(典型特点是,两点间最短路径是一条圆弧)执行一些更复杂的操作而创建的。
使用AddGeometryColumn函数来添加geometry类型,而geography类型需要特别的语法,如下:
CREATE TABLE testgeog(gid serial PRIMARY KEY, the_geog geography(POINT,4326) );--定义一个2D的点
CREATE TABLE testgeog(gid serial PRIMARY KEY, the_geog geography(POINTZ,4326) ); --定义一个3D的点
标准的geometry类型,如果SRID设置为4326,将被自动转化为为geography类型。
一般情况,寻找一个合适的投影坐标系,比如google map使用的3857,然后使用geometry类型就够了,这样可以获得最高的性能
标准的geometry类型,如果SRID设置为4326,将被自动转化为为geography类型。
一般情况,寻找一个合适的投影坐标系,比如google map使用的3857,然后使用geometry类型就够了,这样可以获得最高的性能