代码改变世界

PostgreSQL+PostGIS

2017-05-30 09:44  DataBases  阅读(2303)  评论(0编辑  收藏  举报

PostGIS简介

PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符。同时,PostGIS遵循OpenGIS的规范。

PostGIS的版权被纳入到GNU的GPL中,也就是说任何人可以自由得到PostGIS的源码并对其做研究和改进。正是由于这一点,PostGIS得到了迅速的发展,越来越多的爱好者和研究机构参与到PostGIS的应用开发和完善当中。

PostGIS特性

PostGIS支持所有的空间数据类型,这些类型包括:点(POINT)、线(LINESTRING)、多边形(POLYGON)、多点 (MULTIPOINT)、多线(MULTILINESTRING)、多多边形(MULTIPOLYGON)和集合对象集 (GEOMETRYCOLLECTION)等。PostGIS支持所有的对象表达方法,比如WKT和WKB。

PostGIS支持所有的数据存取和构造方法,如GeomFromText()、AsBinary(),以及GeometryN()等。

PostGIS提供简单的空间分析函数(如Area和Length)同时也提供其他一些具有复杂分析功能的函数,比如Distance。

PostGIS提供了对于元数据的支持,如GEOMETRY_COLUMNS和SPATIAL_REF_SYS,同时,PostGIS也提供了相应的支持函数,如AddGeometryColumn和DropGeometryColumn。

PostGIS提供了一系列的二元谓词(如Contains、Within、Overlaps和Touches)用于检测空间对象之间的空间关系,同时返回布尔值来表征对象之间符合这个关系。

PostGIS提供了空间操作符(如Union和Difference)用于空间数据操作。比如,Union操作符融合多边形之间的边界。两个交迭的多边形通过Union运算就会形成一个新的多边形,这个新的多边形的边界为两个多边形中最大边界。

PostGIS还提供以下功能:

数据库坐标变换

数据库中的几何类型可以通过Transform函数从一种投影系变换到另一种投影系中。在OpenGIS中的几何类型都将SRID作为自身结构的一部分,但不知什么原因,在OpenGIS的SFSQL规范中,并没有引入Transform。

球体长度运算

存储在普通地理坐标系中的集合类型如果不进行坐标变换是无法进行程度运算的,OpenGIS所提供的坐标变换使得积累类型的程度计算变成可能。

三维的几何类型

SFSQL规范只是针对二维集合类型。OpenGIS提供了对三维集合类型的支持,具体是利用输入的集合类型维数来决定输出的表现方式。例如,即便 所有几何对象内部都以三维形式存储,纯粹的二维交叉点通常还是以二维的形式返回。此外,还提供几何对象在不同维度间转换的功能。

空间聚集函数

在数据库中,聚集函数是一个执行某一属性列所有数据操作的函数。比如Sum和Average,Sum是求某一关系属性列的数据总和,Average 则是求取某一关系属性列的数据平均值。与此对应,空间聚集函数也是执行相同的操作,不过操作的对象是空间数据。例如聚集函数Extent返回一系列要素中 的最大的包裹矩形框,如“SELECT EXTENT(GEOM) FROM ROADS”这条SQL语句的执行结果是返回ROADS这个数据表中所有的包裹矩形框。

栅格数据类型

PostGIS通过一种新的数据类型片,提供对于大的栅格数据对象的存储。片由以下几个部分组成:包裹矩形框、SRID、类型和一个字节序列。通过 将片的大小控制在数据库页值(32×32)以下,使得快速的随即访问变成可能。一般大的图片也是通过将其切成32×32像素的片然后再存储在数据库中的。

PostgreSQL + PostGIS 方案

由于源代码安装PostGIS需要安装Proj4,GEOS,libxml2,json-c,GDAL等依赖包;最简便的方法便是实用EDB的PostgreSQL安装包,在安装EDB的PostgreSQL安装包时可以直接下载并安装postGIS插件;安装完成并启动数据库之后有如下扩展为安装成功;

postgres=# select * from pg_available_extensions where name like 'postgis%';
          name          | default_version | installed_version |                               comment                              
------------------------+-----------------+-------------------+---------------------------------------------------------------------
 postgis                | 2.2.5           |                   | PostGIS geometry, geography, and raster spatial types and functions
 postgis_topology       | 2.2.5           |                   | PostGIS topology spatial types and functions
 postgis_tiger_geocoder | 2.2.5           |                   | PostGIS tiger geocoder and reverse geocoder
(3 rows)

并且会自动创建一个GIS模板库 template_postgis;有如下系统表信息;

template_postgis=# \d
               List of relations
 Schema |       Name        | Type  |  Owner  
--------+-------------------+-------+----------
 public | cities            | table | postgres
 public | geography_columns | view  | postgres
 public | geometry_columns  | view  | postgres
 public | raster_columns    | view  | postgres
 public | raster_overviews  | view  | postgres
 public | spatial_ref_sys   | table | postgres

若需要创建新的空间数据库可以执行如下操作;

[postgres@localhost ~]$ psql -c "create database gis_db;"
Password:
CREATE DATABASE
[postgres@localhost ~]$ psql -d gis_db -c "create extension postgis;"
Password:
CREATE EXTENSION
[postgres@localhost ~]$ psql -d gis_db -c "create extension postgis_topology;"
Password:
CREATE EXTENSION

[postgres@localhost ~]$ psql -d gis_db
Password:

gis_db=# \d
                 List of relations
  Schema  |       Name        |   Type   |  Owner  
----------+-------------------+----------+----------
 public   | geography_columns | view     | postgres
 public   | geometry_columns  | view     | postgres
 public   | raster_columns    | view     | postgres
 public   | raster_overviews  | view     | postgres
 public   | spatial_ref_sys   | table    | postgres
 topology | layer             | table    | postgres
 topology | topology          | table    | postgres
 topology | topology_id_seq   | sequence | postgres
(8 rows)

建空间表

gis_db=# create table cities (id int4, name varchar(20));
CREATE TABLE

添加几何字段

gis_db=# select AddGeometryColumn('public', 'cities', 'shape', 4326, 'POINT', 2);
                addgeometrycolumn                
--------------------------------------------------
 public.cities.shape SRID:4326 TYPE:POINT DIMS:2
(1 row)

创建索引

gis_db=# CREATE INDEX shape_index_cities ON cities USING gist (shape);
CREATE INDEX

 

ref:http://www.cnblogs.com/wuhenke/archive/2010/08/02/1790747.html

ref:http://www.cnblogs.com/kaituorensheng/p/4647901.html#_label3

ref:https://jimubiji.com/note/661

ref:http://mysql.taobao.org/monthly/2015/07/04/