postgresql支持空间数据存储。
postgis是postgresql的一个扩展。与postgresql配合使用,需要对应的版本。如果是windows上安装,可以参考这里选择对应的postgis版本。
如果不安装postgis插件,在进行创建postgis扩展的时候,会报错。
当我们安装好对应版本的postgis,在postgresql安装目录的share/extension目录下会有一个postgis.control文件,再次创建postgis扩展则会顺利创建。
如下,开始创建空间数据库表。
testdb=# create table cities(id smallint,name varchar(50));
CREATE TABLE
testdb=# select AddGeometryColumn('cities','the_geom',4326,'POINT',2);
addgeometrycolumn
-----------------------------------------------------
public.cities.the_geom SRID:4326 TYPE:POINT DIMS:2
(1 row)
向表中插入记录:
testdb=# insert into cities (id,the_geom,name) values (1,ST_GeomFromText('POINT(-0.1257
51.508)',4326),'London,England'),(2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London
Ontario'),(3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');
INSERT 0 3
查看表记录:
testdb=# select * from cities;
id | name | the_geom
----+----------------+----------------------------------------------------
1 | London,England | 0101000020E6100000BBB88D06F016C0BF1B2FDD2406C14940
2 | London Ontario | 0101000020E6100000F4FDD478E94E54C0E7FBA9F1D27D4540
3 | East London,SA | 0101000020E610000040AB064060E93B4059FAD005F58140C0
(3 rows)
显示的the_geom列信息是二进制,这里需要借助gis空间函数进行转换。
testdb=# select id,name,ST_AsText(the_geom),ST_AsEwkt(the_geom),ST_X(the_geom),ST_Y(the_geom) from cities;
id | name | st_astext | st_asewkt | st_x | st_y
----+----------------+------------------------------+----------------------------------------+-------------+-----------
1 | London,England | POINT(-0.1257 51.508) | SRID=4326;POINT(-0.1257 51.508) | -0.1257 | 51.508
2 | London Ontario | POINT(-81.233 42.983) | SRID=4326;POINT(-81.233 42.983) | -81.233 | 42.983
3 | East London,SA | POINT(27.91162491 -33.01529) | SRID=4326;POINT(27.91162491 -33.01529) | 27.91162491 | -33.01529
(3 rows)
另外一个求距离的函数:
testdb=# SELECT p1.name,p2.name,ST_DistanceSphere(p1.the_geom,p2.the_geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
name | name | st_distancesphere
----------------+----------------+-------------------
London Ontario | London,England | 5875787.03777356
East London,SA | London,England | 9789680.59961472
East London,SA | London Ontario | 13892208.67829283
(3 rows)
testdb=#
在新版本中,ST_DistanceSphere函数没有第二个下划线。以前的资料可能会提示使用ST_Distance_Sphere,在postgresql14+postgis3.1.4版本中,函数变为了ST_DistanceSphere。使用的时候需要注意。