本文给出一些关于地理信息扩展库Postgis空间列常用操作,在实际使用中很实用的查看和编辑空间列信息。windows环境下安装如下:
先安装postgresql-9.6.3-2-windows-x64.exe,然后在安装postgis插件,注意postgis插件与postgresql版本的兼容性,官网有详细的描述。linux环境(如debian)可添加相应的源,获取相应版本。允许所有IP远程访问,可修改pg_hba.conf(windows下在安装目录下,如C:\Program Files\PostgreSQL\9.6\data),行“host all all 127.0.0.1/32 md5“下添加以下配置:
host all all 0.0.0.0/0 md5
当然也可以指定ip等,限制访问,这里不介绍。进入postgresql数据库,增加postgis扩展,输入:
-- Enable PostGIS (includes raster)
CREATE EXTENSION postgis;
模式public下会生成一张表:
spatial_ref_sys表存放epsg描述的坐标系信息,包括坐标系的wkt和proj4描述等。就可以在postgresql中使用postgis函数了。
查看数据库版本:
--输出:PostgreSQL 9.6.3, compiled by Visual C++ build 1800, 64-bit
SELECT version();
查询Postgis版本信息:
--输出:POSTGIS="2.3.2 r15302" GEOS="3.6.1-CAPI-1.10.1 r4317" PROJ="Rel. 4.9.1, 04 March 2015"
--GDAL="GDAL 2.1.3, released 2017/20/01" LIBXML="2.7.8" LIBJSON="0.12" RASTER
SELECT postgis_full_version();
以下的操作针对矢量数据。
创建一张空间表,SQL语句如下:
--SERIAL id自增
CREATE TABLE point (
id SERIAL PRIMARY KEY,
name VARCHAR
);
--参数分别是:模式,表名,空间列名称,坐标系SRID,空间列存储数据是点,二维
-- AddGeometryColumn(
-- ,
-- ,
-- ,
-- ,
-- ,
--
-- )
SELECT AddGeometryColumn('public', 'point', 'the_geom', 4326, 'POINT', 2);
习惯上用the_geom来表示空间列名,也可以用其他名字。可以添加多个空间列,空间列可以有自己的坐标系。如执行如下语句创建一个the_geom_2空间列:
SELECT AddGeometryColumn('public', 'point', 'the_geom_2', 4490, 'POINT', 2);
得到的point表结构如下:
删除空间列:
--DropGeometryColumn(varchar schema_name, varchar table_name, varchar column_name)
--用单引号
SELECT DropGeometryColumn('public', 'points', 'the_geom_2');
查询空间列the_geom的坐标系(srid):
--Find_SRID(varchar a_schema_name, varchar a_table_name, varchar a_geomfield_name);
--输出4326
SELECT Find_SRID('public', 'point', 'the_geom');
将空间列the_geom_2坐标系改为4549,不管原来是什么坐标系:
--UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid)
SELECT UpdateGeometrySRID('public','point','the_geom_2',4549);
上述创建空间表的语句可以合写成一句SQL:
CREATE TABLE point (
id SERIAL PRIMARY KEY,
name VARCHAR,
the_geom geometry(point,4326),
the_geom_2 geometry(point,4490)
);
查看'public'.'geometry_columns'中的信息,它是一个视图,依赖于底层的系统表:
SELECT * FROM geometry_columns;
输出:
输出中分别对应数据库名、模式、表名、空间列名、维度、坐标系和类型。geometry_columns详细信息查询可用:
SELECT * FROM information_schema.columns WHERE table_name='geometry_columns';