GIS开发对数据的操作,主要是对空间数据的操作。PostgreSql提供了一些处理空间数据的函数,操作起来是比较方便的。
空间数据
介绍这些函数之前,先了解一下什么是空间数据。空间数据是指用来表示空间实体的位置、形状、大小及其分布特征诸多方面信息的数据,它可以用来描述来自现实世界的目标,它具有定位、定性、时间和空间关系等特性。空间数据是一种用点、线、面以及实体等基本空间数据结构来表示人们赖以生存的自然世界的数据。简单来说,操作空间数据主要是对点、线、面等基本结构的操作。
地图上的图层有面图层、点图层和线图层之分,就拿一个城市的地图来说,该城市的公园图层就相当于面图层,因为可能需要表示公园有多大;一个城市医院或者银行的分布可以看做是点图层;城市的道路交通可以认为是线图层。
这些空间数据可以在数据库中存储,存储时可以是geometry格式;也可以以文件的形式存储,存储成shape文件。在数据库中存储时,geometry是以十六进制串组成的,表示的是几何形状。shape文件存储时,对应点线面分别由三种类型,point、line、polygon,这是单一的类型,对应联合的类型又有multipoint、multiline、multipolygon,所以说,shape文件存储的是wkt类型的数据。本篇博客暂且把空间数据分为这两种类型:geometry和wkt。
函数操作
在系统中我们用的地图插件是Openlayer,它对地图的操作是操作wkt数据,所以就涉及到geometry和wkt的转换。
st_geomfromtext(wkt,坐标系参数):该方法是把wkt格式数据转换成geometry类型,参数有两个,第一个是wkt类型的数据,第二个是坐标系参数。
st_astext(geometry):该方法是把geometry类型数据转换成wkt格式数据,参数只有一个,是geometry类型的数据。
图层是由各个图斑构成的,如果要在地图上定位某个图斑,就需要获取这个图斑的中心点坐标。
st_centroid(geometry):这个方法是获取这个geometry的中心点,参数是要获取中心点的geometry。
st_x(point):该方法是获取点的x坐标,它操作的对象是一个点。
st_y(point):该方法是获取点的y坐标,它操作的对象也是一个点。
有时我们需要实现两个图斑相交,也可以用函数执行。
st_intersects(geometry,geometry):该方法是实现两个图斑相交,传入的参数是两个图斑的geometry。
跟这个方法类似的还有好多函数,比如判断两个图斑是否相交,返回一个布尔值;或者获取两个图斑相交的geometry和不相交的geometry。
如果要使图斑联合,则需要union函数。
st_union(geometry):如果一个图层表中存储好多图斑,其中有一列名为geom,存储的是各个图斑的geometry,那么st_union(geom)就是将该图层的所有图斑联合成一个,得到的结果就是multi类型的数据。
如果要查看某个图斑方圆多少米之内的情况,就要对该图斑进行缓冲。
st_buffer(geometry,长度):该方法是对某个图斑进行缓冲,传入要缓冲的geometry,在传入缓冲的距离即可。
根据已有的经纬度字段生成空间字段
需求:在tpos表中根据已有的经纬度字段:lng、lat,生成类型为geometry的geom字段,便于geoserver发布矢量服务!
1:postgresql添加postgis扩展
CREATE EXTENSION postgis;
1:向已有表中添加geom空间字段
SELECT AddGeometryColumn('public', 'tpois', 'geom', 4326, 'POINT', 2);
或 ALTER TABLE tpois ADD COLUMN geom geometry(Geometry,4326);
3:根据表tpois中已有的经纬度字段给geom空间字段赋值
SET geom = st_geometryfromtext('POINT('|| lng ||' '|| lat ||')',4326);
注释:本文中部分内容转自https://blog.csdn.net/fengyao1995/article/details/53730417