新書推薦:
《
海外中国研究·未竟之业:近代中国的言行表率
》
售價:NT$
614.0
《
我们为何建造(城市与生态文明丛书)
》
售價:NT$
406.0
《
算法经济 : 商业逻辑与人类生活的智能演进(生动呈现AI与算法的创新应用与商业价值)
》
售價:NT$
359.0
《
家书中的百年史
》
售價:NT$
359.0
《
偏爱月亮
》
售價:NT$
207.0
《
生物安全与环境
》
售價:NT$
255.0
《
泥土:文明的侵蚀(城市与生态文明丛书)
》
售價:NT$
380.0
《
医用化学(第三版)
》
售價:NT$
259.0
編輯推薦:
《PostGIS实战(第3版)》是一本很好的、介绍PostGIS的书, 作者Regina是PostGIS核心开发团队和项目指导委员会的成员,拥有丰富的实践经验。本书的主要特点是示例丰富,让读者在例子中不断尝试并探索,从而掌握相关的知识。此外,本书内容较为全面,读者可以根据自己的需要选择特定章节进行学习。
本书由三部分组成:
第I部分介绍空间关系数据库的基本概念,特别是PostGIS 与PostgreSQL。通过这部分的学习,你可以了解几何、地理、栅格和拓扑等类型的基本概念,掌握每种类型可以解决的问题,并对空间参考系统和数据库存储选项有-一个基本的理解。最重要的是,学完本部分的内容后,你将掌握如何加载、查询和查看启用PostGIS的PostgreSQI数据库中的空间数据。
第II部分的重点是使用PostGIS解决实际的空间问题,例如使用几何和地理类型进行邻近度分析,使用矢量运算优化数据,使用栅格处理和地图代数计算统计信息,以及使用拓扑保证编辑的一致性,等等。
第III部分介绍一些常见的用于补充和增强PostGIS的开源服务器端工具,如过程化语言PLR、PL/Python和PL/
內容簡介:
PostGIS是PostgreSQL的空间数据库扩展。它可以为要处理的几乎任何地理数据任务提供特性和支持。通过使用PostGIS,用户只需要编写几行SQL代码就能够创建位置感知查询,并轻松构建制图、栅格分析或路由应用程序的后端。 《PostGIS实战(第3版)》展示了如何解决现实世界的地理数据问题。你将**基本的制图,探索应用程序的自定义函数。这个**版本引入了新的PostGIS特性,如PostGIS窗口函数、并行查询,以及使用JSON和矢量切片函数为应用程序输出数据。 ●针对PostGIS 3.1和PostgreSQL 13进行了修订 ●优化查询以获得**速度 ●简化几何图形以提高效率 ●将PostGIS扩展到网络和桌面应用程序
關於作者:
Regina Obe和Leo Hsu是数据库顾问和作者。Regina是PostGIS核心开发团队和项目指导委员会的成员。
目錄 :
第Ⅰ部分 PostGIS简介
第1章 什么是空间数据库 3
1.1 空间思维 3
1.2 初步了解PostGIS 5
1.2.1 为什么选择PostGIS 6
1.2.2 适用标准 6
1.2.3 强大的PostGIS 7
1.2.4 建立在PostgreSQL之上 8
1.2.5 金钱上免费 8
1.2.6 使用上自由 8
1.2.7 PostGIS的替代选择 9
1.3 安装PostGIS 11
1.4 空间数据类型 13
1.4.1 几何类型 14
1.4.2 地理类型 14
1.4.3 栅格类型 15
1.4.4 拓扑类型 15
1.5 你好,真实世界 16
1.5.1 理解问题 16
1.5.2 建模 17
1.5.3 加载数据 19
1.5.4 编写查询代码 21
1.5.5 使用OpenJUMP查看空间数据 21
1.6 本章小结 23
第2章 空间数据类型 25
2.1 类型修饰符 26
2.1.1 子类型修饰符 26
2.1.2 空间参考标识符 27
2.2 几何 27
2.2.1 点 28
2.2.2 线串 29
2.2.3 多边形 30
2.2.4 几何图形集合 33
2.2.5 M坐标 37
2.2.6 Z坐标 38
2.2.7 多面体表面和TIN 40
2.2.8 生成TIN 41
2.2.9 曲线几何图形 42
2.2.10 几何图形的空间目录 46
2.3 地理 49
2.3.1 geography和geometry的区别 49
2.3.2 geography空间目录 51
2.4 栅格 51
2.4.1 栅格的属性 51
2.4.2 创建栅格 53
2.4.3 栅格空间目录 54
2.5 本章小结 55
第3章 空间参考系统 57
3.1 空间参考系统是什么 57
3.1.1 大地水准面 58
3.1.2 椭球体 59
3.1.3 基准 61
3.1.4 坐标参考系统 61
3.1.5 空间参考系统要素 62
3.1.6 投影 62
3.2 选择存储数据的空间参考系统 64
3.2.1 使用EPSG:4326的利弊 65
3.2.2 EPSG:4326地理数据类型 66
3.2.3 仅用于演示的地图 66
3.2.4 在涉及距离时覆盖全球 69
3.3 确定源数据的空间参考系统 72
3.3.1 推测空间参考系统 72
3.3.2 当spatial_ref_sys表中缺少SRS时 76
3.4 PostGIS中PROJ支持的历史 76
3.4.1 PROJ 4 77
3.4.2 PROJ 5 77
3.4.3 PROJ 6 77
3.4.4 PROJ 7 78
3.4.5 PROJ 8和更高版本 78
3.5 本章小结 78
第4章 处理真实数据 81
4.1 PostgreSQL内置工具 82
4.1.1 psql 82
4.1.2 pgAdmin 4 83
4.1.3 pg_dump和pg_restore 84
4.2 下载文件 84
4.3 提取文件 85
4.4 导入和导出形状文件 86
4.4.1 使用shp2pgsql导入 86
4.4.2 使用shp2pgsql-gui导入和导出 88
4.4.3 使用pgsql2shp导出 90
4.5 使用ogr2ogr导入和导出矢量数据 91
4.5.1 ogr2ogr的环境变量 92
4.5.2 ogrinfo 92
4.5.3 使用ogr2ogr导入 92
4.5.4 使用ogr2ogr导出 96
4.6 使用PostgreSQL外部数据封装器查询外部数据 99
4.6.1 file_fdw外部数据封装器 100
4.6.2 ogr_fdw外部数据封装器 102
4.6.3 将hstore标记转换为jsonb 106
4.7 使用raster2pgsql导入栅格数据 107
4.7.1 raster2pgsql命令行开关 107
4.7.2 raster2pgsql支持的格式 108
4.7.3 使用raster2pgsql加载单个文件 109
4.7.4 在shell脚本中加载多个文件并进行切片 109
4.7.5 使用PostgreSQL函数输出栅格数据 110
4.8 使用GDAL导出栅格数据 111
4.8.1 使用gdalinfo检查栅格 112
4.8.2 gdal_translate和gdalwarp 113
4.9 本章小结 115
第5章 在桌面上使用PostGIS 117
5.1 桌面查看工具一瞥 117
5.1.1 OpenJUMP简介 118
5.1.2 QGIS简介 118
5.1.3 gvSIG简介 119
5.1.4 Jupyter记事本和JupyterLab简介 119
5.1.5 空间数据库支持 120
5.1.6 格式支持 121
5.1.7 支持的Web服务 122
5.2 OpenJUMP 123
5.2.1 OpenJUMP特性总结 123
5.2.2 安装OpenJUMP 123
5.2.3 易用性 124
5.2.4 OpenJUMP插件 124
5.2.5 OpenJUMP脚本 124
5.2.6 OpenJUMP格式支持 124
5.2.7 PostGIS支持 124
5.2.8 注册数据源 125
5.2.9 渲染PostGIS几何图形 126
5.2.10 导出数据 128
5.3 QGIS 128
5.3.1 安装QGIS 129
5.3.2 将QGIS与PostGIS结合起来使用 129
5.4 gvSIG 134
5.4.1 gvSIG与PostGIS搭配使用 135
5.4.2 导出数据 137
5.5 JupyterLab和Jupyter记事本 137
5.5.1 安装Jupyter 138
5.5.2 启动Jupyter记事本 139
5.5.3 启动JupyterLab 139
5.5.4 创建Python记事本文件 140
5.5.5 魔术命令 140
5.5.6 使用Jupyter记事本执行原始查询 141
5.5.7 使用GeoPandas、Shapely和Matplotlib处理空间数据 142
5.5.8 使用folium查看地图上的数据 145
5.6 本章小结 147
第6章 几何和地理函数 149
6.1 输出函数 150
6.1.1 WKT和WKB 150
6.1.2 Keyhole标记语言 150
6.1.3 地理标记语言 151
6.1.4 几何JavaScript对象表示法 151
6.1.5 可缩放矢量图形 151
6.1.6 Mapbox矢量切片和协议缓冲区 152
6.1.7 Tiny WKB 153
6.1.8 可扩展3D图形 153
6.1.9 输出函数示例 153
6.1.10 Geohash 154
6.2 构造函数 155
6.2.1 使用文本和二进制格式创建几何图形 155
6.2.2 使用文本和二进制格式创建地理图形 158
6.2.3 将文本或二进制表示用作函数参数 159
6.3 访问器和设置器函数 159
6.3.1 空间参考标识符 160
6.3.2 将几何图形转换为不同的空间参考 160
6.3.3 使用地理类型的转换 161
6.3.4 几何类型函数 162
6.3.5 几何维度和坐标维度 163
6.3.6 检索坐标 164
6.3.7 检查几何有效性 164
6.3.8 定义几何图形的点数 164
6.4 测量函数 166
6.4.1 几何平面测量 166
6.4.2 大地测量 167
6.5 分解函数 168
6.5.1 几何图形的边界框 168
6.5.2 生成边界和将多边形转换为线串 170
6.5.3 形心、中间点和表面上的点 171
6.5.4 返回定义几何图形的点 173
6.5.5 分解多个几何图形和几何图形集合 173
6.6 合成函数 175
6.6.1 合成点 175
6.6.2 合成多边形 176
6.6.3 将单个几何图形提升为几何图形集合 177
6.7 简化函数 178
6.7.1 栅格捕捉和坐标舍入 178
6.7.2 简化函数 178
6.8 本章小结 180
第7章 栅格函数 181
7.1 栅格术语 182
7.2 栅格构造函数 183
7.2.1 使用ST_AsRaster将几何图形转换为栅格 184
7.2.2 使用raster2pgsql加载栅格 186
7.2.3 从头开始构建栅格:
ST_MakeEmptyRaster和
ST_AddBand 187
7.2.4 设置像素:ST_SetValue和ST_SetValues 187
7.2.5 利用其他栅格创建栅格 189
7.2.6 使用ST_FromGDALRaster转换其他栅格格式 191
7.3 栅格输出函数 191
7.3.1 ST_AsPNG、ST_AsJPEG和ST_AsTiff 191
7.3.2 使用ST_AsGDALRaster进行输出 192
7.3.3 使用psql导出栅格 194
7.4 栅格访问器和设置器 196
7.4.1 基本栅格元数据属性 196
7.4.2 像素统计 197
7.4.3 像素值访问器 198
7.4.4 波段元数据设置器 200
7.5 地理配准函数 200
7.5.1 元数据设置器 201
7.5.2 处理函数 202
7.6 重分类函数 204
7.7 多边形化函数 205
7.7.1 ST_ConvexHull 205
7.7.2 ST_Envelope 205
7.7.3 ST_Polygon 205
7.7.4 ST_MinConvexHull 206
7.8 本章小结 206
第8章 空间关系 207
8.1 边界框和几何比较器 208
8.1.1 边界框 208
8.1.2 边界框比较器 209
8.2 两个几何图形的关系 210
8.2.1 几何图形的内部、外部和边界 210
8.2.2 相交 211
8.2.3 房屋平面图模型 215
8.2.4 包含和内部 216
8.2.5 覆盖和被覆盖 218
8.2.6 完全包含 218
8.2.7 几何图形重叠 219
8.2.8 接触几何图形 220
8.2.9 相等的不同方面:几何 222
8.2.10 关系函数的基础 224
8.3 本章小结 227
第Ⅱ部分 将PostGIS投入工作
第9章 邻近度分析 231
9.1 最近邻搜索 232
9.1.1 哪些位置在X距离之内 232
9.1.2 对N个最接近的结果使用ST_DWithin和ST_Distance函数 232
9.1.3 使用ST_DWithin函数和DISTINCT ON查找最近的位置 232
9.1.4 与公差相交 233
9.1.5 距离之间的条目 234
9.1.6 使用KNN距离运算符查找N个最近的位置 234
9.2 将KNN用于地理类型 237
9.3 地理标记 239
9.3.1 特定区域的标记数据 240
9.3.2 线性参照:线串的最近捕捉点 240
9.3.3 PostGIS聚类窗口函数 242
9.4 本章小结 244
第10章 PostGIS TIGER 地理编码 245
10.1 安装PostGIS TIGER地理编码器 246
10.2 加载TIGER数据 246
10.2.1 配置表 247
10.2.2 加载国家/地区和州数据 248
10.3 标准化地址 250
10.3.1 使用normalize_address 250
10.3.2 使用PAGC地址标准化程序 252
10.4 地理编码 254
10.4.1 使用地址文本进行地理编码 254
10.4.2 使用标准化地址进行地理编码 256
10.4.3 地理编码交集 256
10.4.4 批处理地理编码 257
10.5 反向地理编码 259
10.6 本章小结 260
第11章 几何与地理处理 261
11.1 利用空间聚合函数 261
11.1.1 利用多个多边形集合记录创建一个多边形集合 261
11.1.2 将点连为线串 265
11.2 裁剪、拆分和嵌格 267
11.2.1 裁剪 267
11.2.2 拆分 268
11.2.3 嵌格 269
11.3 将线串分段 277
11.3.1 拆分线串 277
11.3.2 用多点线串创建两点线串 278
11.3.3 在点连接处切断线串 279
11.4 平移、缩放、旋转几何图形 282
11.4.1 平移 282
11.4.2 缩放 283
11.4.3 旋转 284
11.5 利用几何函数操作和创建地理数据 285
11.5.1 cast-safe函数 286
11.5.2 transformation-recommended函数 286
11.6 本章小结 287
第12章 栅格处理 289
12.1 加载和准备栅格数据 289
12.2 利用空间聚合函数形成更大的栅格 291
12.2.1 重组切片文件 291
12.2.2 利用裁剪和合并分割出感兴趣的区域 292
12.2.3 使用ST_Union的特定表达式类型 292
12.3 与波段有关的处理 293
12.3.1 利用ST_AddBand将单波段栅格合并成多波段栅格 293
12.3.2 利用ST_Band处理波段的子集 294
12.4 生成栅格切片 294
12.5 栅格和几何图形的交集 296
12.5.1 像素统计 298
12.5.2 利用ST_Value函数和ST_SetZ
函数向二维线串添加Z坐标 298
12.5.3 将二维多边形转化为三维多面体 300
12.6 栅格统计 301
12.6.1 提取像素值 302
12.6.2 栅格统计函数 304
12.7 地图代数 306
12.7.1 在表达式和回调函数之间做选择 306
12.7.2 使用一个单波段地图代数表达式 307
12.7.3 使用一个单波段地图代数函数 308
12.7.4 邻域地图代数 309
12.8 本章小结 311
第13章 构建和使用拓扑 313
13.1 什么是拓扑 314
13.2 使用拓扑 314
13.2.1 安装拓扑扩展 315
13.2.2 创建拓扑 315
13.2.3 拓扑几何图形类型 320
13.2.4 对拓扑用法的简要回顾 323
13.3 维多利亚市的拓扑 323
13.3.1 创建维多利亚的拓扑 323
13.3.2 向拓扑中添加原语 324
13.3.3 创建拓扑几何图形 326
13.4 通过编辑拓扑原语来修复拓扑几何问题 330
13.4.1 通过删除边来移除面 332
13.4.2 检查共享面 333
13.4.3 编辑拓扑几何 334
13.5 插入和编辑大型数据集 334
13.6 拓扑的简化 337
13.7 拓扑验证和汇总函数 338
13.8 本章小结 339
第14章 组织空间数据 341
14.1 空间存储方法 341
14.1.1 异构列 342
14.1.2 同构列 343
14.1.3 typmod与约束对比 344
14.1.4 表继承 345
14.1.5 表分区 348
14.2 建模真实的城市 352
14.2.1 使用异构几何列建模 353
14.2.2 使用同构几何列建模 356
14.2.3 使用分区建模 358
14.3 创建可自动更新的视图 363
14.4 使用触发器和规则 364
14.4.1 触发器 364
14.4.2 使用INSTEAD OF触发器 365
14.4.3 使用其他触发器 366
14.5 本章小结 368
第15章 查询性能调优 369
15.1 查询规划器 369
15.1.1 不同类型的空间查询 370
15.1.2 公用表表达式及其对规划的影响 372
15.2 规划器策略 373
15.3 使用解释来诊断问题 374
15.3.1 文本解释与pgAdmin图形化解释 375
15.3.2 无索引的规划 376
15.4 规划器与索引 380
15.4.1 具有空间索引的规划 381
15.4.2 索引 383
15.5 常见SQL模式及其对规划的影响 386
15.5.1 SELECT中的子查询 386
15.5.2 FROM子查询与基本公用表表达式 393
15.5.3 窗口函数与自连接 394
15.5.4 横向连接 396
15.6 系统和函数设置 398
15.6.1 影响规划策略的关键系统变量 399
15.6.2 函数专用设置 401
15.6.3 鼓励并行规划 403
15.7 优化空间数据 403
15.7.1 修复无效的几何图形 404
15.7.2 通过简化来减少顶点数量 404
15.7.3 通过拆分几何图形来减少顶点数量 404
15.7.4 集群 404
15.8 本章小结 407
第Ⅲ部分 搭配其他工具使用PostGIS
第16章 使用pgRouting和过程化语言扩展PostGIS 411
16.1 使用pgRouting解决网络路由问题 412
16.2 使用PL扩展PostgreSQL 418
16.2.1 PL的基本安装 418
16.2.2 你能用PL做什么 418
16.3 PL/R 420
16.3.1 PL/R入门 420
16.3.2 你能用PL/R做什么 421
16.3.3 在PL/R中使用R包 424
16.3.4 将几何图形转换为R空间对象并绘制空间对象 426
16.3.5 将绘图输出为二进制文件 427
16.4 PL/Python 428
16.4.1 安装PL/Python 428
16.4.2 编写一个PL/Python函数 429
16.4.3 使用Python包 430
16.4.4 地理编码示例 432
16.5 PL/V8:数据库中的JavaScript 433
16.5.1 安装PL/V8 433
16.5.2 在数据库中启用PL/V8 434
16.5.3 在PL/V8中使用其他JavaScript库和函数 434
16.5.4 使用PL/V8编写地图代数函数 437
16.6 本章小结 440
第17章 在Web应用程序中使用PostGIS 441
17.1 传统Web技术的局限性 442
17.2 地图服务器 442
17.2.1 轻量级地图服务器 443
17.2.2 完整地图服务器 445
17.3 地图客户端 448
17.4 使用MapServer 450
17.4.1 安装MapServer 450
17.4.2 安全性考虑 452
17.4.3 创建WMS和WFS服务 452
17.4.4 使用反向代理调用地图服务 455
17.5 使用GeoServer 456
17.5.1 安装GeoServer 456
17.5.2 设置PostGIS工作空间 456
17.5.3 通过GeoServer WMS/WFS访问PostGIS图层 458
17.6 OpenLayers和Leaflet基础 459
17.6.1 OpenLayers入门 460
17.6.2 Leaflet入门 463
17.6.3 OpenLayers和Leaflet API总结 465
17.7 通过PostGIS查询和Web脚本显示数据 465
17.7.1 使用PostGIS和PostgreSQL几何输出函数 465
17.7.2 使用PostGIS的MVT输出函数 470
17.8 本章小结 473
以下内容通过扫描封底二维码获取
附录A 其他资源 475
附录B 安装、编译和升级 479
附录C SQL入门 489
內容試閱 :
随着互联网经济的兴起,人们习惯于在生活的各个方面使用各类地图软件:驾车外出时要提前查询行程,跑步健身时要记录运动轨迹,等等。尤其是外卖员和顺风车主,他们需要使用地图软件规划线路以提高效率。对于开发者来说,如何选择和使用工具来高效地实现不同人群的需求,以及如何才能准确而快速地对海量数据进行分析,是值得关注的问题。
PostGIS是一个很好的选择,它是PostgreSQL开源关系数据库管理系统的空间数据库扩展,是目前最强大的开源空间数据库引擎。首先,PostGIS是开源的,任何人都可以在网上免费下载安装包,构建自己的开发环境,并针对自己遇到的问题搜索解决方案。其次,PostGIS本身是一个数据库扩展,在数据分析和处理速度方面有着先天的优势。再次,PostGIS功能足够强大,它甚至不再依赖GIS软件,只使用这个空间数据库就足够了。
《PostGIS实战(第3版)》是一本很好的、介绍PostGIS的书,作者Regina是PostGIS核心开发团队和项目指导委员会的成员,拥有丰富的实践经验。本书的主要特点是示例丰富,让读者在例子中不断尝试并探索,从而掌握相关的知识。此外,本书内容较为全面,读者可以根据自己的需要选择特定章节进行学习。
本书由三部分组成:
第Ⅰ部分介绍空间关系数据库的基本概念,特别是PostGIS与PostgreSQL。通过这部分的学习,你可以了解几何、地理、栅格和拓扑等类型的基本概念,掌握每种类型可以解决的问题,并对空间参考系统和数据库存储选项有一个基本的理解。最重要的是,学完本部分的内容后,你将掌握如何加载、查询和查看启用PostGIS的PostgreSQL数据库中的空间数据。
第Ⅱ部分的重点是使用PostGIS解决实际的空间问题,例如使用几何和地理类型进行邻近度分析,使用矢量运算优化数据,使用栅格处理和地图代数计算统计信息,以及使用拓扑保证编辑的一致性,等等。
第Ⅲ部分介绍一些常见的用于补充和增强PostGIS的开源服务器端工具,如过程化语言PL/R、PL/Python和PL/V8,以及创建网络路由应用程序的工具pgRouting,还介绍PostGIS在Web应用程序中的应用。
各类读者阅读本书时均可从中受益。对于GIS从业者和程序员,本书可以提供更快捷的方法以解决地图数据分析的实际问题;对于数据库从业者,通过学习本书,可以拓宽视野,并增加其能够处理的数据类型;对于科研人员和教育工作者,本书可以为他们搭建一个数据库管理、关系数据库使用或GIS方面的框架,方便他们使用空间分析工具来分析数据,进行建模或者培训学生。
本书中存在很多专业术语,作者也使用了很多“俚语”,译者在翻译过程中查阅了大量的资料,力求忠于原文、表达简练。清华大学出版社的专业编辑们对译稿进行了全面、细致的校对,提出了许多宝贵意见,在此表示感谢。虽然译者在翻译过程中对原著内容进行了反复思考,力图传达作者确切的意图,但由于译者水平有限,疏漏之处在所难免,望各位读者、专家和业内人士不吝提出宝贵意见。
译者
序
我们年幼时可能都曾被告知:人如其食。这提醒我们,饮食对我们的健康和生活质量而言是不可或缺的。现代世界,我们使用口袋中感知位置的智能手机、汽车上的GPS和计算机地理编码的互联网地址,“我们是谁,我们就在哪里”已经成为事实——每个人都是一个移动传感器,在地球上移动时会生成不断流动的位置编码数据。
为了管理和驾驭数据流,以及通过经济卫星成像和众包地图开放的并行数据流,我们需要一个能够完成这项任务的工具——一个能够持久存储数据、有效访问数据和有力分析数据的工具。我们需要一个空间数据库,如PostGIS。
在空间数据库出现之前,位置和制图数据的计算机分析是通过在桌面工作站运行的地理信息系统(geographic information system,GIS)进行的。2001年,PostGIS第一次发布时,它的项目名称只是一个简单的文字游戏,自然地,PostgreSQL数据库的空间扩展就被命名为PostGIS。
但随着项目的成熟,这个名字也有了进一步的意义。每年都会添加新的数据分析函数,而且用户会越来越深入地使用这些函数,完成以前需要专门的GIS工作站才能完成的工作。PostGIS实际上是在创造一个后GIS的世界,在这里,我们不再需要GIS软件来做GIS工作,只用一个空间数据库就足够了。
2002年3月,在PostGIS首次发布还不到一年的时候,我就用邮件询问了人们是如何使用PostGIS的。
在Regina Obe的第一封邮件中,她是这样回答的:
我们在波士顿市使用它进行邻近度分析。我们部门的一部分职责是将止赎房产分配给开发商等,以建造房屋、企业等。我们使用PostGIS根据邻近度列出房产,这样,如果开发商想在一块土地上开发,假设土地面积为X,他们就能更好地了解这个项目是否可行。
甚至在项目早期,Regina Obe就已经在测试PostGIS的功能并创建智能分析了。
自2011年《PostGIS实战》首次发行以来,PostGIS本身就一直非常活跃,添加了栅格分析、3D、聚类、时间数据、拓扑等新特性。世界也在不断发展。
大约20年前,当PostGIS还是一个全新的事物时,认为几乎每个人口袋里都会有一个GPS设备(手机)的想法是相当疯狂的,而现在这已经是司空见惯的事了。PostGIS的地理位置管理特性现在正被开发人员广泛使用,这些人几年前还从未听说过空间数据。
在过去的几年里,卫星和航空图像已经进入大众市场,无人机系统已经很普遍,位置传感器几乎被安装在任何移动的资产上。需要分析的数据量以及数据的速度和容量比以往任何时候都要大。
与此同时,PostGIS从未像现在这样易于为你提供服务。可以在任何云提供商上启动一个副本,下载任何平台的构件,如果有足够的兴趣,甚至可以下载开源代码并自行构建,就像多年前Regina所做的那样。
请尽情享受本书和它提供的见解吧,它将教你如何将位置数据应用到工作中。Regina和Leo已经将大量信息提炼成了一本独一无二的简明指南。
Paul Ramsey
PostGIS项目指导委员会主席
前 言
PostGIS是PostgreSQL开源关系数据库管理系统的空间数据库扩展。它是目前最强大的开源空间数据库引擎。它为PostgreSQL添加了几种空间数据类型和四百多个用于处理这些空间类型的函数。PostGIS支持许多符合OGC/ISO SQL/MM标准的、在其他关系数据库(如Oracle、SQL Server、MySQL和IBM DB2)中也能找到的空间函数,还支持许多额外的、PostGIS独有的空间特性。
自本书的上一版以来,其他数据库都增加了空间功能,这通常是PostGIS提供的功能的一个子集。在谷歌BigQuery和Snowflake中可以看到同名函数。许多云提供商现在也在数据库即服务(Database as a Service,DBaaS)中提供PostgreSQL/PostGIS。
来自其他符合ANSI/ISO标准的空间数据库或其他关系数据库的读者,使用PostgreSQL和PostGIS时会感到非常舒适。PostgreSQL是最符合ANSI/ISO SQL标准的数据库管理系统之一。
本书旨在为PostGIS的官方文档提供一本配套的书籍,充当浏览PostGIS提供的数百个函数的一种指南。我们想写一本书,将我们遇到的许多常见的空间问题以及用PostGIS解决这些问题的各种策略记录下来。
除了主要目的外,我们希望为空间思维奠定基础。希望读者能够将本书提供的众多示例和诀窍应用到自己的领域中,甚至孕育出创造性的成果。
致 谢
首先,我们要感谢PostGIS软件包的许多维护者,特别是Sebastiaan Couwenberg、Devrim Gündüz、Greg Troxel和Christoph Berg,他们为PostGIS版本的改进提供了很多指导,没有他们,就没有PostGIS。
我们还要感谢PostGIS开发团队和项目指导委员会,特别是Paul Ramsey、Sandro Santilli、Raúl Marín Rodríguez、Darafei Praliaskouski、Bborie Park、Dan Baston、Martin Davis和Nicklas Avén,他们为本书中讨论的新特性做出了贡献。
我们要感谢Manning出版社的每个人。特别是如下几位:我们的策划编辑Susan Ethridge,她帮助我们润色章节并提供了许多必要的建议;我们的文稿编辑Andy Carroll,他发现了许多无意义的句子、无效的代码引用和无效的链接,并对许多表述进行了核实;还有我们的技术评审员,他们测试了代码并在早期发现了代码中的错误。我们还要对以下人员表示感谢:出版商Marjan Bace,组织了评审反馈的评审编辑Aleksandar Dragosavljevi?,我们的制作和编辑团队成员Mary Piergies、Becky Whitney和Deirdre Hiam,校对人员Melody Dolab,以及其他让我们在整个过程中保持专注的人。
特别要感谢PostGIS过去的贡献者,他们的贡献构成了PostGIS的基础:Olivier Courtin(印象中)、Mateusz Loskot、Pierre Racine和无数其他人。我们感谢PostGIS新闻组社区的订阅者,他们尽可能快、尽可能好地回答问题,而PostGIS的每位博主都以自己的方式给新加入PostGIS的成员一种温暖和愉快的感觉。
如果没有波士顿市的社区发展部(DND),特别是管理信息系统(MIS)和政策开发与研究部门(在这里,Regina第一次接触到GIS和PostGIS),我们就不可能接触到PostGIS。
我们还要感谢评审人员:Alvin Scudder、Arnaldo Ayala、Billy O’Callaghan、Biswanath Chowdhury、Carla Butler、Chris Viner、Daniel Tomás Lares、Daniele Andreis、DeUndre’ Rushon、Dhivya Sivasubramanian、Evyatar Kafkafi、Hilde Van Gysel、Ikechukwu、Okonkwo、Jesus Manuel Lopez Becerra、Luis Moux-Dominguez、Marcus Brown、Mike Haller、Mike Jensen、Paulo Vieira、Philip Patterson、Richard Meinsen、Vladimir Kuptsov和Weyert de Boer。你们的建议让本书的质量更上一层楼。
最后,我们感谢MEAP读者,他们提供了宝贵的建设性意见,并在早期发现了代码和解释中的错误。
关 于 本 书
本书主要关注PostGIS 3和PostGIS 3.1系列,以及PostgreSQL 11~13。本书不能替代PostGIS或PostgreSQL官方文档。官方的PostGIS文档很好地介绍了PostGIS中可用的大量函数,并提供了关于如何使用这些函数的示例。但它不会讲解如何将所有这些函数组合在一起以解决问题。这就是本书的目的。虽然本书没有涵盖PostGIS中所有可用的函数,但确实讲解了更常用的有趣函数,并教你如何将它们巧妙地结合起来以解决空间分析和建模中的经典、深奥但有趣的问题。
本书侧重于二维和三维非曲面笛卡儿矢量几何、二维大地测量矢量几何、栅格数据和网络拓扑。
虽然本书的主要目的是讲解PostGIS的用法,但如果我们不了解它的工作环境,就无法完成我们的使命。PostGIS不是孤立的,它很少单独运行。为了完成整个过程,本书还包含以下内容:
l 一个内容广泛的附录详细介绍了PostgreSQL的设置、备份和安全管理。附录还介绍了SQL的基础知识,以及使用它创建函数和其他对象的方法。
l 有几章专门介绍了PostGIS在网络地图中的运用、如何使用桌面工具进行查看、通常与PostGIS一起使用的PostgreSQL PL语言,以及额外的开源插件,如PostGIS封装的TIGER geocoder和单独封装的pgRouting。
本书不会对PostGIS库的数学基础进行严格的处理。我们依赖于对点、线和多边形等概念的直观理解。同样,本书不会深入研究数据库理论。当我们预测一个特定的索引应该比另一个更有效时,我们是凭经验做出有根据的猜测,而不是通过掌握关系代数并分析计算机芯片得出结论。
谁应该阅读本书
本书介绍了PostGIS,并假定读者对编程和数据处理有基本的了解。我们发现对PostGIS感兴趣的读者和最适合阅读本书的读者有以下几类。
GIS从业者和程序员
这些人对数据、大地水准面和投影了如指掌;知道在哪里找到数据来源;可以使用ArcGIS、MapInfo、Leaflet、OpenLayers、谷歌Maps或其他支持Ajax的工具包创建令人惊叹的应用程序;擅长在Esri形状文件中生成数据源,使用QGIS或ArcGIS创建制图杰作;甚至可以向启用了空间特性的数据库中添加数据或从数据库中提取数据,但当被问及有关数据的问题时,他们却答不上来。你也许能够在地图上找到美国所有的沃尔玛,但如果不逐个统计图钉,你未必能回答“密西西比河以东有多少家沃尔玛”,这完全是另外一回事。当然,可以使用桌面工具编写过程代码来回答这些问题,但我们希望展示一种更快的方法。
那么,启用空间特性的数据库提供了哪些新功能呢?
l 它使你能轻松地将空间数据与其他企业数据(如财务信息、观测数据和营销信息)混合在一起。可以使用Esri形状文件、KML文件和其他GIS文件格式执行这些操作,但需要额外的步骤,并且会限制与其他相关数据的连接。PostgreSQL数据库具有一些特性,比如可以提高连接速度的查询计划器,以及许多常用的统计函数,可以使相当复杂的问题和汇总统计变得相对易于运行和编写。
l 无论用户是在屏幕上绘制几何图形并输入相关信息,还是在地图上单击某个点,都有大量围绕数据库构建的基础结构,因此,当收集用户数据时,如果使用数据库,任务就会容易得多。例如,使用.NET、PHP、Perl、Python、Java或其他语言开发自己的Web应用程序。每种语言都有PostgreSQL驱动程序,使你能方便地插入和查询数据。此外,还有大量的选项可供选择,如文本到几何图形的函数,几何到SVG、到KML和到GeoJSON的函数,PostGIS提供的其他处理函数,以及OpenLayers、MapServer和GeoServer等平台提供的几何生成和操作函数。
l 关系数据库提供了管理支持,可以方便地控制谁有权访问什么,不管被访问的是文本属性还是几何图形。
l PostgreSQL提供了触发器,当某些数据库事件发生时,触发器可以生成其他东西,比如其他表中的相关几何图形。
l PostgreSQL有一个多版本并发控制(multi-version concurrency control,MVCC)事务核心来确保当100个用户同时读取或更新数据时,系统不会突然崩溃。
l PostgreSQL允许在数据库中编写自定义函数,这些函数可以从不同的应用程序中调用。在编写存储函数时,可从PostgreSQL提供的多种语言中进行选择。
l 如果专注于喜欢的GIS桌面工具,也不要担心。选择像PostGIS这样的空间DBMS,并不意味着需要放弃所选的工具。Manifold、Cadcorp、MapInfo 10 、AutoCAD、Esri ArcGIS、ArcMap、服务器工具和各种常用的桌面工具都内置了对PostGIS的支持。Safe FME是GIS专业人员最喜欢的一种提取-转换-负载(extract-transform-load,ETL)工具,长期以来它一直支持PostGIS。
DB从业者
在你从事数据库工作的某个时刻,有人可能会提出一个关于面向空间的数据问题。如果没有支持空间的数据库,思维会被限制在坐标、位置名称或其他可以简化为数字和字母的地理属性中。这些对于点数据很有效,但是一旦开始处理面积和区域,就可能完全迷失方向。你也许能在一个郡里找到所有叫史密斯的人,但是如果要找到住在10英里以内的所有叫史密斯的人,就会面临困难。
我们希望具有标准关系数据库背景的读者能够认识到,数据不仅仅是数字、日期和字符,SQL的惊人功能可以在非文本数据上实现。当然,你可能在关系数据库中存储了图像、文档和其他奇怪的东西,但我们怀疑你可以通过对这些字段编写SQL连接的方式完成更多工作。
科学家、研究人员、教育工作者和工程师
许多技能高超的科学家、研究人员、教育工作者和工程师使用空间分析工具来分析他们收集的数据,为他们的发明建模或者培训学生。虽然我们认为自己和他们不一样,但我们最钦佩这些人,因为他们创造知识,从根本上改善我们的生活。他们可能知道许多关于数学、生物、化学、地理、物理、工程等方面的知识,但他们没有接受过数据库管理、关系数据库的运用或GIS方面的培训。我们希望提供一个足够完整的框架,让这些人不用太费力就能跟上进度。
PostgreSQL/PostGIS能提供什么?
l 它提供了集成统计包(如R)的能力,甚至允许在PL/R中编写数据库程序函数,充分利用R的强大功能。
l PostgreSQL还支持PL/Python和PL/JavaScript,相比于普通的Python环境,在数据库中,它允许利用不断增长的Python和JavaScript库进行科学研究,可以更紧密地处理数据。
l 虽然许多人认为PostGIS,顾名思义,是地理信息系统的工具,但我们将其视为空间分析的工具。区别在于,地理学关注的是地球和与地球相关的参考系统,而空间分析关注的是空间和空间的利用。该空间和坐标参考系统可能特定于蚁丘,或尚未确定位置的核电站地图,或大脑的不同区域,或者它可能被用作一个可视化工具来建模固有的非视觉性,如过程建模。虽然你的兴趣领域可能没有被空间分析所触及,但我们鼓励你进行更深入的探索。
l 数据库是大量数据的天然存储库,有很多内置的统计/归纳函数和结构,以便生成有用的报告和分析。如果处理的是空间性质的数据或利用空间作为可视化工具,PostGIS提供了更多的函数来扩展分析。
l 科学研究所需的大部分数据都可通过机器(GPS、报警系统、遥感设备)轻松收集,并通过自动化的输入或标准的输入格式直接传输到数据库。事实上,智能手机和无人驾驶飞机等收集工具正变得越来越便宜,普通民众也越来越容易获得,存储数据的硬件也越来越便宜。
l 部分数据很容易分发。关系数据库是创建所谓的“数据分配器”或“数据集市”的理想选择,它允许其他研究人员轻松获取所需的数据子集,或者提供数据,让公众轻松下载。
以上是空间数据库用户的基本群体,但并不是唯一的群体。如果你曾经环顾世界,想一想,如果要把犯罪统计数据与植树的地点联系起来,或者给定一个地区的海拔模型和温度波动,将种植作物的最佳地点和时间联系起来,那么PostGIS可能是最容易和最划算的工具。
本书的内容安排
本书内容分为三个主要部分,并有三个支持附录。
第I部分:PostGIS简介
第Ⅰ部分介绍空间关系数据库的基本概念,特别是PostGIS/PostgreSQL。这部分旨在介绍行业标准的GIS数据库的概念和实践。在本部分结束时,你应该基本掌握几何、地理、栅格和拓扑等类型以及每种类型努力解决的问题,并对空间参考系统和数据库存储选项有一个基本的理解。最重要的是,你将有能力加载、查询和查看启用PostGIS的PostgreSQL数据库中的空间数据。
第II部分:将PostGIS投入工作
这部分的重点是使用PostGIS解决实际的空间问题,以及探讨如何优化速度。你将学会如何做各种各样的事情:
l 如何使用几何和地理进行邻近度分析。
l 如何使用不同类型的矢量运算来优化数据。
l 如何使用栅格和矢量数据执行无缝栅格处理。
l 如何使用栅格处理、地图代数、直方图和其他栅格统计函数来创建新的矢量数据,以计算感兴趣区域的相关统计数据。
l 如何使用栅格聚合函数从较小的栅格中创建大栅格。
l 如何使用封装的PostGIS TIGER地理编码器使地址归一化,进行地理编码和反向地理编码。
l 如何使用拓扑来保证编辑的一致性。
l 如何简化整个几何图形网络,并在简化的数据集中保持连通性。
第III部分:搭配其他工具使用PostGIS
第III部分介绍构建应用程序时最常与PostGIS搭配使用的工具。我们将介绍pgRouting,这是一种可以直接在数据库中与PostGIS搭配使用来创建网络路由应用程序的工具。此外,还将介绍PostgreSQL存储过程语言:PL/Python、PL/R和PL/V8(也称为PL/JavaScript)。最后,我们将简要研究PostGIS在Web应用程序中的应用,并介绍和PostGIS一起使用的各种地图服务器,以及OpenLayer和Leaflet绘图JavaScript API。我们还将研究如何使用PostGIS JSON和矢量切片输出函数来构建交互式的Web地图。