PostGIS教程七:几何图形(Geometry)

2023-05-16

目录

一、介绍

二、元数据表

三、表示真实世界的对象

3.1、点(Points)

3.2、线串(Linestring)

3.3、多边形(Polygon)

3.4、集合(Collection)

四、几何图形输入和输出

五、从文本转换


一、介绍

    在前面的章节中,我们已经往数据库中加载了数据,现在让我们来先看一些简单的例子。

    在pgAdmin中,再次选择nyc数据库并打开SQL查询工具。将下面的SQL代码粘贴到pgAdmin SQL Editor窗口中(删除默认情况下可能存在的任何文本),然后执行。


   
  1. CREATE TABLE geometries (name varchar, geom geometry);

  2.  
  3. INSERT INTO geometries VALUES

  4. ('Point', 'POINT(0 0)'),

  5. ('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'),

  6. ('Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),

  7. ('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'),

  8. ('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))');

  9.  
  10. SELECT name, ST_AsText(geom) FROM geometries;

    上面的示例创建了一个(geometries),然后向该中插入5个几何图形数据(geometry):

  • 一个(POINT)
  • 一条线(LINESTRING)
  • 一个多边形(POLYGON)
  • 一个内含空洞的多边形(POLYGON with a hole)
  • 一个图形集合(COLLECTION)

    最后,查询表中的数据并输出。

二、元数据表

    为了符合Simple Features for SQL(SFSQL)规范,PostGIS提供了两张表用于追踪和报告数据库中的几何图形(这两张表中的内容相当于元数据):

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

    

                                 geometry_columns视图的结构

    让我们来看一下数据库中的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)—— 这些就是元数据所带来的作用。

    注意:如果nyc数据库没有指定26918的srid,那该怎么办呢?通过更新很容易修复:

SELECT UpdateGeometrySRID(‘nyc_neighborhoods’,’geom’,26918);

三、表示真实世界的对象

    Simple Features for SQL(SFSQL)规范是PostGIS开发的原始指导标准,它定义了如何表示真实世界的对象。

    通过形成连续的图形并以固定的分辨率对其进行数字化,实现了对真实世界的合理表示。

    SFSQL只规定了对真实世界对象的二维表示,然而,PostGIS已将其扩展到3维和4维的表示。最近,SQL-Multimedia Part 3(SQL/MM)规范正式定义了它们自己的三维表示。

    示例的包含不同几何图形类型的混合。我们可以使用读取几何图形元数据的函数获取每个对象的基本信息:

  • ST_GeometryType(geometry)    ——    返回几何图形的类型
  • ST_NDims(geometry)    ——    返回几何图形的维数
  • ST_SRID(geometry)    ——    返回几何图形的空间参考标识码

   
  1. SELECT name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)

  2. FROM geometries;

3.1、点(Points)

_images/points.png

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

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

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


   
  1. SELECT ST_AsText(geom)

  2. FROM geometries

  3. WHERE name = 'Point';

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

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

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


   
  1. SELECT ST_X(geom), ST_Y(geom)

  2. FROM geometries

  3. WHERE name = 'Point';

    纽约市地铁站(nyc_subway_stations)表是一个以表示的数据集。以下SQL查询将返回一个图形数据(在ST_AsText列中):


   
  1. SELECT name, ST_AsText(geom)

  2. FROM nyc_subway_stations

  3. LIMIT 1;

3.2、线串(Linestring)

_images/lines.png

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

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

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

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

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

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

    以下SQL查询将返回一个线串图形的信息(在ST_AsText列中)


   
  1. SELECT ST_AsText(geom)

  2. FROM geometries

  3. WHERE name = 'Linestring';

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

  • ST_Length(geometry)    ——    返回线串的长度
  • ST_StartPoint(geometry)    ——    将线串的第一个坐标作为点返回
  • ST_EndPoint(geometry)    ——    将线串的最后一个坐标作为点返回
  • ST_NPoints(geometry)    ——    返回线串的坐标数量

    所以,我们的线串的长度为:


   
  1. SELECT ST_Length(geom)

  2. FROM geometries

  3. WHERE name = 'Linestring';

3.3、多边形(Polygon)

_images/polygons.png

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

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

    以下SQL查询将返回两个多边形图形的信息(在ST_AsText列中):


   
  1. SELECT ST_AsText(geom)

  2. FROM geometries

  3. WHERE name LIKE 'Polygon%';

    注意:我们不是在WHERE子句中使用"="符号,而是使用LIKE运算符执行字符串匹配操作。你可能习惯使用"*"符号作为模式匹配中的单字符或多字符匹配,但在SQL中,使用"%"符号和LIKE运算符来告诉系统执行全局匹配。

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

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

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

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


   
  1. SELECT name, ST_Area(geom)

  2. FROM geometries

  3. WHERE name LIKE 'Polygon%';

    请注意,带多边形的面积是多边形外环的面积(10 x 10正方形)减去的面积(1 x 1正方形)

3.4、集合(Collection)

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

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

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

    集合对于将真实世界的对象直接建模为空间对象非常有用。例如,如何对被路权路权指交通参与者的权利)分割的多个道路部分进行建模?答案是将其作为MultiPolygon,其组成部分位于路权的两侧。

_images/collection2.png

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


   
  1. SELECT name, ST_AsText(geom)

  2. FROM geometries

  3. WHERE name = 'Collection';

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

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

四、几何图形输入和输出

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

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

    ①Well-known text(WKT)

  • ST_GeomFromText(text, srid)    ——    返回geometry
  • ST_AsText(geometry)    ——    返回text
  • ST_AsEWKT(geometry)    ——    返回text

    ②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(KML)

  • 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()):


   
  1. SELECT encode(

  2. ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0,1 0)')),

  3. '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;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostGIS教程七:几何图形(Geometry) 的相关文章

随机推荐

  • caffe安装系列——安装OpenCV

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • 写递归函数的正确思维方法

    什么是递归 简单的定义 当函数直接或者间接调用自己时 xff0c 则发生了递归 说起来简单 但是理解起来复杂 因为递归并不直观 也不符合我们的思维习惯 相对于递归 我们更加容易理解迭代 因为我们日常生活中的思维方式就是一步接一步的 并且能够
  • PCL系列——拼接两个点云

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之移动立方体算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • 字节(Byte)与位(bit)、十进制与二进制的关系

    一 基本常识 数据存储是以 字节 xff08 Byte xff09 为单位 xff0c 数据传输大多是以 位 xff08 bit xff0c 又名 比特 xff09 为单位 xff0c 一个位就代表一个0或1 xff08 即二进制 xff0
  • ubuntu20.04配置TensorFlow-GPU版本+对应版本的cuda&cudnn

    ubuntu20 04配置TensorFlow GPU版本 43 对应版本的cuda amp cudnn 配置说明 操作系统是Ubuntu20 04 xff0c GPU是NVIDIA GeForce RTX 2080 Ti xff0c Py
  • 十四、Rust ORM 框架

    Rust 下的 orm xff0c 之前笔者介绍过 sqlx xff0c 但使用中发现 sqlx 在进行参数绑定时 xff0c 使用的是 宏 xff0c 在当前的 IDE 生态环境下 xff0c 有时不能很好的进行代码提示 xff0c 或代
  • mybatis源码之集成mybatis-plus源码

    本文将结合源码介绍mybatis plus的原理 xff0c 包括 xff1a BaseMapper APIMybatisSqlSessionFactoryBean类BaseMapper API Statement解析Wrapper查询构建
  • Jpa 插入更新如何过滤null值

    使用Jpa时 xff0c 默认的save方法会将entity中null的值也更新到数据库 xff0c 这对与存在默认值或者更新接口将直接导致错误的记录产生 xff0c 那么如何解决这个问题 xff1f Hibernate提供了两个注解 64
  • 一个奇怪的java.lang.IncompatibleClassChangeError异常

    解决方法就是替换jdk版本 xff0c 下面都是废话 最近项目进行了一次小更新 xff0c 添加了一个很小很小的功能 xff0c 结果运行一段时间后莫名出现java lang IncompatibleClassChangeError xff
  • nginx的proxy_pass最后反斜杠/的问题

    如果只是host xff0c 如http host 带 xff1a 用代理的内容替换掉匹配的路径 不带 xff1a 拼接上匹配的路径 2 xff1a 如果是子路径 xff0c 如http host func 带和不带 xff1a 用代理的内
  • gitlab修改克隆地址

    1 修改gitlab yml文件 xff0c 修改gitlab下的host和port vi opt gitlab embedded service gitlab rails config gitlab yml 修改完成后执行gitlab c
  • 结构体成员——数组或指针

    结构体成员是C类型的字符数组 表示字符串时 c语言中没有字符串类型 xff0c 只能使用字符数组表示字符串 当定义结构体时 xff0c 成员是字符数组时 xff0c 在外部给该成员赋值 xff0c 不能使用 结构体把变量名 成员名 61 3
  • C++遍历输出enum枚举类型

    enum DAY MON TUE WED THU FRI SAT SUN 问题 如果使用如下方式来遍历 xff0c 则编译器会报类型转换失败错误 xff0c 因为enum类型没有 43 43 运算符 xff0c 也不支持 43 运算 for
  • Kali Linux

    为什么我输入git clone 43 网址显示无法访问啊
  • Android自定义标题栏异常You cannot combine custom titles with other title features

    我们在使用自定义标题栏时 xff0c 一般的写法基本上是下面几步 requestWindowFeature Window FEATURE CUSTOM TITLE setContentView R layout activity test
  • Kotlin中使用Dagger2 可能导致错误"Dagger does not support injection into private fields"

    Kotlin 生成 java文件时属性默认为 private xff0c 给属性添加 64 JvmField 声明可以转成 public class User var name String 61 null val age Int 61 2
  • [linux]ubuntu22安装mysql5.7.40

    导语 xff1a ubuntu22 04 强制安装mysql5 7 40 安装完安装其他apt依赖的时候 可能会造成mysql出问题 最好还是离线环境用 apt update apt get install zip y cd var rm
  • winxp 远程rdp 连接 Ubuntu10.10-再次远程登陆失败 (二)

    在文章winxp 远程rdp 连接 Ubuntu10 10 一 操作完成 xff0c 并且进行第一成功登陆之后 xff0c 退出 xff08 注销 直接关闭mstsc退出按钮 xff09 远程连接之后 xff0c 重新登录出现 xff0c
  • PostGIS教程七:几何图形(Geometry)

    目录 一 介绍 二 元数据表 三 表示真实世界的对象 3 1 点 xff08 Points xff09 3 2 线串 xff08 Linestring xff09 3 3 多边形 xff08 Polygon xff09 3 4 集合 xff