PostGIS - 基础几何形状

PostGIS介绍

img

PostGIS 是 PostgreSQL 的免费扩展。PostGIS 扩展通过添加对PointLine、 和Polygon等类型的支持, 用效处理空间索引以及提供查询空间属性和关系的空间函数,将 PostgreSQL转变为空间数据库。

PostGIS 通过添加对以下三个功能的支持,将 PostgreSQL 数据库管理系统转变为空间数据库:

  • 空间数据类型用于操作和存储Point, Line, Polygon等形状
  • 使用多维空间索引来高效处理空间操作
  • 在管理和查询空间属性和关系时,空间函数与 SQL 命令一起使用。

空间索引

由于多边形可以重叠,可以相互包含,并且排列在二维(或更多)空间中,因此不能使用 B 树索引来有效地索引它们。真实的空间数据库提供了一个空间索引,它回答了“哪些对象位于这个特定边界框内?”的问题。最常见的实现是R-Treeand Quadtree(在 PostGIS 中使用)

空间函数

空间数据库提供了一套完整的功能,用于分析几何组件、确定空间关系和操作几何图形。这些空间功能是任何空间项目的构建块。

  • 转换功能:几何图形和外部数据格式之间的转换。
  • 管理功能:管理有关空间表和PostGIS管理的信息。
  • 检索功能:检索几何图形的属性和测量值。
  • 比较功能:比较两个几何图形的空间关系。
  • 生成函数:从其他几何图形生成新的几何图形。

在本实验中,我们将使用New York Taxi Data乘车数据来研究各种空间数据类型、空间查询和函数。

安装PostGIS

在AWS上,PostGIS安装是通过SQL语句完成的(RDS不支持从源安装PostGIS)。因此,使用几个 CREATE EXTENSION 语句创建 PostGIS 所需的扩展非常简单。将 PostGIS 扩展安装到pglab数据库中:

psql pglab -c "create extension if not exists postgis;"
psql pglab -c "select * from pg_available_extensions where name='postgis';"

image-20231111022312795

几何形状

让我们在数据库中创建一个简单的表来详细了解数据类型, 在pgAdmin中打开Query Tool

image-20231111022546950

入以下查询以创建表示不同几何数据类型的示例数据:

CREATE TABLE sampledata (name varchar, geom geometry);

INSERT INTO sampledata VALUES
  ('Point', 'POINT(1 2)'),
  ('Linestring', 'LINESTRING(1 2, 2 3, 3 4, 4 2, 1 2)'),
  ('Polygon', 'POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))'),
  ('PolygonWithHole', 'POLYGON (( 10 130, 50 190, 110 190, 140 150, 150 80, 100 10, 20 40, 10 130 ),( 70 40, 100 50, 120 80, 80 110, 50 90, 70 40 ))'),
  ('Collection', 'GEOMETRYCOLLECTION(POINT(1 2),POLYGON((0 0, 2 0, 2 2, 0 2, 0 0)))');

SELECT name, ST_AsText(geom) FROM sampledata;

image-20231111022613139

我们将使用pgAdmin客户端的几何函数来可视化数据。上面的示例创建表geometry,然后插入五个几何图形:

  • 一个点
  • 一条线
  • 一个多边形
  • 有孔的多边形
  • 一个集合

Point

点表示坐标空间中的单个位置。当精确细节(例如形状和大小)在目标比例下并不重要时,可以使用点来表示对象。例如,世界地图上的城市可以描述为一个点,而单个州的地图可能将每个城市表示为多边形。

运行以下查询以查看点生成的结果:

SELECT ST_AsText(geom), ST_X(geom), ST_Y(geom)
  FROM sampledata
  WHERE name = 'Point';

image-20231111022729411

Linestring

Linestring是位置之间的路径。道路和河流通常表示为Linestring。如果Linestring在同一点开始和结束,则称其为闭合Linestring。如果它不与自身相交或接触,则称它是简单的。Linestring可以是封闭的,也可以是简单的。

运行以下查询以查看Linestring如何生成结果

with g as (
	select 'LINESTRING(0 0, 1 1, 2 0)'::geometry geom
	union
	select 'LINESTRING(0.5 0.5, 1.5 0.5)'::geometry geom
	union
	select 'LINESTRING(2.5 1, 2.5 0, 3 1, 3.5 0, 3.5 1)'::geometry geom
	union
	select 'LINESTRING(4 0, 5 0, 5 0.5, 4 0.5, 4 1, 5 1)'::geometry geom
	)
select geom, ST_AsText(geom), ST_Length(geom) from g;
;

查询完成后点击这个图标,打开Geometry Viewer

SampleLineString

显示结果如下:

SampleLineStringGeometryView

Polygon

多边形是区域的表示。多边形用于表示大小和形状很重要的对象。城市边界、公园、建筑物通常都表示为多边形。道路和河流有时也表示为多边形。

运行以下查询以查看Polygon如何生成结果:

SELECT name, geom FROM sampledata WHERE name like 'Polygon%';

SamplePolygon

使用 pgAdmin 客户端中的内置功能Geometry Viewer进行可视化:

SamplePolygon

Collection

Collection是上述任何数据点(Point / LineString / Polygon)的组合

SELECT ST_AsText(geom), ST_Length(geom), geom  FROM sampledata  WHERE name = 'Collection';

SampleCollections

SampleCollections

示例

使用 PostGIS 在纽约中央公园周围绘制一个矩形。

运行以下查询:

SELECT
ST_SetSRID(ST_MakePolygon(ST_GeomFromText('LINESTRING(-73.973057 40.764356,-73.981898 40.768094,-73.958209 40.800621,-73.949282 40.796853,-73.973057 40.764356)'),
ARRAY[ST_GeomFromText('LINESTRING(-73.966681 40.785221,-73.966058 40.787674,-73.9649 40.788291,-73.963913 40.788194,-73.963333 40.788291,-73.962539 40.788259,-73.962153 40.788389,-73.96181 40.788714,-73.961359 40.788909,-73.960887 40.788925,-73.959986 40.788649,-73.959492 40.788649,-73.958913 40.78873,-73.958269 40.788974,-73.957797 40.788844,-73.957497 40.788568,-73.957497 40.788259,-73.957776 40.787739,-73.95784 40.787057,-73.957819 40.786569,-73.960801 40.782394,-73.961145 40.78215,-73.961638 40.782036,-73.962518 40.782199,-73.963076 40.78267,-73.963677 40.783661,-73.965694 40.784457,-73.966681 40.785221)')]),4326);

可视化如下:

image-20231111023456233