首页 理论教育 PostGIS数据库基本操作指南

PostGIS数据库基本操作指南

时间:2023-08-24 理论教育 版权反馈
【摘要】:为了实验方便,采取同样的方式导入点和面数据,此时拥有点、线、面数据各一份,如图3-24所示。两个geometry之间的空间拓扑关系有包含、相交、叠加、邻接、覆盖等,在PostGIS中也一样提供了很多相对应的操作数据库的函数,用于进行空间运算和查询。这里只列举了部分函数,有兴趣的读者可以查阅PostGIS的官方网站进行查看。在PostgreSQL中,可以通过函数ST_AsText实现geometry到wkt的转换。

PostGIS数据库基本操作指南

为了实验方便,采取同样的方式导入点和面数据(具体步骤可参考上一小节“四、PostGIS安装配置”),此时拥有点、线、面数据各一份,如图3-24所示。

图3-24 点、线、面数据

在表中创建索引,以便更加快速高效地查询数据。

创建空间索引语句,如图3-25所示。

两个geometry之间的空间拓扑关系有包含、相交、叠加、邻接、覆盖等,在PostGIS中也一样提供了很多相对应的操作数据库的函数,用于进行空间运算和查询。

下面是一些常用的函数:

图3-25 创建空间索引语句

ST_Equals(geom A,geom A),判断几何对象A和B是否相等。

ST_Within(geom A,geom B),判断A是否处于B中,返回值为布尔型。

ST_Disjoint(geom A,geom B),返回A是否不在B中,即两个几何对象是否分离。

ST_Intersects(geom A,geom B),包括A与B相交,包含A存在于B中的两种情况。

ST_Union(geom A,geom B),返回A和B两个几何的并集。

ST_Intersection(geom A,geom B),返回A和B的交集。

ST_Difference(geom A,geom B),返回A与B不相交的部分几何。

ST_Distance(geom A,geomB),获取两个几何对象间的距离。

ST_Touches(geom A,geom B),判断两个几何对象是否邻接。

ST_Crosses(geom A,geom B),判断两个几何对象是否互相穿过。

ST_Overlaps(geom A,geom B),判断两个几何对象是否重叠。

ST_Contains(geom A,geom B),判断A是否包含B。

ST_Covers(geom A,geom B),判断A是否覆盖B。

ST_CoveredBy(geom A,geom B),判断A是否被B所覆盖。

ST_GeomFromText(wkt,wkid)wkt,格式转换为指定geometry格式。

ST_AsGeoJson(geometry)geometry,格式为转geojson。

ST_GeometryType(geometry A),获取几何类型。

ST_Length(geometry),计算一个几何对象长度

ST_Area(geometry),计算一个几何对象的面积。

ST_Centroid(geometry),返回该几何对象的中心点,返回值为point。

ST_Buffer(geom,distance),或者st_buffer(wkt,distance)实现缓冲区的计算。

ST_Boundary(geometry),获取一个几何对象边界。

ST_MakeLine(geom A,geom A),使用point或line生成一个linestring对象。

这里只列举了部分函数,有兴趣的读者可以查阅PostGIS的官方网站进行查看(http://postgis.net/documentation/)。

下面我们将使用一些查询语句进行实例化。在PostgreSQL中,可以通过函数ST_AsText(geom)实现geometry到wkt的转换。通常用这个函数将数据库中的数据转换后传到前端用于展示。

结果为:POINT(115.056864407615 30.2159445749592),如图3-26所示。

图3-26 ST_AsText函数

同样,如果为了方便用于前台展示,可以使用ST_AsGeoJson(geometry)函数,将结果转为geojson格式。

结 果 为:{"type":"Point","coordinates":[115.056864407615,30.215944574 9592]},如图3-27所示。

这样就直接得到了geojson格式的结果。

wkt和geojson格式方便用于前台的使用,通常将前台操作完的数据进行入库或者别的空间操作(如缓冲区分析、距离分析等)时,要将数据再转为geometry格式。

使用ST_GeomFromGeoJson(geojson),可以将geojson转为geometry格式。

图3-27 ST_AsGeoJson函数

结果为:0101000000D2C09CAAA3C35C40C932C72448373E40,如图3-28所示。

图3-28 ST_GeomFromGeoJson函数

使用ST_GeomFromText(wkt,wkid),将wkt格式转化为geometry格式:

结果为:0101000020E6100000D2C09CAAA3C35C40C932C72448373E40,如图3-29所示。

我们可以看到又转换到了原来的数据格式。

ST_GeometryType(geometry A)用于获取要素的几何类型:

图3-29 ST_GeomFromText函数

结果为:ST_Point,如图3-30所示。

图3-30 ST_GeometryType函数(一)

结果为:ST_MultiLineString,如图3-31所示。

使用ST_Length(geometry)可以计算一个几何对象长度,注意只能计算线要素的长度,如果计算点要素或者面要素,那么返回值会是0,读者可以自行验证。结果为:2.51192404955307,如图3-32所示。

图3-31 ST_GeometryType函数(二)

图3-32 ST_Length函数(www.xing528.com)

可以使用Geography将查询到的距离转为米(如果是面积就是平方米):

结果为:260129.678167946,如图3-33所示。

图3-33 Geography将查询到的距离转化成米

使用ST_Area(geometry)可以计算一个几何对象的面积:结果为:9894760785.0311,如图3-34所示。

图3-34 ST_Area函数

判断两个几何对象是否一样:

结果为:true,如图3-35所示。

图3-35 ST_Equals函数

结果为:false,如图3-36所示。

图3-36 ST_Equals函数

使用ST_Covers(geom A,geom B),判断A是否覆盖B:

结果为:true,如图3-37所示。

使用ST_Within(geom A,geom B),判断A是否处于B中,返回值为布尔型:

图3-37 ST_Covers函数

结果为:true,如图3-38所示。

图3-38 ST_Within函数

返回A是否不在B中,即两个几何对象是否分离:

结果为:false,如图3-39所示。

这也和上面操作的例子ST_Within(geom A,geom B)相吻合。

图3-39 ST_Disjoint函数

结果为:0107000020E610000000000000,如图3-40所示。

图3-40 ST_Intersection函数

使用ST_Centroid(geom),返回该几何对象的中心点,返回值为point。

结果为:0101000020E6100000856AF110398D5C40ADD071F4C29D3D40,如图3-41所示。

图3-41 ST_Centroid函数

可以验证一下刚才查到的几何中心点的坐标(图3-42)。

图3-42 验证几何中心点坐标

使用ST_Distance(geom A,geomB),获取两个几何对象间的距离:

结果为:33019.05738308,如图3-43所示。

图3-43 ST_Distance函数

使用ST_Buffer(geom,distance),实现缓冲区计算:

结果为:POLYGON((215.056864407615 30.2159445749592,213.13539244793910.7069123733464,207.444817658744 -8.05239866154971,198.20382563787-25.3410787270009,185.76754252627 -40.4947335436955,170.613887709576-52.9310166552952,153.325207644125 -62.1720086761694,134.565896609228-67.8625834653638,...,215.056864407615  30.2159445749592)),如图3-44所示。

图3-44 ST_Buffer函数

获取一个几何对象边界(如果传入参数为线则返回线的端点,如果传入面返回边界线):

结果为:MULTIPOINT(114.56179368711 30.0656336564608,114.786887608367 30.6242758428519),如图3-45所示。

图3-45 ST_Boundary函数

结果为:MULTILINESTRING((115.097926481376 30.2876581151547,115.096183329797 30.2484036388547,115.132562145354 30.2290016038911,115.188342995874 30.233852112632,115.22472181143 30.2265763495207,115.341134021211 30.1077388853691,115.348409784323 30.051958034849,115.367811819286 30.0277054911447,...,115.09792648137630.2876581151547)),如图3-46所示。

图3-46 ST_Boundary函数

ST_MakeLine(geom A,geom A)使用point或line生成一个linestring对象:

结果为:LINESTRING(115.097926481376 30.2876581151547,115.097926481376 30.2876581151547),如图3-47所示。

图3-47 ST_MakeLine函数

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈