PostGIS学习笔记5——添加几何图形数据

本文介绍了如何在PostGIS中处理和操作空间数据,包括自定义添加几何图形(如点、线串、多边形和集合),以及使用元数据表spatial_ref_sys和geometry_columns来追踪和解释几何图形。还探讨了表示真实世界对象的不同几何类型及其空间函数的使用。
摘要由CSDN通过智能技术生成

我们使用PostGIS是看上了它作为空间数据库的一些优势,现在来看看它的空间数据是如何加载和组织的。

一 自定义添加几何数据

  • ST_AsText(geom) 将geometry类型转化为text类型

首先在创建的test1数据库中,打开SQL查询工具,输入以下SQL语句

CREATE TABLE geometries (name varchar, geom geometry);
 
INSERT INTO geometries VALUES
  ('Point', 'POINT(0 0)'),
  ('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'),
  ('Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
  ('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'),
  ('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))');
 
SELECT name, ST_AsText(geom) FROM geometries;

该代码创建了一个表geometries,然后插入了5个几何图形数据。

分别为(POINT)线(LINESTRING)多边形(POLYGON)内含空洞的多边形(POLYGON with a hole)图形集合(COLLECTION)

最后查询表,输出结果

二 元数据表

在PostGIS中提供了两张表用于追踪和报告数据库中的几何图形

即用于解释几何图形数据(这两张表中的内容相当于元数据):

  • 第一张表spatial_ref_sys    ——   定义了数据库已知的所有空间参照系统,稍后将对其进行更详细的说明。
  • 第二张表geometry_columns (实际上是视图View) ——  提供了数据库中所有空间数据表的描述信息。

查看表spatial_ref_sys

SELECT * FROM spatial_ref_sys;

查看表geometry_columns

SELECT * FROM geometry_columns;

  • f_table_catalog(数据库名),f_table_schema(模式名),和f_table_name(空间数据表名)提供各个几何图形(geometry)的要素表(feature table)的名称
  • f_geometry_column包含对应空间数据表中用于记录几何信息的属性列的列名。
  • coord_dimension定义几何图形的维度(2维、3维或4维)
  • srid定义引用自spatial_ref_sys表的空间参考标识符
  • type列定义了几何图形的类型。比如"(Point)"和"线串(Linestring)"等类型。

  通过查询该表,GIS客户端和数据库可以确定检索数据时的预期内容,并可以执行投影、处理、渲染而无需检查每个几何图形(geometry)—— 这些就是元数据所带来的作用。

三 表示真实世界的对象

我们创建的表(geometries)含有多种不同类别的几何图形。

可以使用 读取几何图形元数据的函数 获取每个对象的基本信息:

  • ST_GeometryType(geometry)    ——    返回几何图形的类型
  • ST_NDims(geometry)    ——    返回几何图形的维数
  • ST_SRID(geometry)    ——    返回几何图形的空间参考标识码
SELECT name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)
FROM geometries;

3.1 点(Point)

    空间(Point)表示地球上的单个位置。由单个坐标表示(包括2维、3维或4维)。

    当详细的细节(例如形状和大小)在目标空间尺度上不重要时,真实世界中的对象可以直接用表示。即看作质点

    例如,世界地图上的城市可以描述为,而在一幅州地图中可以将城市表示为多边形

    针对的一些特定空间函数包括:

  • ST_X(geometry)    ——    返回X坐标
  • ST_Y(geometry)    ——    返回Y坐标

  所以,我们这样来读取一个图形的坐标值:

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

纽约市地铁站(nyc_subway_stations)表是一个以表示的数据集。

以下SQL查询将返回一个图形数据(在ST_AsText列中):

SELECT name, ST_AsText(geom)
FROM nyc_subway_stations
LIMIT 2;

3.2 线串(Linestring

线串(Linestring)是表示两个或多个位置之间的路径,它的形式是由两个或多个组成的有序序列。道路和河流通常表示为线串

    如果线串的起始点和结束点是同一个,则称其是闭合的(closed)。

    如果线串不与自身交叉或接触(如果线串是闭合的,则排除结束点),则称其是简单的(simple)。

    线串既可以是闭合的,也可以是简单的

    纽约的街道网络数据(nyc_streets)在前面的章节中已经加载到数据库中了,这个数据集包含名称类型等详细信息。

    一条真实的街道可能由许多线串组成,每条线串代表一段具有不同属性特征的道路。

用于处理线串的一些特定空间函数包括:

  • ST_Length(geometry)    ——    返回线串的长度
  • ST_StartPoint(geometry)    ——    将线串的第一个坐标作为点返回
  • ST_EndPoint(geometry)    ——    将线串的最后一个坐标作为点返回
  • ST_NPoints(geometry)    ——    返回线串的坐标数量
SELECT name,ST_Length(geom),ST_Length(geom)as leng,ST_StartPoint(geom)as StartPoint,
ST_EndPoint(geom)as EndPoint,ST_NPoints(geom)as NPoints 
FROM geometries
WHERE name = 'Linestring';

3.3 多边形(Polygon)

 多边形(Polygon)是区域的表示形式。

多边形的外部边界由一个(Ring)表示,这个是一个线串,如上面定义的,它既是闭合的,又是简单的。多边形中的(hole)也由表示

    多边形用于表示重视大小形状这两个特征的地理对象。城市边界、公园、建筑或水体都通常需要表示为多边形,当比例尺足够大时,可以观测它们的面积。道路和河流有时也可以表示为多边形

我们创建的多边形数据通过查询可以直接预览:

第一个多边形只有一个,第二个多边形有一个内部的"孔洞(hole)",大多数图形系统都包含多边形的概念,但GIS系统在允许多边形方面是比较独特的。

SELECT name,geom
FROM geometries
WHERE name LIKE 'Polygon%';

    关于多边形图形的一些特定空间函数包括:

  • ST_Area(geometry)    ——     返回多边形的面积
  • ST_NRings(geometry)    ——    返回多边形中环的数量(通常为1个,其他是孔)
  • ST_ExteriorRing(geometry)    ——    以线串的形式返回多边形最外面的环
  • ST_InteriorRingN(geometry, n)    ——    以线串形式返回指定的内部环
  • ST_Perimeter(geometry)    ——    返回所有环的长度

 我们可以使用空间函数计算多边形的面积

SELECT name, ST_Area(geom)
FROM geometries
WHERE name LIKE 'Polygon%';

3.4、集合(Collection)

    有四种集合(Collection)类型,它们将多个简单几何图形组合为图形集合

  • MultiPoint     ——    点集合
  • MultiLineString    ——    线串集合
  • MultiPolygon    ——    多边形集合
  • GeometryCollection    ——    由任意几何图形(包括其他GeometryCollection)组成的异构集合

    集合更多地出现在GIS软件中,而不是在通用图形软件中。

    集合对于将真实世界的对象直接建模为空间对象非常有用。

例如,如何对被路权路权指交通参与者的权利)分割的多个道路部分进行建模?

答案是将其作为MultiPolygon,其组成部分位于路权的两侧。

我们示例中的几何图形集合包含一个多边形和一个点:

SELECT name, geom
  FROM geometries
  WHERE name = 'Collection';

    用于处理集合的一些特定空间函数

  • ST_NumGeometries(geometry)    ——    返回集合中的组成部分的数量
  • ST_GeometryN(geometry, n)    ——    返回集合中指定的组成部分
  • ST_Area(geometry)    ——    返回集合中所有多边形组成部分的总面积
  • ST_Length(geometry)    ——    返回所有线段组成部分的总长度

四 PostGIS中几何图形数据的输出与输入 

       在数据库中,Geometry类型数据以仅供PostGIS使用的格式 存储在磁盘上。为了让外部程序插入和检索有用的几何图形信息,需要将它们转换为其他应用程序可以理解的格式。

PostGIS支持以多种格式进行几何图形的输入和输出。

 ②Well-known binary(WKB)

  • ST_GeomFromWKB(bytea)    ——    返回geometry
  • ST_AsBinary(geometry)    ——    返回bytea
  • ST_AsEWKB(geometry)    ——    返回bytea

    ③Geographic Mark-up Language(GML)

  • ST_GeomFromGML(text)    ——    返回geometry
  • ST_ASGML(geometry)    ——    返回text

    ④Keyhole Mark-up Language(KMLKML)

  • ST_GeomFromKML(text)    ——    返回geometry
  • ST_ASKML(geometry)    ——     返回text

    ⑤GeoJson

  • ST_AsGeoJSON(geometry)    ——    返回text

    ⑥Scalable Vector Graphics(SVG)

  • ST_AsSVG(geometry)    ——    返回text

以上函数最常见的用法是将几何图形文本(text)表示形式转换为内部表示形式(输入时的数据设定):

    请注意,除了具有几何图形表示形式的文本参数外,还可以指定一个提供几何图形SRID的数字参数。

    以下SQL查询展示了一个WKB表示形式的示例(将二进制输出转换为ASCII格式以进行打印时,需要调用encode()):

——LINESTRING(0 0,1 0) 即是一种内部表示形式(输入时的数据设定)

SELECT encode(
  ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0,1 0)')),
  'hex');

 在学习中,将使用WKT,以确保你能够理解我们正在查看的几何图形

    但是,在大多数实际生产环境中(如查看GIS应用程序中的数据、将数据传输到web客户端或远程处理数据),WKB是首选的格式。

由于WKT和WKB是在SFSQL规范中定义的,因此它们不能处理3维或4维的几何图形。

对于这些情况,PostGIS定义了Extended Well Known Text(EWKT)Extended Well Known Binary(EWKB)格式以用于处理3维或4维的几何图形

    它们提供了与WKT和WKB相同的格式化功能,并且是在增加了维度的情况下。

    以下是WKT中三维(3D)线串示例:

SELECT ST_AsText(ST_GeometryFromText('LINESTRING(0 0 0,1 0 0,1 1 2)'));

注意:文本表示形式发生了变化!这是因为PostGIS的文本输入程序在使用方面是自由的。它可以使用:

  • 十六进制编码的EWKB
  • 扩展的WKT
  • ISO标准的WKT

    在输出端,ST_AsText()只返回ISO标准的WKT。

    除了用于各种形式(WKT、WKB、GML、KML、JSON、SVG)的输出函数外,PostGIS还有基于四种形式(WKT、WKB、GML、KML)的输入函数

    大多数应用程序使用WKT或WKB几何图形创建函数,但是也可以使用其他形式的几何图形创建函数。

    下面是一个使用GML输入和输出JSON的示例:

SELECT ST_AsGeoJSON(ST_GeomFromGML('<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>'));

五 从文本转换

    到目前为止,我们看到的WKT字符串都是'text'类型,我们使用PostGIS的ST_GeomFromText()将它们转换为'gometry'类型。

    PostgreSQL包含一个简短形式的语法,允许数据从一种类型转换到另一种类型,即类型转换语法:

olddata::newtype

    例如,将double类型转换为文本字符串类型:

SELECT 0.9::text;

    以下SQL语句将一个WKT字符串转换成一个几何图形(geometry):

SELECT 'POINT(0 0)'::geometry;

    关于使用类型转换语法创建几何图形,需要注意一点:除非指定SRID,否则将得到一个包含未知SRID的几何图形

    可以使用EWKT形式指定SRID,该形式在前面包含一个SRID:

SELECT 'SRID=4326;POINT(0 0)'::geometry;

参考:PostGIS教程七:几何图形(Geometry)_postgis coordinates含义-CSDN博客

  • 44
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值