PostGIS是PostgreSQL的空间扩展,他使得PostgreSQL支持空间数据类型,比如点、线段、折线段、多边形、椭圆等等,并且能够使用高效的空间索引进行存储和查找。
安装
ubuntu下在安装好PostgreSQL的基础下用apt install postgis
即可。
确认安装版本可以用在postgreSQL的shell里查询:
1 | myths=# select * from pg_available_extensions where name like 'postgis%'; |
我这里大概显示的是:
1 | name | default_version | installed_version | comment |
很明显可以看见版本和说明。
简要使用
用好这个扩展好像也是个挺麻烦的事的,因为这个牵涉到使用很多的函数,因此查看帮助文档就显得很必要了。
下面就以对点进行最近邻的查找为例。
首先要导入该扩展:
1 | >myths=# create extension postgis; |
导入后会在数据库里多出下面这几个表:
1 | myths=# \d |
这些东西都是postgis必备的东西,尤其是spatial_ref_sys表,保存了不同的坐标系信息。
然后建表:
1 | myths=# create table testTable(id int primary key ,geo geometry(point,0)); |
基本的sql语句,不同的是geo字段的类型是point,而且后面跟了个数字。这个数字是srid,表示我们使用的坐标集。这个数字对应的是之前的spatial_ref_sys里的字段。通常的经纬度坐标集对应的srid是4326,而这里的0表示我用的是普通的几何坐标。关于srid的问题可以直接百度。
插入语句:
1 | myths=# insert into testTable values(1,ST_GeomFromText('POINT(32 66)',0)); |
这就用到了st_geomfromtext()函数,这个函数把文本形式的类型转换为实际类型,并且指定srid,插入到表中。
对应的类型还有:
1 | • POINT(0 0) |
批量生成数据
1 | import java.io.BufferedWriter; |
生成后用myths=# \i ~/Desktop/data.txt
导入即可。
最近邻查找myths=# select id,st_astext(geo) from testtable order by geo<->st_geomfromtext('point(10 10)',0) limit 10;
这个语句就是查找距离点(10,10)最近的前10个点。这里<->表示求距离,st_astext()函数把wkb形式的数据转换成wkt的可读形式:
1 | id | st_astext |
否则就是这样:
1 | myths=# select id,geo from testtable order by geo<->st_geomfromtext('point(10 10)',0) limit 10; |
添加索引myths=# create index testIndex on testtable using gist(geo);
对于空间类型添加的索引是gist类型的,具体含义参见文档。
添加了索引后可以发现查询效率有明显提升:
1 | myths=# select id,st_astext(geo) from testtable order by geo<->st_geomfromtext('point(10 10)',0) limit 10; |