PostgreSQL中的空间数据的详细介绍

1,194 阅读6分钟

在这篇文章中,我们将详细讨论什么是空间数据库以及PostgreSQL支持的数据类型--POINT,以进行地理数据分析。

在我之前的文章《安装和升级PostgreSQL以支持空间数据》中,我已经演示了如何在Mac上安装PostgreSQL数据库,以及如何启用PostGIS扩展,使用该扩展可以将空间或地理数据插入数据库并执行空间查询。你也可以通过类似的步骤在Windows机器上下载并安装PostGIS扩展。强烈建议你先按照教程建立一个环境,然后再继续阅读本文。一旦你正确地安装了PostgreSQL数据库并启用了PostGIS扩展,你就可以按照这篇文章来进一步了解与PostGIS有关的不同空间数据类型。

PostGIS是一个附加库,可以安装到PostgreSQL数据库的现有实例中。PostGIS将增加特定的功能,使我们能够在PostgreSQL数据库中处理地理数据。如果你想对PostGIS扩展和它的工作原理有一个描述性的概述,我建议你看看PostGIS的官方文档

空间数据分析和为什么需要它?

在深入研究使用空间数据的技术问题之前,让我们先了解一下空间数据分析是什么,为什么需要进行空间数据分析。简单地说,对空间或地理数据中的模式、反常现象和理论的研究被称为空间数据分析。它是数据分析的一个扩展版本,重点是地理数据而不是普通数据。因此,有一套特定的工具和方法涉及这种地理数据分析。这种空间分析的几个例子如下。

  • 地点A离地点B有多远?
  • 距离X地点500米内有哪些公交车站?
  • 从地点X到地点Y的最佳路线是什么?

为了回答这些问题,我们需要数据库中的一组特殊函数。这些函数被设计用来处理地理数据,并给我们提供我们实际寻找的答案。在PostgreSQL中,这些函数可以通过被称为PostGIS的扩展形式来实现。这篇文章只是对基本数据类型POINT的介绍,数据是以这种类型存储在数据库中的。用这种数据进行空间分析超出了本文的范围,将在以后的文章中讨论。

PostgreSQL中空间数据类型的组成部分

为了处理地理数据,数据库使用一种特殊的数据类型。有多种处理地理数据的数据类型,如点、线、多边形等。在这篇文章中,我们将专门研究POINT数据类型,并了解如何创建和使用它。在进一步行动之前,让我们也刷一下我们的知识,了解如何在现实世界中解释地理数据。

如果我们把地球表面放在一个平面上,经纬线被用来描述一个地点在该表面上的准确位置。

Lines of Latitude and Longitude across the surface of the earth

图1--横跨地球表面的经纬线--(资料来源)。

正如你在上图中看到的,横跨地球表面的水平线和垂直线可以用来准确定位地球表面的位置。通过了解经纬度坐标,我们可以给出世界上任何地方的确切位置。这就是所谓的地理定位。有各种空间数据类型可用于进行空间数据分析,如下所示。

Geometry Data Types in PostgreSQL

图2 - PostgreSQL中的几何数据类型

上图显示了所有可用的几何数据类型,可在PostgreSQL中工作。在这篇文章中,我们将研究以下的地理数据类型。

  • POINT- 它用于使用经纬度坐标来定义准确的位置。

POINT数据类型

一个点是一个纬度和一个经度坐标的交点。通过纬度和经度坐标的组合,可以在地图上找到任何位置。在PostgreSQL中,一个点是一个几何数据类型,它将数据存储在几何数据类型中。例如,让我们考虑以下伦敦的坐标,其中纬度是51.501220,经度是-0**.138702**。

为了将上述内容转换为PostgreSQL并表示伦敦,我们可以写成

point(-0.138702 51.501220)

请注意,经度值被放在前面,而纬度则放在旁边,两者之间只有一个空格作为分隔。这在PostGIS中被称为Well Known Text或WKT。然而,这只是文本数据,为了将其转换为地理对象并载入数据库,我们将使用空间函数ST_GeomFromText(text WKT, integer SRID)。在这个格式中,我们将提供作为文本的坐标和作为第二个参数的空间参考ID。SRID是一个空间参考ID,它告诉PostGIS引擎我们的数据是什么格式的,然而,SRID可以有很多值,这不在本文的范围之内。在这个例子中,我们将考虑SRID为4326。所以,点数据类型的最终表示方法可以写成如下。

ST_GeomFromText('POINT(-0.138702 51.501220)', 4326)

当上述语句在PostgreSQL中执行时,PostGIS引擎将Well Known Text字符串值转换为有效的几何数据类型,并以二进制格式存储在数据库中。

现在让我们在PostgreSQL中创建一个表,并在其中插入几何数据。你可以使用以下来自gist的SQL查询来创建和插入数据到你的表中。

https://gist.github.com/aveek22/daf288a18480ab91be7a17cf33ad7cfc

一旦你运行该查询,你会看到在PostgreSQL中已经创建了一个包含伦敦数据的表。

Storing Geometry data into PostgreSQL

图3 - 将几何数据存储到PostgreSQL中

正如你在上图中看到的,提供坐标的列sensorLocation以Well Known Text格式被转换为几何数据类型,数据以二进制格式存储。我们还可以通过点击列头右边的小眼睛按钮在地图上查看位置。

Viewing Geometry data on a map in PostgreSQL

图4 - 在PostgreSQL的地图上查看几何数据

正如你在上图中看到的,当我们在PGAdmin中选择Geometry Viewer时,该点被看成是地图上伦敦市上面的一个蓝点。由于我们在数据集中只有一条记录,所以地图上只有一个点是可见的。数据集中的所有这些点都会显示在与其位置坐标相对应的地图上。

另外,你也可以通过使用以下SQL脚本来查看现有几何数据类型的数据类型。

SELECT ST_GeometryType(sensorLocation) FROM SQLShackGeomTest;

Checking the Geometry Data Type

图5 - 检查几何体数据类型

总结

在这篇文章中,我们已经了解了空间数据是怎么回事,以及如何将其存储在PostgreSQL数据库中。我们还学习了与PostGIS相关的空间数据类型POINT及其意义。点是处理任何空间数据的基本块。点的组合可以用来制作其他地理对象,如线或多边形等。我们将在接下来的文章中进一步了解这些内容。