postgresql是对空间数据支持比较好的关系型数据库,postgis是它的空间计算拓展插件。
数据库与插件都是开源的。
(加拿大是现代地理信息产业的发源地,时至今日,加拿大仍然活跃着许多GIS开源项目的开发者。)
postgresql还有一些对GIS有用的拓展插件:pgrouting,用于路径规划;postgis_topology,基于postgis的拓扑套件;fuzzystrmatch,文本模糊匹配;postgis_tiger_geocoder,tiger英文地址编码;address_standardizer,地址标准化插件;pg-trajectory,时空检索插件。
postgis由OSGeo(开放地理信息联盟)维护,它的数据结构和算法设计,完全符合OGC的规范,postgis由C语言编写,它直接移植了C语言编写的GEOS空间算法库和GDAL数据处理库,因为它也包含Proj.4,所以它可以进行坐标系转换和空间投影,它还可以解析XML和JSON。
总之,GIS开发者需要的大部分空间算法与数据转换,postgis都能在postgresql数据库中实现。
官网上关于postGIS的介绍是:关系型数据库postgresql的空间拓展程序,增加了对地理对象的支持,允许在SQL中进行位置查询。
要是连postgresql都没有,那就看postgresql官网吧:https://www.postgresql.org/
安装好了之后,新建数据库,运行“CREATE EXTENSION postgis; ”进行拓展。
postgis安装后,可支持多个GIS相关扩展,postgis是支持空间运算的,postgis_raster支持基于影像数据的运算,postgis_topology支持数据拓扑,postgis_sfcgal支持三维数据计算……。
postgis新建包含空间数据字段的表语句:
CREATE TABLE mytable (
id SERIAL PRIMARY KEY,
geom GEOMETRY(Point, 4326),
name VARCHAR(128)
);
添加空间索引的语句:
CREATE INDEX mytable_gix
ON mytable
USING GIST (geom);
插入一个点语句:
INSERT INTO mytable (geom) VALUES (
ST_GeomFromText('POINT(0 0)', 4326)
);
查询距离范围内的点语句:
SELECT id, name,st_astext(geom)
FROM mytable
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(0 0)', 4326,
0.01
);
虽然是英文文档,但使用Chrome浏览器,一键翻译即可。
postgis函数很多,还支持聚类和轨迹处理,
一路看下来,postgis能满足大部分需求,即使有pg-trajectory专门处理时序数据的扩展,但它能实现的,用postgis也能实现,把时间戳当成m值就可以了。
剩下一个postgis没有办法实现功能的拓展就是路径规划拓展pgrouting了。用pgrouting部署一个路径规划服务,还是挺方便的,跟本文无关,先不讲了。
最好的参考资料,就是官方文档,postgis的文档写得非常详尽,有什么地方不清楚,直接查阅文档是最好的。