PostGIS 笔记
空间数据库
定义:存储、操作空间数据的数据库。
空间数据特点
- 空间数据
类型
是指点、线、多边形等形状;- 提供用于空间操作的高效处理的多维空间
索引
;- 提供用于查询空间属性和关系额空间
函数
。
发展历程
- 第1代
- 在传统的 GIS 实施中,所有空间数据都存储在平面文件中,并且需要特殊的 GIS 软件来解释和操作数据;
- 这些第一代管理系统旨在满足所有所需数据都在用户组织域内的用户的需求;
- 它们是专为处理空间数据而构建的专有、独立的系统。
- 第2代
- 空间系统将一些数据存储在关系数据库中(通常是
属性
或非空间部分
),但仍然缺乏直接集成所提供的灵活性。
- 空间系统将一些数据存储在关系数据库中(通常是
- 第3代
- 当人们开始将空间特征视为主流数据库对象时,真正的空间数据库诞生了;
- 空间数据库将空间数据与关系数据库完全集成;
- 系统定位从以 GIS 为中心转变为以数据库为中心。
空间数据库管理系统 可用于地理世界以外的应用,用于管理与人体解剖学、大规模集成电路、分子结构和电磁场等相关的数据。
空间数据类型
传统数据库有字符串、数字和日期等类型;空间数据库添加了额外的空间类型来表示地理特征
,这些空间数据类型抽象和封装了边界和维度等空间结构。在许多方面,空间数据类型可以简单地理解为形状。
空间数据类型以类型层次结构进行组织,每个子类型都继承其超类型的结构(属性)和行为(方法或函数)。
空间索引和边界框
普通数据库提供索引以允许对数据子集进行快速和随机访问,标准类型(数字、字符串、日期)的索引通常使用B树
索引完成。
B树
使用自然排序顺序对数据进行分区,以将数据放入分层树中;- 数字、字符串和日期的自然排序顺序很容易确定——每个值都小于、大于或等于所有其他值。
但是由于多边形可以重叠,可以相互包含,并且可以排列在二维(或更多)空间中,因此不能使用B树
来有效地索引它们。真实的空间数据库提供了一个“空间索引”来回答“哪些对象在这个特定的边界框内?”这个问题。
边界框
是最小的矩形(平行于坐标轴)能够包含给定的特征。
使用边界框是因为回答A 包含 B 吗?
的问题。对于多边形来说计算量很大,但在矩形的情况下速度很快。即使是最复杂的多边形和线串也可以用一个简单的边界框来表示。
索引必须快速执行才能有用,空间索引不像B树
那样提供精确的结果,而是提供近似的结果。问题这个多边形里面有什么线?
而是由空间索引解释为哪些线的边界框包含在该多边形的边界框内?
各种数据库实现空间索引差别很大
- 最常见的实现是R-Tree和Quadtree(用于 PostGIS);
- 在其他空间数据库中实现的基于网格的索引和GeoHash索引。
空间函数
普通数据库提供了一些查询数据功能,如连接字符串、对字符串执行哈希运算、对数字进行数学运算以及从日期中提取信息等。
空间数据库提供了一整套用于分析几何组件
、确定空间关系
、操纵几何
的功能;这些空间功能是任何空间项目的基石。
可进一步划分为
- 转换:在几何和外部数据格式之间
转换
的函数;- 管理:
管理
有关空间表和 PostGIS 管理的信息的功能;- 检索:
检索
几何的属性和测量值的函数;- 比较:
比较
两个几何形状的空间关系的函数;- 生成:从其他函数
生成
新几何图形的函数。
可能的函数列表非常多,PostGIS 实现的函数(以及其他有用的函数)由OGC、SFSQL定义。
PostGIS
PostGIS 向 PostgreSQL 添加对空间类型
、空间索引
、空间函数
功能,将其转变为空间数据库,并继承了PostGIS企业
特性以及实施的开放标准。
PostgreSQL 是什么
PostgreSQL 是一个功能强大的关系数据库管理系统 (RDBMS),是在 BSD 风格的许可证下发布的,因此是免费的开源软件。与许多其他开源程序一样,PostgreSQL 不受任何一家公司控制,而是拥有一个由开发人员和公司组成的全球社区来维护。
PostgreSQL 在设计之初就考虑了类型扩展(在运行时添加新数据类型、函数和索引的能力)。正因为如此,PostGIS 扩展可以由一个单独的开发团队开发,但仍然非常紧密地集成到核心 PostgreSQL 数据库中。
为什么选择 PostgreSQL
熟悉开源数据库的人的一个常见问题是,为什么 PostGIS 不是基于 MySQL 构建的?
。
PostgreSQL 有:
默认情况下经过验证的可靠性和事务完整性 (ACID);
对 SQL 标准的仔细支持(完整的 SQL92);
可插拔类型扩展和功能扩展;
面向社区的发展模式;
对列大小没有限制(
TOAST
元组)以支持大型 GIS 对象;允许 R-Tree 索引的通用索引结构 (GiST);
轻松添加自定义功能;
结合起来,PostgreSQL 提供了一个非常简单的开发路径来添加新的空间类型。在专有领域,只有Illustra(现为 Informix Universal Server)允许如此简单的扩展。这不是巧合,Illustra 是对 1980 年代原始 PostgreSQL 代码库的专有改造。
因为向 PostgreSQL 添加类型的开发路径非常简单,所以从那里开始是有意义的。当 MySQL 在 4.1 版中发布基本空间类型时,PostGIS 团队查看了他们的代码,加强了最初选择 PostgreSQL 的决定。
因为 MySQL 空间对象作为一种特殊情况必须在字符串类型之上被破解,所以 MySQL 代码分布在整个代码库中。PostGIS 0.1 的开发耗时不到一个月。做一个MyGIS
0.1 会花费更长的时间,因此,可能永远不会看到曙光。
为什么不是文件
自从首次编写 GIS 软件以来, Shapefile(以及 Esri File Geodatabase 和GeoPackage等其他格式)一直是存储空间数据并与空间数据交互的标准方式。
但是,这些平面
文件具有以下缺点:
- 文件需要特殊的软件才能读取和写入:SQL 是随机数据访问和分析的抽象。如果没有这种抽象,您将需要自己编写所有访问和分析代码。
- 并发用户可能会导致损坏和速度下降:虽然可以编写额外的代码来确保对同一个文件的多次写入不会损坏数据,但当您解决了问题并解决了相关的性能问题时,您将编写数据库系统的大部分内容。为什么不只使用标准数据库?
- 复杂的问题需要复杂的软件来解决:在针对文件进行编程时,可以用数据库中的一行 SQL 表达的复杂而有趣的问题(空间连接、聚合等)需要数百行专门的代码才能回答。
PostGIS 的大多数用户都在设置需要多个应用程序访问数据的系统,因此使用标准 SQL 访问方法可以简化部署和开发。一些用户正在处理大型数据集;对于文件,它们可能被分割成多个文件,但在数据库中它们可以存储为单个大表。
总之,对多用户的支持、复杂的即席查询、大型数据集的性能是空间数据库与基于文件的系统不同的地方。
PostGIS 简史
2001 年 5 月,Refractions Research 发布了 PostGIS 的第一个版本。PostGIS 0.1 有对象、索引和一些函数。结果是一个适合存储和检索但不适合分析的数据库。
随着功能数量的增加,对组织原则的需求变得清晰起来。来自开放地理空间联盟的 Simple Features for SQL(SFSQL)规范为这种结构提供了函数命名和要求的指南。
借助 PostGIS 对简单分析和空间连接的支持,Mapserver成为第一个在数据库中提供数据可视化的外部应用程序。
在接下来的几年中,PostGIS 功能的数量不断增加,但其功能仍然有限。许多最有趣的函数(例如,ST_Intersects()
、ST_Buffer()
、ST_Union()
)都很难编码。从头开始编写它们承诺了多年的工作。
幸运的是,第二个项目“几何引擎,开源”或GEOS出现了。GEOS 库为实现SFSQL规范提供了必要的算法。通过在 GEOS 中的链接,PostGIS 在0.8 版本中提供了对SFSQL的完整支持。
随着 PostGIS 数据容量的增长,另一个问题浮出水面:用于存储几何图形的表示证明效率相对较低。对于像点和短线这样的小对象,表示中的元数据有高达 300% 的开销。出于性能原因,有必要让代表节食。通过缩小元数据标头和所需的维度,大大减少了开销。在 PostGIS 1.0 中,这种新的、更快的、轻量级的表示成为默认值。
PostGIS 的最新版本继续添加功能和性能改进,以及对 PostgreSQL 核心系统中的新功能的支持。
谁使用 PostGIS
有关案例研究的完整列表,请参阅PostGIS 案例研究页面。
法国国家地理研究所
IGN 是法国的国家测绘机构,使用 PostGIS 存储该国的高分辨率地形图BDUni。BDUni 拥有超过 1 亿个特征,由 100 多名现场工作人员维护,他们每天验证观察结果并向数据库添加新映射。IGN 安装使用数据库事务系统来确保更新过程中的一致性,并使用热备用系统在系统发生故障时保持正常运行时间。
RedFin
RedFin是一家房地产代理公司,提供基于网络的服务,用于探索房产和估价。他们的系统最初是基于 MySQL 构建的,但他们发现迁移到 PostgreSQL 和 PostGIS在性能和可靠性方面提供了巨大的好处。
哪些应用程序支持 PostGIS
PostGIS 已成为一种广泛使用的空间数据库,支持使用它存储和检索数据的第三方程序的数量也在增加。支持 PostGIS 的程序包括服务器和桌面系统上的开源软件和专有软件。
下表列出了一些利用 PostGIS 的软件
开放/免费 |
封闭/专有 |
---|---|
|
|
PostGIS 安装
探索 PostgreSQL/PostGIS 数据库,并了解如何在 SQL 中编写空间查询,我们需要一些软件,可以在本地安装或在云端远程使用。
- 下面有关于如何访问 PostgreSQL 以在 Windows 或 MacOS 上安装的说明。PostgreSQL for Windows 和 MacOS 要么包括 PostGIS,要么有一种简单的方法来添加它。
- 下面有关于如何安装PgAdmin的说明。PgAdmin 是一个图形数据库浏览器和 SQL 编辑器,它为全世界的数据库引擎提供
面向用户
的界面。
有关安装 PostgreSQL 的最新说明,请转到PostgreSQL 下载页面并选择您正在使用的操作系统。
Windows
对于 Windows 安装:
转到Windows PostgreSQL 下载页面。
选择最新版本的 PostgreSQL 并将安装程序保存到磁盘。
运行安装程序并接受默认值。
查找并运行随数据库安装的
StackBuilder
程序。选择
空间扩展
部分并选择最新的PostGIS ..Bundle
选项。
接受默认值并安装。
MacOS
对于 MacOS 安装:
转到Postgres.app站点,并下载最新版本。
打开磁盘映像,然后将Postgres图标拖到Applications文件夹中。
在Applications文件夹中,双击Postgres图标以启动服务器。
单击Initialize按钮创建一个新的空白数据库实例。
在Applications文件夹中,转到Utilities文件夹并打开Terminal。
为方便起见,将命令行实用程序添加到您的PATH中。
sudo mkdir -p /etc/paths.d
echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp
客户端 DBeaver
DBeaver是一个面向开发人员和数据库管理员的免费开源通用数据库工具。
支持所有流行的数据库:MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server、Sybase、MS Access、Teradata、Firebird、Apache Hive、Phoenix、Presto 等。
选择原因
支持空间数据
查询结果在地图上落图
!
安装
- 下载适合自己操作系统的软件版本;
- Windows 平台仅需选择安装路径,一直
下一步
就行,此处不再赘述; - 其他平台请参考官方安装说明。
创建空间数据库
管理程序
启动 DBeaver
连接 PostgreSQL 数据库
菜单选择数据库
→新建数据库连接
双击 PostgreSQL 图标,进入 PostgreSQL 连接配置界面,按实际情况填写即可。
注意:若第一次使用缺少数据库JDBC连接驱动,该工具将引导你下载。
创建数据库
右键
选择新建数据库
创建名为
nyc
的数据库
选择新
nyc
数据库并将其打开以显示对象树,您将看到public
架构。
新建
SQL编辑器
,用于执行SQL。
在加载 PostGIS 空间扩展插件
CREATE EXTENSION postgis;
8. 运行 PostGIS 函数确认 PostGIS插件安装成功
SELECT postgis_full_version();
函数列表
PostGIS_Full_Version():报告完整的 PostGIS 版本和构建配置信息。
加载空间数据
PostGIS 通过各种库、应用程序的支持,提供了许多加载数据的选项。
首先从数据库备份文件中加载我们的工作数据,然后回顾一些使用常用工具加载不同 GIS 数据格式的标准方法。
示例数据下载
示例数据postgis-workshop-2020.zip为纽约市的四个 ShapeFile,以及一个社会人口变量属性表。我们已将 ShapeFile 加载为 PostGIS 表,稍后将在研讨中添加社会人口统计数据。
下面描述了我们每个数据集的记录数和表属性,这些属性值和关系是我们未来分析的基础。
要在 pgAdmin 中探索表的性质,请右键单击突出显示的表并选择Properties。您将找到表格属性的摘要,包括列
选项卡中的表格属性列表。
nyc_census_blocks 人口普查区
人口普查区,是报告人口普查数据的最小地理区域,所有更高级别的人口普查地理(区块组、区域、都会区、县等)都可以从人口普查区块的联合构建。我们已将一些人口统计数据附加到我们的区块集合中。
记录数:36592
blkid | 唯一标识 |
---|---|
popn_total | 总人数 |
popn_white |
白人 人数
|
popn_black |
黑人 人数
|
popn_nativ |
美洲原住民 人数
|
popn_asian |
亚洲人 人数
|
popn_other | 其他类别人数 |
boroname | 纽约自治市的名称(曼哈顿、布朗克斯、布鲁克林、史泰登岛、皇后区) |
geom | 空间数据 |
黑人人口占总人口的百分比
要将人口普查数据导入 GIS,您需要连接两条信息:实际数据(文本)和边界文件(空间)。获取数据有很多选择,包括从人口普查局的American FactFinder下载数据和边界。
nyc_neighborhoods 纽约社区
纽约拥有丰富的社区名称和范围历史,社区是不遵循政府规定的社会结构。例如,卡罗尔花园、红胡克和鹅卵石山的布鲁克林社区曾被统称为南布鲁克林
。现在,根据您与哪个房地产经纪人交谈,该街区以前称为红钩的相同四个街区可以称为哥伦比亚高地、卡罗尔花园西或红钩!
记录数:129
name | 小区名称 |
---|---|
boroname | 纽约自治市的名称(曼哈顿、布朗克斯、布鲁克林、史泰登岛、皇后区) |
geom | 空间数据 |
纽约市的街区
nyc_streets 纽约街道
街道中心线形成了城市的交通网络,这些街道标有类型,以便区分后巷、主干道、高速公路和较小的街道等通道。理想的居住区域可能位于住宅街道上,而不是靠近高速公路。
记录数:19091
name | 街道名称 |
---|---|
oneway | 街道是单向的吗? |
type | 道路类型(主要、次要、住宅、高速公路) |
geom | 空间数据 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqDOCXCF-1645930975448)(https://postgis.net/workshops/postgis-intro/_images/nyc_streets.png)]
纽约市的街道。主要道路为红色。
nyc_subway_stations 纽约地铁站
地铁站将人们居住的上层世界与地下无形的地铁网络连接起来,作为公共交通系统的门户,车站位置有助于确定不同的人进入地铁系统的难易程度。
记录数:491
name | 车站名称 |
---|---|
borough | 纽约自治市的名称(曼哈顿、布朗克斯、布鲁克林、史泰登岛、皇后区) |
routes | 贯穿本站的地铁线路 |
transfers | 您可以通过该站换乘的线路 |
express | 是否为特快列车停靠的车站 |
geom | 空间数据,车站点位 |
纽约市地铁站的点位置
nyc_census_sociodata 纽约市人口普查数据
在普查过程中收集了丰富的社会经济数据,但仅限于人口普查区域的更大地理层面。人口普查块组合形成人口普查区域(和块组)。我们在人口普查区收集了一些社会经济信息,以回答有关纽约市的一些更有趣的问题。
是
nyc_census_sociodata
一个数据表。在进行任何空间分析之前,我们需要将其连接到人口普查地理。
tractid | 唯一标识 |
---|---|
transit_total | 工人数量 |
transit_private | 使用私家车/摩托车的工人人数 |
transit_public | 乘坐公共交通的工人人数 |
transit_walk | 步行的工人数量 |
transit_other | 使用其他形式(如步行/骑自行车)的工人数量 |
transit_none | 在家工作的工人人数 |
transit_time_mins | 所有工人在运输过程中花费的总分钟数(分钟) |
family_count | 家庭数量 |
family_income_median | 家庭收入中位数(美元) |
family_income_mean | 家庭收入平均数(美元) |
family_income_aggregate | 所有家庭的总收入(美元) |
edu_total | 有教育经历的人数 |
edu_no_highschool_dipl | 没有高中文凭的人数 |
edu_highschool_dipl | 具有高中文凭且没有继续教育的人数 |
edu_college_dipl | 具有大专学历且没有继续深造的人数 |
edu_graduate_dipl | 拥有研究生学历的人数 |
导入示例数据
通过PostGIS 自带的PostGIS PostGIS Bundle 3 for PostgreSQL x64 13 Shapefile and DBF Loader Exporter
软件导入 ShapeFile 示例数据。
- 打开
PostGIS PostGIS Bundle
并登录nyc
数据库
- 批量添加要导入的Shape File文件,修改其
SRID
为26918,选择Import
导入
- 导入完成
ShapeFile 文件
ShapeFile 通常是指具公共前缀名称的 .shp
、.shx
、.dbf
和其他
扩展名的文件的集合。实际的 ShapeFile 专门与具有.shp
扩展名的文件相关,但是.shp
如果没有所需的支持文件,单独的文件对于分发是不完整的。
强制性文件
.shp
形状格式;要素几何本身.shx
形状索引格式;特征几何的位置索引.dbf
属性格式;每个形状的柱状属性,在 dBase III 中
可选文件包括.prj
投影格式;坐标系和投影信息,使用众所周知的文本格式描述投影的纯文本文件
通过shp2pgsql
程序通过将 ShapeFile 文件从二进制数据 转换 为一系列 SQL 命令,然后加载到 PostGIS 数据库中运行。
SRID 是什么
空间参考标识符
(SRID)定义了数据的地理坐标系和投影的所有参数。SRID 很方便,因为它将有关地图投影(可能非常复杂)的所有信息打包到一个数字中。
- 可以在在线数据库中查找地图投影的定义;
- 或直接在 PostGIS 内部查询
spatial_ref_sys
表。
SELECT srtext FROM spatial_ref_sys WHERE srid = 26918;
PostGIS
spatial_ref_sys
表是一个OGC标准表,它定义了数据库已知的所有空间参考系统。PostGIS 附带的数据列出了 3000 多个已知的空间参考系统以及在它们之间转换/重新投影所需的详细信息。
在这两种情况下,都会看到26918空间参考系统的文本表示:
PROJCS["NAD83 / UTM zone 18N",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-75],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],AUTHORITY["EPSG","26918"],AXIS["Easting",EAST],AXIS["Northing",NORTH]]
如果从数据目录打开nyc_neighborhoods.prj
文件,将看到相同的投影定义。
从当地机构(例如纽约市)收到的数据通常会采用state plane
或UTM
标注的当地投影。我们的投影是Universal Transverse Mercator (UTM) Zone 18 North
或 EPSG:26918
。
SQL 基本查询
结构化查询语言(SQL: Structured Query Language)是一种向关系数据库查询、更新数据的方法。
通过以下四个基本的动词
,就可以使用SQL语句来进行查询:
SELECT
:返回行以响应查询,详情;INSERT
:向表中添加新行;UPDATE
:更改表中的现有行;DELETE
:从表中删除行。
现在通过 DBeaver 使用 SQL 来查询数据。
PostGIS 笔记相关推荐
- postgis学习笔记
1.将.shp格式数据代入数据库postgis 中: <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office ...
- NAR:UNITE真菌鉴定ITS数据库——处理未分类和并行分类(数据库文章阅读笔记Markdown模板)...
上方文章标题要求:包括杂志名缩写(一个词的杂志名不缩写,两个及上用实词首字母)和吸引人且有重要信息的语句,中间用中文冒号(:)分隔 注:文中灰色部分(引用格式)为写作说明文字,帮助编辑规范Markdo ...
- python空间分析_读书笔记——《python地理空间分析指南》
本文为<Python地理空间分析指南(第2版)>的读书摘录,顺便挖个坑,进一步对python的几个包做学习整理. 本笔记的用途:了解python地理空间处理的技术框架和实现途径. 第三章 ...
- geoTools学习笔记001---(简介)
需要做地图开发,如果全部从底层做起,那将会花费大量的精力,况且难度很大,所以要使用现成的开发平台,经过几天的了解: 商业版GIS开发平台:arcgis/mapinfo/--,如果做web地图,可以使用 ...
- 2022-04-11 查询PostGIS和pgRouting的版本号
安装PostgreSQL数据库及扩展功能包 下载最新PostgreSQL: 只有企业版支持win7 win10,注意安装时语言选项不能选中文否则触发bug 下载最新PostGIS和pgRouting: ...
- 阿群笔记:CentOS7 在线安装 docker 的推荐方法
yum install -y epel-release && yum install -y epel-release yum install -y yum-utils yum-conf ...
- 【数据库笔记】高性能MySQL:chapter 5 创建高性能的索引
文章目录 前置知识 5.0 引言 5.1 索引基础 1. 索引的类型 B-Tree 索引 哈希索引 空间数据索引(R-Tree) 全文索引 5.2 索引基础 5.3 高性能的索引策略 1. 独立的列 ...
- JavaWeb和WebGIS学习笔记(三)——GeoServer 发布shp数据地图
JavaWeb和WebGIS学习笔记(三)--GeoServer 发布shp数据地图 系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gi ...
- 用postgis制作wkt
先安装postsql,再安装postgis PostGIS的安装与初步使用_不睡觉的怪叔叔的博客-CSDN博客_postgis 一步步往下,导入空间数据前,需要确定数据的sird,可以在已有模板里查询 ...
最新文章
- shiro整合oauth
- html5 meta标签属性整理
- [雪峰磁针石博客]2018最佳12个开源或免费web服务器和客户端性能测试工具
- kali linux 桌面消失_kalilinux系统设置不见了的解决方案
- 系统架构师学习笔记-多媒体基础知识
- C++ map中使用erase应该注意到的问题
- 阿里巴巴公布香港IPO定价:每股176港元
- 2016级算法第四次上机-C.AlvinZH的1021实验
- SpringBoot下Mybatis-注解动态sql开发的坑
- 青龙面板之【追书神器】——5.29
- 看看天上的星星,都是为了给你们排位掉下来的
- 蓝牙连接打印机打印资产标签.
- 数据库连接_由浅入深搭建Mybatis框架
- OSChina 周五乱弹 —— 夏日限定梦想
- position定位的属性
- 从搞科研到商业运作:Alberto Broggi 研究计算机视觉的二十年...
- homeassistant安装
- 请看今日之域中,竟是谁家之天下!-----------2021 年 7 月 TIOBE 指数,“三国争霸”最终谁能登顶?他们的命运掌握在各位大佬的手中
- R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、美股不使用后缀、其它股票需要使用后缀:大陆沪市使用:“.SS“,深市使用:“.SZ“,香港使用:“.HK
- C语言复习内存 c2