作者: 蕾吉娜,毕业于麻省理工学院,PostGIS指导委员会、PostGIS核心开发团队的成员。
PostGIS实战分三个部分,13个章节,总页数491页,逻辑清晰,实战性强。
第一部分结合PostGIS,介绍空间数据库基本概念,涵盖空间数据库,PostGIS与Postgres之间的关系、空间数据类型,空间数据组织、图形函数,图形关系、空间坐标参考、矢量数据如何导入和导出等;
第二部分主要介绍矢量数据库使用,涵盖空间邻近分析,属性数据创建,图形数据创建,坐标变换,空间查询数据创建和空间索引、SQL、图形等PostGIS数据库性能优化。
第三部分介绍PostGIS与其他GIS软件的协同、webGIS中如何使用PostGIS以及PostGIS栅格数据库的使用,涵盖PostGIS与MapServer、GeoServer、OpenLayers、Cadcorp SIS、OpenJUMP、QGIS、uDig、gvSIG等软件的使用,PostGIS栅格数据库创建、栅格表和函数、栅格数据导入和导出、栅格数据与矢量数据综合分析等。
附件ABC列出了很多的GIS软件、资源与技术方法,PostGIS安装、编译与升级、SQL primer、PostgreSQL features和POSTGIS相关的空间分析函数。(本人倒是更喜欢这个)
一些想法
geography vs geometry
geography字典翻译为地理,地形, geometry字典翻译为几何、几何形状。其实geometry是个音译词,翻译为图形更加合适,几何,多少的意思,这个词本身很难让人联想到实体的形状,还有如拓扑(topology)这个词,也很难让人联想到图形关系的词义,geography与geometry同根,几何学源于地理学。在空间计算中,geography计算更加偏向于非惯性曲面计算,也就是黎曼几何,geometry更加偏向于惯性平面直角计算,也就是欧式几何。而由此衍生的距离计算却是眼花缭乱的:欧式距离、曼哈顿距离、切比雪夫距离、大圆距离等,不同距离的计算完全是为了适应不同的场景需要。在postgis中,geography 被描述地理椭球,或者说地理坐标,而 geometry被描述为平面投影,或者说笛卡尔坐标。
地理图形 vs 图形
现行的计算机图形学似乎不关心点是否在线段上,线与线是否相交,面与面是否包含、体与体是否相离等基本图形关系,它更多关注的是如何把一个茶壶的曲面更好地在显卡上渲染展示出来。在空间计算中,点、线、面、体的图形关系非常重要,甚至是基础的,这些看似简单的图形关系判断,有的在计算机中实现起来却又非常复杂(可以参看CGAL中的源码),如爆炸范围、汇水域、碰撞检测、可视距离等就是这些图形关系的具体应用。但是地理图形必须转化为图形对象数据,才能被计算机识别和存储。
在PostGIS中,用于矢量图形关系判断或者图形函数有:
ST_Centroid(geometry) 计算图形对象的几何中心
ST_Area(geometry) 计算图形对象的面积
ST_PointOnSurface(geometry) 点是否在曲面上
ST_Distance(geometry A, geometry B) 计算图形对象间的距离(平面距离)
ST_DWithin(geometry A, geometry B, float) 一个图形对象是否在另一个图形对象距离范围内。
ST_Within(geometry A, geometry B)一个图形对象是否在另一个图形对象内部
ST_Equals(geometry, A geometry B)图形对象是否相等。
ST_Disjoint(geometry A ,geometry B) 图形对象是否相离。
ST_Intersects(geometry A, geometry B)图形对象是否相交
ST_Touches(geometry A, geometry B)图形对象是否接触
ST_Crosses(geometry A, geometry B)图形对象是否交叉
ST_Overlaps(geometry A, geometry B) 图形对象重叠区域
ST_Contains(geometry A, geometry B)图形对象是否包含
ST_Covers(geometry A, geometry B) 图形对象是否覆盖
ST_Buffer(geometry, double, [integer]) 计算缓冲区
ST_AsMVT()矢量切片
栅格函数
ST_Resample()栅格重采样
ST_Transform()栅格重投影
ST_Histogram()栅格直方图统计
ST_Clip()裁剪栅格
ST_Intersection()栅格相交
ST_Hillshade()计算栅格阴影
ST_Slope()计算栅格坡度
ST_TRI()计算栅格起伏度
ST_Contains()栅格相交
ST_Disjoint()栅格相离
ST_DWithin()栅格是否在指定范围内
ST_Touches()栅格是否接触
ST_Overlaps()栅格是否有重叠区域
等等。
ANSI SQL/MM vs SFA SQL
ANSI SQL(Structured Query Language:结构化查询语言)从1986年2011年,经历了几十年的发展已经成为数据库的普遍标准,对于数据库而言,大多操作是增删改查四板斧,而对于空间数据库操作,SFA SQL(Simple Feature Access SQL:简单要素访问结构化查询语言)似乎也遵循了ANSI SQL的轨迹,不过很多看似标准的增删改查操作在空间数据库中并不能包治百病,SFA SQL比SQL/MM定义的更加广泛,因为上述的图形函数、栅格函数也包括在SFA SQL以内的,只是为了适应SQL/MM ,冠名了ST_。。。。当某些人不知道这些时,更加简单地方法是把采集点的坐标也当做属性值给存储了,然后再从数据库中导出来到桌面GIS软件中展点,头疼。
PostGIS vs GDAL、GEOS、CGAL、Proj4、boost
在windows中安装PostGIS似乎并不是一件困难的事情,stack builder搞不定的话,就直接上官网下载PostGIS,而在Linux中,GDAL、GEOS、CGAL、Proj4、boost一个个都是前置包,你得把它们下载下来,才能把PostGIS伺候好了。GDAL用于栅格数据处理,GEOS、CGAL用于图形关系处理,GEOS优先级高于CGAL;Proj4用于坐标投影转换,boost泛型或扩展算法,在空间计算中,泛型怎么爽怎么来,这几个是PostGIS调用的基础库。
shp2pgsql rasterpgsql vs QGIS UDIG
先写到这,后续慢慢更新。
启发式语录
空间数据库作用:空间数据库可以用于空间数据存储和分析。
A spatial database gives you both a storage tool and an analysis tool.
空间数据建模:完整的2D映射可以用三个基本几何图形来完成:点、线串和多边形。我们可以用这些基本构件来模拟自然地理实体,点、线、弦和多边形是现实的简化模型。因此,它们永远无法完美地模仿真实的东西。
The entirety of 2D mapping can be accomplished with three basic geometries: points,
linestrings, and polygons. We can model physical geographical entities with these
basic building blocks.Points, linestrings, and polygons are simplified models of reality. As such, they’ll never perfectly mimic the real thing.
空间查询和空间函数作用:空间查询是一种数据库查询,它使用图形函数来回答关于空间和空间中对象的问题。除了能够回答关于空间使用的问题外,空间函数还允许你在空间中创建和修改对象。空间分析的这一部分通常被称为几何或空间处理。
A spatial query is a database query that uses geometric functions to answer questions about space and objects in space.In addition to being able to answer questions about the use of space, spatial functions allow you to create and modify objects in space. This portion of spatial analysis is often referred to as geometric or spatial processing.
对象关系数据库作用:对象关系数据库可以在关系表列中存储比基本日期、数字和文本更复杂的对象类型,并允许用户定义新的自定义数据类型、新函数和操作符来操作这些新的自定义类型。
An object-relational database is one that can store more complex types of objects in
its relational table columns than the basic date, number, and text and that allows the
user to define new custom data types, new functions, and operators that manipulate
these new custom types.
PostgreSQL是Sybase和Microsoft SQL Server数据库的兄弟,因为创建Sybase的人来自加州大学伯克利分校,并与Michael Stonebraker一起在Ingres和/或PostgreSQL项目上工作。许多人认为Michael Stonebraker是Ingres和PostgreSQL之父,也是对象关系数据库管理系统的创始人之一。Sybase SQL Server的源代码后来被授权给微软来生产Microsoft SQL Server。
PostgreSQL is a cousin of the databases Sybase and Microsoft SQL Server because the people who started Sybase came from UC Berkeley and worked on the Ingres and/ or PostgreSQL projects with Michael Stonebraker. Michael Stonebraker is considered by many to be the father of Ingres and PostgreSQL and one of the founding fathers of object-relational database management systems.The source code of Sybase SQL Server was later licensed to Microsoft to produce Microsoft SQL Server.
PostgreSQL支持大多数ANSI SQL 92-2003+和部分ANSI SQL 2006。PostGIS支持OGC标准SQL/MM Spatial (ISO JTC1, WG4, 13249-3)。
PostgreSQL supports most of ANSI SQL 92-2003+ and some of ANSI SQL 2006. PostGIS supports OGC standards SQL/MM Spatial (ISO JTC1, WG4, 13249-3).
地理图形数据与几何图形数据之间的关系:地理数据类型的数据必须始终存储在WGS 84经纬度。然而,地理上所有的度量单位都用米表示。如果源数据位于平面坐标系统中,并且希望使用地理数据类型进行存储,则必须将其加载为几何图形、转换它,然后将其转换为地理图形。
Data in the geography data type must always be stored in WGS 84 Lon Lat degrees. However, all measurements in geography are expressed in meters. If your source data is in a planar coordinate system such as State Plane feet or meters, and you want to use the geography data type for storage, you must load it as geometry, transform it, and then cast it to geography.
geography 地形,地理 geometry 图形,几何
为Postgres创建postgis扩展
CREATE EXTENSION postgis; CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION postgis_tiger_geocoder; --this one is optional if you want to use the rules based standardizer (pagc_normalize_address) CREATE EXTENSION address_standardizer;
检查postgis是否安装成功。
SELECT postgis_full_version();
SELECT version();
更新postgis扩展
ALTER EXTENSION postgis UPDATE; ALTER EXTENSION postgis_tiger_geocoder UPDATE; ALTER EXTENSION fuzzystrmatch UPDATE; ALTER EXTENSION postgis_tiger_geocoder UPDATE; ALTER EXTENSION address_standardizer UPDATE;
SELECT ST_Point(1, 2) AS MyFirstPoint;
SELECT ST_SetSRID(ST_Point(-77.036548, 38.895108),4326);
SELECT ST_GeomFromText('POINT(-77.036548 38.895108)', 4326);
SELECT ST_AsEWKT('0101000020E6100000FD2E6CCD564253C0A93121E692724340');
SELECT ST_GeomFromText('LINESTRING(-14 21,0 0,35 26)') AS MyCheckMark;
SELECT ST_GeomFromText('LINESTRING(52 218, 139 82, 262 207, 245 261, 207 267,
153 207, 125 235, 90 270, 55 244, 51 219, 52 218)') AS HeartLine;
SELECT ST_GeomFromText('POLYGON((0 1,1 -1,-1 -1,0 1))') As MyTriangle;
SELECT ST_GeomFromText('POLYGON((52 218, 139 82, 262 207, 245 261,
207 267, 153 207, 125 235, 90 270,
55 244, 51 219, 52 218))') As HeartPolygon;
数据库模式:数据库模式是在大多数高端数据库中可以找到的容器。它在逻辑上分割对象(表、视图、函数等),以便于管理。
A schema is a container you ll find in most high-end databases. It logically segments objects (tables, views, functions, and so on) for easier management.
为数据库ch01创建一个数据库模式,并为创建两个表,一个表插入数据。
为数据模式ch01的fastfood表增加几何数据特性,设置4326 wgs84地理坐标到平面投影2163的转换,并为fastfood表创建空间索引。
为fastfoods增加主键
ALTER TABLE ch01.fastfoods ADD COLUMN ff_id SERIAL PRIMARY KEY;
为fastfoods增加外键,并关联lu_franchises表
ALTER TABLE ch01.fastfoods ADD CONSTRAINT fk_fastfoods_franchise FOREIGN KEY (franchise) REFERENCES ch01.lu_franchises (franchise_code) ON UPDATE CASCADE ON DELETE RESTRICT;
ALTER TABLE ch01.fastfoods ADD COLUMN ff_id SERIAL PRIMARY KEY;
使用shp2pgsql导入数据
图形化界面
命令行
shp2pgsql -s 4269 -g geom_4269 /data/roadtrl020.shp ch01.roads | psql -h localhost -U postgres -p 5432 -d postgis_in_action
创建控件索引
CREATE INDEX idx_roads_geom ON ch01.roads USING gist(geom);