postgresql与postgis结合示例

    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。使用的时候需要注意。

Guess you like

Origin blog.csdn.net/feinifi/article/details/121081727