PostGIS 是一种扩展功能,适用于 PostgreSQL 对象关系数据库系统,它允许将 GIS(地理信息系统)对象存储在数据库中。PostGIS 包含对基于 GiST 的 R-Tree 空间索引的支持,以及用于分析和处理 GIS 对象的功能。
本手册的版本是 3.5.0alpha1
本作品已获得创作共用署名-相同方式共享 3.0 许可。请随意使用这份材料,任何您喜欢的方式,但我们要求您将荣誉归于 PostGIS 项目,尽可能提供返回https://postgis.net的链接。
PostGIS是PostgreSQL关系数据库的空间扩展。由Refractions Research Inc创建,作为空间数据库技术的研究项目。Refractions是一家位于加拿大不列颠哥伦比亚省维多利亚市的GIS和数据库咨询公司,专门从事数据集成和定制软件开发。
PostGIS现在是OSGeo基金会的一个项目。世界各地大量FOSS4G开发商和公司从PostGIS的功能和多样性中受益匪浅,他们正在开发和资助PostGIS。
PostGIS 项目开发小组为 PostGIS 创建了一个数据源,以便在 OGC 和 SQL/MM 空间标准、高级拓扑构建(覆盖范围、表面、网络)、用于查看和编辑 GIS 数据的桌面用户界面工具的数据源以及基于 Web 的访问工具的数据源等领域提供重要的 GIS 功能。我们将提供支持和增强功能,以更好地做出响应。
PostGIS项目指导委员会(PSC)负责协调总体方向、发布周期、文档和支持活动。委员会还对涉及 PostGIS 的其他问题进行投票,例如整体用户支持、接受和应用 PostGIS 社区的补丁、开发人员提交访问权限、新委员会成员以及重要的 API 更改。
MVT 功能、纠错、性能和稳定性改进、GitHub 策展、PostGIS 和 PostgreSQL 版本调整
持续集成和网站维护,Windows生产和实验构建,文档编写,将PostGIS与PostgreSQL发布版本对齐,X3D支持,TIGER地理编码支持,管理功能。
索引改进,故障修复和几何/地理函数改进,SFCGAL,栅格,GitHub维护,以及持续集成维护。
PostGIS项目的联合创始人。全面的错误修复、地理功能、地理和几何索引(2D、3D、n 维索引和任何空间索引)、几何内部、GEOS功能集成以及与GEOS版本的协调、与PostgreSQL版本的协调、加载器/转储程序、shapefile GUI 加载器。
错误修复和维护,持续集成维护,Git镜像管理,管理功能,集成新的GEOS功能并与GEOS发布对齐,拓扑支持,以及栅格框架和底层API函数。
距离函数增强(包括 3D 距离和关系函数)和附加功能、Tiny WKB (TWKB) 输出格式和一般用户支持
SFCGAL 的增强和维护以及持续集成支持
几何聚类功能添加、其他几何算法增强、GEOS 增强和一般用户支持
GEOS 增强功能和文档
MapBox 矢量瓦片、GeoBuf 和 Flatgeobuf 函数。Gitea 测试和 GitLab 实验。
几何处理,PostgreSQL GiST,常见纠错
前 PSC 成员。 栅格,与GDAL集成,栅格加载器,用户支持,常见纠错,在各种操作系统(Slackware,Mac,Windows等)上进行测试
前 PSC 成员。 纠错和维护活动、空间索引选择性和绑定、加载器/转储程序和 shapefile GUI 加载器调整、新功能集成和增强。
栅格开发,GDAL驱动功能,加载器
(荣誉)XML(KML, GML)/GEOJSON 输入/输出函数、3D 对应和纠错。
前 PSC 成员。一般开发,站点和构建机器人维护,OSGeo孵化管理
CMake 对 PostGIS 的支持、原始栅格加载器的构造以及 Python 版本的低级栅格 API 函数
前 PSC 成员。文档和文档辅助、Buildbot 维护、PostGIS 新闻组中的高级用户支持以及增强的 PostGIS 维护功能。
PostGIS的原始开发者/联合创始人。编写了服务器端对象、索引绑定和许多服务器端分析函数。
shapefile loader/dumper 的原始开发人员。
持续维护和开发核心功能。增强的曲线功能。形状文件 GUI 加载器。
后 GIS 栅格实现设计。 光栅架构、原型设计和编程辅助
栅格开发(主要是地图代数分析函数)
Alex Bodnaru | Gino Lucrezi | Matthias Bay |
Alex Mayrhofer | Greg Troxel | Maxime Guillaud |
Andrea Peri | Guillaume Lelarge | Maxime van Noppen |
Andreas Forø Tollefsen | Giuseppe Broccolo | Maxime Schoemans |
Andreas Neumann | Han Wang | Michael Fuhr |
Andrew Gierth | Hans Lemuet | Mike Toews |
Anne Ghisla | Haribabu Kommi | Nathan Wagner |
Antoine Bajolet | Havard Tveite | Nathaniel Clay |
Arthur Lesuisse | IIDA Tetsushi | Nikita Shulga |
Artur Zakirov | Ingvild Nystuen | Norman Vine |
Barbara Phillipot | Jackie Leng | Patricia Tozer |
Ben Jubb | James Addison | Rafal Magda |
Bernhard Reiter | James Marca | Ralph Mason |
Björn Esser | Jan Katins | Rémi Cura |
Brian Hamlin | Jan Tojnar | Richard Greenwood |
Bruce Rindahl | Jason Smith | Robert Coup |
Bruno Wolff III | Jeff Adams | Roger Crew |
Bryce L. Nordgren | Jelte Fennema | Ron Mayer |
Carl Anderson | Jim Jones | Sam Peters |
Charlie Savage | Joe Conway | Sebastiaan Couwenberg |
Chris Mayo | Jonne Savolainen | Sergei Shoulbakov |
Christian Schroeder | Jose Carlos Martinez Llari | Sergey Fedoseev |
Christoph Berg | Jörg Habenicht | Shinichi Sugiyama |
Christoph Moench-Tegeder | Julien Rouhaud | Shoaib Burq |
Dane Springmeyer | Kashif Rasul | Silvio Grosso |
Dapeng Wang | Klaus Foerster | Stefan Corneliu Petrea |
Daryl Herzmann | Kris Jurka | Steffen Macke |
Dave Fuhry | Laurenz Albe | Stepan Kuzmin |
David Garnier | Lars Roessiger | Stephen Frost |
David Skea | Leo Hsu | Steven Ottens |
David Techer | Loic Dachary | Talha Rizwan |
Dmitry Vasilyev | Luca S. Percich | Teramoto Ikuhiro |
Eduin Carrillo | Lucas C. Villa Real | Tom Glancy |
Esteban Zimanyi | Maria Arias de Reyna | Tom van Tilburg |
Eugene Antimirov | Marc Ducobu | Victor Collod |
Even Rouault | Mark Sondheim | Vincent Bre |
Florian Weimer | Markus Schaber | Vincent Mora |
Frank Warmerdam | Markus Wanner | Vincent Picavet |
George Silva | Matt Amos | Volf Tomáš |
Gerald Fenoy | Matt Bretl | Zuo Chenwei |
这些公司为PostGIS项目贡献了开发人员时间,托管或直接资金。按字母顺序排列:
众筹活动是我们为了获得急需的功能而开展的活动,这些功能可以为大量的人提供服务。每个活动都专门针对一个特定功能或一组功能。每个赞助商都会投入所需资金的一小部分,并且有足够的个人/组织捐款,我们就有资金来支付将帮助许多人的工作。 如果您对某个功能有想法,并且认为许多其他人愿意共同资助,请将您的想法发布到 PostGIS 新闻组,我们可以共同实现它。
PostGIS 2.0.0 是我们尝试此策略的第一个版本。我们使用了PledgeBank,并从中举办了两次成功的活动。
postgistopology-有10位赞助商每人捐赠了250美元来构建 "toTopoGeometry" 函数并加强2.0.0版本中的拓扑支持。这一目标已经实现。
postgis64windows-大约20位赞助商每人捐赠了100美元,用以支付在Windows上解决PostGIS 64位问题所需的工作。这一目标已经实现。
GEOS几何操作库
GDAL地理空间数据抽象库用于支持 PostGIS 2 中引入的大部分栅格功能。同样,GDAL 中支持 PostGIS 所需的改进也将回馈给 GDAL 项目。
PROJ地图投影库
最后但同样重要的是,PostGIS所依赖的庞然大物PostgreSQL。PostGIS的速度和灵活性很大程度上得益于PostgreSQL提供的可扩展性、强大的查询规划器、GIST索引以及丰富的SQL功能。
本章介绍安装 PostGIS 所需的步骤。
如果所有依赖项都在路径中,请按如下方式编译:
tar -xvzf postgis-3.5.0alpha1.tar.gz cd postgis-3.5.0alpha1 ./configure make make install
安装 PostGIS 后,您需要使每个数据库可用(Section 3.3, “创建空间数据库”)或升级它(Section 3.4, “升级空间数据库”)。
![]() | |
现在许多操作系统都包含 PostgreSQL/PostGIS 的预构建包。 在许多情况下,只有当您想要最前沿的版本或者您是软件包维护者时才需要编译。 本节提供一般编译过程。 如果您正在针对Windows或其他操作系统进行编译,则可以在PostGIS 用户编译指南或PostGIS开发Wiki中找到更详细的帮助。 可以在 PostGIS 预构建包中找到许多操作系统的PostGIS 预构建包列表 如果您是 Windows 用户,您可以通过 Stackbuilder 或 PostGIS Windows下载站点获得稳定的版本。我们还有非常前沿的Windows实验性版本,通常每周构建一次,或者在有令人兴奋的新变化发生时构建。你可以使用这些版本来尝试正在进行中的PostGIS发布 |
PostGIS 模块是PostgreSQL服务的扩展。 PostGIS3.5.0alpha1 需要完整的 PostgreSQL 服务器标头进行编译。你可以在PostgreSQL 12 - 17之间构建。 不支持旧版本的PostgreSQL。
如果您没有安装 PostgreSQL,请参阅PostgreSQL安装指南。它位于 https://www.postgresql.org 。
![]() | |
对于GEOS功能,当您安装PostgresQL时,您可能需要将PostgreSQL显式链接到标准C++库: LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE] 这是解决与旧开发工具不正常交互的虚假C++异常的一种变通方法。如果你遇到奇怪的问题(例如,后端意外关闭或类似的问题),尝试这个技巧。当然,这将需要重新从头编译你的PostgreSQL。 |
下一步是概述 PostGIS 源配置和编译。 这些是为Linux用户编写的,不适用于Windows或Mac。
从下载站点 https://download.osgeo.org/postgis/source/postgis-3.5.0alpha1.tar.gz 获取源代码的存档
wget https://download.osgeo.org/postgis/source/postgis-3.5.0alpha1.tar.gz tar -xvzf postgis-3.5.0alpha1.tar.gz cd postgis-3.5.0alpha1
这将在当前工作目录中创建一个名为 postgis-3.5.0alpha1
的目录。
或者从 git 存储库 https://git.osgeo.org/gitea/postgis/postgis/ 中查看它。
git clone https://git.osgeo.org/gitea/postgis/postgis.git postgis cd postgis sh autogen.sh
切换到新创建的 postgis
目录以继续安装。
./configure
要构建和使用 PostGIS,您需要:
不可缺少
PostgreSQL12 - 16。需要完整安装 PostgreSQL(包括服务器标头)。PostgreSQL可从https://www.postgresql.org 获取。
请参阅 https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS 中完整的 PosgreSQL/PostGIS 和 PostGIS/GEOS 支持表
GNU C 编译器 (gcc
)。其他一些 ANSI C 编译器也可以用来编译PostGIS,但使用gcc
编译时我们发现问题要少得多。
GNU Make(gmake
or make
)。对于许多系统,GNU make
是 make 的默认版本。通过调用make -v
检查版本。 其他版本的make
可能无法正确处理 PostGIS Makefile
。
Proj重投影库。需要项目 6.1 或更高版本。Proj 库用于在 PostGIS 中提供坐标重投影支持。Proj 可以从 https://proj.org/ 下载。
GEOS 几何库,版本 3.8.0 或更高版本,但为了充分利用所有新的函数和特性,需要使用 GEOS 3.12+。您可以从以下链接下载 GEOS: https://libgeos.org 。
LibXML2、2.5.x 或更高版本。 目前,导入函数(ST_GeomFromGML和ST_GeomFromKML)使用 LibXML2。 您可以从 https://gitlab.gnome.org/GNOME/libxml2/-/releases 下载 LibXML2。
JSON-C 0.9或更高版本。JSON-C 目前用于按 ST_GeomFromGeoJson 导入 GeoJSON。 JSON-C 可从 https://github.com/json-c/json-c/releases/ 下载。
GDAL,版本 2+ 是必需的,版本 3+ 是首选。 这是栅格支持所必需的。https://gdal.org/download.html。
要使用PostgreSQL+JIT进行编译,需要LLVM版本6或更高版本。请参阅 https://trac.osgeo.org/postgis/ticket/4125。
可选择的
GDAL(伪可选)仅当您不需要栅格时才可以将其省略。另请确保启用您要使用的驱动程序,如Section 3.2, “配置栅格支持”中所述。
GTK(需要 GTK+2.0, 2.8+)。用于编译shp2pgsql-gui,一个shapefile loader。它位于 http://www.gtk.org/ 。
SFCGAL,版本 1.3.1(或更高版本),建议使用 1.4.1 或更高版本,以能够使用所有功能。SFCGAL 可用于为 PostGIS 提供额外的 2D 和 3D 高级分析功能,详情请参考 Chapter 8, SFCGAL函数参考。此外,还可以使用 SFCGAL 替代 GEOS 来执行某些由两个后端都提供的 2D 函数(例如 ST_Intersection 或 ST_Area)。如果已安装 SFCGAL,则用户可以通过 PostgreSQL 配置变量 postgis.backend
来控制使用哪个后端(默认为 GEOS)。注意:SFCGAL 1.2 至少需要 CGAL 4.3 和 Boost 1.54(参见:https://sfcgal.org) https://gitlab.com/sfcgal/SFCGAL/。
要构建Section 12.1, “地址标准化工具”,您还需要PCREhttp://www.pcre.org(通常安装在 nix 系统上)。检测到 PCRE 库后,将自动构建Section 12.1, “地址标准化工具” 。 或者,指定它在配置期间有效。--with-pcre-dir=/path/to/pcre
。
要启用ST_AsMVT,您需要ProtoBuf-C库(运行时)和ProtoC-C编译器(构建时)。要检查 protobuf-c 的正确最低版本,需要 pkg-config。 参见protobuf-c。默认情况下,PostGIS 使用 Wagyu 快速评估 MVT 多边形,但需要 C++11 编译器。 使用 CXXFLAGS 使用您用于 PostgreSQL 安装的相同编译器。如果要禁用此功能并改用 GEOS,请在配置期间指定它。 --without-wagyu
。
CUnit(CUnit
)。 这是回归测试所需要的。 http://cunit.sourceforge.net/
DocBook (xsltproc
)构建文档需要。Docbook可从 http://www.docbook.org/ 获取。
DBLatex (dblatex
)需要以 PDF 格式构建文档。它位于 http://dblatex.sourceforge.net/ 。
ImageMagick (convert
)生成文档中使用的图像。它位于 http://www.imagemagick.org/ 。
与大多数 Linux 安装一样,第一步是生成一个将用于构建源代码的 Makefile。 这是通过 shell 脚本完成的
./configure
如果未提供任何参数,此命令将自动查找在系统上构建 PostGIS 源代码所需的组件和库。./configure 是一种常见的用法,但它接受一些参数,以防您在非标准位置拥有必要的库或程序。
以下列表显示了常用参数:有关完整列表,请使用 --help 或 --help=short参数。
--with-library-minor-version
从 PostGIS 3.0 开始,默认生成的库文件将不再将次要版本作为文件名的一部分。 这意味着所有 PostGIS 3 库都将以 postgis-3
结尾。 这样做是为了使 pg_upgrade 更容易,缺点是您只能在服务器中安装一个版本的 PostGIS 3 系列。 要获取文件的旧行为(包括次要版本):例如 postgis-3.0
将此开关添加到您的配置语句中。
--prefix=PREFIX
指定要安装 PostGIS 库和 SQL 脚本的位置。 默认情况下,它将与检测到的 PostgreSQL 安装位置相同。
![]() | |
此参数当前已损坏,只会安装在PostgreSQL的位置。有关此错误的跟踪,请参阅 http://trac.osgeo.org/postgis/ticket/635 。 |
--with-pgconfig=FILE
PostgreSQL有一个名为pg_config的实用程序,使PostGIS等扩展能够定位PostgreSQL安装目录。使用此参数 (--with-pgconfig=/path/to/pg_config)可以手动指定 PostGIS 的特定 PostgreSQL 的安装目录。
--with-gdalconfig=FILE
GDAL是必需的库,提供栅格支持 gdal-config所需的功能,以使软件安装能够找到 GDAL装目录。使用此参数 (--with-gdalconfig=/path/to/gdal-config)手动指定 PostGIS 将针对其构建的特定 GDAL的安装目录。
--with-geosconfig=FILE
作为一个基本的几何库,GEOS 有一个名为 geos-config的实用程序,它会告诉您在安装软件时在哪里安装 GEOS。使用此参数 (--with-geosconfig=/path/to/geos-config) 手动指定要用于 PostGIS 构建的特定 GEOS的安装目录。
--with-xml2config=FILE
LibXML 是执行 GeomFromKML/GML 过程所需的库。通常情况下,如果您已安装 libxml,它将被找到,但如果没有或者您想使用特定版本,您需要指定一个特定的 xml2-config
配置文件,以便让软件安装程序找到 LibXML 安装目录。使用这个参数 (>--with-xml2config=/path/to/xml2-config) 来手动指定 PostGIS 将构建的特定 LibXML 安装。
--with-projdir=DIR
Proj是PostGIS必不可少的投影库。使用此参数 (--with-projdir=/path/to/projdir)手动指定要用于 PostGIS 构建的特定 Proj 的安装目录。
--with-libiconv=DIR
iconv的安装目录。
--with-jsondir=DIR
JSON-C 是 MIT 许可的 JSON 库,是 PostGIS ST_GeomFromJSON 所必需的。使用此参数 (--with-jsondir=/path/to/jsondir) 手动指定要用于 PostGIS 构建的特定 JSON-C的安装目录。
--with-pcredir=DIR
PCRE 是 address_standardizer 扩展所需的 BSD 许可的 Perl 兼容正则表达式库。使用此参数 (--with-pcredir=/path/to/pcredir) 手动指定 PostGIS 将构建的特定 PCRE 的安装目录。
--with-gui
编译数据导入GUI(需要 GTK+2.0)。此参数为 shp2pgsql 创建一个名为 shp2pgsql-gui 的图形用户界面。
--without-raster
在没有栅格功能的情况下进行编译。
--without-topology
在没有拓扑支持的情况下进行编译。 拓扑所需的所有逻辑都是在postgis-3.5.0alpha1 库中创建的,因此没有关联的库。
--with-gettext=no
默认情况下,会检测 gettext 并使用它进行编译,但如果在导致加载程序损坏的不兼容问题下运行,则此命令可以禁用它。使用此功能的配置可以解决的问题示例,请参见http://trac.osgeo.org/postgis/ticket/748。 注意:关闭此功能不会消除许多功能。 它用于 GUI 加载器中的内部帮助/标签功能,这些功能尚未记录,处于实验阶段。
--with-sfcgal=PATH
默认情况下,如果没有此开关,PostGIS 将不会安装 sfcgal 支持。 PATH
是一个可选参数,允许指定 sfcgal-config 的备用 PATH。
--without-phony-revision
禁用 postgis_revision.h 更新以匹配 Git 存储库中的当前 HEAD。
![]() | |
如果要从代码存储库 获取PostGIS,请先运行以下脚本 ./autogen.sh 此脚本生成配置脚本。这用于自定义 PostGIS 安装。 如果要获取 PostGIS 作为存档文件,则无需./autogen.sh,因为 配置已经生成。 |
生成Makefile后,构建PostGIS就像运行命令一样简单
make
如果在输出的最后一行看到“PostGIS was built successfully. Ready to install.
”,则表示您已完成
从 PostGIS v1.4.0 开始,所有函数都有从文档生成的注释。如果您希望稍后将这些注释安装到空间数据库中,请运行需要的 docbook 命令。postgis_comments.sql 和其他包注释文件 raster_comments.sql、topology_comments.sql 也打包在 doc 文件夹中的 tar.gz 中,因此如果从 tar 包中安装,则无需进行注释。 注释包含在 CREATE EXTENSION 安装中。
make comments
它是在PostGIS 2.0中引入的。 生成适合快速参考和讲义的HTML备忘单,供正在学习的人使用。 xsltproc 是必需的,生成 4 个文件。topology_cheatsheet.html
,tiger_geocoder_cheatsheet.html
,raster_cheatsheet.html
, postgis_cheatsheet.html
预构建的HTML和PDF版本可以在PostGIS / PostgreSQL学习指南中找到
make cheatsheets
如果您使用的是 PostgreSQL 9.1 或更高版本,则会自动构建并安装PostGIS 扩展。
如果要从源存储库构建,则必须先构建函数描述。这些是在安装文档手册时构建的。 您也可以手动安装:
make comments
如果从存档文件构建,则其中一些注释文件已经构建,因此无需构建注释。
如果您针对 PostgreSQL 9.1 进行构建,则应在 make 安装过程中自动构建扩展。如果需要,可以从扩展文件夹生成,或者根据需要在另一台服务器上复制该文件。
cd extensions cd postgis make clean make export PGUSER=postgres #overwrite psql variables make check #to test before install make install # to test extensions make check RUNTESTFLAGS=--extension
![]() | |
|
无论操作系统如何,扩展文件在同一版本的 PostGIS 中始终相同。只要已安装 PostGIS 二进制文件,就可以将扩展文件从一个操作系统复制到另一个操作系统。
如果您想在与您的开发不同的单独服务器上手动安装扩展,您需要将扩展文件夹中的以下文件复制到 PostgreSQL 安装的 PostgreSQL/share/extension
文件夹中 常规 PostGIS 所需的二进制文件(如果服务器上还没有它们)。
这些控制文件表示信息,例如要安装的扩展版本(如果未指定)。 postgis.control,postgis_topology.control
。
每个扩展名的 /sql 文件夹中的所有文件。请注意,必须复制到 PostgreSQL 共享/扩展文件夹的顶层。extensions/postgis/sql/*.sql
, extensions/postgis_topology/sql/*.sql
完成这一步后,你应该在 PgAdmin> 中看到 postgis
、postgis_topology
作为可用的扩展。
如果使用 psql,则可以运行以下查询来验证是否已安装扩展:
SELECT name, default_version,installed_version FROM pg_available_extensions WHERE name LIKE 'postgis%' or name LIKE 'address%'; name | default_version | installed_version ------------------------------+-----------------+------------------- address_standardizer | 3.5.0alpha1 | 3.5.0alpha1 address_standardizer_data_us | 3.5.0alpha1 | 3.5.0alpha1 postgis | 3.5.0alpha1 | 3.5.0alpha1 postgis_raster | 3.5.0alpha1 | 3.5.0alpha1 postgis_sfcgal | 3.5.0alpha1 | postgis_tiger_geocoder | 3.5.0alpha1 | 3.5.0alpha1 postgis_topology | 3.5.0alpha1 | (6 rows)
如果您正在查询的数据库中安装了扩展程序,您将在 installed_version
列中看到提及。 如果您没有收到任何记录,则意味着您的服务器上根本没有安装 postgis 扩展。 PgAdmin III 1.14+ 还将在数据库浏览器树的扩展
部分中提供此信息,甚至允许通过右键单击进行升级或卸载。
如果您有有效的扩展,则可以使用 pgAdmin 扩展接口或通过运行以下 SQL 将 PostGIS 扩展安装到所选数据库:
CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; CREATE EXTENSION postgis_sfcgal; CREATE EXTENSION fuzzystrmatch; --needed for postgis_tiger_geocoder --optional used by postgis_tiger_geocoder, or can be used standalone CREATE EXTENSION address_standardizer; CREATE EXTENSION address_standardizer_data_us; CREATE EXTENSION postgis_tiger_geocoder; CREATE EXTENSION postgis_topology;
在 psql 中,你可以使用以下命令来查看你已安装的版本以及它们所在的模式。
\connect mygisdb \x \dx postgis*
List of installed extensions -[ RECORD 1 ]------------------------------------------------- Name | postgis Version | 3.5.0alpha1 Schema | public Description | PostGIS geometry, geography, and raster spat.. -[ RECORD 2 ]------------------------------------------------- Name | postgis_raster Version | 3.0.0dev Schema | public Description | PostGIS raster types and functions -[ RECORD 3 ]------------------------------------------------- Name | postgis_tiger_geocoder Version | 3.5.0alpha1 Schema | tiger Description | PostGIS tiger geocoder and reverse geocoder -[ RECORD 4 ]------------------------------------------------- Name | postgis_topology Version | 3.5.0alpha1 Schema | topology Description | PostGIS topology spatial types and functions
![]() | |
无法直接备份扩展表 |
如果你在没有使用扩展系统的情况下安装了3.5.0alpha1版本,你可以通过运行以下命令将其转换为基于扩展的安装方式,以将函数打包到各自的扩展中。在PostgreSQL 13中已移除了使用`unpackaged`安装方式,因此建议在升级到PostgreSQL 13之前切换到扩展构建方式。
CREATE EXTENSION postgis FROM unpackaged; CREATE EXTENSION postgis_raster FROM unpackaged; CREATE EXTENSION postgis_topology FROM unpackaged; CREATE EXTENSION postgis_tiger_geocoder FROM unpackaged;
要测试 PostGIS,请运行以下命令
make check
此命令使用针对实际 PostgreSQL 数据库生成的库执行各种检查和回归测试。
![]() | |
如果您使用非标准 PostgreSQL、GEOS 或 Proj 位置配置 PostGIS,则可能需要将它们的库位置添加到 |
![]() | |
目前,make check 依赖于 |
如果成功,make check 将产生近 500 个测试的输出。结果将类似于 以下(下面省略了许多行):
CUnit - A unit testing framework for C - Version 2.1-3 http://cunit.sourceforge.net/ . . . Run Summary: Type Total Ran Passed Failed Inactive suites 44 44 n/a 0 0 tests 300 300 300 0 0 asserts 4215 4215 4215 0 n/a Elapsed time = 0.229 seconds . . . Running tests . . . Run tests: 134 Failed: 0 -- if you build with SFCGAL . . . Running tests . . . Run tests: 13 Failed: 0 -- if you built with raster support . . . Run Summary: Type Total Ran Passed Failed Inactive suites 12 12 n/a 0 0 tests 65 65 65 0 0 asserts 45896 45896 45896 0 n/a . . . Running tests . . . Run tests: 101 Failed: 0 -- topology regress . . . Running tests . . . Run tests: 51 Failed: 0 -- if you built --with-gui, you should see this too CUnit - A unit testing framework for C - Version 2.1-2 http://cunit.sourceforge.net/ . . . Run Summary: Type Total Ran Passed Failed Inactive suites 2 2 n/a 0 0 tests 4 4 4 0 0 asserts 4 4 4 0 n/a
postgis_tiger_geocoder
and address_standardizer
扩展目前仅支持标准的 PostgreSQL 安装检查。要测试这些,请使用以下命令。注意:如果您已经在 PostGIS 代码文件夹的根目录中进行了安装,则不需要进行安装。
对于address_standardizer:
cd extensions/address_standardizer make install make installcheck
输出应类似于以下内容:
============== dropping database "contrib_regression" ============== DROP DATABASE ============== creating database "contrib_regression" ============== CREATE DATABASE ALTER DATABASE ============== running regression test queries ============== test test-init-extensions ... ok test test-parseaddress ... ok test test-standardize_address_1 ... ok test test-standardize_address_2 ... ok ===================== All 4 tests passed. =====================
对于 tiger 地理编码器,请确保您的 PostgreSQL 实例中具有可用的 postgis 和 fuzzystrmatch 扩展。如果您在address_standardizer支持下构建了postgis,address_standardizer测试也将启动:
cd extensions/postgis_tiger_geocoder make install make installcheck
输出应类似于以下内容:
============== dropping database "contrib_regression" ============== DROP DATABASE ============== creating database "contrib_regression" ============== CREATE DATABASE ALTER DATABASE ============== installing fuzzystrmatch ============== CREATE EXTENSION ============== installing postgis ============== CREATE EXTENSION ============== installing postgis_tiger_geocoder ============== CREATE EXTENSION ============== installing address_standardizer ============== CREATE EXTENSION ============== running regression test queries ============== test test-normalize_address ... ok test test-pagc_normalize_address ... ok ===================== All 2 tests passed. =====================
要安装 PostGIS,请运行以下命令
make install
这会将 PostGIS 安装文件复制到由--prefix参数指定的相应子目录。以下是值得注意的子目录:
加载程序和转储程序二进制文件安装在 [prefix]/bin
。
SQL 文件(例如 postgis.sql
)安装在 [prefix]/share/contrib
中。
PostGIS 库安装在[prefix]/lib
。
如果之前生成了make 注释,请运行以下命令来安装这些 SQL 文件:postgis_comments.sql
,raster_comments.sql
make comments-install
![]() | |
|
address_standardizer
扩展是一个单独的包,需要单独下载。它包含在 PostGIS 2.2 中。有关address_standardize可以执行的操作以及如何配置它的其他信息,请参见Section 12.1, “地址标准化工具”。
该标准化器可以与 PostGIS 打包的 Tiger 地理编码器扩展结合使用,作为所讨论的 Normalize_Address 的替代品。 要用作替代品,请参阅Section 2.4.2, “将地址标准化器扩展与 Tiger 地理编码器结合使用”。 您还可以将其用作您自己的地理编码器的构建块,或使用它来标准化您的地址,以便更轻松地比较地址。
地址标准化器依赖于 PCRE,它通常已安装在许多 Nix 系统上,但您可以在以下位置下载最新版本:http://www.pcre.org。如果在Section 2.2.3, “构建配置”期间找到 PCRE,则将自动构建地址标准化器扩展。如果您想使用自定义 pcre 安装,请传递到 --with-pcredir=/path/to/pcre
,其中/path/to/pcre
是 pcre include 和 lib 目录的根文件夹。
在 Windows 上,PostGIS 2.1 及更高版本附带了地址标准化扩展,因此您无需编译即可立即使用。直接进入CREATE EXTENSION
步骤。
安装后,可以连接到目标数据库并执行以下 SQL:
CREATE EXTENSION address_standardizer;
对于下面的测试,我们不需要rules、gaz、lex 表
SELECT num, street, city, state, zip FROM parse_address('1 Devonshire Place PH301, Boston, MA 02109');
输出应类似于以下内容
num | street | city | state | zip -----+------------------------+--------+-------+------- 1 | Devonshire Place PH301 | Boston | MA | 02109
像Tiger地理编码器这样的附加组件可能未包含在您的PostGIS分发中。如果您缺少tiger 地理编码器扩展或想要比您的安装提供的更新版本,那么可以使用适用于您PostgreSQL版本的share/extension/postgis_tiger_geocoder.*
文件,这些文件可以从Windows未发布版本部分的软件包中获取。尽管这些软件包是为Windows准备的,但postgis_tiger_geocoder扩展文件将在任何操作系统上工作,因为该扩展只是一个SQL/plpgsql扩展。
出于本主题的目的,我们假设您已经为 PostgreSQL 安装了postgis_tiger_geocoder扩展。
使用 psql、pgAdmin 或其他工具连接到数据库,然后运行以下 SQL 命令: 如果要在已有 PostGIS 的数据库上进行安装,则无需执行第一步。 如果已安装扩展,则不需要执行第二步fuzzystrmatch
。
CREATE EXTENSION postgis; CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION postgis_tiger_geocoder; --this one is optional if you want to use the rules based standardizer (pagc_normalize_address) CREATE EXTENSION address_standardizer;
如果已安装postgis_tiger_geocoder扩展,并且只想更新到最新版本,请运行:
ALTER EXTENSION postgis UPDATE; ALTER EXTENSION postgis_tiger_geocoder UPDATE;
如果生成自己的条目或对tiger.loader_platform
和tiger.loader_variables
进行更改,则可能需要更新它们。
若要验证安装是否成功,请在目标数据库中运行以下 SQL:
SELECT na.address, na.streetname,na.streettypeabbrev, na.zip FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;
输出应类似于以下内容
address | streetname | streettypeabbrev | zip ---------+------------+------------------+------- 1 | Devonshire | Pl | 02109
tiger.loader_platform
生成表的新记录,其中包含可执行文件或服务器的路径。
sh
作为在约定后生成名为 debbie 的配置文件的示例,请运行以下命令:
INSERT INTO tiger.loader_platform(os, declare_sect, pgbin, wget, unzip_command, psql, path_sep, loader, environ_set_command, county_process_command) SELECT 'debbie', declare_sect, pgbin, wget, unzip_command, psql, path_sep, loader, environ_set_command, county_process_command FROM tiger.loader_platform WHERE os = 'sh';
然后将declare_sect列中的路径编辑为适合Debbie 的pg、unzip、shp2pgsql、psql 等路径位置。
如果您不编辑此 loader_platform
表,它将仅包含项目的常见位置,并且您必须在生成脚本后编辑生成的脚本。
从 PostGIS 2.4.1 开始,邮政编码 5 位制表区域 zcta5
加载步骤已修改为加载当前 zcta5 数据,并且在启用时是Loader_Generate_Nation_Script 的一部分。默认情况下它是关闭的,因为它需要相当长的时间来加载(20 到 60 分钟),占用相当多的磁盘空间,并且不经常使用。
要启用它,请执行以下操作:
UPDATE tiger.loader_lookuptables SET load = true WHERE table_name = 'zcta520';
如果添加了边界过滤器并将其限制为边界内的 ZIP,则在存在 ZCTA5 的情况下将使用Geocode 函数。当返回的地址没有邮政编码时,将使用Reverse_Geocode函数,这通常发生在高速公路上的反向地理编码中。
如果您有到服务器的快速网络连接,请在服务器根目录或本地电脑上创建一个名为 gisdata
的文件夹。该文件夹是 Tiger 文件下载和处理的位置。 如果您对该文件夹位于服务器根目录不满意,或者只是想更改为不同的文件夹进行暂存,请编辑 tiger.loader_variables
表中的字段 staging_fold
。
gisdata
在该文件夹中创建一个名为 temp 的文件夹。或者,创建由staging_fold
指示的文件夹。 这是加载程序提取下载的 Tiger 数据的地方。
然后运行Loader_Generate_Nation_ScriptSQL 函数,确保使用自定义配置文件的名称并将脚本复制到 .sh 或 .bat 文件。例如,如果要使用新的配置文件加载国家/地区:
psql -c "SELECT Loader_Generate_Nation_Script('debbie')" -d geocoder -tA > /gisdata/nation_script_load.sh
运行命令行脚本以加载生成的国家/地区数据。
cd /gisdata sh nation_script_load.sh
运行国家/地区脚本后,将在架构中创建三个表来存储数据。 从 psql 或 pgAdmin 运行以下查询进行验证: tiger_data
SELECT count(*) FROM tiger_data.county_all;
count ------- 3235 (1 row)
SELECT count(*) FROM tiger_data.state_all;
count ------- 56 (1 row)
这将只包含数据,如果您标记了ZCTA5要加载
SELECT count(*) FROM tiger_data.zcta5_all;
count ------- 33931 (1 row)
默认情况下,不加载bg
, tract
, tabblock20
对应的表。这些表不被地理编码器使用,但被人们用来进行人口统计。如果您希望将它们作为状态加载的一部分进行加载,请运行以下语句来启用它们。
UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock20');
或者,可以使用Loader_Generate_Census_Script加载状态数据,然后仅加载这些表
对于要加载数据的每个状态,请使用Loader_Generate_Script创建状态脚本。
![]() | |
在完成加载国家/地区数据之前,请勿创建状态脚本。这是因为状态脚本使用国家/地区脚本中加载的国家/地区列表。 |
psql -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'debbie')" -d geocoder -tA > /gisdata/ma_load.sh
运行生成的命令行脚本。
cd /gisdata sh ma_load.sh
在所有数据完成加载或到达断点后,最好对所有tiger表运行分析以更新其状态(包括继承的表)
SELECT install_missing_indexes(); vacuum (analyze, verbose) tiger.addr; vacuum (analyze, verbose) tiger.edges; vacuum (analyze, verbose) tiger.faces; vacuum (analyze, verbose) tiger.featnames; vacuum (analyze, verbose) tiger.place; vacuum (analyze, verbose) tiger.cousub; vacuum (analyze, verbose) tiger.county; vacuum (analyze, verbose) tiger.state; vacuum (analyze, verbose) tiger.zcta5; vacuum (analyze, verbose) tiger.zip_lookup_base; vacuum (analyze, verbose) tiger.zip_state; vacuum (analyze, verbose) tiger.zip_state_loc;
您可能认为有问题的众多事情之一是在地理编码之前进行格式化地址的Normalize_Address 函数。地址规范化远非完美,修补它可能会占用大量资源。 因此,我们将其集成到其他项目中,具有更好的地址标准化引擎。要使用此新的地址标准化,请按照Section 2.3, “安装和使用地址标准化工具”中所述编译扩展并将其安装在数据库中。
在安装了 postgis_tiger_geocoder
的同一数据库中安装此扩展程序后,就可以使用 Pagc_Normalize_Address 代替 Normalize_Address。 此扩展与 Tiger 无关,因此可以与其他数据源(例如国际地址)一起使用。 Tiger 地理编码器扩展确实附带了自己的自定义版本 rules table (tiger.pagc_rules
) 、 gaz table (tiger. pagc_gaz
)和lex table (tiger.pagc_lex
)。 您可以添加和更新这些内容,以根据自己的需求改善标准化体验。
加载过程从人口普查网站下载各个国家文件、所请求的州的数据,提取文件,然后将每个州加载到其自己单独的一组州表中。每个状态表都继承自 tiger
模式中定义的表,因此,如果您需要重新加载状态或不需要重新加载状态,则只需查询这些表即可访问所有数据并随时使用 Drop_State_Tables_Generate_Script 删除一组状态表不再需要一个国家了。
启用数据加载需要以下工具:
提取从人口普查网站获得的ZIP文件的工具。
在类Unix系统上,它是一个可执行文件。unzip
通常已经安装在大多数类Unix平台上。
在Windows上,它是7-zip。它是一个免费的压缩解压缩工具,可以从http://www.7-zip.org/下载
shp2pgsql
命令。默认情况下,它在安装PostGIS时安装。
wget
命令。它是一个Web检索工具,通常安装在大多数Unix / Linux系统上。
对于 Windows,您可以从http://gnuwin32.sourceforge.net/packages/wget.htm 获取编译的二进制文件
如果您要从 Tiger_2010 升级,则需要首先生成并运行 Drop_Nation_Tables_Generate_Script。在加载任何州数据之前,您需要加载使用 Loader_Generate_Nation_Script 执行的全国范围数据。这将为您生成一个加载器脚本。Loader_Generate_Nation_Script 是一个一次性步骤,应该在升级(从上一年的tiger普查数据)和新安装时完成。
要加载状态数据,请参阅Loader_Generate_Script为您的平台生成所需状态的数据加载脚本。 请注意,您可以零碎地安装这些。 您不必一次加载您想要的所有状态。 您可以根据需要加载它们。
加载所需的状态后,如
SELECT install_missing_indexes();
所示:尝试运行 Install_Missing_Indexes。
要测试您是否能够执行应执行的操作,您将在使用 Geocode的州的地址上运行地理编码器
首先postgis_tiger_geocoder按如下所示升级扩展:
ALTER EXTENSION postgis_tiger_geocoder UPDATE;
然后删除所有国家/地区表并加载新的国家/地区表。 如Drop_Nation_Tables_Generate_Script中所述,使用此 SQL 语句生成删除脚本
SELECT drop_nation_tables_generate_script();
执行生成的删除SQL语句。
如Loader_Generate_Nation_Script中所述,使用此 SELECT 语句生成删除脚本
对于Windows
SELECT loader_generate_nation_script('windows');
对于unix/linux
SELECT loader_generate_nation_script('sh');
有关如何运行生成脚本的说明,请参见 Section 2.4.1, “在 PostGIS 数据库中启用Tiger地理编码器”。 您只需要执行此操作一次。
![]() | |
您可以混合使用不同年份的状态表,并且可以单独升级每个状态。 在升级某个州之前,您首先需要使用 Drop_State_Tables_Generate_Script 删除该州前一年的州表。 |
当安装或升级未按预期进行时,需要检查一些事项。
请确保已安装 PostgreSQL12 或更新版本,并且你正在使用与正在运行的 PostgreSQL 版本相同的 PostgreSQL 源代码进行编译。当你的(Linux)发行版已经安装了 PostgreSQL,或者以其他方式安装了 PostgreSQL 但忘记了时,可能会出现混淆。PostGIS 只能与 PostgreSQL12 或更新版本一起使用,如果使用较旧版本,可能会出现奇怪且意想不到的错误消息。要检查正在运行的 PostgreSQL 版本,可以使用 psql 连接到数据库并运行以下查询:
SELECT version();
如果您运行的是基于 RPM 的发行版,则可以使用rpm命令检查是否存在带有 rpm -qa | grep postgresql的预安装软件包
如果升级失败,请确保还原到已安装PostGIS的数据库。
SELECT postgis_full_version();
此外,请检查配置是否正确检测到 PostgreSQL、Proj4 库和 GEOS 库的安装位置。
配置的输出用于生成 postgis_config.h
文件。检查POSTGIS_PGSQL_VERSION
, POSTGIS_PROJ_VERSION
和POSTGIS_GEOS_VERSION
变量是否已正确设置。
PostGIS 性能的调优与任何 PostgreSQL 工作负载的调优非常相似。 唯一需要额外考虑的是,几何图形和栅格通常很大,因此与内存相关的优化通常对 PostGIS 的影响比其他类型的 PostgreSQL 查询更大。
有关优化 PostgreSQL 的一般详细信息,请参阅 调整 PostgreSQL 服务器。
对于 PostgreSQL 9.4+,可以使用 ALTER SYSTEM
命令在服务器级别设置配置,而无需触及 postgresql.conf
或 postgresql.auto.conf
。
ALTER SYSTEM SET work_mem = '256MB'; -- this forces non-startup configs to take effect for new connections SELECT pg_reload_conf(); -- show current setting value -- use SHOW ALL to see all settings SHOW work_mem;
除了 Postgres 设置之外,PostGIS 还有一些自定义设置,请参见Section 7.22, “大一统自定义变量 (GUCs)”。
这些设置在 postgresql.conf
中配置:
默认:分区
这通常用于表分区。默认设置为 "partition",适用于 PostgreSQL 8.4 及更高版本,因为它将强制查询规划器仅在表处于继承层次结构中时分析约束考虑,否则将不会对规划器产生影响。
默认值:PostgreSQL 9.6 中约为 128MB
将其设置为可用RAM的约 25% 到 40%。在 Windows 上,您可能无法设置得那么高。
max_worker_processes 此设置仅适用于 PostgreSQL 9.4 +。 对于 PostgreSQL 9.6+,此设置具有额外的重要性,因为它控制并行查询可以拥有的最大进程数。
默认值:8
设置系统可以支持的最大后台进程数。 该参数只能在服务器启动时设置。
work_mem - 设置用于排序操作和复杂查询的内存大小
默认:1-4MB
针对大型数据库、复杂查询、大量 RAM 进行调整
针对许多并发用户或 RAM 较低的情况进行下调。
如果您有大量 RAM 而开发人员很少:
SET work_mem TO '256MB';
Maintenance_work_mem - 用于 VACUUM、CREATE INDEX 等的内存大小。
默认值:16-64MB
通常太低 - 占用 I/O,在交换内存时锁定对象
建议在具有/大量 RAM 的生产服务器上使用 32 MB 到 1GB,但取决于并发用户数。 如果您有大量 RAM 而开发人员很少:
SET maintenance_work_mem TO '1GB';
max_parallel_workers_per_gather
此设置仅适用于 PostgreSQL 9.6+,并且只会影响 PostGIS 2.3 +,因为只有 PostGIS 2.3+ 支持并行查询。 如果设置为高于 0,则某些查询(例如涉及 ST_Intersects
等关系函数的查询)可以使用多个进程,并且运行速度可以提高两倍以上。 如果您有大量空闲处理器,则应将其值更改为您拥有的处理器数量。 还要确保将 max_worker_processes
提高到至少与此数字一样高。
默认:0
设置由单个 Gather
节点启动的最大工作进程数。并行工作进程来自 max_worker_processes
建立的进程池。请注意,在运行时,请求的工作进程数量可能实际上无法使用。如果出现这种情况,计划将以比预期更少的工作进程运行,这可能效率低下。将此值设置为默认值 0 将禁用并行查询执行。
如果启用了栅格的支持,则可能需要读一下下面的内容来正确配置它。
从 PostGIS 2.1.3 开始,默认情况下禁用数据库外栅格和所有栅格驱动程序要启用它们,请在服务器上设置环境变量 POSTGIS_GDAL_ENABLED_DRIVERS
和POSTGIS_ENABLE_OUTDB_RASTERS
。PostGIS 2.2 提供了一种跨平台方法,用于根据第 Section 7.22, “大一统自定义变量 (GUCs)” 进行设置。
如果要启用离线栅格:
POSTGIS_ENABLE_OUTDB_RASTERS=1
如果包括任何其它值或不包含值,则会禁用离线栅格。
若想启用已经安装的 GDAL 驱动,请设置以下环境变量
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
如果只想启用某些驱动,请按如下所示设置环境变量:
POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
![]() | |
在 Windows 上,不要在驱动程序列表中加上引号 |
环境变量的设置因操作系统而异。对于在 Ubuntu 或 Debian 上通过 apt-postgresql 安装的 PostgreSQL,首选方法是编辑/etc/postgresql/
,其中数字 10 是 PostgreSQL 的版本,main 表示集群。10
/main
/environment
在 Windows 上,如果您作为服务运行,则可以通过系统变量进行设置,对于 Windows 7,您可以通过右键单击计算机 -> 属性高级系统设置或在资源管理器中导航至 控制面板\所有 控制面板项目\系统
。 然后点击高级系统设置->高级->环境变量并添加新的系统变量。
设置环境变量后,您需要重启 PostgreSQL 服务才能使更改生效。
如果您使用的是 PostgreSQL 9.1 以上的版本,并且已经编译并安装了 postgis 扩展模块,那么数据库将在 PG 的扩展机制下成为空间数据库。
postgis 的核心扩展包括几何、地理、spatial_ref_sys 以及所有函数和注释。栅格(Raster)和拓扑(Topology)打包为单独的扩展模块。
在要启用空间的数据库中运行以下SQL代码段:
CREATE EXTENSION IF NOT EXISTS plpgsql; CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; -- OPTIONAL CREATE EXTENSION postgis_topology; -- OPTIONAL
![]() | |
通常,仅当你不能或不想在PostgreSQL扩展的目录中安装PostGIS时(例如,在测试或开发期间,或在受限环境中),才需要这样做。 |
将 PostGIS 对象和函数定义添加到数据库中是通过加载位于构建阶段指定的 [prefix]/share/contrib
中的各种 sql 文件来完成的。
核心 PostGIS 对象(几何和地理类型及其支持函数)位于 postgis.sql
脚本中。 栅格对象位于 rtpostgis.sql
脚本中。 拓扑对象位于 topology.sql
脚本中。
对于完整的 EPSG 坐标系定义标识符集,您还可以加载 spatial_ref_sys.sql
定义文件并填充 spatial_ref_sys
表。 这将允许您对几何图形执行 ST_Transform() 操作。
如果您希望向 PostGIS 函数添加注释,可以在 postgis_comments.sql
脚本中找到它们。 只需从 psql 终端窗口输入 \dd [function_name] 即可查看注释。
在终端中运行以下 shell 命令:
DB=[yourdatabase] SCRIPTSDIR=`pg_config --sharedir`/contrib/postgis-3.4/ # Core objects psql -d ${DB} -f ${SCRIPTSDIR}/postgis.sql psql -d ${DB} -f ${SCRIPTSDIR}/spatial_ref_sys.sql psql -d ${DB} -f ${SCRIPTSDIR}/postgis_comments.sql # OPTIONAL # Raster support (OPTIONAL) psql -d ${DB} -f ${SCRIPTSDIR}/rtpostgis.sql psql -d ${DB} -f ${SCRIPTSDIR}/raster_comments.sql # OPTIONAL # Topology support (OPTIONAL) psql -d ${DB} -f ${SCRIPTSDIR}/topology.sql psql -d ${DB} -f ${SCRIPTSDIR}/topology_comments.sql # OPTIONAL
当您需要替换或部署新的 PostGIS 对象定义时,升级现有空间数据库可能会很棘手。
遗憾的是,并非所有定义都可以在正在运行的数据库中轻松替换,因此转储/重装可能是最好的选择。
PostGIS 为次要版本升级和错误修复提供软升级,为主要升级提供硬升级。
在尝试升级PostGIS之前备份数据始终是值得的。 可以将 -fc 标志与 pg_dump 一起使用,以始终通过硬升级还原转储。
如果使用扩展安装数据库,则必须使用扩展模型对其进行升级。 如果使用较旧的 SQL 脚本进行安装,则应切换到扩展,因为不再支持 SQL 脚本。
如果使用扩展程序安装了PostGIS,则需要使用该扩展程序进行升级。使用扩展程序进行小升级非常轻松。
如果您运行的是 PostGIS 3 或更高版本,则应升级到已安装的具有PostGIS_Extensions_Upgrade功能的最新版本。
SELECT postgis_extensions_upgrade();
如果您运行的是 PostGIS 2.5 或更早版本,执行以下操作:
ALTER EXTENSION postgis UPDATE; SELECT postgis_extensions_upgrade(); -- This second call is needed to rebundle postgis_raster extension SELECT postgis_extensions_upgrade();
如果安装了多个版本的 PostGIS,并且不想升级到最新版本,则可以指定显式版本。 执行以下操作:
ALTER EXTENSION postgis UPDATE TO "3.5.0alpha1"; ALTER EXTENSION postgis_topology UPDATE TO "3.5.0alpha1";
您可能会看到类似于以下内容的错误通知:
No migration path defined for … to 3.5.0alpha1
在这种情况下,必须备份数据库,按照 Section 3.3.1, “使用扩展(EXTENSION)启用空间数据库”中所述生成新数据库,然后将备份还原到新数据库。
您可能会收到类似于以下内容的消息:
Version "3.5.0alpha1" of extension "postgis" is already installed
那么一切都已经是最新的,您可以安全地忽略它。 除非您正在尝试从开发版本升级到下一个版本(不会获得新的版本号); 在这种情况下,您可以将“next”附加到版本字符串,下次您需要再次删除“next”后缀:
ALTER EXTENSION postgis UPDATE TO "3.5.0alpha1next"; ALTER EXTENSION postgis_topology UPDATE TO "3.5.0alpha1next";
![]() | |
如果您最初安装 PostGIS 时没有指定版本,则通常可以在恢复之前跳过 postgis 扩展的重新安装,因为备份只有 |
![]() | |
如果您要从 3.0.0 之前的版本升级 PostGIS 扩展,您将拥有一个新的扩展 postgis_raster,如果您不需要栅格支持,则可以安全地删除该扩展。 您可以按如下方式删除: DROP EXTENSION postgis_raster; |
它适用于在不使用扩展名的情况下安装了PostGIS的人。如果您使用的是扩展并使用此方法,您将看到类似于以下内容的消息:
can't drop … because postgis extension depends on it
注: 如果要迁移到 r1 之前的 PostGIS 7429.* 或 PostGIS 2.*,则此过程不可用,但需要执行硬升级。
编译并安装(make install)后,您应该在安装文件夹中找到一组 *_upgrade.sql
文件。 您可以通过以下方式列出它们:
ls `pg_config --sharedir`/contrib/postgis-3.5.0alpha1/*_upgrade.sql
从 postgis_upgrade.sql
开始依次加载它们。
psql -f postgis_upgrade.sql -d your_spatial_database
相同的过程适用于栅格、拓扑和 sfcgal 扩展,升级文件分别名为 rtpostgis_upgrade.sql
、topology_upgrade.sql
和 sfcgal_upgrade.sql
。 如果您需要它们:
psql -f rtpostgis_upgrade.sql -d your_spatial_database
psql -f topology_upgrade.sql -d your_spatial_database
psql -f sfcgal_upgrade.sql -d your_spatial_database
建议您通过运行切换到基于扩展的安装
psql -c "SELECT postgis_extensions_upgrade();"
![]() | |
如果您找不到专门用于升级您的版本的 |
PostGIS_Full_Version函数的“进程需要升级”消息提供了有关需要执行此类升级的信息。
硬升级意味着完全转储/重新加载 PostGIS 中可用的数据。如果 PostGIS 对象的内部存储状态发生更改或无法进行软升级,则需要硬升级。 附录中的发行说明指示每个版本是否需要转储/重新加载(硬升级)。
转储/重新加载操作由脚本辅助postgis_restore。 此脚本跳过属于 PostGIS 的所有定义(包括旧定义)。 您还可以将方案和数据恢复到 PostGIS 安装的数据库,而不会传递重复的符号错误或已弃用的对象。
有关 Windows 的其他信息,请参阅 Windows 硬升级。
程序如下:
创建要升级的数据库的“自定义格式”转储(我们称之为 olddb
),包括二进制 blob (-b) 和详细 (-v) 输出。 用户可以是数据库的所有者,不必是postgres超级帐户。
pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
在新数据库中全新安装 PostGIS - 我们将此数据库称为 newdb
。 请参阅 Section 3.3.2, “不通过扩展(EXTENSION)的方式启用空间数据库(不建议)” 和 Section 3.3.1, “使用扩展(EXTENSION)启用空间数据库” 了解如何执行此操作的说明。
转储中的spatial_ref_sys将还原,但不会覆盖现有spatial_ref_sys。 这是为了确保对正式数据集的更正被传送到要恢复的数据库。 如果要覆盖标准条目,只需在生成 newdb 时不要加载spaltial_ref_sys.sql文件。
如果您的数据库确实很旧,或者您知道在视图和函数中使用了长期不推荐使用的函数,则可能需要为所有函数和视图等加载 legacy.sql
才能正确返回 。 仅在确实需要时才执行此操作。 如果可能的话,请考虑在转储之前升级您的视图和函数。 稍后可以通过加载 uninstall_legacy.sql
来删除已弃用的函数。
使用 postgis_restore 将备份恢复到新的 newdb
数据库中。 意外错误(如果有)将由 psql 打印到标准错误流。 记录这些内容。
postgis_restore "/somepath/olddb.backup" | psql -h localhost -p 5432 -U postgres newdb 2> errors.txt
在以下情况下可能会发生错误:
您的某些视图或函数使用已弃用的 PostGIS 对象。 为了解决这个问题,您可以尝试在恢复之前加载 legacy.sql
脚本,或者您必须恢复到仍包含这些对象的 PostGIS 版本,并在移植代码后再次尝试迁移。 如果 legacy.sql
方式适合您,请不要忘记修复您的代码以停止使用已弃用的函数并将其加载 uninstall_legacy.sql
。
一些在转储文件中的自定义空间参考系统记录具有无效的SRID值。有效的SRID值应大于0且小于999000。值在999000.999999范围内被保留供内部使用,而大于999999的值则根本不能使用。所有具有无效SRID的自定义记录将被保留,其中大于999999的值将被移动到保留范围内,但空间_ref_sys表将失去维护该不变条件的检查约束,可能还会失去其主键(当多个无效的SRID值转换为相同的保留SRID值时)。
为了解决此问题,您应该将自定义SRS复制到 具有有效值的 SRID(可能在 910000..910999 范围),将所有表转换为新的 srid (请参阅UpdateGeometrySRID),删除无效的 从spatial_ref_sys输入并重建检查:
ALTER TABLE spatial_ref_sys ADD CONSTRAINT spatial_ref_sys_srid_check check (srid > 0 AND srid < 999000 );
ALTER TABLE spatial_ref_sys ADD PRIMARY KEY(srid));
如果要升级包含法国 IGN 映射的旧数据库,则可能会超出 SRID 的范围,并在导入数据库时遇到以下问题:
WARNING: SRID 310642222 converted to 999175 (in reserved zone)
在这种情况下,您可以尝试以下步骤: 完全丢弃最初从 SQL postgis_restore中产生的 IGN。 为此,请运行以下命令:
postgis_restore "/somepath/olddb.backup" > olddb.sql
运行以下命令:
grep -v IGNF olddb.sql > olddb-without-IGN.sql
之后,生成一个新数据库,启用必要的 PostGIS 扩展,并确保使用此 脚本插入法语 IGN 系统。 完成这些过程后,按如下方式导入数据:
psql -h localhost -p 5432 -U postgres -d newdb -f olddb-without-IGN.sql 2> errors.txt
开放地理空间联盟 (OGC) 定义了简单功能访问标准 (SFA),以提供地理空间数据模型。 它定义了几何的基本空间类型,以及操纵和转换几何值以执行空间分析任务的操作。 PostGIS 将 OGC 几何模型实现为 PostgreSQL 数据类型 geometry 和 geography。
几何是一种抽象类型。几何值属于其具体子类型之一。子类型表示各种类型和各种维度的几何形状。其中包括基本类型点, 线, 线性环 和 面, 以及集合类型多点, 多线, 多面 和 几何对象集合。简单 功能访问 - 第一部分:通用体系结构v1.2.1 为结构PolyhedralSurface, Triangle和TIN添加了子类型。
几何图形在二维笛卡尔平面上对形状进行建模。PolyhedralSurface, Triangle,和 TIN 也可以表示三维空间中的形状。形状的大小和位置由坐标指定。每个坐标都有 X 和 Y 坐标轴值,用于确定其在平面上的位置。形状由点和线构造,点由单个坐标定义,线由两个坐标定义。
坐标可能包含可选的Z和M纵坐标值。Z纵坐标通常用于表示高程。M纵坐标包含一个测量值,该值可能表示时间或距离。如果几何值中存在Z或M值,则必须为几何中的每个点定义这些值。如果几何具有 Z 或 M 纵坐标,则坐标尺寸为 3D;如果它同时具有 Z 和 M,则坐标尺寸为 4D。
几何值与 空间参考系统指示它所嵌入的坐标系。空间参考系由几何SRID编号标识。X轴和Y轴的单位由空间参考系确定。平面参考系统中,X 和 Y 坐标通常表示东向和北向,而在 大地测量测量系统中,它们表示经度和纬度。SRID 0 表示一个具有无单位的无限笛卡尔平面。请参见Section 4.5, “空间参考系统”。
几何维度是几何类型的属性。点类型的维度为 0,线性类型的维度为 1, 多边形类型的维度为 2。集合具有最大元素维度的维度。
几何值可以为 空。空值不包含顶点(对于原子几何类型)或不包含元素(对于集合)。
几何值的一个重要属性是它们的空间范围或边界框,OGC模型将其称为包络。这是包含几何坐标的2维或3维框。它是在坐标空间中表示几何图形范围并检查两个几何图形是否相互作用的有效方法。
几何模型允许评估拓扑空间关系,如Section 5.1.1, “维度扩展九交模型(Dimensionally Extended 9-Intersection Model)”中所述。为了支持这一点,为每种几何类型定义了内部, 外部和边界的概念。几何图形在拓扑上是封闭的,因此它们总是包含它们的边界。边界是比几何体本身小一维的几何体。
OGC几何模型为每种几何类型定义了有效性规则。这些规则确保几何值表示现实情况(例如,可以指定一个具有孔的多边形位于外壳之外,但从几何角度来看这是没有意义的,因此是无效的)。PostGIS 也允许存储和操作无效的几何值。这允许在需要时检测和修复它们。请参阅Section 4.4, “几何有效性验证”
点是表示坐标空间中单个位置的 0 维几何图形。
POINT (1 2) POINT Z (1 2 3) POINT ZM (1 2 3 4)
线串是由连续的线段序列形成的一维线。每条线段由两个点定义,一条线段的终点形成下一条线段的起点。OGC 有效的 线串具有零个或两个或多个点,但 PostGIS 也允许单点线串。线串可以与自身交叉(自相交)。如果起点和终点相同,则线串是闭合的。如果线串不自相交,则它是简单的。
LINESTRING (1 2, 3 4, 5 6)
线性环是一个既封闭又简单的线串。第一个点和最后一个点必须相等,并且线不得自相交。
LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
多边形是由外部边界(壳)和零个或多个内部边界(洞)分隔的二维平面区域。每个边界都是 线性环。
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))
多点是点的集合。
MULTIPOINT ( (0 0), (1 2) )
多线是线串的集合,如果多线的每个元素都已闭合,则该多线闭合。
MULTILINESTRING ( (0 0,1 1,1 2), (2 3,3 2,5 4) )
多面是非重叠、不相邻多边形的集合。集合中的多边形只能在有限数量的点处接触。
MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5)))
几何集合是几何的异构(混合)集合。
GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4))
多面体曲面是共享一些边的斑块或刻面的连续集合。每个面片都是一个平面多边形。如果多边形坐标具有 Z 纵坐标,则表面是三维的。
POLYHEDRALSURFACE Z ( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
三角形是由三个不同的非共线顶点定义的多边形。因为三角形是一个多边形,所以它由四个坐标指定,第一和第四个相等。
TRIANGLE ((0 0, 0 9, 9 0, 0 0))
TIN是一组不重叠的三角形,表示了一个三角不规则网络(Triangulated Irregular Network)的结构。
TIN Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
ISO/IEC 13249-3 SQL多媒体-空间标准 (SQL/MM)扩展了 OGC SFA 以定义包含弯曲几何图形的子类型。SQL/MM 类型支持 XYM、XYZ 和 XYZM。
![]() | |
SQL-MM 实现中的所有浮点比较 按照指定的公差执行,目前为 1E-8。 |
圆弧串是基本曲线类型,类似于线性世界中的线串。单个圆弧段由三个点指定:起点和终点(第一个和第三个)以及圆弧上的其他点。 要指定闭合圆,起点和终点相同,中点是圆直径上的相对点(即圆弧的中心)。在弧序列中,前一个弧的终点是下一个弧的起点,就像线串的线段一样。 这意味着圆弧串必须具有大于 1 的奇数个点。
CIRCULARSTRING(0 0, 1 1, 1 0) CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
复合曲线是一条连续曲线,可以包含圆弧段和线性段。意味着除了具有格式良好的组件之外,每个组件(最后一个除外)的终点必须与后续组件的起点重合。
COMPOUNDCURVE( CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))
曲线多边形与多边形相似,因为它们有一个外环和零个或多个内环。区别在于多边形环是线串,而曲线多边形环是复合曲线或圆弧串。
从PostGIS 1.4开始,PostGIS 现在支持曲线多边形上的复合曲线。
CURVEPOLYGON( CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1) )
示例:具有由圆弧串和线串组成的复合曲线定义的外壳的曲线多边形,以及由圆弧串定义的孔
CURVEPOLYGON( COMPOUNDCURVE( CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3), (4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )
多曲线是曲线的集合,可以包括线串、圆弧串或复合曲线。
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4))
多曲面是曲面的集合,可以是(线性的)多边形或曲线多边形。
MULTISURFACE( CURVEPOLYGON( CIRCULARSTRING( 0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1)), ((10 10, 14 12, 11 10, 10 10), (11 11, 11.5 11, 11 11.5, 11 11)))
OGC SFA规范定义了两种标准格式,用于表示供外部使用的几何值。已知文本(WKT)和已知二进制文件(WKB)。WKT和WKB都包含有关定义对象的类型和坐标的信息。
已知文本(WKT)提供空间数据的标准字符表示形式。以下是空间对象的 WKT 表示形式示例:
POINT(0 0)
POINT Z (0 0 0)
POINT ZM (0 0 0 0)
POINT EMPTY
LINESTRING(0 0,1 1,1 2)
LINESTRING EMPTY
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT((0 0),(1 2))
MULTIPOINT Z ((0 0 0),(1 2 3))
MULTIPOINT EMPTY
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
GEOMETRYCOLLECTION EMPTY
WKT输入和输出由函数ST_AsText和ST_GeomFromText提供:
text WKT = ST_AsText(geometry); geometry = ST_GeomFromText(text WKT, SRID);
例如,从WKT和SRID创建并插入空间对象的语句如下所示:
INSERT INTO geotable ( geom, name ) VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');
已知二进制 (WKB) 是空间数据二进制数据(字节数组)的可移植且准确的表示形式。空间对象的 WKB 表示如下所示:
WKT: POINT(1 1)
WKB: 0101000000000000000000F03F000000000000F03
WKT: LINESTRING (2 2, 9 9)
WKB: 0102000000020000000000000000000040000000000000004000000000000022400000000000002240
WKB 的输入和输出由以下函数ST_AsBinary和 ST_GeomFromWKB提供:
bytea WKB = ST_AsBinary(geometry); geometry = ST_GeomFromWKB(bytea WKB, SRID);
例如,用于创建和插入WKB的空间对象如下所示:
INSERT INTO geotable ( geom, name ) VALUES ( ST_GeomFromWKB('\x0101000000000000000000f03f000000000000f03f', 312), 'A Place');
PostGIS 通过定义称为geometry
的 PostgreSQL 数据类型来实现 OGC 简单要素模型。它使用内部类型代码表示所有几何子类型(请参阅 GeometryType 和 ST_GeometryType)。这允许将空间要素建模为用geometry
类型的列定义的表行。
geometry
数据类型是 不透明的,这意味着所有访问都是通过调用几何值的函数来完成的。 函数允许创建几何对象、访问或更新所有内部字段以及计算新的几何值。PostGIS 支持 OGC 简单功能访问 - 第二部分: SQL 选项(SFS) 规范中指定的所有功能以及许多其他功能。 请参阅Chapter 7, PostGIS 参考手册以获取完整的函数列表。
![]() | |
PostGIS 遵循 SFA 标准,在空间函数前面加上前缀“ST_”。 这表示“空间和时间”,但标准时间部分尚未开发。 相反,它可以解释为“空间类型”。 |
SFA 标准指定空间对象包含空间参考系统标识符 (SRID)。创建插入数据库的空间对象时需要 SRID(可能默认为 0)。 请参阅 ST_SRID 和Section 4.5, “空间参考系统”
为了使几何查询更加高效,PostGIS 定义了不同类型的空间索引。有关更多信息,请参见 Section 4.9, “空间索引”和Section 5.2, “使用空间索引”。
OGC SFA 规范最初仅支持 2D 几何形状, 并且几何 SRID 不包含在输入/输出表示中。OGC SFA 规范 1.2.1(与 ISO 19125 标准一致) 增加了对 3D (ZYZ) 和测量(XYM 和 XYZM)坐标的支持, 但仍然不包括 SRID 值。
由于这些限制,PostGIS定义了扩展的EWKB和EWKT格式。它们提供 3D(XYZ 和 XYM)和 4D (XYZM) 坐标支持,并包括 SRID 信息。 包含所有几何信息允许 PostGIS 使用 EWKB 作为记录格式 (例如,在转储文件中)。
EWKB 和 EWKT 用于 PostGIS 数据对象的“规范形式”。 对于输入,二进制数据的规范形式是 EWKB,对于文本数据,接受 EWKB 或 EWKT。 这允许通过使用 ::geometry
将 HEXEWKB 或 EWKT中的文本值转换为几何值来创建几何值。 对于输出,二进制的规范形式是 EWKB,对于文本,规范形式是 HEXEWKB(十六进制编码的 EWKB)。
例如,此过程使用来自EWKT文本值的强制转换生成几何图形,并使用HEXWKB的规范格式输出它们:
SELECT 'SRID=4;POINT(0 0)'::geometry; geometry ---------------------------------------------------- 01010000200400000000000000000000000000000000000000
PostGIS EWKT 输出与 OGC WKT 有一些不同之处:
对于 3DZ 几何形状,省略了 Z 限定符:
OGC: POINT Z (1 2 3)
EWKT: POINT (1 2 3)
对于 3DM 几何形状,包括 M 限定符:
OGC: POINT M (1 2 3)
EWKT: POINTM (1 2 3)
对于 4D 几何形状,省略了 ZM 限定符:
OGC: POINT ZM (1 2 3 4)
EWKT: POINT (1 2 3 4)
EWKT避免过度指定维度以及OGC/ISO格式可能发生的不一致,例如:
POINT ZM (1 1)
POINT ZM (1 1 1)
POINT (1 1 1 1)
![]() | |
PostGIS扩展格式向上兼容OGC格式,因此,每个有效的 OGC WKB/WKT 也是有效的 EWKB/EWKT。但是,将来这可能会有所不同,如果 OGC 以与 PosGIS 定义冲突的方式扩展格式。因此,您不应该依赖这种兼容性! |
空间对象的 EWKT 文本表示的示例如下:
POINT(0 0 0) -- XYZ
SRID=32632;POINT(0 0) -- XY 与 SRID
POINTM(0 0 0) -- XYM
POINT(0 0 0 0) -- XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM 与 SRID
MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
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))
MULTIPOLYGON(((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)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))
GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
TRIANGLE ((0 0, 0 10, 10 0, 0 0))
TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
可以使用以下函数使用这些格式的输入和输出:
bytea EWKB = ST_AsEWKB(geometry); text EWKT = ST_AsEWKT(geometry); geometry = ST_GeomFromEWKB(bytea EWKB); geometry = ST_GeomFromEWKT(text EWKT);
例如,使用 EWKT 创建和插入 PostGIS 空间对象的语句为:
INSERT INTO geotable ( geom, name ) VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )
PostGIS geography
数据类型为“地理”坐标(有时称为“大地”坐标,或“lat/lon”或“lon/lat”)表示的空间要素提供本机支持。地理坐标是以角度单位(度)表示的球坐标。
PostGIS几何类型的基础是平面。平面上两点之间的最短路径是直线。几何函数(面积、距离、长度、交点等)是使用线性向量和笛卡尔平面计算的。这简化了实施并运行得更快,但对于地球球面以上的数据是不准确的。
PostGIS 地理数据类型基于球面模型。球体上两点之间的最短路径是一个大圆弧。地理上的函数(面积、距离、长度、交点等)是使用球体上的弧计算的。通过考虑世界的球体形状,函数可提供更准确的结果。
由于基础数学更复杂,因此为地理类型定义的函数少于为几何类型定义的函数。随着时间的推移,随着新算法的添加,地理类型的功能将扩展。作为一种解决方法,可以在几何和地理类型之间来回转换。
与几何数据类型类似,地理数据通过空间参考系统标识符 (SRID) 与空间参考系统相关联。可以使用在spatial_ref_sys
表中定义的任何大地测量(基于经/纬度)空间参考系统。(在 PostGIS 2.2 之前,地理类型仅支持 WGS 84 大地测量 (SRID:4326))。您可以添加自己的自定义大地测量空间参考系统,如Section 4.5.2, “用户自定义空间参考系统”中所述。
测量函数返回的单位(例如,ST_Distance, ST_Length, ST_Perimeter, ST_Area)与ST_DWithin参数中给出的距离之间的空间参考系统单位为米。
您可以使用带有地理类型列的 CREATE TABLE SQL 语句创建一个表来存储地理
数据。 以下示例创建一个表,其中包含存储 WGS84 大地坐标系 (SRID 4326) 中的 2D LineString 的地理列:
CREATE TABLE global_points ( id SERIAL PRIMARY KEY, name VARCHAR(64), location geography(POINT,4326) );
地理类型支持两个可选的类型修饰符:
空间类型修饰符用于调节列中允许的形状的类型和维度。根据值,空间类型可以是点、线串、面、多点、多线、多面、几何集合。地理类型不支持曲线、三角形或多面体曲面。通过将后置 Z、M 和 ZM 附加到类型修饰符,可以解决坐标维度的约束问题。 例如,“LINESTRINGM”只允许三维线串,第三个轴是M。 同样,“POINTZM”需要四维(XYZM)数据。
SRID 修饰符将空间参考系统 SRID 限制为特定数字。如果省略,SRID 默认为 4326(WGS84 大地测量),并且所有计算均使用 WGS84 执行。
以下是生成包含地理列的表的示例:
生成一个具有二维点地理的表,默认情况下SRID为4326(WGS84 经度/纬度):
CREATE TABLE ptgeogwgs(gid serial PRIMARY KEY, geog geography(POINT) );
生成具有 NAD83 经纬度二维点地理的表:
CREATE TABLE ptgeognad83(gid serial PRIMARY KEY, geog geography(POINT,4269) );
创建一个包含 3D (XYZ) POINT 和默认 SRID 4326 的表:
CREATE TABLE ptzgeogwgs84(gid serial PRIMARY KEY, geog geography(POINTZ,4326) );
生成具有二维线串地理的表,SRID 默认值为 4326:
CREATE TABLE lgeog(gid serial PRIMARY KEY, geog geography(LINESTRING) );
使用 SRID 4267(NAD 1927 经纬度)创建包含二维多边形地理的表:
CREATE TABLE lgeognad27(gid serial PRIMARY KEY, geog geography(POLYGON,4267) );
地理字段在geography_columns
系统视图中注册。 您可以查询geography_columns
视图并看到该表已列出:
SELECT * FROM geography_columns;
创建空间索引的工作方式与创建几何列相同。 PostGIS 将注意到列类型是 GEOGRAPHY,并创建适当的基于球体的索引,而不是用于 GEOMETRY 的常用平面索引。
-- Index the test table with a spherical index CREATE INDEX global_points_gix ON global_points USING GIST ( location );
您可以采用与几何相同的方式将数据插入地理表中。如果几何数据具有 SRID 4326,则几何数据将自动转换为地理类型。也可以使用 EWKT和EWKB 格式 以指定地理值。
-- Add some data into the test table INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)'); INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)'); INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');
spatial_ref_sys
表中列出的任何大地测量(经/纬度)空间参考系统都可以指定为地理 SRID。如果使用非大地坐标系,则会产生错误。
-- NAD 83 lon/lat SELECT 'SRID=4269;POINT(-123 34)'::geography; geography ---------------------------------------------------- 0101000020AD1000000000000000C05EC00000000000004140
-- NAD27 lon/lat SELECT 'SRID=4267;POINT(-123 34)'::geography; geography ---------------------------------------------------- 0101000020AB1000000000000000C05EC00000000000004140
-- NAD83 UTM zone meters - gives an error since it is a meter-based planar projection SELECT 'SRID=26910;POINT(-123 34)'::geography; ERROR: Only lon/lat coordinate systems are supported in geography.
查询和测量功能以米为单位。因此,距离参数以米为单位(面积为平方米)。
-- A distance query using a 1000km tolerance SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);
通过计算一架从西雅图飞往伦敦的飞机(LINESTRING(-122.33 47.606, 0.0 51.5) 表示的大圆航线)飞行过程中距离雷克雅未克(POINT(-21.96 64.15))的距离,您可以看到地理学的作用(绘制路线)。
地理类型计算出雷克雅未克与西雅图和伦敦之间的大圆飞行路径之间的球体上的真实最短距离为 122.235 公里。
-- Distance calculation using GEOGRAPHY SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography); st_distance ----------------- 122235.23815667
几何类型在平面世界地图上计算雷克雅未克之间的笛卡尔距离以及西雅图和伦敦之间的直线,这是没有意义的。计算结果的标称单位是“度”,但它与点之间的真实角度差并不对应,称其为“度”本身是不准确的。
-- Distance calculation using GEOMETRY SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry); st_distance -------------------- 13.342271221453624
地理数据类型允许您将数据存储在经度/纬度坐标中,但有代价:在地理上定义的函数比在几何上定义的函数少;定义的那些函数需要更多 CPU 时间来执行。
您选择的数据类型应由正在构建的应用程序的预期工作区域确定。您的数据是跨越全球还是大片大陆区域,还是州、县或直辖市的本地数据?
如果数据包含在较小的区域中,您可能会发现,就可用的性能和功能而言,选择合适的投影并使用 GEOMETRY 是最佳解决方案。
如果您的数据是整个地球或大陆,您将能够构建一个系统,而无需担心地理投影的细节。保存经度/纬度数据并使用地理中定义的函数。
如果您不了解投影,并且不想了解它们,并且您准备接受地理中可用功能的限制,那么使用地理可能比使用几何更容易。只需将数据加载为经度/纬度,然后从那里开始。
有关地理和几何之间的支持比较,请参见Section 13.11, “PostGIS函数支持矩阵”。有关地理函数的简要列表和说明,请参见 Section 13.4, “PostGIS 地理支持函数”
4.3.4.1. | 你是用球体还是椭球体计算? |
默认情况下,所有距离和面积计算都在椭球体中执行。将局部区域的计算结果与投影良好的平面上的结果进行比较。对于大面积,椭球体计算比投影平面上的任何其他计算都更准确。 所有地理函数都可以选择使用球体计算,方法是将最终布尔参数设置为“FALSE”。这将在一定程度上加快计算速度,特别是对于几何形状非常简单的情况。 | |
4.3.4.2. | 日期变更线和极点呢? |
所有计算都没有日期变更线或极点的概念。 由于坐标是球体(经度/纬度),因此从计算的角度来看,穿过日期变更线的形状与其他任何形状没有什么不同。 | |
4.3.4.3. | 您可以处理的最长圆弧是多少? |
我们使用大圆弧作为两点之间的“插值线”。 这意味着任何两点实际上以两种方式连接起来,具体取决于您沿着大圆行进的方向。我们所有的代码都假设这些点是由沿着大圆的两条路径中“较短的”一条连接起来的。因此,弧度超过 180 度的形状将无法正确建模。 | |
4.3.4.4. | 为什么计算欧洲/俄罗斯/大地理区域的面积这么慢? |
因为多边形大得离谱。大面积不好有两个原因 一个原因是边界框很大,因此无论您运行什么查询,索引都倾向于拉取特征。另一个原因是顶点计数很大,并且测试(距离、包含)函数必须至少遍历顶点一次,通常为 N(其中 N 是另一个要素的顶点计数)。 与 GEOMETRY 一样,我们建议您在具有非常大的多边形,但在小区域中执行查询时,将几何数据“非规范化”为较小的块,以便索引可以有效地子查询对象的各个部分,这样查询就不必每次都提取整个对象。请参阅ST_Subdivide 函数文档。仅仅因为您*可以*将整个欧洲存储在一个多边形中并不意味着您*应该*。 |
PostGIS 符合开放地理空间联盟 (OGC) 的简单要素规范。 该标准定义了简单和有效几何概念。 这些定义允许简单要素几何模型以一致且明确的方式表示空间对象,从而支持高效计算。 (注:OGC SF 和 SQL/MM 对简单和有效的定义相同。)
简单几何是指没有异常几何点(例如自交或自相切)的几何。
作为 0 维几何对象,POINT
本质上是简单。
MULTIPOINT
是简单的,如果没有两个坐标(POINT
)的坐标值相同(具有相同的坐标值)。
如果LINESTRING
不两次穿过同一点(端点除外),则该 LINESTRING 很简单。如果简单线串的端点相同,则称为闭合线并称为线性环。
(a) 和(c) 是简单的 |
![]() (a) | ![]() (b) |
![]() (c) | ![]() (d) |
仅当MULTILINESTRING
的所有元素都很简单 并且任意两个元素之间的唯一交集发生在两个元素边界上的点时,MULTILINESTRING 才是简单的。
(e) 和(f) 是简单的 |
![]() (e) | ![]() (f) | ![]() (g) |
POLYGON
是由线性环形成的,所以常见的多边形几何总是简单的。
测试几何图形是否简单,使用 ST_IsSimple函数:
SELECT ST_IsSimple('LINESTRING(0 0, 100 100)') AS straight, ST_IsSimple('LINESTRING(0 0, 100 100, 100 0, 0 100)') AS crossing; straight | crossing ----------+---------- t | f
一般来说,PostGIS 函数不要求几何参数很简单。简单性主要用作定义几何有效性的基础。这也是某些类型的空间数据模型的要求(例如,线性网络通常不允许线交叉)。使用 ST_UnaryUnion 可以使多点和线性几何变得简单。
几何有效性主要适用于二维几何形状(POLYGON
和MULTIPOLYGON
)。有效性是由允许多边形几何形状明确地模拟平面区域的规则定义的。
POLYGON
以下条件是有效的:
多边形边界环(外壳环和内孔环)很简单(不交叉或自接触)。因此,多边形不能有切割线、尖峰或环。这意味着多边形孔必须表示为内环,而不是外环自接触(所谓的“倒孔”)。
边界环不交叉
边界环可以在点上接触,但只能作为切线(即不在一条线上)
内环包含在外环中
多边形内部连接简单(即环不得以将多边形分成多个部分的方式接触)
(h)和(i) 是有效的 |
![]() (h) | ![]() (i) | ![]() (j) |
![]() (k) | ![]() (l) | ![]() (m) |
MULTIPOLYGON
以下条件是有效的:
其元素 POLYGON
有效
元素不重叠(即其内部不得相交)
元素仅在点处接触(即不沿线接触)
(n)是有效的 |
![]() (n) | ![]() (o) | ![]() (p) |
这些规则意味着有效的多边形几何也很简单。
对于线性几何,唯一的有效性规则是LINESTRING
必须至少有两个点并且具有非零长度(或等效地,至少有两个不同的点。请注意,非简单(自相交)线是有效的。
SELECT ST_IsValid('LINESTRING(0 0, 1 1)') AS len_nonzero, ST_IsValid('LINESTRING(0 0, 0 0, 0 0)') AS len_zero, ST_IsValid('LINESTRING(10 10, 150 150, 180 50, 20 130)') AS self_int; len_nonzero | len_zero | self_int -------------+----------+---------- t | f | t
POINT
和MULTIPOINT
几何形状没有有效性规则。
PostGIS允许创建和存储有效和无效的几何图形。这允许检测并标记或修复无效的几何图形。在某些情况下,OGC有效性规则比预期更严格(例如零长度线串和带有倒孔的多边形。)
PostGIS提供的许多功能都依赖于几何参数有效的假设。例如,计算在多边形外部定义有孔的多边形的面积,或者从非简单边界线构造多边形是没有意义的。假设有效的几何输入允许函数更有效地运行,因为它们不需要检查拓扑正确性。(值得注意的例外是零长度线和具有反转的多边形通常可以正确处理。)此外,如果输入有效,大多数 PostGIS 函数都会生成有效的几何输出。 这使得 PostGIS 功能可以安全地链接在一起。
如果在调用 PostGIS 函数时遇到意外错误消息 (例如“GEOS Intersection() 抛出了一个错误!”),应首先确认函数参数是否有效。如果无效,请考虑使用以下技术之一来验证您正在处理的数据。
![]() | |
如果函数报告有效输入错误,那么您可能在 PostGIS 或其使用的库之一中发现错误,您应该将此报告给 PostGIS 项目。如果 PostGIS 函数为有效输入返回无效几何图形,情况也是如此。 |
要测试几何图形是否有效,请使用ST_IsValid函数。 执行以下操作:
SELECT ST_IsValid('POLYGON ((20 180, 180 180, 180 20, 20 20, 20 180))'); ----------------- t
有关几何无效的性质和位置的信息由ST_IsValidDetail函数确定:
SELECT valid, reason, ST_AsText(location) AS location FROM ST_IsValidDetail('POLYGON ((20 20, 120 190, 50 190, 170 50, 20 20))') AS t; valid | reason | location -------+-------------------+--------------------------------------------- f | Self-intersection | POINT(91.51162790697674 141.56976744186045)
在某些情况下,需要自动纠正无效的几何形状。 使用 ST_MakeValid 函数来执行此操作。 (ST_MakeValid
是空间函数的一种情况,确实允许无效输入!)
测试复杂几何的刚度需要花费大量CPU时间,因此默认情况下,PostGIS 在加载几何时不会验证几何。如果不信任数据源,则可以使用检查约束对表进行强制验证。执行以下操作:
ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));
空间参考系统 (SRS)(也称为坐标参考系统(CRS))定义了如何将几何图形引用到 地球表面。 SRS 分为三种类型:
地理(geodetic)SRS,使用角坐标(经度和纬度),直接映射到地球表面。
投影(projected)SRS使用数学投影变换将球形地球的表面“压平”到平面上。 它以允许直接测量距离、面积和角度等量的方式分配位置坐标。 坐标系是笛卡尔坐标系,这意味着它具有定义的原点和两个垂直轴(通常面向北和东)。 每个投影的 SRS 使用规定的长度单位(通常是米或英尺)。投影的 SRS 的适用范围可能会受到限制,以避免变形并适合定义的坐标范围。
本地(local)SRS是不参考地球表面的笛卡尔坐标系。PostGIS 指定 SRID 值为 0。
所使用的空间参考系统存在许多差异。一般空间参考系统在欧洲石油调查组的EPSG database中进行了标准化。为方便起见,PostGIS(和许多空间系统)使用称为SRID的整数来引用空间参考系统。
几何通过其SRID值与空间参考系相关联,可由ST_SRID访问。可以使用ST_SetSRID指定几何图形的 SRID 值。某些几何构造函数允许提供 SRID (如ST_Point和ST_MakeEnvelope)。EWKT格式支持带有前缀SRID=n;
的SRID。
处理几何图形对(例如叠加和关系函数)的空间函数要求输入几何图形位于同一空间参考系统中(具有相同的 SRID)。可以使用ST_Transform 和 ST_TransformPipeline将几何数据转换为不同的空间参考系统。从函数返回的几何图形具有与输入几何图形相同的SRS。
PostGIS使用的SPATIAL_REF_SYS
表是一个符合 OGC 标准的数据库表,用于定义可用的空间参考系统。它包含数字 SRID 和坐标系的文本描述。
spatial_ref_sys
表定义为:
CREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256), auth_srid INTEGER, srtext VARCHAR(2048), proj4text VARCHAR(2048) )
这些列是:
srid
唯一标识数据库内空间参考系统(SRS)的整数代码。
auth_name
该参考系统引用的标准或标准机构的名称。例如,“EPSG”是有效的auth_name
。
auth_srid
由auth_name
中引用的权威机构定义的空间参考系统的ID。对于EPSG,这是EPSG代码。
srtext
已知空间参考系统的文本表示形式。WKT SRS表示的一个示例是:
PROJCS["NAD83 / UTM Zone 10N", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.257222101] ], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433] ], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-123], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1] ]
有关SRS WKT的详细信息,请参阅 OGC 标准参考系的已知文本表示。
proj4text
PostGIS使用PROJ库提供坐标转换功能。proj4text
列包含特定SRID的PROJ坐标定义字符串。例如:
+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m
欲了解更多信息,请访问PROJ 网站。spatial_ref_sys.sql
文件包含所有 EPSG 投影的srtext
和proj4text
定义。
检索用于变换的空间参考系统定义时,PostGIS使用以下策略:
如果 auth_name
和auth_srid
存在(非空),使用基于这些条目(如果存在)的 PROJ SRS。
如果srtext
存在,请使用它创建SRS(如果可能)。
如果proj4text
存在,请使用它创建SRS(如果可能)。
PostGISspatial_ref_sys
表包含由PROJ投影库处理的 3000 多个最常见的空间参考系统定义。但有很多坐标系它不包含。如果您具有有关空间参考系统的所需信息,则可以将 SRS 定义添加到表中。或者,如果您熟悉 PROJ 构造,则可以定义自己的自定义空间参考系统。请记住,大多数空间参考系统都是区域性的,在其预期范围之外使用时没有任何意义。
http://spatialreference.org/可用于查找不在 PostGIS 核心集中的空间参考系统
一些常用的空间参考系统包括:4326 - WGS 84 经纬度, 4269 - NAD 83 经纬度, 3395 - WGS 84 世界墨卡托投影, 2163 - 美国国家地图等面积投影以及 60 个 WGS84 UTM 区域。UTM 区域是最理想的测量区域之一,但仅覆盖 6 度区域。(要确定您感兴趣的区域使用哪个UTM区域,请参阅 utmzone PostGIS plpgsql帮助程序函数。)
美国各州使用国家平面空间参考系统(基于米或英尺)- 通常每个州有一个或两个。 大多数基于米的数据都在核心集中,但许多基于英尺的数据或 ESRI 创建的数据需要从spatialreference.org复制。
您甚至可以定义非基于地球的坐标系,比如 火星2000这个火星坐标系是非平面的(以球度为单位),但是您可以将其与 geography
类型一起使用,以米而不是度为单位获得长度和邻近测量值。
以下是使用未分配的SRID和以美国为中心的兰伯特等角投影的PROJ定义加载自定义坐标系的示例:
INSERT INTO spatial_ref_sys (srid, proj4text) VALUES ( 990000, '+proj=lcc +lon_0=-95 +lat_0=25 +lat_1=25 +lat_2=25 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' );
您可以使用SQL语句中的CREATE TABLE语句创建一个用于存储几何数据的表,其中包括一个geometry
类型的列。以下示例创建了一个带有几何列的表,该列存储BC-Albers坐标系统(SRID 3005)中的2D(XY)LineStrings:
CREATE TABLE roads ( id SERIAL PRIMARY KEY, name VARCHAR(64), geom geometry(LINESTRING,3005) );
geometry
类型对应于两个可选的类型修饰符:
创建具有几何列的表的示例:
创建一个表,其中包含具有默认 SRID 的任何类型的几何图形:
CREATE TABLE geoms(gid serial PRIMARY KEY, geom geometry );
为 2D 点创建具有 SRID 默认值的表:
CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINT) );
创建一个包含 3D (XYZ) 点和显式 SRID 3005 的表:
CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINTZ,3005) );
使用默认 SRID 创建具有 4D (XYZM) LINESTRING 几何图形的表:
CREATE TABLE lines(gid serial PRIMARY KEY, geom geometry(LINESTRINGZM) );
使用 SRID 4267(NAD 1927 长纬度)创建包含 2D POLYGON 几何图形的表:
CREATE TABLE polys(gid serial PRIMARY KEY, geom geometry(POLYGON,4267) );
一个表可以有多个几何列。这可以通过在创建表时指定它或使用ALTER TABLE语句添加它来实现。下面的示例演示如何添加列以存储 3D LineStrings:
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);
适用于SQL的OGC简单要素规范定义了用于描述GEOMETRY_COLUMNS
结构的元数据表。在 PostGIS 中,geometry_columns
是从数据库的系统目录表中读取的视图。这可确保空间元数据信息始终与当前定义的表或视图一致。视图结构为:
\d geometry_columns
View "public.geometry_columns" Column | Type | Modifiers -------------------+------------------------+----------- f_table_catalog | character varying(256) | f_table_schema | character varying(256) | f_table_name | character varying(256) | f_geometry_column | character varying(256) | coord_dimension | integer | srid | integer | type | character varying(30) |
这些列是:
f_table_catalog, f_table_schema, f_table_name
包含几何列的要素表的完全限定名称。PostgreSQL 中没有类似的“目录”,因此该列留空。对于“schema”,使用 PostgreSQL 模式名称(默认为public
)。
f_geometry_column
要素表中几何列的名称。
coord_dimension
列的坐标维度(2、3 或 4)。
srid
用于此表中的坐标几何的空间参考系的 ID。它是对引用spatial_ref_sys
表的外键引用(请参见Section 4.5.1, “SPATIAL_REF_SYS表”)。
type
空间对象的类型。 要将空间列限制为单一类型,请使用以下之一:POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION或相应的 XYM 版本 POINTM、LINESTRINGM、POLYGONM、MULTIPOINTM、MULTILINESTRINGM、MULTIPOLYGONM、GEOMETRYCOLLECTIONM。 对于异构(混合类型)集合,您可以使用“GEOMETRY”作为类型。
您可能需要这样做的两种情况是 SQL 视图和批量插入。对于批量插入情况,您可以通过约束列或执行更改表来更正 Geometry_columns 表中的注册。对于视图,您可以使用 CAST 操作来公开。 请注意,如果您的列是基于typmod的,创建过程将正确注册它,因此无需执行任何操作。 此外,未对几何应用空间函数的视图将与基础表几何列注册相同。
-- Lets say you have a view created like this CREATE VIEW public.vwmytablemercator AS SELECT gid, ST_Transform(geom, 3395) As geom, f_name FROM public.mytable; -- For it to register correctly -- You need to cast the geometry -- DROP VIEW public.vwmytablemercator; CREATE VIEW public.vwmytablemercator AS SELECT gid, ST_Transform(geom, 3395)::geometry(Geometry, 3395) As geom, f_name FROM public.mytable; -- If you know the geometry type for sure is a 2D POLYGON then you could do DROP VIEW public.vwmytablemercator; CREATE VIEW public.vwmytablemercator AS SELECT gid, ST_Transform(geom,3395)::geometry(Polygon, 3395) As geom, f_name FROM public.mytable;
--Lets say you created a derivative table by doing a bulk insert SELECT poi.gid, poi.geom, citybounds.city_name INTO myschema.my_special_pois FROM poi INNER JOIN citybounds ON ST_Intersects(citybounds.geom, poi.geom); -- Create 2D index on new table CREATE INDEX idx_myschema_myspecialpois_geom_gist ON myschema.my_special_pois USING gist(geom); -- If your points are 3D points or 3M points, -- then you might want to create an nd index instead of a 2D index CREATE INDEX my_special_pois_geom_gist_nd ON my_special_pois USING gist(geom gist_geometry_ops_nd); -- To manually register this new table's geometry column in geometry_columns. -- Note it will also change the underlying structure of the table to -- to make the column typmod based. SELECT populate_geometry_columns('myschema.my_special_pois'::regclass); -- If you are using PostGIS 2.0 and for whatever reason, you -- you need the constraint based definition behavior -- (such as case of inherited tables where all children do not have the same type and srid) -- set optional use_typmod argument to false SELECT populate_geometry_columns('myschema.my_special_pois'::regclass, false);
尽管仍然支持旧的基于约束的方法,但直接在视图中使用的基于约束的几何列将无法在 Geometry_columns 中正确注册,typmod 也是如此。在此示例中,我们使用typmod定义一个列,使用约束定义另一个列。
CREATE TABLE pois_ny(gid SERIAL PRIMARY KEY, poi_name text, cat text, geom geometry(POINT,4326)); SELECT AddGeometryColumn('pois_ny', 'geom_2160', 2160, 'POINT', 2, false);
在 psql 中运行
\d pois_ny;
我们观察到它们的定义不同——一个是类型,一个是约束
Table "public.pois_ny" Column | Type | Modifiers -----------+-----------------------+------------------------------------------------------ gid | integer | not null default nextval('pois_ny_gid_seq'::regclass) poi_name | text | cat | character varying(20) | geom | geometry(Point,4326) | geom_2160 | geometry | Indexes: "pois_ny_pkey" PRIMARY KEY, btree (gid) Check constraints: "enforce_dims_geom_2160" CHECK (st_ndims(geom_2160) = 2) "enforce_geotype_geom_2160" CHECK (geometrytype(geom_2160) = 'POINT'::text OR geom_2160 IS NULL) "enforce_srid_geom_2160" CHECK (st_srid(geom_2160) = 2160)
在geometry_columns中,两者都已正确注册
SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'pois_ny';
f_table_name | f_geometry_column | srid | type -------------+-------------------+------+------- pois_ny | geom | 4326 | POINT pois_ny | geom_2160 | 2160 | POINT
但是 - 如果我们要创建这样的视图
CREATE VIEW vw_pois_ny_parks AS SELECT * FROM pois_ny WHERE cat='park'; SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'vw_pois_ny_parks';
基于typmod的几何视图列正确注册, 但基于约束的约束没有。
f_table_name | f_geometry_column | srid | type ------------------+-------------------+------+---------- vw_pois_ny_parks | geom | 4326 | POINT vw_pois_ny_parks | geom_2160 | 0 | GEOMETRY
这可能会在未来版本的PostGIS中发生变化,但目前 要强制基于约束的视图列正确注册,您需要执行以下操作:
DROP VIEW vw_pois_ny_parks; CREATE VIEW vw_pois_ny_parks AS SELECT gid, poi_name, cat, geom, geom_2160::geometry(POINT,2160) As geom_2160 FROM pois_ny WHERE cat = 'park'; SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'vw_pois_ny_parks';
f_table_name | f_geometry_column | srid | type ------------------+-------------------+------+------- vw_pois_ny_parks | geom | 4326 | POINT vw_pois_ny_parks | geom_2160 | 2160 | POINT
创建空间表后,即可上传空间数据到数据库。有两种内置方法可以将空间数据放入PostGIS/PostgreSQL 数据库:使用格式化的 SQL 语句或使用 形状文件加载器。
如果空间数据可以转换为文本表示(如 WKT 或 WKB),那么使用SQL可能是将数据导入 PostGIS 的最简单方法。通过使用psql
SQL 实用程序加载 SQL INSERT
语句的文本文件,可以将数据批量加载到 PostGIS/PostgreSQL 中。
SQL加载文件(例如roads.sql
)可能看起来像这样:
BEGIN; INSERT INTO roads (road_id, roads_geom, road_name) VALUES (1,'LINESTRING(191232 243118,191108 243242)','Jeff Rd'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (2,'LINESTRING(189141 244158,189265 244817)','Geordie Rd'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (3,'LINESTRING(192783 228138,192612 229814)','Paul St'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (4,'LINESTRING(189412 252431,189631 259122)','Graeme Ave'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (5,'LINESTRING(190131 224148,190871 228134)','Phil Tce'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (6,'LINESTRING(198231 263418,198213 268322)','Dave Cres'); COMMIT;
SQL文件可以使用psql
方法加载到PostgreSQL中:
psql -d [database] -f roads.sql
shp2pgsql
数据加载器将 Shapefile 转换为适合以几何或地理格式插入PostGIS/PostgreSQL 数据库的 SQL。加载程序有多种通过命令行标志选择的操作模式。
还有一个shp2pgsql-gui
图形界面,其中大多数选项作为命令行加载程序。对于一次性非脚本加载或者您是 PostGIS 新手,这可能更容易使用。它还可以配置为 PgAdminIII 的插件。
-c
创建一个新表并从Shapefile文件填充它。这是默认模式
-a
将数据从Shapefile文件添加到数据库表中。如果使用此选项加载多个文件,则这些文件必须具有相同的属性和相同的数据类型。
-d
在创建包含 shapefile 中的数据的新表之前,请先删除数据库表。
-p
它只生成用于表创建的SQL代码,不添加任何实际数据。 如果要将表创建与数据加载完全分开,请使用此模式。
-?
显示帮助屏幕。
-D
对输出数据使用 PostgreSQL 转储格式。此模式与 -a、-c 和 -d 结合使用。 它的加载速度比默认的“插入”SQL格式快得多。通常将其用于大型数据集。
-s [<FROM_SRID>:]<SRID>
使用指定的 SRID 创建并填充几何表。(可选)指定输入shapefile文件使用给定的 FROM_SRID,在这种情况下,几何图形将被重新投影到目标 SRID。
-k
保留标识符的大小写(列、架构和属性)。请注意,Shapefile文件中的属性都是大写的。
-i
将所有整数强制为标准 32 位整数,不要创建 64 位大整数,即使DBF标头签名似乎可以保证这一点。
-I
在几何列上生成 GiST 索引。
-m
-m a_file_name
指定一个文件,其中包含一组(长)列名到 10 个字符的 DBF 列名的映射。文件的内容是由空格分隔的两个名称的一行或多行,并且没有尾随或前导空格。 例如:
COLUMNNAME DBFFIELD1 AVERYLONGCOLUMNNAME DBFFIELD2
-S
生成简单的几何图形而不是多个几何图形。仅当所有几何图形实际上都是单一的时才会成功(即具有单个壳的 MULTIPOLYGON,或具有单个顶点的 MULTIPOINT)。
-t <dimensionality>
强制输出几何具有指定的维度。使用以下方法表示维度的字符串:2D、3DZ、3DM、4D。
如果输入的维度少于指定的维度,则输出将用零填充这些维度。 如果输入具有指定的更多维度,则不需要的维度将被删除。
-w
使输出格式为 WKT 而不是 WKB。 重要的是要注意,精度可能会降低,并且可能会出现坐标波动。
-e
单独执行每个语句,而不使用事务。当存在一些产生错误的不良几何形状时,这允许加载大多数好的数据。请注意,这不能与 -D 标志一起使用,因为“转储”格式始终使用事务。
-W <encoding>
指定输入数据(dbf 文件)的编码。 使用时,dbf 的所有属性都会从指定的编码转换为 UTF8。生成的 SQL 输出将包含SET CLIENT_ENCODING to UTF8
命令,以便后端能够从 UTF8 重新转换为数据库配置为内部使用的任何编码。
-N <policy>
选择 NULL几何操作策略(插入*、跳过、中止)
-n
-n 仅导入 DBF 文件。如果您的数据没有相应的shapefile文件,它将自动切换到此模式 并仅加载 DBF。因此,仅当您设置了完整的 shapefile 并且只需要属性数据而不需要几何图形时,才需要设置此标志。
-G
地理类型不使用几何类型,而是使用 WGS84 经度和纬度 (SRID=4326)(需要经度纬度数据)
-T <tablespace>
指定新表的表空间。索引仍将使用 默认表空间,除非还使用 -X 参数。The PostgreSQL 文档对何时使用自定义表空间有很好的描述。
-X <tablespace>
指定新表上的索引要使用的表空间。 它适用于主键索引,如果 -I 一起使用,则也适用于 GiST 空间索引。
-Z
使用时,该标志将阻止生成ANALYZE
语句。 如果没有-Z标志(默认行为),将生成ANALYZE
语句。
使用加载程序创建输入文件并加载它的示例会话可能如下所示:
# shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql # psql -d roadsdb -f roads.sql
转换和加载可以使用 UNIX 通道一步完成:
# shp2pgsql shaperoads.shp myschema.roadstable | psql -d roadsdb
可以使用 SQL 或 Shapefile 转储程序从数据库中提取空间数据。有关 SQL 的部分介绍了一些可用于对空间表进行比较和查询的函数。
从数据库中提取空间数据的最直接方法是使用 SQL SELECT
查询来定义要提取的数据集并将结果列转储到可解析的文本文件中:
db=# SELECT road_id, ST_AsText(road_geom) AS geom, road_name FROM roads; road_id | geom | road_name --------+-----------------------------------------+----------- 1 | LINESTRING(191232 243118,191108 243242) | Jeff Rd 2 | LINESTRING(189141 244158,189265 244817) | Geordie Rd 3 | LINESTRING(192783 228138,192612 229814) | Paul St 4 | LINESTRING(189412 252431,189631 259122) | Graeme Ave 5 | LINESTRING(190131 224148,190871 228134) | Phil Tce 6 | LINESTRING(198231 263418,198213 268322) | Dave Cres 7 | LINESTRING(218421 284121,224123 241231) | Chris Way (6 rows)
有时需要某种限制来减少返回的记录数量。对于基于属性的限制,请使用与非空间表相同的 SQL 语法。在空间限制的情况下,以下函数很有用:
ST_Intersects
此函数指示两个几何图形是否共享任何空间。
=
它测试两个几何形状在几何上是否相同。例如,如果“POLYGON((0 0,1 1,1 0,0 0))”与“POLYGON((0 0,1 1,1 0,0 0))”相同(确实如此)。
接下来,您可以在查询中使用这些运算符。请注意,在 SQL 命令行上指定几何图形和框时,必须显式将字符串表示形式转换为几何函数。312是一个虚构的空间参考系统,与我们的数据相匹配。例如:
SELECT road_id, road_name FROM roads WHERE roads_geom='SRID=312;LINESTRING(191232 243118,191108 243242)'::geometry;
上面的查询从“ROADS_GEOM”表中返回与该值等效的单个记录。
要检查道路是否穿过由多边形定义的面,请执行以下操作:
SELECT road_id, road_name FROM roads WHERE ST_Intersects(roads_geom, 'SRID=312;POLYGON((...))');
最常见的空间查询可能是“基于框架”的查询,由数据浏览器和网络制图器等客户端软件使用,以获取“地图框架”的数据进行显示。
使用“&&”运算符时,可以指定比较特征是 BOX3D 还是几何。 但是,如果指定几何图形,则其边界框用于比较。
使用框架的“BOX3D”对象,查询如下所示:
SELECT ST_AsText(roads_geom) AS geom FROM roads WHERE roads_geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312);
请注意使用 SRID 312 来指定包络的投影。
pgsql2shp
表转储器连接到数据库并将表(可能由查询定义)转换为形状文件。 基本语法是:
pgsql2shp [<options >] <database > [<schema >.]<table>
pgsql2shp [<options >] <database > <query>
命令行选项包括:
-f <filename>
将输出写入特定文件名。
-h <host>
要连接到的数据库的主机名。
-p <port>
要连接到的数据库的端口。
-P <password>
用于连接到数据库的密码。
-u <user>
要连接到数据库的用户名。
-g <geometry column>
对于具有多个几何列的表,写入形状文件时要使用的几何列。
-b
使用二进制游标。 这将使操作更快,但如果表中的任何非几何属性缺少文本转换,则该操作将不起作用。
-r
原始模式。不要删除gid
字段或转义列名称。
-m filename
将标识符重新映射为十个字符名称。文件的内容是由单个空格分隔的两个符号行,并且没有尾随或前导空格:VERYLONGSYMBOL SHORTONE ANOTHERVERYLONGSYMBOL SHORTER 等。
空间索引使得使用空间数据库存储大型数据集成为可能。如果没有索引,搜索功能需要顺序扫描数据库中的每条记录。索引通过将数据组织成可快速遍历以查找匹配记录的结构来加快搜索速度。
通常用于属性数据的B树索引方法对于空间数据来说不是很有用,因为它只支持单个维度的数据存储和查询。诸如几何形状(具有 2 个或更多维度)之类的数据需要支持跨所有数据维度的范围查询的索引方法。PostgreSQL 在空间数据处理方面的主要优势之一是它提供了多种适用于多维数据的索引方法:GiST、BRIN 和 SP-GiST 索引。
GiST (广义搜索树) 索引将数据分解为“一侧的事物”、“重叠的事物”、“内部的事物”,并且可用于多种数据类型,包括 GIS 数据。PostGIS 使用在 GiST 之上实现的 R-Tree 索引来索引空间数据。 GiST是最常用、最通用的空间索引方法,提供非常好的查询性能。
BRIN (块范围索引)索引通过汇总表记录范围的空间范围进行操作。搜索是通过扫描范围来完成的。BRIN仅适用于某些类型的数据(空间排序、更新不频繁或不更新)。但它提供了更快的索引创建时间和更小的索引大小。
SP-GiST (空间分区广义搜索树)是一种通用索引方法,支持四叉树、k-d 树和基数树(tries)等分区搜索树。
空间索引仅存储几何图形的边界框。空间查询使用索引作为主要过滤器来快速确定一组可能与查询条件匹配的几何图形。大多数空间查询需要使用空间谓词函数的辅助过滤器 来测试更具体的空间条件。有关使用空间谓词进行查询的更多信息,请参阅Section 5.2, “使用空间索引” 。
另请参阅 PostGIS Workshop有关空间索引的部分以及PostgreSQL手册。
GiST 代表“广义搜索树”,是多维数据索引的通用形式。PostGIS 使用在 GiST 之上实现的 R-Tree 索引来索引空间数据。GiST是最常用、最通用的空间索引方法,提供非常好的查询性能。GiST 的其他实现用于加速对不适合普通 B 树索引的各种不规则数据结构(整数数组、光谱数据等)的搜索。有关详细信息,请参阅PostgreSQL手册。
一旦空间数据表超过几千行,您将需要构建索引来加速数据的空间搜索(除非您的所有搜索都基于属性,在这种情况下,您将需要在空间数据表上构建普通索引) 属性字段)。
在“geometry”列上构建 GiST 索引的语法如下:
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
上述语法将始终构建 2D 索引。若要获取几何类型的 n 维索引,可以使用以下语法创建一个索引:
CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);
构建空间索引是一项计算密集型工作。它还会在创建表时阻止对表的写入访问,因此在生产系统上,您可能希望以较慢的并发感知方式执行:
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING GIST ( [geometryfield] );
建立索引后,让 PostgreSQL 不时收集表上的统计信息会很有帮助。它用于优化查询计划:
VACUUM ANALYZE [table_name] [(column_name)];
BRIN 代表“区块范围索引”。 它是 PostgreSQL 9.5 中引入的通用索引方法。BRIN 是一种有损索引方法,这意味着需要进行二次检查来确认记录与给定的搜索条件匹配(所有提供的空间索引都是这种情况)。它提供更快的索引创建速度和更小的索引大小,以及合理的读取性能。 其主要目的是支持在与其在表中的物理位置相关的列上对非常大的表建立索引。 除了空间索引之外,BRIN 还可以加快各种属性数据结构(整数、数组等)的搜索速度。有关详细信息,请参阅PostgreSQL手册。
一旦空间表超过几千行,您将需要构建索引来加速数据的空间搜索。只要 GiST 索引的大小不超过数据库可用的 RAM 量,并且只要您能够承受索引存储大小以及写入时更新索引的成本,GiST 索引的性能就非常好。 否则,对于非常大的表,可以考虑将 BRIN 索引作为替代方案。
BRIN 索引存储包围一组连续的表块(称为块范围)中的行中包含的所有几何图形的边界框。使用索引执行查询时,将扫描块范围以查找与查询范围相交的块范围。仅当数据经过物理排序以使块范围的边界框具有最小重叠(并且理想情况下是互斥的)时,这才是有效的。 生成的索引非常小,但读取相同数据时的性能通常低于 GiST 索引。
构建 BRIN 索引比构建 GiST 索引占用的 CPU 资源要少得多。我们经常发现,对于相同数据,BRIN 索引的构建速度比 GiST 索引快十倍。由于 BRIN 索引只为每个表块范围存储一个边界框,因此通常使用的磁盘空间比 GiST 索引少一千倍。
您可以选择要在某个范围内汇总的块数。 如果减少这个数字,索引会更大,但可能会提供更好的性能。
为了使 BRIN 有效,表数据应按物理顺序存储,从而最大限度地减少块范围重叠量。数据可能已经适当排序(例如,如果它是从已按空间顺序排序的另一个数据集加载的)。否则,这可以通过按一维空间键对数据进行排序来完成。 一种方法是创建一个按几何值排序的新表(在最近的 PostGIS 版本中使用有效的希尔伯特曲线排序):
CREATE TABLE table_sorted AS SELECT * FROM table ORDER BY geom;
或者,可以通过使用 GeoHash 作为(临时)索引并对该索引进行聚类来对数据进行适当排序:
CREATE INDEX idx_temp_geohash ON table USING btree (ST_GeoHash( ST_Transform( geom, 4326 ), 20)); CLUSTER table USING idx_temp_geohash;
在geometry
列上构建 BRIN 索引的语法为:
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col] );
上述语法构建二维索引。若要生成三维索引,请使用以下语法:
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geome_col] brin_geometry_inclusion_ops_3d);
您还可以使用 4D 运算符类获取 4D 维度索引:
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geome_col] brin_geometry_inclusion_ops_4d);
在上面的命令中,范围内的块数使用默认值 128。 此语句用于指定聚合中某个区域中的块数
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col] ) WITH (pages_per_range = [number]);
请记住,BRIN 索引仅存储大量行的一个索引条目。如果您的表存储具有混合维数的几何图形,则生成的索引的性能可能会很差。您可以通过选择存储几何图形维数最少的运算符类来避免这种性能损失
BRIN 索引支持geography
数据类型。在geography列上构建 BRIN 索引的语法是:
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geog_col] );
上述语法为椭球体上的地理空间对象构建 2D 索引。
目前,仅提供“包容性支持”,这意味着只有&&
、~
和 @
运算符可用于 2D 情况(对于几何
和地理
),而运算符 &&&
只能用于 3D 几何图形。目前不支持 kNN 搜索。
BRIN 与其他索引类型的一个重要区别是数据库不会动态维护索引。对表中空间数据的更改只需附加到索引的末尾。这将导致索引搜索性能随着时间的推移而降低。 可以通过执行 VACUUM
或使用特殊函数brin_summarize_new_values(regclass)
来更新索引。 因此,BRIN 可能最适合用于只读或很少更改的数据。有关更多信息,请参阅手册。
总结一下对空间数据使用 BRIN 的情况:
索引构建时间非常快,索引大小非常小。
索引查询时间比 GiST 慢,但完全可以接受。
要求按空间顺序对表数据进行排序。
需要手动维护索引。
它最适合重叠很少或没有重叠(例如,点)且静态或不经常更改的大型表。
对于返回相对大量数据记录的查询更有效。
SP-GiST代表“空间分区广义搜索树”,是多维数据类型索引的通用形式,支持分区搜索树,例如四叉树、k-d 树和基数树 (tries)。 这些数据结构的共同特征是它们将搜索空间重复划分为大小不必相等的分区。除了空间索引之外,SP-GiST 还用于加速多种数据的搜索,例如电话路由、ip 路由、子字符串搜索等。有关更多信息,请参阅PostgreSQL手册。
与 GiST 索引的情况一样,SP-GiST索引是有损的,因为它们存储包围空间对象的边界框。SP-GiST 索引可以被视为 GiST 索引的替代方案。
一旦 GIS 数据表超过几千行,就可以使用 SP-GiST 索引来加速数据的空间搜索。 在“geometry”列上构建 SP-GiST 索引的语法如下:
CREATE INDEX [indexname] ON [tablename] USING SPGIST ( [geometryfield] );
上面的语句构建了一个二维索引。 几何类型的三维索引是使用三维运算符类生成的,如下所示:
CREATE INDEX [indexname] ON [tablename] USING SPGIST ([geometryfield] spgist_geometry_ops_3d);
构建空间索引是一项计算密集型操作。它还会在创建表时阻止对表的写入访问,因此在生产系统上,您可能希望以较慢的并发感知方式执行操作:
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING SPGIST ( [geometryfield] );
建立索引后,让 PostgreSQL 不时收集表上的统计信息会很有帮助。它用于优化查询计划:
VACUUM ANALYZE [table_name] [(column_name)];
SP-GiST 索引可以加速涉及以下运算符的查询:
对于二维索引,<<, &<, &>, >>, <<|, &<|, |&>, |>>, &&, @>, <@, 和 ~=
对于三维索引,&/&, ~==, @>>,和<<@。
目前不支持 kNN 搜索。
通常,索引会无形中加速数据访问:一旦建立索引,PostgreSQL查询规划器就会自动决定何时使用它来提高查询性能。但在某些情况下,规划器不会选择使用现有索引,因此查询最终会使用缓慢的顺序扫描而不是空间索引。
如果发现空间索引未被使用, 您可以执行以下几项操作:
可以通过测试查询计划和查看查询来计算所需的内容。不正确的连接、忘记的表和不正确的表可能会导致多次意外的表记录查找。若要获取查询计划,请在查询开始时执行EXPLAIN
。
确保收集有关表中值的数量和分布的统计信息,以便为查询规划者提供更好的信息来做出有关索引使用的决策。VACUUM ANALYZE将计算两者。
无论如何,您应该定期清理数据库。许多 PostgreSQL DBA 定期将 VACUUM 作为非高峰 cron 作业运行。
如果清理没有帮助,您可以使用命令SET ENABLE_SEQSCAN TO OFF;暂时强制规划器使用索引信息。 通过这种方式,您可以检查规划器是否能够为您的查询生成索引加速查询计划。您应该仅使用此命令进行调试;一般来说,规划者比你更了解何时使用索引。运行查询后,不要忘记运行SET ENABLE_SEQSCAN TO ON; 以便规划器能够正常运行其他查询。
如果 SET ENABLE_SEQSCAN TO OFF; 帮助您的查询运行得更快,则您的 Postgres 可能未针对您的硬件进行调整。 如果您发现规划器对顺序扫描与索引扫描的成本有误,请尝试减小 RANDOM_PAGE_COST
值(位于 postgresql.conf
中),或使用 SET RANDOM_PAGE_COST TO 1.1;。 RANDOM_PAGE_COST
的默认值为 4.0。 尝试将其设置为 1.1(对于 SSD)或 2.0(对于快速磁盘)。 减小该值使规划器更有可能使用索引扫描。
如果SET ENABLE_SEQSCAN TO OFF;对您的查询没有帮助,该查询可能使用 Postgres 规划器尚无法优化的 SQL 构造。 可以以规划器能够处理的方式重写查询。例如,具有内联 SELECT 的子查询可能不会产生有效的计划,但可能会使用 LATERAL JOIN 进行重写。
有关更多信息,请参阅 PostgreSQL 手册的查询规划部分。
空间数据库存在的理由是在数据库内执行查询,这通常需要桌面 GIS 功能。有效使用 PostGIS 需要了解哪些空间函数可用、如何在查询中使用它们,并确保适当的索引以提供良好的性能。
空间关系显示两个几何图形如何相互关联。用于查询几何的基本功能。
根据OpenGIS SQL简单特征实现规范,“比较两个几何图形的基本方法是对两个几何图形的内部、边界和外部之间的相交进行交集测试,并根据'交集矩阵'的元素对两个几何之间的关系进行分类。”
在点集拓扑理论中,嵌入二维空间的几何中的点被分为三个集合:
几何的边界是下一个较低维度的几何的集合。 对于维数为 0 的 POINT
,边界是空集。LINESTRING
的边界是两个端点。 对于POLYGON
,边界是外环和内环的线条。
几何图形的内部是几何图形中不在边界内的那些点。对于POINT
来说,内部就是点本身。LINESTRING
的内部是端点之间的点集。 对于POLYGON
,内部是多边形内的面。
几何体的外部是几何体嵌入的空间的其余部分;换句话说,所有不在几何内部或边界上的点。 它是一个二维非封闭曲面。
九交模型 (DE-9IM)通过指定每个几何图形的上述集合之间的 9 个相交的维度来描述两个几何图形之间的空间关系。交集维度可以正式表示为 3x3 交集矩阵。
对于几何图形g,内部、边界和外部使用符号I(g)、B(g)和E(g)表示。 此外,dim(s) 表示集合s (域为 {0,1,2,F}
):
0
=> 点集合
1
=> 线集合
2
=> 面集合
F
=>空集合
使用此表示法,两个几何a和b的交集矩阵为:
内部(Interior) | 边界(Boundary) | 外部(Exterior) | |
---|---|---|---|
内部(Interior) | dim( I(a) ∩ I(b) ) | dim( I(a) ∩ B(b) ) | dim( I(a) ∩ E(b) ) |
边界(Boundary) | dim( B(a) ∩ I(b) ) | dim( B(a) ∩ B(b) ) | dim( B(a) ∩ E(b) ) |
外部(Exterior) | dim( E(a) ∩ I(b) ) | dim( E(a) ∩ B(b) ) | dim( E(a) ∩ E(b) ) |
从视觉上看,对于两个重叠的多边形几何图形,如下所示:
| ||||||||||||||||||
|
|
从左到右,从上到下阅读。交集矩阵的字符串表示形式为“212101212”。
欲了解更多信息,请访问:
适用于 SQL 的 OpenGIS 简单功能实现规范 (1.1版本, 第 2.1.13.2 节)
为了便于确定常见的空间关系,OGC SFS 定义了一组命名空间关系谓词。PostGIS 将这些功能提供为函数 ST_Contains, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within。 它还定义了非标准关系谓词 ST_Covers, ST_CoveredBy, 和ST_ContainsProperly。
空间谓词通常用作 SQL WHERE
或JOIN
子句中的条件。如果空间索引可用,命名空间谓词会自动使用空间索引,因此无需使用边界框运算符&&
。例如:
SELECT city.name, state.name, city.geom FROM city JOIN state ON ST_Intersects(city.geom, state.geom);
有关更多详细信息和插图,请参阅PostGIS Workshop.
在某些情况下,指定的空间关系不足以提供所需的空间过滤条件。
![]() 例如,考虑表示道路网络的线性数据集。 可能需要识别所有相互交叉的路段,不是在一个点,而是在一条线上(也许是为了验证某些业务规则)。 在这种情况下,ST_Crosses不提供必要的空间过滤器,因为对于线性要素,它仅在它们在某个点交叉的地方返回 两步解决方案是首先计算空间相交 (ST_Intersection)的道路线对的实际交叉点 (ST_Intersects),然后检查交叉点的 ST_GeometryType 是否为“ 显然,更简单、更快捷的解决方案更可取。 |
![]() 第二个例子是定位与湖泊边界相交的码头,并且码头的一端位于岸上。换句话说,如果码头位于湖泊内但未完全被湖泊包围,则与湖泊边界相交于一条线,并且码头的端点之一恰好位于湖泊边界内或湖泊边界上。 可以使用空间谓词的组合来查找所需的特征:
|
这些要求可以通过计算完整的 DE-9IM 交集矩阵来满足。PostGIS 提供了ST_Relate 函数来执行此操作:
SELECT ST_Relate( 'LINESTRING (1 1, 5 5)', 'POLYGON ((3 3, 3 7, 7 7, 7 3, 3 3))' ); st_relate ----------- 1010F0212
为了测试特定的空间关系,使用相交矩阵模式。这是用附加符号{T,*}
增强的矩阵表示:
T
=> 表示交集的维度不为空;即{0,1,2}
*
=> 任何东西
使用交叉矩阵模式,可以以更简洁的方式评估特定的空间关系。ST_Relate和ST_RelateMatch 函数可用于测试相交矩阵模式。 对于上面的第一个示例,指定两条线相交的交集矩阵模式为1*1***1**':
-- Find road segments that intersect in a line SELECT a.id FROM roads a, roads b WHERE a.id != b.id AND a.geom && b.geom AND ST_Relate(a.geom, b.geom, '1*1***1**');
这是第二个示例。当线部分位于多边形内部和外部时,相交矩阵模式为‘102101FF2’:
-- Find wharves partly on a lake's shoreline SELECT a.lake_id, b.wharf_id FROM lakes a, wharfs b WHERE a.geom && b.geom AND ST_Relate(a.geom, b.geom, '102101FF2');
使用空间条件构建查询时,为了获得最佳性能,确保使用空间索引(如果存在)非常重要(请参阅Section 4.9, “空间索引”)。为此,必须在查询的WHERE
或ON
子句中使用空间运算符或索引感知函数。
空间运算符包括边界框运算符(其中最常用的是&&; 有关完整列表,请参见Section 7.10.1, “边界框运算符”)以及最近邻查询中使用的距离运算符(最常见的是<->; 有关完整列表,请参见 Section 7.10.2, “距离运算符”。)
索引感知函数会自动将边界框运算符添加到空间条件中。 索引感知函数包括命名空间关系谓词 ST_Contains, ST_ContainsProperly, ST_CoveredBy, ST_Covers, ST_Crosses, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within, ST_Within, 和ST_3DIntersects 以及距离谓词ST_DWithin, ST_DFullyWithin, ST_3DDFullyWithin, 和 ST_3DDWithin。)
ST_Distance 等函数不使用索引来优化其操作。例如,以下查询在大型表上会非常慢:
SELECT geom FROM geom_table WHERE ST_Distance( geom, 'SRID=312;POINT(100000 200000)' ) < 100
此查询选择 geom_table
中距离该点 (100000, 200000) 100 个单位 以内的所有几何图形。 它会很慢,因为它正在计算表中每个点与指定点之间的距离,即为进行ST_Distance()
计算(对表中的每一行)。
通过使用索引感知函数ST_DWithin 可以大大减少处理的行数:
SELECT geom FROM geom_table WHERE ST_DWithin( geom, 'SRID=312;POINT(100000 200000)', 100 )
此查询选择相同的几何图形,但采用更有效的方法。 通过使用ST_DWithin()
带有查询几何图形的放大边界框的&&
运算符,可以在内部实现。 如果geom
存在空间索引,则查询规划器知道该索引可用于在计算距离之前减少感兴趣的行数。空间索引允许您仅搜索与边界框扩展范围重叠的几何,从而搜索 可能位于所需距离内的几何。 然后执行实际距离计算以查看结果集中的记录是否包括在内。
有关详细信息和示例,请参阅PostGIS Workshop。
本节中的示例使用线性道路表和多边形城市边界表。bc_roads
表的定义是:
Column | Type | Description ----------+-------------------+------------------- gid | integer | Unique ID name | character varying | Road Name geom | geometry | Location Geometry (Linestring)
bc_municipality
表定义如下:
Column | Type | Description ---------+-------------------+------------------- gid | integer | Unique ID code | integer | Unique ID name | character varying | City / Town Name geom | geometry | Location Geometry (Polygon)
5.3.1. | 道路的总长度是多少公里? |
这个问题可以用非常简单的SQL来回答,例如: SELECT sum(ST_Length(geom))/1000 AS km_roads FROM bc_roads; km_roads ------------------ 70842.1243039643 | |
5.3.2. | 乔治王子城有多大(以公顷为单位)? |
此查询将空间计算(面面积)与属性条件(自治市名称)结合使用: SELECT ST_Area(geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE'; hectares ------------------ 32657.9103824927 | |
5.3.3. | 按面积计算,该省最大的直辖市是哪个? |
此查询使用空间测量作为排序值。 有多种方法可以解决此问题,但最有效的方法如下: SELECT name, ST_Area(geom)/10000 AS hectares FROM bc_municipality ORDER BY hectares DESC LIMIT 1; name | hectares ---------------+----------------- TUMBLER RIDGE | 155020.02556131 请注意,为了回答这个查询,我们必须计算每个多边形的面积。 如果我们经常这样做,那么向表中添加一个区域列是有意义的,可以为性能建立索引。 通过按降序对结果进行排序,并使用 PostgreSQL“LIMIT”命令,我们可以轻松地仅选择最大值,而无需使用 MAX() 等聚合函数。 | |
5.3.4. | 每个城市包含的道路总长度是多少? |
这是“空间联接”的示例,它使用空间交互(“包含”)作为联接条件(而不是在公共键上联接的通常关系方法)将来自两个表(带有联接)的数据汇集在一起 : SELECT m.name, sum(ST_Length(r.geom))/1000 as roads_km FROM bc_roads AS r JOIN bc_municipality AS m ON ST_Contains(m.geom, r.geom) GROUP BY m.name ORDER BY roads_km; name | roads_km ----------------------------+------------------ SURREY | 1539.47553551242 VANCOUVER | 1450.33093486576 LANGLEY DISTRICT | 833.793392535662 BURNABY | 773.769091404338 PRINCE GEORGE | 694.37554369147 ... 此查询需要一段时间,因为表中的每条道路都会汇总到最终结果中(示例表中大约有 250K 条道路)。 对于较小的数据集(数百条记录中的数千条),响应可能非常快。 | |
5.3.5. | 创建一个包含乔治王子市内所有道路的新表。 |
这是“覆盖”的一个示例。 也就是说,我们取两个表并输出一个由空间切割结果组成的新表。 与上面显示的“空间连接”不同,此查询实际上会生成新的几何图形。 生成的叠加就像涡轮增压的空间耦合,对于更精确的分析工作非常有用: CREATE TABLE pg_roads as SELECT ST_Intersection(r.geom, m.geom) AS intersection_geom, ST_Length(r.geom) AS rd_orig_length, r.* FROM bc_roads AS r JOIN bc_municipality AS m ON ST_Intersects(r.geom, m.geom) WHERE m.name = 'PRINCE GEORGE'; | |
5.3.6. | 维多利亚州的“道格拉斯街”有多长(公里)? |
SELECT sum(ST_Length(r.geom))/1000 AS kilometers FROM bc_roads r JOIN bc_municipality m ON ST_Intersects(m.geom, r.geom WHERE r.name = 'Douglas St' AND m.name = 'VICTORIA'; kilometers ------------------ 4.89151904172838 | |
5.3.7. | 哪个市政面的孔洞最大? |
SELECT gid, name, ST_Area(geom) AS area FROM bc_municipality WHERE ST_NRings(geom) > 1 ORDER BY area DESC LIMIT 1; gid | name | area -----+--------------+------------------ 12 | SPALLUMCHEEN | 257374619.430216 |
当前版本的PostgreSQL(包括9.6)在TOAST表后面的查询优化器中存在弱点。TOAST 表是一种“扩展室”,用于存储不适合普通数据页面(例如长文本、图像或具有许多顶点的复杂几何图形)的巨大值(就数据大小而言)。 有关更多信息,请参阅 Toast的PostgreSQL文档。
如果您碰巧有一个具有相当大的几何形状的表格,但它们的行数不是太多(例如包含所有欧洲国家的高分辨率边界的表格),则会出现问题。 那么表本身很小,但是它使用了大量的TOAST空间。 在我们的示例中,表本身约有 80 行,仅使用 3 个数据页,但 TOAST 表使用 8225 个页面。
现在,让我们使用几何运算符&&来查询很少匹配的边界框。对于查询优化器,该表似乎只有 3 页和 80 行。 优化程序估计按顺序遍历小表比使用索引更快。然后我们决定忽略 GiST 索引。 通常,这种做法是正确的。 但是,在这种情况下,&&运算符必须从磁盘调用所有几何图形并将其与边界框进行比较,因此还必须调用所有TOAST页面。
要查看您是否遇到此问题,请使用“EXPLAIN ANALYZE”postgresql 命令。 有关更多信息和技术细节,您可以阅读 PostgreSQL 性能邮件列表上的线程:http://archives.postgresql.org/pgsql-performance/2005-02/msg00030.php
另请参阅 PostGIS 中的新线程 https://lists.osgeo.org/pipermail/postgis-devel/2017-June/026209.html
PostgreSQL社区正试图通过制作 TOAST 感知查询引用来解决这个问题。目前,有两种解决办法:
第一个解决方法是强制查询规划器使用索引。发送“SET enable_seqscan TO off;” 在发出查询之前发送到服务器。这基本上迫使查询规划器尽可能避免顺序扫描。所以它像往常一样使用 GIST 索引。 但是必须在每个连接上设置此标志,并且它会导致查询规划器在其他情况下做出错误估计,因此您应该在查询后“SET enable_seqscan TO on;” 。
第二个解决方法是使顺序扫描与查询规划器认为的一样快。这可以通过创建一个“缓存”bbox的附加列并与之匹配来实现。在我们的示例中,命令如下:
SELECT AddGeometryColumn('myschema','mytable','bbox','4326','GEOMETRY','2'); UPDATE mytable SET bbox = ST_Envelope(ST_Force2D(geom));
现在更改查询以对bbox使用&&运算符 而不是geom_column,例如:
SELECT geom_column FROM mytable WHERE bbox && ST_SetSRID('BOX3D(0 0,1 1)'::box3d,4326);
当然,如果您更改或添加行到mytable,则必须保持 bbox“同步”。最透明的方法是使用触发器,但您也可以修改应用程序以保持 bbox 列最新或在每次修改后运行上面的 UPDATE 查询。
对于大多数只读的表,以及大多数查询使用单个索引的情况,PostgreSQL 提供了 CLUSTER 命令。该命令按照与索引标准相同的顺序对所有数据行进行物理重新排序,从而产生两个性能优势:首先,对于索引范围扫描,数据表上的查找次数大大减少。其次,如果您的工作集集中在索引上的一些小间隔,则您的缓存会更有效,因为数据行分布在更少的数据页上。(此时请阅读 PostgreSQL 手册中的 CLUSTER 命令文档。)
但是,由于 GiST 索引只是忽略 NULL 值,因此当前无法在 PostGIS 中对 GiST 索引进行聚类,并且您会收到以下错误消息:
lwgeom=# CLUSTER my_geom_index ON my_table; ERROR: cannot cluster when index access method does not handle null values HINT: You may be able to work around this by marking column "geom" NOT NULL.
正如提示消息所说,向表添加“非空”限制将暂时解决此缺陷。 例如:
lwgeom=# ALTER TABLE my_table ALTER COLUMN geom SET not null; ALTER TABLE
当然,如果您实际上需要几何列中的 NULL 值,则这将不起作用。 此外,您必须使用上述方法添加约束,使用 CHECK 约束,例如“ALTER TABLE blubb ADD CHECK (geometry is not null);” 不管用。
有时,您的表中碰巧有3D 或 4D 数据,但始终使用仅输出 2D 几何图形的符合OpenGIS 的 ST_AsText() 或 ST_AsBinary() 函数来访问它。他们通过内部调用 ST_Force2D() 函数来实现这一点,这会给大型几何图形带来巨大的开销。 为了避免这种开销,一次性预先删除这些额外的维度可能是可行的:
UPDATE mytable SET geom = ST_Force2D(geom); VACUUM FULL ANALYZE mytable;
请注意,如果您使用 AddGeometryColumn() 添加几何列,则几何维度将会受到限制。要绕过它,您需要删除约束。请记住更新geometry_columns 表中的条目并随后重新创建约束。
对于大型表,明智的做法是通过 WHERE 子句和主键或其他可行标准将 UPDATE 限制为表的一部分,然后运行简单的“VACUUM;”,从而将此 UPDATE 划分为更小的部分。 在您的更新之间。 这大大减少了对临时磁盘空间的需求。此外,如果您有混合维度几何图形,则通过“WHEREdimension(geom)>2”限制 UPDATE 会跳过对已经处于 2D 中的几何图形的重写。
下面给出的功能是 PostGIS 用户可能需要的功能。 还有一些其他功能是 PostGIS 对象所需的支持功能,但一般用户用不到。
![]() | |
PostGIS 已经开始从现有的命名约定过渡到以 SQL-MM 为中心的约定。 因此,您所了解和喜爱的大多数函数都已使用标准空间类型 (ST) 前缀进行了重命名。 以前的功能仍然可用,但本文档中未列出更新后的功能等效的功能。 本文档中未列出的非 ST_ 函数已被弃用,并将在未来版本中删除,因此请停止使用它们。 |
本节列出了 PostGIS 安装的用于表示空间数据的自定义 PostgreSQL 数据类型。
每种数据类型都描述其类型转换行为。类型转换将一种数据类型的值转换为另一种类型。 PostgreSQL 允许定义自定义类型的转换行为,以及用于转换类型值的函数。强制转换可以具有自动 行为,允许将函数参数自动转换为函数支持的类型。
某些转换具有 显式行为,这意味着必须使用语法CAST(myval As sometype)
或 myval::sometype
指定转换。 显式转换避免了不明确的转换问题,这种情况在使用不支持给定类型的重载函数时可能会发生。 例如,函数可以接受 box2d 或 box3d,但不能接受几何图形。由于几何体会自动转换为两种盒子类型,因此这会产生“模糊函数”错误。 为了防止错误,请使用显式转换为所需的框类型。
所有数据类型都可以转换为text
,因此,无需显示指定它。
box2d — 表示二维边界框的类型。
box2d
是一种空间数据类型,用于表示包围几何图形或几何图形集合的二维边界框。例如, ST_Extent 聚合函数返回一个box2d
对象。
该表示包含值xmin, ymin, xmax, ymax
。 这些是 X 和 Y 范围的最小值和最大值。
box2d
对象具有类似于BOX(1 2,5 6)
的文本表示形式。
下表列出了此数据类型允许的自动和显式强制转换:
转换到 | 行为 |
box3d | automatic |
geometry | automatic |
box3d — 表示三维边界框的类型。
box3d
是一种 PostGIS 空间数据类型,用于表示包围几何图形或几何图形集合的三维边界框。例如,ST_3DExtent 聚合函数返回一个box3d
对象。
该表示包含值xmin, ymin, zmin, xmax, ymax, zmax
。 这些是 X、Y 和 Z 范围的最小值和最大值。
box3d
的文本表示如BOX3D(1 2 3,5 6 5)
所示。
下表列出了此数据类型允许的自动和显式强制转换:
转换到 | 行为 |
box | automatic |
box2d | automatic |
geometry | automatic |
geometry — 表示具有平面坐标系的空间要素的类型。
geometry
是一种基本的 PostGIS 空间数据类型,用于表示平面(欧几里得)坐标系上的要素。
对几何体的所有空间操作都使用几何体所在的空间参考系的单位。
下表列出了此数据类型允许的自动和显式强制转换:
转换到 | 行为 |
box | automatic |
box2d | automatic |
box3d | automatic |
bytea | automatic |
geography | automatic |
text | automatic |
geometry_dump — 用于描述复杂几何形状部分的复合类型。
geometry_dump
是一种复合数据类型,包含以下字段:
geom
- 表示转储几何图形组件的几何图形。 几何类型取决于原始函数。
path[]
- 一个整数数组,用于定义转储几何图形中到 geom
组件的导航路径。路径数组从 1 开始(即path[1]
是第一个元素。)
ST_Dump*
系列函数使用它作为输出类型,将复杂的几何图形分解为其组成部分。
geography — 使用大地(椭球)坐标系表示空间特征的类型。
geography
是一种空间数据类型,用于表示大地坐标系中的要素。 大地坐标系使用椭球体对地球进行建模。
通过考虑椭球体模型,对地理类型的空间操作可提供更准确的结果。
下表列出了此数据类型允许的自动和显式强制转换:
转换到 | 行为 |
geometry | 显式强制转换 |
这些函数有助于定义包含几何列的表。
AddGeometryColumn — 将geometry(几何)列添加到现有表。
text AddGeometryColumn(
varchar table_name, varchar column_name, integer srid, varchar type, integer dimension, boolean use_typmod=true)
;
text AddGeometryColumn(
varchar schema_name, varchar table_name, varchar column_name, integer srid, varchar type, integer dimension, boolean use_typmod=true)
;
text AddGeometryColumn(
varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid, varchar type, integer dimension, boolean use_typmod=true)
;
将几何列添加到现有属性表。schema_name
是表模式的名称。srid
必须是对 SPATIAL_REF_SYS 表中条目的整数值引用。 类型
必须是与几何类型相对应的字符串,例如 'POLYGON' 或 'MULTILINESTRING' 。如果 schemaname 不存在(或在当前 search_path 中不可见)或指定的 SRID、几何类型或维度无效,则会引发错误。
![]() | |
更改:2.0.0 此函数不再更新geometry_columns,因为geometry_columns 是从系统目录读取的视图。默认情况下,它也不创建约束,而是使用 PostgreSQL 内置的类型修饰符行为。 因此,例如,使用此函数构建wgs84 POINT 列现在相当于: 更改:2.0.0 如果您需要约束的旧行为,请使用默认的 |
![]() | |
更改:2.0.0 视图不能再在 Geometry_columns 中手动注册,但是根据几何 Typmod 表几何图形构建并在没有包装器函数的情况下使用的视图将正确注册自身,因为它们继承了父表列的 Typmod 行为。 使用输出其他几何图形的几何函数的视图需要转换为typmod 几何图形,以便这些视图几何列能够在geometry_columns 中正确注册。请参阅Section 4.6.3, “手动注册几何列”。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
增强:2.0.0 引入了 use_typmod 参数。 默认创建typmod几何列而不是基于约束。
-- Create schema to hold data CREATE SCHEMA my_schema; -- Create a new simple PostgreSQL table CREATE TABLE my_schema.my_spatial_table (id serial); -- Describing the table shows a simple table with a single "id" column. postgis=# \d my_schema.my_spatial_table Table "my_schema.my_spatial_table" Column | Type | Modifiers --------+---------+------------------------------------------------------------------------- id | integer | not null default nextval('my_schema.my_spatial_table_id_seq'::regclass) -- Add a spatial column to the table SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom',4326,'POINT',2); -- Add a point using the old constraint based behavior SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom_c',4326,'POINT',2, false); --Add a curvepolygon using old constraint behavior SELECT AddGeometryColumn ('my_schema','my_spatial_table','geomcp_c',4326,'CURVEPOLYGON',2, false); -- Describe the table again reveals the addition of a new geometry columns. \d my_schema.my_spatial_table addgeometrycolumn ------------------------------------------------------------------------- my_schema.my_spatial_table.geomcp_c SRID:4326 TYPE:CURVEPOLYGON DIMS:2 (1 row) Table "my_schema.my_spatial_table" Column | Type | Modifiers ----------+----------------------+------------------------------------------------------------------------- id | integer | not null default nextval('my_schema.my_spatial_table_id_seq'::regclass) geom | geometry(Point,4326) | geom_c | geometry | geomcp_c | geometry | Check constraints: "enforce_dims_geom_c" CHECK (st_ndims(geom_c) = 2) "enforce_dims_geomcp_c" CHECK (st_ndims(geomcp_c) = 2) "enforce_geotype_geom_c" CHECK (geometrytype(geom_c) = 'POINT'::text OR geom_c IS NULL) "enforce_geotype_geomcp_c" CHECK (geometrytype(geomcp_c) = 'CURVEPOLYGON'::text OR geomcp_c IS NULL) "enforce_srid_geom_c" CHECK (st_srid(geom_c) = 4326) "enforce_srid_geomcp_c" CHECK (st_srid(geomcp_c) = 4326) -- geometry_columns view also registers the new columns -- SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims FROM geometry_columns WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema'; col_name | type | srid | ndims ----------+--------------+------+------- geom | Point | 4326 | 2 geom_c | Point | 4326 | 2 geomcp_c | CurvePolygon | 4326 | 2
DropGeometryColumn — 从空间表中移除geometry(几何)列。
text DropGeometryColumn(
varchar table_name, varchar column_name)
;
text DropGeometryColumn(
varchar schema_name, varchar table_name, varchar column_name)
;
text DropGeometryColumn(
varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name)
;
从空间表中删除几何列。请注意,schema_name 需要与 Geometry_columns 表中的表行的 f_table_schema 字段相匹配。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
![]() | |
更改:2.0.0 提供此函数是为了向后兼容。现在,由于 Geometry_columns 现在是针对系统目录的视图,因此您可以使用 |
SELECT DropGeometryColumn ('my_schema','my_spatial_table','geom'); ----RESULT output --- dropgeometrycolumn ------------------------------------------------------ my_schema.my_spatial_table.geom effectively removed. -- In PostGIS 2.0+ the above is also equivalent to the standard -- the standard alter table. Both will deregister from geometry_columns ALTER TABLE my_schema.my_spatial_table DROP column geom;
DropGeometryTable — 删除表及其在geometry_columns中的所有引用。
boolean DropGeometryTable(
varchar table_name)
;
boolean DropGeometryTable(
varchar schema_name, varchar table_name)
;
boolean DropGeometryTable(
varchar catalog_name, varchar schema_name, varchar table_name)
;
删除表及其在geometry_columns中的所有引用。 注意:如果未提供模式,则在模式感知的 pgsql 安装上使用 current_schema() 。
![]() | |
更改:2.0.0 提供此函数是为了向后兼容。现在,由于 Geometry_columns 现在是针对系统目录的视图,因此您可以使用 |
SELECT DropGeometryTable ('my_schema','my_spatial_table'); ----RESULT output --- my_schema.my_spatial_table dropped. -- The above is now equivalent to -- DROP TABLE my_schema.my_spatial_table;
Find_SRID — 返回geometry(几何)列中定义的 SRID。
integer Find_SRID(
varchar a_schema_name, varchar a_table_name, varchar a_geomfield_name)
;
通过搜索 GEOMETRY_COLUMNS 表返回指定几何列的整数 SRID。如果几何列尚未正确添加(例如使用AddGeometryColumn 函数),则此函数将不起作用。
SELECT Find_SRID('public', 'tiger_us_state_2007', 'geom_4269'); find_srid ---------- 4269
Populate_Geometry_Columns — 确保几何列由类型修饰符定义或具有适当的空间约束。
text Populate_Geometry_Columns(
boolean use_typmod=true)
;
int Populate_Geometry_Columns(
oid relation_oid, boolean use_typmod=true)
;
确保几何列具有适当的类型修饰符或空间约束,以确保它们在geometry_columns
视图中正确注册。默认情况下,会将所有没有类型修饰符的几何列转换为具有类型修饰符的几何列。
为了向后兼容和空间需求(例如表继承,其中每个子表可能具有不同的几何类型),仍然支持旧的检查约束行为。如果您需要旧的行为,则需要将新的可选参数作为 falseuse_typmod=false
传递。完成此操作后,将创建不带类型修饰符的几何列,但将定义 3 个约束。 特别是,这意味着属于表的每个几何列至少具有三个约束:
enforce_dims_geom
- 确保每个几何图形具有相同的维度(请参阅ST_NDims)
enforce_geotype_geom
- 确保每个几何具有相同的类型(请参阅GeometryType)
enforce_srid_geom
- 确保所有几何图形位于同一投影中(请参阅ST_SRID)
如果提供了表 oid
,则此函数会尝试确定表中所有几何列的 srid、维度和几何类型,并根据需要添加约束。 如果成功,则会将适当的行插入到 Geometry_columns 表中,否则,将捕获异常并引发错误通知来描述问题。
如果提供了视图的oid
,与表 oid 一样,此函数会尝试确定视图中所有几何图形的 srid、维度和类型,将适当的条目插入到 geometry_columns
表中,但不会执行任何操作来强制执行约束 。
无参数格式是参数格式的简单包装器,它首先删除并重新填充数据库中每个空间表和视图的 Geometry_columns 表,并在适当的情况下向表中添加空间约束。 它返回在数据库中检测到的几何列数以及插入到 geometry_columns
表中的列数的摘要。 参数格式仅返回插入到geometry_columns
表中的行数。
可用性:1.4.0
更改:2.0.0 默认情况下,现在使用类型修饰符而不是检查约束来约束几何类型。您仍然可以通过使用新的 use_typmod
并将其设置为 false 来使用检查约束行为。
增强:2.0.0 引入了use_typmod
可选参数,允许控制是否使用typmodifiers或检查约束创建列。
CREATE TABLE public.myspatial_table(gid serial, geom geometry); INSERT INTO myspatial_table(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) ); -- This will now use typ modifiers. For this to work, there must exist data SELECT Populate_Geometry_Columns('public.myspatial_table'::regclass); populate_geometry_columns -------------------------- 1 \d myspatial_table Table "public.myspatial_table" Column | Type | Modifiers --------+---------------------------+--------------------------------------------------------------- gid | integer | not null default nextval('myspatial_table_gid_seq'::regclass) geom | geometry(LineString,4326) |
-- This will change the geometry columns to use constraints if they are not typmod or have constraints already. --For this to work, there must exist data CREATE TABLE public.myspatial_table_cs(gid serial, geom geometry); INSERT INTO myspatial_table_cs(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) ); SELECT Populate_Geometry_Columns('public.myspatial_table_cs'::regclass, false); populate_geometry_columns -------------------------- 1 \d myspatial_table_cs Table "public.myspatial_table_cs" Column | Type | Modifiers --------+----------+------------------------------------------------------------------ gid | integer | not null default nextval('myspatial_table_cs_gid_seq'::regclass) geom | geometry | Check constraints: "enforce_dims_geom" CHECK (st_ndims(geom) = 2) "enforce_geotype_geom" CHECK (geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL) "enforce_srid_geom" CHECK (st_srid(geom) = 4326)
UpdateGeometrySRID — 更新几何列中所有要素的 SRID 以及表元数据。
text UpdateGeometrySRID(
varchar table_name, varchar column_name, integer srid)
;
text UpdateGeometrySRID(
varchar schema_name, varchar table_name, varchar column_name, integer srid)
;
text UpdateGeometrySRID(
varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid)
;
更新几何列中所有要素的SRID,更新 Geometry_columns 中的约束和参考。 如果该列是由类型定义强制执行的,则类型定义将会更改。 注意:如果未提供模式,则在模式感知的 pgsql 安装上使用 current_schema() 。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
将几何图形插入道路表,其中 SRID 集已使用 EWKT 格式 :
COPY roads (geom) FROM STDIN; SRID=4326;LINESTRING(0 0, 10 10) SRID=4326;LINESTRING(10 10, 15 0) \.
这会将路表更改为 4326,无论它以前是什么 SRID:
SELECT UpdateGeometrySRID('roads','geom',4326);
前面的示例相当于以下 DDL 语句:
ALTER TABLE roads ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326) USING ST_SetSRID(geom,4326);
如果您在加载时投影错误(或将其引入为未知),并且您想一次性转换为 Web 墨卡托,您可以使用 DDL 来完成此操作,但没有等效的 PostGIS 管理功能可以一次性完成此操作。
ALTER TABLE roads ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 3857) USING ST_Transform(ST_SetSRID(geom,4326),3857) ;
ST_Collect — 从一组几何图形创建 GeometryCollection 或 Multi* 几何图形。
geometry ST_Collect(
geometry g1, geometry g2)
;
geometry ST_Collect(
geometry[] g1_array)
;
geometry ST_Collect(
geometry set g1field)
;
将几何图形收集到几何图形集合中。 结果是 Multi* 或 GeometryCollection,具体取决于输入几何图形是否具有相同或不同类型(同质或异构)。输入几何图形在集合中保持不变。
第一种形式:接受两个输入几何图形
第二种形式: 接受几何数组
第三种形式: 接受几何行集的聚合函数。
![]() | |
如果任何输入几何图形是集合(Multi* 或 GeometryCollection),ST_Collect 返回 GeometryCollection(因为这是唯一可以包含嵌套集合的类型)。 为了防止这种情况,请在子查询中使用ST_Dump 将输入集合扩展到其原子元素(请参见下面的示例)。 |
![]() | |
ST_Collect 和ST_Union 看起来很相似,但实际上操作方式却截然不同。ST_Collect 将几何图形聚合到一个集合中,而不以任何方式更改它们。 ST_Union 在几何上合并重叠的几何图形,并在交叉点分割线串。当它合并边界时,它可能会返回单个几何图形。 |
可用性:引入了 1.4.0 - ST_Collect(几何)。 ST_Collect已得到增强,可以更快地处理更多几何图形。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
合并2D点。
SELECT ST_AsText( ST_Collect( ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(-2 3)') )); st_astext ---------- MULTIPOINT((1 2),(-2 3))
合并3D点。
SELECT ST_AsEWKT( ST_Collect( ST_GeomFromEWKT('POINT(1 2 3)'), ST_GeomFromEWKT('POINT(1 2 4)') ) ); st_asewkt ------------------------- MULTIPOINT(1 2 3,1 2 4)
合并曲线。
SELECT ST_AsText( ST_Collect( 'CIRCULARSTRING(220268 150415,220227 150505,220227 150406)', 'CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)')); st_astext ------------------------------------------------------------------------------------ MULTICURVE(CIRCULARSTRING(220268 150415,220227 150505,220227 150406), CIRCULARSTRING(220227 150406,2220227 150407,220227 150406))
使用子查询的数组构造函数。
SELECT ST_Collect( ARRAY( SELECT geom FROM sometable ) );
使用数组构造函数来获取值。
SELECT ST_AsText( ST_Collect( ARRAY[ ST_GeomFromText('LINESTRING(1 2, 3 4)'), ST_GeomFromText('LINESTRING(3 4, 4 5)') ] )) As wktcollect; --wkt collect -- MULTILINESTRING((1 2,3 4),(3 4,4 5))
通过在表中对几何进行分组来生成多个集合。
SELECT stusps, ST_Collect(f.geom) as geom FROM (SELECT stusps, (ST_Dump(geom)).geom As geom FROM somestatetable ) As f GROUP BY stusps
ST_LineFromMultiPoint — 从多点几何创建线串。
geometry ST_LineFromMultiPoint(
geometry aMultiPoint)
;
从 3D 多点创建 3D 线串
SELECT ST_AsEWKT( ST_LineFromMultiPoint('MULTIPOINT(1 2 3, 4 5 6, 7 8 9)') )); --result-- LINESTRING(1 2 3,4 5 6,7 8 9)
ST_MakeEnvelope — 根据最小和最大坐标创建矩形多边形。
geometry ST_MakeEnvelope(
float xmin, float ymin, float xmax, float ymax, integer srid=unknown)
;
根据最小值和最大值 X 和 Y 生成矩形多边形。 输入值必须与 SRID 指定的空间参考系统匹配。如果未指定 SRID,则使用未知空间参考系统 (SRID 0)。
可用性:1.5
增强:2.0:引入了在不指定 SRID 的情况下指定外包矩形的功能。
SELECT ST_AsText( ST_MakeEnvelope(10, 10, 11, 11, 4326) ); st_asewkt ----------- POLYGON((10 10, 10 11, 11 11, 11 10, 10 10))
ST_MakeLine — 从Point, MultiPoint,或LineString geometries创建LineString。
geometry ST_MakeLine(
geometry geom1, geometry geom2)
;
geometry ST_MakeLine(
geometry[] geoms_array)
;
geometry ST_MakeLine(
geometry set geoms)
;
创建包含 Point、MultiPoint 或 LineString 几何图形的点的 LineString。 其他几何类型会导致错误。
第一种形式:接受两个输入几何图形
第二种形式: 接受几何数组
第三种形式:接受几何行集的聚合函数。为了确保输入几何的顺序,请在函数调用中使用ORDER BY
,或使用带有ORDER BY
子句的子查询。
输入 LineString 开头的重复节点将折叠为单个点。 Point 和 MultiPoint 输入中的重复点不会折叠。 ST_RemoveRepeatedPoints可用于折叠输出 LineString 中的重复点。
该函数支持 3d 并且不会丢失 z-index。
可用性:2.3.0 - 引入了对MultiPoint输入元素的支持
可用性:2.0.0 - 引入了对 LineString 输入元素的支持
可用性:1.4.0 - 引入了 ST_MakeLine(geomarray)。 ST_MakeLine 聚合函数得到增强,可以更快地处理更多点。
生成一条由两个点组成的线。
SELECT ST_AsText( ST_MakeLine(ST_Point(1,2), ST_Point(3,4)) ); st_astext --------------------- LINESTRING(1 2,3 4)
从两个三维点生成三维线。
SELECT ST_AsEWKT( ST_MakeLine(ST_MakePoint(1,2,3), ST_MakePoint(3,4,5) )); st_asewkt ------------------------- LINESTRING(1 2 3,3 4 5)
从两个未连接的线串生成一条线。
select ST_AsText( ST_MakeLine( 'LINESTRING(0 0, 1 1)', 'LINESTRING(2 2, 3 3)' ) ); st_astext ----------------------------- LINESTRING(0 0,1 1,2 2,3 3)
从由带排序的子查询形成的数组创建一条线。
SELECT ST_MakeLine( ARRAY( SELECT ST_Centroid(geom) FROM visit_locations ORDER BY visit_time) );
从三维点数组生成三维线
SELECT ST_AsEWKT( ST_MakeLine( ARRAY[ ST_MakePoint(1,2,3), ST_MakePoint(3,4,5), ST_MakePoint(6,6,6) ] )); st_asewkt ------------------------- LINESTRING(1 2 3,3 4 5,6 6 6)
此示例从一组轨迹中查询基于时间的 GPS 点序列,并为每个轨迹创建一条记录。 结果几何图形是由按行进顺序的 GPS 轨迹点组成的 LineStrings。
ORDER BY
子句可用于以正确的顺序生成线串。
SELECT gps.track_id, ST_MakeLine(gps.geom ORDER BY gps_time) As geom FROM gps_points As gps GROUP BY track_id;
在PostgreSQL 9之前,可以使用子查询中的排序。但是,查询计划可能不遵循子查询的顺序。
SELECT gps.track_id, ST_MakeLine(gps.geom) As geom FROM ( SELECT track_id, gps_time, geom FROM gps_points ORDER BY track_id, gps_time ) As gps GROUP BY track_id;
ST_MakePoint — 创建 2D、3DZ 或 4D 点。
geometry ST_MakePoint(
float x, float y)
;
geometry ST_MakePoint(
float x, float y, float z)
;
geometry ST_MakePoint(
float x, float y, float z, float m)
;
创建一个2D XY、3D XYZ 或 4D XYZM 的点几何对象。使用 ST_MakePointM 来创建带有 XYM 坐标的点。
使用 ST_SetSRID 来为创建的点指定一个空间参考标识码(SRID)。
虽然不符合 OGC 标准,但ST_MakePoint
比ST_GeomFromText 和 ST_PointFromText更快、更精确。 它也更容易用于数字坐标值。
![]() | |
对于大地坐标, |
![]() | |
可以使用函数 ST_Point、ST_PointZ、ST_PointM 和 ST_PointZM 来创建具有指定 SRID 的点。 |
该函数支持 3d 并且不会丢失 z-index。
-- Create a point with unknown SRID SELECT ST_MakePoint(-71.1043443253471, 42.3150676015829); -- Create a point in the WGS 84 geodetic CRS SELECT ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829),4326); -- Create a 3D point (e.g. has altitude) SELECT ST_MakePoint(1, 2,1.5); -- Get z of point SELECT ST_Z(ST_MakePoint(1, 2,1.5)); result ------- 1.5
ST_MakePointM — 根据 X、Y 和 M 值创建一个点。
geometry ST_MakePointM(
float x, float y, float m)
;
创建一个具有X、Y和M(测量值)坐标的点。使用 ST_MakePoint 来创建具有XY、XYZ或XYZM坐标的点。
使用 ST_SetSRID 来为创建的点指定一个空间参考标识码(SRID)。
![]() | |
对于大地坐标, |
![]() | |
函数 ST_PointM 和 ST_PointZM 可用于创建具有 M 值和指定 SRID 的点。 |
生成具有未知 SRID 的点。
SELECT ST_AsEWKT( ST_MakePointM(-71.1043443253471, 42.3150676015829, 10) ); st_asewkt ----------------------------------------------- POINTM(-71.1043443253471 42.3150676015829 10)
在 WGS 84 地理坐标系中生成具有 M 值的点。
SELECT ST_AsEWKT( ST_SetSRID( ST_MakePointM(-71.104, 42.315, 10), 4326)); st_asewkt --------------------------------------------------------- SRID=4326;POINTM(-71.104 42.315 10)
获取生成点的 M 值。
SELECT ST_M( ST_MakePointM(-71.104, 42.315, 10) ); result ------- 10
ST_MakePolygon — 从壳和可选的孔列表创建多边形。
geometry ST_MakePolygon(
geometry linestring)
;
geometry ST_MakePolygon(
geometry outerlinestring, geometry[] interiorlinestrings)
;
创建由给定壳和可选孔阵列形成的多边形。 输入几何图形必须是闭合的线串(环)。
形式1:接受单个外壳线串。
形式2: 接受外壳 LineString 和内部(孔)LineString 数组。可以使用 PostgreSQL array_agg()、ARRAY[] 或 ARRAY() 结构来构造几何数组。
![]() | |
此函数不接受多行字符串。 使用 ST_LineMerge生成线串。它还使用ST_Dump 来提取线串。 |
该函数支持 3d 并且不会丢失 z-index。
从 2D 线串生成多边形。
SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)'));
使用 ST_StartPoint 和 ST_AddPoint闭合开放线串以生成面。
SELECT ST_MakePolygon( ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line)) ) FROM ( SELECT ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)') As open_line) As foo;
从 3D 线串生成多边形
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)')); st_asewkt ----------- POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
从具有 M 值的线串生成多边形
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)' )); st_asewkt ---------- POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
创建一个带有额外孔的环形多边形
SELECT ST_MakePolygon( ST_ExteriorRing( ST_Buffer(ring.line,10)), ARRAY[ ST_Translate(ring.line, 1, 1), ST_ExteriorRing(ST_Buffer(ST_Point(20,20),1)) ] ) FROM (SELECT ST_ExteriorRing( ST_Buffer(ST_Point(10,10),10,10)) AS line ) AS ring;
创建一组省份边界,其中的孔代表湖泊。输入是省份多边形/多边形表和水域线串表。 形成湖泊的线是通过使用ST_IsClosed确定的。 使用ST_Boundary 提取省份线条。 根据ST_MakePolygon
的要求,通过使用 ST_LineMerge将边界强制为单个 LineString。 (但是,请注意,如果一个省份拥有多个区域或拥有岛屿,这将生成无效的多边形。)使用 LEFT JOIN 可确保包括所有省份,即使它们没有湖泊。
![]() | |
使用 CASE 构造是因为将空数组传递到 ST_MakePolygon 会导致 NULL 返回值。 |
SELECT p.gid, p.province_name, CASE WHEN array_agg(w.geom) IS NULL THEN p.geom ELSE ST_MakePolygon( ST_LineMerge(ST_Boundary(p.geom)), array_agg(w.geom)) END FROM provinces p LEFT JOIN waterlines w ON (ST_Within(w.geom, p.geom) AND ST_IsClosed(w.geom)) GROUP BY p.gid, p.province_name, p.geom;
另一种技术是利用相关子查询和 ARRAY() 构造函数将行集转换为数组。
SELECT p.gid, p.province_name, CASE WHEN EXISTS( SELECT w.geom FROM waterlines w WHERE ST_Within(w.geom, p.geom) AND ST_IsClosed(w.geom)) THEN ST_MakePolygon( ST_LineMerge(ST_Boundary(p.geom)), ARRAY( SELECT w.geom FROM waterlines w WHERE ST_Within(w.geom, p.geom) AND ST_IsClosed(w.geom))) ELSE p.geom END AS geom FROM provinces p;
ST_Point — 创建具有 X、Y 和 SRID 值的点。
geometry ST_Point(
float x, float y)
;
geometry ST_Point(
float x, float y, integer srid=unknown)
;
返回具有给定 X和Y 坐标值的 Point。 这是 ST_MakePoint 的 SQL-MM 等效项,仅采用 X 和 Y。
![]() | |
对于大地坐标, |
增强:3.2.0 srid作为额外的可选参数被添加。 较旧的安装需要与 ST_SetSRID 结合以在几何体上标记 srid。
该方法实现了SQL/MM规范。 SQL-MM 3: 6.1.2
SELECT ST_Point( -71.104, 42.315);
创建一个指定了SRID的点:
SELECT ST_Point( -71.104, 42.315, 4326);
指定 SRID 的另一种方式:
SELECT ST_SetSRID( ST_Point( -71.104, 42.315), 4326);
创建 地理 点(使用 ::
转换语法):
SELECT ST_Point( -71.104, 42.315, 4326)::geography;
在Pre-PostGIS 3.2版本的代码中,使用 CAST
:
SELECT CAST( ST_SetSRID(ST_Point( -71.104, 42.315), 4326) AS geography);
如果点的坐标不在地理坐标系(如 WGS84)中,则必须先执行坐标变换,然后再将其投射到地理。在此示例中,宾夕法尼亚州平面英尺 (SRID 2273) 上的点将转换为 WGS84 (SRID 4326)。
SELECT ST_Transform( ST_Point( 3637510, 3014852, 2273), 4326)::geography;
ST_PointZ — 创建具有 X、Y、Z 和 SRID 值的点。
geometry ST_PointZ(
float x, float y, float z, integer srid=unknown)
;
生成具有给定 X、Y 和 Z 坐标值的点,如果给定,则还具有 SRID 值。
增强:3.2.0 srid作为额外的可选参数被添加。 较旧的安装需要与 ST_SetSRID 结合以在几何体上标记 srid。
SELECT ST_PointZ(-71.104, 42.315, 3.4, 4326)
SELECT ST_PointZ(-71.104, 42.315, 3.4, srid => 4326)
SELECT ST_PointZ(-71.104, 42.315, 3.4)
ST_PointM — 创建具有 X、Y、M 和 SRID 值的点。
geometry ST_PointM(
float x, float y, float m, integer srid=unknown)
;
生成一个点,该点给定了 X、Y 和 M 坐标值,如果给定,则还具有 SRID 值。
增强:3.2.0 srid作为额外的可选参数被添加。 较旧的安装需要与 ST_SetSRID 结合以在几何体上标记 srid。
SELECT ST_PointM(-71.104, 42.315, 3.4, 4326)
SELECT ST_PointM(-71.104, 42.315, 3.4, srid => 4326)
SELECT ST_PointM(-71.104, 42.315, 3.4)
ST_PointZM — 创建具有 X、Y、Z、M 和 SRID 值的点。
geometry ST_PointZM(
float x, float y, float z, float m, integer srid=unknown)
;
生成一个点,该点给定了 X,Y,Z,M 坐标值,如果给定,则还具有 SRID 值。
增强:3.2.0 srid作为额外的可选参数被添加。 较旧的安装需要与 ST_SetSRID 结合以在几何体上标记 srid。
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5, 4326)
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5, srid => 4326)
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5)
ST_Polygon — 从具有指定 SRID 的线串创建多边形。
geometry ST_Polygon(
geometry lineString, integer srid)
;
返回根据给定 LineString 构建的多边形,并根据srid
设置空间参考系统。
ST_Polygon类似于ST_MakePolygon 格式 1,但添加了 SRID 设置。
要创建带孔的多边形,请使用 ST_MakePolygon 格式 2,然后使用 ST_SetSRID。
![]() | |
此函数不接受多行字符串。 使用 ST_LineMerge生成线串。它还使用ST_Dump 来提取线串。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 8.3.2
该函数支持 3d 并且不会丢失 z-index。
生成二维多边形。
SELECT ST_AsText( ST_Polygon('LINESTRING(75 29, 77 29, 77 29, 75 29)'::geometry, 4326) ); -- result -- POLYGON((75 29, 77 29, 77 29, 75 29))
生成三维多边形。
SELECT ST_AsEWKT( ST_Polygon( ST_GeomFromEWKT('LINESTRING(75 29 1, 77 29 2, 77 29 3, 75 29 1)'), 4326) ); -- result -- SRID=4326;POLYGON((75 29 1, 77 29 2, 77 29 3, 75 29 1))
ST_TileEnvelope — 使用 XYZ 切片系统在 Web Mercator (SRID:3857) 中创建矩形多边形。
geometry ST_TileEnvelope(
integer tileZoom, integer tileX, integer tileY, geometry bounds=SRID=3857;LINESTRING(-20037508.342789 -20037508.342789,20037508.342789 20037508.342789), float margin=0.0)
;
创建一个矩形多边形,给出 XYZ切片系统中切片的范围。该图块由缩放级别 Z 和该级别的网格中图块的 XY 索引指定。 可用于定义 ST_AsMVTGeom所需的图块边界,以将几何图形转换为 MVT 图块坐标空间。
默认情况下,切片范围位于Web Mercator坐标系 (SRID:3857) 中,使用 Web 墨卡托系统的标准范围(-20037508.342789、20037508.342789)。这是 MVT 图块最常用的坐标系。 可选的bounds
参数可用于在任何坐标系中生成图块。 它是一个几何体,具有 SRID 和“缩放级别零”正方形的范围,XYZ 图块系统内切在该正方形内。
可选的margin
参数可用于将图块扩展给定的百分比。 例如。margin=0.125
将图块扩展 12.5%,相当于当图块范围大小为 4096 时 buffer=512(如 ST_AsMVTGeom中使用的)。这对于创建图块缓冲区以包含位于图块可见区域之外的数据非常有用,但其存在会影响图块渲染。例如,城市名称(一个点)可能靠近图块的边缘,因此其标签应该呈现在两个图块上,即使该点仅位于一个图块的可见区域中。在查询中使用扩展图块将在两个图块中包含城市点。 使用负值来缩小图块。 禁止使用小于 -0.5 的值,因为这会完全消除图块。与ST_AsMVTGeom
一起使用时,请勿指定边距。 请参阅 ST_AsMVT。
增强:添加了3.1.0 margin 参数。
可用性:3.0.0
SELECT ST_AsText( ST_TileEnvelope(2, 1, 1) ); st_astext ------------------------------ POLYGON((-10018754.1713945 0,-10018754.1713945 10018754.1713945,0 10018754.1713945,0 0,-10018754.1713945 0)) SELECT ST_AsText( ST_TileEnvelope(3, 1, 1, ST_MakeEnvelope(-180, -90, 180, 90, 4326) ) ); st_astext ------------------------------------------------------ POLYGON((-135 45,-135 67.5,-90 67.5,-90 45,-135 45))
ST_HexagonGrid — 返回一组完全覆盖几何参数边界的六边形和单元格索引。
setof record ST_HexagonGrid(
float8 size, geometry bounds)
;
从平面六边形格网的概念开始。(不是地球仪的六边形格网,这不是H3格网方案。)对于给定的平面 SRS 和给定的边缘大小,从 SRS 的原点开始,有一种独特的平面六边形格网,Tiling(SRS, Size)。此函数回答了以下问题:给定 Tiling(SRS, Size) 中的哪些六边形与给定边界重叠。
输出六边形的 SRS 是边界几何体提供的 SRS。
将六边形的边缘尺寸加倍或三倍会生成与原始格网相匹配的新父格网。不幸的是,不可能生成子格网完全适合内部的父六边形格网。
可用性:3.1.0
要针对六边形格网进行点聚合,请使用点的范围作为边界生成六边形网格,然后在空间上连接到该网格。
SELECT COUNT(*), hexes.geom FROM ST_HexagonGrid( 10000, ST_SetSRID(ST_EstimatedExtent('pointtable', 'geom'), 3857) ) AS hexes INNER JOIN pointtable AS pts ON ST_Intersects(pts.geom, hexes.geom) GROUP BY hexes.geom;
如果我们为每个多边形边界生成一组六边形并过滤掉那些不与其六边形相交的六边形,我们最终会得到每个多边形的格网。
州切片提供每个州的六边形的覆盖范围,多个六边形与州边界重叠。
![]() | |
当引用 FROM 列表中的先前表时,LATERAL关键字隐含在返回集合的函数中。因此,CROSS JOIN LATERAL、CROSS JOIN 或简单的 CROSS JOIN LATERAL 是本示例的等效构造。 |
SELECT admin1.gid, hex.geom FROM admin1 CROSS JOIN ST_HexagonGrid(100000, admin1.geom) AS hex WHERE adm0_a3 = 'USA' AND ST_Intersects(admin1.geom, hex.geom)
ST_Hexagon — 使用提供的边尺寸和六边形网格空间内的单元坐标返回单个六边形。
geometry ST_Hexagon(
float8 size, integer cell_i, integer cell_j, geometry origin)
;
使用与 ST_HexagonGrid相同的六边形格网概念,但在所需的单元格坐标处仅生成一个六边形。(可选)可以调整格网的原点坐标,默认原点为 0,0。
生成的六边形没有设置 SRID,因此请使用 ST_SetSRID 将 SRID 设置为您期望的值。
可用性:3.1.0
SELECT ST_AsText(ST_SetSRID(ST_Hexagon(1.0, 0, 0), 3857)); POLYGON((-1 0,-0.5 -0.866025403784439,0.5 -0.866025403784439,1 0,0.5 0.866025403784439,-0.5 0.866025403784439,-1 0))
ST_SquareGrid — 返回一组完全覆盖几何参数边界的网格正方形和单元格索引。
setof record ST_SquareGrid(
float8 size, geometry bounds)
;
从平面正方形格网的概念开始。对于给定的平面 SRS 和给定的边缘尺寸,从 SRS 的原点开始,存在一个独特的平面方形格网,Tiling(SRS, Size)。此函数回答了以下问题:给定 Tiling(SRS, Size) 中的哪些网格与给定边界重叠。
输出正方形的 SRS 是边界几何的 SRS。
正方形的加倍或边缘大小会生成与原始格网完美契合的新父格网。墨卡托中的标准网络地图格网只是墨卡托平面中的两个平方网格的幂。
可用性:3.1.0
网格将填充国家/地区的整个边界,因此如果您只想接触国家/地区的方块,则必须随后使用 ST_Intersects 进行过滤。
WITH grid AS ( SELECT (ST_SquareGrid(1, ST_Transform(geom,4326))).* FROM admin0 WHERE name = 'Canada' ) SELEcT ST_AsText(geom) FROM grid
要针对方形格网进行点聚合,请使用点的范围作为边界生成方形网格,然后在空间上连接到该网格。请注意,估计范围可能与实际范围有所不同,因此请务必谨慎,至少确保您已分析了表。
SELECT COUNT(*), squares.geom FROM pointtable AS pts INNER JOIN ST_SquareGrid( 1000, ST_SetSRID(ST_EstimatedExtent('pointtable', 'geom'), 3857) ) AS squares ON ST_Intersects(pts.geom, squares.geom) GROUP BY squares.geom
这会产生与第一个示例相同的结果,但对于大量点来说会变慢
SELECT COUNT(*), squares.geom FROM pointtable AS pts INNER JOIN ST_SquareGrid( 1000, pts.geom ) AS squares ON ST_Intersects(pts.geom, squares.geom) GROUP BY squares.geom
ST_Square — 使用提供的边缘大小和正方形网格空间内的单元格坐标返回单个正方形。
geometry ST_Square(
float8 size, integer cell_i, integer cell_j, geometry origin)
;
使用与ST_SquareGrid相同的正方形格网概念,但仅在所需的单元格坐标处生成一个正方形。(可选)可以调整平铺的原点坐标,默认原点为 0,0。
生成的方块没有设置 SRID,因此请使用 ST_SetSRID 将 SRID 设置为您期望的值。
可用性:3.1.0
SELECT ST_AsText(ST_SetSRID(ST_Square(1.0, 0, 0), 3857)); POLYGON((0 0,0 1,1 1,1 0,0 0))
ST_Letters — 返回渲染为几何图形的输入字母,默认起始位置位于原点,默认文本高度为 100。
geometry ST_Letters(
text letters, json font)
;
使用内置字体将字符串渲染为多边形几何体。默认文本高度为 100.0,即从下行字母底部到大写字母顶部的距离。默认起始位置将基线的起点置于原点。 覆盖字体涉及传入一个 json 映射,以字符为键,并以 base64 编码的 TWKB 作为字体形状,字体从下行底部到大写顶部的高度为 1000 个单位。
默认情况下,文本是在原点生成的,因此要重新定位文本并调整文本大小,请首先应用 ST_Scale
函数,然后应用ST_Translate
函数。
可用性: 3.3.0
SELECT ST_AsText(ST_Letters('Yo'), 1);
ST_Letter生成的字符
SELECT ST_Translate(ST_Scale(ST_Letters('Yo'), 10, 10), 100,100);
geometry_dump
行。geometry_dump
行。geometry_dump
行。geometry_dump
行。GeometryType — 以文本形式返回几何的类型。
text GeometryType(
geometry geomA)
;
以字符串形式返回几何类型,例如“LINESTRING”、“POLYGON”、“MULTIPOINT”等。
OGC SPEC s2.1.1.1 - 返回 Geometry 的可实例化子类型的名称,Geometry 的可实例化子类型的名称以字符串形式返回。
![]() | |
该函数还通过返回“POINTM”形式的字符串来指示是否具有M值。 |
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); geometrytype -------------- LINESTRING
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result POLYHEDRALSURFACE
SELECT GeometryType(geom) as result FROM (SELECT ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') AS geom ) AS g; result -------- TIN
ST_Boundary — 返回几何图形的边界。
geometry ST_Boundary(
geometry geomA)
;
返回此 Geometry 的组合边界的闭合。组合边界的定义如 OGC SPEC 第 3.12.3.2 节中所述。由于该函数的结果是一个闭包,因此是拓扑封闭的,因此可以使用 OGC SPEC 第 3.12.2 节中讨论的表征几何基元来表示生成的边界。
它是通过GEOS模块实现的
![]() | |
在 2.0.0 之前,如果与 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 OGC SPEC s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1.17
该函数支持 3d 并且不会丢失 z-index。
增强:引入了 2.1.0 三角函数支持
更改:3.2.0 支持 TIN,不使用地理,不线性化曲线
![]() 具有重叠边界点的线串
SELECT ST_Boundary(geom) FROM (SELECT 'LINESTRING(100 150,50 60, 70 80, 160 170)'::geometry As geom) As f;
ST_AsText output
MULTIPOINT((100 150),(160 170))
| ![]() 具有边界多线串的多边形孔
SELECT ST_Boundary(geom) FROM (SELECT '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 ))'::geometry As geom) As f;
ST_AsText output
MULTILINESTRING((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))
|
SELECT ST_AsText(ST_Boundary(ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)'))); st_astext ----------- MULTIPOINT((1 1),(-1 1)) SELECT ST_AsText(ST_Boundary(ST_GeomFromText('POLYGON((1 1,0 0, -1 1, 1 1))'))); st_astext ---------- LINESTRING(1 1,0 0,-1 1,1 1) --Using a 3d polygon SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromEWKT('POLYGON((1 1 1,0 0 1, -1 1 1, 1 1 1))'))); st_asewkt ----------------------------------- LINESTRING(1 1 1,0 0 1,-1 1 1,1 1 1) --Using a 3d multilinestring SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromEWKT('MULTILINESTRING((1 1 1,0 0 0.5, -1 1 1),(1 1 0.5,0 0 0.5, -1 1 0.5, 1 1 0.5) )'))); st_asewkt ---------- MULTIPOINT((-1 1 1),(1 1 0.75))
ST_BoundingDiagonal — 返回几何边界框的对角线。
geometry ST_BoundingDiagonal(
geometry geom, boolean fits=false)
;
以线串形式返回给定几何图形的边界框的对角线。它是一个由两点组成的线串,从最小点开始,到最大点结束。如果输入几何为空,则对角线为空。
可选的fits
参数指定是否需要最佳拟合。如果为 false,则可以接受稍大的边界框的对角线(对于具有许多顶点的几何图形,计算速度更快)。无论哪种情况,返回的对角线的边界框始终覆盖输入几何体。
返回的几何体保留输入几何体的 SRID 和维度(Z 和 M 存在)。
![]() | |
在退化情况下(即输入中的单个顶点),返回的线串将在形式上无效(无内部)。 结果在拓扑上仍然有效。 |
可用性:2.2.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
-- Get the minimum X in a buffer around a point SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( ST_Buffer(ST_Point(0,0),10) ))); st_x ------ -10
ST_StartPoint, ST_EndPoint, ST_X, ST_Y, ST_Z, ST_M, ST_Envelope
ST_CoordDim — 返回几何体的坐标维度。
integer ST_CoordDim(
geometry geomA)
;
返回ST_Geometry值的坐标维度。
这是 ST_NDims 的 MM 兼容别名
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.3
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_CoordDim('CIRCULARSTRING(1 2 3, 1 3 4, 5 6 7, 8 9 10, 11 12 13)'); ---result-- 3 SELECT ST_CoordDim(ST_Point(1,2)); --result-- 2
ST_Dimension — 返回几何图形的拓扑维数。
integer ST_Dimension(
geometry g)
;
返回此 Geometry 对象的拓扑维度,该维度必须小于或等于坐标维度。 OGC SPEC s2.1.1.1 - 对于 POINT
返回 0,对于LINESTRING
返回 1,对于POLYGON
返回 2,以及GEOMETRYCOLLECTION
组件的最大尺寸。如果尺寸未知(例如,对于空 GEOMETRYCOLLECTION
),则返回 0。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.2
增强:2.0.0 引入了多面体曲面支持和 TIN 支持。当给定空几何时,它不再引发异常。
![]() | |
在 2.0.0 之前,提供空几何图形会引发异常。 |
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_Dimension('GEOMETRYCOLLECTION(LINESTRING(1 1,0 0),POINT(0 0))'); ST_Dimension ----------- 1
ST_Dump — 返回几何组件的一组 geometry_dump
行。
geometry_dump[] ST_Dump(
geometry g1)
;
提取几何组件的集合返回函数 (SRF)。 它返回一组 geometry_dump 行,每行包含一个几何图形(geom
字段)和一个整数数组(path
字段)。
对于基本几何类型(POINT、LINESTRING、POLYGON),返回单个记录,其中包含空path
数组,输入几何图形为 geom
。对于集合或多几何体,将为每个集合组件返回一条记录,并且路径
表示组件在集合内的位置。
ST_Dump 对于扩展几何结构很有用。 它与ST_Collect / GROUP BY 相反,它创建新行。例如,它可用于将 MULTIPOLYGONS 扩展为 POLYGONS。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
可用性:PostGIS 1.0.0RC1。需要 PostgreSQL 7.3 或更高版本。
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT sometable.field1, sometable.field1, (ST_Dump(sometable.geom)).geom AS geom FROM sometable; -- Break a compound curve into its constituent linestrings and circularstrings SELECT ST_AsEWKT(a.geom), ST_HasArc(a.geom) FROM ( SELECT (ST_Dump(p_geom)).geom AS geom FROM (SELECT ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))') AS p_geom) AS b ) AS a; st_asewkt | st_hasarc -----------------------------+---------- CIRCULARSTRING(0 0,1 1,1 0) | t LINESTRING(1 0,0 1) | f (2 rows)
-- Polyhedral surface example -- Break a Polyhedral surface into its faces SELECT (a.p_geom).path[1] As path, ST_AsEWKT((a.p_geom).geom) As geom_ewkt FROM (SELECT ST_Dump(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )') ) AS p_geom ) AS a; path | geom_ewkt ------+------------------------------------------ 1 | POLYGON((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)) 2 | POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)) 3 | POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)) 4 | POLYGON((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)) 5 | POLYGON((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)) 6 | POLYGON((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1))
-- TIN -- SELECT (g.gdump).path, ST_AsEWKT((g.gdump).geom) as wkt FROM (SELECT ST_Dump( ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') ) AS gdump ) AS g; -- result -- path | wkt ------+------------------------------------- {1} | TRIANGLE((0 0 0,0 0 1,0 1 0,0 0 0)) {2} | TRIANGLE((0 0 0,0 1 0,1 1 0,0 0 0))
ST_DumpPoints — 返回几何图形中坐标的一组 geometry_dump
行。
geometry_dump[] ST_DumpPoints(
geometry geom)
;
提取几何图形坐标(顶点)的集合返回函数 (SRF)。它返回一组geometry_dump行,每行包含一个几何图形(geom
字段)和一个整数数组(path
字段)。
geom
字段POINT
表示所提供几何图形的坐标。
path
字段(integer[]
)是枚举所提供几何图形元素中的坐标位置的索引。索引是从 1 开始的。例如,对于LINESTRING
,路径为 {i}
,其中i
是LINESTRING
中的第n
个坐标。 对于 POLYGON
,路径为{i,j}
,其中 i
是环编号(1 是外环;后面是内环),j
是环中的坐标位置。
要获取包含坐标的单个几何图形,请使用 ST_Points。
增强:2.1.0 速度更快。重新实现为原生C语言。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
可用性:1.1.0
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT edge_id, (dp).path[1] As index, ST_AsText((dp).geom) As wktnode FROM (SELECT 1 As edge_id , ST_DumpPoints(ST_GeomFromText('LINESTRING(1 2, 3 4, 10 10)')) AS dp UNION ALL SELECT 2 As edge_id , ST_DumpPoints(ST_GeomFromText('LINESTRING(3 5, 5 6, 9 10)')) AS dp ) As foo; edge_id | index | wktnode ---------+-------+-------------- 1 | 1 | POINT(1 2) 1 | 2 | POINT(3 4) 1 | 3 | POINT(10 10) 2 | 1 | POINT(3 5) 2 | 2 | POINT(5 6) 2 | 3 | POINT(9 10)
SELECT path, ST_AsText(geom) FROM ( SELECT (ST_DumpPoints(g.geom)).* FROM (SELECT 'GEOMETRYCOLLECTION( POINT ( 0 1 ), LINESTRING ( 0 3, 3 4 ), POLYGON (( 2 0, 2 3, 0 2, 2 0 )), POLYGON (( 3 0, 3 3, 6 3, 6 0, 3 0 ), ( 5 1, 4 2, 5 2, 5 1 )), MULTIPOLYGON ( (( 0 5, 0 8, 4 8, 4 5, 0 5 ), ( 1 6, 3 6, 2 7, 1 6 )), (( 5 4, 5 8, 6 7, 5 4 )) ) )'::geometry AS geom ) AS g ) j; path | st_astext -----------+------------ {1,1} | POINT(0 1) {2,1} | POINT(0 3) {2,2} | POINT(3 4) {3,1,1} | POINT(2 0) {3,1,2} | POINT(2 3) {3,1,3} | POINT(0 2) {3,1,4} | POINT(2 0) {4,1,1} | POINT(3 0) {4,1,2} | POINT(3 3) {4,1,3} | POINT(6 3) {4,1,4} | POINT(6 0) {4,1,5} | POINT(3 0) {4,2,1} | POINT(5 1) {4,2,2} | POINT(4 2) {4,2,3} | POINT(5 2) {4,2,4} | POINT(5 1) {5,1,1,1} | POINT(0 5) {5,1,1,2} | POINT(0 8) {5,1,1,3} | POINT(4 8) {5,1,1,4} | POINT(4 5) {5,1,1,5} | POINT(0 5) {5,1,2,1} | POINT(1 6) {5,1,2,2} | POINT(3 6) {5,1,2,3} | POINT(2 7) {5,1,2,4} | POINT(1 6) {5,2,1,1} | POINT(5 4) {5,2,1,2} | POINT(5 8) {5,2,1,3} | POINT(6 7) {5,2,1,4} | POINT(5 4) (29 rows)
-- Polyhedral surface cube -- SELECT (g.gdump).path, ST_AsEWKT((g.gdump).geom) as wkt FROM (SELECT ST_DumpPoints(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )') ) AS gdump ) AS g; -- result -- path | wkt ---------+-------------- {1,1,1} | POINT(0 0 0) {1,1,2} | POINT(0 0 1) {1,1,3} | POINT(0 1 1) {1,1,4} | POINT(0 1 0) {1,1,5} | POINT(0 0 0) {2,1,1} | POINT(0 0 0) {2,1,2} | POINT(0 1 0) {2,1,3} | POINT(1 1 0) {2,1,4} | POINT(1 0 0) {2,1,5} | POINT(0 0 0) {3,1,1} | POINT(0 0 0) {3,1,2} | POINT(1 0 0) {3,1,3} | POINT(1 0 1) {3,1,4} | POINT(0 0 1) {3,1,5} | POINT(0 0 0) {4,1,1} | POINT(1 1 0) {4,1,2} | POINT(1 1 1) {4,1,3} | POINT(1 0 1) {4,1,4} | POINT(1 0 0) {4,1,5} | POINT(1 1 0) {5,1,1} | POINT(0 1 0) {5,1,2} | POINT(0 1 1) {5,1,3} | POINT(1 1 1) {5,1,4} | POINT(1 1 0) {5,1,5} | POINT(0 1 0) {6,1,1} | POINT(0 0 1) {6,1,2} | POINT(1 0 1) {6,1,3} | POINT(1 1 1) {6,1,4} | POINT(0 1 1) {6,1,5} | POINT(0 0 1) (30 rows)
-- Triangle -- SELECT (g.gdump).path, ST_AsText((g.gdump).geom) as wkt FROM (SELECT ST_DumpPoints( ST_GeomFromEWKT('TRIANGLE (( 0 0, 0 9, 9 0, 0 0 ))') ) AS gdump ) AS g; -- result -- path | wkt ------+------------ {1} | POINT(0 0) {2} | POINT(0 9) {3} | POINT(9 0) {4} | POINT(0 0)
-- TIN -- SELECT (g.gdump).path, ST_AsEWKT((g.gdump).geom) as wkt FROM (SELECT ST_DumpPoints( ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') ) AS gdump ) AS g; -- result -- path | wkt ---------+-------------- {1,1,1} | POINT(0 0 0) {1,1,2} | POINT(0 0 1) {1,1,3} | POINT(0 1 0) {1,1,4} | POINT(0 0 0) {2,1,1} | POINT(0 0 0) {2,1,2} | POINT(0 1 0) {2,1,3} | POINT(1 1 0) {2,1,4} | POINT(0 0 0) (8 rows)
ST_DumpSegments — 为几何图形中的各个线段返回一组geometry_dump
行。
geometry_dump[] ST_DumpSegments(
geometry geom)
;
提取几何图形边的集合返回函数 (SRF)。它返回一组geometry_dump行,每行包含一个几何图形(geom
字段)和一个整数数组(path
字段)。
the geom
field LINESTRING
s represent the linear segments of the supplied geometry, while the CIRCULARSTRING
s represent the arc segments.
path
字段(integer[]
)是枚举所提供几何元素中的段起点位置的索引。索引是从 1 开始的。 例如,对于LINESTRING
,路径为 {i}
,其中i
是LINESTRING
中的第n
个线段起点。 对于 POLYGON
,路径为 {i,j}
,其中i
是环编号(1 是外环;后面是内环),j
是环中的线段起点位置。
可用性:3.2.0
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT path, ST_AsText(geom) FROM ( SELECT (ST_DumpSegments(g.geom)).* FROM (SELECT 'GEOMETRYCOLLECTION( LINESTRING(1 1, 3 3, 4 4), POLYGON((5 5, 6 6, 7 7, 5 5)) )'::geometry AS geom ) AS g ) j; path │ st_astext --------------------------------- {1,1} │ LINESTRING(1 1,3 3) {1,2} │ LINESTRING(3 3,4 4) {2,1,1} │ LINESTRING(5 5,6 6) {2,1,2} │ LINESTRING(6 6,7 7) {2,1,3} │ LINESTRING(7 7,5 5) (5 rows)
-- Triangle -- SELECT path, ST_AsText(geom) FROM ( SELECT (ST_DumpSegments(g.geom)).* FROM (SELECT 'TRIANGLE(( 0 0, 0 9, 9 0, 0 0 ))'::geometry AS geom ) AS g ) j; path │ st_astext --------------------------------- {1,1} │ LINESTRING(0 0,0 9) {1,2} │ LINESTRING(0 9,9 0) {1,3} │ LINESTRING(9 0,0 0) (3 rows)
-- TIN -- SELECT path, ST_AsEWKT(geom) FROM ( SELECT (ST_DumpSegments(g.geom)).* FROM (SELECT 'TIN((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )'::geometry AS geom ) AS g ) j; path │ st_asewkt --------------------------------- {1,1,1} │ LINESTRING(0 0 0,0 0 1) {1,1,2} │ LINESTRING(0 0 1,0 1 0) {1,1,3} │ LINESTRING(0 1 0,0 0 0) {2,1,1} │ LINESTRING(0 0 0,0 1 0) {2,1,2} │ LINESTRING(0 1 0,1 1 0) {2,1,3} │ LINESTRING(1 1 0,0 0 0) (6 rows)
ST_DumpRings — 返回多边形外环和内环的一组geometry_dump
行。
geometry_dump[] ST_DumpRings(
geometry a_polygon)
;
提取多边形环的集合返回函数 (SRF)。它返回一组geometry_dump 行,每行包含一个几何图形(geom
字段)和一个整数数组(path
字段)。
geom
字段将每个环包含为 POLYGON。path
字段是一个长度为 1 的整数数组,包含多边形环索引。外环(壳)的索引为 0。内环(孔)的索引为 1 及更高。
![]() | |
仅适用于POLYGON,它不适用于MULTIPOLYGONS |
可用性:需要 PostGIS 1.1.3 PostgreSQL 7.3 或更高版本。
该函数支持 3d 并且不会丢失 z-index。
查询的常规格式。
SELECT polyTable.field1, polyTable.field1, (ST_DumpRings(polyTable.geom)).geom As geom FROM polyTable;
具有单孔的多边形。
SELECT path, ST_AsEWKT(geom) As geom FROM ST_DumpRings( ST_GeomFromEWKT('POLYGON((-8149064 5133092 1,-8149064 5132986 1,-8148996 5132839 1,-8148972 5132767 1,-8148958 5132508 1,-8148941 5132466 1,-8148924 5132394 1, -8148903 5132210 1,-8148930 5131967 1,-8148992 5131978 1,-8149237 5132093 1,-8149404 5132211 1,-8149647 5132310 1,-8149757 5132394 1, -8150305 5132788 1,-8149064 5133092 1), (-8149362 5132394 1,-8149446 5132501 1,-8149548 5132597 1,-8149695 5132675 1,-8149362 5132394 1))') ) as foo; path | geom ---------------------------------------------------------------------------------------------------------------- {0} | POLYGON((-8149064 5133092 1,-8149064 5132986 1,-8148996 5132839 1,-8148972 5132767 1,-8148958 5132508 1, | -8148941 5132466 1,-8148924 5132394 1, | -8148903 5132210 1,-8148930 5131967 1, | -8148992 5131978 1,-8149237 5132093 1, | -8149404 5132211 1,-8149647 5132310 1,-8149757 5132394 1,-8150305 5132788 1,-8149064 5133092 1)) {1} | POLYGON((-8149362 5132394 1,-8149446 5132501 1, | -8149548 5132597 1,-8149695 5132675 1,-8149362 5132394 1))
ST_EndPoint — 返回 LineString 或 CircularLineString 的最后一个点。
geometry ST_EndPoint(
geometry g)
;
返回 LINESTRING
或CIRCULARLINESTRING
几何图形的最后一个点作为POINT
。 如果输入不是LINESTRING
或CIRCULARLINESTRING
,则返回 NULL
。
该方法实现了SQL/MM规范。 SQL-MM 3: 7.1.4
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
![]() | |
更改:2.0.0 不再适用于单个几何体 MultiLineStrings。 在旧版本的 PostGIS 中,单行 MultiLineString 可以使用此函数并返回终点。 在 2.0.0 中,它像任何其他 MultiLineString 一样返回 NULL。 旧的行为是一个未记录的功能,但是那些假设将数据存储为 LINESTRING 的人可能会在 2.0.0 中遇到这些返回 NULL 的情况。 |
线串(LineString)端点
postgis=# SELECT ST_AsText(ST_EndPoint('LINESTRING(1 1, 2 2, 3 3)'::geometry)); st_astext ------------ POINT(3 3)
非线串终止点为 NULL
SELECT ST_EndPoint('POINT(1 1)'::geometry) IS NULL AS is_null; is_null ---------- t
3D 线串(LineString)端点
--3d endpoint SELECT ST_AsEWKT(ST_EndPoint('LINESTRING(1 1 2, 1 2 3, 0 0 5)')); st_asewkt -------------- POINT(0 0 5)
圆弧 的端点
SELECT ST_AsText(ST_EndPoint('CIRCULARSTRING(5 2,-3 1.999999, -2 1, -4 2, 6 3)'::geometry)); st_astext ------------ POINT(6 3)
ST_Envelope — 返回表示几何图形边界框的几何图形。
geometry ST_Envelope(
geometry g1)
;
以几何体的形式返回所提供几何体的双精度 (float8) 最小边界框。 多边形由边界框的角点定义((MINX
, MINY
)、(MINX
, MAXY
)、(MAXX
, MAXY
)、(MAXX
, MINY
)、(MINX
, MINY
))。(PostGIS 也会添加 ZMIN
/ZMAX
坐标)。
退化情况(垂直线、点)将返回比 POLYGON
更低维度的几何图形,即POINT
或LINESTRING
。
可用性:1.5.0 行为更改为输出双精度而不是 float4
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.19
SELECT ST_AsText(ST_Envelope('POINT(1 3)'::geometry)); st_astext ------------ POINT(1 3) (1 row) SELECT ST_AsText(ST_Envelope('LINESTRING(0 0, 1 3)'::geometry)); st_astext -------------------------------- POLYGON((0 0,0 3,1 3,1 0,0 0)) (1 row) SELECT ST_AsText(ST_Envelope('POLYGON((0 0, 0 1, 1.0000001 1, 1.0000001 0, 0 0))'::geometry)); st_astext -------------------------------------------------------------- POLYGON((0 0,0 1,1.00000011920929 1,1.00000011920929 0,0 0)) (1 row) SELECT ST_AsText(ST_Envelope('POLYGON((0 0, 0 1, 1.0000000001 1, 1.0000000001 0, 0 0))'::geometry)); st_astext -------------------------------------------------------------- POLYGON((0 0,0 1,1.00000011920929 1,1.00000011920929 0,0 0)) (1 row) SELECT Box3D(geom), Box2D(geom), ST_AsText(ST_Envelope(geom)) As envelopewkt FROM (SELECT 'POLYGON((0 0, 0 1000012333334.34545678, 1.0000001 1, 1.0000001 0, 0 0))'::geometry As geom) As foo;
点和线串的最小外接矩形。
SELECT ST_AsText(ST_Envelope( ST_Collect( ST_GeomFromText('LINESTRING(55 75,125 150)'), ST_Point(20, 80)) )) As wktenv; wktenv ----------- POLYGON((20 75,20 150,125 150,125 75,20 75))
ST_ExteriorRing — 返回表示多边形外环的LineString。
geometry ST_ExteriorRing(
geometry a_polygon)
;
返回表示多边形外环的线串。 如果几何图形不是多边形,则返回 NULL。
![]() | |
此函数不支持 MULTIPOLYGON。 对于 MULTIPOLYGON,与 ST_GeometryN 或 ST_Dump 结合使用 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 2.1.5.1
该方法实现了SQL/MM规范。 SQL-MM 3: 8.2.3, 8.3.3
该函数支持 3d 并且不会丢失 z-index。
--If you have a table of polygons SELECT gid, ST_ExteriorRing(geom) AS ering FROM sometable; --If you have a table of MULTIPOLYGONs --and want to return a MULTILINESTRING composed of the exterior rings of each polygon SELECT gid, ST_Collect(ST_ExteriorRing(geom)) AS erings FROM (SELECT gid, (ST_Dump(geom)).geom As geom FROM sometable) As foo GROUP BY gid; --3d Example SELECT ST_AsEWKT( ST_ExteriorRing( ST_GeomFromEWKT('POLYGON((0 0 1, 1 1 1, 1 2 1, 1 1 1, 0 0 1))') ) ); st_asewkt --------- LINESTRING(0 0 1,1 1 1,1 2 1,1 1 1,0 0 1)
ST_GeometryN — 返回几何集合的一个元素。
geometry ST_GeometryN(
geometry geomA, integer n)
;
返回输入几何图形的从 1 开始的第 N 个元素几何图形,该几何图形是 GEOMETRYCOLLECTION、MULTIPOINT、MULTILINESTRING、MULTICURVE、MULTI)POLYGON 或POLYHEDRALSURFACE。 否则,返回 NULL。
![]() | |
自版本 0.8.0 以来,OGC 规范的索引从 1 开始。 以前的版本将其实现为基于 0。 |
![]() | |
要提取几何图形的所有元素,ST_Dump 效率更高,并且适用于基本几何图形。 |
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
更改:2.0.0 版本。之前的版本对于奇异几何图形会返回 NULL。现在已更改为在 ST_GeometryN(..,1) 情况下返回几何图形。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 9.1.5
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
--Extracting a subset of points from a 3d multipoint SELECT n, ST_AsEWKT(ST_GeometryN(geom, n)) As geomewkt FROM ( VALUES (ST_GeomFromEWKT('MULTIPOINT((1 2 7), (3 4 7), (5 6 7), (8 9 10))') ), ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') ) )As foo(geom) CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(geom); n | geomewkt ---+----------------------------------------- 1 | POINT(1 2 7) 2 | POINT(3 4 7) 3 | POINT(5 6 7) 4 | POINT(8 9 10) 1 | CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5) 2 | LINESTRING(10 11,12 11) --Extracting all geometries (useful when you want to assign an id) SELECT gid, n, ST_GeometryN(geom, n) FROM sometable CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(geom);
-- Polyhedral surface example -- Break a Polyhedral surface into its faces SELECT ST_AsEWKT(ST_GeometryN(p_geom,3)) As geom_ewkt FROM (SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )') AS p_geom ) AS a; geom_ewkt ------------------------------------------ POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0))
-- TIN -- SELECT ST_AsEWKT(ST_GeometryN(geom,2)) as wkt FROM (SELECT ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') AS geom ) AS g; -- result -- wkt ------------------------------------- TRIANGLE((0 0 0,0 1 0,1 1 0,0 0 0))
ST_GeometryType — 以文本形式返回几何图形的 SQL-MM 类型。
text ST_GeometryType(
geometry g1)
;
以字符串形式返回几何类型,例如“ST_LineString”、“ST_Polygon”、“ST_MultiPolygon”等。与 GeometryType 不同,此函数前面有“ST”,并不指示它是否具有 M 值。
增强: 2.0.0 引入了对多面体曲面的支持。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.4
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
SELECT ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result ST_LineString
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result ST_PolyhedralSurface
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result ST_PolyhedralSurface
SELECT ST_GeometryType(geom) as result FROM (SELECT ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') AS geom ) AS g; result -------- ST_Tin
ST_HasArc — 测试几何图形是否包含圆弧
boolean ST_HasArc(
geometry geomA)
;
如果几何或几何集合包含圆形字符串,则返回 true
可用性:1.2.3?
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_HasArc(ST_Collect('LINESTRING(1 2, 3 4, 5 6)', 'CIRCULARSTRING(1 1, 2 3, 4 5, 6 7, 5 6)')); st_hasarc -------- t
ST_InteriorRingN — 返回多边形的第 N 个内环(孔)。
geometry ST_InteriorRingN(
geometry a_polygon, integer n)
;
以 LINESTRING 形式返回 POLYGON 几何体的第 N 个内环(孔)。 索引从 1 开始。如果几何图形不是多边形或索引超出范围,则返回 NULL。。
![]() | |
此函数不支持 MULTIPOLYGON。 对于 MULTIPOLYGON,与 ST_GeometryN 或 ST_Dump 结合使用 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 8.2.6, 8.3.5
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsText(ST_InteriorRingN(geom, 1)) As geom FROM (SELECT ST_BuildArea( ST_Collect(ST_Buffer(ST_Point(1,2), 20,3), ST_Buffer(ST_Point(1, 2), 10,3))) As geom ) as foo;
ST_NumCurves — Return the number of component curves in a CompoundCurve.
integer ST_NumCurves(
geometry a_compoundcurve)
;
Return the number of component curves in a CompoundCurve, zero for an empty CompoundCurve, or NULL for a non-CompoundCurve input.
该方法实现了SQL/MM规范。 SQL-MM 3: 8.2.6, 8.3.5
该函数支持 3d 并且不会丢失 z-index。
-- Returns 3 SELECT ST_NumCurves('COMPOUNDCURVE( (2 2, 2.5 2.5), CIRCULARSTRING(2.5 2.5, 4.5 2.5, 3.5 3.5), (3.5 3.5, 2.5 4.5, 3 5, 2 2) )'); -- Returns 0 SELECT ST_NumCurves('COMPOUNDCURVE EMPTY');
ST_CurveN — Returns the Nth component curve geometry of a CompoundCurve.
geometry ST_CurveN(
geometry a_compoundcurve, integer index)
;
Returns the Nth component curve geometry of a CompoundCurve. The index starts at 1. Returns NULL if the geometry is not a CompoundCurve or the index is out of range.
该方法实现了SQL/MM规范。 SQL-MM 3: 8.2.6, 8.3.5
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsText(ST_CurveN('COMPOUNDCURVE( (2 2, 2.5 2.5), CIRCULARSTRING(2.5 2.5, 4.5 2.5, 3.5 3.5), (3.5 3.5, 2.5 4.5, 3 5, 2 2) )', 1));
ST_IsClosed — 测试 LineStrings 的起点和终点是否重合。 对于多面体表面测试是否闭合(实心)。
boolean ST_IsClosed(
geometry g)
;
如果 LINESTRING
的起点和终点重合,则返回TRUE
。对于多面体曲面,测试曲面是面状的(开放的)还是体状的(闭合的)。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 7.1.5, 9.3.3
![]() | |
SQL-MM 定义了 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
增强: 2.0.0 引入了对多面体曲面的支持。
该函数支持多面体曲面。
postgis=# SELECT ST_IsClosed('LINESTRING(0 0, 1 1)'::geometry); st_isclosed ------------- f (1 row) postgis=# SELECT ST_IsClosed('LINESTRING(0 0, 0 1, 1 1, 0 0)'::geometry); st_isclosed ------------- t (1 row) postgis=# SELECT ST_IsClosed('MULTILINESTRING((0 0, 0 1, 1 1, 0 0),(0 0, 1 1))'::geometry); st_isclosed ------------- f (1 row) postgis=# SELECT ST_IsClosed('POINT(0 0)'::geometry); st_isclosed ------------- t (1 row) postgis=# SELECT ST_IsClosed('MULTIPOINT((0 0), (1 1))'::geometry); st_isclosed ------------- t (1 row)
-- A cube -- SELECT ST_IsClosed(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); st_isclosed ------------- t -- Same as cube but missing a side -- SELECT ST_IsClosed(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)) )')); st_isclosed ------------- f
ST_IsCollection — 测试几何类型是否为几何集合。
boolean ST_IsCollection(
geometry g)
;
如果参数的几何类型是几何集合类型,则返回TRUE
。集合类型有以下几种:
几何集合
多点、多多边形、多线串、多曲线、多曲面
复合曲线
![]() | |
该函数分析几何形状的类型。 这意味着它将在空集合或包含单个元素的集合上返回 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
postgis=# SELECT ST_IsCollection('LINESTRING(0 0, 1 1)'::geometry); st_iscollection ------------- f (1 row) postgis=# SELECT ST_IsCollection('MULTIPOINT EMPTY'::geometry); st_iscollection ------------- t (1 row) postgis=# SELECT ST_IsCollection('MULTIPOINT((0 0))'::geometry); st_iscollection ------------- t (1 row) postgis=# SELECT ST_IsCollection('MULTIPOINT((0 0), (42 42))'::geometry); st_iscollection ------------- t (1 row) postgis=# SELECT ST_IsCollection('GEOMETRYCOLLECTION(POINT(0 0))'::geometry); st_iscollection ------------- t (1 row)
ST_IsEmpty — 检测几何图形是否为空。
boolean ST_IsEmpty(
geometry geomA)
;
如果几何图形为空几何,则返回 true; 如果为 true,则此几何图形是空几何集合、多边形、点等。
![]() | |
在SQL-MM中,ST_IsEmpty(NULL)返回0,而在PostGIS中返回NULL。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.7
此方法支持圆形字符串和曲线。
![]() | |
已更改:2.0.0 之前的 PostGIS 版本允许ST_GeomFromText(“GEOMETRYCOLLECTION(EMPTY)”)。在 PostGIS 2.0.0 中,这是不正确的,因为它更符合 SQL/MM 标准 |
SELECT ST_IsEmpty(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY')); st_isempty ------------ t (1 row) SELECT ST_IsEmpty(ST_GeomFromText('POLYGON EMPTY')); st_isempty ------------ t (1 row) SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')); st_isempty ------------ f (1 row) SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')) = false; ?column? ---------- t (1 row) SELECT ST_IsEmpty(ST_GeomFromText('CIRCULARSTRING EMPTY')); st_isempty ------------ t (1 row)
ST_IsPolygonCCW — 检测多边形是否具有逆时针方向的外环和顺时针方向的内环。
boolean ST_IsPolygonCCW (
geometry geom )
;
如果输入几何体的所有多边形元素对其外环使用逆时针方向,对所有内环使用顺时针方向,则返回 true。
如果几何体没有多边形元素,则返回 true。
![]() | |
闭合线串不被视为多边形元素。 如果传递单个闭合线串,则无论它是顺时针还是逆时针,都会得到 TRUE。 |
![]() | |
如果多边形元素的内环未反转(即,有一个或多个内环以与外环相同的方向旋转),则ST_IsPolygonCW和ST_IsPolygonCCW都返回 FALSE。 |
可用性:2.4.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
ST_IsPolygonCW — 检测多边形是否具有顺时针外环和逆时针内环。
boolean ST_IsPolygonCW (
geometry geom )
;
如果输入几何体的所有多边形元素对其外环使用顺时针方向,对所有内环使用逆时针方向,则返回 true。
如果几何体没有多边形元素,则返回 true。
![]() | |
闭合线串不被视为多边形元素。 如果传递单个闭合线串,则无论它是顺时针还是逆时针,都会得到 TRUE。 |
![]() | |
如果多边形元素的内环未反转(即,有一个或多个内环以与外环相同的方向旋转),则ST_IsPolygonCW和ST_IsPolygonCCW都返回 FALSE。 |
可用性:2.4.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
ST_IsRing — 检测线串是闭合的还是简单的。
boolean ST_IsRing(
geometry g)
;
返回 TRUE
,当LINESTRING
同时满足 ST_IsClosed(即 ST_StartPoint(g) ~= ST_Endpoint(g)
)和 ST_IsSimple(即不自交)时。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 2.1.5.1
该方法实现了SQL/MM规范。 SQL-MM 3: 7.1.6
![]() | |
SQL-MM 定义了 |
SELECT ST_IsRing(geom), ST_IsClosed(geom), ST_IsSimple(geom) FROM (SELECT 'LINESTRING(0 0, 0 1, 1 1, 1 0, 0 0)'::geometry AS geom) AS foo; st_isring | st_isclosed | st_issimple -----------+-------------+------------- t | t | t (1 row) SELECT ST_IsRing(geom), ST_IsClosed(geom), ST_IsSimple(geom) FROM (SELECT 'LINESTRING(0 0, 0 1, 1 0, 1 1, 0 0)'::geometry AS geom) AS foo; st_isring | st_isclosed | st_issimple -----------+-------------+------------- f | t | f (1 row)
ST_IsSimple — 检测几何体的自完整性或自接触点。
boolean ST_IsSimple(
geometry geomA)
;
如果此 Geometry 没有异常几何点(例如自相交或自相切),则返回 true。有关 OGC 对几何简单性和有效性定义的更多信息,请参阅"确保几何图形的OpenGIS合规性"
![]() | |
SQL-MM 定义 ST_IsSimple(NULL) 的结果为 0,而 PostGIS 返回 NULL。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.8
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_IsSimple(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')); st_issimple ------------- f (1 row) SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)')); st_issimple ------------- f (1 row)
ST_M — 返回点的 M 值。
float ST_M(
geometry a_point)
;
返回点的 M 坐标值,如果无效,则返回 NULL。 输入必须为点。
![]() | |
这还不是 OGC 规范的一部分,但在此处列出以完成点坐标提取器功能列表。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_M(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_m ------ 4 (1 row)
ST_MemSize — 返回几何图形占用的内存空间总量。
integer ST_MemSize(
geometry geomA)
;
返回几何图形占用的内存空间量(以字节为单位)。
这补充了 PostgreSQL 内置 数据库 对象函数 pg_column_size、pg_size_pretty、pg_relation_size、pg_total_relation_size。
![]() | |
给出表的字节大小的 pg_relation_size 可能返回小于 ST_MemSize 的字节大小。 这是因为 pg_relation_size 不会添加 toasted 表贡献,并且大型几何图形存储在 TOAST 表中。 pg_total_relation_size - 包括表、压缩表和索引。 pg_column_size 返回考虑到压缩,几何图形在列中占用多少空间,因此可能低于 ST_MemSize |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
更改:2.2.0 名称更改为 ST_MemSize 以遵循命名约定。
--Return how much byte space Boston takes up in our Mass data set SELECT pg_size_pretty(SUM(ST_MemSize(geom))) as totgeomsum, pg_size_pretty(SUM(CASE WHEN town = 'BOSTON' THEN ST_MemSize(geom) ELSE 0 END)) As bossum, CAST(SUM(CASE WHEN town = 'BOSTON' THEN ST_MemSize(geom) ELSE 0 END)*1.00 / SUM(ST_MemSize(geom))*100 As numeric(10,2)) As perbos FROM towns; totgeomsum bossum perbos ---------- ------ ------ 1522 kB 30 kB 1.99 SELECT ST_MemSize(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')); --- 73 --What percentage of our table is taken up by just the geometry SELECT pg_total_relation_size('public.neighborhoods') As fulltable_size, sum(ST_MemSize(geom)) As geomsize, sum(ST_MemSize(geom))*1.00/pg_total_relation_size('public.neighborhoods')*100 As pergeom FROM neighborhoods; fulltable_size geomsize pergeom ------------------------------------------------ 262144 96238 36.71188354492187500000
ST_NDims — 返回几何体的坐标维度。
integer ST_NDims(
geometry g1)
;
返回几何体的坐标维度。PostGIS 支持 2 - (x,y) 、3 - (x,y,z) 或 2D 测量 - x,y,m 和 4 - 3D 测量空间 x,y,z,m
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_NDims(ST_GeomFromText('POINT(1 1)')) As d2point, ST_NDims(ST_GeomFromEWKT('POINT(1 1 2)')) As d3point, ST_NDims(ST_GeomFromEWKT('POINTM(1 1 0.5)')) As d2pointm; d2point | d3point | d2pointm ---------+---------+---------- 2 | 3 | 3
ST_NPoints — 返回几何图形中的点数(顶点)。
integer ST_NPoints(
geometry g1)
;
返回几何图形中的点数。 适用于所有几何形状。
增强: 2.0.0 引入了对多面体曲面的支持。
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_NPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result 4 --Polygon in 3D space SELECT ST_NPoints(ST_GeomFromEWKT('LINESTRING(77.29 29.07 1,77.42 29.26 0,77.27 29.31 -1,77.29 29.07 3)')) --result 4
ST_NRings — 返回多边形几何中的环数。
integer ST_NRings(
geometry geomA)
;
如果几何图形是多边形或多多边形,则返回环数。 与NumInteriorRings不同,它还计算外环。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_NRings(geom) As Nrings, ST_NumInteriorRings(geom) As ninterrings FROM (SELECT ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))') As geom) As foo; nrings | ninterrings --------+------------- 1 | 0 (1 row)
ST_NumGeometries — 返回几何集合中的元素数量。
integer ST_NumGeometries(
geometry geom)
;
该函数返回几何集合(GEOMETRYCOLLECTION 或 MULTI*)中的元素数量。对于非空的原子几何体,它返回 1。对于空的几何体,它返回 0。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
更改:2.0.0 在之前的版本中,如果几何图形不是collection/MULTI 类型,则会返回 NULL。 2.0.0 现在对于单个几何图形返回 1,例如 POLYGON、LINESTRING、POINT。
该方法实现了SQL/MM规范。 SQL-MM 3: 9.1.4
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
--Prior versions would have returned NULL for this -- in 2.0.0 this returns 1 SELECT ST_NumGeometries(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result 1 --Geometry Collection Example - multis count as one geom in a collection SELECT ST_NumGeometries(ST_GeomFromEWKT('GEOMETRYCOLLECTION(MULTIPOINT((-2 3),(-2 2)), LINESTRING(5 5 ,10 10), POLYGON((-7 4.2,-7.1 5,-7.1 4.3,-7 4.2)))')); --result 3
ST_NumInteriorRings — 返回多边形的内环(孔)数。
integer ST_NumInteriorRings(
geometry a_polygon)
;
返回多边形几何体的内环数。 如果几何图形不是多边形,则返回 NULL。
该方法实现了SQL/MM规范。 SQL-MM 3: 8.2.5
更改:2.0.0 - 在之前的版本中,它允许传递 MULTIPOLYGON,返回第一个 POLYGON 的内环数量。
--If you have a regular polygon SELECT gid, field1, field2, ST_NumInteriorRings(geom) AS numholes FROM sometable; --If you have multipolygons --And you want to know the total number of interior rings in the MULTIPOLYGON SELECT gid, field1, field2, SUM(ST_NumInteriorRings(geom)) AS numholes FROM (SELECT gid, field1, field2, (ST_Dump(geom)).geom As geom FROM sometable) As foo GROUP BY gid, field1,field2;
ST_NumInteriorRing — 返回多边形的内环(孔)数。ST_NumInteriorRings的别名
integer ST_NumInteriorRing(
geometry a_polygon)
;
ST_NumPatches — 返回多面体曲面上的面数。 对于非多面体几何形状将返回 null。
integer ST_NumPatches(
geometry g1)
;
返回多面体曲面上的面数。 对于非多面体几何形状将返回 null。 这是 ST_NumGeometries 的别名,用于支持 MM 命名。 如果您不关心 MM 约定,则使用 ST_NumGeometries 会更快。
可用性: 2.0.0
该函数支持 3d 并且不会丢失 z-index。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM ISO/IEC 13249-3: 8.5
该函数支持多面体曲面。
SELECT ST_NumPatches(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result 6
ST_NumPoints — 返回 LineString 或 CircularString 中的点数。
integer ST_NumPoints(
geometry g1)
;
返回 ST_LineString 或 ST_CircularString 值中的点数。 1.4 之前的版本仅适用于规范规定的线串。从 1.4 开始,这是 ST_NPoints 的别名,它不仅返回线串的顶点数,考虑使用 ST_NPoints,它是多用途的并且适用于许多几何类型。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 7.2.4
SELECT ST_NumPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result 4
ST_PatchN — 返回多边形曲面(PolyhedralSurface)的第 N 个几何体(面)。
geometry ST_PatchN(
geometry geomA, integer n)
;
如果几何体是 POLYHEDRALSURFACE 或 POLYHEDRALSURFACEM,则返回从 1 开始的第 N 个几何体(面)。否则,返回 NULL。这将返回与多面体曲面的 ST_GeometryN 相同的答案。 使用 ST_GeometryN 速度更快。
![]() | |
索引从1开始。 |
![]() | |
如果要提取几何图形的所有元素,ST_Dump 效率更高。 |
可用性: 2.0.0
该方法实现了SQL/MM规范。 SQL-MM ISO/IEC 13249-3: 8.5
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
--Extract the 2nd face of the polyhedral surface SELECT ST_AsEWKT(ST_PatchN(geom, 2)) As geomewkt FROM ( VALUES (ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')) ) As foo(geom); geomewkt ---+----------------------------------------- POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0))
ST_PointN — 返回几何图形中第一个线串或圆形线串中的第 N 个点。
geometry ST_PointN(
geometry a_linestring, integer n)
;
返回几何图形中单个线串或圆形线串中的第 N 个点。负值从 LineString 末尾开始向后计数,因此 -1 是最后一个点。如果几何图形中没有线串,则返回 NULL。
![]() | |
自版本 0.8.0 以来,OGC 规范的索引从 1 开始。 OGC 中没有向后索引(负索引),以前的版本将其实现为基于 0。 |
![]() | |
如果要获取 MultiLineString 中每个 LineString 的第 N 个点,请与 ST_Dump 结合使用 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 7.2.5, 7.3.5
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
![]() | |
更改:2.0.0 不再适用于单个几何multilinestrings。 在旧版本的 PostGIS 中——单行 multilinestring可以与此函数很好地配合并返回起点。 在 2.0.0 中,它像任何其他 multilinestring一样只返回 NULL。 更改:2.3.0:负索引可用(-1 是最后一点) |
-- Extract all POINTs from a LINESTRING SELECT ST_AsText( ST_PointN( column1, generate_series(1, ST_NPoints(column1)) )) FROM ( VALUES ('LINESTRING(0 0, 1 1, 2 2)'::geometry) ) AS foo; st_astext ------------ POINT(0 0) POINT(1 1) POINT(2 2) (3 rows) --Example circular string SELECT ST_AsText(ST_PointN(ST_GeomFromText('CIRCULARSTRING(1 2, 3 2, 1 2)'), 2)); st_astext ------------ POINT(3 2) (1 row) SELECT ST_AsText(f) FROM ST_GeomFromText('LINESTRING(0 0 0, 1 1 1, 2 2 2)') AS g ,ST_PointN(g, -2) AS f; -- 1 based index st_astext ----------------- POINT Z (1 1 1) (1 row)
ST_Points — 返回包含几何坐标的 MultiPoint。
geometry ST_Points(
geometry geom )
;
返回包含几何体所有坐标的 MultiPoint。 保留重复点,包括环几何形状的起点和终点。(如果需要,可以通过对结果调用ST_RemoveRepeatedPoints来删除重复点)。
要获取有关父几何体中每个坐标的位置的信息,请使用 ST_DumpPoints。
如果存在,则保留 M 和 Z 值。
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
可用性:2.3.0
SELECT ST_AsText(ST_Points('POLYGON Z ((30 10 4,10 30 5,40 40 6, 30 10))')); --result MULTIPOINT Z ((30 10 4),(10 30 5),(40 40 6),(30 10 4))
ST_StartPoint — 返回 LineString 的第一个点.
geometry ST_StartPoint(
geometry geomA)
;
返回LINESTRING
或 CIRCULARLINESTRING
几何图形的第一个点作为POINT
。 如果输入不是LINESTRING
或 CIRCULARLINESTRING
,则返回 NULL
。
该方法实现了SQL/MM规范。 SQL-MM 3: 7.1.3
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
![]() | |
增强:3.2.0 返回所有几何图形的点。 如果输入不是 LineString,则先前的行为将返回 NULL。 更改:2.0.0 不再适用于单个几何体 MultiLineStrings。 在旧版本的 PostGIS 中,单行 MultiLineString 可以与此函数很好地配合并返回起点。 在 2.0.0 中,它像任何其他 MultiLineString 一样只返回 NULL。 旧的行为是一个未记录的功能,但是那些假设将数据存储为 LINESTRING 的人可能会在 2.0.0 中遇到这些返回 NULL 的情况。 |
LineString起点
SELECT ST_AsText(ST_StartPoint('LINESTRING(0 1, 0 2)'::geometry)); st_astext ------------ POINT(0 1)
非LineString的起点为NULL
SELECT ST_StartPoint('POINT(0 1)'::geometry) IS NULL AS is_null; is_null ---------- t
3D LineString起点
SELECT ST_AsEWKT(ST_StartPoint('LINESTRING(0 1 1, 0 2 2)'::geometry)); st_asewkt ------------ POINT(0 1 1)
CircularString起点
SELECT ST_AsText(ST_StartPoint('CIRCULARSTRING(5 2,-3 1.999999, -2 1, -4 2, 6 3)'::geometry)); st_astext ------------ POINT(5 2)
ST_Summary — 返回几何内容的文本摘要。
text ST_Summary(
geometry g)
;
text ST_Summary(
geography g)
;
返回几何内容的文本摘要。
几何类型后方括号中显示的标志具有以下含义:
M:具有M轴
Z:具有 Z 轴
B:有一个边界框
G:大地坐标系(地理)
S:具有空间参考系统
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
可用性:1.2.2
增强:在 2.0.0 中添加了地理支持
增强:添加了 S 标志以指示其是否具有 2.1.0 空间参考系统
增强:添加了对 2.2.0 TIN 和曲线的支持
=# SELECT ST_Summary(ST_GeomFromText('LINESTRING(0 0, 1 1)')) as geom, ST_Summary(ST_GeogFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) geog; geom | geog -----------------------------+-------------------------- LineString[B] with 2 points | Polygon[BGS] with 1 rings | ring 0 has 5 points : (1 row) =# SELECT ST_Summary(ST_GeogFromText('LINESTRING(0 0 1, 1 1 1)')) As geog_line, ST_Summary(ST_GeomFromText('SRID=4326;POLYGON((0 0 1, 1 1 2, 1 2 3, 1 1 1, 0 0 1))')) As geom_poly; ; geog_line | geom_poly -------------------------------- +-------------------------- LineString[ZBGS] with 2 points | Polygon[ZBS] with 1 rings : ring 0 has 5 points : (1 row)
ST_X — 返回点的 X 坐标。
float ST_X(
geometry a_point)
;
返回点的 X 坐标值,如果无效,则返回 NULL。 输入必须为点。
该方法实现了SQL/MM规范。 SQL-MM 3: 6.1.3
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_X(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_x ------ 1 (1 row) SELECT ST_Y(ST_Centroid(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'))); st_y ------ 1.5 (1 row)
ST_Centroid, ST_GeomFromEWKT, ST_M, ST_XMax, ST_XMin, ST_Y, ST_Z
ST_Y — 返回点的Y坐标。
float ST_Y(
geometry a_point)
;
返回点的 Y 坐标值,如果无效,则返回 NULL。 输入必须为点。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 6.1.4
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_Y(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_y ------ 2 (1 row) SELECT ST_Y(ST_Centroid(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'))); st_y ------ 1.5 (1 row)
ST_Centroid, ST_GeomFromEWKT, ST_M, ST_X, ST_YMax, ST_YMin, ST_Z
ST_Z — 返回点的Z坐标。
float ST_Z(
geometry a_point)
;
返回点的 Z 坐标值,如果无效,则返回 NULL。 输入必须为点。
该方法实现了SQL/MM规范。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_Z(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_z ------ 3 (1 row)
ST_Zmflag — 返回指示几何体的 ZM 坐标维度的代码。
smallint ST_Zmflag(
geometry geomA)
;
返回指示几何体的 ZM 坐标维度的代码。
值为 0=XY、1=XYM、2=XYZ、3=XYZM。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_Zmflag(ST_GeomFromEWKT('LINESTRING(1 2, 3 4)')); st_zmflag ----------- 0 SELECT ST_Zmflag(ST_GeomFromEWKT('LINESTRINGM(1 2 3, 3 4 3)')); st_zmflag ----------- 1 SELECT ST_Zmflag(ST_GeomFromEWKT('CIRCULARSTRING(1 2 3, 3 4 3, 5 6 3)')); st_zmflag ----------- 2 SELECT ST_Zmflag(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_zmflag ----------- 3
ST_HasZ — 检查几何体是否具有 Z 维度。
boolean ST_HasZ(
geometry geom)
;
检查输入几何体是否具有 Z维度并返回布尔值。 如果几何体有 Z 维度,则返回 true; 否则,返回 false。
具有 Z 维度的几何对象通常表示三维 (3D) 几何图形,而没有 Z 维度的几何对象则表示二维 (2D) 几何图形。
此函数对于确定几何图形是否具有高程或高度信息非常有用。
可用性:3.5.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
SELECT ST_HasZ(ST_GeomFromText('POINT(1 2 3)')); --result true
SELECT ST_HasZ(ST_GeomFromText('LINESTRING(0 0, 1 1)')); --result false
ST_HasM — 检查几何体是否具有 M(测量)维度。
boolean ST_HasM(
geometry geom)
;
检查输入几何图形是否具有 M(度量)维度并返回布尔值。 如果几何体具有 M 维度,则返回 true; 否则,返回 false。
具有 M 维度的几何对象通常表示与空间特征相关的测量值或附加数据。
此函数对于确定几何图形是否包含测量信息非常有用。
可用性:3.5.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
SELECT ST_HasM(ST_GeomFromText('POINTM(1 2 3)')); --result true
SELECT ST_HasM(ST_GeomFromText('LINESTRING(0 0, 1 1)')); --result false
这些函数通过更改类型、结构或顶点来创建修改后的几何图形。
ST_AddPoint — 将点添加到线串(LineString)。
geometry ST_AddPoint(
geometry linestring, geometry point)
;
geometry ST_AddPoint(
geometry linestring, geometry point, integer position = -1)
;
在索引position
之前向LineString 添加一个点(使用从 0 开始的索引)。如果position
参数被省略或为 -1,则该点将附加到 LineString 的末尾。
可用性:1.1.0
该函数支持 3d 并且不会丢失 z-index。
在 3D 线的末尾添加一个点
SELECT ST_AsEWKT(ST_AddPoint('LINESTRING(0 0 1, 1 1 1)', ST_MakePoint(1, 2, 3))); st_asewkt ---------- LINESTRING(0 0 1,1 1 1,1 2 3)
仅对于表中那些未闭合的线,通过将每条线的起点添加到线的末尾来保证表中的所有线都是闭合的。
UPDATE sometable SET geom = ST_AddPoint(geom, ST_StartPoint(geom)) FROM sometable WHERE ST_IsClosed(geom) = false;
ST_CollectionExtract — 给定一个几何集合,返回仅包含指定类型元素的多几何图形。
geometry ST_CollectionExtract(
geometry collection)
;
geometry ST_CollectionExtract(
geometry collection, integer type)
;
给定一个几何集合,返回同种类型多几何。
如果未指定类型
,则返回仅包含最高维度几何的多几何。 因此,多边形优先于线,线优先于点。
如果指定了类型
,则返回仅包含指定类型的多几何。 如果没有指定类型的元素,则返回 EMPTY 几何图形。 仅支持点、线和面。 类型编号如下:
1 == POINT
2 == LINESTRING
3 == POLYGON
对于基本几何输入,如果输入类型与请求的类型匹配,则几何图形将保持不变返回。 否则,结果是指定类型的空几何图形。 如果需要,可以使用 ST_Multi 将它们转换为多几何图形。
![]() | |
不检查 MultiPolygon 结果的有效性。 如果多边形组件相邻或重叠,则结果将无效。(例如,将此函数应用于 ST_Split结果时可能会发生这种情况。)可以使用 ST_IsValid 检查这种情况并使用ST_MakeValid 修复。 |
可用性:1.1.0
![]() | |
在 1.5.3 之前,无论类型如何,该函数都会返回同种类型的基本几何输入。在 1.5.3 中,不匹配的单个几何图形返回 NULL 结果。 在 2.0.0 中,不匹配的单个几何图形返回请求类型的 EMPTY 结果。 |
提取最大维度类型:
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION( POINT(0 0), LINESTRING(1 1, 2 2) )')); st_astext --------------- MULTILINESTRING((1 1, 2 2))
提取点(type 1 == POINT):
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))', 1 )); st_astext --------------- MULTIPOINT((0 0))
提取线(type 2 == LINESTRING):
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(LINESTRING(0 0, 1 1)),LINESTRING(2 2, 3 3))', 2 )); st_astext --------------- MULTILINESTRING((0 0, 1 1), (2 2, 3 3))
ST_CollectionHomogenize — 返回几何集合的最简单表示。
geometry ST_CollectionHomogenize(
geometry collection)
;
给定几何集合,它返回“最简单”的表示形式。
同质集合将以适当的多几何体形式返回。
混合类型集合将转换为单个平面几何集合。
包含单个基本元素的集合将作为该元素返回。
基本几何形状返回不变。如果需要,可以使用ST_Multi将它们转换为多几何图形。
![]() | |
该函数不保证结果有效。特别是,包含相邻或重叠多边形的集合将创建无效的多多边形。这种情况可以使用ST_IsValid检查并使用ST_MakeValid修复。 |
可用性: 2.0.0
单个元素集合转为基本集合
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0))')); st_astext ------------ POINT(0 0)
将嵌套的单元素集合转换为基本几何:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(MULTIPOINT((0 0)))')); st_astext ------------ POINT(0 0)
集合转换为多几何图形:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0),POINT(1 1))')); st_astext --------------------- MULTIPOINT((0 0),(1 1))
将嵌套混合类型集合转换为平面几何集合:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0), GEOMETRYCOLLECTION( LINESTRING(1 1, 2 2)))')); st_astext --------------------- GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(1 1,2 2))
将多边形集合转换为(无效的)多多边形:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION (POLYGON ((10 50, 50 50, 50 10, 10 10, 10 50)), POLYGON ((90 50, 90 10, 50 10, 50 50, 90 50)))')); st_astext --------------------- MULTIPOLYGON(((10 50,50 50,50 10,10 10,10 50)),((90 50,90 10,50 10,50 50,90 50)))
ST_CurveToLine — 将包含曲线的几何图形转换为线性几何图形。
geometry ST_CurveToLine(
geometry curveGeom, float tolerance, integer tolerance_type, integer flags)
;
将 CIRCULAR STRING 转换为常规 LINESTRING,或将 CURVEPOLYGON 转换为 POLYGON,或将 MULTISURFACE 转换为 MULTIPOLYGON。 对于输出到不支持 CIRCULARSTRING 几何类型的设备很有用
将给定几何图形转换为线性几何图形。 使用给定的“公差”和选项(每个象限(一个圆的四个部分)32 个线段,默认情况下没有选项)将每个弯曲几何图形或线段转换为线性近似值。
“tolerance_type”参数决定“tolerance”参数的解释。它可以采用以下值:
0(默认):公差是四分之一圆的最大边数。
1:公差是从曲线到直线的最大差值。 单位是输入几何的单位。
2:公差是由半径形成的角度的最大值(以弧度为单位)。
'flags' 参数是一个位字段。 默认为 0。 支持的位有:
1:对称(与方向无关)输出。
2:保留角度,避免在产生对称输出时减少角度(线段长度), 对称标志关闭时无效。
可用性:1.3.0
增强:2.4.0 支持最大距离差公差和最大角度公差,支持对称输出。
增强:3.0.0 实现了每弧的最小线性分数。 防止拓扑崩溃。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 7.1.7
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_AsText(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'))); --Result -- LINESTRING(220268 150415,220269.95064912 150416.539364228,220271.823415575 150418.17258804,220273.613787707 150419.895736857, 220275.317452352 150421.704659462,220276.930305234 150423.594998003,220278.448460847 150425.562198489, 220279.868261823 150427.60152176,220281.186287736 150429.708054909,220282.399363347 150431.876723113, 220283.50456625 150434.10230186,220284.499233914 150436.379429536,220285.380970099 150438.702620341,220286.147650624 150441.066277505, 220286.797428488 150443.464706771,220287.328738321 150445.892130112,220287.740300149 150448.342699654, 220288.031122486 150450.810511759,220288.200504713 150453.289621251,220288.248038775 150455.77405574, 220288.173610157 150458.257830005,220287.977398166 150460.734960415,220287.659875492 150463.199479347, 220287.221807076 150465.64544956,220286.664248262 150468.066978495,220285.988542259 150470.458232479,220285.196316903 150472.81345077, 220284.289480732 150475.126959442,220283.270218395 150477.39318505,220282.140985384 150479.606668057, 220280.90450212 150481.762075989,220279.5637474 150483.85421628,220278.12195122 150485.87804878, 220276.582586992 150487.828697901,220274.949363179 150489.701464356,220273.226214362 150491.491836488, 220271.417291757 150493.195501133,220269.526953216 150494.808354014,220267.559752731 150496.326509628, 220265.520429459 150497.746310603,220263.41389631 150499.064336517,220261.245228106 150500.277412127, 220259.019649359 150501.38261503,220256.742521683 150502.377282695,220254.419330878 150503.259018879, 220252.055673714 150504.025699404,220249.657244448 150504.675477269,220247.229821107 150505.206787101, 220244.779251566 150505.61834893,220242.311439461 150505.909171266,220239.832329968 150506.078553494, 220237.347895479 150506.126087555,220234.864121215 150506.051658938,220232.386990804 150505.855446946, 220229.922471872 150505.537924272,220227.47650166 150505.099855856,220225.054972724 150504.542297043, 220222.663718741 150503.86659104,220220.308500449 150503.074365683, 220217.994991777 150502.167529512,220215.72876617 150501.148267175, 220213.515283163 150500.019034164,220211.35987523 150498.7825509, 220209.267734939 150497.441796181,220207.243902439 150496, 220205.293253319 150494.460635772,220203.420486864 150492.82741196,220201.630114732 150491.104263143, 220199.926450087 150489.295340538,220198.313597205 150487.405001997,220196.795441592 150485.437801511, 220195.375640616 150483.39847824,220194.057614703 150481.291945091,220192.844539092 150479.123276887,220191.739336189 150476.89769814, 220190.744668525 150474.620570464,220189.86293234 150472.297379659,220189.096251815 150469.933722495, 220188.446473951 150467.535293229,220187.915164118 150465.107869888,220187.50360229 150462.657300346, 220187.212779953 150460.189488241,220187.043397726 150457.710378749,220186.995863664 150455.22594426, 220187.070292282 150452.742169995,220187.266504273 150450.265039585,220187.584026947 150447.800520653, 220188.022095363 150445.35455044,220188.579654177 150442.933021505,220189.25536018 150440.541767521, 220190.047585536 150438.18654923,220190.954421707 150435.873040558,220191.973684044 150433.60681495, 220193.102917055 150431.393331943,220194.339400319 150429.237924011,220195.680155039 150427.14578372,220197.12195122 150425.12195122, 220198.661315447 150423.171302099,220200.29453926 150421.298535644,220202.017688077 150419.508163512,220203.826610682 150417.804498867, 220205.716949223 150416.191645986,220207.684149708 150414.673490372,220209.72347298 150413.253689397,220211.830006129 150411.935663483, 220213.998674333 150410.722587873,220216.22425308 150409.61738497,220218.501380756 150408.622717305,220220.824571561 150407.740981121, 220223.188228725 150406.974300596,220225.586657991 150406.324522731,220227 150406) --3d example SELECT ST_AsEWKT(ST_CurveToLine(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'))); Output ------ LINESTRING(220268 150415 1,220269.95064912 150416.539364228 1.0181172856673, 220271.823415575 150418.17258804 1.03623457133459,220273.613787707 150419.895736857 1.05435185700189,....AD INFINITUM .... 220225.586657991 150406.324522731 1.32611114201132,220227 150406 3) --use only 2 segments to approximate quarter circle SELECT ST_AsText(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'),2)); st_astext ------------------------------ LINESTRING(220268 150415,220287.740300149 150448.342699654,220278.12195122 150485.87804878, 220244.779251566 150505.61834893,220207.243902439 150496,220187.50360229 150462.657300346, 220197.12195122 150425.12195122,220227 150406) -- Ensure approximated line is no further than 20 units away from -- original curve, and make the result direction-neutral SELECT ST_AsText(ST_CurveToLine( 'CIRCULARSTRING(0 0,100 -100,200 0)'::geometry, 20, -- Tolerance 1, -- Above is max distance between curve and line 1 -- Symmetric flag )); st_astext ------------------------------------------------------------------------------------------- LINESTRING(0 0,50 -86.6025403784438,150 -86.6025403784439,200 -1.1331077795296e-13,200 0)
ST_Scroll — 更改闭合线串的起点。
geometry ST_Scroll(
geometry linestring, geometry point)
;
将闭合线串的起点/终点更改为给定的point
。
可用性:3.2.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
使 e 闭合线从其第三个顶点开始
SELECT ST_AsEWKT(ST_Scroll('SRID=4326;LINESTRING(0 0 0 1, 10 0 2 0, 5 5 4 2,0 0 0 1)', 'POINT(5 5 4 2)')); st_asewkt ---------- SRID=4326;LINESTRING(5 5 4 2,0 0 0 1,10 0 2 0,5 5 4 2)
ST_FlipCoordinates — 返回 X 轴和 Y 轴转换的几何图形版本。
geometry ST_FlipCoordinates(
geometry geom)
;
返回给定几何图形的 X 轴和 Y 轴转换的版本。对于修改包含以纬度/经度 (Y,X) 表示的坐标的几何图形很有用。
可用性: 2.0.0
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_AsEWKT(ST_FlipCoordinates(GeomFromEWKT('POINT(1 2)'))); st_asewkt ------------ POINT(2 1)
ST_Force2D — 强制几何图形进入“二维模式”。
geometry ST_Force2D(
geometry geomA)
;
强制几何图形进入“二维模式”,以便所有输出表示仅具有 X 和 Y 坐标。 这对于强制 OGC 兼容输出非常有用(因为 OGC 仅指定二维几何形状)。
增强: 2.0.0 引入了对多面体曲面的支持。
更改: 2.1.0 在 2.0.x 期间,它被称为ST_Force_2D。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsEWKT(ST_Force2D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ------------------------------------- CIRCULARSTRING(1 1,2 3,4 5,6 7,5 6) SELECT ST_AsEWKT(ST_Force2D('POLYGON((0 0 2,0 5 2,5 0 2,0 0 2),(1 1 2,3 1 2,1 3 2,1 1 2))')); st_asewkt ---------------------------------------------- POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))
ST_Force3D — 强制几何图形进入 XYZ 模式。 这是 ST_Force3DZ 的别名。
geometry ST_Force3D(
geometry geomA, float Zvalue = 0.0)
;
强制几何图形进入 XYZ 模式。 这是 ST_Force3DZ 的别名。 如果几何体没有 Z 分量,则会附加Z值
Z 坐标。
增强: 2.0.0 引入了对多面体曲面的支持。
更改: 2.1.0 在 2.0.x 期间,它被称为 ST_Force_3D。
更改: 3.1.0. 您现在可以指定一个非零 Z 值。
该函数支持多面体曲面。
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force3D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ----------------------------------------------- CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2) SELECT ST_AsEWKT(ST_Force3D('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))')); st_asewkt -------------------------------------------------------------- POLYGON((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
ST_Force3DZ — 强制几何图形进入 XYZ 模式。
geometry ST_Force3DZ(
geometry geomA, float Zvalue = 0.0)
;
强制几何图形进入 XYZ 模式。如果几何体没有 Z 分量,则会附加 Z值
Z 坐标。
增强: 2.0.0 引入了对多面体曲面的支持。
更改: 2.1.0。在 2.0.x 期间,它被称为 ST_Force_3DZ。
更改: 3.1.0. 您现在可以指定一个非零 Z 值。
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force3DZ(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ----------------------------------------------- CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2) SELECT ST_AsEWKT(ST_Force3DZ('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))')); st_asewkt -------------------------------------------------------------- POLYGON((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
ST_Force3DM — 强制几何图形进入 XYM 模式。
geometry ST_Force3DM(
geometry geomA, float Mvalue = 0.0)
;
强制几何图形进入XYM模式。 如果几何体没有 M 分量,则附加M值
M 坐标。如果它有 Z 分量,则 Z 被移除
更改: 2.1.0 。在 2.0.x 期间,它被称为ST_Force_3DM。
更改: 3.1.0. 现在可以指定一个非零 M 值。
此方法支持圆形字符串和曲线。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force3DM(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ------------------------------------------------ CIRCULARSTRINGM(1 1 0,2 3 0,4 5 0,6 7 0,5 6 0) SELECT ST_AsEWKT(ST_Force3DM('POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))')); st_asewkt --------------------------------------------------------------- POLYGONM((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
ST_Force4D — 强制几何图形进入XYZM模式。
geometry ST_Force4D(
geometry geomA, float Zvalue = 0.0, float Mvalue = 0.0)
;
强制几何体进入 XYZM 模式。 如果没有 Z 值或 M 值,则添加 Z值
和M值
。
更改: 2.1.0。在 2.0.x 期间,它被称为ST_Force_4D。
更改: 3.1.0. 现在可以指定非零 Z 和 M 值。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force4D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt --------------------------------------------------------- CIRCULARSTRING(1 1 2 0,2 3 2 0,4 5 2 0,6 7 2 0,5 6 2 0) SELECT ST_AsEWKT(ST_Force4D('MULTILINESTRINGM((0 0 1,0 5 2,5 0 3,0 0 4),(1 1 1,3 1 1,1 3 1,1 1 1))')); st_asewkt -------------------------------------------------------------------------------------- MULTILINESTRING((0 0 0 1,0 5 0 2,5 0 0 3,0 0 0 4),(1 1 0 1,3 1 0 1,1 3 0 1,1 1 0 1))
ST_ForceCollection — 将几何图形转换为几何集合(GEOMETRYCOLLECTION)。
geometry ST_ForceCollection(
geometry geomA)
;
将几何图形转换为几何图形集合。 这对于简化 WKB 表示很有用。
增强: 2.0.0 引入了对多面体曲面的支持。
可用性:1.2.2 ,在 1.3.4 之前,当与包含曲线的几何一起使用时,它会崩溃。 此问题已在 1.3.4 及更高版本中得到纠正
更改: 2.1.0 。在 2.0.x 期间,它被称为ST_Force_Collection。
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_AsEWKT(ST_ForceCollection('POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))')); st_asewkt ---------------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))) SELECT ST_AsText(ST_ForceCollection('CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)')); st_astext -------------------------------------------------------------------------------- GEOMETRYCOLLECTION(CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)) (1 row)
-- POLYHEDRAL example -- SELECT ST_AsEWKT(ST_ForceCollection('POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))')) st_asewkt ---------------------------------------------------------------------------------- GEOMETRYCOLLECTION( POLYGON((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), POLYGON((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), POLYGON((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), POLYGON((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)) )
ST_ForceCurve — 如果适用,将一个几何图形上升到其曲线类型。
geometry ST_ForceCurve(
geometry g)
;
将几何图形转换为其曲线表示形式(如果适用):直线变为复合曲线,多线变为多曲线,多边形变为曲线多边形,多重多边形变为多重曲面。 如果几何输入已经是曲线表示,则返回与输入相同的值。
可用性:2.2.0
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_AsText( ST_ForceCurve( 'POLYGON((0 0 2, 5 0 2, 0 5 2, 0 0 2),(1 1 2, 1 3 2, 3 1 2, 1 1 2))'::geometry ) ); st_astext ---------------------------------------------------------------------- CURVEPOLYGON Z ((0 0 2,5 0 2,0 5 2,0 0 2),(1 1 2,1 3 2,3 1 2,1 1 2)) (1 row)
ST_ForcePolygonCCW — 将所有外环逆时针定向,将所有内环顺时针定向。
geometry ST_ForcePolygonCCW (
geometry geom )
;
强制(多)多边形对其外环使用逆时针方向,对其内环使用顺时针方向。 非多边形几何保持不变。
可用性:2.4.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
ST_ForcePolygonCW — 顺时针方向调整所有外环,逆时针方向调整所有内环。
geometry ST_ForcePolygonCW (
geometry geom )
;
强制(多)多边形对其外环使用顺时针方向,对其内环使用逆时针方向。 非多边形几何体原封不动地返回。
可用性:2.4.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
ST_ForceSFS — 强制几何图形仅使用 SFS 1.1 几何类型。
geometry ST_ForceSFS(
geometry geomA)
;
geometry ST_ForceSFS(
geometry geomA, text version)
;
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
ST_ForceRHR — 强制多边形顶点的方向遵循右手定则。
geometry ST_ForceRHR(
geometry g)
;
强制多边形中顶点的方向遵循右手定则,其中多边形所包围的区域位于边界的右侧。特别地,外环沿顺时针方向定向,而内环沿逆时针方向定向。 该函数是 ST_ForcePolygonCW 的同义词
![]() | |
右手定则的上述定义与其他上下文中使用的定义相冲突。 为避免混淆,建议使用 ST_ForcePolygonCW。 |
增强: 2.0.0 引入了对多面体曲面的支持。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
SELECT ST_AsEWKT( ST_ForceRHR( 'POLYGON((0 0 2, 5 0 2, 0 5 2, 0 0 2),(1 1 2, 1 3 2, 3 1 2, 1 1 2))' ) ); st_asewkt -------------------------------------------------------------- POLYGON((0 0 2,0 5 2,5 0 2,0 0 2),(1 1 2,3 1 2,1 3 2,1 1 2)) (1 row)
ST_LineExtend — 返回一条线,向前和向后延伸指定的距离。
geometry ST_LineExtend(
geometry line, float distance_forward, float distance_backward=0.0)
;
返回一条线,通过在给定的距离处添加新的起始点(和结束点),向前和向后延伸。距离为零不会添加点。只允许非负距离。所添加点的方向由线的第一个(和最后一个)不同的两个点确定。重复的点将被忽略。
可用性:3.4.0
SELECT ST_AsText(ST_LineExtend('LINESTRING(0 0, 0 10)'::geometry, 5, 6)); -------------------------------------------- LINESTRING(0 -6,0 0,0 10,0 15)
ST_LineToCurve — 将线性几何图形转换为曲线几何图形。
geometry ST_LineToCurve(
geometry geomANoncircular)
;
将普通线/多边形转换为圆形线和曲线多边形。 请注意,描述等效曲线所需的点要少得多。
![]() | |
如果输入线串/多边形不足以清楚地表示曲线,则该函数返回与输入几何图形相同的值。 |
可用性:1.3.0
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
-- 2D Example SELECT ST_AsText(ST_LineToCurve(foo.geom)) As curvedastext,ST_AsText(foo.geom) As non_curvedastext FROM (SELECT ST_Buffer('POINT(1 3)'::geometry, 3) As geom) As foo; curvedatext non_curvedastext --------------------------------------------------------------------|----------------------------------------------------------------- CURVEPOLYGON(CIRCULARSTRING(4 3,3.12132034355964 0.878679656440359, | POLYGON((4 3,3.94235584120969 2.41472903395162,3.77163859753386 1.85194970290473, 1 0,-1.12132034355965 5.12132034355963,4 3)) | 3.49440883690764 1.33328930094119,3.12132034355964 0.878679656440359, | 2.66671069905881 0.505591163092366,2.14805029709527 0.228361402466141, | 1.58527096604839 0.0576441587903094,1 0, | 0.414729033951621 0.0576441587903077,-0.148050297095264 0.228361402466137, | -0.666710699058802 0.505591163092361,-1.12132034355964 0.878679656440353, | -1.49440883690763 1.33328930094119,-1.77163859753386 1.85194970290472 | --ETC-- ,3.94235584120969 3.58527096604839,4 3)) --3D example SELECT ST_AsText(ST_LineToCurve(geom)) As curved, ST_AsText(geom) AS not_curved FROM (SELECT ST_Translate(ST_Force3D(ST_Boundary(ST_Buffer(ST_Point(1,3), 2,2))),0,0,3) AS geom) AS foo; curved | not_curved ------------------------------------------------------+--------------------------------------------------------------------- CIRCULARSTRING Z (3 3 3,-1 2.99999999999999 3,3 3 3) | LINESTRING Z (3 3 3,2.4142135623731 1.58578643762691 3,1 1 3, | -0.414213562373092 1.5857864376269 3,-1 2.99999999999999 3, | -0.414213562373101 4.41421356237309 3, | 0.999999999999991 5 3,2.41421356237309 4.4142135623731 3,3 3 3) (1 row)
ST_Multi — 将几何图形返回为 MULTI* 几何图形。
geometry ST_Multi(
geometry geom)
;
以 MULTI* 几何集合的形式返回几何图形。 如果几何图形已经是集合,则原样返回。
SELECT ST_AsText(ST_Multi('POLYGON ((10 30, 30 30, 30 10, 10 10, 10 30))')); st_astext ------------------------------------------------- MULTIPOLYGON(((10 30,30 30,30 10,10 10,10 30)))
ST_Normalize — 返回规范形式的几何图形。
geometry ST_Normalize(
geometry geom)
;
以规范化/标准化格式返回几何图形。 多边形环中的顶点顺序、多边形中环的顺序或复合几何中元素的顺序可能会更改。
在大多数情况下,它仅用于测试目的(将预期结果与实际结果进行比较)。
可用性:2.3.0
SELECT ST_AsText(ST_Normalize(ST_GeomFromText( 'GEOMETRYCOLLECTION( POINT(2 3), MULTILINESTRING((0 0, 1 1),(2 2, 3 3)), POLYGON( (0 10,0 0,10 0,10 10,0 10), (4 2,2 2,2 4,4 4,4 2), (6 8,8 8,8 6,6 6,6 8) ) )' ))); st_astext ---------------------------------------------------------------------------------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0),(6 6,8 6,8 8,6 8,6 6),(2 2,4 2,4 4,2 4,2 2)),MULTILINESTRING((2 2,3 3),(0 0,1 1)),POINT(2 3)) (1 row)
ST_Project — 返回从起点按距离和方位角(方位角)投影的点。
geometry ST_Project(
geometry g1, float distance, float azimuth)
;
geometry ST_Project(
geometry g1, geometry g2, float distance)
;
geography ST_Project(
geography g1, float distance, float azimuth)
;
geography ST_Project(
geography g1, geography g2, float distance)
;
返回从具有给定距离的起点计算并沿测地线方位角计算的点。这称为直接测地线问题。
两点使用从第一个点到第二个点的路径来隐式定义方位角,并像先前一样使用距离。
距离以米为单位。 支持负值。
方向角(也称为航向或方位角)以弧度给出。 它是从正北方向顺时针测量的。
正北是零度方位角(0度)
正东的方位角是π/2(90度)
正南方位角是π (180度)
正西方位角是3π/2(270度)
支持负方位角值和大于2π(360 度)的值。
可用性: 2.0.0
增强:2.4.0 允许负距离和非标准化方位角。
增强:3.4.0允许几何参数和无方位角的两点格式。
SELECT ST_AsText(ST_Project('POINT(0 0)'::geography, 100000, radians(45.0))); -------------------------------------------- POINT(0.635231029125537 0.639472334729198)
ST_QuantizeCoordinates — 将坐标的最低有效位设置为零
geometry ST_QuantizeCoordinates (
geometry g , int prec_x , int prec_y , int prec_z , int prec_m )
;
ST_QuantizeCoordinates
确定表示小数点后具有指定位数的坐标值所需的位数 (N
),然后将除 N
个最高有效位之外的所有位设置为零。 生成的坐标值仍将舍入为原始值,但会提高可压缩性。 如果几何列使用 可压缩存储类型,这可能会导致磁盘使用量显著减少。该功能允许在每个维度中指定不同的小数点后位数;未指定的尺寸假定具有 x
维度的精度。 负数被解释为指小数点左边的数字(即 prec_x=-2
将保留最接近 100 的坐标值)。
ST_QuantizeCoordinates
生成的坐标独立于包含这些坐标的几何图形以及这些坐标在几何图形中的相对位置。因此,几何图形之间现有的拓扑关系不会受到使用此函数的影响。 当使用低于几何的固有精度的位数调用该函数时,该函数可能会产生无效的几何。
可用性:2.5.0
PostGIS将所有坐标值存储为双精度浮点整数,可以可靠地表示15位有效数字。然而,PostGIS 可用于管理本质上有效数字少于 15 位的数据。 一个例子是 TIGER 数据,它以地理坐标的形式提供,小数点后精度为 6 位(因此仅需要 9 位有效的经度数字和 8 位有效的纬度数字。)
当有 15 位有效数字可用时,具有 9 位有效数字的数字有多种可能的表示形式。 双精度浮点数使用 52 个显式位来表示坐标的有效数(尾数)。 只需要30位即可表示9位有效数字的尾数,剩下22位无效位; 我们可以将它们的值设置为我们喜欢的任何值,并且最终仍然得到一个四舍五入到我们的输入值的数字。 例如,值 100.123456 可以由最接近 100.123456000000、100.123456000001 和 100.123456432199 的浮点数表示。所有这些都同样有效,因为ST_AsText(geom, 6)
将对任何这些输入返回相同的结果。 由于我们可以将这些位设置为任何值,因此 ST_QuantizeCoordinates
将 22 个无意义位设置为零。对于长坐标序列,这会创建连续零块的模式,PostgreSQL 可以更有效地压缩该模式。
![]() | |
只有几何图形的磁盘大小可能会受到 |
SELECT ST_AsText(ST_QuantizeCoordinates('POINT (100.123456 0)'::geometry, 4)); st_astext ------------------------- POINT(100.123455047607 0)
WITH test AS (SELECT 'POINT (123.456789123456 123.456789123456)'::geometry AS geom) SELECT digits, encode(ST_QuantizeCoordinates(geom, digits), 'hex'), ST_AsText(ST_QuantizeCoordinates(geom, digits)) FROM test, generate_series(15, -15, -1) AS digits; digits | encode | st_astext --------+--------------------------------------------+------------------------------------------ 15 | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 14 | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 13 | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 12 | 01010000005c9a72083cdd5e405c9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 11 | 0101000000409a72083cdd5e40409a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 10 | 0101000000009a72083cdd5e40009a72083cdd5e40 | POINT(123.456789123455 123.456789123455) 9 | 0101000000009072083cdd5e40009072083cdd5e40 | POINT(123.456789123418 123.456789123418) 8 | 0101000000008072083cdd5e40008072083cdd5e40 | POINT(123.45678912336 123.45678912336) 7 | 0101000000000070083cdd5e40000070083cdd5e40 | POINT(123.456789121032 123.456789121032) 6 | 0101000000000040083cdd5e40000040083cdd5e40 | POINT(123.456789076328 123.456789076328) 5 | 0101000000000000083cdd5e40000000083cdd5e40 | POINT(123.456789016724 123.456789016724) 4 | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375) 3 | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375) 2 | 01010000000000000038dd5e400000000038dd5e40 | POINT(123.45654296875 123.45654296875) 1 | 01010000000000000000dd5e400000000000dd5e40 | POINT(123.453125 123.453125) 0 | 01010000000000000000dc5e400000000000dc5e40 | POINT(123.4375 123.4375) -1 | 01010000000000000000c05e400000000000c05e40 | POINT(123 123) -2 | 01010000000000000000005e400000000000005e40 | POINT(120 120) -3 | 010100000000000000000058400000000000005840 | POINT(96 96) -4 | 010100000000000000000058400000000000005840 | POINT(96 96) -5 | 010100000000000000000058400000000000005840 | POINT(96 96) -6 | 010100000000000000000058400000000000005840 | POINT(96 96) -7 | 010100000000000000000058400000000000005840 | POINT(96 96) -8 | 010100000000000000000058400000000000005840 | POINT(96 96) -9 | 010100000000000000000058400000000000005840 | POINT(96 96) -10 | 010100000000000000000058400000000000005840 | POINT(96 96) -11 | 010100000000000000000058400000000000005840 | POINT(96 96) -12 | 010100000000000000000058400000000000005840 | POINT(96 96) -13 | 010100000000000000000058400000000000005840 | POINT(96 96) -14 | 010100000000000000000058400000000000005840 | POINT(96 96) -15 | 010100000000000000000058400000000000005840 | POINT(96 96)
ST_RemovePoint — 从线串中删除一个点。
geometry ST_RemovePoint(
geometry linestring, integer offset)
;
从线串中删除点。 索引从零开始。 用于将闭合环转换为开放线串。
增强:3.2.0
可用性:1.1.0
该函数支持 3d 并且不会丢失 z-index。
通过删除闭合线(环)的端点来保证没有闭合线。 假设 geom 的类型为 LINESTRING
UPDATE sometable SET geom = ST_RemovePoint(geom, ST_NPoints(geom) - 1) FROM sometable WHERE ST_IsClosed(geom);
ST_RemoveRepeatedPoints — 返回删除了重复点的几何图形。
geometry ST_RemoveRepeatedPoints(
geometry geom, float8 tolerance)
;
返回给定几何图形的版本,其中删除了重复的连续点。该函数仅处理(多)线串、(多)多边形和多点,但可以使用任何类型的几何图形进行调用。 GeometryCollections 的元素是单独处理的。 LineStrings 的端点被保留。
如果提供了容差
参数,则彼此容差距离内的顶点将被视为重复。
增强:3.2.0
可用性:2.2.0
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'MULTIPOINT ((1 1), (2 2), (3 3), (2 2))')); ------------------------- MULTIPOINT(1 1,2 2,3 3)
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'LINESTRING (0 0, 0 0, 1 1, 0 0, 1 1, 2 2)')); --------------------------------- LINESTRING(0 0,1 1,0 0,1 1,2 2)
示例: 集合元素是单独处理的。
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'GEOMETRYCOLLECTION (LINESTRING (1 1, 2 2, 2 2, 3 3), POINT (4 4), POINT (4 4), POINT (5 5))')); ------------------------------------------------------------------------------ GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),POINT(4 4),POINT(4 4),POINT(5 5))
示例: 删除在容差距离内的重复点。
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'LINESTRING (0 0, 0 0, 1 1, 5 5, 1 1, 2 2)', 2)); ------------------------- LINESTRING(0 0,5 5,2 2)
ST_RemoveIrrelevantPointsForView — Removes points that are irrelevant for rendering a specific rectangluar view of a geometry.
geometry ST_RemoveIrrelevantPointsForView(
geometry geom, box2d bounds)
;
Returns a geometry without points being irrelevant for rendering the geometry within a given rectangluar view.
This function can be used to quickly preprocess geometries that should be rendered only within certain bounds.
Only geometries of type (MULTI)POLYGON and (MULTI)LINESTRING are evaluated. Other geometries keep unchanged.
In contrast to ST_ClipByBox2D()
this function
sorts out points without computing new intersection points which avoids rounding errors and usually increases performance,
returns a geometry with equal or similar point number,
leads to the same rendering result within the specified view, and
may introduce self-intersections which would make the resulting geometry invalid (see example below).
![]() | |
For polygons, this function does currently not ensure that the result is valid. This situation can be checked with ST_IsValid and repaired with ST_MakeValid. |
Example: ST_RemoveIrrelevantPointsForView() applied to a polygon. Blue points remain, the rendering result (light-blue area) within the grey view box remains as well.
Example: Due to the fact that points are just sorted out and no new points are computed, the result of ST_RemoveIrrelevantPointsForView() may contain self-intersections.
可用性:3.5.0
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('MULTIPOLYGON(((10 10, 20 10, 30 10, 40 10, 20 20, 10 20, 10 10)),((10 10, 20 10, 20 20, 10 20, 10 10)))'), ST_MakeEnvelope(12,12,18,18))); st_astext --------- MULTIPOLYGON(((10 10,40 10,20 20,10 20,10 10)),((10 10,20 10,20 20,10 20,10 10)))
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('MULTILINESTRING((0 0, 10 0,20 0,30 0), (0 15, 5 15, 10 15, 15 15, 20 15, 25 15, 30 15, 40 15), (13 13,15 15,17 17))'), ST_MakeEnvelope(12,12,18,18))); st_astext --------- MULTILINESTRING((10 15,15 15,20 15),(13 13,15 15,17 17))
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('LINESTRING(0 0, 10 0,20 0,30 0)'), ST_MakeEnvelope(12,12,18,18))); st_astext --------- LINESTRING EMPTY
ST_RemoveSmallParts — Removes small parts (polygon rings or linestrings) of a geometry.
geometry ST_RemoveSmallParts(
geometry geom, double precision minSizeX, double precision minSizeY)
;
Returns a geometry without small parts (exterior or interior polygon rings, or linestrings).
This function can be used as preprocessing step for creating simplified maps, e. g. to remove small islands or holes.
It evaluates only geometries of type (MULTI)POLYGON and (MULTI)LINESTRING. Other geometries remain unchanged.
If minSizeX
is greater than 0, parts are sorted out if their width is smaller than minSizeX
.
If minSizeY
is greater than 0, parts are sorted out if their height is smaller than minSizeY
.
Both minSizeX
and minSizeY
are measured in coordinate system units of the geometry.
For polygon types, evaluation is done separately for each ring which can lead to one of the following results:
the original geometry,
a POLYGON with all rings with less vertices,
a POLYGON with a reduced number of interior rings (having possibly less vertices),
a POLYGON EMPTY, or
a MULTIPOLYGON with a reduced number of polygons (having possibly less interior rings or vertices), or
a MULTIPOLYGON EMPTY.
For linestring types, evaluation is done for each linestring which can lead to one of the following results:
the original geometry,
a LINESTRING with a reduced number of vertices,
a LINESTRING EMPTY,
a MULTILINESTRING with a reduced number of linestrings (having possibly less vertices), or
a MULTILINESTRING EMPTY.
Example: ST_RemoveSmallParts() applied to a multi-polygon. Blue parts remain.
可用性:3.5.0
SELECT ST_AsText( ST_RemoveSmallParts( ST_GeomFromText('MULTIPOLYGON( ((60 160, 120 160, 120 220, 60 220, 60 160), (70 170, 70 210, 110 210, 110 170, 70 170)), ((85 75, 155 75, 155 145, 85 145, 85 75)), ((50 110, 70 110, 70 130, 50 130, 50 110)))'), 50, 50)); st_astext --------- MULTIPOLYGON(((60 160,120 160,120 220,60 220,60 160)),((85 75,155 75,155 145,85 145,85 75)))
SELECT ST_AsText( ST_RemoveSmallParts( ST_GeomFromText('LINESTRING(10 10, 20 20)'), 50, 50)); st_astext --------- LINESTRING EMPTY
ST_Reverse — 返回顶点顺序相反的几何体。
geometry ST_Reverse(
geometry g1)
;
可用于任何几何体并反转顶点的顺序。
增强:2.4.0引入了曲线支持。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
SELECT ST_AsText(geom) as line, ST_AsText(ST_Reverse(geom)) As reverseline FROM (SELECT ST_MakeLine(ST_Point(1,2), ST_Point(1,10)) As geom) as foo; --result line | reverseline ---------------------+---------------------- LINESTRING(1 2,1 10) | LINESTRING(1 10,1 2)
ST_Segmentize — 返回修改后的几何图形/地理,其线段不长于给定距离。
geometry ST_Segmentize(
geometry geom, float max_segment_length)
;
geography ST_Segmentize(
geography geog, float max_segment_length)
;
返回修改后的几何图形/地理,其线段长度不超过 max_segment_length
。 线段长度以二维计算。 线段段总是被分成等长的子段。
对于几何形状,最大长度以空间参考系的单位表示。
对于地理来说,最大长度以米为单位。 距离是在球体上计算的。 添加的顶点是沿着线段端点定义的球面大圆弧创建的。
![]() | |
这只会缩短长线段。 它不会延长比最大长度短的线段。 |
![]() | |
对于包含长线段的输入,指定相对较短的 |
可用性:1.2.2
增强:3.0.0 分段几何现在可生成等长的子分段
增强:2.3.0 地理分段现在可生成等长的子分段
增强:2.1.0 引入了对地理的支持。
更改:2.1.0 由于引入了地理支持,使用 ST_Segmentize('LINESTRING(1 2, 3 4)', 0.5)
会导致不明确的函数错误。 输入需要正确键入为几何或地理。 使用 ST_GeomFromText、ST_GeogFromText 或转换为所需类型(例如 ST_Segmentize('LINESTRING(1 2, 3 4)'::geometry, 0.5) )
)
分割一条线。 长段均分,短段不平均。
SELECT ST_AsText(ST_Segmentize( 'MULTILINESTRING((0 0, 0 1, 0 9),(1 10, 1 18))'::geometry, 5 ) ); --------------------------------------------------- MULTILINESTRING((0 0,0 1,0 5,0 9),(1 10,1 14,1 18))
多边形分割:
SELECT ST_AsText( ST_Segmentize(('POLYGON((0 0, 0 8, 30 0, 0 0))'::geometry), 10)); ------------------------------------------------------- POLYGON((0 0,0 8,7.5 6,15 4,22.5 2,30 0,20 0,10 0,0 0))
对地理线进行分段,最大分段长度为 2000 公里。 沿着连接端点的大圆弧添加顶点。
SELECT ST_AsText( ST_Segmentize(('LINESTRING (0 0, 60 60)'::geography), 2000000)); ------------------------------------------------------------- LINESTRING(0 0,4.252632294621186 8.43596525986862,8.69579947419404 16.824093489701564,13.550465473227048 25.107950473646188,19.1066053508691 33.21091076089908,25.779290201459894 41.01711439406505,34.188839517966954 48.337222885886,45.238153936612264 54.84733442373889,60 60)
沿着大圆弧分段的地理线
ST_SetPoint — 用给定点替换线串的点。
geometry ST_SetPoint(
geometry linestring, integer zerobasedposition, geometry point)
;
将线串的 N 点替换为给定点。 索引从 0 开始。负索引向后计数,因此 -1 是最后一个点。当一个顶点移动时试图维持关节关系时,这在触发器中特别有用。
可用性:1.1.0
更新 2.3.0:负索引
该函数支持 3d 并且不会丢失 z-index。
--Change first point in line string from -1 3 to -1 1 SELECT ST_AsText(ST_SetPoint('LINESTRING(-1 2,-1 3)', 0, 'POINT(-1 1)')); st_astext ----------------------- LINESTRING(-1 1,-1 3) ---Change last point in a line string (lets play with 3d linestring this time) SELECT ST_AsEWKT(ST_SetPoint(foo.geom, ST_NumPoints(foo.geom) - 1, ST_GeomFromEWKT('POINT(-1 1 3)'))) FROM (SELECT ST_GeomFromEWKT('LINESTRING(-1 2 3,-1 3 4, 5 6 7)') As geom) As foo; st_asewkt ----------------------- LINESTRING(-1 2 3,-1 3 4,-1 1 3) SELECT ST_AsText(ST_SetPoint(g, -3, p)) FROM ST_GEomFromText('LINESTRING(0 0, 1 1, 2 2, 3 3, 4 4)') AS g , ST_PointN(g,1) as p; st_astext ----------------------- LINESTRING(0 0,1 1,0 0,3 3,4 4)
ST_ShiftLongitude — 在 -180-180 和 0-360 之间移动几何图形的经度坐标。
geometry ST_ShiftLongitude(
geometry geom)
;
读取几何图形的所有点/顶点,并将 -180 到 0 度范围内的经度值移动到 180 到 360 度,并将 180 到 360 度范围内的经度值从 -180 度移动到 0 度。 该函数是对称的,因此-180到180度范围内的数据用0到360度范围来表示,0到360度范围内的数据用-180到180度范围来表示。
![]() | |
这仅对具有经度/纬度坐标的数据有用; 例如 SRID 4326(WGS 84 地理坐标系) |
![]() | |
1.3.4 之前的错误导致该功能无法用于 MULTIPOINT。 1.3.4 也可与 MULTIPOINT 配合使用。 |
该函数支持 3d 并且不会丢失 z-index。
增强功能:2.0.0支持多面体曲面和 TIN 。
注意:该函数在 2.2.0 中由"ST_Shift_Longitude"重命名
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
--single point forward transformation SELECT ST_AsText(ST_ShiftLongitude('SRID=4326;POINT(270 0)'::geometry)) st_astext ---------- POINT(-90 0) --single point reverse transformation SELECT ST_AsText(ST_ShiftLongitude('SRID=4326;POINT(-90 0)'::geometry)) st_astext ---------- POINT(270 0) --for linestrings the functions affects only to the sufficient coordinates SELECT ST_AsText(ST_ShiftLongitude('SRID=4326;LINESTRING(174 12, 182 13)'::geometry)) st_astext ---------- LINESTRING(174 12,-178 13)
ST_WrapX — 将几何体环绕在 X 值周围。
geometry ST_WrapX(
geometry geom, float8 wrap, float8 move)
;
此函数分割输入的几何图形,然后按照“move”参数指定的方向移动落在给定“wrap”线右侧(对于负“移动”)或左侧(对于正“移动”)的每个结果组件 ,最终将碎片重新组合在一起。
![]() | |
这对于"重新居中"经纬度输入以使感兴趣的特征不会从一侧生成到另一侧非常有用。 |
可用性:2.3.0 需要 GEOS
该函数支持 3d 并且不会丢失 z-index。
-- Move all components of the given geometries whose bounding box -- falls completely on the left of x=0 to +360 select ST_WrapX(geom, 0, 360); -- Move all components of the given geometries whose bounding box -- falls completely on the left of x=-30 to +360 select ST_WrapX(geom, -30, 360);
ST_SnapToGrid — 将输入几何体的所有点捕捉到规则网格。
geometry ST_SnapToGrid(
geometry geomA, float originX, float originY, float sizeX, float sizeY)
;
geometry ST_SnapToGrid(
geometry geomA, float sizeX, float sizeY)
;
geometry ST_SnapToGrid(
geometry geomA, float size)
;
geometry ST_SnapToGrid(
geometry geomA, geometry pointOrigin, float sizeX, float sizeY, float sizeZ, float sizeM)
;
概要 1,2,3:将输入几何体的所有点捕捉到由其原点和像元大小定义的网格。 删除落在同一单元上的连续点,如果输出点不足以定义给定类型的几何图形,则最终返回 NULL。 集合中折叠的几何图形将从其中剥离。 对于降低精度很有用。
概要4:引入 1.1.0 - 将输入几何体的所有点捕捉到由其原点(第二个参数必须是点)和像元大小定义的网格。将 0 指定为您不想捕捉到网格的任何尺寸的大小。
![]() | |
返回的几何图形可能会失去其简单性(请参阅ST_IsSimple)。 |
![]() | |
在版本 1.1.0 之前,此函数始终返回 2d 几何图形。从 1.1.0 开始,返回的几何图形将具有与输入几何图形相同的维度,但更高的维度值保持不变。使用带有第二个几何参数的版本来定义所有网格尺寸。 |
可用性: 1.0.0RC1
可用性:1.1.0 - 添加了对 Z 和 M 值的支持
该函数支持 3d 并且不会丢失 z-index。
--Snap your geometries to a precision grid of 10^-3 UPDATE mytable SET geom = ST_SnapToGrid(geom, 0.001); SELECT ST_AsText(ST_SnapToGrid( ST_GeomFromText('LINESTRING(1.1115678 2.123, 4.111111 3.2374897, 4.11112 3.23748667)'), 0.001) ); st_astext ------------------------------------- LINESTRING(1.112 2.123,4.111 3.237) --Snap a 4d geometry SELECT ST_AsEWKT(ST_SnapToGrid( ST_GeomFromEWKT('LINESTRING(-1.1115678 2.123 2.3456 1.11111, 4.111111 3.2374897 3.1234 1.1111, -1.11111112 2.123 2.3456 1.1111112)'), ST_GeomFromEWKT('POINT(1.12 2.22 3.2 4.4444)'), 0.1, 0.1, 0.1, 0.01) ); st_asewkt ------------------------------------------------------------------------------ LINESTRING(-1.08 2.12 2.3 1.1144,4.12 3.22 3.1 1.1144,-1.08 2.12 2.3 1.1144) --With a 4d geometry - the ST_SnapToGrid(geom,size) only touches x and y coords but keeps m and z the same SELECT ST_AsEWKT(ST_SnapToGrid(ST_GeomFromEWKT('LINESTRING(-1.1115678 2.123 3 2.3456, 4.111111 3.2374897 3.1234 1.1111)'), 0.01) ); st_asewkt --------------------------------------------------------- LINESTRING(-1.11 2.12 3 2.3456,4.11 3.24 3.1234 1.1111)
ST_Snap — 将输入几何体的线段和顶点捕捉到参考几何体的顶点。
geometry ST_Snap(
geometry input, geometry reference, float tolerance)
;
将一个几何体的顶点和边捕捉到另一个几何体的顶点。捕捉距离公差用于控制执行捕捉的位置。 结果几何体是顶点被捕捉的输入几何体。 如果没有发生捕捉,则输入几何体将原样返回。
将一个几何体捕捉到另一个几何体可以通过消除几何重合的边(这会在节点和相交计算期间引起问题)来提高叠加操作的可靠性。
过多的捕捉可能会导致创建无效的拓扑,因此使用启发式方法确定捕捉顶点的数量和位置,以确定何时可以安全捕捉。 然而,这可能会导致一些潜在的捕捉被忽略。
![]() | |
返回的几何图形可能已失去其简单性(请参阅ST_IsSimple)或可能无效(请参阅ST_IsValid)。 |
这个函数是由 GEOS 模块执行的。
可用性: 2.0.0
![]() 带有线串的多边形(在任何捕捉之前) | |
![]() 将多边形捕捉到线串,公差距离为 1.01。 新的多边形连接到线串
SELECT ST_AsText(ST_Snap(poly,line, ST_Distance(poly,line)*1.01)) AS polysnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( ((26 125, 26 200, 126 200, 126 125, 26 125 ), ( 51 150, 101 150, 76 175, 51 150 )), (( 151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; polysnapped --------------------------------------------------------------------- MULTIPOLYGON(((26 125,26 200,126 200,126 125,101 100,26 125), (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100))) | ![]() 将多重多边形捕捉到公差为 1.25 的多线串。 新的多边形连接到线串
SELECT ST_AsText( ST_Snap(poly,line, ST_Distance(poly,line)*1.25) ) AS polysnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( (( 26 125, 26 200, 126 200, 126 125, 26 125 ), ( 51 150, 101 150, 76 175, 51 150 )), (( 151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; polysnapped --------------------------------------------------------------------- MULTIPOLYGON(((5 107,26 200,126 200,126 125,101 100,54 84,5 107), (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100))) |
![]() 将线串捕捉到原始多边形,公差距离为 1.01。 新线串将连接到多边形
SELECT ST_AsText( ST_Snap(line, poly, ST_Distance(poly,line)*1.01) ) AS linesnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( ((26 125, 26 200, 126 200, 126 125, 26 125), (51 150, 101 150, 76 175, 51 150 )), ((151 100, 151 200, 176 175, 151 100)))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; linesnapped ---------------------------------------- LINESTRING(5 107,26 125,54 84,101 100)
| ![]() 将线串捕捉到原始多边形,公差距离为 1.25。 新线串将连接到多边形
SELECT ST_AsText( ST_Snap(line, poly, ST_Distance(poly,line)*1.25) ) AS linesnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( (( 26 125, 26 200, 126 200, 126 125, 26 125 ), (51 150, 101 150, 76 175, 51 150 )), ((151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; linesnapped --------------------------------------- LINESTRING(26 125,54 84,101 100) |
ST_SwapOrdinates — 返回更改后的几何图形,其中交换了给定的坐标值。
geometry ST_SwapOrdinates(
geometry geom, cstring ords)
;
返回一个几何图形,其中给定坐标的值在给定几何图形中交换。
ords
参数是一个两个字符的字符串,指定要交换的坐标。有效名称为:x、y、z 和 m。
可用性:2.2.0
此方法支持圆形字符串和曲线。
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
-- Scale M value by 2 SELECT ST_AsText( ST_SwapOrdinates( ST_Scale( ST_SwapOrdinates(g,'xm'), 2, 1 ), 'xm') ) FROM ( SELECT 'POINT ZM (0 0 0 2)'::geometry g ) foo; st_astext -------------------- POINT ZM (0 0 0 4)
这些函数用于根据OGC SFS(Open Geospatial Consortium Simple Feature Specification,开放地理空间联盟简单要素规范)标准验证几何数据是否有效。它们还提供有关无效性质和位置的信息。此外,还有一个函数可用于从无效的几何数据中创建有效的几何数据。
valid_detail
行,说明几何图形是否有效或无效,说明原因和位置。ST_IsValid — 测试几何图形在 2D 中是否有效。
boolean ST_IsValid(
geometry g)
;
boolean ST_IsValid(
geometry g, integer flags)
;
根据 OGC 规则测试 ST_Geometry 值在 2D 中是否格式良好且有效。 对于 3 维和 4 维几何形状,有效性仍然仅在 2 维中进行测试。 对于无效的几何图形,会发出 PostgreSQL NOTICE,提供其无效原因的详细信息。
对于带有 flags
参数的版本,支持的值记录在 ST_IsValidDetail 中。此版本不会打印解释无效性的通知。
有关几何有效性定义的更多信息,请参阅第 Section 4.4, “几何有效性验证”
![]() | |
SQL-MM 将 ST_IsValid(NULL) 的结果定义为 0,而 PostGIS 返回 NULL。 |
这个函数是由 GEOS 模块执行的。
接受标志的版本从 2.0.0 开始可用。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.9
![]() | |
OGC-SFS 和 SQL-MM 规范均不包含 ST_IsValid 的标志参数。 该标志是 PostGIS 扩展。 |
SELECT ST_IsValid(ST_GeomFromText('LINESTRING(0 0, 1 1)')) As good_line, ST_IsValid(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) As bad_poly --results NOTICE: Self-intersection at or near point 0 0 good_line | bad_poly -----------+---------- t | f
ST_IsValidDetail — 返回 valid_detail
行,说明几何图形是否有效或无效,说明原因和位置。
valid_detail ST_IsValidDetail(
geometry geom, integer flags)
;
返回一个 valid_detail
行,其中包含一个boolean(有效
),说明几何图形是否有效;一个 varchar(原因
),说明其无效原因;以及一个 geometry(位置
),指出其无效位置。
有助于改进 ST_IsValid和ST_IsValidReason的组合,以生成无效几何的详细报告。
可选的 flags
参数是一个位字段。 它可以具有以下值:
0:使用常用的 OGC SFS 有效性语义。
1:考虑某些类型的自接触环(倒壳和倒孔)是有效的。 这也称为“ESRI 标志”,因为这是这些工具使用的有效性模型。 注意,这在 OGC 模型下是无效的。
这个函数是由 GEOS 模块执行的。
可用性: 2.0.0
--First 3 Rejects from a successful quintuplet experiment SELECT gid, reason(ST_IsValidDetail(geom)), ST_AsText(location(ST_IsValidDetail(geom))) as location FROM (SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As geom, gid FROM (SELECT ST_Buffer(ST_Point(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid FROM generate_series(-4,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,8) z1 WHERE x1 > y1*0.5 AND z1 < x1*y1) As e INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_Point(x1*10,y1), z1)),y1*1, z1*2) As line FROM generate_series(-3,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,10) z1 WHERE x1 > y1*0.75 AND z1 < x1*y1) As f ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line)) GROUP BY gid, e.buff) As quintuplet_experiment WHERE ST_IsValid(geom) = false ORDER BY gid LIMIT 3; gid | reason | location ------+-------------------+------------- 5330 | Self-intersection | POINT(32 5) 5340 | Self-intersection | POINT(42 5) 5350 | Self-intersection | POINT(52 5) --simple example SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)'); valid | reason | location -------+--------+---------- t | |
ST_IsValidReason — 返回说明几何图形是否有效或无效原因的文本。
text ST_IsValidReason(
geometry geomA)
;
text ST_IsValidReason(
geometry geomA, integer flags)
;
返回文本,说明几何图形是否有效,如果无效,则说明原因。
与 ST_IsValid 结合使用可生成无效几何形状和原因的详细报告。
允许的flags
记录在ST_IsValidDetail 中。
这个函数是由 GEOS 模块执行的。
有效性:1.4
有效性:2.0 版本正在接受标记。
-- invalid bow-tie polygon SELECT ST_IsValidReason( 'POLYGON ((100 200, 100 100, 200 200, 200 100, 100 200))'::geometry) as validity_info; validity_info -------------------------- Self-intersection[150 150]
--First 3 Rejects from a successful quintuplet experiment SELECT gid, ST_IsValidReason(geom) as validity_info FROM (SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As geom, gid FROM (SELECT ST_Buffer(ST_Point(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid FROM generate_series(-4,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,8) z1 WHERE x1 > y1*0.5 AND z1 < x1*y1) As e INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_Point(x1*10,y1), z1)),y1*1, z1*2) As line FROM generate_series(-3,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,10) z1 WHERE x1 > y1*0.75 AND z1 < x1*y1) As f ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line)) GROUP BY gid, e.buff) As quintuplet_experiment WHERE ST_IsValid(geom) = false ORDER BY gid LIMIT 3; gid | validity_info ------+-------------------------- 5330 | Self-intersection [32 5] 5340 | Self-intersection [42 5] 5350 | Self-intersection [52 5] --simple example SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020 150410)'); st_isvalidreason ------------------ Valid Geometry
ST_MakeValid — 尝试在不丢失顶点的情况下使无效几何体有效。
geometry ST_MakeValid(
geometry input)
;
geometry ST_MakeValid(
geometry input, text params)
;
该函数尝试创建给定无效几何体的有效表示,而不丢失任何输入顶点。 有效几何图形原封不动地返回。
相应的输入是点、多点、线串、多线串、多边形、多多边形、几何集合及其混合。
在完全或部分尺寸折叠的情况下,输出几何是相同或较低维度的几何集合,或者是较低维度几何的集合。
在自相交的情况下,单个多边形可能会变成多重几何图形。
params
参数可用于提供选项字符串来选择用于构建有效几何图形的方法。 选项字符串的格式为“method=linework|struct keepcollapsed=true|false”。 如果未提供“params”参数,则将使用“linework”算法作为默认值。
“method”键有两个值。
“linework”是原始算法,它通过首先提取所有线条、将线条节点在一起、然后从线条构建值输出来构建有效的几何图形。
“structure”是一种区分内环和外环的算法,通过合并外环来构建新的几何形状,然后区分所有内环。
"keepcollapsed" 键仅对 "structure" 算法有效,其取值为 "true" 或 "false"。当设置为 "false" 时,会删除折叠到更低维度的几何组件,例如一维线串(linestring)会被丢弃。
这个函数是由 GEOS 模块执行的。
可用性: 2.0.0
增强:2.0.1 速度提升
增强:2.1.0添加了对几何集合和多点的支持。
增强:3.1.0删除了具有NaN值的坐标。
增强:在 3.2.0 中,添加了可选的算法参数“linework”和“structure”。 需要 GEOS>= 3.10.0 或更高版本。
该函数支持 3d 并且不会丢失 z-index。
![]() before_geom:由两个重叠多边形组成的多多边形
![]() after_geom:具有四个非重叠多边形的多多边形
![]() after_geom_structure:由单个非重叠多边形组成的多多边形
SELECT f.geom AS before_geom, ST_MakeValid(f.geom) AS after_geom, ST_MakeValid(f.geom, 'method=structure') AS after_geom_structure FROM (SELECT 'MULTIPOLYGON(((186 194,187 194,188 195,189 195,190 195, 191 195,192 195,193 194,194 194,194 193,195 192,195 191, 195 190,195 189,195 188,194 187,194 186,14 6,13 6,12 5,11 5, 10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,186 194)), ((150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40, 90 41,81 44,72 48,65 55,58 62,54 71,51 80,50 90,51 100, 54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139, 119 136,128 132,135 125,142 118,146 109,149 100,150 90)))'::geometry AS geom) AS f;
|
![]() before_geom:由六个重叠多边形组成的多多边形
![]() after_geom:由 14 个不重叠多边形组成的多多边形
![]() after_geom_structure:由单个非重叠多边形组成的多多边形
SELECT c.geom AS before_geom, ST_MakeValid(c.geom) AS after_geom, ST_MakeValid(c.geom, 'method=structure') AS after_geom_structure FROM (SELECT 'MULTIPOLYGON(((91 50,79 22,51 10,23 22,11 50,23 78,51 90,79 78,91 50)), ((91 100,79 72,51 60,23 72,11 100,23 128,51 140,79 128,91 100)), ((91 150,79 122,51 110,23 122,11 150,23 178,51 190,79 178,91 150)), ((141 50,129 22,101 10,73 22,61 50,73 78,101 90,129 78,141 50)), ((141 100,129 72,101 60,73 72,61 100,73 128,101 140,129 128,141 100)), ((141 150,129 122,101 110,73 122,61 150,73 178,101 190,129 178,141 150)))'::geometry AS geom) AS c;
|
SELECT ST_AsText(ST_MakeValid( 'LINESTRING(0 0, 0 0)', 'method=structure keepcollapsed=true' )); st_astext ------------ POINT(0 0) SELECT ST_AsText(ST_MakeValid( 'LINESTRING(0 0, 0 0)', 'method=structure keepcollapsed=false' )); st_astext ------------------ LINESTRING EMPTY
这些函数与在 spatial_ref_sys
表中定义的几何空间参考系统一起使用。
ST_InverseTransformPipeline — 返回一个新的几何体,其坐标值使用定义的坐标变换管道的逆变换变换到不同的空间参考系。
geometry ST_InverseTransformPipeline(
geometry geom, text pipeline, integer to_srid)
;
返回一个新的几何体,其坐标值使用定义的坐标变换管道的逆变换变换到不同的空间参考系。
有关编写转换管道的详细信息,请参阅 ST_TransformPipeline。
可用性:3.4.0
输入几何体的 SRID 将被忽略,输出几何体的 SRID 将设置为零,除非通过可选的 to_srid
参数提供值。 使用 ST_TransformPipeline 时,管道将向前执行。 使用“ST_InverseTransformPipeline()”,管道以相反方向执行。
使用管道的转换是ST_Transform 的专门版本。 在大多数情况下,“ST_Transform”将选择正确的操作在坐标系之间进行转换,并且应该是首选。
使用 EPSG:16031 转换将 WGS 84 经纬度更改为 UTM 31N
-- Inverse direction SELECT ST_AsText(ST_InverseTransformPipeline('POINT(426857.9877165967 5427937.523342293)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::16031')) AS wgs_geom; wgs_geom ---------------------------- POINT(2 48.99999999999999) (1 row)
GDA2020示例。
-- using ST_Transform with automatic selection of a conversion pipeline. SELECT ST_AsText(ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844)) AS gda2020_auto; gda2020_auto ----------------------------------------------- POINT(143.00000635638918 -36.999986706128176) (1 row)
ST_SetSRID — 在几何体上设置 SRID。
geometry ST_SetSRID(
geometry geom, integer srid)
;
将几何图形的 SRID 设置为特定的整数值。 用于为查询生成边界框。
![]() | |
此函数不会变换几何,它仅设置定义几何所需的空间参考系统的元数据。 如果要将几何图形转换为新投影,请使用ST_Transform 。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
此方法支持圆形字符串和曲线。
-- 将点设置为 WGS84 经纬度 --
SELECT ST_SetSRID(ST_Point(-123.365556, 48.428611),4326) As wgs84long_lat; -- the ewkt representation (wrap with ST_AsEWKT) - SRID=4326;POINT(-123.365556 48.428611)
-- 将点设置为 WGS84 经纬度,并将其转换为web mercator(球面墨卡托) --
SELECT ST_Transform(ST_SetSRID(ST_Point(-123.365556, 48.428611),4326),3785) As spere_merc; -- the ewkt representation (wrap with ST_AsEWKT) - SRID=3785;POINT(-13732990.8753491 6178458.96425423)
ST_SRID — 返回几何图形的空间参考标识符。
integer ST_SRID(
geometry g1)
;
返回ST_Geometry spatial_ref_sys表中定义的空间参考系统标识号。 请参见 Section 4.5, “空间参考系统”
![]() | |
spatial_ref_sys表对 PostGIS 已知的所有参考系进行编目,并用于从一个空间参考系转换为另一个空间参考系。 如果计划转换几何,请务必确保具有正确的空间参考系统标识号。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.5
此方法支持圆形字符串和曲线。
SELECT ST_SRID(ST_GeomFromText('POINT(-71.1043 42.315)',4326)); --result 4326
ST_Transform — 返回坐标转换为不同空间参考系的新几何图形。
geometry ST_Transform(
geometry g1, integer srid)
;
geometry ST_Transform(
geometry geom, text to_proj)
;
geometry ST_Transform(
geometry geom, text from_proj, text to_proj)
;
geometry ST_Transform(
geometry geom, text from_proj, integer to_srid)
;
返回一个新的几何图形,其坐标转换为不同的空间参考系统。 目标空间参考to_srid
可以通过有效的 SRID 整数参数来标识(即,它必须存在于spatial_ref_sys
表中)。 或者,定义为 PROJ.4 字符串的空间参考可用于 to_proj
和/或 from_proj
,但这些方法并未经过优化。 如果目标空间参考系使用 PROJ.4 字符串而不是 SRID 表示,则输出几何的 SRID 将设置为零。 除了 from_proj
的函数之外,输入几何图形必须具有已定义的 SRID。
ST_Transform 经常与ST_SetSRID 混淆。 ST_Transform 实际上将几何图形的坐标从一个空间参考系统更改为另一个空间参考系统,而 ST_SetSRID() 只是更改几何图形的 SRID 标识符。
ST_Transform 会在给定源和目标空间参考系统的情况下自动选择合适的转换管道。 要使用特定的转换方法,请使用ST_TransformPipeline。
![]() | |
PostGIS 必须在 PROJ 支持下进行编译。 使用该 PostGIS_Full_Version检查它是否在 PROJ 支持下编译。 |
![]() | |
如果使用多个转换,则在常用转换上拥有一个功能索引以充分利用索引的使用是很有用的。 |
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
增强: 2.0.0 引入了对多面体曲面的支持。
增强:2.3.0 引入了对直接 PROJ.4 字符串的支持。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.6
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
将马萨诸塞州平面美国英尺几何形状更改为 WGS 84 经纬度
SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))',2249),4326)) As wgs_geom; wgs_geom --------------------------- POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009, -71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.177684 8522251 42.3902896512902)); (1 row) --3D Circular String example SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'),4326)); st_asewkt -------------------------------------------------------------------------------------- SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512902 1,-71.1776843766326 42.3903829478009 2, -71.1775844305465 42.3903826677917 3, -71.1775825927231 42.3902893647987 3,-71.1776848522251 42.3902896512902 4)
创建部分功能索引的示例。 对于不确定所有几何图形都将被填充的表,最好使用部分索引来省略空几何图形,这既可以节省空间,又可以使索引更小、更高效。
CREATE INDEX idx_geom_26986_parcels ON parcels USING gist (ST_Transform(geom, 26986)) WHERE geom IS NOT NULL;
使用 PROJ.4 文本通过自定义空间参考进行转换的示例。
-- Find intersection of two polygons near the North pole, using a custom Gnomic projection -- See http://boundlessgeo.com/2012/02/flattening-the-peel/ WITH data AS ( SELECT ST_GeomFromText('POLYGON((170 50,170 72,-130 72,-130 50,170 50))', 4326) AS p1, ST_GeomFromText('POLYGON((-170 68,-170 90,-141 90,-141 68,-170 68))', 4326) AS p2, '+proj=gnom +ellps=WGS84 +lat_0=70 +lon_0=-160 +no_defs'::text AS gnom ) SELECT ST_AsText( ST_Transform( ST_Intersection(ST_Transform(p1, gnom), ST_Transform(p2, gnom)), gnom, 4326)) FROM data; st_astext -------------------------------------------------------------------------------- POLYGON((-170 74.053793645338,-141 73.4268621378904,-141 68,-170 68,-170 74.053793645338))
有时,涉及网格移位的坐标转换可能会失败,例如,如果 PROJ.4 尚未使用网格移位文件构建,或者坐标不在定义网格移位的范围内。 默认情况下,如果网格偏移文件不存在,PostGIS 将抛出错误,但可以通过测试 PROJ.4 文本的不同 to_proj
值或更改 Spatial_ref_sys
表中的 proj4text
值,在每个 SRID 的基础上配置此行为 。
例如,proj4text 参数 datum=NAD87 是以下 nadgrids 参数的简写形式:
+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
@ 前缀意味着如果文件不存在,则不会报告错误,但如果到达列表末尾而没有合适的文件(即找到并重叠),则会发出错误。
相反,如果您想确保至少存在标准文件,但如果扫描所有文件而没有命中,则应用空转换,您可以使用:
+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null
空网格平移文件是覆盖整个世界并且不应用平移的有效网格平移文件。 因此,对于一个完整的示例,如果您想更改 PostGIS,以便转换到不在正确范围内的 SRID 4267 时不会引发错误,您可以使用以下命令:
UPDATE spatial_ref_sys SET proj4text = '+proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null +no_defs' WHERE srid = 4267;
ST_TransformPipeline — 返回一个新的几何图形,其坐标使用定义的坐标转换管道转换为不同的空间参考系统。
geometry ST_TransformPipeline(
geometry g1, text pipeline, integer to_srid)
;
返回一个新的几何图形,其坐标使用定义的坐标转换管道转换为不同的空间参考系统。
转换管道使用以下任意字符串格式定义:
urn:ogc:def:coordinateOperation:AUTHORITY::CODE
。 请注意,简单的 EPSG:CODE
字符串不能唯一标识坐标操作:相同的 EPSG 代码可用于 CRS 定义。
PROJ 管道字符串的形式为: proj=pipeline ....
将不会应用自动轴规范化,并且如有必要,调用者将需要添加额外的管道步骤,或删除 axisswap
步骤。
形式的串联操作:urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618
。
可用性:3.4.0
输入几何体的 SRID 将被忽略,输出几何体的 SRID 将设置为零,除非通过可选的 to_srid
参数提供值。 当使用“ST_TransformPipeline()”时,管道将向前执行。 使用 ST_InverseTransformPipeline管道以相反方向执行。
使用管道的转换是ST_Transform 的专门版本。 在大多数情况下,“ST_Transform”将选择正确的操作在坐标系之间进行转换,并且应该是首选。
使用 EPSG:16031 转换将 WGS 84 经纬度更改为 UTM 31N
-- Forward direction SELECT ST_AsText(ST_TransformPipeline('SRID=4326;POINT(2 49)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::16031')) AS utm_geom; utm_geom -------------------------------------------- POINT(426857.9877165967 5427937.523342293) (1 row) -- Inverse direction SELECT ST_AsText(ST_InverseTransformPipeline('POINT(426857.9877165967 5427937.523342293)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::16031')) AS wgs_geom; wgs_geom ---------------------------- POINT(2 48.99999999999999) (1 row)
GDA2020示例。
-- using ST_Transform with automatic selection of a conversion pipeline. SELECT ST_AsText(ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844)) AS gda2020_auto; gda2020_auto ----------------------------------------------- POINT(143.00000635638918 -36.999986706128176) (1 row) -- using a defined conversion (EPSG:8447) SELECT ST_AsText(ST_TransformPipeline('SRID=4939;POINT(143.0 -37.0)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::8447')) AS gda2020_code; gda2020_code ---------------------------------------------- POINT(143.0000063280214 -36.999986718287545) (1 row) -- using a PROJ pipeline definition matching EPSG:8447, as returned from -- 'projinfo -s EPSG:4939 -t EPSG:7844'. -- NOTE: any 'axisswap' steps must be removed. SELECT ST_AsText(ST_TransformPipeline('SRID=4939;POINT(143.0 -37.0)'::geometry, '+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=hgridshift +grids=au_icsm_GDA94_GDA2020_conformal_and_distortion.tif +step +proj=unitconvert +xy_in=rad +xy_out=deg')) AS gda2020_pipeline; gda2020_pipeline ---------------------------------------------- POINT(143.0000063280214 -36.999986718287545) (1 row)
postgis_srs_codes — 返回与给定权限关联的 SRS 代码列表。
setof text postgis_srs_codes(
text auth_name)
;
返回给定 auth_name
的所有 auth_srid
的集合。
可用性:3.4.0
Proj version 6+
获取与 EPSG 权威机构关联的前 10 个代码的列表。
SELECT * FROM postgis_srs_codes('EPSG') LIMIT 10; postgis_srs_codes ------------------- 2000 20004 20005 20006 20007 20008 20009 2001 20010 20011
postgis_srs — 返回所请求的权限和 srid 的元数据记录。
setof record postgis_srs(
text auth_name, text auth_srid)
;
返回给定 auth_name
所请求的 auth_srid
的元数据记录。 该记录将包含 auth_name
、auth_srid
、srname
、srtext
、proj4text
以及使用区域的角点 point_sw
和 point_ne
。
可用性:3.4.0
Proj version 6+
获取 EPSG 的元数据:3005。
SELECT * FROM postgis_srs('EPSG', '3005'); auth_name | EPSG auth_srid | 3005 srname | NAD83 / BC Albers srtext | PROJCS["NAD83 / BC Albers", ... ]] proj4text | +proj=aea +lat_0=45 +lon_0=-126 +lat_1=50 +lat_2=58.5 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs +type=crs point_sw | 0101000020E6100000E17A14AE476161C00000000000204840 point_ne | 0101000020E610000085EB51B81E855CC0E17A14AE47014E40
postgis_srs_all — 返回底层 Proj 数据库中每个空间参考系统的元数据记录。
setof record postgis_srs_all(
void)
;
返回底层 Proj 数据库中所有元数据记录的集合。 这些记录将包含 auth_name
、auth_srid
、srname
、srtext
、proj4text
以及使用区域的角点 point_sw
和 point_ne
。
可用性:3.4.0
Proj version 6+
从 Proj 数据库中获取前 10 条元数据记录。
SELECT auth_name, auth_srid, srname FROM postgis_srs_all() LIMIT 10; auth_name | auth_srid | srname -----------+-----------+------------------------------------------ EPSG | 2000 | Anguilla 1957 / British West Indies Grid EPSG | 20004 | Pulkovo 1995 / Gauss-Kruger zone 4 EPSG | 20005 | Pulkovo 1995 / Gauss-Kruger zone 5 EPSG | 20006 | Pulkovo 1995 / Gauss-Kruger zone 6 EPSG | 20007 | Pulkovo 1995 / Gauss-Kruger zone 7 EPSG | 20008 | Pulkovo 1995 / Gauss-Kruger zone 8 EPSG | 20009 | Pulkovo 1995 / Gauss-Kruger zone 9 EPSG | 2001 | Antigua 1943 / British West Indies Grid EPSG | 20010 | Pulkovo 1995 / Gauss-Kruger zone 10 EPSG | 20011 | Pulkovo 1995 / Gauss-Kruger zone 11
postgis_srs_search — 返回具有完全包含边界参数的使用区域的投影坐标系的元数据记录。
setof record postgis_srs_search(
geometry bounds, text auth_name=EPSG)
;
返回投影坐标系的一组元数据记录,这些坐标系的使用区域完全包含边界参数。 每条记录将包含 auth_name
、auth_srid
、srname
、srtext
、proj4text
以及使用区域的角点 point_sw
和 point_ne
。
该搜索仅查找投影坐标系,旨在让用户探索适用于其数据范围的可能坐标系统。
可用性:3.4.0
Proj version 6+
搜索路易斯安那州的投影坐标系。
SELECT auth_name, auth_srid, srname, ST_AsText(point_sw) AS point_sw, ST_AsText(point_ne) AS point_ne FROM postgis_srs_search('SRID=4326;LINESTRING(-90 30, -91 31)') LIMIT 3; auth_name | auth_srid | srname | point_sw | point_ne -----------+-----------+--------------------------------------+---------------------+--------------------- EPSG | 2801 | NAD83(HARN) / Louisiana South | POINT(-93.94 28.85) | POINT(-88.75 31.07) EPSG | 3452 | NAD83 / Louisiana South (ftUS) | POINT(-93.94 28.85) | POINT(-88.75 31.07) EPSG | 3457 | NAD83(HARN) / Louisiana South (ftUS) | POINT(-93.94 28.85) | POINT(-88.75 31.07)
扫描表格以获得最大范围并找到可能适合的投影坐标系。
WITH ext AS ( SELECT ST_Extent(geom) AS geom, Max(ST_SRID(geom)) AS srid FROM foo ) SELECT auth_name, auth_srid, srname, ST_AsText(point_sw) AS point_sw, ST_AsText(point_ne) AS point_ne FROM ext CROSS JOIN postgis_srs_search(ST_SetSRID(ext.geom, ext.srid)) LIMIT 3;
这些函数从各种文本或二进制格式创建几何对象。
ST_BdPolyFromText — 给定任意闭合线串集合作为 MultiLineString 熟知的文本表示形式(WKT),构造一个多边形。
geometry ST_BdPolyFromText(
text WKT, integer srid)
;
从闭合线串的任意集合构造多边形,这些线串具有多线串的已知文本表示形式。
![]() | |
如果 WKT 不是 MULTILINESTRING,则会引发错误。 如果输出是 MULTIPOLYGON,则抛出错误; 在这种情况下使用 ST_BdMPolyFromText,或者参见 ST_BuildArea() 了解 postgis 特定的方法。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
这个函数是由 GEOS 模块执行的。
可用性:1.1.0
ST_BdMPolyFromText — 从任何封闭线串集合构造多面,并具有多线串的已知文本表示形式。
geometry ST_BdMPolyFromText(
text WKT, integer srid)
;
给定闭合线串、多边形、多线字符串的任意集合作为已知的文本表示,构造一个多边形。
![]() | |
如果 WKT 不是 MULTILINESTRING,则会引发错误。 即使结果实际上仅由单个 POLYGON 组成,也强制输出 MULTIPOLYGON; 如果您确定操作将产生单个 POLYGON,请使用ST_BdPolyFromText,或者请参阅 ST_BuildArea() 了解 postgis 特定的方法。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
这个函数是由 GEOS 模块执行的。
可用性:1.1.0
ST_GeogFromText — 从已知的文本表示或扩展 (WKT) 返回指定的地理值。
geography ST_GeogFromText(
text EWKT)
;
从已知的文本或扩展的已知的表示中返回地理对象。 如果未指定,则假定为 SRID 4326。 这是 ST_GeographyFromText 的别名。 点始终以经纬度形式表示。
--- converting lon lat coords to geography ALTER TABLE sometable ADD COLUMN geog geography(POINT,4326); UPDATE sometable SET geog = ST_GeogFromText('SRID=4326;POINT(' || lon || ' ' || lat || ')'); --- specify a geography point using EPSG:4267, NAD27 SELECT ST_AsEWKT(ST_GeogFromText('SRID=4267;POINT(-77.0092 38.889588)'));
ST_GeographyFromText — 从已知的文本表示或扩展 (WKT) 返回指定的地理值。
geography ST_GeographyFromText(
text EWKT)
;
从已知的文本表示形式返回地理对象。 如果未指定,则假定为 SRID 4326。
ST_GeomCollFromText — 使用给定的 SRID 从集合 WKT 中创建集合几何体。 如果未给出 SRID,则默认为 0。
geometry ST_GeomCollFromText(
text WKT, integer srid)
;
geometry ST_GeomCollFromText(
text WKT)
;
使用给定的 SRID 从已知的文本 (WKT) 表示形式创建几何集合。 如果未给出 SRID,则默认为 0。
OGC 规范 3.2.6.2 - 可选 SRID 用于规范
如果 WKT 不是几何集合,则返回 NULL
![]() | |
如果您绝对确定所有 WKT 几何图形都是集合,请不要使用此函数。 它比 ST_GeomFromText 慢,因为它添加了额外的验证步骤。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。
SELECT ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(1 2, 3 4))');
ST_GeomFromEWKT — 从扩展已知的文本表示 (EWKT) 返回指定的 ST_Geometry 值。
geometry ST_GeomFromEWKT(
text EWKT)
;
根据 OGC 扩展已知的文本 (EWKT) 表示构造 PostGIS ST_Geometry 对象。
![]() | |
EWKT 格式不是 OGC 标准,而是包含空间参考系统 (SRID) 标识符的 PostGIS 特定格式 |
增强功能:2.0.0支持多面体曲面和 TIN 。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_GeomFromEWKT('SRID=4269;LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)'); SELECT ST_GeomFromEWKT('SRID=4269;MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))'); SELECT ST_GeomFromEWKT('SRID=4269;POINT(-71.064544 42.28787)'); SELECT ST_GeomFromEWKT('SRID=4269;POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'); SELECT ST_GeomFromEWKT('SRID=4269;MULTIPOLYGON(((-71.1031880899493 42.3152774590236, -71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307, -71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248, -71.102505233663 42.3144722937587,-71.10277487471 42.3141658254797, -71.103113945163 42.3142739188902,-71.10324876416 42.31402489987, -71.1033002961013 42.3140393340215,-71.1033488797549 42.3139495090772, -71.103396240451 42.3138632439557,-71.1041521907712 42.3141153348029, -71.1041411411543 42.3141545014533,-71.1041287795912 42.3142114839058, -71.1041188134329 42.3142693656241,-71.1041112482575 42.3143272556118, -71.1041072845732 42.3143851580048,-71.1041057218871 42.3144430686681, -71.1041065602059 42.3145009876017,-71.1041097995362 42.3145589148055, -71.1041166403905 42.3146168544148,-71.1041258822717 42.3146748022936, -71.1041375307579 42.3147318674446,-71.1041492906949 42.3147711126569, -71.1041598612795 42.314808571739,-71.1042515013869 42.3151287620809, -71.1041173835118 42.3150739481917,-71.1040809891419 42.3151344119048, -71.1040438678912 42.3151191367447,-71.1040194562988 42.3151832057859, -71.1038734225584 42.3151140942995,-71.1038446938243 42.3151006300338, -71.1038315271889 42.315094347535,-71.1037393329282 42.315054824985, -71.1035447555574 42.3152608696313,-71.1033436658644 42.3151648370544, -71.1032580383161 42.3152269126061,-71.103223066939 42.3152517403219, -71.1031880899493 42.3152774590236)), ((-71.1043632495873 42.315113108546,-71.1043583974082 42.3151211109857, -71.1043443253471 42.3150676015829,-71.1043850704575 42.3150793250568,-71.1043632495873 42.315113108546)))');
--3d circular string SELECT ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)');
--Polyhedral Surface example SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )');
ST_GeomFromMARC21 — 输入 MARC21/XML 地理数据并返回 PostGIS 几何对象。
geometry ST_GeomFromMARC21 (
text marcxml )
;
此函数从 MARC21/XML 记录创建 PostGIS 几何图形,其中可以包含 POINT
或 POLYGON
。 如果同一 MARC21/XML 记录中有多个地理数据条目,将返回 MULTIPOINT
或 MULTIPOLYGON
。 如果记录包含混合几何类型,则将返回 GEOMETRYCOLLECTION
。 如果 MARC21/XML 记录不包含任何地理数据(数据字段:034),则返回 NULL。
支持的 LOC MARC21/XML 版本:
可用性:3.3.0,需要 libxml2 2.6+
![]() | |
在 MARC21/XML 编码的地理数据中,目前无法描述编码坐标的空间参考系,因此该函数将始终返回 |
![]() | |
返回的 |
转换包含编码为 hddd.dddddd
的单个 POINT
的 MARC21/XML 地理数据
SELECT ST_AsText( ST_GeomFromMARC21(' <record xmlns="http://www.loc.gov/MARC21/slim"> <leader >00000nz a2200000nc 4500</leader> <controlfield tag="001" >040277569</controlfield> <datafield tag="034" ind1=" " ind2=" "> <subfield code="d" >W004.500000</subfield> <subfield code="e" >W004.500000</subfield> <subfield code="f" >N054.250000</subfield> <subfield code="g" >N054.250000</subfield> </datafield> </record >')); st_astext ------------------- POINT(-4.5 54.25) (1 row)
转换包含编码为 hdddmmss
的单个 POLYGON
的 MARC21/XML 地理数据
SELECT ST_AsText( ST_GeomFromMARC21(' <record xmlns="http://www.loc.gov/MARC21/slim"> <leader >01062cem a2200241 a 4500</leader> <controlfield tag="001" > 84696781 </controlfield> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="b" >50000</subfield> <subfield code="d" >E0130600</subfield> <subfield code="e" >E0133100</subfield> <subfield code="f" >N0523900</subfield> <subfield code="g" >N0522300</subfield> </datafield> </record >')); st_astext ----------------------------------------------------------------------------------------------------------------------- POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)) (1 row)
转换包含 POLYGON
和 POINT
的 MARC21/XML 地理数据:
SELECT ST_AsText( ST_GeomFromMARC21(' <record xmlns="http://www.loc.gov/MARC21/slim"> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="b" >50000</subfield> <subfield code="d" >E0130600</subfield> <subfield code="e" >E0133100</subfield> <subfield code="f" >N0523900</subfield> <subfield code="g" >N0522300</subfield> </datafield> <datafield tag="034" ind1=" " ind2=" "> <subfield code="d" >W004.500000</subfield> <subfield code="e" >W004.500000</subfield> <subfield code="f" >N054.250000</subfield> <subfield code="g" >N054.250000</subfield> </datafield> </record >')); st_astext ------------------------------------------------------------------------------------------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)),POINT(-4.5 54.25)) (1 row)
ST_GeometryFromText — 从已知的文本表示 (WKT) 返回指定的 ST_Geometry 值。 这是 ST_GeomFromText 的别名
geometry ST_GeometryFromText(
text WKT)
;
geometry ST_GeometryFromText(
text WKT, integer srid)
;
ST_GeomFromText — 从已知的文本表示 (WKT) 返回指定的 ST_Geometry 值。
geometry ST_GeomFromText(
text WKT)
;
geometry ST_GeomFromText(
text WKT, integer srid)
;
从 OGC 已知的文本表示(WKT)构造 PostGIS ST_Geometry 对象。
![]() | |
ST_GeomFromText 函数有两种变体。 第一个不采用 SRID,并返回没有定义空间参考系统 (SRID=0) 的几何图形。 第二个将 SRID 作为第二个参数,并返回一个几何图形,该几何图形包含此 SRID 作为其元数据的一部分。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2 - 可选参数 SRID 用于规范一致性。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.40
此方法支持圆形字符串和曲线。
![]() | |
它不符合 OGC,但ST_MakePoint比 ST_GeomFromText 和 ST_PointFromText 更快。 另一个优点是,如果使用数字作为坐标值,则更容易。 另一种选择是ST_Point,它在速度方面与ST_MakePoint相似,并且符合 OGC 标准,但仅支持 2D 点。 |
![]() | |
更改:2.0.0 在 PostGIS 的早期版本中,允许 ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') 。 为了更好地符合 SQL/MM 标准,这在 PostGIS 2.0.0 中现在是非法的。 现在应该写成 ST_GeomFromText('GEOMETRYCOLLECTION EMPTY') |
SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)'); SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)',4269); SELECT ST_GeomFromText('MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))'); SELECT ST_GeomFromText('POINT(-71.064544 42.28787)'); SELECT ST_GeomFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'); SELECT ST_GeomFromText('MULTIPOLYGON(((-71.1031880899493 42.3152774590236, -71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307, -71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248, -71.102505233663 42.3144722937587,-71.10277487471 42.3141658254797, -71.103113945163 42.3142739188902,-71.10324876416 42.31402489987, -71.1033002961013 42.3140393340215,-71.1033488797549 42.3139495090772, -71.103396240451 42.3138632439557,-71.1041521907712 42.3141153348029, -71.1041411411543 42.3141545014533,-71.1041287795912 42.3142114839058, -71.1041188134329 42.3142693656241,-71.1041112482575 42.3143272556118, -71.1041072845732 42.3143851580048,-71.1041057218871 42.3144430686681, -71.1041065602059 42.3145009876017,-71.1041097995362 42.3145589148055, -71.1041166403905 42.3146168544148,-71.1041258822717 42.3146748022936, -71.1041375307579 42.3147318674446,-71.1041492906949 42.3147711126569, -71.1041598612795 42.314808571739,-71.1042515013869 42.3151287620809, -71.1041173835118 42.3150739481917,-71.1040809891419 42.3151344119048, -71.1040438678912 42.3151191367447,-71.1040194562988 42.3151832057859, -71.1038734225584 42.3151140942995,-71.1038446938243 42.3151006300338, -71.1038315271889 42.315094347535,-71.1037393329282 42.315054824985, -71.1035447555574 42.3152608696313,-71.1033436658644 42.3151648370544, -71.1032580383161 42.3152269126061,-71.103223066939 42.3152517403219, -71.1031880899493 42.3152774590236)), ((-71.1043632495873 42.315113108546,-71.1043583974082 42.3151211109857, -71.1043443253471 42.3150676015829,-71.1043850704575 42.3150793250568,-71.1043632495873 42.315113108546)))',4326); SELECT ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)');
ST_LineFromText — 使用给定的 SRID 根据 WKT 表示创建几何图形。 如果未给出 SRID,则默认为 0。
geometry ST_LineFromText(
text WKT)
;
geometry ST_LineFromText(
text WKT, integer srid)
;
使用给定的 SRID 从 WKT 创建几何图形。 如果未给出 SRID,则默认为 0。如果传入的 WKT 不是 LINESTRING,则返回 null。
![]() | |
OGC 规范 3.2.6.2 - 可选 SRID 用于规范。 |
![]() | |
如果您知道所有几何图形都是线串,则使用ST_GeomFromText会更有效。 此函数调用ST_GeomFromText并评估是否返回线串。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 7.2.8
SELECT ST_LineFromText('LINESTRING(1 2, 3 4)') AS aline, ST_LineFromText('POINT(1 2)') AS null_return; aline | null_return ------------------------------------------------ 010200000002000000000000000000F ... | t
ST_MLineFromText — 从 WKT 表示形式返回指定的 ST_MultiLineString 值。
geometry ST_MLineFromText(
text WKT, integer srid)
;
geometry ST_MLineFromText(
text WKT)
;
使用给定的 SRID 从已知的文本 (WKT) 创建几何图形。 如果未给出 SRID,则默认为 0。
OGC 规范 3.2.6.2 - 可选 SRID 用于规范
如果 WKT 不是多行字符串,则返回 NULL
![]() | |
如果您绝对确定所有 WKT 几何图形都是点,请不要使用此函数。 它比 ST_GeomFromText 慢,因为它添加了额外的验证步骤。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 9.4.4
SELECT ST_MLineFromText('MULTILINESTRING((1 2, 3 4), (4 5, 6 7))');
ST_MPointFromText — 使用给定的 SRID 从 WKT 创建几何图形。 如果未给出 SRID,则默认为 0。
geometry ST_MPointFromText(
text WKT, integer srid)
;
geometry ST_MPointFromText(
text WKT)
;
从已知文本 (WKT) 表示和给定 SRID 生成几何图形。 如果未给出 SRID,则为 0(未知)。
OGC 规范 3.2.6.2 - 可选 SRID 用于规范
如果 WKT 不是多点,则返回 NULL
![]() | |
如果您绝对确定所有 WKT 几何图形都是点,请不要使用此函数。 它比 ST_GeomFromText 慢,因为它添加了额外的验证步骤。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 9.2.4
SELECT ST_MPointFromText('MULTIPOINT((1 2),(3 4))'); SELECT ST_MPointFromText('MULTIPOINT((-70.9590 42.1180),(-70.9611 42.1223))', 4326);
ST_MPolyFromText — 使用给定的 SRID 从 WKT 制作多多边形几何体。 如果未给出 SRID,则默认为 0。
geometry ST_MPolyFromText(
text WKT, integer srid)
;
geometry ST_MPolyFromText(
text WKT)
;
从已知文本 (WKT) 表示形式和给定 SRID 生成多面。 如果未给出 SRID,则为 0(未知)。
OGC 规范 3.2.6.2 - 可选 SRID 用于规范
如果 WKT 不是多多边形,则引发错误
![]() | |
如果您绝对确定所有 WKT 几何图形都是多边形,请不要使用此函数。 它比 ST_GeomFromText 慢,因为它添加了额外的验证步骤。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 9.6.4
SELECT ST_MPolyFromText('MULTIPOLYGON(((0 0 1,20 0 1,20 20 1,0 20 1,0 0 1),(5 5 3,5 7 3,7 7 3,7 5 3,5 5 3)))'); SELECt ST_MPolyFromText('MULTIPOLYGON(((-70.916 42.1002,-70.9468 42.0946,-70.9765 42.0872,-70.9754 42.0875,-70.9749 42.0879,-70.9752 42.0881,-70.9754 42.0891,-70.9758 42.0894,-70.9759 42.0897,-70.9759 42.0899,-70.9754 42.0902,-70.9756 42.0906,-70.9753 42.0907,-70.9753 42.0917,-70.9757 42.0924,-70.9755 42.0928,-70.9755 42.0942,-70.9751 42.0948,-70.9755 42.0953,-70.9751 42.0958,-70.9751 42.0962,-70.9759 42.0983,-70.9767 42.0987,-70.9768 42.0991,-70.9771 42.0997,-70.9771 42.1003,-70.9768 42.1005,-70.977 42.1011,-70.9766 42.1019,-70.9768 42.1026,-70.9769 42.1033,-70.9775 42.1042,-70.9773 42.1043,-70.9776 42.1043,-70.9778 42.1048,-70.9773 42.1058,-70.9774 42.1061,-70.9779 42.1065,-70.9782 42.1078,-70.9788 42.1085,-70.9798 42.1087,-70.9806 42.109,-70.9807 42.1093,-70.9806 42.1099,-70.9809 42.1109,-70.9808 42.1112,-70.9798 42.1116,-70.9792 42.1127,-70.979 42.1129,-70.9787 42.1134,-70.979 42.1139,-70.9791 42.1141,-70.9987 42.1116,-71.0022 42.1273, -70.9408 42.1513,-70.9315 42.1165,-70.916 42.1002)))',4326);
ST_PointFromText — 使用给定的 SRID 从 WKT 创建点几何图形。 如果未给出 SRID,则默认为未知。
geometry ST_PointFromText(
text WKT)
;
geometry ST_PointFromText(
text WKT, integer srid)
;
从 OGC 已知的文本表示构造 PostGIS ST_Geometry 点对象。 如果未给出 SRID,则默认为未知(当前为 0)。 如果几何图形不是 WKT 点表示,则返回 null。 如果 WKT 完全无效,则抛出错误。
![]() | |
ST_PointFromText 函数有 2 个形式,第一个不采用 SRID,并返回没有定义空间参考系统的几何图形。 第二个将空间参考 id 作为第二个参数,并返回一个 ST_Geometry,其中包含此 srid 作为其元数据的一部分。 srid 必须在spatial_ref_sys 表中定义。 |
![]() | |
如果您绝对确定所有 WKT 几何图形都是点,请不要使用此函数。 它比 ST_GeomFromText 慢,因为它添加了额外的验证步骤。 如果您从经纬度坐标构建点并且更关心性能和准确性而不是 OGC 合规性,请使用 ST_MakePoint或 OGC 合规别名ST_Point。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2 - 可选参数 SRID 用于规范一致性。
该方法实现了SQL/MM规范。 SQL-MM 3: 6.1.8
SELECT ST_PointFromText('POINT(-71.064544 42.28787)'); SELECT ST_PointFromText('POINT(-71.064544 42.28787)', 4326);
ST_PolygonFromText — 使用给定的 SRID 从 WKT 创建几何图形。 如果未给出 SRID,则默认为 0。
geometry ST_PolygonFromText(
text WKT)
;
geometry ST_PolygonFromText(
text WKT, integer srid)
;
使用给定的 SRID 从 WKT 创建几何图形。 如果未给出 SRID,则默认为 0。如果 WKT 不是多边形,则返回 null。
OGC 规范 3.2.6.2 - 可选 SRID 用于规范
![]() | |
如果您绝对确定所有 WKT 几何图形都是多边形,请不要使用此函数。 它比 ST_GeomFromText 慢,因为它添加了额外的验证步骤。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 8.3.6
SELECT ST_PolygonFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'); st_polygonfromtext ------------------ 010300000001000000050000006... SELECT ST_PolygonFromText('POINT(1 2)') IS NULL as point_is_notpoly; point_is_not_poly ---------- t
ST_WKTToSQL — 从已知的文本表示 (WKT) 返回指定的 ST_Geometry 值。 这是 ST_GeomFromText 的别名
geometry ST_WKTToSQL(
text WKT)
;
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.34
LINESTRING
ST_GeogFromWKB — 从已知的二进制几何表示 (WKB) 或扩展的已知的二进制 (EWKB) 创建地理实例。
geography ST_GeogFromWKB(
bytea wkb)
;
ST_GeogFromWKB
函数采用已知的几何二进制表示 (WKB) 或 PostGIS 扩展 WKB,并创建适当地理类型的实例。 该函数起到了SQL中几何工厂的作用。
如果未指定 SRID,则默认为 4326(WGS 84 经纬度)。
此方法支持圆形字符串和曲线。
--Although bytea rep contains single \, these need to be escaped when inserting into a table SELECT ST_AsText( ST_GeogFromWKB(E'\\001\\002\\000\\000\\000\\002\\000\\000\\000\\037\\205\\353Q\\270~\\\\\\300\\323Mb\\020X\\231C@\\020X9\\264\\310~\\\\\\300)\\\\\\217\\302\\365\\230C@') ); st_astext ------------------------------------------------------ LINESTRING(-113.98 39.198,-113.981 39.195) (1 row)
ST_GeomFromEWKB — 从扩展已知的二进制表示 (EWKB) 返回指定的 ST_Geometry 值。
geometry ST_GeomFromEWKB(
bytea EWKB)
;
从 OGC 扩展已知的二进制 (EWKT) 表示构造 PostGIS ST_Geometry 对象。
![]() | |
EWKB 格式不是 OGC 标准,而是包含空间参考系统 (SRID) 标识符的 PostGIS 特定格式 |
增强功能:2.0.0支持多面体曲面和 TIN 。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
NAD83 经度纬度 (4269) 中 LINESTRING (-71.160281 42.258729、-71.160837 42.259113、-71.161144 42.25932) 的二进制表示形式。
![]() | |
注意:字节数组由 \ 分隔并具有 ',但如果standard_conforming_strings被截断,则它们使用 \ 和 '' 进行转义。 它不完全对应于 AsEWKB 表达式。 |
SELECT ST_GeomFromEWKB(E'\\001\\002\\000\\000 \\255\\020\\000\\000\\003\\000\\000\\000\\344J= \\013B\\312Q\\300n\\303(\\010\\036!E@''\\277E''K \\312Q\\300\\366{b\\235*!E@\\225|\\354.P\\312Q \\300p\\231\\323e1!E@');
![]() | |
在 PostgreSQL 9.1 中,standard_conforming_strings 默认设置为 on,而在过去的版本中它被设置为 off。 您可以根据单个查询的需要或在数据库或服务器级别更改默认值。 以下是使用 standard_conforming_strings = on 时的操作方法。 在这种情况下,我们使用标准 ansi 转义 ',但斜杠不会转义 |
set standard_conforming_strings = on; SELECT ST_GeomFromEWKB('\001\002\000\000 \255\020\000\000\003\000\000\000\344J=\012\013B \312Q\300n\303(\010\036!E@''\277E''K\012\312Q\300\366{b\235*!E@\225|\354.P\312Q\012\300p\231\323e1')
ST_GeomFromWKB — 从已知的二进制几何表示 (WKB) 和可选的 SRID 创建几何实例。
geometry ST_GeomFromWKB(
bytea geom)
;
geometry ST_GeomFromWKB(
bytea geom, integer srid)
;
ST_GeomFromWKB
函数采用已知的几何图形二进制表示形式和空间参考系统 ID (SRID
),并创建相应几何图形类型的实例。 该函数起到了SQL中几何工厂的作用。 这是 ST_WKBToSQL 的替代名称。
如果未指定 SRID,则默认为 0(未知)。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.7.2 - 可选参数 SRID 用于符合规范
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.41
此方法支持圆形字符串和曲线。
--Although bytea rep contains single \, these need to be escaped when inserting into a table -- unless standard_conforming_strings is set to on. SELECT ST_AsEWKT( ST_GeomFromWKB(E'\\001\\002\\000\\000\\000\\002\\000\\000\\000\\037\\205\\353Q\\270~\\\\\\300\\323Mb\\020X\\231C@\\020X9\\264\\310~\\\\\\300)\\\\\\217\\302\\365\\230C@',4326) ); st_asewkt ------------------------------------------------------ SRID=4326;LINESTRING(-113.98 39.198,-113.981 39.195) (1 row) SELECT ST_AsText( ST_GeomFromWKB( ST_AsEWKB('POINT(2 5)'::geometry) ) ); st_astext ------------ POINT(2 5) (1 row)
ST_LineFromWKB — 使用给定的 SRID 从 WKB 制作 LINESTRING
geometry ST_LineFromWKB(
bytea WKB)
;
geometry ST_LineFromWKB(
bytea WKB, integer srid)
;
ST_LineFromWKB
函数采用已知的几何二进制表示形式和空间参考系统 ID (SRID
),并创建适当几何类型的实例 - 在本例中为 LINESTRING
几何。 该函数起到了SQL中几何工厂的作用。
如果未指定 SRID,则默认为 0。如果输入字节
不表示 LINESTRING
,则返回 NULL
。
![]() | |
OGC 规范 3.2.6.2 - 可选 SRID 用于规范。 |
![]() | |
如果您知道所有几何图形都是 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 7.2.9
SELECT ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('LINESTRING(1 2, 3 4)'))) AS aline, ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('POINT(1 2)'))) IS NULL AS null_return; aline | null_return ------------------------------------------------ 010200000002000000000000000000F ... | t
ST_LinestringFromWKB — 使用给定的 SRID 从 WKB 创建几何图形。
geometry ST_LinestringFromWKB(
bytea WKB)
;
geometry ST_LinestringFromWKB(
bytea WKB, integer srid)
;
ST_LineFromWKB
函数采用已知的几何二进制表示形式和空间参考系统 ID (SRID
),并创建适当几何类型的实例 - 在本例中为 LINESTRING
几何。 该函数起到了SQL中几何工厂的作用。
如果未指定 SRID,则默认为 0。如果输入字节
不表示 LINESTRING
,则返回 NULL
。这是 ST_LineFromWKB 的别名。
![]() | |
OGC 规范 3.2.6.2 - 可选 SRID 用于规范。 |
![]() | |
如果您知道所有几何图形都是 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.6.2
该方法实现了SQL/MM规范。 SQL-MM 3: 7.2.9
SELECT ST_LineStringFromWKB( ST_AsBinary(ST_GeomFromText('LINESTRING(1 2, 3 4)')) ) AS aline, ST_LinestringFromWKB( ST_AsBinary(ST_GeomFromText('POINT(1 2)')) ) IS NULL AS null_return; aline | null_return ------------------------------------------------ 010200000002000000000000000000F ... | t
ST_PointFromWKB — 使用给定的 SRID 从 WKB 创建几何图形
geometry ST_GeomFromWKB(
bytea geom)
;
geometry ST_GeomFromWKB(
bytea geom, integer srid)
;
ST_PointFromWKB
函数采用已知的几何二进制表示形式和空间参考系统ID(SRID
),并创建适当几何类型的实例-在本例中为POINT
几何。该函数起到了SQL中几何工厂的作用。
如果未指定 SRID,则默认为 0。如果输入字节
不表示 POINT
几何图形,则返回 NULL
。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.7.2
该方法实现了SQL/MM规范。 SQL-MM 3: 6.1.9
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_AsText( ST_PointFromWKB( ST_AsEWKB('POINT(2 5)'::geometry) ) ); st_astext ------------ POINT(2 5) (1 row) SELECT ST_AsText( ST_PointFromWKB( ST_AsEWKB('LINESTRING(2 5, 2 6)'::geometry) ) ); st_astext ----------- (1 row)
ST_WKBToSQL — 从已知的二进制表示 (WKB) 返回指定的 ST_Geometry 值。 这是 ST_GeomFromWKB 的别名,不带 srid
geometry ST_WKBToSQL(
bytea WKB)
;
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.36
ST_Box2dFromGeoHash — 从 GeoHash 字符串返回 BOX2D。
box2d ST_Box2dFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
从 GeoHash 字符串返回 BOX2D。
如果未指定precision
,ST_Box2dFromGeoHash 将返回基于输入 GeoHash 字符串的完整精度的 BOX2D。
如果指定precision
,ST_Box2dFromGeoHash 将使用 GeoHash 中的许多字符来创建 BOX2D。 较低的精度值会导致较大的 BOX2D,较大的值会提高精度。
可用性:2.1.0
SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0'); st_geomfromgeohash -------------------------------------------------- BOX(-115.172816 36.114646,-115.172816 36.114646) SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 0); st_box2dfromgeohash ---------------------- BOX(-180 -90,180 90) SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10); st_box2dfromgeohash --------------------------------------------------------------------------- BOX(-115.17282128334 36.1146408319473,-115.172810554504 36.1146461963654)
ST_GeomFromGeoHash — 从 GeoHash 字符串返回几何图形。
geometry ST_GeomFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
从 GeoHash 字符串返回几何图形。 几何图形将是表示 GeoHash 边界的多边形。
如果未指定precision
,ST_GeomFromGeoHash 返回基于输入 GeoHash 字符串的完整精度的多边形。
如果指定precision
,ST_GeomFromGeoHash 将使用 GeoHash 中的那么多字符来创建多边形。
可用性:2.1.0
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0')); st_astext -------------------------------------------------------------------------------------------------------------------------- POLYGON((-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646)) SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4)); st_astext ------------------------------------------------------------------------------------------------------------------------------ POLYGON((-115.3125 36.03515625,-115.3125 36.2109375,-114.9609375 36.2109375,-114.9609375 36.03515625,-115.3125 36.03515625)) SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10)); st_astext ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- POLYGON((-115.17282128334 36.1146408319473,-115.17282128334 36.1146461963654,-115.172810554504 36.1146461963654,-115.172810554504 36.1146408319473,-115.17282128334 36.1146408319473))
ST_GeomFromGML — 将几何图形的 GML 表示形式作为输入并输出 PostGIS 几何对象
geometry ST_GeomFromGML(
text geomgml)
;
geometry ST_GeomFromGML(
text geomgml, integer srid)
;
根据 OGC GML 制图表达生成 PostGIS ST_Geometry对象。
ST_GeomFromGML仅适用于 GML 的几何部分。 尝试将其用于整个 GML 文档时会引发错误。
支持的 OGC GML 版本包括:
GML 3.2.1 命名空间
GML 3.1.1 简单功能配置文件 SF-2(向后兼容 GML 3.1.0 和 3.0.0)
GML 2.1.2
有关 OGC GML 标准,请参阅http://www.opengeospatial.org/standards/gml:
可用性:需要 1.5 libxml2 1.6+
增强功能:2.0.0支持多面体曲面和 TIN 。
增强:2.0.0 引入了多面体曲面支持和 TIN 支持。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
GML 允许混合维度(例如,同一 MultiGeometry 内的 2D 和 3D)。 由于 PostGIS 几何图形不这样做,如果一旦发现缺失的 Z 维度,ST_GeomFromGML 会将整个几何图形转换为 2D。
GML 支持同一 MultiGeometry 内的混合 SRS。 由于 PostGIS 几何图形不这样做,因此在本例中 ST_GeomFromGML 会将所有子几何图形重新投影到 SRS 根节点。 如果 GML 根节点没有可用的 srsName 属性,则该函数会抛出错误。
ST_GeomFromGML 函数对于显式 GML 命名空间并不迂腐。 您可以避免在常见用法中明确提及它。 但如果您想在 GML 中使用 XLink 功能,则需要它。
![]() | |
ST_GeomFromGML 函数不支持 SQL/MM 曲线几何形状。 |
SELECT ST_GeomFromGML($$ <gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4269"> <gml:coordinates> -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932 </gml:coordinates> </gml:LineString> $$);
SELECT ST_GeomFromGML($$ <gml:LineString xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" srsName="urn:ogc:def:crs:EPSG::4269"> <gml:pointProperty> <gml:Point gml:id="p1" ><gml:pos >42.258729 -71.16028</gml:pos ></gml:Point> </gml:pointProperty> <gml:pos >42.259112 -71.160837</gml:pos> <gml:pointProperty> <gml:Point xlink:type="simple" xlink:href="#p1"/> </gml:pointProperty> </gml:LineString> $$);
SELECT ST_AsEWKT(ST_GeomFromGML(' <gml:PolyhedralSurface xmlns:gml="http://www.opengis.net/gml"> <gml:polygonPatches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> </gml:polygonPatches> </gml:PolyhedralSurface >')); -- result -- POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))
ST_GeomFromGeoJSON — 将几何图形的 geojson 表示形式作为输入并输出 PostGIS 几何对象
geometry ST_GeomFromGeoJSON(
text geomjson)
;
geometry ST_GeomFromGeoJSON(
json geomjson)
;
geometry ST_GeomFromGeoJSON(
jsonb geomjson)
;
从 GeoJSON 制图表达生成 PostGIS 几何对象。
ST_GeomFromGeoJSON仅适用于 JSON 的几何部分。 如果尝试使用整个 JSON 文档,则会抛出错误。
增强:3.0.0如果未指定其他 SRID解析几何,则默认 SRID 为 4326。
增强:2.5.0 现在可以接受 json 和 jsonb 作为输入。
可用性:2.0.0需要 JSON-C 0.9 或更高版本
![]() | |
如果您没有启用 JSON-C,支持您将收到错误通知而不是看到输出。 要启用 JSON-C,请运行 configure --with-jsondir=/path/to/json-c。 有关详细信息,请参阅Section 2.2.3, “构建配置”。 |
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt; wkt ------ POINT(-48.23456 20.12345)
-- a 3D linestring SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[1,2,3],[4,5,6],[7,8,9]]}')) As wkt; wkt ------------------- LINESTRING(1 2,4 5,7 8)
ST_GeomFromKML — 将几何图形的 KML 表示形式作为输入并输出 PostGIS 几何对象
geometry ST_GeomFromKML(
text geomkml)
;
从 OGC KML 表示构造 PostGIS ST_Geometry 对象。
ST_GeomFromKML 仅适用于 KML 几何片段。 如果您尝试在整个 KML 文档上使用它,它会引发错误。
OGC KML 的相应版本包括:
KML 2.2.0 命名空间
有关 OGC KML 标准,请参见http://www.opengeospatial.org/standards/kml:
可用性:1.5,需要 libxml2 2.6+
该函数支持 3d 并且不会丢失 z-index。
![]() | |
ST_GeomFromKML函数不支持 SQL/MM 曲线几何图形。 |
SELECT ST_GeomFromKML($$ <LineString> <coordinates >-71.1663,42.2614 -71.1667,42.2616</coordinates> </LineString> $$);
ST_GeomFromTWKB — 从 TWKB(“微小的已知的二进制”)几何表示创建几何实例。
geometry ST_GeomFromTWKB(
bytea twkb)
;
ST_GeomFromTWKB
采用 TWKB(“微小的已知二进制”)几何表示形式,并创建相应几何类型的实例。
SELECT ST_AsText(ST_GeomFromTWKB(ST_AsTWKB('LINESTRING(126 34, 127 35)'::geometry))); st_astext ----------------------------- LINESTRING(126 34, 127 35) (1 row) SELECT ST_AsEWKT( ST_GeomFromTWKB(E'\\x620002f7f40dbce4040105') ); st_asewkt ------------------------------------------------------ LINESTRING(-113.98 39.198,-113.981 39.195) (1 row)
ST_GMLToSQL — 从 GML 表示返回指定的 ST_Geometry 值。 这是 ST_GeomFromGML 的别名
geometry ST_GMLToSQL(
text geomgml)
;
geometry ST_GMLToSQL(
text geomgml, integer srid)
;
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.50 (曲线支持除外).
可用性:需要 1.5 libxml2 1.6+
增强功能:2.0.0支持多面体曲面和 TIN 。
增强:2.0.0 引入了多面体曲面支持和 TIN 支持。
ST_LineFromEncodedPolyline — 从编码折线创建 LineString。
geometry ST_LineFromEncodedPolyline(
text polyline, integer precision=5)
;
从编码多段线字符串创建 LineString。
可选precision
指定编码折线中将保留多少个小数位。 编码和解码时的值应该相同,否则坐标将不正确。
参照 http://developers.google.com/maps/documentation/utilities/polylinealgorithm
可用性:2.2.0
-- Create a line string from a polyline SELECT ST_AsEWKT(ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@')); -- result -- SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252) -- Select different precision that was used for polyline encoding SELECT ST_AsEWKT(ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@',6)); -- result -- SRID=4326;LINESTRING(-12.02 3.85,-12.095 4.07,-12.6453 4.3252)
ST_PointFromGeoHash — 从 GeoHash 字符串返回一个点。
point ST_PointFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
从 GeoHash 字符串返回一个点。 该点代表 GeoHash 的中心点。
如果未指定precision
,ST_PointFromGeoHash 返回基于输入 GeoHash 字符串的完整精度的点。
如果指定precision
,ST_PointFromGeoHash 将使用 GeoHash 中的多个字符来创建点。
可用性:2.1.0
SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0')); st_astext ------------------------------ POINT(-115.172816 36.114646) SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4)); st_astext ----------------------------------- POINT(-115.13671875 36.123046875) SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10)); st_astext ------------------------------------------- POINT(-115.172815918922 36.1146435141563)
ST_FromFlatGeobufToTable — 根据 FlatGeobuf 数据的结构创建一个表。
void ST_FromFlatGeobufToTable(
text schemaname, text tablename, bytea FlatGeobuf input data)
;
ST_FromFlatGeobuf — 读取FlatGeobuf数据。
setof anyelement ST_FromFlatGeobuf(
anyelement Table reference, bytea FlatGeobuf input data)
;
读取 FlatGeobuf 数据 (http://flatgeobuf.org)。 注意:PostgreSQL bytea 类型不能超过 1GB。
tabletype
对表类型的引用。
data
输入 FlatGeobuf数据。
可用性:3.2.0
这些函数将几何对象转换为各种文本或二进制格式。
ST_AsEWKT — 使用 SRID 元数据返回几何图形的已知文本 (WKT) 表示形式。
text ST_AsEWKT(
geometry g1)
;
text ST_AsEWKT(
geometry g1, integer maxdecimaldigits=15)
;
text ST_AsEWKT(
geography g1)
;
text ST_AsEWKT(
geography g1, integer maxdecimaldigits=15)
;
返回以 SRID 为前缀的几何图形的已知的文本表示形式(WKT)。 可选的 maxdecimaldigits
参数可用于减少输出中使用的浮点后的最大十进制位数(默认为 15)。
要执行 EWKT 表示形式到 PostGIS 几何图形的逆转换,请使用ST_GeomFromEWKT。
![]() | |
使用 |
![]() | |
WKT 规范不包括 SRID。 要获取 OGC WKT 格式,请使用 ST_AsText。 |
![]() | |
WKT 格式不保持精度,因此为了防止浮动截断,请使用ST_AsBinary 或 ST_AsEWKB 格式进行传输。 |
增强:3.1.0 支持可选精度参数。
增强:2.0.0 引入了对地理、多面体曲面、三角形和 TIN 的支持。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_AsEWKT('0103000020E61000000100000005000000000000 000000000000000000000000000000000000000000000000000000 F03F000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000'::geometry); st_asewkt -------------------------------- SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0)) (1 row) SELECT ST_AsEWKT('0108000080030000000000000060E30A4100000000785C0241000000000000F03F0000000018 E20A4100000000485F024100000000000000400000000018 E20A4100000000305C02410000000000000840') --st_asewkt--- CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)
ST_AsText — 返回不带 SRID 元数据的几何/地理的已知文本 (WKT) 表示形式。
text ST_AsText(
geometry g1)
;
text ST_AsText(
geometry g1, integer maxdecimaldigits = 15)
;
text ST_AsText(
geography g1)
;
text ST_AsText(
geography g1, integer maxdecimaldigits = 15)
;
返回几何/地理的 OGC 已知文本 (WKT) 表示形式。 可选的 maxdecimaldigits
参数可用于限制输出坐标中小数点后的位数(默认为 15)。
要执行 WKT 表示形式到 PostGIS 几何图形的逆转换,请使用ST_GeomFromText。
![]() | |
标准 OGC WKT 表示不包括 SRID。 要将 SRID 作为输出表示的一部分,请使用非标准 PostGIS 函数ST_AsEWKT |
![]() | |
WKT 中数字的文本表示可能无法保持完整的浮点精度。 为了确保数据存储或传输的完全准确性,最好使用已知的二进制 (WKB) 格式(请参阅 ST_AsBinary 和 |
![]() | |
使用 |
可用性:1.5 - 引入了地理支持。
增强:2.5 - 引入了可选的精度参数。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.25
此方法支持圆形字符串和曲线。
SELECT ST_AsText('01030000000100000005000000000000000000 000000000000000000000000000000000000000000000000 F03F000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000'); st_astext -------------------------------- POLYGON((0 0,0 1,1 1,1 0,0 0))
默认情况下为全精度输出。
SELECT ST_AsText('POINT(111.1111111 1.1111111)')); st_astext ------------------------------ POINT(111.1111111 1.1111111)
maxdecimaldigits
参数用于限制输出精度。
SELECT ST_AsText('POINT(111.1111111 1.1111111)'), 2); st_astext -------------------- POINT(111.11 1.11)
ST_AsBinary — 返回不带 SRID 元数据的几何/地理的 OGC/ISO 已知的二进制 (WKB) 表示形式。
bytea ST_AsBinary(
geometry g1)
;
bytea ST_AsBinary(
geometry g1, text NDR_or_XDR)
;
bytea ST_AsBinary(
geography g1)
;
bytea ST_AsBinary(
geography g1, text NDR_or_XDR)
;
返回几何图形的 OGC/ISO已知二进制 (WKB) 表示形式。 第一种形式默认为服务器计算机的字节序。 第二种形式采用指定小端序 (“NDR”) 或大端序 (“XDR”) 的字符串。
WKB 格式对于从数据库读取几何数据并保持完整的数值精度非常有用。 这避免了 WKT 等文本格式可能发生的精确舍入。
要执行 WKB 到 PostGIS 几何图形的逆转换,请使用ST_GeomFromWKB。
![]() | |
OGC/ISO WKB 格式不包括 SRID。 要获取包含 SRID 的 EWKB 格式,请使用ST_AsEWKB |
![]() | |
PostgreSQL 9.0 中的默认行为已更改为以十六进制编码输出 bytea。 如果您的 GUI 工具需要旧行为,请在数据库中设置 SET bytea_output='escape'。 |
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
增强:2.0.0支持更高坐标维度。
增强:2.0.0支持地理中的字节序。
可用性:1.5.0支持地理位置。
更改:2.0.0 此函数的输入不能是未知的——必须是几何图形。 ST_AsBinary('POINT(1 2)')
等结构不再有效,您将收到 n st_asbinary(unknown) is not unique error
。 类似的代码需要更改为 ST_AsBinary('POINT(1 2)'::geometry);
。 如果不可能,请安装legacy.sql
。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.1
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.37
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asbinary -------------------------------- \x01030000000100000005000000000000000000000000000000000000000000000000000000000000 000000f03f000000000000f03f000000000000f03f000000000000f03f0000000000000000000000 00000000000000000000000000
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR'); st_asbinary -------------------------------- \x000000000300000001000000050000000000000000000000000000000000000000000000003ff000 00000000003ff00000000000003ff00000000000003ff00000000000000000000000000000000000 00000000000000000000000000
ST_AsEWKB — 返回带有 SRID 元数据的几何图形的扩展已知的二进制 (EWKB) 表示形式。
bytea ST_AsEWKB(
geometry g1)
;
bytea ST_AsEWKB(
geometry g1, text NDR_or_XDR)
;
返回具有 SRID 元数据的几何图形的扩展已知二进制 (EWKB) 表示形式。 第一种形式默认为服务器计算机的字节序。 第二种形式采用指定小端序 (“NDR”) 或大端序 (“XDR”) 的字符串。
WKB 格式对于从数据库读取几何数据并保持完整的数值精度非常有用。 这避免了 WKT 等文本格式可能发生的精确舍入。
要执行 EWKB 到 PostGIS 几何图形的逆转换,请使用 ST_GeomFromEWKB。
![]() | |
要获取 OGC/ISO WKB 格式,请使用 ST_AsBinary。 请注意,OGC/ISO WKB 格式不包括 SRID。 |
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asewkb -------------------------------- \x0103000020e610000001000000050000000000000000000000000000000000000000000000000000 00000000000000f03f000000000000f03f000000000000f03f000000000000f03f00000000000000 0000000000000000000000000000000000
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR'); st_asewkb -------------------------------- \x0020000003000010e600000001000000050000000000000000000000000000000000000000000000 003ff00000000000003ff00000000000003ff00000000000003ff000000000000000000000000000 0000000000000000000000000000000000
ST_AsHEXEWKB — 使用小端 (NDR) 或大端 (XDR) 编码返回 HEXEWKB 格式(作为文本)的几何图形。
text ST_AsHEXEWKB(
geometry g1, text NDRorXDR)
;
text ST_AsHEXEWKB(
geometry g1)
;
使用小端 (NDR) 或大端 (XDR) 编码返回 HEXEWKB 格式(作为文本)的几何图形。 如果未指定编码,则使用 NDR。
![]() | |
可用性:1.2.2 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_AsHEXEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); which gives same answer as SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)::text; st_ashexewkb -------- 0103000020E6100000010000000500 00000000000000000000000000000000 00000000000000000000000000000000F03F 000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000
ST_AsEncodedPolyline — 从 LineString 几何体返回编码折线。
text ST_AsEncodedPolyline(
geometry geom, integer precision=5)
;
以编码折线形式返回几何图形。 此格式由精度为 5 的 Google 地图和精度为 5 和 6 的开源路由机使用。
可选precision
指定编码折线中将保留多少个小数位。 编码和解码时的值应该相同,否则坐标将不正确。
可用性:2.2.0
基本
SELECT ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); --result-- |_p~iF~ps|U_ulLnnqC_mqNvxq`@
与地理线串和地理分段结合使用,并放在谷歌地图上
-- the SQL for Boston to San Francisco, segments every 100 KM SELECT ST_AsEncodedPolyline( ST_Segmentize( ST_GeogFromText('LINESTRING(-71.0519 42.4935,-122.4483 37.64)'), 100000)::geometry) As encodedFlightPath;
javascript 看起来像这样,其中 $ 变量替换为查询结果
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry" ></script> <script type="text/javascript"> flightPath = new google.maps.Polyline({ path: google.maps.geometry.encoding.decodePath("$encodedFlightPath"), map: map, strokeColor: '#0000CC', strokeOpacity: 1.0, strokeWeight: 4 }); </script>
ST_AsFlatGeobuf — 返回一组行的 FlatGeobuf 表示形式。
bytea ST_AsFlatGeobuf(
anyelement set row)
;
bytea ST_AsFlatGeobuf(
anyelement row, bool index)
;
bytea ST_AsFlatGeobuf(
anyelement row, bool index, text geom_name)
;
返回与 FeatureCollection 对应的一组行的 FlatGeobuf 表示形式 (http://flatgeobuf.org)。 注意:PostgreSQL bytea 不能超过 1GB。
row
至少包含一个几何列的行数据。
index
切换空间索引生成。 默认值为 FALSE。
geom_name
行数据中几何列的列名。 如果为 NULL,则它是找到的第一个几何列。
可用性:3.2.0
ST_AsGeobuf — 返回一组行的 Geobuf 表示。
bytea ST_AsGeobuf(
anyelement set row)
;
bytea ST_AsGeobuf(
anyelement row, text geom_name)
;
返回与FeatureCollection对应的一组行的Geobuf表示(https://github.com/mapbox/geobuf)。 分析每个输入几何形状以确定最佳存储的最大精度。 请注意,当前形式的 Geobuf 无法进行流式传输,因此完整的输出将在内存中组装。
row
至少包含一个几何列的行数据。
geom_name
行数据中几何列的列名。 如果为 NULL,则它是找到的第一个几何列。
可用性:2.4.0
SELECT encode(ST_AsGeobuf(q, 'geom'), 'base64') FROM (SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))') AS geom) AS q; st_asgeobuf ---------------------------------- GAAiEAoOCgwIBBoIAAAAAgIAAAE=
ST_AsGeoJSON — 以GeoJSON格式返回一个几何体或要素。
text ST_AsGeoJSON(
record feature, text geom_column="", integer maxdecimaldigits=9, boolean pretty_bool=false, text id_column='')
;
text ST_AsGeoJSON(
geometry geom, integer maxdecimaldigits=9, integer options=8)
;
text ST_AsGeoJSON(
geography geog, integer maxdecimaldigits=9, integer options=0)
;
返回一个几何体作为GeoJSON中的 “geometry” 对象,或者返回一行作为GeoJSON中的 “feature”对象。
生成的GeoJSON几何体和要素遵循 GeoJSON规范RFC 7946,但当解析的几何体使用WGS84经度和纬度之外的CRS(如 EPSG:4326,urn:ogc:def:crs:OGC::CRS84)进行引用时,GeoJSON几何对象将默认附加一个短的CRS SRID标识符。支持2D和3D几何。GeoJSON仅支持SFS 1.1几何类型(例如,不支持曲线)。
geom_column
参数用于区分多个几何列。如果省略该参数,将确定记录中的第一个几何列。相反,传递该参数将节省列类型查找。
maxdecimaldigits
参数可用于减少输出中使用的最大小数位数(默认为 9)。 如果您使用 EPSG:4326 并且输出几何图形仅用于显示,则 maxdecimaldigits
=6 对于许多地图来说可能是一个不错的选择。
![]() | |
使用 |
options
参数可用于在 GeoJSON 输出中添加 BBOX 或 CRS:
0:表示没有选项
1:GeoJSON BBOX
2:GeoJSON 短 CRS(例如 EPSG:4326)
4:GeoJSON 长 CRS(例如 urn:ogc:def:crs:EPSG::4326)
8:GeoJSON 短 CRS,如果不是 EPSG:4326(默认)
id_column
参数用于设置返回的 GeoJSON 要素的 "id" 成员。根据 GeoJSON RFC,应该在要素具有常用标识符(例如主键)时使用此参数。当未指定时,生成的要素将不会有 "id" 成员,除了几何信息之外的任何列,包括任何可能的键,都将最终位于要素的 "properties" 成员内。
GeoJSON 规范规定多边形使用右手定则定向,并且某些客户端需要此方向。 这可以通过使用ST_ForcePolygonCCW 来确保。 该规范还要求几何图形位于 WGS84 坐标系 (SRID = 4326) 中。 如果需要,可以使用 ST_Transform将几何图形投影到 WGS84 中:ST_Transform( geom, 4326 )
。
GeoJSON 可以在 geojson.io 和 geojsonlint.com 上在线测试和查看。 它受到网络地图框架的广泛支持:
可用性:1.3.4
可用性:1.5.0支持地理位置。
更改:2.0.0 支持默认参数和命名参数。
更改:3.0.0 支持记录作为输入
更改:3.0.0 输出 SRID(如果不是 EPSG:4326)。
更改:3.5.0 允许指定包含要素 ID 的列
该函数支持 3d 并且不会丢失 z-index。
生成特征集合:
SELECT json_build_object( 'type', 'FeatureCollection', 'features', json_agg(ST_AsGeoJSON(t.*, id_column = > 'id')::json) ) FROM ( VALUES (1, 'one', 'POINT(1 1)'::geometry), (2, 'two', 'POINT(2 2)'), (3, 'three', 'POINT(3 3)') ) as t(id, name, geom);
{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[2,2]}, "id": 2, "properties": {"name": "two"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[3,3]}, "id": 3, "properties": {"name": "three"}}]}
生成一个特征:
SELECT ST_AsGeoJSON(t.*, id_column = > 'id') FROM (VALUES (1, 'one', 'POINT(1 1)'::geometry)) AS t(id, name, geom);
st_asgeojson ----------------------------------------------------------------------------------------------------------------- {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}
不要忘记将数据转换为 WGS84 经度、纬度以符合 GeoJSON 规范:
SELECT ST_AsGeoJSON(ST_Transform(geom,4326)) from fe_edges limit 1;
st_asgeojson ----------------------------------------------------------------------------------------------------------- {"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000], [-89.734955999999997,31.492237999999997]]]}
支持 3D 几何形状:
SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');
{"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}
ST_AsGML — 将几何图形作为 GML 版本 2 或 3 元素返回。
text ST_AsGML(
geometry geom, integer maxdecimaldigits=15, integer options=0)
;
text ST_AsGML(
geography geog, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null)
;
text ST_AsGML(
integer version, geometry geom, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null)
;
text ST_AsGML(
integer version, geography geog, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null)
;
将几何图形作为地理标记语言 (GML) 元素返回。 版本参数(如果指定)可以是 2 或 3。如果未指定版本参数,则默认值为 2。 maxdecimaldigits
参数可用于减少输出中使用的最大小数位数(默认为 15) )。
![]() | |
使用 |
GML 2指2.1.2版本,GML 3指3.1.1版本
“选项”参数是一个位字段。 它可用于在 GML 输出中定义 CRS 输出类型,并将数据声明为纬度/经度:
0:GML 短 CRS(例如 EPSG:4326),默认值
1:GML 长 CRS(例如 urn:ogc:def:crs:EPSG::4326)
2:仅对于 GML 3,从输出中删除 srsDimension 属性。
4:仅对于 GML 3,对线使用 <LineString> 而不是 <Curve> 标记。
16:声明数据为纬度/经度(例如 srid=4326)。 默认情况下假设数据是平面的。 此选项仅适用于与轴顺序相关的 GML 3.1.1 输出。 因此,如果您设置它,它将交换坐标,因此顺序是 lat lon 而不是数据库 lon lat。
32:输出几何体的边框(最小外接矩形)。
“命名空间前缀”参数可用于指定自定义命名空间前缀或无前缀(如果为空)。 如果使用 null 或省略 'gml' 前缀
可用性:1.3.2
可用性:1.5.0支持地理位置。
增强: 2.0.0 引入了前缀支持。 引入了 GML3 的选项 4,以允许使用 LineString 而不是线条的 Curve 标记。 引入了对多面体曲面和 TINS 的 GML3 支持。 引入选项 32 来输出该框。
更改:2.0.0 使用默认命名参数
增强:针对 GML 3 引入了 2.1.0 id 支持。
![]() | |
仅 ST_AsGML 版本 3 +支持多面体曲面和 TINS。 |
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 17.2
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_AsGML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asgml -------- <gml:Polygon srsName="EPSG:4326" ><gml:outerBoundaryIs ><gml:LinearRing ><gml:coordinates >0,0 0,1 1,1 1,0 0,0</gml:coordinates ></gml:LinearRing ></gml:outerBoundaryIs ></gml:Polygon>
-- Flip coordinates and output extended EPSG (16 | 1)-- SELECT ST_AsGML(3, ST_GeomFromText('POINT(5.234234233242 6.34534534534)',4326), 5, 17); st_asgml -------- <gml:Point srsName="urn:ogc:def:crs:EPSG::4326" ><gml:pos >6.34535 5.23423</gml:pos ></gml:Point>
-- Output the envelope (32) -- SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 32); st_asgml -------- <gml:Envelope srsName="EPSG:4326"> <gml:lowerCorner >1 2</gml:lowerCorner> <gml:upperCorner >10 20</gml:upperCorner> </gml:Envelope>
-- Output the envelope (32) , reverse (lat lon instead of lon lat) (16), long srs (1)= 32 | 16 | 1 = 49 -- SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 49); st_asgml -------- <gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"> <gml:lowerCorner >2 1</gml:lowerCorner> <gml:upperCorner >20 10</gml:upperCorner> </gml:Envelope>
-- Polyhedral Example -- SELECT ST_AsGML(3, ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); st_asgml -------- <gml:PolyhedralSurface> <gml:polygonPatches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> </gml:polygonPatches> </gml:PolyhedralSurface>
ST_AsKML — 将几何图形作为 KML 元素返回。
text ST_AsKML(
geometry geom, integer maxdecimaldigits=15, text nprefix=NULL)
;
text ST_AsKML(
geography geog, integer maxdecimaldigits=15, text nprefix=NULL)
;
将几何图形作为 Keyhole 标记语言 (KML) 元素返回。 默认最大小数位数为 15,默认命名空间无前缀。
![]() | |
使用 |
![]() | |
需要在 Proj 支持下编译 PostGIS。 使用 PostGIS_Full_Version确认您已编译项目支持。 |
![]() | |
可用性:1.2.2 - 包含版本参数的更高版本出现在 1.3.2 中 |
![]() | |
增强:2.0.0 - 添加前缀命名空间,使用默认和命名参数 |
![]() | |
更改:3.0.0 - 删除了“版本化”变体签名 |
![]() | |
AsKML 输出不适用于没有 SRID 的几何图形 |
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsKML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_askml -------- <Polygon ><outerBoundaryIs ><LinearRing ><coordinates >0,0 0,1 1,1 1,0 0,0</coordinates ></LinearRing ></outerBoundaryIs ></Polygon> --3d linestring SELECT ST_AsKML('SRID=4326;LINESTRING(1 2 3, 4 5 6)'); <LineString ><coordinates >1,2,3 4,5,6</coordinates ></LineString>
ST_AsLatLonText — 返回给定点的度、分、秒表示形式。
text ST_AsLatLonText(
geometry pt, text format='')
;
返回点的度、分和秒表示形式。
![]() | |
假设该点位于纬度/经度投影中。 X(经度)和 Y(纬度)坐标在输出中标准化为“正常”范围(经度为 -180 到 180,纬度为 -90 到 90)。 |
text 参数是一个格式字符串,包含结果文本的格式,类似于日期格式字符串。 有效标记为“D”表示度、“M”表示分钟、“S”表示秒、“C”表示基本方向 (NSEW)。 DMS 令牌可以重复以指示所需的宽度和精度(“SSS.SSSS”表示“1.0023”)。
“M”、“S”和“C”是可选的。 如果省略“C”,则南或西的度数将显示为“-”符号。 如果省略“S”,分钟将显示为十进制,其精度位数与您指定的位数相同。 如果还省略“M”,则度数将显示为十进制,其精度与您指定的位数相同。
如果格式字符串被省略(或零长度),则将使用默认格式。
可用性:2.0
默认格式。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)')); st_aslatlontext ---------------------------- 2°19'29.928"S 3°14'3.243"W
指定格式(与默认值相同)。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"C')); st_aslatlontext ---------------------------- 2°19'29.928"S 3°14'3.243"W
除 D、M、S 和 C 以外的字符仅通过。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D degrees, M minutes, S seconds to the C')); st_aslatlontext -------------------------------------------------------------------------------------- 2 degrees, 19 minutes, 30 seconds to the S 3 degrees, 14 minutes, 3 seconds to the W
有符号的度数而不是基本方向。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"')); st_aslatlontext ---------------------------- -2°19'29.928" -3°14'3.243"
十进制度数。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D.DDDD degrees C')); st_aslatlontext ----------------------------------- 2.3250 degrees S 3.2342 degrees W
过大的值被归一化。
SELECT (ST_AsLatLonText('POINT (-302.2342342 -792.32498)')); st_aslatlontext ------------------------------- 72°19'29.928"S 57°45'56.757"E
ST_AsMARC21 — 将几何图形返回为带有地理数据字段 (034) 的 MARC21/XML 记录。
text ST_AsMARC21 (
geometry geom , text format='hdddmmss' )
;
此函数返回一个 MARC21/XML 记录,其中包含表示给定几何图形的边界框的编码制图数学数据。 格式
参数允许以 MARC21/XML 标准支持的所有格式对子字段 $d
、$e
、$f
和 $g
中的坐标进行编码。 有效格式为:
纬度和经度标识,度、分、秒(默认): hdddmmss
带经度和纬度标识的十进制度: hddd.dddddd
没有经度和纬度标识的十进制度: ddd.dddddd
带有经度和纬度标识的小数分钟: hdddmm.mmmm
不带纬度和经度标识的小数分钟: dddmm.mmmm
带有经度和纬度标识的小数秒: hdddmmss.sss
小数点符号也可以是逗号,例如 hddddmm,mmmm
。
小数格式的精度可能受到小数点后字符数的限制,例如 hdddmm.mm
表示小数分钟,精度为两位小数。
此函数忽略 Z 和 M维度。
支持的 LOC MARC21/XML 版本:
可用性: 3.3.0
![]() | |
此函数不支持非经度/纬度几何形状,因为它们不受 MARC21/XML 标准(编码制图数学数据)支持。 |
![]() | |
MARC21/XML 标准没有提供任何方法来注释编码制图数学数据的空间参考系统,这意味着这些信息在转换为 MARC21/XML 后将会丢失。 |
将 POINT
转换为 MARC21/XML,格式为 dd mm ss(默认)
SELECT ST_AsMARC21('SRID=4326;POINT(-4.504289 54.253312)'::geometry); st_asmarc21 ------------------------------------------------- <record xmlns="http://www.loc.gov/MARC21/slim"> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="d" >W0043015</subfield> <subfield code="e" >W0043015</subfield> <subfield code="f" >N0541512</subfield> <subfield code="g" >N0541512</subfield> </datafield> </record>
将 POLYGON
转换为十进制度格式的 MARC21/XML
SELECT ST_AsMARC21('SRID=4326;POLYGON((-4.5792388916015625 54.18172660239091,-4.56756591796875 54.196993557130355,-4.546623229980469 54.18313300502024,-4.5792388916015625 54.18172660239091))'::geometry,'hddd.dddd'); <record xmlns="http://www.loc.gov/MARC21/slim"> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="d" >W004.5792</subfield> <subfield code="e" >W004.5466</subfield> <subfield code="f" >N054.1970</subfield> <subfield code="g" >N054.1817</subfield> </datafield> </record>
将 GEOMETRYCOLLECTION
转换为以十进制分钟格式表示的 MARC21/XML。 MARC21/XML 输出中的几何顺序与其在集合中的顺序相对应。
SELECT ST_AsMARC21('SRID=4326;GEOMETRYCOLLECTION(POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)),POINT(-4.5 54.25))'::geometry,'hdddmm.mmmm'); st_asmarc21 ------------------------------------------------- <record xmlns="http://www.loc.gov/MARC21/slim"> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="d" >E01307.0000</subfield> <subfield code="e" >E01331.0000</subfield> <subfield code="f" >N05240.0000</subfield> <subfield code="g" >N05224.0000</subfield> </datafield> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="d" >W00430.0000</subfield> <subfield code="e" >W00430.0000</subfield> <subfield code="f" >N05415.0000</subfield> <subfield code="g" >N05415.0000</subfield> </datafield> </record>
ST_AsMVTGeom — 将几何图形转换为 MVT 瓦片的坐标空间。
geometry ST_AsMVTGeom(
geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true)
;
将几何图形转换为 MVT(Mapbox 矢量切片)瓦片的坐标空间,如果需要,将其剪切到图块边界。 几何图形必须位于目标地图的坐标系中(如果需要,请使用 ST_Transform)。 通常这是 Web 墨卡托 (SRID:3857)。
该函数尝试保持几何有效性,并在需要时进行纠正。 这可能会导致结果几何体塌陷到较低的维度。
必须提供目标地图坐标空间中瓦片的矩形边界,以便可以变换几何图形,并在需要时进行裁剪。 可以使用ST_TileEnvelope生成边界。
ST_AsMVT函数用于将几何图形转换为 ST_AsMVT 所需的瓦片坐标空间。
geom
是目标地图坐标系中要变换的几何图形。
bounds
是瓦片在地图坐标空间中的矩形边界,没有缓冲区。
extent
是由 MVT 规范定义的切片坐标空间中切片的大小。 默认值为 4096。
buffer
是切片坐标空间中用于裁剪几何图形的缓冲区大小。 默认值为 256。
Clip_geom
是一个布尔值,用于控制几何图形是否按原样剪切或编码。 默认为 true。
可用性:2.4.0
![]() | |
从 3.0 开始,可以在配置时选择 Wagyu 来剪辑和验证 MVT 多边形。 该库比 GEOS 默认库速度更快,产生的结果更正确,但它可能会丢失小多边形。 |
SELECT ST_AsText(ST_AsMVTGeom( ST_GeomFromText('POLYGON ((0 0, 10 0, 10 5, 0 -5, 0 0))'), ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false)); st_astext -------------------------------------------------------------------- MULTIPOLYGON(((5 4096,10 4091,10 4096,5 4096)),((5 4096,0 4101,0 4096,5 4096)))
使用计算的图块边界来查询和裁剪几何图形的 Web 墨卡托图块的规范示例。
SELECT ST_AsMVTGeom( ST_Transform( geom, 3857 ), ST_TileEnvelope(12, 513, 412), extent = > 4096, buffer = > 64) AS geom FROM data WHERE geom && ST_TileEnvelope(12, 513, 412, margin = > (64.0 / 4096))
ST_AsMVT — 返回一组行的 MVT 表示形式的聚合函数。
bytea ST_AsMVT(
anyelement set row)
;
bytea ST_AsMVT(
anyelement row, text name)
;
bytea ST_AsMVT(
anyelement row, text name, integer extent)
;
bytea ST_AsMVT(
anyelement row, text name, integer extent, text geom_name)
;
bytea ST_AsMVT(
anyelement row, text name, integer extent, text geom_name, text feature_id_name)
;
一个聚合函数,返回与图块图层对应的一组行的二进制 Mapbox 矢量瓦片表示。 这些行必须包含一个几何列,该几何列将被编码为要素几何。 几何图形必须位于图块坐标空间中,并且根据 MVT 规范有效。 ST_AsMVTGeom 可用于将几何图形转换为图块坐标空间。 其他行列被编码为特征属性。
Mapbox 矢量切片格式可以存储具有不同属性集的要素。 要使用此功能,请在包含一层深度的 Json 对象的行数据中提供一个 JSONB 列。 JSONB 值中的键和值将被编码为功能属性。
可以通过使用 ||
连接对此函数的多个调用来创建具有多层的切片。 或 使用STRING_AGG
。
![]() | |
不要将 |
row
至少包含一个几何列的行数据。
name
是图层名称。 默认值为字符串“default”。
extent
是规范定义的屏幕空间中的切片范围。 如果为 NULL,则默认值为 4096。
geom_name
是行数据中几何列的名称。 默认为第一个几何列。 请注意,PostgreSQL 默认情况下会自动将未加引号的标识符折叠为小写,这意味着除非几何列被加引号,例如 “MyMVTGeom”
,此参数必须以小写形式提供。
feature_id_name
是行数据中功能 ID 列的名称。 如果为 NULL 或负数,则不设置功能 ID。 匹配名称和有效类型(smallint、integer、bigint)的第一列将用作功能 ID,任何后续列将添加为属性。 不支持 JSON 属性。
增强:3.0 - 添加了对要素 ID 的支持。
增强:2.5.0 - 添加了对并行查询的支持。
可用性:2.4.0
WITH mvtgeom AS ( SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(12, 513, 412), extent = > 4096, buffer = > 64) AS geom, name, description FROM points_of_interest WHERE geom && ST_TileEnvelope(12, 513, 412, margin = > (64.0 / 4096)) ) SELECT ST_AsMVT(mvtgeom.*) FROM mvtgeom;
ST_AsSVG — 返回几何体的 SVG 路径数据。
text ST_AsSVG(
geometry geom, integer rel=0, integer maxdecimaldigits=15)
;
text ST_AsSVG(
geography geog, integer rel=0, integer maxdecimaldigits=15)
;
将几何图形作为标量矢量图形 (SVG) 路径数据返回。 使用 1 作为第二个参数可以根据相对移动实现路径数据,默认值(或 0)使用绝对移动。 第三个参数可用于减少输出中使用的最大十进制位数(默认为 15)。 当 'rel' arg 为 0 时,点几何图形将渲染为 cx/cy,当 'rel' arg 为 1 时,将渲染为 x/y。多点几何图形由逗号 (",") 分隔,GeometryCollection 几何图形由分号 (";") 分隔 。
要使用 PostGIS SVG 图形,请查看 pg_svg 库,它提供了用于处理 ST_AsSVG 输出的 plpgsql 函数。
增强:3.4.0 支持所有曲线类型
更改: 2.0.0 - 添加了对默认参数和命名参数的支持
![]() | |
可用性:1.2.2。 可用性:1.4.0 PostGIS 1.4.0 中更改为在绝对路径中包含 L 命令以符合 http://www.w3.org/TR/SVG/paths.html#PathDataBNF |
此方法支持圆形字符串和曲线。
SELECT ST_AsSVG('POLYGON((0 0,0 1,1 1,1 0,0 0))'::geometry); st_assvg -------- M 0 0 L 0 -1 1 -1 1 0 Z
圆弧
SELECT ST_AsSVG( ST_GeomFromText('CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)') ); st_assvg -------- M -2 0 A 2 2 0 0 1 2 0 A 2 2 0 0 1 2 -4
多曲线
SELECT ST_AsSVG('MULTICURVE((5 5,3 5,3 3,0 3), CIRCULARSTRING(0 0,2 1,2 2))'::geometry, 0, 0); st_assvg ------------------------------------------------ M 5 -5 L 3 -5 3 -3 0 -3 M 0 0 A 2 2 0 0 0 2 -2
多曲面
SELECT ST_AsSVG('MULTISURFACE( CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0), (-1 0,0 0.5,1 0,0 1,-1 0)), ((7 8,10 10,6 14,4 11,7 8)))'::geometry, 0, 2); st_assvg --------------------------------------------------------- M -2 0 A 1 1 0 0 0 0 0 A 1 1 0 0 0 2 0 A 2 2 0 0 0 -2 0 Z M -1 0 L 0 -0.5 1 0 0 -1 -1 0 Z M 7 -8 L 10 -10 6 -14 4 -11 Z
ST_AsTWKB — 返回几何形式为 TWKB,又名“微小的已知的二进制”
bytea ST_AsTWKB(
geometry geom, integer prec=0, integer prec_z=0, integer prec_m=0, boolean with_sizes=false, boolean with_boxes=false)
;
bytea ST_AsTWKB(
geometry[] geom, bigint[] ids, integer prec=0, integer prec_z=0, integer prec_m=0, boolean with_sizes=false, boolean with_boxes=false)
;
返回 TWKB(微小已知的二进制)格式的几何图形。 TWKB 是一种压缩的二进制格式,注重最小化输出的大小。
小数位参数控制输出中存储的精度。 默认情况下,值在编码前四舍五入到最接近的单位。 如果要传输更高的精度,请增加数字。 例如,值 1 表示将保留小数点右侧的第一位数字。
大小和边界框参数控制输出中是否包含有关对象的编码长度和对象边界的可选信息。 默认情况下,它们不是。 除非您的客户端软件需要使用它们,否则不要打开它们,因为它们只会占用空间(节省空间是 TWKB 的目的)。
该函数的数组输入形式用于将几何图形和唯一标识符的集合转换为保留标识符的 TWKB 集合。 这对于希望解压集合然后访问有关内部对象的更多信息的客户端非常有用。 您可以使用 array_agg 函数创建数组。 其他参数的操作与函数的简单形式相同。
![]() | |
格式规范可在 https://github.com/TWKB/Specification 在线获取,构建 JavaScript 客户端的代码可在 https://github.com/TWKB/twkb.js 找到。 |
增强:2.4.0 内存和速度改进。
可用性:2.2.0
SELECT ST_AsTWKB('LINESTRING(1 1,5 5)'::geometry); st_astwkb -------------------------------------------- \x02000202020808
要创建包含标识符的聚合 TWKB 对象,请首先使用“array_agg()”聚合所需的几何图形和对象,然后调用适当的 TWKB 函数。
SELECT ST_AsTWKB(array_agg(geom), array_agg(gid)) FROM mytable; st_astwkb -------------------------------------------- \x040402020400000202
ST_AsX3D — 返回 X3D xml 节点元素格式的几何图形:ISO-IEC-19776-1.2-X3DEncodings-XML
text ST_AsX3D(
geometry g1, integer maxdecimaldigits=15, integer options=0)
;
以 X3D xml 格式的节点元素形式返回几何图形 http://www.web3d.org/standards/number/19776-1。 如果未指定 maxdecimaldigits
(精度),则默认为 15。
![]() | |
有多种选项可用于将 PostGIS 几何图形转换为 X3D,因为 X3D 几何类型不会直接映射到 PostGIS 几何类型,而一些较新的 X3D 类型可能是我们避免的更好的映射,因为大多数渲染工具当前不支持它们。 这些是我们已经确定的映射。 如果您对我们允许人们表示他们首选映射的想法或方式有任何想法,请随时发布错误通知单。 以下是我们目前如何将 PostGIS 2D/3D 类型映射到 X3D 类型 |
“选项”参数是一个位字段。 对于 PostGIS 2.2 ,这用于表示是否用 X3D GeoCooperatives 地理空间节点表示坐标以及是否翻转 x/y 轴。 默认情况下,ST_AsX3D
以数据库形式输出(long、lat 或 X、Y),但 X3D 默认为 lat/lon、y/x 可能是首选。
0:数据库顺序中的 X/Y(例如,经/纬度 = X,Y 是标准数据库顺序)、默认值和非空间坐标(只是常规的旧坐标标签)。
1:翻转X和Y。如果与地理坐标选项开关结合使用,则输出将默认为“latitude_first”,并且坐标也会翻转。
2:GeoSpatial GeoCoordinates 中的输出坐标。 如果几何图形不在 WGS 84 长纬度 (srid: 4326) 中,此选项将引发错误。 这是目前唯一支持的地理坐标类型。 请参阅指定空间参考系统的 X3D 规范。默认输出将为 GeoCoordinate geoSystem='"GD" "WE" "longitude_first"'
。 如果您更喜欢 GeoCoordinate geoSystem='"GD" "WE" "latitude_first"'
的 X3D 默认值,请使用 (2+1)
= 3
PostGIS类型 | 2D X3D类型 | 3D X3D类型 |
---|---|---|
LINESTRING | 尚未实现 - 将是 PolyLine2D | LineSet |
MULTILINESTRING | 尚未实现 - 将是 PolyLine2D | IndexedLineSet |
MULTIPOINT | Polypoint2D | PointSet |
POINT | 输出以空格分隔的坐标 | 输出以空格分隔的坐标 |
(MULTI) POLYGON, POLYHEDRALSURFACE | X3D 标记无效 | IndexedFaceSet(内环当前输出为另一个面集) |
TIN | TriangleSet2D(尚未实现) | IndexedTriangleSet(索引三角形集) |
![]() | |
2D 几何支持尚未完成。 内环当前仅绘制为单独的多边形。 我们正在研究这些。 |
3D 空间中发生了许多进步,特别是 X3D 与 HTML5 的集成
还有一个很好的开源 X3D 查看器,您可以使用它来查看渲染的几何图形。 Free Wrl http://freewrl.sourceforge.net/ 二进制文件适用于 Mac、Linux 和 Windows。 使用打包的 FreeWRL_Launcher 来查看几何图形。
另请查看利用此功能的 PostGIS 简约 X3D 查看器和 x3dDom html/js 开源工具包。
可用性: 2.0.0: ISO-IEC-19776-1.2-X3DEncodings-XML
增强:2.2.0:添加了对反转地理坐标和轴(x/y、经度/纬度)的支持。 有关详细信息,请参阅选项。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <Scene> <Transform> <Shape> <Appearance> <Material emissiveColor=''0 0 1''/> </Appearance > ' || ST_AsX3D( ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')) || '</Shape> </Transform> </Scene> </X3D >' As x3ddoc; x3ddoc -------- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <Scene> <Transform> <Shape> <Appearance> <Material emissiveColor='0 0 1'/> </Appearance> <IndexedFaceSet coordIndex='0 1 2 3 -1 4 5 6 7 -1 8 9 10 11 -1 12 13 14 15 -1 16 17 18 19 -1 20 21 22 23'> <Coordinate point='0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1' /> </IndexedFaceSet> </Shape> </Transform> </Scene> </X3D>
将此查询的输出复制并粘贴到 x3d 场景查看器,然后单击“显示”
SELECT string_agg('<Shape >' || ST_AsX3D(ST_Extrude(geom, 0,0, i*0.5)) || '<Appearance> <Material diffuseColor="' || (0.01*i)::text || ' 0.8 0.2" specularColor="' || (0.05*i)::text || ' 0 0.5"/> </Appearance> </Shape >', '') FROM ST_Subdivide(ST_Letters('PostGIS'),20) WITH ORDINALITY AS f(geom,i);
PostGIS细分、挤压形成的建筑物
SELECT ST_AsX3D( ST_Translate( ST_Force_3d( ST_Buffer(ST_Point(10,10),5, 'quad_segs=2')), 0,0, 3) ,6) As x3dfrag; x3dfrag -------- <IndexedFaceSet coordIndex="0 1 2 3 4 5 6 7"> <Coordinate point="15 10 3 13.535534 6.464466 3 10 5 3 6.464466 6.464466 3 5 10 3 6.464466 13.535534 3 10 15 3 13.535534 13.535534 3 " /> </IndexedFaceSet>
SELECT ST_AsX3D(ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )')) As x3dfrag; x3dfrag -------- <IndexedTriangleSet index='0 1 2 3 4 5' ><Coordinate point='0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0'/></IndexedTriangleSet>
SELECT ST_AsX3D( ST_GeomFromEWKT('MULTILINESTRING((20 0 10,16 -12 10,0 -16 10,-12 -12 10,-20 0 10,-12 16 10,0 24 10,16 16 10,20 0 10), (12 0 10,8 8 10,0 12 10,-8 8 10,-8 0 10,-8 -4 10,0 -8 10,8 -4 10,12 0 10))') ) As x3dfrag; x3dfrag -------- <IndexedLineSet coordIndex='0 1 2 3 4 5 6 7 0 -1 8 9 10 11 12 13 14 15 8'> <Coordinate point='20 0 10 16 -12 10 0 -16 10 -12 -12 10 -20 0 10 -12 16 10 0 24 10 16 16 10 12 0 10 8 8 10 0 12 10 -8 8 10 -8 0 10 -8 -4 10 0 -8 10 8 -4 10 ' /> </IndexedLineSet>
ST_GeoHash — 返回几何图形的 GeoHash 表示形式。
text ST_GeoHash(
geometry geom, integer maxchars=full_precision_of_point)
;
计算几何图形的 GeoHash 表示。 GeoHash 将地理点编码为可基于前缀排序和搜索的文本形式。 较短的 GeoHash 是点的不太精确的表示。 它可以被认为是一个包含点的盒子。
具有非零范围的非点几何值也可以映射到 GeoHash 代码。 代码的精度取决于几何的地理范围。
如果未指定 maxchars
,则返回的 GeoHash 代码适用于包含输入几何图形的最小单元格。 Points 返回精度为 20 个字符的 GeoHash(大约足以容纳输入的完整双精度)。 其他几何类型可能会返回精度较低的 GeoHash,具体取决于几何形状的范围。 较大的几何图形的精度较低,较小的几何图形的精度较高。 由 GeoHash 代码确定的框始终包含输入特征。
如果指定了maxchars
参数,则返回的GeoHash代码最多包含指定数量的字符。它映射到输入几何体的(可能)较低精度表示。对于非点几何体,计算的起始点是几何体边界框的中心点。
可用性:1.4.0
![]() | |
ST_GeoHash 要求输入几何图形采用地理(经度/纬度)坐标。 |
此方法支持圆形字符串和曲线。
SELECT ST_GeoHash( ST_Point(-126,48) ); st_geohash ---------------------- c0w3hf1s70w3hf1s70w3 SELECT ST_GeoHash( ST_Point(-126,48), 5); st_geohash ------------ c0w3h -- This line contains the point, so the GeoHash is a prefix of the point code SELECT ST_GeoHash('LINESTRING(-126 48, -126.1 48.1)'::geometry); st_geohash ------------ c0w3
TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。 TRUE
。TRUE
。TRUE
。TRUE
。 TRUE
。TRUE
。 TRUE
。 TRUE
。TRUE
。TRUE
。 TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。TRUE
。&& — 如果 A 的 2D 边界框与 B 的 2D 边界框相交,则返回 TRUE
。
boolean &&(
geometry A , geometry B )
;
boolean &&(
geography A , geography B )
;
如果 A 的二维边界框与 B 的二维边界框交互,&&
返回TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
增强: 2.0.0 引入了对多面体曲面的支持。
可用性: 1.5.0 引入了对地理的支持。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT tbl1.column1, tbl2.column1, tbl1.column2 && tbl2.column2 AS overlaps FROM ( VALUES (1, 'LINESTRING(0 0, 3 3)'::geometry), (2, 'LINESTRING(0 1, 0 5)'::geometry)) AS tbl1, ( VALUES (3, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2; column1 | column1 | overlaps ---------+---------+---------- 1 | 3 | t 2 | 3 | f (2 rows)
&&(geometry,box2df) — 如果几何体的(缓存的)2D 边界框与 2D 浮点精度边界框 (BOX2DF) 相交,则返回 TRUE
。
boolean &&(
geometry A , box2df B )
;
如果几何体 A 的缓存 2D 边界框与 2D 边界框 B 相交(使用浮点精度),则&&
运算符返回 TRUE
。 这意味着如果 B 是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_Point(1,1) && ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) AS overlaps; overlaps ---------- t (1 row)
&&(box2df,geometry) — 如果 2D 浮点精度边界框 (BOX2DF) 与几何体的(缓存的)2D 边界框相交,则返回 TRUE
。
boolean &&(
box2df A , geometry B )
;
该&&
运算符在使用浮点精度时,如果2D边界框A与几何体B的缓存2D边界框相交,则返回TRUE
。这意味着如果A是一个(双精度)box2d,它将在内部被转换为一个浮点精度的2D边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_Point(1,1) AS overlaps; overlaps ---------- t (1 row)
&&(box2df,box2df) — 如果两个 2D 浮点精度边界框 (BOX2DF) 彼此相交,则返回 TRUE
。
boolean &&(
box2df A , box2df B )
;
&&
运算符在使用浮点精度时,如果两个 2D 边界框 A 和 B 相交,则返回 TRUE
。这意味着如果 A(或 B)是一个(双精度)box2d,它将在内部被转换为一个浮点精度的 2D 边界框(BOX2DF)
![]() | |
该运算符旨在供 BRIN 索引内部使用,而不是供用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_MakeBox2D(ST_Point(1,1), ST_Point(3,3)) AS overlaps; overlaps ---------- t (1 row)
&&& — 如果 A 的 n 维边界框与 B 的 n 维边界框相交,则返回 TRUE
。
boolean &&&(
geometry A , geometry B )
;
&&&
运算符返回TRUE
,如果 A 的 n 维边界框与 B 的 n 维边界框相交。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
可用性: 2.0.0
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3d, tbl1.column2 && tbl2.column2 AS overlaps_2d FROM ( VALUES (1, 'LINESTRING Z(0 0 1, 3 3 2)'::geometry), (2, 'LINESTRING Z(1 2 0, 0 5 -1)'::geometry)) AS tbl1, ( VALUES (3, 'LINESTRING Z(1 2 1, 4 6 1)'::geometry)) AS tbl2; column1 | column1 | overlaps_3d | overlaps_2d ---------+---------+-------------+------------- 1 | 3 | t | t 2 | 3 | f | t
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3zm, tbl1.column2 && tbl2.column2 AS overlaps_2d FROM ( VALUES (1, 'LINESTRING M(0 0 1, 3 3 2)'::geometry), (2, 'LINESTRING M(1 2 0, 0 5 -1)'::geometry)) AS tbl1, ( VALUES (3, 'LINESTRING M(1 2 1, 4 6 1)'::geometry)) AS tbl2; column1 | column1 | overlaps_3zm | overlaps_2d ---------+---------+-------------+------------- 1 | 3 | t | t 2 | 3 | f | t
&&&(geometry,gidx) — 如果几何体的(缓存的)n 维边界框与 n 维浮点精度边界框 (GIDX) 相交,则返回 TRUE
。
boolean &&&(
geometry A , gidx B )
;
&&&
运算符在使用浮点精度时,如果几何体 A 的缓存 n-D 边界框与 n-D 边界框 B 相交,则返回 TRUE
。这意味着如果 B 是一个(双精度)box3d,它将在内部被转换为一个浮点精度的 3D 边界框(GIDX)
![]() | |
该运算符旨在供 BRIN 索引内部使用,而不是供用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_MakePoint(1,1,1) &&& ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) AS overlaps; overlaps ---------- t (1 row)
&&&(gidx,geometry) — 如果 n 维浮点精度边界框 (GIDX) 与几何体的(缓存的)n 维边界框相交,则返回 TRUE
。
boolean &&&(
gidx A , geometry B )
;
&&&
运算符在使用浮点精度时,如果 n-D 边界框 A 与几何体 B 的缓存 n-D 边界框相交,则返回 TRUE
。这意味着如果 A 是一个(双精度)box3d,它将在内部被转换为一个浮点精度的 3D 边界框(GIDX)
![]() | |
该运算符旨在供 BRIN 索引内部使用,而不是供用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_MakePoint(1,1,1) AS overlaps; overlaps ---------- t (1 row)
&&&(gidx,gidx) — 如果两个 n 维浮点精度边界框 (GIDX) 彼此相交,则返回 TRUE
。
boolean &&&(
gidx A , gidx B )
;
&&&
运算符在使用浮点精度时,如果两个 n-D 边界框 A 和 B 相交,则返回 TRUE
。这意味着如果 A(或 B)是一个(双精度)box3d,它将在内部被转换为一个浮点精度的 3D 边界框(GIDX)
![]() | |
该运算符旨在供 BRIN 索引内部使用,而不是供用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_3DMakeBox(ST_MakePoint(1,1,1), ST_MakePoint(3,3,3)) AS overlaps; overlaps ---------- t (1 row)
&< — 如果 A 的边界框与 B 的边界框重叠或位于其左侧,则返回 TRUE
。
boolean &<(
geometry A , geometry B )
;
&<
运算符返回 TRUE
如果几何体 A 的边界框与几何体 B 的边界框重叠或在几何体B的边界框的左侧,或者更准确地说,不位于几何体 B 的边界框的右侧。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &< tbl2.column2 AS overleft FROM ( VALUES (1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING(0 0, 3 3)'::geometry), (3, 'LINESTRING(0 1, 0 5)'::geometry), (4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2; column1 | column1 | overleft ---------+---------+---------- 1 | 2 | f 1 | 3 | f 1 | 4 | t (3 rows)
&<| — 如果 A 的边界框与 B 的边界框重叠或低于 B 的边界框,则返回 TRUE
。
boolean &<|(
geometry A , geometry B )
;
&<|
运算符返回TRUE
,如果几何体 A 的边界框与几何体 B 的边界框重叠或低于几何体B的边界框,或者更准确地说,不位于几何体 B 的边界框的上方。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &<| tbl2.column2 AS overbelow FROM ( VALUES (1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING(0 0, 3 3)'::geometry), (3, 'LINESTRING(0 1, 0 5)'::geometry), (4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2; column1 | column1 | overbelow ---------+---------+----------- 1 | 2 | f 1 | 3 | t 1 | 4 | t (3 rows)
&> — 如果 A的边界框与 B 的边界框重叠或位于 B 右侧,则返回 TRUE
。
boolean &>(
geometry A , geometry B )
;
运算符&>
返回TRUE
,如果几何体A的边界框与几何体B的边界框重叠或位于其右侧,更准确地说,它与几何体B的边界框不重叠于其左侧。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 & > tbl2.column2 AS overright FROM ( VALUES (1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING(0 0, 3 3)'::geometry), (3, 'LINESTRING(0 1, 0 5)'::geometry), (4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2; column1 | column1 | overright ---------+---------+----------- 1 | 2 | t 1 | 3 | t 1 | 4 | f (3 rows)
<< — 如果 A 的边界框严格位于 B 的左侧,则返回 TRUE
。
boolean <<(
geometry A , geometry B )
;
如果 A 的边界框严格位于 B 的边界框的左侧,则<<
运算符返回TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 << tbl2.column2 AS left FROM ( VALUES (1, 'LINESTRING (1 2, 1 5)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (0 0, 4 3)'::geometry), (3, 'LINESTRING (6 0, 6 5)'::geometry), (4, 'LINESTRING (2 2, 5 6)'::geometry)) AS tbl2; column1 | column1 | left ---------+---------+------ 1 | 2 | f 1 | 3 | t 1 | 4 | t (3 rows)
<<| — 如果 A 的边界框严格低于 B 的边界框,则返回 TRUE
。
boolean <<|(
geometry A , geometry B )
;
如果 A 的边界框严格低于 B 的边界框,则运算符<<|
返回TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 <<| tbl2.column2 AS below FROM ( VALUES (1, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (1 4, 1 7)'::geometry), (3, 'LINESTRING (6 1, 6 5)'::geometry), (4, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl2; column1 | column1 | below ---------+---------+------- 1 | 2 | t 1 | 3 | f 1 | 4 | f (3 rows)
= — 如果几何/地理 A 的坐标和坐标顺序与几何/地理 B 的坐标和坐标顺序相同,则返回 TRUE
。
boolean =(
geometry A , geometry B )
;
boolean =(
geography A , geography B )
;
如果几何/地理 A 的坐标和坐标顺序与几何/地理 B 的坐标和坐标顺序相同,=
运算符返回 TRUE
。 PostgreSQL 使用为几何定义的 =、< 和 > 运算符来执行内部排序和比较 几何图形(即在 GROUP BY 或 ORDER BY 子句中)。
![]() | |
只有在所有方面都完全相同、具有相同坐标、相同顺序的几何/地理才被该运算符视为相等。 对于“空间平等”,它忽略坐标顺序等内容,并且可以检测以不同表示覆盖相同空间区域的要素,请使用ST_OrderingEquals 或 ST_Equals |
![]() | |
此运算符不对几何图形使用任何有效索引。 要使用索引执行稳健的相等性测试,请使用= —和 &&。 |
更改:2.4.0,在之前的版本中,这是边界框相等而不是几何相等。 如果需要边界框相等,请使用~=代替。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT 'LINESTRING(0 0, 0 1, 1 0)'::geometry = 'LINESTRING(1 1, 0 0)'::geometry; ?column? ---------- f (1 row) SELECT ST_AsText(column1) FROM ( VALUES ('LINESTRING(0 0, 1 1)'::geometry), ('LINESTRING(1 1, 0 0)'::geometry)) AS foo; st_astext --------------------- LINESTRING(0 0,1 1) LINESTRING(1 1,0 0) (2 rows) -- Note: the GROUP BY uses the "=" to compare for geometry equivalency. SELECT ST_AsText(column1) FROM ( VALUES ('LINESTRING(0 0, 1 1)'::geometry), ('LINESTRING(1 1, 0 0)'::geometry)) AS foo GROUP BY column1; st_astext --------------------- LINESTRING(0 0,1 1) LINESTRING(1 1,0 0) (2 rows) -- In versions prior to 2.0, this used to return true -- SELECT ST_GeomFromText('POINT(1707296.37 4820536.77)') = ST_GeomFromText('POINT(1707296.27 4820536.87)') As pt_intersect; --pt_intersect -- f
>> — 如果 A 的边界框严格位于 B 的右侧,则返回 TRUE
。
boolean >>(
geometry A , geometry B )
;
如果几何体 A 的边界框严格位于几何体 B 的边界框右侧,则 >>
运算符返回 TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 > > tbl2.column2 AS right FROM ( VALUES (1, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (1 4, 1 7)'::geometry), (3, 'LINESTRING (6 1, 6 5)'::geometry), (4, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl2; column1 | column1 | right ---------+---------+------- 1 | 2 | t 1 | 3 | f 1 | 4 | f (3 rows)
@ — 如果 A 的边界框包含在 B 的边界框中,则返回 TRUE
。
boolean @(
geometry A , geometry B )
;
如果几何体 A 的边界框完全包含在几何体 B 的边界框内,则 @
运算符返回 TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 @ tbl2.column2 AS contained FROM ( VALUES (1, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (0 0, 4 4)'::geometry), (3, 'LINESTRING (2 2, 4 4)'::geometry), (4, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl2; column1 | column1 | contained ---------+---------+----------- 1 | 2 | t 1 | 3 | f 1 | 4 | t (3 rows)
@(geometry,box2df) — 如果几何体的 2D 边界框包含在 2D 浮点精度边界框 (BOX2DF) 中,则返回 TRUE
。
boolean @(
geometry A , box2df B )
;
如果 A 几何图形的 2D 边界框包含 2D 边界框 B(使用浮点精度),则 @
运算符返回 TRUE
。 这意味着如果 B 是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_Buffer(ST_GeomFromText('POINT(2 2)'), 1) @ ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) AS is_contained; is_contained -------------- t (1 row)
@(box2df,geometry) — 如果 2D 浮点精度边界框 (BOX2DF) 包含在几何体的 2D 边界框中,则返回 TRUE
。
boolean @(
box2df A , geometry B )
;
如果 2D 边界框 A 使用浮点精度包含在 B 几何体的 2D 边界框中,则 @
运算符返回 TRUE
。 这意味着如果 B 是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_MakeBox2D(ST_Point(2,2), ST_Point(3,3)) @ ST_Buffer(ST_GeomFromText('POINT(1 1)'), 10) AS is_contained; is_contained -------------- t (1 row)
@(box2df,box2df) — 如果 2D 浮点精度边界框 (BOX2DF) 包含在另一个 2D 浮点精度边界框内,则返回 TRUE
。
boolean @(
box2df A , box2df B )
;
如果 2D 边界框 A 包含在 2D 边界框 B 中,则 @
运算符使用浮点精度返回TRUE
。 这意味着如果 A(或 B)是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_MakeBox2D(ST_Point(2,2), ST_Point(3,3)) @ ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) AS is_contained; is_contained -------------- t (1 row)
|&> — 如果 A 的边界框与 B 的边界框重叠或位于其上方,则返回 TRUE
。
boolean |&>(
geometry A , geometry B )
;
运算符|&>
返回TRUE
,如果几何体A的边界框与几何体B的边界框重叠或位于其上方,更准确地说,它与几何体B的边界框不重叠于其下方。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 |& > tbl2.column2 AS overabove FROM ( VALUES (1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING(0 0, 3 3)'::geometry), (3, 'LINESTRING(0 1, 0 5)'::geometry), (4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2; column1 | column1 | overabove ---------+---------+----------- 1 | 2 | t 1 | 3 | f 1 | 4 | f (3 rows)
|>> — 如果 A 的边界框严格位于 B 的边界框上方,则返回 TRUE
。
boolean |>>(
geometry A , geometry B )
;
如果几何体 A 的边界框严格位于几何体 B 的边界框上方,则 |>>
运算符返回 TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 |>> tbl2.column2 AS above FROM ( VALUES (1, 'LINESTRING (1 4, 1 7)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (0 0, 4 2)'::geometry), (3, 'LINESTRING (6 1, 6 5)'::geometry), (4, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl2; column1 | column1 | above ---------+---------+------- 1 | 2 | t 1 | 3 | f 1 | 4 | f (3 rows)
~ — 如果 A 的边界框包含 B 的边界框,则返回 TRUE
。
boolean ~(
geometry A , geometry B )
;
如果几何体 A 的边界框完全包含几何体 B 的边界框,则 ~
运算符返回 TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 ~ tbl2.column2 AS contains FROM ( VALUES (1, 'LINESTRING (0 0, 3 3)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (0 0, 4 4)'::geometry), (3, 'LINESTRING (1 1, 2 2)'::geometry), (4, 'LINESTRING (0 0, 3 3)'::geometry)) AS tbl2; column1 | column1 | contains ---------+---------+---------- 1 | 2 | f 1 | 3 | t 1 | 4 | t (3 rows)
~(geometry,box2df) — 如果几何体的 2D 粘合框包含 2D 浮点精度边界框 (GIDX),则返回 TRUE
。
boolean ~(
geometry A , box2df B )
;
如果几何图形 A 的 2D 边界框包含 2D 边界框 B(使用浮点精度),则 ~
运算符返回 TRUE
。 这意味着如果 B 是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_Buffer(ST_GeomFromText('POINT(1 1)'), 10) ~ ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) AS contains; contains ---------- t (1 row)
~(box2df,geometry) — 如果 2D 浮点精度边界框 (BOX2DF) 包含几何体的 2D 边界框,则返回 TRUE
。
boolean ~(
box2df A , geometry B )
;
如果 2D 边界框 A 包含 B 几何体的边界框,则 ~
运算符使用浮点精度返回 TRUE
。 这意味着如果 A 是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) ~ ST_Buffer(ST_GeomFromText('POINT(2 2)'), 1) AS contains; contains ---------- t (1 row)
~(box2df,box2df) — 如果 2D 浮点精度边界框 (BOX2DF) 包含另一个 2D 浮点精度边界框 (BOX2DF),则返回 TRUE
。
boolean ~(
box2df A , box2df B )
;
如果 2D 浮点精度边界框 A 包含 2D 浮点精度边界框 B,则 ~
运算符返回 TRUE
。 这意味着如果 A 是(双精度)box2d,它将在内部转换为浮点精度 2D 边界框(BOX2DF)
![]() | |
该操作数旨在由 BRIN 索引内部使用,而不是由用户使用。 |
可用性:2.3.0 引入了对块范围索引 (BRIN) 的支持。 需要 PostgreSQL 9.5+。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) ~ ST_MakeBox2D(ST_Point(2,2), ST_Point(3,3)) AS contains; contains ---------- t (1 row)
~= — 如果 A 的边界框与 B 的边界框相同,则返回 TRUE
。
boolean ~=(
geometry A , geometry B )
;
如果几何/地理 A 的边界框与几何/地理 B 的边界框相同,则 ~=
运算符返回 TRUE
。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
可用性:1.5.0 改变了行为
该函数支持多面体曲面。
![]() | |
该运算符已将 PostGIS 1.5 中的行为从测试实际几何相等性更改为仅检查边界框相等性。 让事情变得复杂的是,它还取决于您是否进行了硬升级或软升级,数据库的行为是什么。 要了解您的数据库有哪些行为,您可以运行下面的查询。 要检查是否真正相等,请使用 ST_OrderingEquals或 ST_Equals。 |
select 'LINESTRING(0 0, 1 1)'::geometry ~= 'LINESTRING(0 1, 1 0)'::geometry as equality; equality | -----------------+ t |
<-> — 返回 A 和 B 之间的 2D 距离。
double precision <->(
geometry A , geometry B )
;
double precision <->(
geography A , geography B )
;
<->
运算符返回两个几何图形之间的二维距离。 用于“ORDER BY”子句提供索引辅助的最近邻结果集。 对于 9.5 以下的 PostgreSQL 仅给出边界框的质心距离,而对于 PostgreSQL 9.5,真正的 KNN 距离搜索给出几何图形之间的真实距离以及地理的球体距离。
![]() | |
该操作符将利用几何上可能可用的 2D GiST 索引。 它与其他使用空间索引的运算符不同,只有当该运算符位于 ORDER BY 子句中时才会使用空间索引。 |
![]() | |
仅当其中一个几何图形是常量(不在子查询/cte 中)时,索引才会启动。 例如 'SRID=3005;POINT(1011102 450541)'::geometry 而不是 a.geom |
有关详细示例,请参阅 PostGIS 研讨会:最近邻搜索。
增强:2.2.0 -几何和地理之间的 KNN(k 最近邻)行为现在是真实的。 请注意,地理的 KNN 是在球面上计算的,而不是在椭球体平面上计算的。 PostgreSQL 9.4 及更低版本支持地理,但仅支持边界框的重心。
更改: 2.2.0 -在PostgreSQL 9.5中,旧的混合格式可能很慢。 因此,如果您只想在 PostGIS 2.2 或更高版本和 PostgreSQL 9.5 或更高版本上运行,则可能需要消除该方法。
可用性:2.0.0——弱 KNN 根据几何质心距离而不是真实距离提供最近邻。 点的结果精确,所有其他类型的结果不精确。 适用于 PostgreSQL 9.1+
SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr FROM va2005 ORDER BY d limit 10; d | edabbr | vaabbr ------------------+--------+-------- 0 | ALQ | 128 5541.57712511724 | ALQ | 129A 5579.67450712005 | ALQ | 001 6083.4207708641 | ALQ | 131 7691.2205404848 | ALQ | 003 7900.75451037313 | ALQ | 122 8694.20710669982 | ALQ | 129B 9564.24289057111 | ALQ | 130 12089.665931705 | ALQ | 127 18472.5531479404 | ALQ | 002 (10 rows)
KNN的原始答案是:
SELECT st_distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr FROM va2005 ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10; d | edabbr | vaabbr ------------------+--------+-------- 0 | ALQ | 128 5541.57712511724 | ALQ | 129A 5579.67450712005 | ALQ | 001 6083.4207708641 | ALQ | 131 7691.2205404848 | ALQ | 003 7900.75451037313 | ALQ | 122 8694.20710669982 | ALQ | 129B 9564.24289057111 | ALQ | 130 12089.665931705 | ALQ | 127 18472.5531479404 | ALQ | 002 (10 rows)
如果您对这两个查询运行“EXPLAIN ANALYZE”,您将看到第二个查询的性能有所提高。
对于运行 PostgreSQL < 9.5 的用户,请使用混合查询来查找真正的最临近点。 首先使用索引辅助 KNN 进行 CTE 查询,然后进行精确查询以获得正确的排序:
WITH index_query AS ( SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr FROM va2005 ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry LIMIT 100) SELECT * FROM index_query ORDER BY d limit 10; d | edabbr | vaabbr ------------------+--------+-------- 0 | ALQ | 128 5541.57712511724 | ALQ | 129A 5579.67450712005 | ALQ | 001 6083.4207708641 | ALQ | 131 7691.2205404848 | ALQ | 003 7900.75451037313 | ALQ | 122 8694.20710669982 | ALQ | 129B 9564.24289057111 | ALQ | 130 12089.665931705 | ALQ | 127 18472.5531479404 | ALQ | 002 (10 rows)
|=| — 返回 A 和 B 轨迹在最接近点处的距离。
double precision |=|(
geometry A , geometry B )
;
|=|
运算符返回两个轨迹之间的 3D 距离(请参阅 ST_IsValidTrajectory)。 这与 ST_DistanceCPA 相同,但作为运算符,它可用于使用 N 维索引进行最近邻搜索(需要 PostgreSQL 9.5.0 或更高版本)。
![]() | |
该操作数将利用几何上可能可用的 ND GiST 索引。 它与其他使用空间索引的运算符不同,只有当该运算符位于 ORDER BY 子句中时才会使用空间索引。 |
![]() | |
仅当其中一个几何图形是常量(不在子查询/cte 中)时,索引才会启动。 例如 'SRID=3005;LINESTRINGM(0 0 0,0 0 1)'::geometry 而不是 a.geom |
可用性:2.2.0。 索引支持仅适用于 PostgreSQL 9.5+
-- Save a literal query trajectory in a psql variable... \set qt 'ST_AddMeasure(ST_MakeLine(ST_MakePointM(-350,300,0),ST_MakePointM(-410,490,0)),10,20)' -- Run the query ! SELECT track_id, dist FROM ( SELECT track_id, ST_DistanceCPA(tr,:qt) dist FROM trajectories ORDER BY tr |=| :qt LIMIT 5 ) foo; track_id dist ----------+------------------- 395 | 0.576496831518066 380 | 5.06797130410151 390 | 7.72262293958322 385 | 9.8004461358071 405 | 10.9534397988433 (5 rows)
<#> — 返回 A 和 B 边界框之间的 2D 距离。
double precision <#>(
geometry A , geometry B )
;
<#>
运算符返回两个浮点边界框之间的距离,可能从空间索引中读取它们(需要 PostgreSQL 9.1)。 对于进行最近邻近似距离排序很有用。
![]() | |
该操作符将利用几何上可能可用的任何索引。 它与其他使用空间索引的运算符不同,只有当该运算符位于 ORDER BY 子句中时才会使用空间索引。 |
![]() | |
仅当其中一个几何图形是常量时,索引才会生效,例如 ORDER BY (ST_GeomFromText('POINT(1 2)') <#> geom) 而不是 g1.geom <#> 。 |
可用性:2.0.0——KNN 仅适用于 PostgreSQL 9.1+
SELECT * FROM ( SELECT b.tlid, b.mtfcc, b.geom <# > ST_GeomFromText('LINESTRING(746149 2948672,745954 2948576, 745787 2948499,745740 2948468,745712 2948438, 745690 2948384,745677 2948319)',2249) As b_dist, ST_Distance(b.geom, ST_GeomFromText('LINESTRING(746149 2948672,745954 2948576, 745787 2948499,745740 2948468,745712 2948438, 745690 2948384,745677 2948319)',2249)) As act_dist FROM bos_roads As b ORDER BY b_dist, b.tlid LIMIT 100) As foo ORDER BY act_dist, tlid LIMIT 10; tlid | mtfcc | b_dist | act_dist -----------+-------+------------------+------------------ 85732027 | S1400 | 0 | 0 85732029 | S1400 | 0 | 0 85732031 | S1400 | 0 | 0 85734335 | S1400 | 0 | 0 85736037 | S1400 | 0 | 0 624683742 | S1400 | 0 | 128.528874268666 85719343 | S1400 | 260.839270432962 | 260.839270432962 85741826 | S1400 | 164.759294123275 | 260.839270432962 85732032 | S1400 | 277.75 | 311.830282365264 85735592 | S1400 | 222.25 | 311.830282365264 (10 rows)
<<->> — 返回 A 和 B 几何图形或边界框之间的 n 维距离
double precision <<->>(
geometry A , geometry B )
;
<<->>
运算符返回两个几何图之间的 n 维(欧几里德)距离。 对于进行最 近邻近似距离排序很有用。
![]() | |
该操作数将利用几何上可能可用的 n-D GiST 索引。 它与其他使用空间索引的运算符不同,只有当该运算符位于 ORDER BY 子句中时才会使用空间索引。 |
![]() | |
仅当其中一个几何图形是常量(不在子查询/cte 中)时,索引才会启动。 例如 'SRID=3005;POINT(1011102 450541)'::geometry 而不是 a.geom |
可用性:2.2.0——KNN 仅适用于 PostgreSQL 9.1+
这些函数决定了几何图形之间的空间关系。
ST_3DIntersects — 检测两个几何图形在 3D 空间中是否相交 - 仅适用于点、线串、多边形、多面体曲面(区域)
boolean ST_3DIntersects(
geometry geomA , geometry geomB )
;
重叠、接触、内在都意味着空间交叉。 如果上述任何一个返回 true,则几何图形也在空间上相交。 不相交意味着空间相交为假。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 |
![]() | |
由于浮点数精度问题,几何处理后,几何体不会总是像您期望的那样相交。例如,到几何体上的线串的最近点可能不位于线串上。对于这种情况,如果您希望将一厘米的距离视为相交,可以使用ST_3DDWithin 函数。 |
更改:3.0.0 删除了 SFCGAL 后端,GEOS 后端支持 TIN。
可用性: 2.0.0
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
SELECT ST_3DIntersects(pt, line), ST_Intersects(pt, line) FROM (SELECT 'POINT(0 0 2)'::geometry As pt, 'LINESTRING (0 0 1, 0 2 3)'::geometry As line) As foo; st_3dintersects | st_intersects -----------------+--------------- f | t (1 row)
SELECT ST_3DIntersects('TIN(((0 0 0,1 0 0,0 1 0,0 0 0)))'::geometry, 'POINT(.1 .1 0)'::geometry); st_3dintersects ----------------- t
ST_Contains — 测试 B 的每个点是否都位于 A 中,并且它们的内部是否有一个共同点
boolean ST_Contains(
geometry geomA, geometry geomB)
;
如果几何图形 A 包含几何图形 B,则返回 TRUE。当且仅当 B 的所有点都位于 A 内部(即在 A 的内部或边界中)时,A 包含 B(或者等效地,B 中没有点位于 A 的外部),并且 A 和 B 的内部至少有一个共同点。
用数学术语来说: ST_Contains(A, B) ⇔ (A ⋂ B = B) ∧ (Int(A) ⋂ Int(B) ≠ ∅)
包含关系是自反的:每个几何图形都包含其自身。 (相反,在ST_ContainsProperly谓词中,几何图形未正确包含自身。)该关系是反对称的:如果 ST_Contains(A,B) = true
且 ST_Contains(B,A) = true
,则两个几何图形必须在拓扑上相等 ( ST_Equals(A,B) = true
)。
ST_Contains 与 ST_Within相反。 因此,ST_Contains(A,B) = ST_Within(B,A)
。
![]() | |
因为内部必须有一个公共点,所以定义的一个微妙之处是多边形和线不包含完全位于其边界内的线和点。 有关更多详细信息,请参阅 OGC涵盖、包含、内部的微妙之处。 ST_Covers 谓词提供了更具包容性的关系。 |
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 要避免使用索引,请使用函数 |
它是通过GEOS模块实现的
增强:2.3.0 PIP 短路(快速判断仅限于多边形和点)已得到增强,以支持具有更少点的多点。 以前的版本仅支持面和点组合。
![]() | |
增强:3.0.0 启用了对 |
![]() | |
请勿将此函数用于无效的几何图形。 你会得到意想不到的结果。 |
注意:这是返回布尔值而不是整数的“允许”版本。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 // s2.1.13.3 - 与内部相同(几何 B、几何 A)
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.31
ST_Contains
在以下情况下返回 TRUE
:
![]()
| ![]()
|
![]()
| ![]()
|
ST_Contains
在以下情况下返回 FALSE
:
![]()
| ![]()
|
由于内部相交条件,ST_Contains
在以下情况下返回 FALSE
(而 ST_Covers
返回 TRUE
):
![]()
| ![]()
|
-- A circle within a circle SELECT ST_Contains(smallc, bigc) As smallcontainsbig, ST_Contains(bigc,smallc) As bigcontainssmall, ST_Contains(bigc, ST_Union(smallc, bigc)) as bigcontainsunion, ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; -- Result smallcontainsbig | bigcontainssmall | bigcontainsunion | bigisunion | bigcoversexterior | bigcontainsexterior ------------------+------------------+------------------+------------+-------------------+--------------------- f | t | t | t | t | f -- Example demonstrating difference between contains and contains properly SELECT ST_GeometryType(geomA) As geomtype, ST_Contains(geomA,geomA) AS acontainsa, ST_ContainsProperly(geomA, geomA) AS acontainspropa, ST_Contains(geomA, ST_Boundary(geomA)) As acontainsba, ST_ContainsProperly(geomA, ST_Boundary(geomA)) As acontainspropba FROM (VALUES ( ST_Buffer(ST_Point(1,1), 5,1) ), ( ST_MakeLine(ST_Point(1,1), ST_Point(-1,-1) ) ), ( ST_Point(1,1) ) ) As foo(geomA); geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba --------------+------------+----------------+-------------+----------------- ST_Polygon | t | f | f | f ST_LineString | t | f | f | f ST_Point | t | t | f | f
ST_ContainsProperly — 测试 B 的每个点是否都位于 A 的内部
boolean ST_ContainsProperly(
geometry geomA, geometry geomB)
;
如果 B 的每个点都位于 A 的内部(或者等效地,B 的任何点都不位于 A 的边界或外部),则返回 true
。
用数学术语来说: ST_ContainsProperly(A, B) ⇔ Int(A) ⋂ B = B
如果两个几何图形的 DE-9IM 交集矩阵匹配 [T**FF*FF*],则 A 正确包含 B
A 没有正确地包含自身,但确实包含自身。
计算一组几何图形与大型多边形几何图形的交集时,请使用此谓词。 交叉点相当慢,因此您可以使用 ContainsProperly 提取完全位于该区域内的感兴趣的几何图形,这非常高效。 在这些场景中,直观地看出交集确实是原始目标几何体。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 要避免使用索引,请使用函数 |
![]() | |
该谓词相对于 ST_Contains 和 ST_Intersects 的优点是可以更有效地计算,无需计算各个点的拓扑。 |
这个函数是由 GEOS 模块执行的。
可用性:1.4.0
![]() | |
增强:3.0.0 启用了对 |
![]() | |
请勿将此函数用于无效的几何图形。 你会得到意想不到的结果。 |
--a circle within a circle SELECT ST_ContainsProperly(smallc, bigc) As smallcontainspropbig, ST_ContainsProperly(bigc,smallc) As bigcontainspropsmall, ST_ContainsProperly(bigc, ST_Union(smallc, bigc)) as bigcontainspropunion, ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_ContainsProperly(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; --Result smallcontainspropbig | bigcontainspropsmall | bigcontainspropunion | bigisunion | bigcoversexterior | bigcontainsexterior ------------------+------------------+------------------+------------+-------------------+--------------------- f | t | f | t | t | f --example demonstrating difference between contains and contains properly SELECT ST_GeometryType(geomA) As geomtype, ST_Contains(geomA,geomA) AS acontainsa, ST_ContainsProperly(geomA, geomA) AS acontainspropa, ST_Contains(geomA, ST_Boundary(geomA)) As acontainsba, ST_ContainsProperly(geomA, ST_Boundary(geomA)) As acontainspropba FROM (VALUES ( ST_Buffer(ST_Point(1,1), 5,1) ), ( ST_MakeLine(ST_Point(1,1), ST_Point(-1,-1) ) ), ( ST_Point(1,1) ) ) As foo(geomA); geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba --------------+------------+----------------+-------------+----------------- ST_Polygon | t | f | f | f ST_LineString | t | f | f | f ST_Point | t | t | f | f
ST_CoveredBy — 测试 A 的每个点是否都位于 B 中
boolean ST_CoveredBy(
geometry geomA, geometry geomB)
;
boolean ST_CoveredBy(
geography geogA, geography geogB)
;
如果几何/地理 A 中的每个点都位于几何/地理 B 的内部(即与其内部或边界相交),则返回 true
。换句话说,测试 A 是否没有位于 B 之外的点。
用数学术语来说: ST_CoveredBy(A, B) ⇔ A ⋂ B = A
ST_CoveredBy 与 ST_Covers相反。 因此,ST_CoveredBy(A,B) = ST_Covers(B,A)
。
一般来说,应该使用此函数而不是ST_Within,因为它具有更简单的定义,不存在“边界不在其几何形状内”的奇怪情况。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 要避免使用索引,请使用函数 |
![]() | |
增强:3.0.0 启用了对 |
![]() | |
请勿将此函数用于无效的几何图形。 你会得到意想不到的结果。 |
它是通过GEOS模块实现的
可用性:1.2.2
注意:这是返回布尔值而不是整数的“允许”版本。
不是 OGC 标准,但 Oracle 也有。
--a circle coveredby a circle SELECT ST_CoveredBy(smallc,smallc) As smallinsmall, ST_CoveredBy(smallc, bigc) As smallcoveredbybig, ST_CoveredBy(ST_ExteriorRing(bigc), bigc) As exteriorcoveredbybig, ST_Within(ST_ExteriorRing(bigc),bigc) As exeriorwithinbig FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; --Result smallinsmall | smallcoveredbybig | exteriorcoveredbybig | exeriorwithinbig --------------+-------------------+----------------------+------------------ t | t | t | f (1 row)
ST_Covers — 测试 B 的每个点是否都位于 A 中
boolean ST_Covers(
geometry geomA, geometry geomB)
;
boolean ST_Covers(
geography geogpolyA, geography geogpointB)
;
如果几何/地理 B 中的每个点都位于几何/地理 A 内部(即与其内部或边界相交),则返回 true
。同样,测试 B 中没有点位于 A 外部(外部)。
用数学术语来说:ST_Covers(A, B) ⇔ A ⋂ B = B
ST_Covers 与 ST_CoveredBy相反。 因此,ST_Covers(A,B) = ST_CoveredBy(B,A)
。
一般来说,应该使用这个函数而不是ST_Contains,因为它有一个更简单的定义,不存在“几何图形不包含其边界”的奇怪情况。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 为了避免使用索引,请使用函数 |
![]() | |
增强:3.0.0 启用了对 |
![]() | |
请勿将此函数用于无效的几何图形。 你会得到意想不到的结果。 |
它是通过GEOS模块实现的
增强:2.4.0 为地理类型添加了对多边形中的多边形和多边形中的线的支持
增强:对于 2.3.0 几何图形,PIP 短路(仅限于多边形和点的快速判断)已得到增强,以支持由更少点组成的多点。 以前的版本仅支持面和点组合。
可用性:1.5 - 引入了地理支持。
可用性:1.2.2
注意:这是返回布尔值而不是整数的“允许”版本。
不是 OGC 标准,但 Oracle 也有。
几何示例
--a circle covering a circle SELECT ST_Covers(smallc,smallc) As smallinsmall, ST_Covers(smallc, bigc) As smallcoversbig, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; --Result smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior --------------+----------------+-------------------+--------------------- t | f | t | f (1 row)
地理示例
-- a point with a 300 meter buffer compared to a point, a point and its 10 meter buffer SELECT ST_Covers(geog_poly, geog_pt) As poly_covers_pt, ST_Covers(ST_Buffer(geog_pt,10), geog_pt) As buff_10m_covers_cent FROM (SELECT ST_Buffer(ST_GeogFromText('SRID=4326;POINT(-99.327 31.4821)'), 300) As geog_poly, ST_GeogFromText('SRID=4326;POINT(-99.33 31.483)') As geog_pt ) As foo; poly_covers_pt | buff_10m_covers_cent ----------------+------------------ f | t
ST_Crosses — 测试两个几何图形是否有一些(但不是全部)共同的内点
boolean ST_Crosses(
geometry g1, geometry g2)
;
比较两个几何对象,如果它们的交集“空间交叉”,则返回 true
; 也就是说,几何图形有一些但不是所有的内部点是共同的。 几何图形内部的交集必须非空,并且维度必须小于两个输入几何图形的最大维度,并且两个几何图形的交集不得等于任一几何图形。 否则,返回 false
。 交叉关系是对称且非自反的。
用数学术语来说: ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) < max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)
如果 DE-9IM 交集矩阵匹配,则几何图形交叉:
T*T*****
适用于点/线、点/面和线/面情况
T***T**
用于线/点、区域/点和区域/线情况
0********
用于线/线情况
对于点/点和区域/区域情况,结果是false
![]() | |
OpenGIS 简单要素规范仅针对点/线、点/面、线/线和线/面情况定义此谓词。 JTS / GEOS 扩展了定义,也适用于线/点、区域/点和区域/线情况。 这使得关系对称。 |
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 |
![]() | |
增强:3.0.0 启用了对 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.13.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.29
以下情况均返回true
。
![]()
| ![]()
|
![]()
| ![]()
|
考虑用户有两个表的情况:道路表和高速公路表。
CREATE TABLE roads ( id serial NOT NULL, geom geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
CREATE TABLE highways ( id serial NOT NULL, the_gem geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
要确定穿过高速公路的道路列表,请使用类似于以下内容的查询:
SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.geom, highways.geom);
ST_Disjoint — 测试两个几何图形是否没有共同点
boolean ST_Disjoint(
geometry A , geometry B )
;
如果两个几何图形不相交,则返回 true
。 如果几何图形没有共同点,那么它们就是不相交的。
如果另一个空间关系为 TRUE,则两个几何不连接。 如果未连接,则ST_Intersects返回 FALSE。
用数学术语来说:ST_Disjoint(A, B) ⇔ A ⋂ B = ∅
![]() | |
增强:3.0.0 启用了对 |
它是通过GEOS模块实现的
![]() | |
该函数调用不使用索引。 否定的ST_Intersects 谓词可用作使用索引的更高效的替代方案: |
![]() | |
注意:这是返回布尔值而不是整数的“允许”版本。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 //s2.1.13.3 - a.Relate(b, 'FF*FF****')
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.26
SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); st_disjoint --------------- t (1 row) SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry); st_disjoint --------------- f (1 row)
ST_Equals — 测试两个几何图形是否包含同一组点
boolean ST_Equals(
geometry A, geometry B)
;
如果给定的几何图形“拓扑相等”,则返回 true
。 使用它可以获得比“=”更好的答案。 拓扑相等意味着几何具有相同的维度,并且它们的点集占据相同的空间。 这意味着在拓扑相等的几何中,顶点的顺序可能不同。 要验证点的顺序是否一致,请使用ST_OrderingEquals(必须注意 ST_OrderingEquals 比简单地验证点的顺序是否相同更严格)。
用数学术语来说:ST_Equals(A, B) ⇔ A = B
以下关系成立: ST_Equals(A, B) ⇔ ST_Within(A,B) ∧ ST_Within(B,A)
![]() | |
增强:3.0.0 启用了对 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.24
更改:2.2.0 即使对于无效几何图形,如果它们二进制相等,也会返回 true
SELECT ST_Equals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')); st_equals ----------- t (1 row) SELECT ST_Equals(ST_Reverse(ST_GeomFromText('LINESTRING(0 0, 10 10)')), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')); st_equals ----------- t (1 row)
ST_Intersects — 测试两个几何图形是否相交(它们至少有一个共同点)
boolean ST_Intersects(
geometry geomA , geometry geomB )
;
boolean ST_Intersects(
geography geogA , geography geogB )
;
如果两个几何图形相交,则返回 true
。 如果几何图形有任何共同点,则它们相交。
对于地理,使用 0.00001 米的距离容差(因此非常接近的点被视为相交)。
用数学术语来说:ST_Intersects(A, B) ⇔ A ⋂ B ≠ ∅
如果几何图形的 DE-9IM 交集矩阵与以下之一匹配,则几何图形相交:
T********
*T*******
***T*****
****T****
所有其他空间关系测试都隐含空间相交,但 ST_Disjoint 除外,它测试几何形状不相交。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 |
更改:3.0.0删除了 SFCGAL 版本并添加了对 2D TINS 的本机支持。
增强:2.5.0 支持 GEOMETRYCOLLECTION。
增强:2.3.0 PIP 短路(快速判断仅限于多边形和点)已得到增强,以支持具有更少点的多点。 以前的版本仅支持面和点组合。
由 GEOS 模块(用于几何)执行,地理是原生的
可用性:1.5 引入了对地理的支持。
![]() | |
对于地理来说,该函数的距离容差约为 0.00001 米,并且使用球体而不是椭球体计算。 |
![]() | |
注意:这是返回布尔值而不是整数的“允许”版本。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 //s2.1.13.3 - ST_Intersects(g1, g2 ) --> Not (ST_Disjoint(g1, g2 ))
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.27
此方法支持圆形字符串和曲线。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); st_intersects --------------- f (1 row) SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry); st_intersects --------------- t (1 row) -- Look up in table. Make sure table has a GiST index on geometry column for faster lookup. SELECT id, name FROM cities WHERE ST_Intersects(geom, 'SRID=4326;POLYGON((28 53,27.707 52.293,27 52,26.293 52.293,26 53,26.293 53.707,27 54,27.707 53.707,28 53))'); id | name ----+------- 2 | Minsk (1 row)
SELECT ST_Intersects( 'SRID=4326;LINESTRING(-43.23456 72.4567,-43.23456 72.4568)'::geography, 'SRID=4326;POINT(-43.23456 72.4567772)'::geography ); st_intersects --------------- t
ST_LineCrossingDirection — 返回一个数字,指示两个 LineString 的交叉行为
integer ST_LineCrossingDirection(
geometry linestringA, geometry linestringB)
;
给定两个线串返回一个介于 -3 和 3 之间的整数,指示它们之间存在哪种交叉行为。 0表示没有交叉。 仅 LINESTRING
支持此功能。
交叉编号的含义如下:
0:线无交叉
-1:向左交叉线
1:向右交叉线
-2:表示一条线段多次交叉,并且最后一次交叉是从左侧
2:表示一条线段多次交叉,并且最后一次交叉是从右侧
-3:表示一条线段多次交叉,但最后一次交叉是从同一侧(首次)的左侧
3:表示一条线段多次交叉,但最后一次交叉是从同一侧(首次)的右侧
有效性:1.4
示例: 向左交叉线和向右交叉线
蓝色:线A;绿色:线B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B, ST_LineCrossingDirection(lineB, lineA) As B_cross_A FROM (SELECT ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA, ST_GeomFromText('LINESTRING (20 140, 71 74, 161 53)') As lineB ) As foo; A_cross_B | B_cross_A -----------+----------- -1 | 1
示例: 一条线段多次交叉并且最后一次交叉从同一侧(首次)左侧和一条线段多次交叉并且最后一次交叉从同一侧(首次)右侧
蓝色:线A;绿色:线B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B, ST_LineCrossingDirection(lineB, lineA) As B_cross_A FROM (SELECT ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA, ST_GeomFromText('LINESTRING(171 154,20 140,71 74,161 53)') As lineB ) As foo; A_cross_B | B_cross_A -----------+----------- 3 | -3
示例: 一条线段多次交叉并且最后一次交叉从左侧和一条线段多次交叉并且最后一次交叉从右侧
蓝色:线A;绿色:线B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B, ST_LineCrossingDirection(lineB, lineA) As B_cross_A FROM (SELECT ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA, ST_GeomFromText('LINESTRING(5 90, 71 74, 20 140, 171 154)') As lineB ) As foo; A_cross_B | B_cross_A -----------+----------- -2 | 2
示例: 查找所有交叉的街道
SELECT s1.gid, s2.gid, ST_LineCrossingDirection(s1.geom, s2.geom) FROM streets s1 CROSS JOIN streets s2 ON (s1.gid != s2.gid AND s1.geom && s2.geom ) WHERE ST_LineCrossingDirection(s1.geom, s2.geom) > 0;
ST_OrderingEquals — 测试两个几何图形是否表示相同的几何图形并且具有相同方向顺序的点
boolean ST_OrderingEquals(
geometry A, geometry B)
;
ST_OrderingEquals 比较两个几何图形,如果几何图形相等且坐标顺序相同,则返回 t (TRUE); 否则返回 f (FALSE)。
![]() | |
此函数是根据 ArcSDE SQL 规范而不是 SQL-MM 实现的。 http://edndoc.esri.com/arcsde/9.1/sql_api/sqlapi3.htm#ST_OrderingEquals |
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.43
SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')); st_orderingequals ----------- f (1 row) SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 0 0, 10 10)')); st_orderingequals ----------- t (1 row) SELECT ST_OrderingEquals(ST_Reverse(ST_GeomFromText('LINESTRING(0 0, 10 10)')), ST_GeomFromText('LINESTRING(0 0, 0 0, 10 10)')); st_orderingequals ----------- f (1 row)
ST_Overlaps — 测试两个几何图形是否具有相同的维度和相交,但每个几何图形至少有一个点不在另一个几何图形中
boolean ST_Overlaps(
geometry A, geometry B)
;
如果几何图形 A 和 B “空间重叠”,则返回 TRUE。 如果两个几何图形具有相同的维度,并且内部界面在同一维度中相交,并且至少有一个点在另一个点之外(相当于一个点没有覆盖另一个点),则称两个几何重叠。 重叠关系是对称且不自反的。
用数学术语来说: ST_Overlaps(A, B) ⇔ ( dim(A) = dim(B) = dim( Int(A) ⋂ Int(B) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B )
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 要避免使用索引,请使用函数 |
它是通过GEOS模块实现的
![]() | |
增强:3.0.0 启用了对 |
注意:这是返回布尔值而不是整数的“允许”版本。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 // s2.1.13.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.32
ST_Overlaps
在以下情况返回TRUE
:
![]()
| ![]()
| ![]()
|
包含 LineString 上的点,但由于它的维度较低,因此不会重叠或交叉。
SELECT ST_Overlaps(a,b) AS overlaps, ST_Crosses(a,b) AS crosses, ST_Intersects(a, b) AS intersects, ST_Contains(b,a) AS b_contains_a FROM (SELECT ST_GeomFromText('POINT (100 100)') As a, ST_GeomFromText('LINESTRING (30 50, 40 160, 160 40, 180 160)') AS b) AS t overlaps | crosses | intersects | b_contains_a ---------+----------------------+-------------- f | f | t | t
部分覆盖多边形的线串相交和交叉,但不重叠,因为它具有不同的维度。
SELECT ST_Overlaps(a,b) AS overlaps, ST_Crosses(a,b) AS crosses, ST_Intersects(a, b) AS intersects, ST_Contains(a,b) AS contains FROM (SELECT ST_GeomFromText('POLYGON ((40 170, 90 30, 180 100, 40 170))') AS a, ST_GeomFromText('LINESTRING(10 10, 190 190)') AS b) AS t; overlap | crosses | intersects | contains ---------+---------+------------+-------------- f | t | t | f
两个多边形相交,但彼此都不包含对方,它们重叠,但不交叉,因为它们的交集具有相同的维度。
SELECT ST_Overlaps(a,b) AS overlaps, ST_Crosses(a,b) AS crosses, ST_Intersects(a, b) AS intersects, ST_Contains(b, a) AS b_contains_a, ST_Dimension(a) AS dim_a, ST_Dimension(b) AS dim_b, ST_Dimension(ST_Intersection(a,b)) AS dim_int FROM (SELECT ST_GeomFromText('POLYGON ((40 170, 90 30, 180 100, 40 170))') AS a, ST_GeomFromText('POLYGON ((110 180, 20 60, 130 90, 110 180))') AS b) As t; overlaps | crosses | intersects | b_contains_a | dim_a | dim_b | dim_int ----------+---------+------------+--------------+-------+-------+----------- t | f | t | f | 2 | 2 | 2
ST_Relate — 测试两个几何图形是否具有与交集矩阵模式匹配的拓扑关系,或计算它们的交集矩阵
boolean ST_Relate(
geometry geomA, geometry geomB, text intersectionMatrixPattern)
;
text ST_Relate(
geometry geomA, geometry geomB)
;
text ST_Relate(
geometry geomA, geometry geomB, integer boundaryNodeRule)
;
这些函数允许测试和评估两个几何图形之间的空间(拓扑)关系,如维度扩展 九交模型 (DE-9IM) 所定义。
DE-9IM 被指定为 9 元素矩阵,指示两个几何图形的内部、边界和外部之间相交的维度。 它由使用符号“F”、“0”、“1”、“2”的 9 个字符文本字符串表示(例如“FF1FF0102”
)。
可以通过将相交矩阵与相交矩阵模式进行匹配来测试特定类型的空间关系。 模式可以包含附加符号“T”(表示“交集非空”)和“*”(表示“任何值”)。 常见空间关系由命名函数 ST_Contains、ST_ContainsProperly、ST_Covers、ST_CoveredBy、ST_Crosses、ST_Disjoint、ST_Equals、ST_Intersects、ST_Overlaps、ST_Touches和 ST_Within 提供。 使用显式模式可以一步测试相交、交叉等多种条件。 它还允许测试没有命名空间关系函数的空间关系。 例如,关系“Interior-Intersects”具有 DE-9IM 模式 T********
,该模式不由任何命名谓词求值。
有关更多信息,请参见Section 5.1, “空间关系的确定”。
形式 1:根据给定的 junctionMatrixPattern
测试两个几何图形是否在空间上相关。
![]() | |
与大多数命名空间关系谓词不同,这不会自动包含索引调用。 原因是某些关系对于不相交的几何图形是正确的(例如不相交)。 如果您使用需要交集的关系模式,请在函数调用中包含 &&。 |
![]() | |
如果可用,最好使用命名关系函数,因为它们会自动使用存在的空间索引。 此外,他们还可以实现完全相关评估所无法实现的性能优化。 |
形式 2:返回两个输入几何之间的空间关系的 DE-9IM 矩阵字符串。 可以使用 ST_RelateMatch 测试矩阵字符串与 DE-9IM 模式匹配。
形式 3:与形式 2 类似,但允许指定边界节点规则。 边界节点规则允许更好地控制 MultiLineString 的端点是否被视为位于 DE-9IM 内部或边界内。 boundaryNodeRule
值为:
1
:OGC-Mod2 - 如果线条端点出现奇数次,则它们位于边界内。 这是 OGC SFS 标准定义的规则,也是 ST_Relate
的默认规则。
2
:Endpoint - 所有端点都在边界内。
3
:MultivalentEndpoint - 如果端点出现多次,则它们位于边界内。 换句话说,边界是所有“附加”或“内部”端点(但不是“未附加/外部”端点)。
4
:MonovalentEndpoint - 如果端点仅出现一次,则端点位于边界内。 换句话说,边界是所有“未连接”或“外部”端点。
OGC 规范中没有此函数,但它是隐含的。 见s2.1.13.2
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 // s2.1.13.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.25
它是通过GEOS模块实现的
增强:2.0.0 - 添加了对指定边界节点规则的支持。
![]() | |
增强:3.0.0 启用了对 |
使用布尔值函数测试空间关系。
SELECT ST_Relate('POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '0FFFFF212'); st_relate ----------- t SELECT ST_Relate(POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '*FF*FF212'); st_relate ----------- t
测试一个自定义的空间关系模式作为查询条件,使用&&
来启用空间索引。
-- Find compounds that properly intersect (not just touch) a poly (Interior Intersects) SELECT c.* , p.name As poly_name FROM polys AS p INNER JOIN compounds As c ON c.geom && p.geom AND ST_Relate(p.geom, c.geom,'T********');
计算空间关系的交集矩阵。
SELECT ST_Relate( 'POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2)); ----------- 0FFFFF212 SELECT ST_Relate( 'LINESTRING(1 2, 3 4)', 'LINESTRING(5 6, 7 8)' ); ----------- FF1FF0102
使用不同的边界节点规则来计算具有重复端点的 LineString 和 MultiLineString 之间的空间关系 (3 3)
:
使用 OGC-Mod2 规则 (1),重复端点位于 MultiLineString 的内部,因此 DE-9IM 矩阵条目 [aB:bI] 为 0
,[aB:bB] 为 F
。
使用Endpoint规则 (2),重复端点位于 MultiLineString 的边界中,因此 DE-9IM 矩阵条目 [aB:bI] 为 F
,[aB:bB] 为 0
。
WITH data AS (SELECT 'LINESTRING(1 1, 3 3)'::geometry AS a_line, 'MULTILINESTRING((3 3, 3 5), (3 3, 5 3))':: geometry AS b_multiline ) SELECT ST_Relate( a_line, b_multiline, 1) AS bnr_mod2, ST_Relate( a_line, b_multiline, 2) AS bnr_endpoint FROM data; bnr_mod2 | bnr_endpoint -----------+-------------- FF10F0102 | FF1F00102
ST_RelateMatch — 测试 DE-9IM 交集矩阵是否与交集矩阵模式匹配
boolean ST_RelateMatch(
text intersectionMatrix, text intersectionMatrixPattern)
;
测试维度扩展 九 交模型 (DE-9IM) 交集矩阵
值是否满足交集矩阵模式
。 交集矩阵值可以通过ST_Relate 计算。
有关更多信息,请参见Section 5.1, “空间关系的确定”。
它是通过GEOS模块实现的
可用性: 2.0.0
SELECT ST_RelateMatch('101202FFF', 'TTTTTTFFF') ; -- result -- t
对于相对于多边形处于不同位置的线,常见空间关系的模式与相交矩阵值相匹配
SELECT pat.name AS relationship, pat.val AS pattern, mat.name AS position, mat.val AS matrix, ST_RelateMatch(mat.val, pat.val) AS match FROM (VALUES ( 'Equality', 'T1FF1FFF1' ), ( 'Overlaps', 'T*T***T**' ), ( 'Within', 'T*F**F***' ), ( 'Disjoint', 'FF*FF****' )) AS pat(name,val) CROSS JOIN (VALUES ('non-intersecting', 'FF1FF0212'), ('overlapping', '1010F0212'), ('inside', '1FF0FF212')) AS mat(name,val); relationship | pattern | position | matrix | match --------------+-----------+------------------+-----------+------- Equality | T1FF1FFF1 | non-intersecting | FF1FF0212 | f Equality | T1FF1FFF1 | overlapping | 1010F0212 | f Equality | T1FF1FFF1 | inside | 1FF0FF212 | f Overlaps | T*T***T** | non-intersecting | FF1FF0212 | f Overlaps | T*T***T** | overlapping | 1010F0212 | t Overlaps | T*T***T** | inside | 1FF0FF212 | f Within | T*F**F*** | non-intersecting | FF1FF0212 | f Within | T*F**F*** | overlapping | 1010F0212 | f Within | T*F**F*** | inside | 1FF0FF212 | t Disjoint | FF*FF**** | non-intersecting | FF1FF0212 | t Disjoint | FF*FF**** | overlapping | 1010F0212 | f Disjoint | FF*FF**** | inside | 1FF0FF212 | f
ST_Touches — 测试两个几何图形是否至少有一个共同点,但它们的内部不相交
boolean ST_Touches(
geometry A, geometry B)
;
如果 A 和 B 相交,但它们的内部不相交,则返回 TRUE
。 等价地,A和B至少有一个公共点,并且公共点至少位于一个边界内。 对于点/点输入,关系始终为 FALSE
,因为点没有边界。
In mathematical terms: ST_Touches(A, B) ⇔ (Int(A) ⋂ Int(B) = ∅) ∧ (A ⋂ B ≠ ∅)
如果两个几何图形的 DE-9IM 交集矩阵匹配以下之一,则此关系成立:
FT*******
F**T*****
F***T****
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 要避免使用索引,请改用 |
![]() | |
增强:3.0.0 启用了对 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 // s2.1.13.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.28
ST_Touches
谓词在以下示例中返回 TRUE
。
![]()
| ![]()
| ![]()
|
![]()
| ![]()
| ![]()
|
SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(1 1)'::geometry); st_touches ------------ f (1 row) SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(0 2)'::geometry); st_touches ------------ t (1 row)
ST_Within — 测试 A 的每个点是否都位于 B 中,并且它们的内部是否有一个共同点
boolean ST_Within(
geometry A, geometry B)
;
如果几何对象 A 完全包含在几何对象 B 内部(即 A 的所有点都在 B 的内部或边界上),并且 A 和 B 的内部至少有一个公共点,则返回 TRUE。等价地,A 在 B 中,当且仅当 A 的所有点都位于 B 的内部(包括边界),且 A 和 B 的内部至少有一个点重叠。
为了使此函数有意义,源几何图形必须具有相同的坐标投影,并具有相同的 SRID。
用数学术语来说: ST_Within(A, B) ⇔ (A ⋂ B = A) ∧ (Int(A) ⋂ Int(B) ≠ ∅)
内部关系是自反的:每个几何体都在其自身之内。 该关系是反对称的:如果 ST_Within(A,B) = true
且 ST_Within(B,A) = true
,则两个几何图形在拓扑上必须相等 (ST_Equals(A,B) = true
)。
ST_Within 与 ST_Contains 相反。 因此,ST_Within(A,B) = ST_Contains(B,A)
。
![]() | |
因为内部必须有一个公共点,所以定义的一个微妙之处在于,完全位于多边形或线的边界内的线和点不在几何内部。 有关更多详细信息,请参阅 OGC覆盖、包含、内部的微妙之处。 ST_CoveredBy 谓词提供了更具包容性的关系。 |
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 要避免使用索引,请使用函数 |
它是通过GEOS模块实现的
增强:对于 2.3.0 几何图形,PIP 短路(仅限于多边形和点的快速判断)已得到增强,以支持由更少点组成的多点。 以前的版本仅支持面和点组合。
![]() | |
增强:3.0.0 启用了对 |
![]() | |
请勿将此函数用于无效的几何图形。 你会得到意想不到的结果。 |
注意:这是返回布尔值而不是整数的“允许”版本。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.2 // s2.1.13.3 - a.Relate(b, 'T*F**F***')
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.30
--a circle within a circle SELECT ST_Within(smallc,smallc) As smallinsmall, ST_Within(smallc, bigc) As smallinbig, ST_Within(bigc,smallc) As biginsmall, ST_Within(ST_Union(smallc, bigc), bigc) as unioninbig, ST_Within(bigc, ST_Union(smallc, bigc)) as biginunion, ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion FROM ( SELECT ST_Buffer(ST_GeomFromText('POINT(50 50)'), 20) As smallc, ST_Buffer(ST_GeomFromText('POINT(50 50)'), 40) As bigc) As foo; --Result smallinsmall | smallinbig | biginsmall | unioninbig | biginunion | bigisunion --------------+------------+------------+------------+------------+------------ t | t | f | t | t | t (1 row)
ST_3DDWithin — 测试两个 3D 几何图形是否在给定的 3D 距离内
boolean ST_3DDWithin(
geometry g1, geometry g2, double precision distance_of_srid)
;
如果两个几何值之间的 3D 距离不大于距离 distance_of_srid
,则返回 true。 距离以几何空间参考系统定义的单位指定。 为了使此函数有意义,源几何图形必须位于同一坐标系中(具有相同的 SRID)。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 |
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
该方法实现了SQL/MM规范。 SQL-MM ?
可用性: 2.0.0
-- Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line) -- Note: currently no vertical datum support so Z is not transformed and assumed to be same units as final. SELECT ST_3DDWithin( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163), 126.8 ) As within_dist_3d, ST_DWithin( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163), 126.8 ) As within_dist_2d; within_dist_3d | within_dist_2d ----------------+---------------- f | t
ST_3DDFullyWithin — 测试两个 3D 几何图形是否完全在给定的 3D 距离内
boolean ST_3DDFullyWithin(
geometry g1, geometry g2, double precision distance)
;
如果 3D 几何图形彼此完全在指定距离内,则返回 true。 距离以几何空间参考系统定义的单位指定。 为了使此函数有意义,源几何图形必须具有相同的坐标投影,并具有相同的 SRID。
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 |
可用性: 2.0.0
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
-- This compares the difference between fully within and distance within as well -- as the distance fully within for the 2D footprint of the line/point vs. the 3d fully within SELECT ST_3DDFullyWithin(geom_a, geom_b, 10) as D3DFullyWithin10, ST_3DDWithin(geom_a, geom_b, 10) as D3DWithin10, ST_DFullyWithin(geom_a, geom_b, 20) as D2DFullyWithin20, ST_3DDFullyWithin(geom_a, geom_b, 20) as D3DFullyWithin20 from (select ST_GeomFromEWKT('POINT(1 1 2)') as geom_a, ST_GeomFromEWKT('LINESTRING(1 5 2, 2 7 20, 1 9 100, 14 12 3)') as geom_b) t1; d3dfullywithin10 | d3dwithin10 | d2dfullywithin20 | d3dfullywithin20 ------------------+-------------+------------------+------------------ f | t | t | f
ST_DFullyWithin — Tests if a geometry is entirely inside a distance of another
boolean ST_DFullyWithin(
geometry g1, geometry g2, double precision distance)
;
Returns true if g2
is entirely within distance
of g1
. Visually, the condition is true if g2
is contained within a distance
buffer of g1
. The distance is specified in units defined by the spatial reference system of the geometries.
![]() | |
此功能自动包括利用几何上可用的任何空间索引的边界框比较。 |
可用性:1.1.0
Changed: 3.5.0 : the logic behind the function now uses a test of containment within a buffer, rather than the ST_MaxDistance algorithm. Results will differ from prior versions, but should be closer to user expectations.
SELECT ST_DFullyWithin(geom_a, geom_b, 10) AS DFullyWithin10, ST_DWithin(geom_a, geom_b, 10) AS DWithin10, ST_DFullyWithin(geom_a, geom_b, 20) AS DFullyWithin20 FROM (VALUES ('POINT(1 1)', 'LINESTRING(1 5, 2 7, 1 9, 14 12)') ) AS v(geom_a, geom_b) dfullywithin10 | dwithin10 | dfullywithin20 ----------------+-----------+---------------- f | t | t
ST_DWithin — 测试两个几何图形是否在给定距离内
boolean ST_DWithin(
geometry g1, geometry g2, double precision distance_of_srid)
;
boolean ST_DWithin(
geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid = true)
;
如果几何图形在给定距离内,则返回 true
对于几何图形:距离以几何图形的空间参考系统定义的单位指定。 为了使此函数有意义,源几何图形必须位于同一坐标系中(具有相同的 SRID)。
对于 地理:单位为米,距离测量默认使用 use_spheroid = true
(使用椭球体)。为了更快的计算,可以使用 use_spheroid = false
,在球面上进行测量。
![]() | |
将 ST_3DDWithin用于 3D 几何图形。 |
![]() | |
此函数调用包括利用几何上可用的任何索引的边界框比较。 |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
可用性:1.5.0 引入了对地理的支持
增强:2.1.0 提高了地理速度。 有关详细信息,请参阅使地理更快。
增强:2.1.0 引入了对弯曲几何形状的支持。
在版本1.3之前,通常会将ST_Expand与 && 和ST_Distance一起使用来测试距离,而在1.3.4之前的版本中,该函数使用了这种逻辑。从1.3.4版本开始,ST_DWithin使用更快速的短路距离函数。
-- Find the nearest hospital to each school -- that is within 3000 units of the school. -- We do an ST_DWithin search to utilize indexes to limit our search list -- that the non-indexable ST_Distance needs to process -- If the units of the spatial reference is meters then units would be meters SELECT DISTINCT ON (s.gid) s.gid, s.school_name, s.geom, h.hospital_name FROM schools s LEFT JOIN hospitals h ON ST_DWithin(s.geom, h.geom, 3000) ORDER BY s.gid, ST_Distance(s.geom, h.geom); -- The schools with no close hospitals -- Find all schools with no hospital within 3000 units -- away from the school. Units is in units of spatial ref (e.g. meters, feet, degrees) SELECT s.gid, s.school_name FROM schools s LEFT JOIN hospitals h ON ST_DWithin(s.geom, h.geom, 3000) WHERE h.gid IS NULL; -- Find broadcasting towers that receiver with limited range can receive. -- Data is geometry in Spherical Mercator (SRID=3857), ranges are approximate. -- Create geometry index that will check proximity limit of user to tower CREATE INDEX ON broadcasting_towers using gist (geom); -- Create geometry index that will check proximity limit of tower to user CREATE INDEX ON broadcasting_towers using gist (ST_Expand(geom, sending_range)); -- Query towers that 4-kilometer receiver in Minsk Hackerspace can get -- Note: two conditions, because shorter LEAST(b.sending_range, 4000) will not use index. SELECT b.tower_id, b.geom FROM broadcasting_towers b WHERE ST_DWithin(b.geom, 'SRID=3857;POINT(3072163.4 7159374.1)', 4000) AND ST_DWithin(b.geom, 'SRID=3857;POINT(3072163.4 7159374.1)', b.sending_range);
ST_PointInsideCircle — 测试点几何图形是否位于由圆心和半径定义的圆内
boolean ST_PointInsideCircle(
geometry a_point, float center_x, float center_y, float radius)
;
如果几何图形是一个点并且位于以 center_x
、center_y
和半径 radius
为圆心的圆内,则返回 true。
![]() | |
不使用空间索引。 请改用 ST_DWithin。 |
可用性:1.2
更改:2.2.0 在之前的版本中,这称为 ST_Point_Inside_Circle
SELECT ST_PointInsideCircle(ST_Point(1,2), 0.5, 2, 3); st_pointinsidecircle ------------------------ t
这些函数计算距离、面积和角度的测量值。 还有一些函数可以计算由测量确定的几何值。
ST_Length
的别名ST_Perimeter
的别名。ST_Area — 返回多边形几何体的面积。
float ST_Area(
geometry g1)
;
float ST_Area(
geography geog, boolean use_spheroid = true)
;
返回多边形几何体的面积。 对于几何类型,计算 2D 笛卡尔(平面)面积,单位由 SRID 指定。 对于地理类型,默认面积是在球体上确定的,单位为平方米。 要使用更快但精度较低的球形模型计算面积,请使用 ST_Area(geog,false)
。
增强:2.0.0 - 引入了对 2D 多面体曲面的支持。
增强:2.2.0 - 使用 GeographicLib 对球体进行测量,以提高准确性和稳健性。 需要 PROJ >= 4.9.0 才能利用新功能。
更改:3.0.0 - 不再依赖 SFCGAL。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 8.1.2, 9.5.3
该函数支持多面体曲面。
![]() | |
对于多面体曲面,仅支持 2D 多面体曲面(不支持 2.5D)。 对于 2.5D,可能会给出非零答案,但仅限于完全位于 XY 平面中的面。 |
返回马萨诸塞州一块土地的面积(以平方英尺为单位),然后乘以换算得到平方米。 请注意,这是以平方英尺为单位,因为 EPSG:2249 是马萨诸塞州平面英尺
select ST_Area(geom) sqft, ST_Area(geom) * 0.3048 ^ 2 sqm from ( select 'SRID=2249;POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))' :: geometry geom ) subquery; ┌─────────┬─────────────┐ │ sqft │ sqm │ ├─────────┼─────────────┤ │ 928.625 │ 86.27208552 │ └─────────┴─────────────┘
返回面积平方英尺并转换为马萨诸塞州平面米 (EPSG:26986) 以获得平方米。 请注意,单位为平方英尺,因为 2249 是马萨诸塞州平面英尺,变换面积的单位是平方米,因为 EPSG:26986 是马萨诸塞州平面米
select ST_Area(geom) sqft, ST_Area(ST_Transform(geom, 26986)) As sqm from ( select 'SRID=2249;POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))' :: geometry geom ) subquery; ┌─────────┬─────────────────┐ │ sqft │ sqm │ ├─────────┼─────────────────┤ │ 928.625 │ 86.272430607008 │ └─────────┴─────────────────┘
使用地理数据类型返回面积平方英尺和平方米。 请注意,我们将几何图形转换为地理图形(在执行此操作之前,请确保您的几何图形位于 WGS 84 长纬度 4326 中)。 地理总是以米为单位。 这只是为了演示比较。 通常您的表将已经存储在地理数据类型中。
select ST_Area(geog) / 0.3048 ^ 2 sqft_spheroid, ST_Area(geog, false) / 0.3048 ^ 2 sqft_sphere, ST_Area(geog) sqm_spheroid from ( select ST_Transform( 'SRID=2249;POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))'::geometry, 4326 ) :: geography geog ) as subquery; ┌──────────────────┬──────────────────┬──────────────────┐ │ sqft_spheroid │ sqft_sphere │ sqm_spheroid │ ├──────────────────┼──────────────────┼──────────────────┤ │ 928.684405784452 │ 927.049336105925 │ 86.2776044979692 │ └──────────────────┴──────────────────┴──────────────────┘
如果您的数据已经是地理数据:
select ST_Area(geog) / 0.3048 ^ 2 sqft, ST_Area(the_geog) sqm from somegeogtable;
ST_Azimuth — 返回两点之间直线的基于北方的方位角。
float ST_Azimuth(
geometry origin, geometry target)
;
float ST_Azimuth(
geography origin, geography target)
;
返回目标点距原点的方位角(以弧度为单位);如果两点重合,则返回 NULL。 方位角是从正 Y 轴(几何)或北子午线(地理)参考的正顺时针角度:北 = 0; 东北=π/4; 东=π/2; 东南=3π/4; 南= π; 西南5π/4; 西=3π/2; 西北 = 7π/4。
对于地理类型,方位角解决方案被称为反解大地测量问题。
方位角是一个数学概念,定义为参考矢量与点之间的角度,角度单位为弧度。 可以使用 PostgreSQL 函数 Degrees()
将结果值(以弧度表示)转换为度数。
方位角可与 ST_Translate结合使用,以沿其垂直轴移动对象。 有关此功能的实现,请参阅 PostGIS wiki 中的 upgis_lineshift()
函数。
可用性:1.1.0
增强:2.0.0 引入了对地理的支持。
增强:2.2.0使用 GeographicLib 对球体进行测量,以提高准确性和稳健性。 需要 PROJ >= 4.9.0 才能利用新功能。
几何方位角(以度为单位)
SELECT degrees(ST_Azimuth( ST_Point(25, 45), ST_Point(75, 100))) AS degA_B, degrees(ST_Azimuth( ST_Point(75, 100), ST_Point(25, 45) )) AS degB_A; dega_b | degb_a ------------------+------------------ 42.2736890060937 | 222.273689006094
![]() 蓝色:原点(25,45); 绿色:目标点(75, 100); 黄色:Y轴或北; 红色:方位角。
| ![]() 蓝色:原点(75, 100); 绿色:目标点(25, 45); 黄色:Y轴或北; 红色:方位角。
|
ST_Angle — 返回由 3 或 4 个点或 2 条线定义的两个向量之间的角度。
float ST_Angle(
geometry point1, geometry point2, geometry point3, geometry point4)
;
float ST_Angle(
geometry line1, geometry line2)
;
计算两个向量之间的顺时针角度。
形式 1:计算点 P1-P2-P3 所围成的角度。 如果提供了第四个点则计算角度点 P1-P2 和 P3-P4
形式 2:计算两个向量 S1-E1 和 S2-E2 之间的角度,由输入线的起点和终点定义
结果是 0 到 2π 弧度之间的正角。 可以使用 PostgreSQL 函数 Degrees()
将弧度结果转换为度数。
请注意,ST_Angle(P1,P2,P3) = ST_Angle(P2,P1,P2,P3)
。
可用性:2.5.0
三点之间的角度
SELECT degrees( ST_Angle('POINT(0 0)', 'POINT(10 10)', 'POINT(20 0)') ); degrees --------- 270
由四个点定义的向量之间的角度
SELECT degrees( ST_Angle('POINT (10 10)', 'POINT (0 0)', 'POINT(90 90)', 'POINT (100 80)') ); degrees ------------------- 269.9999999999999
由线的起点和终点定义的向量之间的角度
SELECT degrees( ST_Angle('LINESTRING(0 0, 0.3 0.7, 1 1)', 'LINESTRING(0 0, 0.2 0.5, 1 0)') ); degrees -------------- 45
ST_ClosestPoint — 返回 g1 上最接近 g2 的 2D 点。 这是从一个几何体到另一个几何体的最短直线的第一个点。
geometry ST_ClosestPoint(
geometry geom1, geometry geom2)
;
geography ST_ClosestPoint(
geography geom1, geography geom2, boolean use_spheroid = true)
;
返回 geom1
上最接近 geom2
的二维点。 这是几何图形之间最短线的第一个点(由 ST_ShortestLine计算)。
![]() | |
如果您有 3D 几何图形,您可能更喜欢使用 ST_3DClosestPoint。 |
增强:3.4.0 - 支持地理。
可用性:1.1.0
Point 和 LineString 的最近点是点本身。 LineString 和 Point 的最近点是线上的点。
SELECT ST_AsText( ST_ClosestPoint(pt,line)) AS cp_pt_line, ST_AsText( ST_ClosestPoint(line,pt)) AS cp_line_pt FROM (SELECT 'POINT (160 40)'::geometry AS pt, 'LINESTRING (10 30, 50 50, 30 110, 70 90, 180 140, 130 190)'::geometry AS line ) AS t; cp_pt_line | cp_line_pt ----------------+------------------------------------------ POINT(160 40) | POINT(125.75342465753425 115.34246575342466)
多边形 A 上距离多边形 B 最近的点
SELECT ST_AsText( ST_ClosestPoint( 'POLYGON ((190 150, 20 10, 160 70, 190 150))', ST_Buffer('POINT(80 160)', 30) )) As ptwkt; ------------------------------------------ POINT(131.59149149528952 101.89887534906197)
ST_3DClosestPoint — 返回 g1 上最接近 g2 的 3D 点。 这是 3D 最短线的第一个点。
geometry ST_3DClosestPoint(
geometry g1, geometry g2)
;
返回 g1 上最接近 g2 的 3 维点。 这是 3D 最短线的第一个点。 3D最短线的3D长度是3D距离。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
可用性: 2.0.0
更改:2.2.0 - 如果输入 2 个 2D 几何图形,则返回 2D 点(而不是假设缺失 Z 为 0 的旧行为)。 在 2D 和 3D 情况下,对于缺失的 Z,Z 不再被假定为 0。
线串和点——3d 和 2d 最近点 SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt, ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt FROM (SELECT 'POINT(100 100 30)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line ) As foo; cp3d_line_pt | cp2d_line_pt -----------------------------------------------------------+------------------------------------------ POINT(54.6993798867619 128.935022917228 11.5475869506606) | POINT(73.0769230769231 115.384615384615)
|
线串和多点——3d 和 2d 最近点 SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt, ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line ) As foo; cp3d_line_pt | cp2d_line_pt -----------------------------------------------------------+-------------- POINT(54.6993798867619 128.935022917228 11.5475869506606) | POINT(50 75)
|
多线串和多边形 3d 和 2d 最近点 SELECT ST_AsEWKT(ST_3DClosestPoint(poly, mline)) As cp3d, ST_AsEWKT(ST_ClosestPoint(poly, mline)) As cp2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; cp3d | cp2d -------------------------------------------+-------------- POINT(39.993580415989 54.1889925532825 5) | POINT(20 40)
|
ST_Distance — 返回两个几何或地理值之间的距离。
float ST_Distance(
geometry g1, geometry g2)
;
float ST_Distance(
geography geog1, geography geog2, boolean use_spheroid = true)
;
对于geometry,返回两个几何之间的最小 2D 笛卡尔(平面)距离,以投影单位(空间参考单位)表示。
对于geography,默认返回两个地理位置之间的最小测地距离(以米为单位),在由 SRID 确定的椭球体上进行计算。 如果 use_spheroid
为 false,则使用更快的球面计算。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.23
此方法支持圆形字符串和曲线。
可用性:1.5.0 地理支持在 1.5 中引入。 提高了平面的速度,以更好地处理大型或多个顶点几何图形
增强:2.1.0 提高了地理速度。 有关详细信息,请参阅使地理更快。
增强:2.1.0 - 引入了对弯曲几何形状的支持。
增强:2.2.0 - 使用 GeographicLib 对球体进行测量,以提高准确性和稳健性。 需要 PROJ >= 4.9.0 才能利用新功能。
更改:3.0.0 - 不再依赖 SFCGAL。
几何示例 - 平面度数 4326 是 WGS 84 经纬度,单位是度。
SELECT ST_Distance( 'SRID=4326;POINT(-72.1235 42.3521)'::geometry, 'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry ); ----------------- 0.00150567726382282
几何示例 - 以米为单位(SRID:3857,与流行网络地图上的像素成比例)。 尽管该值关闭,但可以正确比较附近的值,这使其成为 KNN 或 KMeans 等算法的不错选择。
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857) ); ----------------- 167.441410065196
几何示例 - 单位为米(SRID:3857,如上所述,但通过 cos(lat) 进行校正以考虑失真)
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857) ) * cosd(42.3521); ----------------- 123.742351254151
几何示例 - 单位为米(SRID:26986 马萨诸塞州平面米)(马萨诸塞州最准确)
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 26986), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 26986) ); ----------------- 123.797937878454
几何示例 - 单位为米(SRID:2163 美国国家地图集等面积)(最不准确)
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 2163), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 2163) ); ------------------ 126.664256056812
与几何示例相同,但注意单位为米 - 使用球体进行稍快但不太准确的计算。
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist FROM (SELECT 'SRID=4326;POINT(-72.1235 42.3521)'::geography as gg1, 'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geography as gg2 ) As foo ; spheroid_dist | sphere_dist ------------------+------------------ 123.802076746848 | 123.475736916397
ST_3DDistance — 返回两个几何图形之间的 3D 笛卡尔最小距离(基于空间参考)(以投影单位表示)。
float ST_3DDistance(
geometry g1, geometry g2)
;
返回两个几何图形之间的 3 维最小笛卡尔距离(以投影单位(空间参考单位)表示)。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
该方法实现了SQL/MM规范。 SQL-MM ISO/IEC 13249-3
可用性: 2.0.0
更改:2.2.0 - 在 2D 和 3D 的情况下,对于缺失的 Z,Z 不再被假定为 0。
更改:3.0.0 - SFCGAL 版本已删除
-- Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line) -- Note: currently no vertical datum support so Z is not transformed and assumed to be same units as final. SELECT ST_3DDistance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521 4)'::geometry,2163), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'::geometry,2163) ) As dist_3d, ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry,2163), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry,2163) ) As dist_2d; dist_3d | dist_2d ------------------+----------------- 127.295059324629 | 126.66425605671
-- Multilinestring and polygon both 3d and 2d distance -- Same example as 3D closest point example SELECT ST_3DDistance(poly, mline) As dist3d, ST_Distance(poly, mline) As dist2d FROM (SELECT 'POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))'::geometry as poly, 'MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1), (1 10 2, 5 20 1))'::geometry as mline) as foo; dist3d | dist2d -------------------+-------- 0.716635696066337 | 0
ST_DistanceSphere — 使用球形地球模型返回两个经度/纬度几何形状之间的最小距离(以米为单位)。
float ST_DistanceSphere(
geometry geomlonlatA, geometry geomlonlatB, float8 radius=6371008)
;
返回两个经度/纬度点之间的最小距离(以米为单位)。 使用球形地球和从 SRID 定义的椭球体导出的半径。 比 ST_DistanceSpheroid更快,但精度较差。 PostGIS 1.5 之前的版本仅针对点实现。
可用性:1.5 - 引入了对除点之外的其他几何类型的支持。 之前的版本仅适用于点。
更改:2.2.0 在之前的版本中,这曾经被称为 ST_Distance_Sphere
SELECT round(CAST(ST_DistanceSphere(ST_Centroid(geom), ST_GeomFromText('POINT(-118 38)',4326)) As numeric),2) As dist_meters, round(CAST(ST_Distance(ST_Transform(ST_Centroid(geom),32611), ST_Transform(ST_GeomFromText('POINT(-118 38)', 4326),32611)) As numeric),2) As dist_utm11_meters, round(CAST(ST_Distance(ST_Centroid(geom), ST_GeomFromText('POINT(-118 38)', 4326)) As numeric),5) As dist_degrees, round(CAST(ST_Distance(ST_Transform(geom,32611), ST_Transform(ST_GeomFromText('POINT(-118 38)', 4326),32611)) As numeric),2) As min_dist_line_point_meters FROM (SELECT ST_GeomFromText('LINESTRING(-118.584 38.374,-118.583 38.5)', 4326) As geom) as foo; dist_meters | dist_utm11_meters | dist_degrees | min_dist_line_point_meters -------------+-------------------+--------------+---------------------------- 70424.47 | 70438.00 | 0.72900 | 65871.18
ST_DistanceSpheroid — 使用球体模型返回两个经度/纬度几何形状之间的最小距离。
float ST_DistanceSpheroid(
geometry geomlonlatA, geometry geomlonlatB, spheroid measurement_spheroid=WGS84)
;
返回给定特定球体的两个经度/纬度几何形状之间的最小距离(以米为单位)。 请参阅 ST_LengthSpheroid给出的椭球体的解释。
![]() | |
此函数不查看几何体的 SRID。 它假设几何坐标基于提供的球体。 |
可用性:1.5 - 引入了对除点之外的其他几何类型的支持。 之前的版本仅适用于点。
更改:2.2.0 在之前的版本中,这称为 ST_Distance_Spheroid
SELECT round(CAST( ST_DistanceSpheroid(ST_Centroid(geom), ST_GeomFromText('POINT(-118 38)',4326), 'SPHEROID["WGS 84",6378137,298.257223563]') As numeric),2) As dist_meters_spheroid, round(CAST(ST_DistanceSphere(ST_Centroid(geom), ST_GeomFromText('POINT(-118 38)',4326)) As numeric),2) As dist_meters_sphere, round(CAST(ST_Distance(ST_Transform(ST_Centroid(geom),32611), ST_Transform(ST_GeomFromText('POINT(-118 38)', 4326),32611)) As numeric),2) As dist_utm11_meters FROM (SELECT ST_GeomFromText('LINESTRING(-118.584 38.374,-118.583 38.5)', 4326) As geom) as foo; dist_meters_spheroid | dist_meters_sphere | dist_utm11_meters ----------------------+--------------------+------------------- 70454.92 | 70424.47 | 70438.00
ST_FrechetDistance — 返回两个几何图形之间的 Fréchet 距离。
float ST_FrechetDistance(
geometry g1, geometry g2, float densifyFrac = -1)
;
基于计算离散 Fréchet 距离,实现计算仅限于两个几何图形的离散点的 Fréchet 距离的算法。 Fréchet 距离是曲线之间相似性的度量,考虑了曲线上点的位置和顺序。 因此它通常比 Hausdorff 距离更好。
当指定可选的 densifyFrac 时,该函数在计算离散 Fréchet 距离之前执行分段致密化。 densifyFrac 参数设置用于致密每个段的分数。 每个段将被分成多个等长的子段,其总长度的分数最接近给定的分数。
单位采用几何空间参考系的单位。
![]() | |
当前的实现仅支持顶点作为离散位置。 这可以扩展到允许使用任意密度的点。 |
![]() | |
我们指定的 densifyFrac 越小,我们获得的 Fréchet 距离就越准确。 但是,计算时间和内存使用量随着子段数量的平方而增加。 |
这个函数是由 GEOS 模块执行的。
可用性:2.4.0 - 需要 GEOS >= 3.7.0
postgres=# SELECT st_frechetdistance('LINESTRING (0 0, 100 0)'::geometry, 'LINESTRING (0 0, 50 50, 100 0)'::geometry); st_frechetdistance -------------------- 70.7106781186548 (1 row)
SELECT st_frechetdistance('LINESTRING (0 0, 100 0)'::geometry, 'LINESTRING (0 0, 50 50, 100 0)'::geometry, 0.5); st_frechetdistance -------------------- 50 (1 row)
ST_HausdorffDistance — 返回两个几何图形之间的Hausdorff 距离。
float ST_HausdorffDistance(
geometry g1, geometry g2)
;
float ST_HausdorffDistance(
geometry g1, geometry g2, float densifyFrac)
;
返回两个几何图形之间的Hausdorff距离。 Hausdorff距离是对 2 个几何形状相似或不相似程度的度量。
该函数实际上计算“离散Hausdorff距离”。 这是在几何上的离散点计算的Hausdorff距离。 可以指定 densifyFrac
参数,以便在计算离散 Hausdorff 距离之前通过致密分段来提供更准确的答案。 每个段被分成多个等长的子段,其段长度的分数最接近给定的分数。
单位采用几何空间参考系的单位。
![]() | |
该算法不等同于标准 Hausdorff距离。 然而,它计算出的近似值对于大部分有用案例都是正确的。 一种重要的情况是线串彼此大致平行且长度大致相等。 这是线路匹配的有用指标。 |
可用性:1.1.0
两条线之间的Hausdorff距离(红色)和距离(黄色)
SELECT ST_HausdorffDistance(geomA, geomB), ST_Distance(geomA, geomB) FROM (SELECT 'LINESTRING (20 70, 70 60, 110 70, 170 70)'::geometry AS geomA, 'LINESTRING (20 90, 130 90, 60 100, 190 100)'::geometry AS geomB) AS t; st_hausdorffdistance | st_distance ----------------------+------------- 37.26206567625497 | 20
示例:致密化的Hausdorff 距离。
SELECT ST_HausdorffDistance( 'LINESTRING (130 0, 0 0, 0 150)'::geometry, 'LINESTRING (10 10, 10 150, 130 10)'::geometry, 0.5); ---------------------- 70
示例:对于每个建筑物,找到最能代表它的地块。 首先,我们要求地块与建筑物几何图形相交。 DISTINCT ON
保证我们每栋建筑仅列出一次。 ORDER BY .. ST_HausdorffDistance
选择与建筑物最相似的地块。
SELECT DISTINCT ON (buildings.gid) buildings.gid, parcels.parcel_id FROM buildings INNER JOIN parcels ON ST_Intersects(buildings.geom, parcels.geom) ORDER BY buildings.gid, ST_HausdorffDistance(buildings.geom, parcels.geom);
ST_Length — 返回线性几何体的二维长度。
float ST_Length(
geometry a_2dlinestring)
;
float ST_Length(
geography geog, boolean use_spheroid = true)
;
对于几何类型:如果几何是 LineString、MultiLineString、ST_Curve、ST_MultiCurve,则返回几何的 2D 笛卡尔长度。 对于面积几何形状,返回 0; 请改用 ST_Perimeter。 长度单位由几何的空间参考系确定。
对于地理类型:使用逆测地线计算来执行计算。 长度单位为米。 如果PostGIS是使用PROJ版本4.8.0或更高版本编译的,则椭球体由SRID指定,否则它是WGS84独有的。 如果 use_spheroid = false
,则计算基于球体而不是椭球体。
目前对于几何体,这是 ST_Length2D 的别名,但这可能会更改以支持更高的维度。
![]() | |
更改:2.0.0 重大更改 - 在之前的版本中,将此应用于地理类型的多/多边形将为您提供多边形/多多边形的周长。 在 2.0.0 中,这已更改为返回 0 以符合几何行为。 如果您想要多边形的周长,请使用 ST_Perimeter |
![]() | |
对于地理,计算默认使用球体模型。 要使用更快但不太准确的球面计算,请使用 ST_Length(gg,false); |
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.5.1
该方法实现了SQL/MM规范。 SQL-MM 3: 7.1.2, 9.3.4
可用性:1.5.0 地理支持在 1.5 中引入。
返回线串的长度(以英尺为单位)。 请注意,单位为英尺,因为 EPSG:2249 是马萨诸塞州平面英尺
SELECT ST_Length(ST_GeomFromText('LINESTRING(743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416)',2249)); st_length --------- 122.630744000095 --Transforming WGS 84 LineString to Massachusetts state plane meters SELECT ST_Length( ST_Transform( ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45, -72.1240 42.45666, -72.123 42.1546)'), 26986 ) ); st_length --------- 34309.4563576191
WGS 84 地理线返回长度
-- the default calculation uses a spheroid SELECT ST_Length(the_geog) As length_spheroid, ST_Length(the_geog,false) As length_sphere FROM (SELECT ST_GeographyFromText( 'SRID=4326;LINESTRING(-72.1260 42.45, -72.1240 42.45666, -72.123 42.1546)') As the_geog) As foo; length_spheroid | length_sphere ------------------+------------------ 34310.5703627288 | 34346.2060960742
ST_Length2D — 返回线性几何体的二维长度。 ST_Length
的别名
float ST_Length2D(
geometry a_2dlinestring)
;
如果几何图形是线串或多线串,则返回几何图形的 2D 长度。 这是 ST_Length
的别名
ST_3DLength — 返回线性几何体的 3D 长度。
float ST_3DLength(
geometry a_3dlinestring)
;
如果几何体是 LineString 或 MultiLineString,则返回几何体的 3 维或 2 维长度。 对于二维线,它将仅返回二维长度(与 ST_Length 和 ST_Length2D 相同)
该函数支持 3d 并且不会丢失 z-index。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 7.1, 10.3
更改:2.0.0 在之前的版本中,这曾经被称为 ST_Length3D
返回 3D 电缆的长度(以英尺为单位)。 请注意,单位为英尺,因为 EPSG:2249 是马萨诸塞州平面英尺
SELECT ST_3DLength(ST_GeomFromText('LINESTRING(743238 2967416 1,743238 2967450 1,743265 2967450 3, 743265.625 2967416 3,743238 2967416 3)',2249)); ST_3DLength ----------- 122.704716741457
ST_LengthSpheroid — 返回椭球体上经度/纬度几何体的 2D 或 3D 长度/周长。
float ST_LengthSpheroid(
geometry a_geometry, spheroid a_spheroid)
;
返回椭球体面上几何图形的周长。 当几何图形的坐标为经度/纬度并且您希望查找没有投影的长度时,请使用此函数。椭球体由文本值指定,如下所示:
SPHEROID[<NAME
>,<SEMI-MAJOR AXIS
>,<INVERSE FLATTENING
>]
例如:
SPHEROID["GRS_1980",6378137,298.257222101]
可用性:1.2.2
更改:2.2.0 在之前的版本中,这称为 ST_Length_Spheroid 并具有别名 ST_3DLength_Spheroid
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_LengthSpheroid( geometry_column, 'SPHEROID["GRS_1980",6378137,298.257222101]' ) FROM geometry_table; SELECT ST_LengthSpheroid( geom, sph_m ) As tot_len, ST_LengthSpheroid(ST_GeometryN(geom,1), sph_m) As len_line1, ST_LengthSpheroid(ST_GeometryN(geom,2), sph_m) As len_line2 FROM (SELECT ST_GeomFromText('MULTILINESTRING((-118.584 38.374,-118.583 38.5), (-71.05957 42.3589 , -71.061 43))') As geom, CAST('SPHEROID["GRS_1980",6378137,298.257222101]' As spheroid) As sph_m) as foo; tot_len | len_line1 | len_line2 ------------------+------------------+------------------ 85204.5207562955 | 13986.8725229309 | 71217.6482333646 --3D SELECT ST_LengthSpheroid( geom, sph_m ) As tot_len, ST_LengthSpheroid(ST_GeometryN(geom,1), sph_m) As len_line1, ST_LengthSpheroid(ST_GeometryN(geom,2), sph_m) As len_line2 FROM (SELECT ST_GeomFromEWKT('MULTILINESTRING((-118.584 38.374 20,-118.583 38.5 30), (-71.05957 42.3589 75, -71.061 43 90))') As geom, CAST('SPHEROID["GRS_1980",6378137,298.257222101]' As spheroid) As sph_m) as foo; tot_len | len_line1 | len_line2 ------------------+-----------------+------------------ 85204.5259107402 | 13986.876097711 | 71217.6498130292
ST_LongestLine — 返回两个几何图形之间的二维最长线。
geometry ST_LongestLine(
geometry g1, geometry g2)
;
返回两个几何点之间的二维最长线。 返回的行从 g1
开始,到 g2
结束。
最长的线总是出现在两个顶点之间。 如果找到多个线,该函数将返回第一个最长的线。 直线的长度等于 ST_MaxDistance 返回的距离。
如果 g1 和 g2 是相同的几何体,则返回几何体中相距最远的两个顶点之间的线。 直线的端点位于ST_MinimumBoundingCircle 计算的圆上。
可用性:1.1.0
点和线之间最长的线
SELECT ST_AsText( ST_LongestLine( 'POINT (160 40)', 'LINESTRING (10 30, 50 50, 30 110, 70 90, 180 140, 130 190)' ) ) AS lline; ----------------- LINESTRING(160 40,130 190)
两个多边形之间最长的线
SELECT ST_AsText( ST_LongestLine( 'POLYGON ((190 150, 20 10, 160 70, 190 150))', ST_Buffer('POINT(80 160)', 30) ) ) AS llinewkt; ----------------- LINESTRING(20 10,105.3073372946034 186.95518130045156)
跨单个几何体的最长线。 线的长度等于最大距离。 线的端点位于最小边界圆上。
SELECT ST_AsText( ST_LongestLine( geom, geom)) AS llinewkt, ST_MaxDistance( geom, geom) AS max_dist, ST_Length( ST_LongestLine(geom, geom)) AS lenll FROM (SELECT 'POLYGON ((40 180, 110 160, 180 180, 180 120, 140 90, 160 40, 80 10, 70 40, 20 50, 40 180), (60 140, 99 77.5, 90 140, 60 140))'::geometry AS geom) AS t; llinewkt | max_dist | lenll ---------------------------+--------------------+-------------------- LINESTRING(20 50,180 180) | 206.15528128088303 | 206.15528128088303
ST_3DLongestLine — 返回两个几何体之间的 3D 最长直线
geometry ST_3DLongestLine(
geometry g1, geometry g2)
;
返回两个几何图形之间的 3 维最长直线。 如果有多个线,该函数将返回第一个最长的线。 返回的行以 g1 开始,以 g2 结束。 线的 3D 长度等于 ST_3DMaxDistance 返回的距离。
可用性: 2.0.0
更改:2.2.0 - 如果输入 2 个 2D 几何图形,则返回 2D 点(而不是假设缺失 Z 为 0 的旧行为)。 在 2D 和 3D 情况下,对于缺失的 Z,Z 不再被假定为 0。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
linestring和point——3d 和 2d 最长的线 SELECT ST_AsEWKT(ST_3DLongestLine(line,pt)) AS lol3d_line_pt, ST_AsEWKT(ST_LongestLine(line,pt)) As lol2d_line_pt FROM (SELECT 'POINT(100 100 30)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line ) As foo; lol3d_line_pt | lol2d_line_pt -----------------------------------+---------------------------- LINESTRING(50 75 1000,100 100 30) | LINESTRING(98 190,100 100)
|
linestring和multipoint——3d 和 2d 最长线 SELECT ST_AsEWKT(ST_3DLongestLine(line,pt)) AS lol3d_line_pt, ST_AsEWKT(ST_LongestLine(line,pt)) As lol2d_line_pt FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line ) As foo; lol3d_line_pt | lol2d_line_pt ---------------------------------+-------------------------- LINESTRING(98 190 1,50 74 1000) | LINESTRING(98 190,50 74)
|
MultiLineString 和 Polygon - 3d 和 2d 最长的线 SELECT ST_AsEWKT(ST_3DLongestLine(poly, mline)) As lol3d, ST_AsEWKT(ST_LongestLine(poly, mline)) As lol2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; lol3d | lol2d ------------------------------+-------------------------- LINESTRING(175 150 5,1 10 2) | LINESTRING(175 150,1 10)
|
ST_MaxDistance — 返回两个几何图形之间的二维最大距离(以投影单位表示)。
float ST_MaxDistance(
geometry g1, geometry g2)
;
返回两个几何图形之间的二维最大距离(以投影单位表示)。 最大距离总是出现在两个顶点之间。 这是 ST_LongestLine 返回的线的长度。
如果 g1 和 g2 是相同的几何体,则返回该几何体中相距最远的两个顶点之间的距离。
可用性:1.1.0
点与线之间的最大距离。
SELECT ST_MaxDistance('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); ----------------- 2 SELECT ST_MaxDistance('POINT(0 0)'::geometry, 'LINESTRING ( 2 2, 2 2 )'::geometry); ------------------ 2.82842712474619
单个几何体顶点之间的最大距离。
SELECT ST_MaxDistance('POLYGON ((10 10, 10 0, 0 0, 10 10))'::geometry, 'POLYGON ((10 10, 10 0, 0 0, 10 10))'::geometry); ------------------ 14.142135623730951
ST_3DMaxDistance — 返回两个几何图形之间的 3D 笛卡尔最大距离(基于空间参考)(以投影单位表示)。
float ST_3DMaxDistance(
geometry g1, geometry g2)
;
返回两个几何图形之间的 3 维最大笛卡尔距离(以投影单位(空间参考单位)表示)。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
可用性: 2.0.0
更改:2.2.0 - 在 2D 和 3D 的情况下,对于缺失的 Z,Z 不再被假定为 0。
-- Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line) -- Note: currently no vertical datum support so Z is not transformed and assumed to be same units as final. SELECT ST_3DMaxDistance( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 10000)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163) ) As dist_3d, ST_MaxDistance( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 10000)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163) ) As dist_2d; dist_3d | dist_2d ------------------+------------------ 24383.7467488441 | 22247.8472107251
ST_MinimumClearance — 返回几何体的最小间隙,这是几何体稳健性的度量。
float ST_MinimumClearance(
geometry g)
;
几何图形有可能满足 ST_IsValid(多边形)或 ST_IsSimple(线)的有效性标准,但如果其顶点之一是无效的,则该几何图形将变得无效。 移动了一小段距离。 发生这种情况的原因可能是转换为文本格式(例如 WKT、KML、GML、GeoJSON)或不使用双精度浮点坐标的二进制格式(例如 MapInfo TAB)期间的精度损失。
最小间隙是几何形状对坐标精度变化的稳健性的定量测量。 它是在不创建无效几何体的情况下可以移动几何体顶点的最大距离。 最小间隙值越大,表明稳健性越好。
如果几何形状的最小间隙为 e
,则:
几何中没有两个不同的顶点比距离e
更近。
没有顶点比 e
更接近它不是端点的线段。
如果几何体不存在最小间隙(例如,单个点或点相同的多点),则返回值为Infinity
。
为了避免精度损失导致的有效性问题,ST_ReducePrecision 可以降低坐标精度,同时确保多边形几何保持有效。
可用性:2.3.0
SELECT ST_MinimumClearance('POLYGON ((0 0, 1 0, 1 1, 0.5 3.2e-4, 0 0))'); st_minimumclearance --------------------- 0.00032
ST_MinimumClearanceLine — 返回跨越几何体最小间隙的两点线串。
Geometry ST_MinimumClearanceLine(
geometry g)
;
返回跨越几何体最小间隙的两点线串。 如果几何图形没有最小间隙,则返回 LINESTRING EMPTY
。
这个函数是由 GEOS 模块执行的。
可用性:2.3.0-需要GEOS >= 3.6.0
SELECT ST_AsText(ST_MinimumClearanceLine('POLYGON ((0 0, 1 0, 1 1, 0.5 3.2e-4, 0 0))')); ------------------------------- LINESTRING(0.5 0.00032,0.5 0)
ST_Perimeter — 返回多边形几何或地理的边界长度。
float ST_Perimeter(
geometry g1)
;
float ST_Perimeter(
geography geog, boolean use_spheroid = true)
;
如果几何/地理是 ST_Surface、ST_MultiSurface(Polygon、MultiPolygon),则返回其 2D 周长。 对于非区域几何形状返回 0。 对于线性几何形状,请使用ST_Length。 对于几何类型,周长测量的单位由几何的空间参考系统指定。
对于地理类型,使用逆测地线问题执行计算,其中周长单位为米。 如果PostGIS是使用PROJ版本4.8.0或更高版本编译的,则椭球体由SRID指定,否则它是WGS84独有的。 如果use_spheroid = false
,则计算将近似为球体而不是椭球体。
目前,这是 ST_Perimeter2D 的别名,但可能会更改以支持更高的维度。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.5.1
该方法实现了SQL/MM规范。 SQL-MM 3: 8.1.3, 9.5.4
可用性 2.0.0:引入了对地理的支持
返回多边形和多重多边形的周长(以英尺为单位)。 请注意,单位为英尺,因为 EPSG:2249 是马萨诸塞州平面英尺
SELECT ST_Perimeter(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416))', 2249)); st_perimeter --------- 122.630744000095 (1 row) SELECT ST_Perimeter(ST_GeomFromText('MULTIPOLYGON(((763104.471273676 2949418.44119003, 763104.477769673 2949418.42538203, 763104.189609677 2949418.22343004,763104.471273676 2949418.44119003)), ((763104.471273676 2949418.44119003,763095.804579742 2949436.33850239, 763086.132105649 2949451.46730207,763078.452329651 2949462.11549407, 763075.354136904 2949466.17407812,763064.362142565 2949477.64291974, 763059.953961626 2949481.28983009,762994.637609571 2949532.04103014, 762990.568508415 2949535.06640477,762986.710889563 2949539.61421415, 763117.237897679 2949709.50493431,763235.236617789 2949617.95619822, 763287.718121842 2949562.20592617,763111.553321674 2949423.91664605, 763104.471273676 2949418.44119003)))', 2249)); st_perimeter --------- 845.227713366825 (1 row)
返回多边形和多重多边形的周长(以米和英尺为单位)。 请注意,这是地理(WGS 84 经纬度)
SELECT ST_Perimeter(geog) As per_meters, ST_Perimeter(geog)/0.3048 As per_ft FROM ST_GeogFromText('POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009, -71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.1776848522251 42.3902896512902))') As geog; per_meters | per_ft -----------------+------------------ 37.3790462565251 | 122.634666195949 -- MultiPolygon example -- SELECT ST_Perimeter(geog) As per_meters, ST_Perimeter(geog,false) As per_sphere_meters, ST_Perimeter(geog)/0.3048 As per_ft FROM ST_GeogFromText('MULTIPOLYGON(((-71.1044543107478 42.340674480411,-71.1044542869917 42.3406744369506, -71.1044553562977 42.340673886454,-71.1044543107478 42.340674480411)), ((-71.1044543107478 42.340674480411,-71.1044860600303 42.3407237015564,-71.1045215770124 42.3407653385914, -71.1045498002983 42.3407946553165,-71.1045611902745 42.3408058316308,-71.1046016507427 42.340837442371, -71.104617893173 42.3408475056957,-71.1048586153981 42.3409875993595,-71.1048736143677 42.3409959528211, -71.1048878050242 42.3410084812078,-71.1044020965803 42.3414730072048, -71.1039672113619 42.3412202916693,-71.1037740497748 42.3410666421308, -71.1044280218456 42.3406894151355,-71.1044543107478 42.340674480411)))') As geog; per_meters | per_sphere_meters | per_ft ------------------+-------------------+------------------ 257.634283683311 | 257.412311446337 | 845.256836231335
ST_Perimeter2D — 返回多边形几何体的 2D 周长。 ST_Perimeter
的别名。
float ST_Perimeter2D(
geometry geomA)
;
返回多边形几何体的二维周长。
![]() | |
目前这是 ST_Perimeter 的别名。 在未来版本中,ST_Perimeter 可能会返回几何图形的最高维度周长。 这个还在考虑中 |
ST_3DPerimeter — 返回多边形几何体的 3D 周长。
float ST_3DPerimeter(
geometry geomA)
;
如果几何体是多边形或多多边形,则返回几何体的 3三维周长。 如果几何图形是二维的,则返回二维周长。
该函数支持 3d 并且不会丢失 z-index。
该方法实现了SQL/MM规范。 SQL-MM ISO/IEC 13249-3: 8.1, 10.5
更改:2.0.0 在之前的版本中,这曾经被称为 ST_Perimeter3D
马萨诸塞州飞机英尺空中稍高的多边形的周长
SELECT ST_3DPerimeter(geom), ST_Perimeter2d(geom), ST_Perimeter(geom) FROM (SELECT ST_GeomFromEWKT('SRID=2249;POLYGON((743238 2967416 2,743238 2967450 1, 743265.625 2967416 1,743238 2967416 2))') As geom) As foo; ST_3DPerimeter | st_perimeter2d | st_perimeter ------------------+------------------+------------------ 105.465793597674 | 105.432997272188 | 105.432997272188
ST_ShortestLine — 返回两个几何图形之间的 2D 最短线
geometry ST_ShortestLine(
geometry geom1, geometry geom2)
;
geography ST_ShortestLine(
geography geom1, geography geom2, boolean use_spheroid = true)
;
返回两个几何图形之间的二维最短线。 返回的线从 geom1
开始,到 geom2
结束。 如果geom1
和geom2
相交,结果是一条起点和终点位于交点的线。 线的长度与 g1 和 g2 的 ST_Distance 返回的长度相同。
增强:3.4.0 - 支持地理。
可用性:1.1.0
Point 和 LineString 之间的最短线
SELECT ST_AsText( ST_ShortestLine( 'POINT (160 40)', 'LINESTRING (10 30, 50 50, 30 110, 70 90, 180 140, 130 190)') ) As sline; --------------------------------------------------------- LINESTRING(160 40,125.75342465753425 115.34246575342466)
Polygons之间的最短线
SELECT ST_AsText( ST_ShortestLine( 'POLYGON ((190 150, 20 10, 160 70, 190 150))', ST_Buffer('POINT(80 160)', 30) ) ) AS llinewkt; ----------------- LINESTRING(131.59149149528952 101.89887534906197,101.21320343559644 138.78679656440357)
ST_3DShortestLine — 返回两个几何图形之间的 3D 最短线
geometry ST_3DShortestLine(
geometry g1, geometry g2)
;
返回两个几何图形之间的 3 维最短线。 如果函数找到多个最短线,则该函数将仅返回第一个最短线。 如果 g1 和 g2 仅相交于一个点,则该函数将返回一条起点和终点均位于该交点的线。 如果 g1 和 g2 与多个点相交,该函数将返回一条起点和终点位于同一点的线,但它可以是任何相交点。 返回的线始终以 g1 开始并以 g2 结束。 此函数返回的线的 3D 长度始终与 ST_3DDistance 返回的 g1 和 g2 相同。
可用性: 2.0.0
更改:2.2.0 - 如果输入 2 个 2D 几何图形,则返回 2D 点(而不是假设缺失 Z 为 0 的旧行为)。 在 2D 和 3D 情况下,对于缺失的 Z,Z 不再被假定为 0。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
线串和点——3d 和 2d 最短线 SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt, ST_AsEWKT(ST_ShortestLine(line,pt)) As shl2d_line_pt FROM (SELECT 'POINT(100 100 30)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line ) As foo; shl3d_line_pt | shl2d_line_pt ----------------------------------------------------------------------------+------------------------------------------------------ LINESTRING(54.6993798867619 128.935022917228 11.5475869506606,100 100 30) | LINESTRING(73.0769230769231 115.384615384615,100 100)
|
线串和多点——3d 和 2d 最短线 SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt, ST_AsEWKT(ST_ShortestLine(line,pt)) As shl2d_line_pt FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line ) As foo; shl3d_line_pt | shl2d_line_pt ---------------------------------------------------------------------------+------------------------ LINESTRING(54.6993798867619 128.935022917228 11.5475869506606,100 100 30) | LINESTRING(50 75,50 74)
|
多线串 和多边形 -3d 和 2d 最短线 SELECT ST_AsEWKT(ST_3DShortestLine(poly, mline)) As shl3d, ST_AsEWKT(ST_ShortestLine(poly, mline)) As shl2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; shl3d | shl2d ---------------------------------------------------------------------------------------------------+------------------------ LINESTRING(39.993580415989 54.1889925532825 5,40.4078575708294 53.6052383805529 5.03423778139177) | LINESTRING(20 40,20 40)
|
这些函数计算两个几何图形叠加所产生的结果。 这些也称为点集理论布尔运算。 还提供了一些相关的函数。
ST_ClipByBox2D — 计算几何图形落在矩形内的部分。
geometry ST_ClipByBox2D(
geometry geom, box2d box)
;
以快速且宽松但可能无效的方式通过 2D 框剪切几何体。 拓扑上无效的输入几何图形不会导致抛出异常。 不保证输出几何图形有效(特别是,可能会引入多边形的自相交)。
这个函数是由 GEOS 模块执行的。
可用性:2.2.0
-- Rely on implicit cast from geometry to box2d for the second parameter SELECT ST_ClipByBox2D(geom, ST_MakeEnvelope(0,0,10,10)) FROM mytab;
ST_Difference — 计算表示几何 A 中不与几何 B 相交的部分的几何。
geometry ST_Difference(
geometry geomA, geometry geomB, float8 gridSize = -1)
;
返回一个几何图形,表示几何图形 A 中不与几何图形 B 相交的部分。这相当于 A - ST_Intersection(A,B)
。 如果 A 完全包含在 B 中,则返回适当类型的空原子几何结构。
![]() | |
这是唯一一个与输入顺序有关的叠加函数。 ST_Difference(A, B) 始终返回 A 的一部分。 |
如果提供了可选的 gridSize
参数,则输入将捕捉到给定大小的网格,并在同一网格上计算结果顶点。 (需要 GEOS-3.9.0 或更高版本)
它是通过GEOS模块实现的
增强:3.1.0 接受 gridSize 参数。
需要 GEOS >= 3.9.0 才能使用 gridSize 参数。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.20
该函数支持 3d 并且不会丢失 z-index。 但是,结果仅使用 XY 计算。 结果 Z 值被复制、平均或插值。
![]() 输入线串
|
![]() 两个线串之间的差异
|
2D线串的差异。
SELECT ST_AsText( ST_Difference( 'LINESTRING(50 100, 50 200)'::geometry, 'LINESTRING(50 50, 50 150)'::geometry ) ); st_astext --------- LINESTRING(50 150,50 200)
3D点的差异。
SELECT ST_AsEWKT( ST_Difference( 'MULTIPOINT(-118.58 38.38 5,-118.60 38.329 6,-118.614 38.281 7)' :: geometry, 'POINT(-118.614 38.281 5)' :: geometry ) ); st_asewkt --------- MULTIPOINT(-118.6 38.329 6,-118.58 38.38 5)
ST_Intersection — 计算表示几何 A 和 B 的共享部分的几何。
geometry ST_Intersection(
geometry geomA , geometry geomB , float8 gridSize = -1 )
;
geography ST_Intersection(
geography geogA , geography geogB )
;
返回表示两个几何图形的点集交集的几何图形。 换句话说,几何图形 A 和几何图形 B 在两个几何图形之间共享的部分。
如果几何图形没有共同点(即不相交),则返回适当类型的空原子几何图形。
如果提供了可选的 gridSize
参数,则输入将捕捉到给定大小的网格,并在同一网格上计算结果顶点。 (需要 GEOS-3.9.0 或更高版本)
ST_Intersection 与 ST_Intersects 结合使用对于剪切几何图形非常有用,例如在边界框、缓冲区或区域查询中,您只需要感兴趣的国家或地区内的几何图形部分。
![]() | |
|
![]() | |
该函数将删除 M 坐标值(如果存在)。 |
![]() | |
如果使用 3D 几何图形,您可能需要使用基于 SFGCAL 的 ST_3DIntersection ,它可以为 3D 几何图形执行正确的 3D 交集。 尽管此函数适用于 Z 坐标,但它对 Z 坐标进行平均。 |
它是通过GEOS模块实现的
增强:3.1.0 接受 gridSize 参数
需要 GEOS >= 3.9.0 才能使用 gridSize 参数
更改:3.0.0 不依赖于 SFCGAL。
可用性:1.5 引入了对地理数据类型的支持。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.18
该函数支持 3d 并且不会丢失 z-index。 但是,结果仅使用 XY 计算。 结果 Z 值被复制、平均或插值。
SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry)); st_astext --------------- GEOMETRYCOLLECTION EMPTY SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry)); st_astext --------------- POINT(0 0)
按国家/地区剪辑所有线路(路径)。 这里我们假设国家几何是多边形或多多边形。 注意:我们只保留导致线串或多线串的交叉点部分,因为我们不关心仅共享一个点的路径。 需要转储来将几何集合扩展为单独的 MULT* 部分。 下面的内容相当通用,只需更改 where 子句即可适用于多边形等。
select clipped.gid, clipped.f_name, clipped_geom from ( select trails.gid, trails.f_name, (ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom from country inner join trails on ST_Intersects(country.geom, trails.geom) ) as clipped where ST_Dimension(clipped.clipped_geom) = 1;
对于聚合物,例如 多边形地标,您可以使用加速技巧,在 0.0 处缓冲不包括多边形的几何,以获得空的几何集合(因此,如果缓冲包含多边形、线串和点的几何集合为 0.0,则仅保留多边形, 它将不再是几何集合。)
select poly.gid, ST_Multi( ST_Buffer( ST_Intersection(country.geom, poly.geom), 0.0 ) ) clipped_geom from country inner join poly on ST_Intersects(country.geom, poly.geom) where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));
请注意,这不是真正的交集,与使用 ST_3DIntersection 的同一示例进行比较。
select ST_AsText(ST_Intersection(linestring, polygon)) As wkt from ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon; st_astext --------------------------------------- LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10)
ST_MemUnion — 聚合函数,以内存高效但速度较慢的方式联合几何图形
geometry ST_MemUnion(
geometry set geomfield)
;
聚合函数,用于联合输入几何图形,将它们合并以生成没有重叠的结果几何图形。 输出可以是单个几何体、多几何体或几何体集合。
![]() | |
产生与 ST_Union 相同的结果,但使用更少的内存和更多的处理时间。 此聚合函数对几何图形的顺序加法连接进行操作,这与 ST_Union 聚合不同,ST_Union 聚合首先累积一个数组,然后使用快速算法联合内容。 |
该函数支持 3d 并且不会丢失 z-index。 但是,结果仅使用 XY 计算。 结果 Z 值被复制、平均或插值。
SELECT id, ST_MemUnion(geom) as singlegeom FROM sometable f GROUP BY id;
ST_Node — 节点是线的集合。
geometry ST_Node(
geometry geom)
;
返回一个 (Multi)LineString ,表示线串集合的完全节点版本。 节点保留所有输入节点,并引入尽可能少的新节点。 生成的线条被溶解(重复的线条被删除)。
这是创建适合用作 ST_Polygonize 输入的全节点线条的好方法。
ST_UnaryUnion 也可用于节点和溶解线条。 它提供了一个指定 gridSize 的选项,这可以提供更简单、更稳健的输出。 另请参阅 ST_Union 了解聚合版本。
该函数支持 3d 并且不会丢失 z-index。
这个函数是由 GEOS 模块执行的。
可用性: 2.0.0
更改:2.4.0 该函数在内部使用 GEOSNode 而不是 GEOSUnaryUnion。 与 PostGIS < 2.4 相比,这可能会导致生成的线串具有不同的顺序和方向。
节点自相交的 3D LineString
SELECT ST_AsText( ST_Node('LINESTRINGZ(0 0 0, 10 10 10, 0 10 5, 10 0 3)'::geometry) ) As output; output ----------- MULTILINESTRING Z ((0 0 0,5 5 4.5),(5 5 4.5,10 10 10,0 10 5,5 5 4.5),(5 5 4.5,10 0 3))
将节点添加到共享一条线的两个线串。 生成的线被溶解。
SELECT ST_AsText( ST_Node('MULTILINESTRING ((2 5, 2 1, 7 1), (6 1, 4 1, 2 3, 2 5))'::geometry) ) As output; output ----------- MULTILINESTRING((2 5,2 3),(2 3,2 1,4 1),(4 1,2 3),(4 1,6 1),(6 1,7 1))
ST_Split — 返回通过将一个几何体分割为另一个几何体而创建的几何体集合。
geometry ST_Split(
geometry input, geometry blade)
;
该函数支持按(多)点、(多)线串或(多)多边形边界分割线串,或按线串分割(多)多边形。 当(多)多边形用作边栏选项卡时,其线性分量(边界)用于分割输入。 结果几何图形始终是一个集合。
该函数在某种意义上与 ST_Union 相反。 将 ST_Union 应用于返回的集合理论上应该会产生原始几何图形(尽管由于数字舍入,情况可能并非完全如此)。
![]() | |
如果由于数值精度问题输入和刀片不相交,则输入可能不会按预期分割。 为了避免这种情况,可能需要首先使用具有较小公差的 ST_Snap 将输入捕捉到刀片。 |
可用性:2.0.0需要GEOS
增强:2.2.0 引入了对通过多线、多点或(多)多边形边界分割线的支持。
增强:2.5.0 引入了通过多线分割多边形的支持。
用一条线分割多边形。
![]() 分割前
|
![]() 分割后
|
SELECT ST_AsText( ST_Split( ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50), -- circle ST_MakeLine(ST_Point(10, 10),ST_Point(190, 190)) -- line )); -- result -- GEOMETRYCOLLECTION( POLYGON((150 90,149.039264020162 80.2454838991936,146.193976625564 70.8658283817455,..), POLYGON(..)) )
将一个多线串(MultiLineString)通过一个点分割,其中这个点正好位于两个线串元素上。
![]() 分割前
|
![]() 分割后
|
SELECT ST_AsText(ST_Split( 'MULTILINESTRING((10 10, 190 190), (15 15, 30 30, 100 90))', ST_Point(30,30))) As split; split ------ GEOMETRYCOLLECTION( LINESTRING(10 10,30 30), LINESTRING(30 30,190 190), LINESTRING(15 15,30 30), LINESTRING(30 30,100 90) )
将 LineString 用点分割,其中该点并不正好位于线上。 显示使用 ST_Snap 将线捕捉到点以允许将其分割。
WITH data AS (SELECT 'LINESTRING(0 0, 100 100)'::geometry AS line, 'POINT(51 50)':: geometry AS point ) SELECT ST_AsText( ST_Split( ST_Snap(line, point, 1), point)) AS snapped_split, ST_AsText( ST_Split(line, point)) AS not_snapped_not_split FROM data; snapped_split | not_snapped_not_split ---------------------------------------------------------------------+--------------------------------------------- GEOMETRYCOLLECTION(LINESTRING(0 0,51 50),LINESTRING(51 50,100 100)) | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))
ST_Subdivide — 计算几何体的直线细分。
setof geometry ST_Subdivide(
geometry geom, integer max_vertices=256, float8 gridSize = -1)
;
返回一组几何图形,这些几何图形是使用直线将 geom
分成多个部分的结果,每个部分包含不超过 max_vertices
。
max_vertices
必须为 5 或更多,因为需要 5 个点来表示一个封闭的盒子。 可以指定gridSize
以在固定精度空间中进行裁剪工作(需要GEOS-3.9.0+)。
对于索引细分数据集,多边形内的点和其他空间操作通常更快。 由于零件的边界框通常覆盖比原始几何图形边界框更小的区域,因此索引查询产生的“命中”情况较少。 “命中”情况更快,因为索引重新检查执行的空间操作处理的点更少。
![]() | |
这是一个返回集合的 集合返回函数 (SRF) 包含单个几何值的线。 它可以在 SELECT 列表或 FROM 子句中使用,以生成一个结果集,其中每个结果几何图形都有一个记录。 |
这个函数是由 GEOS 模块执行的。
可用性:2.2.0
增强:2.5.0 重用多边形分割上的现有点,顶点数从 8 减少到 5。
增强:3.1.0 接受 gridSize 参数。
需要 GEOS >= 3.9.0 才能使用 gridSize 参数
示例: 将多边形细分为不超过 10 个顶点的部分,并为每个部分分配一个唯一的 id。
细分至最多 10 个顶点
SELECT row_number() OVER() As rn, ST_AsText(geom) As wkt FROM (SELECT ST_SubDivide( 'POLYGON((132 10,119 23,85 35,68 29,66 28,49 42,32 56,22 64,32 110,40 119,36 150, 57 158,75 171,92 182,114 184,132 186,146 178,176 184,179 162,184 141,190 122, 190 100,185 79,186 56,186 52,178 34,168 18,147 13,132 10))'::geometry,10)) AS f(geom);
rn │ wkt ────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 │ POLYGON((119 23,85 35,68 29,66 28,32 56,22 64,29.8260869565217 100,119 100,119 23)) 2 │ POLYGON((132 10,119 23,119 56,186 56,186 52,178 34,168 18,147 13,132 10)) 3 │ POLYGON((119 56,119 100,190 100,185 79,186 56,119 56)) 4 │ POLYGON((29.8260869565217 100,32 110,40 119,36 150,57 158,75 171,92 182,114 184,114 100,29.8260869565217 100)) 5 │ POLYGON((114 184,132 186,146 178,176 184,179 162,184 141,190 122,190 100,114 100,114 184))
示例: 使用 ST_Segmentize(geography, distance) 密集化一条长地理线,并使用 ST_Subdivide 将生成的线分割为 8 个顶点的子线。
致密线和分割线。
SELECT ST_AsText( ST_Subdivide( ST_Segmentize('LINESTRING(0 0, 85 85)'::geography, 1200000)::geometry, 8));
LINESTRING(0 0,0.487578359029357 5.57659056746196,0.984542144675897 11.1527721155093,1.50101059639722 16.7281035483571,1.94532113630331 21.25) LINESTRING(1.94532113630331 21.25,2.04869538062779 22.3020741387339,2.64204641967673 27.8740533545155,3.29994062412787 33.443216802941,4.04836719489742 39.0084282520239,4.59890468420694 42.5) LINESTRING(4.59890468420694 42.5,4.92498503922732 44.5680389206321,5.98737409390639 50.1195229244701,7.3290919767674 55.6587646879025,8.79638749938413 60.1969505994924) LINESTRING(8.79638749938413 60.1969505994924,9.11375579533779 61.1785363177625,11.6558166691368 66.6648504160202,15.642041247655 72.0867690601745,22.8716627200212 77.3609628116894,24.6991785131552 77.8939011989848) LINESTRING(24.6991785131552 77.8939011989848,39.4046096622744 82.1822848017636,44.7994523421035 82.5156766227011) LINESTRING(44.7994523421035 82.5156766227011,85 85)
示例: 在表中的适当位置分割复杂几何图形。 具有原始几何的记录将从源表中删除,拆分后生成的几何将成为其位置的新记录。
WITH complex_areas_to_subdivide AS ( DELETE from polygons_table WHERE ST_NPoints(geom) > 255 RETURNING id, column1, column2, column3, geom ) INSERT INTO polygons_table (fid, column1, column2, column3, geom) SELECT fid, column1, column2, column3, ST_Subdivide(geom, 255) as geom FROM complex_areas_to_subdivide;
示例:创建具有分区几何图形的新表。 保留原始几何图形的键,新表可以与原始表连接。 由于 ST_Subdivide 是一个返回集合的函数,并且行具有单个值,因此此语法会自动生成一个表,其中每个部分的结果都有一行。
CREATE TABLE subdivided_geoms AS SELECT pkey, ST_Subdivide(geom) AS geom FROM original_geoms;
ST_SymDifference — 计算表示几何图形 A 和 B 不相交部分的几何图形。
geometry ST_SymDifference(
geometry geomA, geometry geomB, float8 gridSize = -1)
;
返回表示几何图形 A 和 B 不相交部分的几何图形。 这相当于ST_Union(A,B) - ST_Intersection(A,B)
。 之所以称为对称差,是因为 ST_SymDifference(A,B) = ST_SymDifference(B,A)
。
如果提供了可选的 gridSize
参数,则输入将捕捉到给定大小的网格,并在同一网格上计算结果顶点。 (需要 GEOS-3.9.0 或更高版本)
它是通过GEOS模块实现的
增强:3.1.0 接受 gridSize 参数。
需要 GEOS >= 3.9.0 才能使用 gridSize 参数
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.21
该函数支持 3d 并且不会丢失 z-index。 但是,结果仅使用 XY 计算。 结果 Z 值被复制、平均或插值。
![]() 原始线串一起显示
|
![]() 两条线串的对称差
|
--Safe for 2d - symmetric difference of 2 linestrings SELECT ST_AsText( ST_SymDifference( ST_GeomFromText('LINESTRING(50 100, 50 200)'), ST_GeomFromText('LINESTRING(50 50, 50 150)') ) ); st_astext --------- MULTILINESTRING((50 150,50 200),(50 50,50 100))
--When used in 3d doesn't quite do the right thing SELECT ST_AsEWKT(ST_SymDifference(ST_GeomFromEWKT('LINESTRING(1 2 1, 1 4 2)'), ST_GeomFromEWKT('LINESTRING(1 1 3, 1 3 4)'))) st_astext ------------ MULTILINESTRING((1 3 2.75,1 4 2),(1 1 3,1 2 2.25))
ST_UnaryUnion — 计算单个几何体的组件的并集。
geometry ST_UnaryUnion(
geometry geom, float8 gridSize = -1)
;
ST_Union 的单输入形式。 输入可以是单个几何图形、MultiGeometry 或 GeometryCollection。 并集应用于输入的各个元素。
此函数可用于修复由于重叠组件而无效的多重多边形。 但是,每个输入组件都必须有效。 无效的输入组件(例如领结多边形)可能会导致错误。 因此,最好使用 ST_MakeValid。
此函数的另一个用途是对交叉或重叠的线串集合进行节点化和分解,以使它们简单。 (ST_Node 也执行此操作,但它不提供 gridSize
选项。)
可以将 ST_UnaryUnion 与 ST_Collect 结合起来,以微调一次组合的几何图形数量。 这允许在内存使用和计算时间之间进行权衡,从而在 ST_Union 和 ST_MemUnion 之间取得平衡。
如果提供了可选的 gridSize
参数,则输入将捕捉到给定大小的网格,并在同一网格上计算结果顶点。 (需要 GEOS-3.9.0 或更高版本)
该函数支持 3d 并且不会丢失 z-index。 但是,结果仅使用 XY 计算。 结果 Z 值被复制、平均或插值。
增强:3.1.0 接受 gridSize 参数。
需要 GEOS >= 3.9.0 才能使用 gridSize 参数
可用性: 2.0.0
ST_Union — 计算表示输入几何图形的点集并集的几何图形。
geometry ST_Union(
geometry g1, geometry g2)
;
geometry ST_Union(
geometry g1, geometry g2, float8 gridSize)
;
geometry ST_Union(
geometry[] g1_array)
;
geometry ST_Union(
geometry set g1field)
;
geometry ST_Union(
geometry set g1field, float8 gridSize)
;
联合输入几何图形,合并几何图形以生成没有重叠的结果几何图形。 输出可以是原子几何、多几何或几何集合。 有多种格式:
双输入格式: 返回一个几何图形,该几何图形是两个输入几何图形的并集。 如果任一输入为 NULL,则返回 NULL。
数组格式: 返回一个几何图形,该几何图形是几何图形数组的并集。
聚合函数格式: 返回一个几何图形,该几何图形是几何图形集合的并集。 ST_Union() 函数是 PostgreSQL 术语中的“聚合”函数。 这意味着它对数据行进行操作,与 SUM() 和 AVG() 函数的操作方式相同,并且与大多数聚合一样,它也会忽略 NULL 几何图形。
请参阅 ST_UnaryUnion 了解非聚合、单输入格式。
ST_Union的数组和聚合形式使用 http://blog.cleverelephant.ca/2009/01/must-faster-unions-in-postgis-14.html 中引入的快速级联连接算法
可以指定 gridSize
来在固定精度空间中工作。 输入将捕捉到给定大小的网格,并在同一网格上计算结果顶点。 (需要 GEOS-3.9.0 或更高版本)
![]() | |
ST_Collect 如果不要求结果不重叠,有时可以使用 ST_Collect 代替 ST_Union。 ST_Collect 通常比 ST_Union 更快,因为它不对收集的几何图形执行任何处理。 |
这个函数是由 GEOS 模块执行的。
ST_Union 创建 MultiLineString 并且不会将 LineString 缝合成单个 LineString。 使用ST_LineMerge缝合线串。
注意:此函数以前称为 GeomUnion(),它是从“Union”重命名的,因为 UNION 是 SQL 保留字。
增强:3.1.0 接受 gridSize 参数。
需要 GEOS >= 3.9.0 才能使用 gridSize 参数
更改:3.0.0 不依赖于 SFCGAL。
可用性:1.4.0 - ST_Union 得到增强。 PostgreSQL 中引入了 ST_Union(geomarray) 以及更快的集合聚合。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
![]() | |
OGC SPEC 中未明确定义聚合版本。 |
该方法实现了SQL/MM规范。 SQL-MM 3:5.1.19 涉及多边形时的 z 索引(高程)。
该函数支持 3d 并且不会丢失 z-index。 但是,结果仅使用 XY 计算。 结果 Z 值被复制、平均或插值。
聚合示例
SELECT id, ST_Union(geom) as singlegeom FROM sometable f GROUP BY id;
非聚合示例
select ST_AsText(ST_Union('POINT(1 2)' :: geometry, 'POINT(-2 3)' :: geometry)) st_astext ---------- MULTIPOINT(-2 3,1 2) select ST_AsText(ST_Union('POINT(1 2)' :: geometry, 'POINT(1 2)' :: geometry)) st_astext ---------- POINT(1 2)
3D 示例 - 3D 的类型(和混合维度!)
select ST_AsEWKT(ST_Union(geom)) from ( select 'POLYGON((-7 4.2,-7.1 4.2,-7.1 4.3, -7 4.2))'::geometry geom union all select 'POINT(5 5 5)'::geometry geom union all select 'POINT(-2 3 1)'::geometry geom union all select 'LINESTRING(5 5 5, 10 10 10)'::geometry geom ) as foo; st_asewkt --------- GEOMETRYCOLLECTION(POINT(-2 3 1),LINESTRING(5 5 5,10 10 10),POLYGON((-7 4.2 5,-7.1 4.2 5,-7.1 4.3 5,-7 4.2 5)));
不混合维度的 3D 示例
select ST_AsEWKT(ST_Union(geom)) from ( select 'POLYGON((-7 4.2 2,-7.1 4.2 3,-7.1 4.3 2, -7 4.2 2))'::geometry geom union all select 'POINT(5 5 5)'::geometry geom union all select 'POINT(-2 3 1)'::geometry geom union all select 'LINESTRING(5 5 5, 10 10 10)'::geometry geom ) as foo; st_asewkt --------- GEOMETRYCOLLECTION(POINT(-2 3 1),LINESTRING(5 5 5,10 10 10),POLYGON((-7 4.2 2,-7.1 4.2 3,-7.1 4.3 2,-7 4.2 2))) --Examples using new Array construct SELECT ST_Union(ARRAY(SELECT geom FROM sometable)); SELECT ST_AsText(ST_Union(ARRAY[ST_GeomFromText('LINESTRING(1 2, 3 4)'), ST_GeomFromText('LINESTRING(3 4, 4 5)')])) As wktunion; --wktunion--- MULTILINESTRING((3 4,4 5),(1 2,3 4))
这些函数计算几何构造,或改变几何尺寸或形状。
ST_Buffer — 计算覆盖距几何体给定距离内所有点的几何体。
geometry ST_Buffer(
geometry g1, float radius_of_buffer, text buffer_style_parameters = '')
;
geometry ST_Buffer(
geometry g1, float radius_of_buffer, integer num_seg_quarter_circle)
;
geography ST_Buffer(
geography g1, float radius_of_buffer, text buffer_style_parameters)
;
geography ST_Buffer(
geography g1, float radius_of_buffer, integer num_seg_quarter_circle)
;
计算表示与几何/地理距离小于或等于给定距离的所有点的 POLYGON 或 MULTIPOLYGON。 负距离会缩小几何图形而不是扩展它。 负距离可能会完全缩小多边形,在这种情况下返回 POLYGON EMPTY。 对于点和线,负距离始终返回空结果。
对于几何体,距离以几何体的空间参考系的单位指定。 对于地理,距离以米为单位指定。
可选的第三个参数控制缓冲区的精度和样式。 缓冲区中圆弧的精度指定为用于近似四分之一圆的线段数(默认值为 8)。 可以通过提供空白分隔的键=值对列表来指定缓冲区样式,如下所示:
'quad_segs=#' :用于近似四分之一圆的线段数(默认为 8)。
'endcap=round|flat|square' :endcap 样式(默认为“round”)。 “butt”被认为是“flat”的同义词。
'join=round|mitre|bevel' :连接样式(默认为“round”)。 “mitre”被认为是“mitre”的同义词。
'mitre_limit=#.#' :斜接比率限制(仅影响斜接连接样式)。 “miter_limit”被接受为“mitre_limit”的同义词。
'side=both|left|right' :'left' 或 'right' 在几何体上执行单边缓冲,缓冲边相对于线的方向。 这仅适用于 LINESTRING 几何图形,不影响 POINT 或 POLYGON 几何图形。 默认情况下,终止样式是方形的。
![]() | |
|
![]() | |
缓冲区输出始终是有效的多边形几何体。 缓冲区可以处理无效输入,因此距离 0 的缓冲有时被用作修复无效多边形的一种方法。 ST_MakeValid也可用于此目的。 |
![]() | |
缓冲有时用于执行近距离搜索。 对于此用例,使用ST_DWithin效率更高。 |
![]() | |
此函数忽略 Z 维度。 即使在 3D 几何体上使用时,它也始终给出 2D 结果。 |
增强:2.5.0 - ST_Buffer的几何感知版本已得到增强,允许您指定要缓冲的一侧。side=both|left|right
。
可用性:1.5 - ST_Buffer 已得到增强,以适应各种端接和接缝。 例如,您可能希望将道路线串转换为街道面,并希望将端点视为平面或正方形而不是圆。 添加了地理的薄包装器。
这个函数是由 GEOS 模块执行的。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1.30
![]() quad_segs=8 (默认)
SELECT ST_Buffer( ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=8');
| ![]() quad_secs=2(不足)
SELECT ST_Buffer( ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2');
| |
![]() endcap=round join=round (默认)
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'endcap=round join=round');
| ![]() endcap=square
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'endcap=square join=round');
| ![]() endcap=flat
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'endcap=flat join=round');
|
![]() join=bevel
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=bevel');
| ![]() join=mitre mitre_limit=5.0 (默认最大斜接比率)
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=mitre mitre_limit=5.0');
| ![]() join=mitre mitre_limit=1
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=mitre mitre_limit=1.0');
|
![]() side=left
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'side=left');
| ![]() side=right
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'side=right');
| ![]() side=left join=mitre
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'side=left join=mitre');
|
![]() 顺时针方向,多边形边界向左
SELECT ST_Buffer( ST_ForceRHR( ST_Boundary( ST_GeomFromText( 'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))), ), 20, 'side=left');
| ![]() 顺时针方向,多边形边界向右
SELECT ST_Buffer( ST_ForceRHR( ST_Boundary( ST_GeomFromText( 'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))')) ), 20,'side=right')
|
--A buffered point approximates a circle -- A buffered point forcing approximation of (see diagram) -- 2 points per quarter circle is poly with 8 sides (see diagram) SELECT ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As promisingcircle_pcount, ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 2)) As lamecircle_pcount; promisingcircle_pcount | lamecircle_pcount ------------------------+------------------- 33 | 9 --A lighter but lamer circle -- only 2 points per quarter circle is an octagon --Below is a 100 meter octagon -- Note coordinates are in NAD 83 long lat which we transform to Mass state plane meter and then buffer to get measurements in meters; SELECT ST_AsText(ST_Buffer( ST_Transform( ST_SetSRID(ST_Point(-71.063526, 42.35785),4269), 26986) ,100,2)) As octagon; ---------------------- POLYGON((236057.59057465 900908.759918696,236028.301252769 900838.049240578,235 957.59057465 900808.759918696,235886.879896532 900838.049240578,235857.59057465 900908.759918696,235886.879896532 900979.470596815,235957.59057465 901008.759918 696,236028.301252769 900979.470596815,236057.59057465 900908.759918696))
ST_BuildArea — 创建由几何体的线条形成的多边形几何体。
geometry ST_BuildArea(
geometry geom)
;
创建由输入几何体的组成线条形成的面几何体。 输入可以是 LineString、MultiLineString、Polygon、MultiPolygon 或 GeometryCollection。 结果是多边形或多多边形,具体取决于输入。 如果输入线条未形成多边形,则返回 NULL。
与 ST_MakePolygon 不同,此函数接受由多条线形成的环,并且可以形成任意数量的多边形。
此功能将内环转换为孔。 要将内环也转换为多边形,请使用 ST_Polygonize。
![]() | |
输入线条必须正确,节点才能使此功能正常工作。ST_Node可用于节点线。 如果输入线条交叉,此函数将生成无效的多边形。ST_MakeValid可用于确保输出有效。 |
可用性:1.1.0
![]() 输入线
|
![]() 生成的多边形
|
WITH data(geom) AS (VALUES ('LINESTRING (180 40, 30 20, 20 90)'::geometry) ,('LINESTRING (180 40, 160 160)'::geometry) ,('LINESTRING (160 160, 80 190, 80 120, 20 90)'::geometry) ,('LINESTRING (80 60, 120 130, 150 80)'::geometry) ,('LINESTRING (80 60, 150 80)'::geometry) ) SELECT ST_AsText( ST_BuildArea( ST_Collect( geom ))) FROM data; ------------------------------------------------------------------------------------------ POLYGON((180 40,30 20,20 90,80 120,80 190,160 160,180 40),(150 80,120 130,80 60,150 80))
用两个圆形多边形创建一个环形
SELECT ST_BuildArea(ST_Collect(inring,outring)) FROM (SELECT ST_Buffer('POINT(100 90)', 25) As inring, ST_Buffer('POINT(100 90)', 50) As outring) As t;
ST_Collect, ST_MakePolygon, ST_MakeValid, ST_Node, ST_Polygonize, ST_BdPolyFromText, ST_BdMPolyFromText (使用标准 OGC 接口对该函数进行包装)
ST_Centroid — 返回几何体的几何中心。
geometry ST_Centroid(
geometry g1)
;
geography ST_Centroid(
geography g1, boolean use_spheroid = true)
;
计算作为几何体的几何质心的点。 对于 [MULTI
]POINT
,质心是输入坐标的算术平均值。 对于 [MULTI
]LINESTRING
,质心是使用每条线段的加权长度计算的。 对于 [MULTI
]POLYGON
,质心是根据面积计算的。 如果提供了空几何图形,则返回空的GEOMETRYCOLLECTION
。 如果提供 NULL
,则返回 NULL
。 如果提供了CIRCULARSTRING
或COMPOUNDCURVE
,它们首先使用CurveToLine转换为线串,然后与LINESTRING
相同
对于混合维度输入,结果等于最高维度的组件几何图形的质心(因为较低维度的几何图形对质心的“权重”贡献为零)。
请注意,对于多边形几何形状,质心不一定位于多边形的内部。 例如,请参见下图 C 形多边形的质心。 要构造保证位于多边形内部的点,请使用 ST_PointOnSurface。
2.3.0 中的新增功能:支持 CIRCULARSTRING
和 COMPOUNDCURVE
(使用 CurveToLine)
可用性:2.4.0 引入了对地理的支持。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 8.1.4, 9.5.5
在下图中,红点是源几何体的质心。
![]()
| ![]()
|
![]()
| ![]()
|
SELECT ST_AsText(ST_Centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )')); st_astext ------------------------------------------ POINT(2.30769230769231 3.30769230769231) (1 row) SELECT ST_AsText(ST_centroid(g)) FROM ST_GeomFromText('CIRCULARSTRING(0 2, -1 1,0 0, 0.5 0, 1 0, 2 1, 1 2, 0.5 2, 0 2)') AS g ; ------------------------------------------ POINT(0.5 1) SELECT ST_AsText(ST_centroid(g)) FROM ST_GeomFromText('COMPOUNDCURVE(CIRCULARSTRING(0 2, -1 1,0 0),(0 0, 0.5 0, 1 0),CIRCULARSTRING( 1 0, 2 1, 1 2),(1 2, 0.5 2, 0 2))' ) AS g; ------------------------------------------ POINT(0.5 1)
ST_ChaikinSmoothing — 使用 Chaikin 算法返回几何图形的平滑版本
geometry ST_ChaikinSmoothing(
geometry geom, integer nIterations = 1, boolean preserveEndPoints = false)
;
使用 Chaikin 算法平滑线性或多边形几何体。 平滑程度由 nIterations
参数控制。 在每次迭代中,每个内部顶点都被位于顶点前后线段长度 1/4 处的两个顶点替换。 3次迭代提供了合理的平滑度; 最大限制为 5。
如果preserveEndPoints
为true,则多边形环的端点不会被平滑。 LineStrings 的端点始终被保留。
![]() | |
每次迭代顶点数量都会加倍,因此结果几何图形的点可能比输入多得多。 要减少点数,请对结果使用简化函数(请参阅 ST_Simplify、ST_SimplifyPreserveTopology 和 ST_SimplifyVW)。 |
结果具有 Z 和 M 维度(如果存在)的插值。
该函数支持 3d 并且不会丢失 z-index。
可用性:2.5.0
平滑triangle(三角形):
SELECT ST_AsText(ST_ChaikinSmoothing(geom)) smoothed FROM (SELECT 'POLYGON((0 0, 8 8, 0 16, 0 0))'::geometry geom) AS foo; smoothed ─────────────────────────────────────────── POLYGON((2 2,6 6,6 10,2 14,0 12,0 4,2 2))
使用 1、2 和 3 次迭代平滑Polygon:
![]() nIterations = 1 | ![]() nIterations = 2 | ![]() nIterations = 3 |
SELECT ST_ChaikinSmoothing( 'POLYGON ((20 20, 60 90, 10 150, 100 190, 190 160, 130 120, 190 50, 140 70, 120 10, 90 60, 20 20))', generate_series(1, 3) );
使用 1、2 和 3 次迭代平滑 LineString:
![]() nIterations = 1 | ![]() nIterations = 2 | ![]() nIterations = 3 |
SELECT ST_ChaikinSmoothing( 'LINESTRING (10 140, 80 130, 100 190, 190 150, 140 20, 120 120, 50 30, 30 100)', generate_series(1, 3) );
ST_ConcaveHull — 计算包含所有输入几何顶点的可能凹几何
geometry ST_ConcaveHull(
geometry param_geom, float param_pctconvex, boolean param_allow_holes = false)
;
凹壳是(通常)凹几何体,包含输入,其顶点是输入顶点的子集。 一般情况下,凹壳是多边形。 两个或多个共线点的凹包是两点线串。 一个或多个相同点的凹壳是一个点。 除非可选的 param_allow_holes
参数指定为 true,否则多边形将不包含孔。
凹壳可以被认为是“真空包装”的几何形状的集合。 它与凸壳不同,凸壳类似于用橡皮筋将其封闭。 凹形的圆角通常面积较小,并且具有由输入点组成的自然边界。
param_pctconvex
控制计算的外壳的凹度。 值为 1 会生成凸包。 1 到 0 之间的值会产生凹度逐渐增加的外壳。 值为 0 会产生具有最大凹度的外壳(但仍然是单个多边形)。 选择合适的值取决于输入数据的性质,但通常 0.3 到 0.1 之间的值会产生合理的结果。
![]() | |
从技术上讲, |
对于点和线性输入,外壳将包含输入的所有点。 对于多边形输入,外壳将包围输入的所有点以及输入覆盖的所有区域。 如果您想要多边形输入的逐点外壳,请首先使用ST_Points将其转换为点。
这不是聚合函数。 要计算一组几何图形的凹壳,请使用 ST_Collect(例如 ST_ConcaveHull( ST_Collect( geom ), 0.80)
。
可用性: 2.0.0
增强:3.3.0,为 GEOS 3.11+ 启用 GEOS 本机实现
多点的凹壳
SELECT ST_AsText( ST_ConcaveHull( 'MULTIPOINT ((10 72), (53 76), (56 66), (63 58), (71 51), (81 48), (91 46), (101 45), (111 46), (121 47), (131 50), (140 55), (145 64), (144 74), (135 80), (125 83), (115 85), (105 87), (95 89), (85 91), (75 93), (65 95), (55 98), (45 102), (37 107), (29 114), (22 122), (19 132), (18 142), (21 151), (27 160), (35 167), (44 172), (54 175), (64 178), (74 180), (84 181), (94 181), (104 181), (114 181), (124 181), (134 179), (144 177), (153 173), (162 168), (171 162), (177 154), (182 145), (184 135), (139 132), (136 142), (128 149), (119 153), (109 155), (99 155), (89 155), (79 153), (69 150), (61 144), (63 134), (72 128), (82 125), (92 123), (102 121), (112 119), (122 118), (132 116), (142 113), (151 110), (161 106), (170 102), (178 96), (185 88), (189 78), (190 68), (189 58), (185 49), (179 41), (171 34), (162 29), (153 25), (143 23), (133 21), (123 19), (113 19), (102 19), (92 19), (82 19), (72 21), (62 22), (52 25), (43 29), (33 34), (25 41), (19 49), (14 58), (21 73), (31 74), (42 74), (173 134), (161 134), (150 133), (97 104), (52 117), (157 156), (94 171), (112 106), (169 73), (58 165), (149 40), (70 33), (147 157), (48 153), (140 96), (47 129), (173 55), (144 86), (159 67), (150 146), (38 136), (111 170), (124 94), (26 59), (60 41), (71 162), (41 64), (88 110), (122 34), (151 97), (157 56), (39 146), (88 33), (159 45), (47 56), (138 40), (129 165), (33 48), (106 31), (169 147), (37 122), (71 109), (163 89), (37 156), (82 170), (180 72), (29 142), (46 41), (59 155), (124 106), (157 80), (175 82), (56 50), (62 116), (113 95), (144 167))', 0.1 ) ); ---st_astext-- POLYGON ((18 142, 21 151, 27 160, 35 167, 44 172, 54 175, 64 178, 74 180, 84 181, 94 181, 104 181, 114 181, 124 181, 134 179, 144 177, 153 173, 162 168, 171 162, 177 154, 182 145, 184 135, 173 134, 161 134, 150 133, 139 132, 136 142, 128 149, 119 153, 109 155, 99 155, 89 155, 79 153, 69 150, 61 144, 63 134, 72 128, 82 125, 92 123, 102 121, 112 119, 122 118, 132 116, 142 113, 151 110, 161 106, 170 102, 178 96, 185 88, 189 78, 190 68, 189 58, 185 49, 179 41, 171 34, 162 29, 153 25, 143 23, 133 21, 123 19, 113 19, 102 19, 92 19, 82 19, 72 21, 62 22, 52 25, 43 29, 33 34, 25 41, 19 49, 14 58, 10 72, 21 73, 31 74, 42 74, 53 76, 56 66, 63 58, 71 51, 81 48, 91 46, 101 45, 111 46, 121 47, 131 50, 140 55, 145 64, 144 74, 135 80, 125 83, 115 85, 105 87, 95 89, 85 91, 75 93, 65 95, 55 98, 45 102, 37 107, 29 114, 22 122, 19 132, 18 142))
多点的凹面外壳,允许有孔
SELECT ST_AsText( ST_ConcaveHull( 'MULTIPOINT ((132 64), (114 64), (99 64), (81 64), (63 64), (57 49), (52 36), (46 20), (37 20), (26 20), (32 36), (39 55), (43 69), (50 84), (57 100), (63 118), (68 133), (74 149), (81 164), (88 180), (101 180), (112 180), (119 164), (126 149), (132 131), (139 113), (143 100), (150 84), (157 69), (163 51), (168 36), (174 20), (163 20), (150 20), (143 36), (139 49), (132 64), (99 151), (92 138), (88 124), (81 109), (74 93), (70 82), (83 82), (99 82), (112 82), (126 82), (121 96), (114 109), (110 122), (103 138), (99 151), (34 27), (43 31), (48 44), (46 58), (52 73), (63 73), (61 84), (72 71), (90 69), (101 76), (123 71), (141 62), (166 27), (150 33), (159 36), (146 44), (154 53), (152 62), (146 73), (134 76), (143 82), (141 91), (130 98), (126 104), (132 113), (128 127), (117 122), (112 133), (119 144), (108 147), (119 153), (110 171), (103 164), (92 171), (86 160), (88 142), (79 140), (72 124), (83 131), (79 118), (68 113), (63 102), (68 93), (35 45))', 0.15, true ) ); ---st_astext-- POLYGON ((43 69, 50 84, 57 100, 63 118, 68 133, 74 149, 81 164, 88 180, 101 180, 112 180, 119 164, 126 149, 132 131, 139 113, 143 100, 150 84, 157 69, 163 51, 168 36, 174 20, 163 20, 150 20, 143 36, 139 49, 132 64, 114 64, 99 64, 81 64, 63 64, 57 49, 52 36, 46 20, 37 20, 26 20, 32 36, 35 45, 39 55, 43 69), (88 124, 81 109, 74 93, 83 82, 99 82, 112 82, 121 96, 114 109, 110 122, 103 138, 92 138, 88 124))
![]()
| ![]()
|
将多边形的凹壳与组成点的凹壳进行比较。 外壳遵循多边形的边界,而基于点的外壳则不然。
WITH data(geom) AS (VALUES ('POLYGON ((10 90, 39 85, 61 79, 50 90, 80 80, 95 55, 25 60, 90 45, 70 16, 63 38, 60 10, 50 30, 43 27, 30 10, 20 20, 10 90))'::geometry) ) SELECT ST_ConcaveHull( geom, 0.1) AS polygon_hull, ST_ConcaveHull( ST_Points(geom), 0.1) AS points_hull FROM data;
与 ST_Collect 一起使用来计算几何图形集的凹壳。
-- Compute estimate of infected area based on point observations SELECT disease_type, ST_ConcaveHull( ST_Collect(obs_pnt), 0.3 ) AS geom FROM disease_obs GROUP BY disease_type;
ST_ConvexHull — 计算几何体的凸包。
geometry ST_ConvexHull(
geometry geomA)
;
计算几何图形的凸包。 凸包是包含所有输入几何的最小凸几何体。
人们可以将凸包视为通过将橡皮筋缠绕在一组几何图形上而获得的几何图形。 这与凹形外壳不同,凹形外壳类似于“收缩包装”几何形状。 凸包通常用于根据一组点观测来确定受影响的区域。
一般情况下,凸包是多边形。 两个或多个共线点的凸包是两点线串。 一个或多个相同点的凸包是一个点。
这不是聚合函数。 要计算一组几何图形的凸包,请使用ST_Collect将它们聚合到几何集合中(例如 ST_ConvexHull(ST_Collect(geom))
。
它是通过GEOS模块实现的
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1.16
该函数支持 3d 并且不会丢失 z-index。
多线串和多点的凸包
SELECT ST_AsText(ST_ConvexHull( ST_Collect( ST_GeomFromText('MULTILINESTRING((100 190,10 8),(150 10, 20 30))'), ST_GeomFromText('MULTIPOINT(50 5, 150 30, 50 10, 10 10)') )) ); ---st_astext-- POLYGON((50 5,10 8,10 10,100 190,150 30,150 10,50 5))
与 ST_Collect 一起使用来计算几何图形集的凸包。
--Get estimate of infected area based on point observations SELECT d.disease_type, ST_ConvexHull(ST_Collect(d.geom)) As geom FROM disease_obs As d GROUP BY d.disease_type;
ST_DelaunayTriangles — 返回几何体顶点的 Delaunay 三角剖分。
geometry ST_DelaunayTriangles(
geometry g1, float tolerance = 0.0, int4 flags = 0)
;
计算输入几何体顶点的 Delaunay 三角剖分。 可选的容差
可用于将附近的输入顶点捕捉在一起,这在某些情况下提高了稳健性。 结果几何图形以输入顶点的凸包为边界。 结果几何表示由标志
代码确定:
0
- 三角形 POLYGON 的 GEOMETRYCOLLECTION(默认)
1
- 三角测量边缘的多线
2
- 三角测量的 TIN
这个函数是由 GEOS 模块执行的。
可用性:2.1.0
该函数支持 3d 并且不会丢失 z-index。
此函数支持三角形和不规则三角网面 (TIN)。
![]() 原始多边形 our original geometry
ST_Union(ST_GeomFromText('POLYGON((175 150, 20 40,
50 60, 125 100, 175 150))'),
ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
) |
![]() 2 个多边形的 ST_DelaunayTriangles:delaunay 三角形多边形,每个三角形以不同颜色为主题
geometries overlaid multilinestring triangles
SELECT
ST_DelaunayTriangles(
ST_Union(ST_GeomFromText('POLYGON((175 150, 20 40,
50 60, 125 100, 175 150))'),
ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
))
As dtriag;
|
![]() -- delaunay 三角形作为多线串
SELECT ST_DelaunayTriangles( ST_Union(ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'), ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20) ),0.001,1) As dtriag;
|
![]() -- 45 个点的 delaunay 三角形作为 55 个三角形多边形
this produces a table of 42 points that form an L shape SELECT (ST_DumpPoints(ST_GeomFromText( 'MULTIPOINT(14 14,34 14,54 14,74 14,94 14,114 14,134 14, 150 14,154 14,154 6,134 6,114 6,94 6,74 6,54 6,34 6, 14 6,10 6,8 6,7 7,6 8,6 10,6 30,6 50,6 70,6 90,6 110,6 130, 6 150,6 170,6 190,6 194,14 194,14 174,14 154,14 134,14 114, 14 94,14 74,14 54,14 34,14 14)'))).geom INTO TABLE l_shape; output as individual polygon triangles SELECT ST_AsText((ST_Dump(geom)).geom) As wkt FROM ( SELECT ST_DelaunayTriangles(ST_Collect(geom)) As geom FROM l_shape) As foo; wkt POLYGON((6 194,6 190,14 194,6 194)) POLYGON((14 194,6 190,14 174,14 194)) POLYGON((14 194,14 174,154 14,14 194)) POLYGON((154 14,14 174,14 154,154 14)) POLYGON((154 14,14 154,150 14,154 14)) POLYGON((154 14,150 14,154 6,154 14))
|
使用具有 Z 值的顶点的示例。
3D multipoint SELECT ST_AsText(ST_DelaunayTriangles(ST_GeomFromText( 'MULTIPOINT Z(14 14 10, 150 14 100,34 6 25, 20 10 150)'))) As wkt; wkt GEOMETRYCOLLECTION Z (POLYGON Z ((14 14 10,20 10 150,34 6 25,14 14 10)) ,POLYGON Z ((14 14 10,34 6 25,150 14 100,14 14 10)))
ST_FilterByM — 根据 M 值删除顶点
geometry ST_FilterByM(
geometry geom, double precision min, double precision max = null, boolean returnM = false)
;
根据 M 值过滤掉顶点。 返回仅包含 M 值大于或等于最小值且小于或等于最大值的顶点的几何图形。 如果省略最大值参数,则仅考虑最小值。 如果省略第四个参数,则 m 值将不会出现在生成的几何图形中。 如果生成的几何图形为其几何类型留下的顶点太少,则将返回空几何图形。 在几何集合中,没有足够点的几何图形将被默默地排除。
该函数主要与 ST_SetEffectiveArea 结合使用。 ST_EffectiveArea 用其 m 值设置顶点的有效区域。 使用 ST_FilterByM,无需任何计算,只需过滤即可获得几何的简化版本
![]() | |
与 ST_FilterByM 相比,当没有足够的点满足条件时,ST_SimplifyVW 返回的结果有所不同。 ST_SimplifyVW 返回具有足够点的几何图形,而 ST_FilterByM 返回空几何图形 |
![]() | |
请注意,返回的几何图形可能无效 |
![]() | |
该函数返回所有维度,包括 Z 和 M 值 |
可用性:2.5.0
线串被过滤
SELECT ST_AsText(ST_FilterByM(geom,30)) simplified
FROM (SELECT ST_SetEffectiveArea('LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)'::geometry) geom) As foo;
result
simplified
----------------------------
LINESTRING(5 2,7 25,10 10)
ST_GeneratePoints — 生成一个包含在多边形(Polygon)或多重多边形(MultiPolygon)内的随机点的多点对象。
geometry ST_GeneratePoints(
geometry g, integer npoints, integer seed = 0)
;
ST_GeneratePoints 生成一个包含指定数量伪随机点的多点对象,这些点位于输入区域内。可选的 seed
用于重新生成一个确定性的点序列,必须大于零。
可用性:2.3.0
增强:3.0.0,添加种子参数
使用随机种子值 1996,在原始多边形上生成了一个包含 12 个点的多点对象
SELECT ST_GeneratePoints(geom, 12, 1996) FROM ( SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)'), 10, 'endcap=round join=round') AS geom ) AS s;
给定一个多边形表 s,返回每个多边形 12 个单独的点。每次运行结果都会不同。
SELECT s.id, dp.path[1] AS pt_id, dp.geom FROM s, ST_DumpPoints(ST_GeneratePoints(s.geom,12)) AS dp;
ST_GeometricMedian — 返回多点的几何中位数。
geometry ST_GeometricMedian (
geometry geom, float8 tolerance = NULL, int max_iter = 10000, boolean fail_if_not_converged = false)
;
使用 Weiszfeld 算法计算多点几何的近似几何中值。 几何中位数是最小化到输入点的距离总和的点。 它提供了一种中心性度量,与质心(质心)相比,它对异常点不太敏感。
该算法进行迭代,直到连续迭代之间的距离变化小于提供的容差
参数。 如果在 max_iterations
次迭代后仍未满足此条件,则函数会产生错误并退出,除非fail_if_not_converged
设置为 false
(默认值)。
如果未提供容差
参数,则根据输入几何图形的范围计算公差值。
如果存在,输入点 M 值将被解释为它们的相对权重。
可用性:2.3.0
增强:2.5.0 添加了对 M 作为点权重的支持。
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
多点的几何中值(红色)和质心(绿松石色)的比较。
WITH test AS ( SELECT 'MULTIPOINT((10 10), (10 40), (40 10), (190 190))'::geometry geom) SELECT ST_AsText(ST_Centroid(geom)) centroid, ST_AsText(ST_GeometricMedian(geom)) median FROM test; centroid | median --------------------+---------------------------------------- POINT(62.5 62.5) | POINT(25.01778421249728 25.01778421249728) (1 row)
ST_LineMerge — 返回通过将 MultiLineString 缝合在一起形成的线。
geometry ST_LineMerge(
geometry amultilinestring)
;
geometry ST_LineMerge(
geometry amultilinestring, boolean directed)
;
返回通过将 MultiLineString 的线元素连接在一起而形成的 LineString 或 MultiLineString。 线在 2 线交叉点处的端点处连接。 线不会在三向或更高阶次的交叉点上连接。
如果定向为 TRUE,则 ST_LineMerge 将不会更改 LineStrings 内的点顺序,因此方向相反的线不会被合并
![]() | |
仅与 MultiLineString/LineString 一起使用。 其他几何类型返回空的 GeometryCollection |
这个函数是由 GEOS 模块执行的。
增强:3.3.0 接受定向参数。
需要 GEOS >= 3.11.0 才能使用定向参数。
可用性:1.1.0
![]() | |
此函数剥离 M 维度。 |
合并不同方向的线。
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((10 160, 60 120), (120 140, 60 120), (120 140, 180 120))' )); -------------------------------------------- LINESTRING(10 160,60 120,120 140,180 120)
在交点的度数大于2时,线段不会合并。
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((10 160, 60 120), (120 140, 60 120), (120 140, 180 120), (100 180, 120 140))' )); -------------------------------------------- MULTILINESTRING((10 160,60 120,120 140),(100 180,120 140),(120 140,180 120))
如果由于不接触线而无法合并,则返回原始 MultiLineString。
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45.2 -33.2,-46 -32))' )); ---------------- MULTILINESTRING((-45.2 -33.2,-46 -32),(-29 -27,-30 -29.7,-36 -31,-45 -33))
如果directed = TRUE,则不合并具有相反方向的线。
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((60 30, 10 70), (120 50, 60 30), (120 50, 180 30))', TRUE)); ------------------------------------------------------- MULTILINESTRING((120 50,60 30,10 70),(120 50,180 30))
显示 处理Z 维度的示例。
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((-29 -27 11,-30 -29.7 10,-36 -31 5,-45 -33 6), (-29 -27 12,-30 -29.7 5), (-45 -33 1,-46 -32 11))' )); -------------------------------------------------------------------------------------------------- LINESTRING Z (-30 -29.7 5,-29 -27 11,-30 -29.7 10,-36 -31 5,-45 -33 1,-46 -32 11)
ST_MaximumInscribedCircle — 计算几何体中包含的最大圆。
(geometry, geometry, double precision) ST_MaximumInscribedCircle(
geometry geom)
;
查找(多)多边形内包含的最大圆,或者不与任何线和点重叠的最大圆。 返回包含字段的记录:
center
-圆的中心点
nearest
-几何上最接近中心的点
radius
-圆的半径
对于多边形输入,圆内接于边界环内,使用内环作为边界。 对于线性和点输入,圆内切于输入的凸包内,使用输入线和点作为进一步的边界。
可用性:3.1.0。
需要GEOS >= 3.9.0。
多边形的最大内切圆。 返回中心、最近点和半径。
SELECT radius, ST_AsText(center) AS center, ST_AsText(nearest) AS nearest FROM ST_MaximumInscribedCircle( 'POLYGON ((40 180, 110 160, 180 180, 180 120, 140 90, 160 40, 80 10, 70 40, 20 50, 40 180), (60 140, 50 90, 90 140, 60 140))'); radius | center | nearest -----------------+----------------------------+--------------- 45.165845650018 | POINT(96.953125 76.328125) | POINT(140 90)
多线串的最大内切圆。 返回中心、最近点和半径。
ST_LargestEmptyCircle — 计算不与几何图形重叠的最大圆。
(geometry, geometry, double precision) ST_LargestEmptyCircle(
geometry geom, double precision tolerance=0.0, geometry boundary=POINT EMPTY)
;
找到不与一组点和线障碍物重叠的最大圆。 (多边形几何图形可以作为障碍物包含在内,但仅使用它们的边界线。)圆的中心被限制位于多边形边界内,默认情况下,多边形边界是输入几何图形的凸包。 圆心是边界内部距离障碍物最远的点。 圆本身由中心点和位于确定圆半径的障碍物上的最近点提供。
使用迭代算法将圆心确定为由距离容差指定的给定精度。 如果未指定精度距离,则使用合理的默认值。
返回包含字段的记录:
center
-圆的中心点
nearest
-几何上最接近中心的点
radius
-圆的半径
要查找多边形内部最大的空圆,请参见ST_MaximumInscribedCircle。
可用性:3.4.0。
需要GEOS >= 3.9.0。
SELECT radius, center, nearest FROM ST_LargestEmptyCircle( 'MULTILINESTRING ( (10 100, 60 180, 130 150, 190 160), (20 50, 70 70, 90 20, 110 40), (160 30, 100 100, 180 100))');
一组线内最大的空圆。
SELECT radius, center, nearest FROM ST_LargestEmptyCircle( ST_Collect( 'MULTIPOINT ((70 50), (60 130), (130 150), (80 90))'::geometry, 'POLYGON ((90 190, 10 100, 60 10, 190 40, 120 100, 190 180, 90 190))'::geometry), 0, 'POLYGON ((90 190, 10 100, 60 10, 190 40, 120 100, 190 180, 90 190))'::geometry );
一组点内最大的空圆,约束位于多边形内。 约束多边形边界必须作为障碍物包含在内,并指定为圆心的约束。
ST_MinimumBoundingCircle — 返回包含几何图形的最小圆形多边形。
geometry ST_MinimumBoundingCircle(
geometry geomA, integer num_segs_per_qt_circ=48)
;
返回包含几何图形的最小圆形多边形。
![]() | |
边界圆近似为多边形,默认情况下每四分之一圆有 48 个线段。 由于多边形是最小外接圆的近似值,因此输入几何中的某些点可能不包含在多边形内。 可以通过增加分段数量来改进近似值。 对于近似值不合适的应用,可以使用 ST_MinimumBoundingRadius。 |
与ST_Collect 一起使用以获得一组几何图形的最小边界圆。
要计算位于最小圆(“最大直径”)上的两个点,请使用ST_LongestLine。
多边形的面积除以最小包含圆的面积之比称为 REOCK 紧致度得分。
这个函数是由 GEOS 模块执行的。
可用性:1.4.0
SELECT d.disease_type, ST_MinimumBoundingCircle(ST_Collect(d.geom)) As geom FROM disease_obs As d GROUP BY d.disease_type;
点和线串的最小外接圆。 用8段近似四分之一圆
SELECT ST_AsText(ST_MinimumBoundingCircle( ST_Collect( ST_GeomFromText('LINESTRING(55 75,125 150)'), ST_Point(20, 80)), 8 )) As wktmbc; wktmbc ----------- POLYGON((135.59714732062 115,134.384753327498 102.690357210921,130.79416296937 90.8537670908995,124.963360620072 79.9451031602111,117.116420743937 70.3835792560632,107.554896839789 62.5366393799277,96.6462329091006 56.70583703063,84.8096427890789 53.115246672502,72.5000000000001 51.9028526793802,60.1903572109213 53.1152466725019,48.3537670908996 56.7058370306299,37.4451031602112 62.5366393799276,27.8835792560632 70.383579256063,20.0366393799278 79.9451031602109,14.20583703063 90.8537670908993,10.615246672502 102.690357210921,9.40285267938019 115,10.6152466725019 127.309642789079,14.2058370306299 139.1462329091,20.0366393799275 150.054896839789,27.883579256063 159.616420743937, 37.4451031602108 167.463360620072,48.3537670908992 173.29416296937,60.190357210921 176.884753327498, 72.4999999999998 178.09714732062,84.8096427890786 176.884753327498,96.6462329091003 173.29416296937,107.554896839789 167.463360620072, 117.116420743937 159.616420743937,124.963360620072 150.054896839789,130.79416296937 139.146232909101,134.384753327498 127.309642789079,135.59714732062 115))
ST_MinimumBoundingRadius — 返回包含几何图形的最小圆的中心点和半径。
(geometry, double precision) ST_MinimumBoundingRadius(
geometry geom)
;
计算包含几何图形的最小圆的中心点和半径。 返回包含字段的记录:
center
-圆的中心点
radius
-圆的半径
与ST_Collect 一起使用以获得一组几何图形的最小边界圆。
要计算位于最小圆(“最大直径”)上的两个点,请使用ST_LongestLine。
可用性-2.3.0
SELECT ST_AsText(center), radius FROM ST_MinimumBoundingRadius('POLYGON((26426 65078,26531 65242,26075 65136,26096 65427,26426 65078))'); st_astext | radius ------------------------------------------+------------------ POINT(26284.8418027133 65267.1145090825) | 247.436045591407
ST_OrientedEnvelope — 返回包含几何图形的最小面积矩形。
geometry ST_OrientedEnvelope(
geometry geom )
;
返回包围几何体的最小面积旋转矩形。 请注意,可能存在多个这样的矩形。 在退化输入的情况下可能返回 Point 或 LineString。
可用性:2.5.0。
需要GEOS >= 3.6.0。
SELECT ST_AsText(ST_OrientedEnvelope('MULTIPOINT ((0 0), (-1 -1), (3 2))')); st_astext ------------------------------------------------ POLYGON((3 2,2.88 2.16,-1.12 -0.84,-1 -1,3 2))
点和线串的最小外接矩形。
SELECT ST_AsText(ST_OrientedEnvelope( ST_Collect( ST_GeomFromText('LINESTRING(55 75,125 150)'), ST_Point(20, 80)) )) As wktenv; wktenv ----------- POLYGON((19.9999999999997 79.9999999999999,33.0769230769229 60.3846153846152,138.076923076924 130.384615384616,125.000000000001 150.000000000001,19.9999999999997 79.9999999999999))
ST_OffsetCurve — 返回距输入线给定距离和方向的偏移线。
geometry ST_OffsetCurve(
geometry line, float signed_distance, text style_parameters='')
;
返回距输入线给定距离和方向的偏移线。 返回几何图形的所有点与输入几何图形的距离不超过给定距离。 对于计算围绕中心线的平行线很有用。
对于正距离,偏移位于输入线的左侧并保持相同的方向。 对于负距离,它位于右侧且方向相反。
距离单位以空间参考系的单位来测量。
请注意,对于某些拼图形状的输入几何图形,输出可能是 MULTILINESTRING 或 EMPTY。
可选的第三个参数允许指定空白分隔的键=值对的列表来调整操作,如下所示:
'quad_segs=#' :用于近似四分之一圆的线段数(默认为 8)。
'join=round|mitre|bevel' :连接样式(默认为“round”)。 “mitre”也被认为是“mitre”的同义词。
'mitre_limit=#.#' :斜接比率限制(仅影响斜接连接样式)。 “miter_limit”也被接受为“mitre_limit”的同义词。
这个函数是由 GEOS 模块执行的。
Behavior changed in GEOS 3.11 so offset curves now have the same direction as the input line, for both positive and negative offsets.
可用性:2.0
增强:2.5 - 添加了对 GEOMETRYCOLLECTION 和 MULTILINESTRING 的支持
![]() | |
此函数忽略 Z 维度。 即使在 3D 几何体上使用时,它也始终给出 2D 结果。 |
计算道路周围的开放缓冲区
SELECT ST_Union( ST_OffsetCurve(f.geom, f.width/2, 'quad_segs=4 join=round'), ST_OffsetCurve(f.geom, -f.width/2, 'quad_segs=4 join=round') ) as track FROM someroadstable;
![]() 15、'quad_segs=4 join=round' 原始线及其偏移 15 个单位。
SELECT ST_AsText(ST_OffsetCurve(ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)'),
15, 'quad_segs=4 join=round'));
output
LINESTRING(164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,
5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195)
| ![]() -15, 'quad_segs=4 join=round' 原始线及其偏移量-15个单位
SELECT ST_AsText(ST_OffsetCurve(geom,
-15, 'quad_segs=4 join=round')) As notsocurvy
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
notsocurvy
LINESTRING(31 195,31 31,164 31)
|
![]() 双偏移以获得更多曲线,请注意第一个反转方向,因此 -30+15 = -15
SELECT ST_AsText(ST_OffsetCurve(ST_OffsetCurve(geom,
-30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')) As morecurvy
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
morecurvy
LINESTRING(164 31,46 31,40.2597485145236 32.1418070123307,
35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195)
| ![]() 双偏移以获得更多曲线,与常规偏移 15 结合以获得平行线。 与原图重叠。
SELECT ST_AsText(ST_Collect(
ST_OffsetCurve(geom, 15, 'quad_segs=4 join=round'),
ST_OffsetCurve(ST_OffsetCurve(geom,
-30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')
)
) As parallel_curves
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
parallel curves
MULTILINESTRING((164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195),
(164 31,46 31,40.2597485145236 32.1418070123307,35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195))
|
![]() 15、'quad_segs=4 join=bevel' 显示为原始线
SELECT ST_AsText(ST_OffsetCurve(ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)'),
15, 'quad_segs=4 join=bevel'));
output
LINESTRING(164 1,18 1,7.39339828220179 5.39339828220179,
5.39339828220179 7.39339828220179,1 18,1 195)
| ![]() 15、-15收集,join=mitre mitre_limit=2.1
SELECT ST_AsText(ST_Collect(
ST_OffsetCurve(geom, 15, 'quad_segs=4 join=mitre mitre_limit=2.2'),
ST_OffsetCurve(geom, -15, 'quad_segs=4 join=mitre mitre_limit=2.2')
) )
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
output
MULTILINESTRING((164 1,11.7867965644036 1,1 11.7867965644036,1 195),
(31 195,31 31,164 31))
|
ST_PointOnSurface — 计算保证位于多边形或几何体上的点。
geometry ST_PointOnSurface(
geometry g1)
;
返回保证位于曲面内部的POINT
(POLYGON
、MULTIPOLYGON
和 CURVEPOLYGON
) 。 在 PostGIS 中,此函数也适用于线和点几何图形。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s3.2.14.2 // s3.2.18.2
该方法实现了SQL/MM规范。 SQL-MM 3:8.1.5、9.5.6。 该规范仅针对表面几何形状定义 ST_PointOnSurface。 PostGIS扩展了功能以支持所有常见的几何类型。 其他数据库(Oracle、DB2、ArcSDE)似乎仅支持曲面的此功能。 SQL Server 2008 支持所有常见的几何类型。
该函数支持 3d 并且不会丢失 z-index。
![]()
| ![]()
|
![]()
| ![]()
|
SELECT ST_AsText(ST_PointOnSurface('POINT(0 5)'::geometry)); ------------ POINT(0 5) SELECT ST_AsText(ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry)); ------------ POINT(0 5) SELECT ST_AsText(ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry)); ---------------- POINT(2.5 2.5) SELECT ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT('LINESTRING(0 5 1, 0 0 1, 0 10 2)'))); ---------------- POINT(0 0 1)
示例:ST_PointOnSurface 的结果保证位于多边形内,而 ST_Centroid计算的点可能位于多边形外。
红色:表面上的点; 绿色:质心
SELECT ST_AsText(ST_PointOnSurface(geom)) AS pt_on_surf, ST_AsText(ST_Centroid(geom)) AS centroid FROM (SELECT 'POLYGON ((130 120, 120 190, 30 140, 50 20, 190 20, 170 100, 90 60, 90 130, 130 120))'::geometry AS geom) AS t; pt_on_surf | centroid -----------------+--------------------------------------------- POINT(62.5 110) | POINT(100.18264840182648 85.11415525114155)
ST_Polygonize — 计算由一组几何图形的线条形成的多边形集合。
geometry ST_Polygonize(
geometry set geomfield)
;
geometry ST_Polygonize(
geometry[] geom_array)
;
创建一个 GeometryCollection,其中包含由一组几何图形的线条形成的多边形。 如果输入线条未形成任何多边形,则返回空的 GeometryCollection。
此函数创建覆盖所有分隔区域的多边形。 如果结果旨在形成有效的多边形几何体,请使用 ST_BuildArea 来防止填充孔。
![]() | |
输入线条必须正确节点才能使该功能正常工作。 为了确保输入已节点化,请在多边形化之前在输入几何体上使用 ST_Node。 |
![]() | |
使用外部工具可能很难处理几何集合。 使用ST_Dump 将多边形结果转换为单独的多边形。 |
这个函数是由 GEOS 模块执行的。
可用性: 1.0.0RC1
![]() 输入线
|
![]() 多边形化结果
|
WITH data(geom) AS (VALUES ('LINESTRING (180 40, 30 20, 20 90)'::geometry) ,('LINESTRING (180 40, 160 160)'::geometry) ,('LINESTRING (80 60, 120 130, 150 80)'::geometry) ,('LINESTRING (80 60, 150 80)'::geometry) ,('LINESTRING (20 90, 70 70, 80 130)'::geometry) ,('LINESTRING (80 130, 160 160)'::geometry) ,('LINESTRING (20 90, 20 160, 70 190)'::geometry) ,('LINESTRING (70 190, 80 130)'::geometry) ,('LINESTRING (70 190, 160 160)'::geometry) ) SELECT ST_AsText( ST_Polygonize( geom )) FROM data; ------------------------------------------------------------------------------------------ GEOMETRYCOLLECTION (POLYGON ((180 40, 30 20, 20 90, 70 70, 80 130, 160 160, 180 40), (150 80, 120 130, 80 60, 150 80)), POLYGON ((20 90, 20 160, 70 190, 80 130, 70 70, 20 90)), POLYGON ((160 160, 80 130, 70 190, 160 160)), POLYGON ((80 60, 120 130, 150 80, 80 60)))
多边形线串表:
SELECT ST_AsEWKT(ST_Polygonize(geom_4269)) As geomtextrep FROM (SELECT geom_4269 FROM ma.suffolk_edges) As foo; ------------------------------------- SRID=4269;GEOMETRYCOLLECTION(POLYGON((-71.040878 42.285678,-71.040943 42.2856,-71.04096 42.285752,-71.040878 42.285678)), POLYGON((-71.17166 42.353675,-71.172026 42.354044,-71.17239 42.354358,-71.171794 42.354971,-71.170511 42.354855, -71.17112 42.354238,-71.17166 42.353675))) --Use ST_Dump to dump out the polygonize geoms into individual polygons SELECT ST_AsEWKT((ST_Dump(t.polycoll)).geom) AS geomtextrep FROM (SELECT ST_Polygonize(geom_4269) AS polycoll FROM (SELECT geom_4269 FROM ma.suffolk_edges) As foo) AS t; ------------------------ SRID=4269;POLYGON((-71.040878 42.285678,-71.040943 42.2856,-71.04096 42.285752, -71.040878 42.285678)) SRID=4269;POLYGON((-71.17166 42.353675,-71.172026 42.354044,-71.17239 42.354358 ,-71.171794 42.354971,-71.170511 42.354855,-71.17112 42.354238,-71.17166 42.353675))
ST_ReducePrecision — 返回有效的几何图形,其点舍入到网格公差。
geometry ST_ReducePrecision(
geometry g, float8 gridsize)
;
返回有效的几何图形,其中所有点均舍入到提供的网格公差,并删除低于公差的要素。
与ST_SnapToGrid 不同,返回的几何图形将是有效的,没有环自相交或折叠组件。
精度降低可用于:
将坐标精度与数据精度相匹配
减少表示几何图形所需的坐标数量
确保有效的几何输出为使用较低精度的格式(例如,当输出小数位数有限时,WKT、GeoJSON 或 KML 等文本格式)。
将有效几何图形导出到使用较低或有限精度的系统(例如 SDE、Oracle 公差值)
可用性:3.1.0。
需要GEOS >= 3.9.0。
SELECT ST_AsText(ST_ReducePrecision('POINT(1.412 19.323)', 0.1)); st_astext ----------------- POINT(1.4 19.3) SELECT ST_AsText(ST_ReducePrecision('POINT(1.412 19.323)', 1.0)); st_astext ------------- POINT(1 19) SELECT ST_AsText(ST_ReducePrecision('POINT(1.412 19.323)', 10)); st_astext ------------- POINT(0 20)
降低精度可以减少顶点数量
SELECT ST_AsText(ST_ReducePrecision('LINESTRING (10 10, 19.6 30.1, 20 30, 20.3 30, 40 40)', 1)); st_astext ------------- LINESTRING (10 10, 20 30, 40 40)
如果需要的话,精度降低会分割多边形以确保有效性
SELECT ST_AsText(ST_ReducePrecision('POLYGON ((10 10, 60 60.1, 70 30, 40 40, 50 10, 10 10))', 10)); st_astext ------------- MULTIPOLYGON (((60 60, 70 30, 40 40, 60 60)), ((40 40, 50 10, 10 10, 40 40)))
ST_Simplify — 返回几何图形的简化表示,使用 Douglas-Peucker算法。
geometry ST_Simplify(
geometry geom, float tolerance)
;
geometry ST_Simplify(
geometry geom, float tolerance, boolean preserveCollapsed)
;
使用Douglas-Peucker算法计算几何图形的简化表示。简化的tolerance
是一个距离值,以输入SRS的单位为准。简化会移除在简化线条的公差距离内的顶点。即使输入是有效的,结果可能不是有效的。
该函数可用于任何类型的几何图形(包括GeometryCollections),但只有线和多边形元素会被简化。线性几何的端点将被保留。
preserveCollapsed
标志保留那些在给定公差下本应被移除的小几何图形。例如,如果将一个1米长的线条使用10米的公差进行简化,当preserveCollapsed
为true时,该线条将不会消失。这个标志对于渲染目的很有用,以防止地图上非常小的特征消失。
![]() | |
返回的几何图形可能会失去其简单性(参见ST_IsSimple),拓扑可能不会被保留,并且多边形结果可能是无效的(参见ST_IsValid)。使用ST_SimplifyPreserveTopology来保留拓扑并确保有效性。 |
![]() | |
该函数不保留多边形之间共享的边界。如果需要保留共享边界,请使用ST_CoverageSimplify。 |
可用性:1.2.2
它是一个经过简化后变成三角形或八角形的圆,
SELECT ST_Npoints(geom) AS np_before, ST_NPoints(ST_Simplify(geom, 0.1)) AS np01_notbadcircle, ST_NPoints(ST_Simplify(geom, 0.5)) AS np05_notquitecircle, ST_NPoints(ST_Simplify(geom, 1)) AS np1_octagon, ST_NPoints(ST_Simplify(geom, 10)) AS np10_triangle, (ST_Simplify(geom, 100) is null) AS np100_geometrygoesaway FROM (SELECT ST_Buffer('POINT(1 3)', 10,12) As geom) AS t; np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_triangle | np100_geometrygoesaway -----------+-------------------+---------------------+-------------+---------------+------------------------ 49 | 33 | 17 | 9 | 4 | t
简化一组线。简化后,线可能会相交。
SELECT ST_Simplify( 'MULTILINESTRING ((20 180, 20 150, 50 150, 50 100, 110 150, 150 140, 170 120), (20 10, 80 30, 90 120), (90 120, 130 130), (130 130, 130 70, 160 40, 180 60, 180 90, 140 80), (50 40, 70 40, 80 70, 70 60, 60 60, 50 50, 50 40))', 40);
简化一个MultiPolygon。多边形的结果可能是无效的。
SELECT ST_Simplify( 'MULTIPOLYGON (((90 110, 80 180, 50 160, 10 170, 10 140, 20 110, 90 110)), ((40 80, 100 100, 120 160, 170 180, 190 70, 140 10, 110 40, 60 40, 40 80), (180 70, 170 110, 142.5 128.5, 128.5 77.5, 90 60, 180 70)))', 40);
ST_IsSimple, ST_SimplifyPreserveTopology, ST_SimplifyVW, ST_CoverageSimplify, Topology ST_Simplify
ST_SimplifyPreserveTopology — 使用Douglas-Peucker算法返回几何图形的简化且有效表示。
geometry ST_SimplifyPreserveTopology(
geometry geom, float tolerance)
;
使用一种变体的Douglas-Peucker 算法 计算几何图形的简化表示,该算法限制简化以确保结果具有与输入相同的拓扑。简化的tolerance
是一个距离值,以输入SRS的单位为准。只要保留拓扑,简化会移除在简化线条的公差距离内的顶点。如果输入是有效和简单的,则结果也将是有效和简单的。
该函数可用于任何类型的几何图形(包括GeometryCollections),但只有线和多边形元素会被简化。对于多边形输入,结果将具有相同数量的环(外壳和内环),并且这些环不会相交。环的端点可能会被简化。对于线性输入,结果将具有相同数量的线,如果在原始几何中它们不相交,则线也不会相交。线性几何的端点将被保留。
![]() | |
该函数不保留多边形之间共享的边界。如果需要保留共享边界,请使用ST_CoverageSimplify。 |
这个函数是由 GEOS 模块执行的。
可用性:1.3.3
对于与ST_Simplify相同的示例,ST_SimplifyPreserveTopology防止过度简化。圆最多可以变成一个正方形。
SELECT ST_Npoints(geom) AS np_before, ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.1)) AS np01_notbadcircle, ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.5)) AS np05_notquitecircle, ST_NPoints(ST_SimplifyPreserveTopology(geom, 1)) AS np1_octagon, ST_NPoints(ST_SimplifyPreserveTopology(geom, 10)) AS np10_square, ST_NPoints(ST_SimplifyPreserveTopology(geom, 100)) AS np100_stillsquare FROM (SELECT ST_Buffer('POINT(1 3)', 10,12) AS geom) AS t; np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_square | np100_stillsquare -----------+-------------------+---------------------+-------------+-------------+------------------- 49 | 33 | 17 | 9 | 5 | 5
简化一组线,保留非相交线的拓扑。
SELECT ST_SimplifyPreserveTopology( 'MULTILINESTRING ((20 180, 20 150, 50 150, 50 100, 110 150, 150 140, 170 120), (20 10, 80 30, 90 120), (90 120, 130 130), (130 130, 130 70, 160 40, 180 60, 180 90, 140 80), (50 40, 70 40, 80 70, 70 60, 60 60, 50 50, 50 40))', 40);
简化一个MultiPolygon,保留外壳和内环的拓扑。
SELECT ST_SimplifyPreserveTopology( 'MULTIPOLYGON (((90 110, 80 180, 50 160, 10 170, 10 140, 20 110, 90 110)), ((40 80, 100 100, 120 160, 170 180, 190 70, 140 10, 110 40, 60 40, 40 80), (180 70, 170 110, 142.5 128.5, 128.5 77.5, 90 60, 180 70)))', 40);
ST_SimplifyPolygonHull — 计算多边形几何的简化的保留拓扑的外部或内部外壳。
geometry ST_SimplifyPolygonHull(
geometry param_geom, float vertex_fraction, boolean is_outer = true)
;
计算多边形几何的简化的保留拓扑的外部或内部外壳。 外壳完全覆盖输入几何体。 内部外壳完全被输入几何体覆盖。 结果是由输入顶点的子集形成的多边形几何体。 处理多重多边形和孔并产生与输入结构相同的结果。
顶点数的减少由 vertex_fraction
参数控制,该参数是 0 到 1 范围内的数字。值越低,结果越简单,顶点数越少,凹度也越小。 对于外壳和内壳,顶点分数 1.0 生成原始几何形状。 对于外壳,值 0.0 生成凸包(对于单个多边形); 对于内壳,它会生成一个三角形。
简化过程通过逐步删除包含最少面积的凹角来进行,直到达到顶点数目标。 它可以防止边交叉,因此结果始终是有效的多边形几何体。
为了获得包含相对较长线段的几何图形的更好结果,可能需要“分段”输入,如下所示。
这个函数是由 GEOS 模块执行的。
可用性:3.3.0。
需要GEOS >= 3.11.0。
多边形的外壳
SELECT ST_SimplifyPolygonHull( 'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))', 0.3);
多边形的内壳
SELECT ST_SimplifyPolygonHull( 'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))', 0.3, false);
多多边形 的外壳简化,具有分段功能
SELECT ST_SimplifyPolygonHull( ST_Segmentize(ST_Letters('xt'), 2.0), 0.1);
ST_SimplifyVW — 使用Visvalingam-Whyatt算法返回几何图形的简化表示
geometry ST_SimplifyVW(
geometry geom, float tolerance)
;
使用Visvalingam-Whyatt 算法返回几何图形的简化表示。简化的tolerance
是一个面积值,以输入SRS的单位为准。简化会移除与面积小于公差的“拐角”形成的顶点。即使输入是有效的,结果可能也不是有效的。
该函数可用于任何类型的几何图形(包括GeometryCollections),但只有线和多边形元素会被简化。线性几何的端点将被保留。
![]() | |
返回的几何图形可能会失去其简单性(参见ST_IsSimple),拓扑可能不会被保留,并且多边形的结果可能是无效的(参见ST_IsValid)。使用ST_SimplifyPreserveTopology来保留拓扑并确保有效性。ST_CoverageSimplify也会保留拓扑和有效性。 |
![]() | |
该函数不保留多边形之间共享的边界。如果需要保留共享边界,请使用ST_CoverageSimplify。 |
![]() | |
该函数处理 3D,第三维将影响结果。 |
可用性:2.2.0
使用最小面积公差为30对LineString进行简化。
SELECT ST_AsText(ST_SimplifyVW(geom,30)) simplified FROM (SELECT 'LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)'::geometry AS geom) AS t; simplified ------------------------------ LINESTRING(5 2,7 25,10 10)
对一条线进行简化。
SELECT ST_SimplifyVW( 'LINESTRING (10 10, 50 40, 30 70, 50 60, 70 80, 50 110, 100 100, 90 140, 100 180, 150 170, 170 140, 190 90, 180 40, 110 40, 150 20)', 1600);
对多边形进行简化。
SELECT ST_SimplifyVW( 'MULTIPOLYGON (((90 110, 80 180, 50 160, 10 170, 10 140, 20 110, 90 110)), ((40 80, 100 100, 120 160, 170 180, 190 70, 140 10, 110 40, 60 40, 40 80), (180 70, 170 110, 142.5 128.5, 128.5 77.5, 90 60, 180 70)))', 40);
ST_SetEffectiveArea — 使用 Visvalingam-Whyatt 算法设置每个顶点的有效区域。
geometry ST_SetEffectiveArea(
geometry geom, float threshold = 0, integer set_area = 1)
;
使用 Visvalingam-Whyatt 算法设置每个顶点的有效区域。 有效区域存储为顶点的 M 值。 如果使用可选的“theshold”参数,则将返回简化的几何图形,仅包含有效区域大于或等于阈值的顶点。
当指定阈值时,此函数可用于服务器端简化。 另一种选择是使用零阈值。 在这种情况下,将返回完整的几何图形,其中有效区域作为 M 值,客户端可以使用它来快速简化。
实际上只会对(多)线和(多)多边形执行某些操作,但您可以使用任何类型的几何体安全地调用它。 由于简化是在逐个对象的基础上进行的,因此您还可以将 GeometryCollection 提供给此函数。
![]() | |
请注意,返回的几何图形可能会失去其简单性(请参阅ST_IsSimple) |
![]() | |
请注意,拓扑可能不会保留,并可能导致无效的几何图形。 使用(请参阅ST_SimplifyPreserveTopology)保留拓扑。 |
![]() | |
输出几何图形将丢失 M 值中的所有先前信息 |
![]() | |
此功能处理 3D,三维度会影响有效区域 |
可用性:2.2.0
计算 LineString 的有效区域。 因为我们使用阈值为零,所以返回输入几何体中的所有顶点。
select ST_AsText(ST_SetEffectiveArea(geom)) all_pts, ST_AsText(ST_SetEffectiveArea(geom,30) ) thrshld_30 FROM (SELECT 'LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)'::geometry geom) As foo; -result all_pts | thrshld_30 -----------+-------------------+ LINESTRING M (5 2 3.40282346638529e+38,3 8 29,6 20 1.5,7 25 49.5,10 10 3.40282346638529e+38) | LINESTRING M (5 2 3.40282346638529e+38,7 25 49.5,10 10 3.40282346638529e+38)
ST_TriangulatePolygon — 计算多边形的约束 Delaunay 三角剖分
geometry ST_TriangulatePolygon(
geometry geom)
;
计算多边形的约束 Delaunay 三角剖分。 支持孔和多边形。
多边形的“约束 Delaunay 三角剖分”是由多边形的顶点形成的一组三角形,并精确地覆盖它,并且在所有可能的三角剖分上具有最大总内角。 它提供了多边形的“最佳质量”三角测量。
可用性:3.3.0。
需要GEOS >= 3.11.0。
正方形的三角剖分。
SELECT ST_AsText( ST_TriangulatePolygon('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')); st_astext --------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((0 0,0 1,1 1,0 0)),POLYGON((1 1,1 0,0 0,1 1)))
字母 P 的三角剖分。
SELECT ST_AsText(ST_TriangulatePolygon( 'POLYGON ((26 17, 31 19, 34 21, 37 24, 38 29, 39 43, 39 161, 38 172, 36 176, 34 179, 30 181, 25 183, 10 185, 10 190, 100 190, 121 189, 139 187, 154 182, 167 177, 177 169, 184 161, 189 152, 190 141, 188 128, 186 123, 184 117, 180 113, 176 108, 170 104, 164 101, 151 96, 136 92, 119 89, 100 89, 86 89, 73 89, 73 39, 74 32, 75 27, 77 23, 79 20, 83 18, 89 17, 106 15, 106 10, 10 10, 10 15, 26 17), (152 147, 151 152, 149 157, 146 162, 142 166, 137 169, 132 172, 126 175, 118 177, 109 179, 99 180, 89 180, 80 179, 76 178, 74 176, 73 171, 73 100, 85 99, 91 99, 102 99, 112 100, 121 102, 128 104, 134 107, 139 110, 143 114, 147 118, 149 123, 151 128, 153 141, 152 147))' ));
多边形三角剖分
SELECT ST_TriangulatePolygon( 'POLYGON (( 10 190, 10 70, 80 70, 80 130, 50 160, 120 160, 120 190, 10 190 ))'::geometry );
ST_AsText 输出
GEOMETRYCOLLECTION(POLYGON((50 160,120 190,120 160,50 160)) ,POLYGON((10 70,80 130,80 70,10 70)) ,POLYGON((50 160,10 70,10 190,50 160)) ,POLYGON((120 190,50 160,10 190,120 190)) ,POLYGON((80 130,10 70,50 160,80 130)))
![]() 原始多边形 |
![]() 三角形多边形 |
ST_VoronoiLines — 返回几何体顶点的 Voronoi 图的边界。
geometry ST_VoronoiLines(
geometry geom , float8 tolerance = 0.0 , geometry extend_to = NULL )
;
根据提供的几何图形的顶点计算二维 Voronoi 图,并将图中单元格之间的边界作为 MultiLineString 返回。 如果输入几何图形为 null,则返回 null。 如果输入几何图形仅包含一个顶点,则返回一个空几何图形集合。 如果extend_to
最小外接矩形的面积为零,则返回空几何集合。
可选参数:
tolerance
:顶点被视为相等的距离。 通过提供非零容差距离可以提高算法的稳健性。 (默认 = 0.0)
extend_to
:如果存在,图表将扩展以覆盖所提供几何图形的最小外接矩形,除非小于默认最小外接矩形(默认 = NULL,默认最小外接矩形是输入扩展约 50% 的边界框)。
这个函数是由 GEOS 模块执行的。
可用性:2.3.0
Voronoi 图线,容差为 30 个单位
SELECT ST_VoronoiLines( 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry, 30) AS geom;
ST_AsText output
MULTILINESTRING((135.555555555556 270,36.8181818181818 92.2727272727273),(36.8181818181818 92.2727272727273,-110 43.3333333333333),(230 -45.7142857142858,36.8181818181818 92.2727272727273))
ST_VoronoiPolygons — 返回几何体顶点的 Voronoi 图的单元格。
geometry ST_VoronoiPolygons(
geometry geom , float8 tolerance = 0.0 , geometry extend_to = NULL )
;
根据提供的几何图形的顶点计算二维 Voronoi 图。 结果是 POLYGON 的 GEOMETRYCOLLECTION,其覆盖的包络大于输入顶点的范围。 如果输入几何图形为 null,则返回 null。 如果输入几何图形仅包含一个顶点,则返回一个空几何图形集合。 如果extend_to
最小外接矩形的面积为零,则返回空几何集合。
可选参数:
tolerance
:顶点被视为相等的距离。 通过提供非零容差距离可以提高算法的稳健性。 (默认 = 0.0)
extend_to
:如果存在,图表将扩展以覆盖所提供几何图形的最小外接矩形,除非小于默认最小外接矩形(默认 = NULL,默认最小外接矩形是输入扩展约 50% 的边界框)。
这个函数是由 GEOS 模块执行的。
可用性:2.3.0
覆盖在 Voronoi 图顶部的点
SELECT ST_VoronoiPolygons( 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry ) AS geom;
ST_AsText output
GEOMETRYCOLLECTION(POLYGON((-110 43.3333333333333,-110 270,100.5 270,59.3478260869565 132.826086956522,36.8181818181818 92.2727272727273,-110 43.3333333333333)),
POLYGON((55 -90,-110 -90,-110 43.3333333333333,36.8181818181818 92.2727272727273,55 79.2857142857143,55 -90)),
POLYGON((230 47.5,230 -20.7142857142857,55 79.2857142857143,36.8181818181818 92.2727272727273,59.3478260869565 132.826086956522,230 47.5)),POLYGON((230 -20.7142857142857,230 -90,55 -90,55 79.2857142857143,230 -20.7142857142857)),
POLYGON((100.5 270,230 270,230 47.5,59.3478260869565 132.826086956522,100.5 270)))
Voronoi 图,容差为 30 个单位
SELECT ST_VoronoiPolygons( 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry, 30) AS geom;
ST_AsText output
GEOMETRYCOLLECTION(POLYGON((-110 43.3333333333333,-110 270,100.5 270,59.3478260869565 132.826086956522,36.8181818181818 92.2727272727273,-110 43.3333333333333)),
POLYGON((230 47.5,230 -45.7142857142858,36.8181818181818 92.2727272727273,59.3478260869565 132.826086956522,230 47.5)),POLYGON((230 -45.7142857142858,230 -90,-110 -90,-110 43.3333333333333,36.8181818181818 92.2727272727273,230 -45.7142857142858)),
POLYGON((100.5 270,230 270,230 47.5,59.3478260869565 132.826086956522,100.5 270)))
这些函数对形成“隐式覆盖”的多边形几何体集进行操作。 为了形成有效的覆盖范围,多边形不得重叠,并且相邻边的顶点必须完全匹配。 覆盖处理速度很快,并且可以使用窗口函数进行操作,窗口函数保留窗口分区内的覆盖拓扑,同时更改边缘。
ST_CoverageInvalidEdges — 用于查找多边形无法形成有效覆盖范围的位置的窗口函数。
geometry ST_CoverageInvalidEdges(
geometry winset geom, float8 tolerance = 0)
;
一个窗口函数,用于检查窗口分区中的多边形是否形成有效的多边形覆盖范围。 它返回线性指示器,显示每个多边形中无效边(如果有)的位置。
如果满足以下条件,则一组有效多边形是有效的覆盖范围:
Non-overlapping-多边形不重叠(它们的内部不相交)
Edge-Matched-沿共享边的顶点相同
作为窗口函数,为每个输入多边形返回一个值。 对于违反一个或多个有效性条件的多边形,返回值是包含有问题边的 MULTILINESTRING。 覆盖范围有效的面返回值 NULL。 非多边形或空几何图形也会产生 NULL 值。
只要周围的多边形边缘匹配,这些条件就允许有效的覆盖范围包含孔(多边形之间的间隙)。 然而,非常窄的间隙通常是不希望的。 如果使用非零距离指定公差
参数,则形成较窄间隙的边缘也将被返回为无效。
正在检查覆盖范围有效性的多边形也必须是有效的几何图形。 这可以使用ST_IsValid 进行检查。
可用性:3.4.0
需要GEOS >= 3.12.0
由重叠和不匹配顶点引起的无效边
WITH coverage(id, geom) AS (VALUES (1, 'POLYGON ((10 190, 30 160, 40 110, 100 70, 120 10, 10 10, 10 190))'::geometry), (2, 'POLYGON ((100 190, 10 190, 30 160, 40 110, 50 80, 74 110.5, 100 130, 140 120, 140 160, 100 190))'::geometry), (3, 'POLYGON ((140 190, 190 190, 190 80, 140 80, 140 190))'::geometry), (4, 'POLYGON ((180 40, 120 10, 100 70, 140 80, 190 80, 180 40))'::geometry) ) SELECT id, ST_AsText(ST_CoverageInvalidEdges(geom) OVER ()) FROM coverage; id | st_astext ----+--------------------------------------- 1 | LINESTRING (40 110, 100 70) 2 | MULTILINESTRING ((100 130, 140 120, 140 160, 100 190), (40 110, 50 80, 74 110.5)) 3 | LINESTRING (140 80, 140 190) 4 | null
-- Test entire table for coverage validity SELECT true = ALL ( SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL FROM coverage );
ST_CoverageSimplify — 简化多边形覆盖范围边缘的窗口函数。
geometry ST_CoverageSimplify(
geometry winset geom, float8 tolerance, boolean simplifyBoundary = true)
;
一种窗函数,可简化多边形覆盖范围内的多边形边缘。 简化保留了覆盖拓扑。 这意味着简化的输出多边形沿着共享边是一致的,并且仍然形成有效的覆盖范围。
简化使用了 Visvalingam–Whyatt 算法的格式。 公差
参数以距离为单位,大致等于待简化的三角形面积的平方根。
要仅简化 Coverage 的“内部”边缘(由两个多边形共享的边缘),请将 SimplyBoundary
参数设置为 false。
![]() | |
如果输入不是有效的覆盖范围,则输出中可能会出现意外的伪影(例如边界交叉点或看似共享的分离边界)。 使用 ST_CoverageInvalidEdges 确定覆盖范围是否有效。 |
可用性:3.4.0
需要GEOS >= 3.12.0
![]() 输入覆盖范围
|
![]() 简化覆盖范围
|
WITH coverage(id, geom) AS (VALUES (1, 'POLYGON ((160 150, 110 130, 90 100, 90 70, 60 60, 50 10, 30 30, 40 50, 25 40, 10 60, 30 100, 30 120, 20 170, 60 180, 90 190, 130 180, 130 160, 160 150), (40 160, 50 140, 66 125, 60 100, 80 140, 90 170, 60 160, 40 160))'::geometry), (2, 'POLYGON ((40 160, 60 160, 90 170, 80 140, 60 100, 66 125, 50 140, 40 160))'::geometry), (3, 'POLYGON ((110 130, 160 50, 140 50, 120 33, 90 30, 50 10, 60 60, 90 70, 90 100, 110 130))'::geometry), (4, 'POLYGON ((160 150, 150 120, 160 90, 160 50, 110 130, 160 150))'::geometry) ) SELECT id, ST_AsText(ST_CoverageSimplify(geom, 30) OVER ()) FROM coverage; id | st_astext ----+--------------------------------------- 1 | POLYGON ((160 150, 110 130, 50 10, 10 60, 20 170, 90 190, 160 150), (40 160, 66 125, 90 170, 40 160)) 2 | POLYGON ((40 160, 66 125, 90 170, 40 160)) 3 | POLYGON ((110 130, 160 50, 50 10, 110 130)) 4 | POLYGON ((160 150, 160 50, 110 130, 160 150))
ST_CoverageUnion — 通过删除共享边来计算形成覆盖范围的一组多边形的并集。
geometry ST_CoverageUnion(
geometry set geom)
;
将一组多边形联合起来形成多边形覆盖范围的聚合函数。 结果是覆盖与覆盖范围相同的区域的多边形几何体。 该函数产生与 ST_Union相同的结果,但使用覆盖结构来更快地计算并集。
![]() | |
如果输入不是有效的覆盖范围,则输出中可能会出现意外的伪影(例如未合并或重叠的多边形)。 使用 ST_CoverageInvalidEdges确定覆盖范围是否有效。 |
可用性:3.4.0-需要 GEOS >= 3.8.0
![]() 输入覆盖范围
|
![]() 联合结果
|
WITH coverage(id, geom) AS (VALUES (1, 'POLYGON ((10 10, 10 150, 80 190, 110 150, 90 110, 40 110, 50 60, 10 10))'::geometry), (2, 'POLYGON ((120 10, 10 10, 50 60, 100 70, 120 10))'::geometry), (3, 'POLYGON ((140 80, 120 10, 100 70, 40 110, 90 110, 110 150, 140 80))'::geometry), (4, 'POLYGON ((140 190, 120 170, 140 130, 160 150, 140 190))'::geometry), (5, 'POLYGON ((180 160, 170 140, 140 130, 160 150, 140 190, 180 160))'::geometry) ) SELECT ST_AsText(ST_CoverageUnion(geom)) FROM coverage; -------------------------------------- MULTIPOLYGON (((10 150, 80 190, 110 150, 140 80, 120 10, 10 10, 10 150), (50 60, 100 70, 40 110, 50 60)), ((120 170, 140 190, 180 160, 170 140, 140 130, 120 170)))
这些函数使用仿射变换来改变几何图形的位置和形状。
ST_Affine — 对几何体应用 3D 仿射变换。
geometry ST_Affine(
geometry geomA, float a, float b, float c, float d, float e, float f, float g, float h, float i, float xoff, float yoff, float zoff)
;
geometry ST_Affine(
geometry geomA, float a, float b, float d, float e, float xoff, float yoff)
;
对几何体应用 3D 仿射变换,一步完成平移、旋转、缩放等操作。
版本1:调用
ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff)
表示变换矩阵
/ a b c xoff \ | d e f yoff | | g h i zoff | \ 0 0 0 1 /
并且顶点变换如下:
x' = a*x + b*y + c*z + xoff y' = d*x + e*y + f*z + yoff z' = g*x + h*y + i*z + zoff
下面所有的平移/缩放函数都是通过这样的仿射变换来表达的。
版本 2:对几何体应用 2d 仿射变换。 调用
ST_Affine(geom, a, b, d, e, xoff, yoff)
表示变换矩阵
/ a b 0 xoff \ / a b xoff \ | d e 0 yoff | rsp. | d e yoff | | 0 0 1 0 | 0 0 1 0 \ 0 0 1 / \ 0 0 0 1 /
并且顶点变换如下:
x' = a*x + b*y + xoff y' = d*x + e*y + yoff z' = z
此方法是上述 3D 方法的子情况。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
可用性:1.1.2。 1.2.2 中名称从 Affine 更改为 ST_Affine
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
--Rotate a 3d line 180 degrees about the z axis. Note this is long-hand for doing ST_Rotate(); SELECT ST_AsEWKT(ST_Affine(geom, cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), 0, 0, 0, 1, 0, 0, 0)) As using_affine, ST_AsEWKT(ST_Rotate(geom, pi())) As using_rotate FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As geom) As foo; using_affine | using_rotate -----------------------------+----------------------------- LINESTRING(-1 -2 3,-1 -4 3) | LINESTRING(-1 -2 3,-1 -4 3) (1 row) --Rotate a 3d line 180 degrees in both the x and z axis SELECT ST_AsEWKT(ST_Affine(geom, cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), 0, 0, 0)) FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As geom) As foo; st_asewkt ------------------------------- LINESTRING(-1 -2 -3,-1 -4 -3) (1 row)
ST_Rotate — 绕原点旋转几何体。
geometry ST_Rotate(
geometry geomA, float rotRadians)
;
geometry ST_Rotate(
geometry geomA, float rotRadians, float x0, float y0)
;
geometry ST_Rotate(
geometry geomA, float rotRadians, geometry pointOrigin)
;
围绕原点逆时针旋转几何体 rotRadians。 旋转原点可以指定为 POINT 几何图形,也可以指定为 x 和 y 坐标。 如果未指定原点,则几何图形将围绕 POINT(0 0) 旋转。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
增强:2.0.0 添加了用于指定旋转原点的附加参数。
可用性:1.1.2。 1.2.2 中名称从 Rotate 更改为 ST_Rotate
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
--Rotate 180 degrees SELECT ST_AsEWKT(ST_Rotate('LINESTRING (50 160, 50 50, 100 50)', pi())); st_asewkt --------------------------------------- LINESTRING(-50 -160,-50 -50,-100 -50) (1 row) --Rotate 30 degrees counter-clockwise at x=50, y=160 SELECT ST_AsEWKT(ST_Rotate('LINESTRING (50 160, 50 50, 100 50)', pi()/6, 50, 160)); st_asewkt --------------------------------------------------------------------------- LINESTRING(50 160,105 64.7372055837117,148.301270189222 89.7372055837117) (1 row) --Rotate 60 degrees clockwise from centroid SELECT ST_AsEWKT(ST_Rotate(geom, -pi()/3, ST_Centroid(geom))) FROM (SELECT 'LINESTRING (50 160, 50 50, 100 50)'::geometry AS geom) AS foo; st_asewkt -------------------------------------------------------------- LINESTRING(116.4225 130.6721,21.1597 75.6721,46.1597 32.3708) (1 row)
ST_RotateX — 绕 X 轴旋转几何体。
geometry ST_RotateX(
geometry geomA, float rotRadians)
;
绕 X 轴旋转几何体 geomA - rotRadians。
![]() | |
|
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
可用性:1.1.2。 1.2.2 中名称从 RotateX 更改为 ST_RotateX
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
此函数支持三角形和不规则三角网面 (TIN)。
--Rotate a line 90 degrees along x-axis SELECT ST_AsEWKT(ST_RotateX(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2)); st_asewkt --------------------------- LINESTRING(1 -3 2,1 -1 1)
ST_RotateY — 绕 Y 轴旋转几何体。
geometry ST_RotateY(
geometry geomA, float rotRadians)
;
围绕 y 轴旋转几何体 geomA - rotRadians。
![]() | |
|
可用性:1.1.2。 1.2.2 中名称从 RotateY 更改为 ST_RotateY
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
此函数支持三角形和不规则三角网面 (TIN)。
--Rotate a line 90 degrees along y-axis SELECT ST_AsEWKT(ST_RotateY(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2)); st_asewkt --------------------------- LINESTRING(3 2 -1,1 1 -1)
ST_RotateZ — 绕 Z 轴旋转几何体。
geometry ST_RotateZ(
geometry geomA, float rotRadians)
;
绕 Z 轴旋转几何体 geomA - rotRadians。
![]() | |
这是 ST_Rotate 的同义词 |
![]() | |
|
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
可用性:1.1.2。 1.2.2 中名称从 RotateZ 更改为 ST_RotateZ
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
--Rotate a line 90 degrees along z-axis SELECT ST_AsEWKT(ST_RotateZ(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2)); st_asewkt --------------------------- LINESTRING(-2 1 3,-1 1 1) --Rotate a curved circle around z-axis SELECT ST_AsEWKT(ST_RotateZ(geom, pi()/2)) FROM (SELECT ST_LineToCurve(ST_Buffer(ST_GeomFromText('POINT(234 567)'), 3)) As geom) As foo; st_asewkt ---------------------------------------------------------------------------------------------------------------------------- CURVEPOLYGON(CIRCULARSTRING(-567 237,-564.87867965644 236.12132034356,-564 234,-569.12132034356 231.87867965644,-567 237))
ST_Scale — 按给定因子缩放几何图形。
geometry ST_Scale(
geometry geomA, float XFactor, float YFactor, float ZFactor)
;
geometry ST_Scale(
geometry geomA, float XFactor, float YFactor)
;
geometry ST_Scale(
geometry geom, geometry factor)
;
geometry ST_Scale(
geometry geom, geometry factor, geometry origin)
;
通过将坐标与相应的因子参数相乘,将几何体缩放到新的尺寸。
采用几何图形作为 factor
参数的版本允许传递 2d、3dm、3dz 或 4d 点来为所有支持的维度设置缩放因子。 factor
点中缺少维度相当于没有缩放相应的维度。
三几何体变体允许传入缩放的“假原点”。这允许“就地缩放”,例如使用几何体的质心作为假原点。 如果没有假原点,缩放是相对于实际原点进行的,因此所有坐标都只是乘以比例因子。
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
可用性:1.1.0。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
增强:2.2.0 引入了对缩放所有维度(factor
参数)的支持。
增强:2.5.0 引入了对相对于本地原点(origin
参数)进行缩放的支持。
该函数支持多面体曲面。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
此函数支持三角形和不规则三角网面 (TIN)。
该功能支持M坐标。
--Version 1: scale X, Y, Z SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 0.75, 0.8)); st_asewkt -------------------------------------- LINESTRING(0.5 1.5 2.4,0.5 0.75 0.8) --Version 2: Scale X Y SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 0.75)); st_asewkt ---------------------------------- LINESTRING(0.5 1.5 3,0.5 0.75 1) --Version 3: Scale X Y Z M SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'), ST_MakePoint(0.5, 0.75, 2, -1))); st_asewkt ---------------------------------------- LINESTRING(0.5 1.5 6 -4,0.5 0.75 2 -1) --Version 4: Scale X Y using false origin SELECT ST_AsText(ST_Scale('LINESTRING(1 1, 2 2)', 'POINT(2 2)', 'POINT(1 1)'::geometry)); st_astext --------------------- LINESTRING(1 1,3 3)
ST_Translate — 按给定的偏移量平移几何图形。
geometry ST_Translate(
geometry g1, float deltax, float deltay)
;
geometry ST_Translate(
geometry g1, float deltax, float deltay, float deltaz)
;
返回一个新的几何图形,其坐标转换为 delta x、delta y、delta z 单位。 单位基于该几何的空间参考 (SRID) 中定义的单位。
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
可用性:1.2.2
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
将点移动 1 度经度
SELECT ST_AsText(ST_Translate(ST_GeomFromText('POINT(-71.01 42.37)',4326),1,0)) As wgs_transgeomtxt; wgs_transgeomtxt --------------------- POINT(-70.01 42.37)
将线串移动 1 度经度和 1/2 度纬度
SELECT ST_AsText(ST_Translate(ST_GeomFromText('LINESTRING(-71.01 42.37,-71.11 42.38)',4326),1,0.5)) As wgs_transgeomtxt; wgs_transgeomtxt --------------------------------------- LINESTRING(-70.01 42.87,-70.11 42.88)
移动 3d 点
SELECT ST_AsEWKT(ST_Translate(CAST('POINT(0 0 0)' As geometry), 5, 12,3)); st_asewkt --------- POINT(5 12 3)
移动曲线和点
SELECT ST_AsText(ST_Translate(ST_Collect('CURVEPOLYGON(CIRCULARSTRING(4 3,3.12 0.878,1 0,-1.121 5.1213,6 7, 8 9,4 3))','POINT(1 3)'),1,2)); st_astext ------------------------------------------------------------------------------------------------------------ GEOMETRYCOLLECTION(CURVEPOLYGON(CIRCULARSTRING(5 5,4.12 2.878,2 2,-0.121 7.1213,7 9,9 11,5 5)),POINT(2 5))
ST_TransScale — 按给定的偏移量和系数平移和缩放几何图形。
geometry ST_TransScale(
geometry geomA, float deltaX, float deltaY, float XFactor, float YFactor)
;
使用 deltaX 和 deltaY 参数转换几何体,然后使用 XFactor、YFactor 参数缩放它,仅在 2D 中工作。
![]() | |
|
![]() | |
在 1.3.4 之前,此函数在与包含曲线的几何图形一起使用时崩溃。 此问题已在 1.3.4 及更高版本中得到纠正 |
可用性:1.1.0。
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_AsEWKT(ST_TransScale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 1, 1, 2)); st_asewkt ----------------------------- LINESTRING(1.5 6 3,1.5 4 1) --Buffer a point to get an approximation of a circle, convert to curve and then translate 1,2 and scale it 3,4 SELECT ST_AsText(ST_Transscale(ST_LineToCurve(ST_Buffer('POINT(234 567)', 3)),1,2,3,4)); st_astext ------------------------------------------------------------------------------------------------------------------------------ CURVEPOLYGON(CIRCULARSTRING(714 2276,711.363961030679 2267.51471862576,705 2264,698.636038969321 2284.48528137424,714 2276))
这些函数为几何图形集实现聚类算法。
ST_ClusterDBSCAN — 使用 DBSCAN 算法返回每个输入几何图形的簇 id 的窗口函数。
integer ST_ClusterDBSCAN(
geometry winset geom, float8 eps, integer minpoints)
;
一个窗口函数,使用 2D 基于密度的噪声应用空间聚类 (DBSCAN)算法。 与 ST_ClusterKMeans 不同,它不需要指定簇的数量,而是使用所需的距离 (eps
)和密度(minpoints
)参数来确定每个簇。
如果输入几何体满足以下任一条件,则将其添加到簇中:
请注意,边界几何图形可能位于多个集群中核心几何图形的 eps
距离内。 任一分配都是正确的,因此边界几何图形将被任意分配给可用集群之一。 在这种情况下,可以使用少于 minpoints
几何图形生成正确的簇。 为了确保边界几何形状的确定性分配(以便重复调用 ST_ClusterDBSCAN 将产生相同的结果),请在窗口定义中使用 ORDER BY
子句。 不明确的簇分配可能与其他 DBSCAN 实现不同。
![]() | |
不满足加入任何簇的条件的几何图形将被分配簇号 NULL。 |
可用性:2.3.0
此方法支持圆形字符串和曲线。
对彼此相距 50 米以内的多边形进行聚类,并且每个聚类至少需要 2 个多边形。
![]() 50 米范围内的聚类,每个聚类至少有两个面。 如果只有一个,则 cid 为 NULL
SELECT name, ST_ClusterDBSCAN(geom, eps = > 50, minpoints = > 2) over () AS cid FROM boston_polys WHERE name > '' AND building > '' AND ST_DWithin(geom, ST_Transform( ST_GeomFromText('POINT(-71.04054 42.35141)', 4326), 26986), 500);
| name | bucket -------------------------------------+-------- Manulife Tower | 0 Park Lane Seaport I | 0 Park Lane Seaport II | 0 Renaissance Boston Waterfront Hotel | 0 Seaport Boston Hotel | 0 Seaport Hotel & World Trade Center | 0 Waterside Place | 0 World Trade Center East | 0 100 Northern Avenue | 1 100 Pier 4 | 1 The Institute of Contemporary Art | 1 101 Seaport | 2 District Hall | 2 One Marina Park Drive | 2 Twenty Two Liberty | 2 Vertex | 2 Vertex | 2 Watermark Seaport | 2 Blue Hills Bank Pavilion | NULL World Trade Center West | NULL (20 rows) |
显示将具有相同簇编号的地块组合成几何集合的示例。
SELECT cid, ST_Collect(geom) AS cluster_geom, array_agg(parcel_id) AS ids_in_cluster FROM ( SELECT parcel_id, ST_ClusterDBSCAN(geom, eps => 0.5, minpoints => 5) over () AS cid, geom FROM parcels) sq GROUP BY cid;
ST_ClusterIntersecting — 将输入几何图形聚类成连接集的聚合函数。
geometry[] ST_ClusterIntersecting(
geometry set g)
;
一个聚合函数,返回 GeometryCollections 数组,将输入几何图形划分为不相交的连接簇。 簇中的每个几何图形与该簇中的至少一个其他几何图形相交,并且不与其他簇中的任何几何图形相交。
可用性:2.2.0
WITH testdata AS (SELECT unnest(ARRAY['LINESTRING (0 0, 1 1)'::geometry, 'LINESTRING (5 5, 4 4)'::geometry, 'LINESTRING (6 6, 7 7)'::geometry, 'LINESTRING (0 0, -1 -1)'::geometry, 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry]) AS geom) SELECT ST_AsText(unnest(ST_ClusterIntersecting(geom))) FROM testdata; --result st_astext --------- GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0))) GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))
ST_ClusterIntersectingWin — 窗口函数,返回每个输入几何图形的簇 ID,将输入几何图形聚类到连接的集合中。
integer ST_ClusterIntersectingWin(
geometry winset geom)
;
一种窗口函数,用于构建相交的连接几何图形簇。 可以在不离开集群的情况下遍历集群中的所有几何图形。 返回值是几何参数参与的簇号,或者对于空输入为空。
可用性:3.4.0
WITH testdata AS ( SELECT id, geom::geometry FROM ( VALUES (1, 'LINESTRING (0 0, 1 1)'), (2, 'LINESTRING (5 5, 4 4)'), (3, 'LINESTRING (6 6, 7 7)'), (4, 'LINESTRING (0 0, -1 -1)'), (5, 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))')) AS t(id, geom) ) SELECT id, ST_AsText(geom), ST_ClusterIntersectingWin(geom) OVER () AS cluster FROM testdata; id | st_astext | cluster ----+--------------------------------+--------- 1 | LINESTRING(0 0,1 1) | 0 2 | LINESTRING(5 5,4 4) | 0 3 | LINESTRING(6 6,7 7) | 1 4 | LINESTRING(0 0,-1 -1) | 0 5 | POLYGON((0 0,4 0,4 4,0 4,0 0)) | 0
ST_ClusterKMeans — 使用 K 均值算法返回每个输入几何图形的簇 id 的窗口函数。
integer ST_ClusterKMeans(
geometry winset geom, integer number_of_clusters, float max_radius)
;
返回每个输入几何图形的 K-means 簇号。 用于聚类的距离是 2D 几何形状的质心之间的距离,以及 3D 几何形状的边界框中心之间的距离。 对于 POINT 输入,M 坐标将被视为输入的权重,并且必须大于 0。
max_radius
如果设置,将导致 ST_ClusterKMeans 生成比 k
更多的簇,确保输出中没有簇的半径大于 max_radius
。 这在可达性分析中很有用。
增强:3.2.0 支持 max_radius
增强:3.1.0 支持 3D 几何和权重
可用性:2.3.0
生成虚拟地块集,例如:
CREATE TABLE parcels AS SELECT lpad((row_number() over())::text,3,'0') As parcel_id, geom, ('{residential, commercial}'::text[])[1 + mod(row_number()OVER(),2)] As type FROM ST_Subdivide(ST_Buffer('SRID=3857;LINESTRING(40 100, 98 100, 100 150, 60 90)'::geometry, 40, 'endcap=square'),12) As geom;
地块按簇号 (cid) 进行颜色编码
SELECT ST_ClusterKMeans(geom, 3) OVER() AS cid, parcel_id, geom FROM parcels;
cid | parcel_id | geom -----+-----------+--------------- 0 | 001 | 0103000000... 0 | 002 | 0103000000... 1 | 003 | 0103000000... 0 | 004 | 0103000000... 1 | 005 | 0103000000... 2 | 006 | 0103000000... 2 | 007 | 0103000000...
按类型划分地块集群:
SELECT ST_ClusterKMeans(geom, 3) over (PARTITION BY type) AS cid, parcel_id, type FROM parcels;
cid | parcel_id | type -----+-----------+------------- 1 | 005 | commercial 1 | 003 | commercial 2 | 007 | commercial 0 | 001 | commercial 1 | 004 | residential 0 | 002 | residential 2 | 006 | residential
示例:使用 3D 聚类和加权对预先聚合的全球人口数据集进行聚类。 根据Kontur人口数据,至少确定了距离中心不到3000公里的20个地区:
create table kontur_population_3000km_clusters as select geom, ST_ClusterKMeans( ST_Force4D( ST_Transform(ST_Force3D(geom), 4978), -- cluster in 3D XYZ CRS mvalue => population -- set clustering to be weighed by population ), 20, -- aim to generate at least 20 clusters max_radius => 3000000 -- but generate more to make each under 3000 km radius ) over () as cid from kontur_population;
根据上述规范对世界人口进行聚类,得到46个聚类。 在人口稠密的地区(纽约,莫斯科)是集群的中心。 格陵兰岛是一个集群。 有些集群跨越国际日期变更线。 聚类的边缘遵循地球的曲线。
ST_ClusterWithin — 按间隔距离对几何图形进行聚合的聚合函数。
geometry[] ST_ClusterWithin(
geometry set g, float8 distance)
;
返回 GeometryCollections 数组的聚合函数,其中每个集合都是包含一些输入几何图形的簇。 聚类将输入几何图形划分为多个集合,其中每个几何图形都在同一簇中至少一个其他几何图形的指定距离
内。 距离是以 SRID 为单位的笛卡尔距离。
ST_ClusterWithin相当于运行ST_ClusterDBSCAN使用minpoints => 0
。
可用性:2.2.0
此方法支持圆形字符串和曲线。
WITH testdata AS (SELECT unnest(ARRAY['LINESTRING (0 0, 1 1)'::geometry, 'LINESTRING (5 5, 4 4)'::geometry, 'LINESTRING (6 6, 7 7)'::geometry, 'LINESTRING (0 0, -1 -1)'::geometry, 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry]) AS geom) SELECT ST_AsText(unnest(ST_ClusterWithin(geom, 1.4))) FROM testdata; --result st_astext --------- GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0))) GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))
ST_ClusterWithinWin — 窗口函数,返回每个输入几何图形的簇 ID,使用分离距离进行聚类。
integer ST_ClusterWithinWin(
geometry winset geom, float8 distance)
;
返回每个输入几何图形的簇号的窗口函数。 聚类将几何图形划分为多个集合,其中每个几何图形都在同一簇中至少一个其他几何图形的指定距离
内。 距离是以 SRID 为单位的笛卡尔距离。
ST_ClusterWithinWin等效于运行ST_ClusterDBSCAN使用minpoints => 0
。
可用性:3.4.0
此方法支持圆形字符串和曲线。
WITH testdata AS ( SELECT id, geom::geometry FROM ( VALUES (1, 'LINESTRING (0 0, 1 1)'), (2, 'LINESTRING (5 5, 4 4)'), (3, 'LINESTRING (6 6, 7 7)'), (4, 'LINESTRING (0 0, -1 -1)'), (5, 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))')) AS t(id, geom) ) SELECT id, ST_AsText(geom), ST_ClusterWithinWin(geom, 1.4) OVER () AS cluster FROM testdata; id | st_astext | cluster ----+--------------------------------+--------- 1 | LINESTRING(0 0,1 1) | 0 2 | LINESTRING(5 5,4 4) | 0 3 | LINESTRING(6 6,7 7) | 1 4 | LINESTRING(0 0,-1 -1) | 0 5 | POLYGON((0 0,4 0,4 4,0 4,0 0)) | 0
Box2D — 返回表示几何图形的 2D 范围的 BOX2D。
box2d Box2D(
geometry geom)
;
返回表示几何图形的 2D 范围的box2d。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT Box2D(ST_GeomFromText('LINESTRING(1 2, 3 4, 5 6)')); box2d --------- BOX(1 2,5 6)
SELECT Box2D(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')); box2d -------- BOX(220186.984375 150406,220288.25 150506.140625)
Box3D — 返回表示几何体 3D 范围的 BOX3D。
box3d Box3D(
geometry geom)
;
返回表示几何体 3D 范围的box3d。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该函数支持 3d 并且不会丢失 z-index。
SELECT Box3D(ST_GeomFromEWKT('LINESTRING(1 2 3, 3 4 5, 5 6 5)')); Box3d --------- BOX3D(1 2 3,5 6 5)
SELECT Box3D(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 1,220227 150406 1)')); Box3d -------- BOX3D(220227 150406 1,220268 150415 1)
ST_EstimatedExtent — 返回空间表的估计范围。
box2d ST_EstimatedExtent(
text schema_name, text table_name, text geocolumn_name, boolean parent_only)
;
box2d ST_EstimatedExtent(
text schema_name, text table_name, text geocolumn_name)
;
box2d ST_EstimatedExtent(
text table_name, text geocolumn_name)
;
以box2d 形式返回空间表的估计范围。 如果未指定,则使用当前架构。 估计范围取自几何列的统计数据。 这通常比使用 ST_Extent或 ST_3DExtent 计算表的精确范围要快得多。
默认行为是还使用从子表(具有 INHERITS 的表)收集的统计信息(如果可用)。 如果parent_only
设置为TRUE,则仅使用给定表的统计信息并忽略子表。
对于 PostgreSQL >= 8.0.0,统计信息由 VACUUM ANALYZE 收集,结果范围约为实际范围的 95%。 对于 PostgreSQL < 8.0.0 统计信息是通过运行 update_geometry_stats()
收集的,结果范围是准确的。
![]() | |
如果没有统计信息(空表或未调用 ANALYZE),此函数将返回 NULL。 在 1.5.4 版本之前,会抛出异常。 |
可用性:1.0.0
更改:2.1.0。 在 2.0.x 之前,这称为 ST_Estimated_Extent。
此方法支持圆形字符串和曲线。
SELECT ST_EstimatedExtent('ny', 'edges', 'geom'); --result-- BOX(-8877653 4912316,-8010225.5 5589284) SELECT ST_EstimatedExtent('feature_poly', 'geom'); --result-- BOX(-124.659652709961 24.6830825805664,-67.7798080444336 49.0012092590332)
ST_Expand — 返回从另一个边界框或几何图形扩展的边界框。
geometry ST_Expand(
geometry geom, float units_to_expand)
;
geometry ST_Expand(
geometry geom, float dx, float dy, float dz=0, float dm=0)
;
box2d ST_Expand(
box2d box, float units_to_expand)
;
box2d ST_Expand(
box2d box, float dx, float dy)
;
box3d ST_Expand(
box3d box, float units_to_expand)
;
box3d ST_Expand(
box3d box, float dx, float dy, float dz=0)
;
返回从输入的边界框扩展的边界框,通过指定框应在两个轴上扩展的单个距离,或通过指定每个轴的扩展距离。 使用双精度。 可用于距离查询,或向查询添加边界框过滤器以利用空间索引。
除了接受和返回几何图形的 ST_Expand 版本之外,还提供了接受和返回box2d 和box3d 数据类型的形式。
距离采用输入的空间参考系的单位。
ST_Expand 与 ST_Buffer 类似,不同之处在于缓冲在所有方向上扩展几何图形,而 ST_Expand 沿每个轴扩展边界框。
![]() | |
在版本 1.3 之前,ST_Expand 与 ST_Distance 结合使用来执行可索引距离查询。 例如, |
可用性:1.5.0 行为更改为输出双精度而不是 float4 坐标。
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
增强:2.3.0 添加了对不同维度的盒子进行不同数量扩展的支持。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
![]() | |
以下示例使用美国国家地图平等面积投影(SRID=2163),这是一个以米为单位的投影 |
--10 meter expanded box around bbox of a linestring SELECT CAST(ST_Expand(ST_GeomFromText('LINESTRING(2312980 110676,2312923 110701,2312892 110714)', 2163),10) As box2d); st_expand ------------------------------------ BOX(2312882 110666,2312990 110724) --10 meter expanded 3D box of a 3D box SELECT ST_Expand(CAST('BOX3D(778783 2951741 1,794875 2970042.61545891 10)' As box3d),10) st_expand ----------------------------------------------------- BOX3D(778773 2951731 -9,794885 2970052.61545891 20) --10 meter geometry astext rep of a expand box around a point geometry SELECT ST_AsEWKT(ST_Expand(ST_GeomFromEWKT('SRID=2163;POINT(2312980 110676)'),10)); st_asewkt ------------------------------------------------------------------------------------------------- SRID=2163;POLYGON((2312970 110666,2312970 110686,2312990 110686,2312990 110666,2312970 110666))
ST_Extent — 返回几何图形边界框的聚合函数。
box2d ST_Extent(
geometry set geomfield)
;
一个聚合函数,返回一个包围一组几何图形的box2d 边界框。
边界框坐标位于输入几何图形的空间参考系统中。
ST_Extent 在概念上与 Oracle Spatial/Locator 的 SDO_AGGR_MBR 类似。
![]() | |
ST_Extent 返回仅具有 X 和 Y 坐标的框,即使具有 3D 几何图形也是如此。 要返回 XYZ 坐标,请使用 ST_3DExtent。 |
![]() | |
返回的 |
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
![]() | |
以下示例使用以英尺为单位的马萨诸塞州平面 (SRID=2249) |
SELECT ST_Extent(geom) as bextent FROM sometable; st_bextent ------------------------------------ BOX(739651.875 2908247.25,794875.8125 2970042.75) --Return extent of each category of geometries SELECT ST_Extent(geom) as bextent FROM sometable GROUP BY category ORDER BY category; bextent | name ----------------------------------------------------+---------------- BOX(778783.5625 2951741.25,794875.8125 2970042.75) | A BOX(751315.8125 2919164.75,765202.6875 2935417.25) | B BOX(739651.875 2917394.75,756688.375 2935866) | C --Force back into a geometry -- and render the extended text representation of that geometry SELECT ST_SetSRID(ST_Extent(geom),2249) as bextent FROM sometable; bextent -------------------------------------------------------------------------------- SRID=2249;POLYGON((739651.875 2908247.25,739651.875 2970042.75,794875.8125 2970042.75, 794875.8125 2908247.25,739651.875 2908247.25))
ST_3DExtent — 返回几何图形的 3D 边界框的聚合函数。
box3d ST_3DExtent(
geometry set geomfield)
;
一个聚合函数,返回包围一组几何图形的 box3d(包括 Z 坐标)边界框。
边界框坐标位于输入几何图形的空间参考系统中。
![]() | |
返回的 |
增强功能:引入了2.0.0 对多面体曲面、三角形和三角网的支持。
更改:2.0.0 在之前的版本中,这曾经被称为 ST_Extent3D
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_3DExtent(foo.geom) As b3extent FROM (SELECT ST_MakePoint(x,y,z) As geom FROM generate_series(1,3) As x CROSS JOIN generate_series(1,2) As y CROSS JOIN generate_series(0,2) As Z) As foo; b3extent -------------------- BOX3D(1 1 0,3 2 2) --Get the extent of various elevated circular strings SELECT ST_3DExtent(foo.geom) As b3extent FROM (SELECT ST_Translate(ST_Force_3DZ(ST_LineToCurve(ST_Buffer(ST_Point(x,y),1))),0,0,z) As geom FROM generate_series(1,3) As x CROSS JOIN generate_series(1,2) As y CROSS JOIN generate_series(0,2) As Z) As foo; b3extent -------------------- BOX3D(1 0 0,4 2 2)
ST_MakeBox2D — 创建由两个 2D 点几何图形定义的 BOX2D。
box2d ST_MakeBox2D(
geometry pointLowLeft, geometry pointUpRight)
;
创建由两个 Point 几何图形定义的box2d。 这对于进行范围查询很有用。
--Return all features that fall reside or partly reside in a US national atlas coordinate bounding box --It is assumed here that the geometries are stored with SRID = 2163 (US National atlas equal area) SELECT feature_id, feature_name, geom FROM features WHERE geom && ST_SetSRID(ST_MakeBox2D(ST_Point(-989502.1875, 528439.5625), ST_Point(-987121.375 ,529933.1875)),2163)
ST_3DMakeBox — 创建由两个 3D 点几何图形定义的 BOX3D。
box3d ST_3DMakeBox(
geometry point3DLowLeftBottom, geometry point3DUpRightTop)
;
SELECT ST_3DMakeBox(ST_MakePoint(-989502.1875, 528439.5625, 10), ST_MakePoint(-987121.375 ,529933.1875, 10)) As abb3d --bb3d-- -------- BOX3D(-989502.1875 528439.5625 10,-987121.375 529933.1875 10)
ST_XMax — 返回 2D 或 3D 边界框或几何体的 X 最大值。
float ST_XMax(
box3d aGeomorBox2DorBox3D)
;
返回 2D 或 3D 边界框或几何体的 X 最大值。
![]() | |
虽然此函数仅针对 box3d 定义,但由于自动转换,它也适用于 box2d 和几何值。 但是,它不会接受几何图形或 box2d 文本表示,因为它们不会自动转换。 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_XMax('BOX3D(1 2 3, 4 5 6)'); st_xmax ------- 4 SELECT ST_XMax(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)')); st_xmax ------- 5 SELECT ST_XMax(CAST('BOX(-3 2, 3 4)' As box2d)); st_xmax ------- 3 --Observe THIS DOES NOT WORK because it will try to auto-cast the string representation to a BOX3D SELECT ST_XMax('LINESTRING(1 3, 5 6)'); --ERROR: BOX3D parser - doesn't start with BOX3D( SELECT ST_XMax(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)')); st_xmax -------- 220288.248780547
ST_XMin — 返回 2D 或 3D 边界框或几何体的 X 最小值。
float ST_XMin(
box3d aGeomorBox2DorBox3D)
;
返回 2D 或 3D 边界框或几何体的 X 最小值。
![]() | |
虽然此函数仅针对 box3d 定义,但由于自动转换,它也适用于 box2d 和几何值。 但是,它不会接受几何图形或 box2d 文本表示,因为它们不会自动转换。 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_XMin('BOX3D(1 2 3, 4 5 6)'); st_xmin ------- 1 SELECT ST_XMin(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)')); st_xmin ------- 1 SELECT ST_XMin(CAST('BOX(-3 2, 3 4)' As box2d)); st_xmin ------- -3 --Observe THIS DOES NOT WORK because it will try to auto-cast the string representation to a BOX3D SELECT ST_XMin('LINESTRING(1 3, 5 6)'); --ERROR: BOX3D parser - doesn't start with BOX3D( SELECT ST_XMin(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)')); st_xmin -------- 220186.995121892
ST_YMax — 返回 2D 或 3D 边界框或几何体的 Y 最大值。
float ST_YMax(
box3d aGeomorBox2DorBox3D)
;
返回 2D 或 3D 边界框或几何体的 Y 最大值。
![]() | |
虽然此函数仅针对 box3d 定义,但由于自动转换,它也适用于 box2d 和几何值。 但是,它不会接受几何图形或 box2d 文本表示,因为它们不会自动转换。 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_YMax('BOX3D(1 2 3, 4 5 6)'); st_ymax ------- 5 SELECT ST_YMax(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)')); st_ymax ------- 6 SELECT ST_YMax(CAST('BOX(-3 2, 3 4)' As box2d)); st_ymax ------- 4 --Observe THIS DOES NOT WORK because it will try to auto-cast the string representation to a BOX3D SELECT ST_YMax('LINESTRING(1 3, 5 6)'); --ERROR: BOX3D parser - doesn't start with BOX3D( SELECT ST_YMax(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)')); st_ymax -------- 150506.126829327
ST_YMin — 返回 2D 或 3D 边界框或几何体的 Y 最小值。
float ST_YMin(
box3d aGeomorBox2DorBox3D)
;
返回 2D 或 3D 边界框或几何体的 Y 最小值。
![]() | |
虽然此函数仅针对 box3d 定义,但由于自动转换,它也适用于 box2d 和几何值。 但是,它不会接受几何图形或 box2d 文本表示,因为它们不会自动转换。 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_YMin('BOX3D(1 2 3, 4 5 6)'); st_ymin ------- 2 SELECT ST_YMin(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)')); st_ymin ------- 3 SELECT ST_YMin(CAST('BOX(-3 2, 3 4)' As box2d)); st_ymin ------- 2 --Observe THIS DOES NOT WORK because it will try to auto-cast the string representation to a BOX3D SELECT ST_YMin('LINESTRING(1 3, 5 6)'); --ERROR: BOX3D parser - doesn't start with BOX3D( SELECT ST_YMin(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)')); st_ymin -------- 150406
ST_ZMax — 返回 2D 或 3D 边界框或几何体的 Z 最大值。
float ST_ZMax(
box3d aGeomorBox2DorBox3D)
;
返回 2D 或 3D 边界框或几何体的 Z 最大值。
![]() | |
虽然此函数仅针对 box3d 定义,但由于自动转换,它也适用于 box2d 和几何值。 但是,它不会接受几何图形或 box2d 文本表示,因为它们不会自动转换。 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_ZMax('BOX3D(1 2 3, 4 5 6)'); st_zmax ------- 6 SELECT ST_ZMax(ST_GeomFromEWKT('LINESTRING(1 3 4, 5 6 7)')); st_zmax ------- 7 SELECT ST_ZMax('BOX3D(-3 2 1, 3 4 1)' ); st_zmax ------- 1 --Observe THIS DOES NOT WORK because it will try to auto-cast the string representation to a BOX3D SELECT ST_ZMax('LINESTRING(1 3 4, 5 6 7)'); --ERROR: BOX3D parser - doesn't start with BOX3D( SELECT ST_ZMax(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)')); st_zmax -------- 3
ST_ZMin — 返回 2D 或 3D 边界框或几何体的 Z 最小值。
float ST_ZMin(
box3d aGeomorBox2DorBox3D)
;
返回 2D 或 3D 边界框或几何体的 Z 最小值。
![]() | |
虽然此函数仅针对 box3d 定义,但由于自动转换,它也适用于 box2d 和几何值。 但是,它不会接受几何图形或 box2d 文本表示,因为它们不会自动转换。 |
该函数支持 3d 并且不会丢失 z-index。
此方法支持圆形字符串和曲线。
SELECT ST_ZMin('BOX3D(1 2 3, 4 5 6)'); st_zmin ------- 3 SELECT ST_ZMin(ST_GeomFromEWKT('LINESTRING(1 3 4, 5 6 7)')); st_zmin ------- 4 SELECT ST_ZMin('BOX3D(-3 2 1, 3 4 1)' ); st_zmin ------- 1 --Observe THIS DOES NOT WORK because it will try to auto-cast the string representation to a BOX3D SELECT ST_ZMin('LINESTRING(1 3 4, 5 6 7)'); --ERROR: BOX3D parser - doesn't start with BOX3D( SELECT ST_ZMin(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)')); st_zmin -------- 1
ST_LineInterpolatePoint — 返回沿线在百分比指示位置的插值点。
geometry ST_LineInterpolatePoint(
geometry a_linestring, float8 a_fraction)
;
geography ST_LineInterpolatePoint(
geography a_linestring, float8 a_fraction, boolean use_spheroid = true)
;
返回沿线在百分比指示位置的插值点。 第一个参数是线串。 第二个参数是介于 0 和 1 之间的浮点数,它表示点的位置与线长度的比率。 如果存在 Z 和 M 值,则执行插值计算。
请参阅ST_LineLocatePoint以计算最接近该点的线位置。
![]() | |
此函数计算 2D 中的点,然后对 Z 和 M 的值进行插值,而 ST_3DLineInterpolatePoint 计算 3D 中的点,然后仅对 M 值进行插值。 |
![]() | |
从版本 1.1.1 开始,此函数还会插入 M 和 Z 值(如果存在),而之前的版本将它们设置为 0.0。 |
可用性:0.8.2,1.1.1中添加支持Z和M
更改:2.1.0。 在 2.0.x 之前,这称为 ST_Line_Interpolate_Point。
该函数支持 3d 并且不会丢失 z-index。
插值点位于 20% 位置 (0.20) 的线串
-- The point 20% along a line SELECT ST_AsEWKT( ST_LineInterpolatePoint( 'LINESTRING(25 50, 100 125, 150 190)', 0.2 )); ---------------- POINT(51.5974135047432 76.5974135047432)
3D 线的中点:
SELECT ST_AsEWKT( ST_LineInterpolatePoint(' LINESTRING(1 2 3, 4 5 6, 6 7 8)', 0.5 )); -------------------- POINT(3.5 4.5 5.5)
直线上距离某点最近的点:
SELECT ST_AsText( ST_LineInterpolatePoint( line.geom, ST_LineLocatePoint( line.geom, 'POINT(4 3)'))) FROM (SELECT ST_GeomFromText('LINESTRING(1 2, 4 5, 6 7)') As geom) AS line; ------------ POINT(3 4)
ST_3DLineInterpolatePoint — 返回沿 3D 线的小数指示位置插值的点。
geometry ST_3DLineInterpolatePoint(
geometry a_linestring, float8 a_fraction)
;
返回沿 3D 线的小数指示位置插值的点。 第一个参数必须是 LINESTRING。 第二个参数是 0 到 1 之间的浮点数,表示点位置占线长度的一部分。 如果存在 M 值,则对其进行插值。
![]() | |
ST_LineInterpolatePoint 计算 2D 中的点,然后对 Z 和 M 的值进行插值,而此函数计算 3D 中的点,并且仅对 M 值进行插值。 |
可用性:3.0.0
该函数支持 3d 并且不会丢失 z-index。
沿 3D 线返回20%处的点
SELECT ST_AsText( ST_3DLineInterpolatePoint('LINESTRING(25 50 70, 100 125 90, 150 190 200)', 0.20)); st_asetext ---------------- POINT Z (59.0675892910822 84.0675892910822 79.0846904776219)
ST_LineInterpolatePoints — 返回沿直线以分数间隔插值的点。
geometry ST_LineInterpolatePoints(
geometry a_linestring, float8 a_fraction, boolean repeat)
;
geography ST_LineInterpolatePoints(
geography a_linestring, float8 a_fraction, boolean use_spheroid = true, boolean repeat = true)
;
返回沿一条线以分数间隔插值的一个或多个点。 第一个参数必须是 LINESTRING。 第二个参数是一个介于 float8 0 和 1 之间的值,表示点之间的间距作为线长度的一部分。 如果第三个参数为 false,则最多构造一个点(相当于ST_LineInterpolatePoint。)
如果结果有零个或一个点,则将其作为 POINT 返回。 如果它有两个或更多点,则以 MULTIPOINT 形式返回。
可用性:2.5.0
该函数支持 3d 并且不会丢失 z-index。
该功能支持M坐标。
每 20% 插值一次点的 LineString
--Return points each 20% along a 2D line SELECT ST_AsText(ST_LineInterpolatePoints('LINESTRING(25 50, 100 125, 150 190)', 0.20)) ---------------- MULTIPOINT((51.5974135047432 76.5974135047432),(78.1948270094864 103.194827009486),(104.132163186446 130.37181214238),(127.066081593223 160.18590607119),(150 190))
ST_LineLocatePoint — 返回线上最接近点的分数位置。
float8 ST_LineLocatePoint(
geometry a_linestring, geometry a_point)
;
float8 ST_LineLocatePoint(
geography a_linestring, geography a_point, boolean use_spheroid = true)
;
返回 0 到 1 之间的浮点数,表示 LineString 上距离给定 Point 最近的点的位置,作为 2d 线长度的一部分。
您可以使用返回的位置来提取点 (ST_LineInterpolatePoint) 或子字符串 (ST_LineSubstring)。
这对于近似地址数量很有用
可用性:1.1.0
更改:2.1.0。 在 2.0.x 之前,这称为 ST_Line_Locate_Point。
--Rough approximation of finding the street number of a point along the street --Note the whole foo thing is just to generate dummy data that looks --like house centroids and street --We use ST_DWithin to exclude --houses too far away from the street to be considered on the street SELECT ST_AsText(house_loc) As as_text_house_loc, startstreet_num + CAST( (endstreet_num - startstreet_num) * ST_LineLocatePoint(street_line, house_loc) As integer) As street_num FROM (SELECT ST_GeomFromText('LINESTRING(1 2, 3 4)') As street_line, ST_Point(x*1.01,y*1.03) As house_loc, 10 As startstreet_num, 20 As endstreet_num FROM generate_series(1,3) x CROSS JOIN generate_series(2,4) As y) As foo WHERE ST_DWithin(street_line, house_loc, 0.2); as_text_house_loc | street_num -------------------+------------ POINT(1.01 2.06) | 10 POINT(2.02 3.09) | 15 POINT(3.03 4.12) | 20 --find closest point on a line to a point or other geometry SELECT ST_AsText(ST_LineInterpolatePoint(foo.the_line, ST_LineLocatePoint(foo.the_line, ST_GeomFromText('POINT(4 3)')))) FROM (SELECT ST_GeomFromText('LINESTRING(1 2, 4 5, 6 7)') As the_line) As foo; st_astext ---------------- POINT(3 4)
ST_LineSubstring — 返回两个小数位置之间的直线部分。
geometry ST_LineSubstring(
geometry a_linestring, float8 startfraction, float8 endfraction)
;
geography ST_LineSubstring(
geography a_linestring, float8 startfraction, float8 endfraction)
;
计算作为输入线在给定小数位置处开始和结束的部分的线。 第一个参数必须是 LINESTRING。 第二个和第三个参数是 [0, 1] 范围内的值,将起始位置和结束位置表示为行长度的分数。 如果存在添加的端点,则对 Z 和 M 值进行插值。
如果 startfraction
和 endfraction
具有相同的值,则相当于ST_LineInterpolatePoint。
![]() | |
这仅适用于 LINESTRING。 要在连续的 MULTILINESTRING 上使用,首先使用 ST_LineMerge将它们连接起来。 |
![]() | |
从 1.1.1 版开始,此函数对 M 和 Z 值进行插值。 之前的版本将 Z 和 M 设置为未指定的值。 |
增强:3.4.0 - 引入了对地理的支持。
更改:2.1.0。 在 2.0.x 之前,这被称为 ST_Line_Substring。
可用性:1.1.0,1.1.1中添加支持Z和M
该函数支持 3d 并且不会丢失 z-index。
在1/3中间范围上叠加的LineString(0.333, 0.666)
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING (20 180, 50 20, 90 80, 120 40, 180 150)', 0.333, 0.666)); ------------------------------------------------------------------------------------------------ LINESTRING (45.17311810399485 45.74337011202746, 50 20, 90 80, 112.97593050157862 49.36542599789519)
如果起始位置和结束位置相同,则结果是一个 POINT。
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(25 50, 100 125, 150 190)', 0.333, 0.333)); ------------------------------------------ POINT(69.2846934853974 94.2846934853974)
将 LineString 切成长度为 100 或更短的部分的查询。 它使用generate_series()
和CROSS JOIN LATERAL 来生成FOR 循环的等效项。
WITH data(id, geom) AS (VALUES ( 'A', 'LINESTRING( 0 0, 200 0)'::geometry ), ( 'B', 'LINESTRING( 0 100, 350 100)'::geometry ), ( 'C', 'LINESTRING( 0 200, 50 200)'::geometry ) ) SELECT id, i, ST_AsText( ST_LineSubstring( geom, startfrac, LEAST( endfrac, 1 )) ) AS geom FROM ( SELECT id, geom, ST_Length(geom) len, 100 sublen FROM data ) AS d CROSS JOIN LATERAL ( SELECT i, (sublen * i) / len AS startfrac, (sublen * (i+1)) / len AS endfrac FROM generate_series(0, floor( len / sublen )::integer ) AS t(i) -- skip last i if line length is exact multiple of sublen WHERE (sublen * i) / len < > 1.0 ) AS d2; id | i | geom ----+---+----------------------------- A | 0 | LINESTRING(0 0,100 0) A | 1 | LINESTRING(100 0,200 0) B | 0 | LINESTRING(0 100,100 100) B | 1 | LINESTRING(100 100,200 100) B | 2 | LINESTRING(200 100,300 100) B | 3 | LINESTRING(300 100,350 100) C | 0 | LINESTRING(0 200,50 200)
地理实现沿球体表面进行测量,而几何实现沿线进行测量
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geography, 0.333, 0.666),6) AS geog_sub , ST_AsText(ST_LineSubstring('LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geometry, 0.333, 0.666),6) AS geom_sub; --------------------------------------------------------------- geog_sub | LINESTRING(-104.167064 38.854691,-87.674646 41.849854) geom_sub | LINESTRING(-102.530462 36.819064,-86.817324 39.585927)
ST_LocateAlong — 返回几何上与测量值匹配的点。
geometry ST_LocateAlong(
geometry geom_with_measure, float8 measure, float8 offset = 0)
;
返回沿具有给定测量值的测量几何图形的位置。 结果是点或多点。 不支持多边形输入。
如果提供了 offset
,则结果将向输入线的左侧或右侧偏移指定的距离。 正偏移将向左偏移,负偏移将向右偏移。
![]() | |
仅对具有 M 分量的线性几何使用此函数 |
语义由 ISO/IEC 13249-3 SQL/MM 空间标准指定。
可用性:1.1.0(旧名称 ST_Locate_Along_Measure)。
更改:2.0.0 在之前的版本中,这曾经被称为 ST_Locate_Along_Measure。
该功能支持M坐标。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1.13
SELECT ST_AsText( ST_LocateAlong( 'MULTILINESTRINGM((1 2 3, 3 4 2, 9 4 3),(1 2 3, 5 4 5))'::geometry, 3 )); ---------------------------------- MULTIPOINT M ((1 2 3),(9 4 3),(1 2 3))
ST_LocateBetween — 返回与测量范围匹配的几何图形部分。
geometry ST_LocateBetween(
geometry geom, float8 measure_start, float8 measure_end, float8 offset = 0)
;
返回一个几何图形(集合),其中包含与指定测量范围(包含)匹配的输入测量几何图形部分。
如果提供了偏移量
,则结果将向输入行的左侧或右侧偏移指定的距离。 正偏移量将向左偏移,负偏移量将向右偏移。
裁剪非凸多边形可能会产生无效的几何图形。
语义由 ISO/IEC 13249-3 SQL/MM 空间标准指定。
可用性:1.1.0(旧名称 ST_Locate_Between_Measures)。
更改:2.0.0 - 在之前的版本中,这曾经被称为 ST_Locate_Between_Measures。
增强:3.0.0 - 添加了对多边形、TIN、三角形的支持。
该功能支持M坐标。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
SELECT ST_AsText( ST_LocateBetween( 'MULTILINESTRING M ((1 2 3, 3 4 2, 9 4 3),(1 2 3, 5 4 5))':: geometry, 1.5, 3 )); ------------------------------------------------------------------------ GEOMETRYCOLLECTION M (LINESTRING M (1 2 3,3 4 2,9 4 3),POINT M (1 2 3))
一个 LineString,其部分位于小节 2 和小节 8 之间,向左偏移
SELECT ST_AsText( ST_LocateBetween( ST_AddMeasure('LINESTRING (20 180, 50 20, 100 120, 180 20)', 0, 10), 2, 8, 20 )); ------------------------------------------------------------------------ MULTILINESTRING((54.49835019899045 104.53426957938231,58.70056060327303 82.12248075654186,69.16695286779743 103.05526528559065,82.11145618000168 128.94427190999915,84.24893681714357 132.32493442618113,87.01636951231555 135.21267035596549,90.30307285299679 137.49198684843182,93.97759758337769 139.07172433557758,97.89298381958797 139.8887023914453,101.89263860095893 139.9102465862721,105.81659870902816 139.13549527600819,109.50792827749828 137.5954340631298,112.81899532549731 135.351656550512,115.6173761888606 132.49390095108848,145.31017306064817 95.37790486135405))
ST_LocateBetweenElevations — 返回位于高程 (Z) 范围内的几何图形部分。
geometry ST_LocateBetweenElevations(
geometry geom, float8 elevation_start, float8 elevation_end)
;
返回一个几何图形(集合),其中包含位于高程 (Z) 范围内的几何图形部分。
裁剪非凸多边形可能会产生无效的几何图形。
可用性:1.4.0
增强:3.0.0 - 添加了对多边形、TIN、三角形的支持。
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsText( ST_LocateBetweenElevations( 'LINESTRING(1 2 3, 4 5 6)'::geometry, 2, 4 )); st_astext ----------------------------------- MULTILINESTRING Z ((1 2 3,2 3 4)) SELECT ST_AsText( ST_LocateBetweenElevations( 'LINESTRING(1 2 6, 4 5 -1, 7 8 9)', 6, 9)) As ewelev; ewelev ----------------------------------------------------------------------- GEOMETRYCOLLECTION Z (POINT Z (1 2 6),LINESTRING Z (6.1 7.1 6,7 8 9))
ST_InterpolatePoint — 返回最接近点的几何图形的插值测量值。
float8 ST_InterpolatePoint(
geometry linear_geom_with_measure, geometry point)
;
返回最接近给定点的位置处的线性测量几何图形的插值测量值。
![]() | |
仅对具有 M 分量的线性几何使用此函数 |
可用性: 2.0.0
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_InterpolatePoint('LINESTRING M (0 0 0, 10 0 20)', 'POINT(5 5)'); --------------------- 10
ST_AddMeasure — 沿线性几何形状插值测量值。
geometry ST_AddMeasure(
geometry geom_mline, float8 measure_start, float8 measure_end)
;
返回派生几何图形,其测量值在起点和终点之间线性插值。 如果几何图形没有测量尺寸,则添加一个。 如果几何图形具有测量尺寸,则会用新值覆盖它。 仅支持 LINESTRINGS 和 MULTILINESTRINGS。
可用性:1.1.0
该函数支持 3d 并且不会丢失 z-index。
SELECT ST_AsText(ST_AddMeasure( ST_GeomFromEWKT('LINESTRING(1 0, 2 0, 4 0)'),1,4)) As ewelev; ewelev -------------------------------- LINESTRINGM(1 0 1,2 0 2,4 0 4) SELECT ST_AsText(ST_AddMeasure( ST_GeomFromEWKT('LINESTRING(1 0 4, 2 0 4, 4 0 4)'),10,40)) As ewelev; ewelev ---------------------------------------- LINESTRING(1 0 4 10,2 0 4 20,4 0 4 40) SELECT ST_AsText(ST_AddMeasure( ST_GeomFromEWKT('LINESTRINGM(1 0 4, 2 0 4, 4 0 4)'),10,40)) As ewelev; ewelev ---------------------------------------- LINESTRINGM(1 0 10,2 0 20,4 0 40) SELECT ST_AsText(ST_AddMeasure( ST_GeomFromEWKT('MULTILINESTRINGM((1 0 4, 2 0 4, 4 0 4),(1 0 4, 2 0 4, 4 0 4))'),10,70)) As ewelev; ewelev ----------------------------------------------------------------- MULTILINESTRINGM((1 0 10,2 0 20,4 0 40),(1 0 40,2 0 50,4 0 70))
这些函数支持处理轨迹。 轨迹是每个坐标上具有递增度量(M 值)的线性几何。 时空数据可以使用相对时间(例如历元)作为度量值来建模。
ST_IsValidTrajectory — 测试几何图形是否为有效轨迹。
boolean ST_IsValidTrajectory(
geometry line)
;
测试几何体是否编码有效的轨迹。 有效轨迹表示为带有度量(M 值)的 LINESTRING
。 测量值必须从每个顶点到下一个顶点增加。
预计有效轨迹作为时空函数(如 ST_ClosestPointOfApproach)的输入
可用性:2.2.0
该函数支持 3d 并且不会丢失 z-index。
-- A valid trajectory SELECT ST_IsValidTrajectory(ST_MakeLine( ST_MakePointM(0,0,1), ST_MakePointM(0,1,2)) ); t -- An invalid trajectory SELECT ST_IsValidTrajectory(ST_MakeLine(ST_MakePointM(0,0,1), ST_MakePointM(0,1,0))); NOTICE: Measure of vertex 1 (0) not bigger than measure of vertex 0 (1) st_isvalidtrajectory ---------------------- f
ST_ClosestPointOfApproach — 返回两条轨迹最接近点处的测量值。
float8 ST_ClosestPointOfApproach(
geometry track1, geometry track2)
;
返回沿着给定轨迹插值的点之间距离最短的最小度量值。
输入必须是经 ST_IsValidTrajectory 检查的有效轨迹。 如果轨迹在其 M 范围内不重叠,则返回 Null。
要获取计算得到的度量值上的实际点,请使用 ST_LocateAlong。
可用性:2.2.0
该函数支持 3d 并且不会丢失 z-index。
-- Return the time in which two objects moving between 10:00 and 11:00 -- are closest to each other and their distance at that point WITH inp AS ( SELECT ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) a, ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) b ), cpa AS ( SELECT ST_ClosestPointOfApproach(a,b) m FROM inp ), points AS ( SELECT ST_GeometryN(ST_LocateAlong(a,m),1) pa, ST_GeometryN(ST_LocateAlong(b,m),1) pb FROM inp, cpa ) SELECT to_timestamp(m) t, ST_Distance(pa,pb) distance, ST_AsText(pa, 2) AS pa, ST_AsText(pb, 2) AS pb FROM points, cpa; t | distance | pa | pb -------------------------------+--------------------+--------------------------------------+---------------------------------------- 2015-05-26 10:45:31.034483-07 | 1.9603683315139542 | POINT ZM (7.59 0 3.79 1432662331.03) | POINT ZM (9.1 1.24 3.93 1432662331.03)
ST_DistanceCPA — 返回两条轨迹的最近接近点之间的距离。
float8 ST_DistanceCPA(
geometry track1, geometry track2)
;
返回两条轨迹在它们最接近的相交点处的距离(在二维空间中)。
输入必须是经 ST_IsValidTrajectory 检查的有效轨迹。 如果轨迹在其 M 范围内不重叠,则返回 Null。
可用性:2.2.0
该函数支持 3d 并且不会丢失 z-index。
-- Return the minimum distance of two objects moving between 10:00 and 11:00 WITH inp AS ( SELECT ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) a, ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) b ) SELECT ST_DistanceCPA(a,b) distance FROM inp; distance ------------------ 1.96036833151395
ST_CPAWithin — 测试两条轨迹的最近接近点是否在指定距离内。
boolean ST_CPAWithin(
geometry track1, geometry track2, float8 dist)
;
测试两个移动物体是否曾经比指定距离更近。
输入必须是经 ST_IsValidTrajectory 检查的有效轨迹。 如果轨迹在其 M 范围内不重叠,则返回 False。
可用性:2.2.0
该函数支持 3d 并且不会丢失 z-index。
WITH inp AS ( SELECT ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) a, ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) b ) SELECT ST_CPAWithin(a,b,2), ST_DistanceCPA(a,b) distance FROM inp; st_cpawithin | distance --------------+------------------ t | 1.96521473776207
这些函数报告和升级 PostGIS 版本。
PostGIS_Extensions_Upgrade — 将 PostGIS 扩展(例如 postgis_raster、postgis_topology、postgis_sfcgal)打包并升级到给定版本或最新版本。
text PostGIS_Extensions_Upgrade(
text target_version=null)
;
将 PostGIS 扩展打包并升级到给定版本或最新版本。 如果需要,只会打包和升级您在数据库中安装的扩展。 报告完整的 PostGIS 版本并随后构建配置信息。 这是对每个 PostGIS 扩展执行多个 CREATE EXTENSION .. FROM unpackaged 和 ALTER EXTENSION .. UPDATE 的简写。 目前仅尝试升级扩展 postgis、postgis_raster、postgis_sfcgal、postgis_topology 和 postgis_tiger_geocoder。
可用性:2.5.0
![]() | |
更改:3.4.0 添加 target_version 参数。 更改:3.3.0 支持从任何 PostGIS 版本升级。 不适用于所有系统。 更改:3.0.0 重新打包松散扩展并支持 postgis_raster。 |
SELECT PostGIS_Extensions_Upgrade();
NOTICE: Packaging extension postgis NOTICE: Packaging extension postgis_raster NOTICE: Packaging extension postgis_sfcgal NOTICE: Extension postgis_topology is not available or not packagable for some reason NOTICE: Extension postgis_tiger_geocoder is not available or not packagable for some reason postgis_extensions_upgrade ------------------------------------------------------------------- Upgrade completed, run SELECT postgis_full_version(); for details (1 row)
PostGIS_Full_Version — 报告完整的 PostGIS 版本和构建配置信息。
text PostGIS_Full_Version(
)
;
报告完整的 PostGIS 版本和构建配置信息。 还通知库和脚本之间的同步,建议根据需要进行升级。
增强功能:3.4.0 现在包括额外的 PROJ 配置 NETWORK_ENABLED、URL_ENDPOINT 和 proj.db 位置的 DATABASE_PATH
SELECT PostGIS_Full_Version(); postgis_full_version ---------------------------------------------------------------------------------- POSTGIS="3.4.0dev 3.3.0rc2-993-g61bdf43a7" [EXTENSION] PGSQL="160" GEOS="3.12.0dev-CAPI-1.18.0" SFCGAL="1.3.8" PROJ="7.2.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/proj.db" GDAL="GDAL 3.2.2, released 2021/03/05" LIBXML="2.9.10" LIBJSON="0.15" LIBPROTOBUF="1.3.3" WAGYU="0.5.0 (Internal)" TOPOLOGY RASTER (1 row)
PostGIS_GEOS_Version — 返回 GEOS 库的版本号。
text PostGIS_GEOS_Version(
)
;
返回 GEOS 库的版本号,如果未启用 GEOS 支持,则返回 NULL
。
SELECT PostGIS_GEOS_Version(); postgis_geos_version ---------------------- 3.12.0dev-CAPI-1.18.0 (1 row)
PostGIS_GEOS_Compiled_Version — 返回构建 PostGIS 所依据的 GEOS 库的版本号。
text PostGIS_GEOS_Compiled_Version(
)
;
返回 GEOS 库的版本号,或构建 PostGIS 的版本号。
可用性:3.4.0
SELECT PostGIS_GEOS_Compiled_Version(); postgis_geos_compiled_version ------------------------------- 3.12.0 (1 row)
PostGIS_Liblwgeom_Version — 返回 liblwgeom 库的版本号。 这应该与 PostGIS 的版本匹配。
text PostGIS_Liblwgeom_Version(
)
;
返回 liblwgeom 库的版本号/
SELECT PostGIS_Liblwgeom_Version(); postgis_liblwgeom_version -------------------------- 3.4.0dev 3.3.0rc2-993-g61bdf43a7 (1 row)
PostGIS_LibXML_Version — 返回 libxml2 库的版本号。
text PostGIS_LibXML_Version(
)
;
返回 libxml2 库的版本号。
可用性:1.5
SELECT PostGIS_LibXML_Version(); postgis_libxml_version ---------------------- 2.9.10 (1 row)
PostGIS_Lib_Build_Date — 返回 PostGIS 库的构建日期。
text PostGIS_Lib_Build_Date(
)
;
返回 PostGIS 库的构建日期。
SELECT PostGIS_Lib_Build_Date(); postgis_lib_build_date ------------------------ 2023-06-22 03:56:11 (1 row)
PostGIS_Lib_Version — 返回 PostGIS 库的版本号。
text PostGIS_Lib_Version(
)
;
返回 PostGIS 库的版本号。
SELECT PostGIS_Lib_Version(); postgis_lib_version --------------------- 3.4.0dev (1 row)
PostGIS_PROJ_Version — 返回 PROJ4 库的版本号。
text PostGIS_PROJ_Version(
)
;
返回 PROJ 库的版本号和 proj 的一些配置选项。
增强功能:3.4.0 现在包括 proj.db 位置的 NETWORK_ENABLED、URL_ENDPOINT 和 DATABASE_PATH
SELECT PostGIS_PROJ_Version(); postgis_proj_version ------------------------- 7.2.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/proj.db (1 row)
PostGIS_PROJ_Compiled_Version — Returns the version number of the PROJ library against which PostGIS was built.
text PostGIS_PROJ_Compiled_Version(
)
;
Returns the version number of the PROJ library, or against which PostGIS was built.
可用性:3.5.0
SELECT PostGIS_PROJ_Compiled_Version(); postgis_proj_compiled_version ------------------------------- 9.1.1 (1 row)
PostGIS_Wagyu_Version — 返回内部 Wagyu 库的版本号。
text PostGIS_Wagyu_Version(
)
;
返回内部 Wagyu 库的版本号,如果未启用 Wagyu 支持,则返回 NULL
。
SELECT PostGIS_Wagyu_Version(); postgis_wagyu_version ----------------------- 0.5.0 (Internal) (1 row)
PostGIS_Scripts_Build_Date — 返回 PostGIS 脚本的构建日期。
text PostGIS_Scripts_Build_Date(
)
;
返回 PostGIS 脚本的构建日期。
可用性: 1.0.0RC1
SELECT PostGIS_Scripts_Build_Date(); postgis_scripts_build_date ------------------------- 2023-06-22 03:56:11 (1 row)
PostGIS_Scripts_Installed — 返回此数据库中安装的 PostGIS 脚本的版本。
text PostGIS_Scripts_Installed(
)
;
返回此数据库中安装的 PostGIS 脚本的版本。
![]() | |
如果此函数的输出与 PostGIS_Scripts_Released的输出不匹配,您可能错过了正确升级现有数据库的机会。 有关详细信息,请参阅升级部分。 |
可用性:0.9.0
SELECT PostGIS_Scripts_Installed(); postgis_scripts_installed ------------------------- 3.4.0dev 3.3.0rc2-993-g61bdf43a7 (1 row)
PostGIS_Scripts_Released — 返回随安装的 PostGIS 库一起发布的 postgis.sql 脚本的版本号。
text PostGIS_Scripts_Released(
)
;
返回随安装的 PostGIS 库一起发布的 postgis.sql 脚本的版本号。
![]() | |
从版本 1.1.0 开始,此函数返回与 PostGIS_Lib_Version相同的值。 保留向后兼容性。 |
可用性:0.9.0
SELECT PostGIS_Scripts_Released(); postgis_scripts_released ------------------------- 3.4.0dev 3.3.0rc2-993-g61bdf43a7 (1 row)
PostGIS_Version — 返回 PostGIS 版本号和编译时选项。
text PostGIS_Version(
)
;
返回 PostGIS 版本号和编译时选项。
SELECT PostGIS_Version(); postgis_version --------------------------------------- 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1 (1 row)
本部分列出了自定义 PostGIS Grand Unified 自定义变量 (GUC)。 这些可以通过数据库、会话或事务进行全局设置。 最好在全局或数据库级别设置。
postgis.backend — 为 GEOS 和 SFCGAL 重叠的功能提供服务的后端。 选项:geos 或 sfcgal。 默认为geos。
仅当您使用 sfcgal 支持编译 PostGIS 时,此 GUC 才相关。 默认情况下,geos
后端用于 GEOS 和 SFCGAL 具有相同命名函数的函数。 此变量允许您覆盖并使 sfcgal 成为后端来服务请求。
可用性:2.1.0
仅针对连接生命周期设置后端
set postgis.backend = sfcgal;
设置数据库新连接的后端
ALTER DATABASE mygisdb SET postgis.backend = sfcgal;
postgis.gdal_datapath — 用于分配 GDAL 的 GDAL_DATA 选项值的配置选项。 如果未设置,则使用环境设置的 GDAL_DATA 变量。
一个 PostgreSQL GUC 变量,用于设置 GDAL 的 GDAL_DATA 选项的值。 postgis.gdal_datapath
值应该是 GDAL 数据文件的完整物理路径。
此配置选项最适用于 GDAL 数据文件路径未硬编码的 Windows 平台。 当 GDAL 的数据文件不在 GDAL 的预期路径中时,也应该设置此选项。
![]() | |
该选项可以在 PostgreSQL 的配置文件 postgresql.conf 中设置。 也可以通过连接或事务来设置。 |
可用性:2.2.0
![]() | |
有关 GDAL_DATA 的其他信息可在 GDAL 的配置选项中找到。 |
设置和重置 postgis.gdal_datapath
SET postgis.gdal_datapath TO '/usr/local/share/gdal.hidden'; SET postgis.gdal_datapath TO default;
在 Windows 上针对特定数据库进行设置
ALTER DATABASE gisdb SET postgis.gdal_datapath = 'C:/Program Files/PostgreSQL/9.3/gdal-data';
postgis.gdal_enabled_drivers — 用于设置 PostGIS 环境中启用的 GDAL 驱动程序的配置选项。 影响 GDAL 配置变量 GDAL_SKIP。
用于设置 PostGIS 环境中启用的 GDAL 驱动程序的配置选项。 影响 GDAL 配置变量 GDAL_SKIP。 该选项可以在 PostgreSQL 的配置文件:postgresql.conf 中设置。 也可以通过连接或事务来设置。
postgis.gdal_enabled_drivers
的初始值也可以通过将环境变量 POSTGIS_GDAL_ENABLED_DRIVERS
和已启用的驱动程序列表传递给启动 PostgreSQL 的进程来设置。
启用GDAL指定的驱动程序可以通过驱动程序的短名称或代码来指定。 驱动程序短名称或代码可以在 GDAL 栅格格式中找到。 可以通过在每个驱动程序之间添加空格来指定多个驱动程序。
![]() | |
当 |
![]() | |
在标准 PostGIS 安装中, |
![]() | |
有关 GDAL_SKIP 的其他信息可在 GDAL 的配置选项中找到。 |
可用性:2.2.0
设置和重置postgis.gdal_enabled_drivers
为所有新的数据库连接设置后端
ALTER DATABASE mygisdb SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG';
为与服务器的所有新连接设置默认启用的驱动程序。 需要超级用户访问权限和 PostgreSQL 9.4+ 。 另请注意,数据库、会话和用户设置会覆盖此设置。
ALTER SYSTEM SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG'; SELECT pg_reload_conf();
SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG'; SET postgis.gdal_enabled_drivers = default;
启用所有 GDAL 驱动程序
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL';
禁用所有GDAL驱动程序
SET postgis.gdal_enabled_drivers = 'DISABLE_ALL';
postgis.enable_outdb_rasters — 一个布尔配置选项,用于启用对数据库外栅格波段的访问。
一个布尔配置选项,用于启用对数据库外栅格波段的访问。 该选项可以在 PostgreSQL 的配置文件:postgresql.conf 中设置。 也可以通过连接或事务来设置。
postgis.enable_outdb_rasters
的初始值也可以通过将具有非零值的环境变量 POSTGIS_ENABLE_OUTDB_RASTERS
传递给启动 PostgreSQL 的进程来设置。
![]() | |
即使 |
![]() | |
在标准 PostGIS 安装中, |
可用性:2.2.0
设置和重置当前会话的 postgis.enable_outdb_rasters
SET postgis.enable_outdb_rasters TO True; SET postgis.enable_outdb_rasters = default; SET postgis.enable_outdb_rasters = True; SET postgis.enable_outdb_rasters = False;
针对特定数据库设置
ALTER DATABASE gisdb SET postgis.enable_outdb_rasters = true;
整个数据库集群的设置。 您需要重新连接到数据库才能使更改生效。
--writes to postgres.auto.conf ALTER SYSTEM postgis.enable_outdb_rasters = true; --Reloads postgres conf SELECT pg_reload_conf();
postgis.gdal_vsi_options — 用于设置处理外部数据库栅格时使用的选项的字符串配置。
用于设置处理外部数据库栅格时使用的选项的字符串配置。 配置选项控制诸如 GDAL 分配给本地数据缓存的空间大小、是否读取概述以及对远程 out-db 数据源使用哪些访问键等内容。
可用性:3.2.0
为当前会话设置 postgis.gdal_vsi_options
:
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy';
使用 LOCAL
关键字仅为当前事务设置 postgis.gdal_vsi_options
:
SET LOCAL postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy';
这些函数是用于故障排除和修复几何数据的实用程序。 仅当几何数据以某种方式损坏时才需要它们,而这种情况在正常情况下永远不会发生。
PostGIS_AddBBox — 向几何体添加边界框。
geometry PostGIS_AddBBox(
geometry geomA)
;
向几何体添加边界框。 这将使基于边界框的查询更快,但会增加几何形状的大小。
![]() | |
边界框会自动添加到几何图形中,因此通常不需要这样做,除非生成的边界框以某种方式损坏或者您的旧安装缺少边界框。 然后你需要删除旧的并重新读取。 |
此方法支持圆形字符串和曲线。
UPDATE sometable SET geom = PostGIS_AddBBox(geom) WHERE PostGIS_HasBBox(geom) = false;
PostGIS_DropBBox — 从几何体中删除边界框缓存。
geometry PostGIS_DropBBox(
geometry geomA)
;
从几何体中删除边界框缓存。 这会减少几何尺寸,但会使基于边界框的查询变慢。 它还用于删除损坏的边界框。 缓存边界框损坏的一个迹象是 ST_Intersects 和其他关系查询遗漏了理应返回 true 的几何图形。
![]() | |
边界框会自动添加到几何图形中并提高查询速度,因此通常不需要这样做,除非生成的边界框以某种方式损坏或者您的旧安装缺少边界框。 然后你需要删除旧的并重新读取。 在 8.3-8.3.6 系列中已经观察到这种损坏,其中当几何图形更改时,并不总是重新计算缓存的 bbox,并且在不重新加载转储的情况下升级到较新的版本将不会纠正已经损坏的框。 因此,可以使用下面的方法手动更正并重新添加 bbox 或进行转储重新加载。 |
此方法支持圆形字符串和曲线。
--This example drops bounding boxes where the cached box is not correct --The force to ST_AsBinary before applying Box2D forces a recalculation of the box, and Box2D applied to the table geometry always -- returns the cached bounding box. UPDATE sometable SET geom = PostGIS_DropBBox(geom) WHERE Not (Box2D(ST_AsBinary(geom)) = Box2D(geom)); UPDATE sometable SET geom = PostGIS_AddBBox(geom) WHERE Not PostGIS_HasBBOX(geom);
PostGIS_HasBBox — 如果该几何体的 bbox 已缓存,则返回 TRUE,否则返回 FALSE。
boolean PostGIS_HasBBox(
geometry geomA)
;
SELECT geom FROM sometable WHERE PostGIS_HasBBox(geom) = false;
SFCGAL是CGAL的C++封装库,提供高级的二维和三维空间函数。为了确保稳健性,几何坐标具有精确的有理数表示。
该库的安装说明可以在 SFCGAL 主页 (http://www.sfcgal.org) 上找到。 要启用这些功能,请使用create extension postgis_sfcgal
。
这部分列出了几个函数,用于确定您当前环境中 SFCGAL 的版本信息以及相关库文件的依赖关系。
postgis_sfcgal_version — 返回正在使用的 SFCGAL 版本
文本 postgis_sfcgal_version描述(
void)
;
返回正在使用的 SFCGAL 版本
可用性:2.1.0
该方法需要SFCGAL后端。
postgis_sfcgal_full_version — 返回正在使用的 SFCGAL 的完整版本,包括 CGAL 和 Boost 版本
文本postgis_sfcgal_full_version(
void)
;
返回正在使用的 SFCGAL 的完整版本,包括 CGAL 和 Boost 版本
可用性: 3.3.0
该方法需要SFCGAL后端。
这些函数访问或设置几何图形的属性。这些函数主要支持TINS和多面体表面。
CG_ForceLHR — 强制 LHR 方向
geometry CG_ForceLHR(
geometry geom)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_IsPlanar — 检查表面是否平坦
boolean CG_IsPlanar(
geometry geom)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_IsSolid — 测试几何体是否为实体。 不执行有效性检查。
boolean CG_IsSolid(
geometry geom1)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_MakeSolid — 将几何体铸造成实体。 不执行任何检查。 要获得有效的实体,输入几何图形必须是闭合多面体曲面或闭合 TIN。
geometry CG_MakeSolid(
geometry geom1)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_Orientation — 确定表面方向
integer CG_Orientation(
geometry geom)
;
该函数仅适用于多边形。 如果多边形是逆时针方向,则返回 -1;如果多边形是顺时针方向,则返回 1。
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
CG_Area — Calculates the area of a geometry
double precision CG_Area(
geometry geom )
;
Calculates the area of a geometry.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a double precision value representing the area. |
可用性:3.5.0
该方法需要SFCGAL后端。
SELECT CG_Area('Polygon ((0 0, 0 5, 5 5, 5 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1), (3 3, 4 3, 4 4, 3 4, 3 3))'); cg_area -------- 25 (1 row)
CG_3DArea — 计算 3D 表面几何形状的面积。 对于固体将返回 0。
floatCG_3DArea(
geometry geom1)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 8.1, 10.5
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
注意:默认情况下,从 WKT 构建的 PolyhedralSurface 是曲面几何体,而不是实体。 因此它具有表面积。 一旦转换为实体,就没有面积了。
SELECT CG_3DArea(geom) As cube_surface_area, CG_3DArea(CG_MakeSolid(geom)) As solid_surface_area FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'::geometry) As f(geom); cube_surface_area | solid_surface_area -------------------+-------------------- 6 | 0
CG_Volume — 计算 3D 实体的体积。 如果应用于表面(甚至闭合)几何图形将返回 0。
float CG_Volume(
geometry geom1)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 9.1 (same as CG_3DVolume)
When closed surfaces are created with WKT, they are treated as areal rather than solid. To make them solid, you need to use CG_MakeSolid. Areal geometries have no volume. Here is an example to demonstrate.
SELECT CG_Volume(geom) As cube_surface_vol, CG_Volume(CG_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'::geometry) As f(geom); cube_surface_vol | solid_surface_vol ------------------+------------------- 0 | 1
ST_ForceLHR — 强制 LHR 方向
geometry ST_ForceLHR(
geometry geom)
;
![]() | |
ST_ForceLHR is deprecated as of 3.5.0. Use CG_ForceLHR instead. |
可用性:2.1.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
ST_IsPlanar — 检查表面是否平坦
boolean ST_IsPlanar(
geometry geom)
;
![]() | |
ST_IsPlanar is deprecated as of 3.5.0. Use CG_IsPlanar instead. |
可用性:2.2.0:这在 2.1.0 中已记录,但在 2.1 版本中意外遗漏。
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
ST_IsSolid — 测试几何体是否为实体。 不执行有效性检查。
boolean ST_IsSolid(
geometry geom1)
;
![]() | |
ST_IsSolid is deprecated as of 3.5.0. Use CG_IsSolid instead. |
可用性:2.2.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
ST_MakeSolid — 将几何体铸造成实体。 不执行任何检查。 要获得有效的实体,输入几何图形必须是闭合多面体曲面或闭合 TIN。
geometry ST_MakeSolid(
geometry geom1)
;
![]() | |
ST_MakeSolid is deprecated as of 3.5.0. Use CG_MakeSolid instead. |
可用性:2.2.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
ST_Orientation — 确定表面方向
integer ST_Orientation(
geometry geom)
;
![]() | |
ST_Orientation is deprecated as of 3.5.0. Use CG_Orientation instead. |
该函数仅适用于多边形。 如果多边形是逆时针方向,则返回 -1;如果多边形是顺时针方向,则返回 1。
可用性:2.1.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
ST_3DArea — 计算 3D 表面几何形状的面积。 对于固体将返回 0。
floatST_3DArea(
geometry geom1)
;
可用性:2.1.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 8.1, 10.5
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
注意:默认情况下,从 WKT 构建的 PolyhedralSurface 是曲面几何体,而不是实体。 因此它具有表面积。 一旦转换为实体,就没有面积了。
SELECT ST_3DArea(geom) As cube_surface_area, ST_3DArea(ST_MakeSolid(geom)) As solid_surface_area FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'::geometry) As f(geom); cube_surface_area | solid_surface_area -------------------+-------------------- 6 | 0
ST_Volume — 计算 3D 实体的体积。 如果应用于表面(甚至闭合)几何图形将返回 0。
float ST_Volume(
geometry geom1)
;
可用性:2.2.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 9.1 (与ST_3DVolume相同)
当使用 WKT 创建闭合曲面时,它们将被视为面而不是实体。 要使它们成为实体,您需要使用ST_MakeSolid。 面积几何没有体积。 这里有一个例子来演示。
SELECT ST_Volume(geom) As cube_surface_vol, ST_Volume(ST_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'::geometry) As f(geom); cube_surface_vol | solid_surface_vol ------------------+------------------- 0 | 1
CG_Intersection — Computes the intersection of two geometries
geometry CG_Intersection(
geometry geomA , geometry geomB )
;
Computes the intersection of two geometries.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a geometry representing the intersection. |
可用性:3.5.0
该方法需要SFCGAL后端。
SELECT ST_AsText(CG_Intersection('LINESTRING(0 0, 5 5)', 'LINESTRING(5 0, 0 5)')); cg_intersection ----------------- POINT(2.5 2.5) (1 row)
CG_Intersects — 测试两个几何图形是否相交(它们至少有一个共同点)
boolean CG_Intersects(
geometry geomA , geometry geomB )
;
如果两个几何图形相交,则返回 true
。 如果几何图形有任何共同点,则它们相交。
Performed by the SFCGAL module
![]() | |
注意:这是返回布尔值而不是整数的“允许”版本。 |
可用性:3.5.0
该方法需要SFCGAL后端。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); cg_intersects --------------- f (1 row) SELECT CG_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry); cg_intersects --------------- t (1 row)
CG_3DIntersects — Tests if two 3D geometries intersect
boolean CG_3DIntersects(
geometry geomA , geometry geomB )
;
Tests if two 3D geometries intersect. 3D geometries intersect if they have any point in common in the three-dimensional space.
Performed by the SFCGAL module
![]() | |
注意:这是返回布尔值而不是整数的“允许”版本。 |
可用性:3.5.0
该方法需要SFCGAL后端。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_3DIntersects('POINT(1.2 0.1 0)','POLYHEDRALSURFACE(((0 0 0,0.5 0.5 0,1 0 0,1 1 0,0 1 0,0 0 0)),((1 0 0,2 0 0,2 1 0,1 1 0,1 0 0),(1.2 0.2 0,1.2 0.8 0,1.8 0.8 0,1.8 0.2 0,1.2 0.2 0)))'); cg_3dintersects --------------- t (1 row)
CG_Difference — Computes the geometric difference between two geometries
geometry CG_Difference(
geometry geomA , geometry geomB )
;
Computes the geometric difference between two geometries. The resulting geometry is a set of points that are present in geomA but not in geomB.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a geometry. |
可用性:3.5.0
该方法需要SFCGAL后端。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_AsText(CG_Difference('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))'::geometry, 'LINESTRING(0 0, 2 2)'::geometry)); cg_difference --------------- POLYGON((0 0,1 0,1 1,0 1,0 0)) (1 row)
ST_3DDifference — 执行 3D 差异
geometry ST_3DDifference(
geometry geom1, geometry geom2)
;
![]() | |
ST_3DDifference is deprecated as of 3.5.0. Use CG_3DDifference instead. |
返回 geom1 中不属于 geom2 的部分。
可用性:2.2.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_3DDifference — 执行 3D 差异
geometry CG_3DDifference(
geometry geom1, geometry geom2)
;
![]() | |
CG_3DDifference is deprecated as of 3.5.0. Use CG_3DDifference instead. |
返回 geom1 中不属于 geom2 的部分。
可用性:3.5.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
3D 图像是使用 ST_AsX3D生成的,并使用 X3Dom HTML Javascript 渲染库以 HTML 形式渲染。
SELECT CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
![]() 原始 3D 几何图形叠加。 geom2 是将要删除的部分。 |
SELECT CG_3DDifference(geom1,geom2) FROM ( SELECT CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
![]() 删除geom2后还剩下什么 |
CG_Distance — Computes the minimum distance between two geometries
double precision CG_Distance(
geometry geomA , geometry geomB )
;
Computes the minimum distance between two geometries.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a double precision value representing the distance. |
可用性:3.5.0
该方法需要SFCGAL后端。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_Distance('LINESTRING(0.0 0.0,-1.0 -1.0)', 'LINESTRING(3.0 4.0,4.0 5.0)'); cg_distance ------------- 2.0 (1 row)
CG_3DDistance — Computes the minimum 3D distance between two geometries
double precision CG_3DDistance(
geometry geomA , geometry geomB )
;
Computes the minimum 3D distance between two geometries.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a double precision value representing the 3D distance. |
可用性:3.5.0
该方法需要SFCGAL后端。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_3DDistance('LINESTRING(-1.0 0.0 2.0,1.0 0.0 3.0)', 'TRIANGLE((-4.0 0.0 1.0,4.0 0.0 1.0,0.0 4.0 1.0,-4.0 0.0 1.0))'); cg_3ddistance ---------------- 1 (1 row)
ST_3DConvexHull — 计算几何体的 3D 凸包。
geometry ST_3DConvexHull(
geometry geom1)
;
![]() | |
ST_3DConvexHull is deprecated as of 3.5.0. Use CG_3DConvexHull instead. |
可用性: 3.3.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_3DConvexHull — 计算几何体的 3D 凸包。
geometry CG_3DConvexHull(
geometry geom1)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_AsText(CG_3DConvexHull('LINESTRING Z(0 0 5, 1 5 3, 5 7 6, 9 5 3 , 5 7 5, 6 3 5)'::geometry));
POLYHEDRALSURFACE Z (((1 5 3,9 5 3,0 0 5,1 5 3)),((1 5 3,0 0 5,5 7 6,1 5 3)),((5 7 6,5 7 5,1 5 3,5 7 6)),((0 0 5,6 3 5,5 7 6,0 0 5)),((6 3 5,9 5 3,5 7 6,6 3 5)),((0 0 5,9 5 3,6 3 5,0 0 5)),((9 5 3,5 7 5,5 7 6,9 5 3)),((1 5 3,5 7 5,9 5 3,1 5 3)))
WITH f AS (SELECT i, CG_Extrude(geom, 0,0, i ) AS geom FROM ST_Subdivide(ST_Letters('CH'),5) WITH ORDINALITY AS sd(geom,i) ) SELECT CG_3DConvexHull(ST_Collect(f.geom) ) FROM f;
原始几何体覆盖 3D 凸包
ST_3DIntersection — 执行 3D 相交
geometry ST_3DIntersection(
geometry geom1, geometry geom2)
;
![]() | |
ST_3DIntersection is deprecated as of 3.5.0. Use CG_3DIntersection instead. |
返回作为 geom1 和 geom2 之间共享部分的几何图形。
可用性:2.1.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_3DIntersection — 执行 3D 相交
geometry CG_3DIntersection(
geometry geom1, geometry geom2)
;
返回作为 geom1 和 geom2 之间共享部分的几何图形。
可用性:3.5.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
3D 图像是使用 ST_AsX3D生成的,并使用 X3Dom HTML Javascript 渲染库以 HTML 形式渲染。
SELECT CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
![]() 原始 3D 几何图形叠加。 geom2 显示为半透明 |
SELECT CG_3DIntersection(geom1,geom2) FROM ( SELECT CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
![]() geom1和geom2的交集 |
3D 线串和多边形
SELECT ST_AsText(CG_3DIntersection(linestring, polygon)) As wkt FROM ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon; wkt -------------------------------- LINESTRING Z (1 1 8,0.5 0.5 8)
立方体(闭合多面体曲面)和多边形 Z
SELECT ST_AsText(CG_3DIntersection( ST_GeomFromText('POLYHEDRALSURFACE Z( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'), 'POLYGON Z ((0 0 0, 0 0 0.5, 0 0.5 0.5, 0 0.5 0, 0 0 0))'::geometry))
TIN Z (((0 0 0,0 0 0.5,0 0.5 0.5,0 0 0)),((0 0.5 0,0 0 0,0 0.5 0.5,0 0.5 0)))
两个实体的交点也是实体(ST_Dimension返回3)
SELECT ST_AsText(CG_3DIntersection( CG_Extrude(ST_Buffer('POINT(10 20)'::geometry,10,1),0,0,30), CG_Extrude(ST_Buffer('POINT(10 20)'::geometry,10,1),2,0,10) ));
POLYHEDRALSURFACE Z (((13.3333333333333 13.3333333333333 10,20 20 0,20 20 10,13.3333333333333 13.3333333333333 10)), ((20 20 10,16.6666666666667 23.3333333333333 10,13.3333333333333 13.3333333333333 10,20 20 10)), ((20 20 0,16.6666666666667 23.3333333333333 10,20 20 10,20 20 0)), ((13.3333333333333 13.3333333333333 10,10 10 0,20 20 0,13.3333333333333 13.3333333333333 10)), ((16.6666666666667 23.3333333333333 10,12 28 10,13.3333333333333 13.3333333333333 10,16.6666666666667 23.3333333333333 10)), ((20 20 0,9.99999999999995 30 0,16.6666666666667 23.3333333333333 10,20 20 0)), ((10 10 0,9.99999999999995 30 0,20 20 0,10 10 0)),((13.3333333333333 13.3333333333333 10,12 12 10,10 10 0,13.3333333333333 13.3333333333333 10)), ((12 28 10,12 12 10,13.3333333333333 13.3333333333333 10,12 28 10)), ((16.6666666666667 23.3333333333333 10,9.99999999999995 30 0,12 28 10,16.6666666666667 23.3333333333333 10)), ((10 10 0,0 20 0,9.99999999999995 30 0,10 10 0)), ((12 12 10,11 11 10,10 10 0,12 12 10)),((12 28 10,11 11 10,12 12 10,12 28 10)), ((9.99999999999995 30 0,11 29 10,12 28 10,9.99999999999995 30 0)),((0 20 0,2 20 10,9.99999999999995 30 0,0 20 0)), ((10 10 0,2 20 10,0 20 0,10 10 0)),((11 11 10,2 20 10,10 10 0,11 11 10)),((12 28 10,11 29 10,11 11 10,12 28 10)), ((9.99999999999995 30 0,2 20 10,11 29 10,9.99999999999995 30 0)),((11 11 10,11 29 10,2 20 10,11 11 10)))
CG_Union — Computes the union of two geometries
geometry CG_Union(
geometry geomA , geometry geomB )
;
Computes the union of two geometries.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a geometry representing the union. |
可用性:3.5.0
该方法需要SFCGAL后端。
SELECT CG_Union('POINT(.5 0)', 'LINESTRING(-1 0,1 0)'); cg_union ----------- LINESTRING(-1 0,0.5 0,1 0) (1 row)
ST_3DUnion — 执行 3D 联合。
geometry ST_3DUnion(
geometry geom1, geometry geom2)
;
geometry ST_3DUnion(
geometry set g1field)
;
![]() | |
ST_3DUnion is deprecated as of 3.5.0. Use CG_3DUnion instead. |
可用性:2.2.0
可用性:3.3.0 添加了聚合函数格式
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
聚合形式:返回几何图形,该几何图形是几何图形行集的 3D 并集。 ST_3DUnion() 函数是 PostgreSQL 术语中的“聚合”函数。 这意味着它对数据行进行操作,与 SUM() 和 AVG() 函数的操作方式相同,并且与大多数聚合一样,它也会忽略 NULL 几何图形。
CG_3DUnion — 执行 3D 联合。
geometry CG_3DUnion(
geometry geom1, geometry geom2)
;
geometry CG_3DUnion(
geometry set g1field)
;
![]() | |
CG_3DUnion is deprecated as of 3.5.0. Use CG_3DUnion instead. |
可用性:3.5.0
该方法需要SFCGAL后端。
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
Aggregate variant: returns a geometry that is the 3D union of a rowset of geometries. The CG_3DUnion() function is an "aggregate" function in the terminology of PostgreSQL. That means that it operates on rows of data, in the same way the SUM() and AVG() functions do and like most aggregates, it also ignores NULL geometries.
3D 图像是使用 ST_AsX3D生成的,并使用 X3Dom HTML Javascript 渲染库以 HTML 形式渲染。
SELECT CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
![]() 原始 3D 几何图形叠加。 geom2是具有透明度的。 |
SELECT CG_3DUnion(geom1,geom2) FROM ( SELECT CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
![]() geom1 和 geom2 的并集 |
ST_AlphaShape — 计算包围几何体的 Alpha 形状
geometry ST_AlphaShape(
geometry geom, float alpha, boolean allow_holes = false)
;
![]() | |
ST_AlphaShape is deprecated as of 3.5.0. Use CG_AlphaShape instead. |
计算几何中点的 Alpha 形状。 alpha 形状是(通常)凹多边形几何体,它包含输入的所有顶点,并且其顶点是输入顶点的子集。 与凸包生成的形状相比,alpha 形状更适合输入的形状。
CG_AlphaShape — 计算包围几何体的 Alpha 形状
geometry CG_AlphaShape(
geometry geom, float alpha, boolean allow_holes = false)
;
计算几何中点的 Alpha 形状。 alpha 形状是(通常)凹多边形几何体,它包含输入的所有顶点,并且其顶点是输入顶点的子集。 与凸包生成的形状相比,alpha 形状更适合输入的形状。
“拟合紧密度”由 alpha
参数控制,该参数的值可以从 0 到无穷大。 较小的 alpha 值会产生更凹的结果。 大于某些数据相关值的 Alpha 值会生成输入的凸包。
![]() | |
在 CGAL 实现之后,alpha 值是 Alpha-Shape 算法中用于“侵蚀”输入点的 Delaunay 三角剖分的圆半径的平方。 有关详细信息,请参阅 CGAL Alpha 形状。 这与 alpha 形状的原始定义不同,后者将 alpha 定义为侵蚀圆的半径。 |
除非将可选的allow_holes
参数指定为true,否则计算的形状不包含孔。
该函数以与ST_ConcaveHull类似的方式有效地计算几何体的凹壳,但使用 CGAL 和不同的算法。
Availability: 3.5.0 - requires SFCGAL >= 1.4.1.
该方法需要SFCGAL后端。
Alpha-shape of a MultiPoint (same example As CG_OptimalAlphaShape)
SELECT ST_AsText(CG_AlphaShape('MULTIPOINT((63 84),(76 88),(68 73),(53 18),(91 50),(81 70), (88 29),(24 82),(32 51),(37 23),(27 54),(84 19),(75 87),(44 42),(77 67),(90 30),(36 61),(32 65), (81 47),(88 58),(68 73),(49 95),(81 60),(87 50), (78 16),(79 21),(30 22),(78 43),(26 85),(48 34),(35 35),(36 40),(31 79),(83 29),(27 84),(52 98),(72 95),(85 71), (75 84),(75 77),(81 29),(77 73),(41 42),(83 72),(23 36),(89 53),(27 57),(57 97),(27 77),(39 88),(60 81), (80 72),(54 32),(55 26),(62 22),(70 20),(76 27),(84 35),(87 42),(82 54),(83 64),(69 86),(60 90),(50 86),(43 80),(36 73), (36 68),(40 75),(24 67),(23 60),(26 44),(28 33),(40 32),(43 19),(65 16),(73 16),(38 46),(31 59),(34 86),(45 90),(64 97))'::geometry,80.2));
POLYGON((89 53,91 50,87 42,90 30,88 29,84 19,78 16,73 16,65 16,53 18,43 19, 37 23,30 22,28 33,23 36,26 44,27 54,23 60,24 67,27 77, 24 82,26 85,34 86,39 88,45 90,49 95,52 98,57 97, 64 97,72 95,76 88,75 84,83 72,85 71,88 58,89 53))
Alpha-shape of a MultiPoint, allowing holes (same example as CG_OptimalAlphaShape)
SELECT ST_AsText(CG_AlphaShape('MULTIPOINT((63 84),(76 88),(68 73),(53 18),(91 50),(81 70),(88 29),(24 82),(32 51),(37 23),(27 54),(84 19),(75 87),(44 42),(77 67),(90 30),(36 61),(32 65),(81 47),(88 58),(68 73),(49 95),(81 60),(87 50), (78 16),(79 21),(30 22),(78 43),(26 85),(48 34),(35 35),(36 40),(31 79),(83 29),(27 84),(52 98),(72 95),(85 71), (75 84),(75 77),(81 29),(77 73),(41 42),(83 72),(23 36),(89 53),(27 57),(57 97),(27 77),(39 88),(60 81), (80 72),(54 32),(55 26),(62 22),(70 20),(76 27),(84 35),(87 42),(82 54),(83 64),(69 86),(60 90),(50 86),(43 80),(36 73), (36 68),(40 75),(24 67),(23 60),(26 44),(28 33),(40 32),(43 19),(65 16),(73 16),(38 46),(31 59),(34 86),(45 90),(64 97))'::geometry, 100.1,true))
POLYGON((89 53,91 50,87 42,90 30,84 19,78 16,73 16,65 16,53 18,43 19,30 22,28 33,23 36, 26 44,27 54,23 60,24 67,27 77,24 82,26 85,34 86,39 88,45 90,49 95,52 98,57 97,64 97,72 95, 76 88,75 84,83 72,85 71,88 58,89 53),(36 61,36 68,40 75,43 80,60 81,68 73,77 67, 81 60,82 54,81 47,78 43,76 27,62 22,54 32,44 42,38 46,36 61))
MultiPoint 的 Alpha 形状,允许有孔(与 ST_ConcaveHull相同的示例)
SELECT ST_AsText(CG_AlphaShape( 'MULTIPOINT ((132 64), (114 64), (99 64), (81 64), (63 64), (57 49), (52 36), (46 20), (37 20), (26 20), (32 36), (39 55), (43 69), (50 84), (57 100), (63 118), (68 133), (74 149), (81 164), (88 180), (101 180), (112 180), (119 164), (126 149), (132 131), (139 113), (143 100), (150 84), (157 69), (163 51), (168 36), (174 20), (163 20), (150 20), (143 36), (139 49), (132 64), (99 151), (92 138), (88 124), (81 109), (74 93), (70 82), (83 82), (99 82), (112 82), (126 82), (121 96), (114 109), (110 122), (103 138), (99 151), (34 27), (43 31), (48 44), (46 58), (52 73), (63 73), (61 84), (72 71), (90 69), (101 76), (123 71), (141 62), (166 27), (150 33), (159 36), (146 44), (154 53), (152 62), (146 73), (134 76), (143 82), (141 91), (130 98), (126 104), (132 113), (128 127), (117 122), (112 133), (119 144), (108 147), (119 153), (110 171), (103 164), (92 171), (86 160), (88 142), (79 140), (72 124), (83 131), (79 118), (68 113), (63 102), (68 93), (35 45))'::geometry,102.2, true));
POLYGON((26 20,32 36,35 45,39 55,43 69,50 84,57 100,63 118,68 133,74 149,81 164,88 180, 101 180,112 180,119 164,126 149,132 131,139 113,143 100,150 84,157 69,163 51,168 36, 174 20,163 20,150 20,143 36,139 49,132 64,114 64,99 64,90 69,81 64,63 64,57 49,52 36,46 20,37 20,26 20), (74 93,81 109,88 124,92 138,103 138,110 122,114 109,121 96,112 82,99 82,83 82,74 93))
CG_ApproxConvexPartition — 计算多边形几何图形的近似凸分割
geometry CG_ApproxConvexPartition(
geometry geom)
;
计算多边形几何图形的近似凸分割(使用三角剖分)。
![]() | |
多边形 P 的一个划分是指一组多边形,这些多边形的内部不相交,并且这些多边形的并集等于原始多边形 P 的内部。CG_ApproxConvexPartition 和 CG_GreeneApproxConvexPartition 函数生成近似最优的凸分割。这两个函数通过首先将多边形分解为更简单的多边形来生成凸分解;CG_ApproxConvexPartition 使用三角剖分,而 CG_GreeneApproxConvexPartition 使用一个单调分割。这两个函数都保证它们生成的凸片段数不会超过最优数量的四倍,但它们在运行时复杂性上有所不同。尽管基于三角剖分的近似算法通常会产生较少的凸片段,但并非总是如此。 |
可用性:3.5.0 - 需要 SFCGAL >= 1.5.0。
需要 SFCGAL 版本>= 1.5.0
该方法需要SFCGAL后端。
近似凸分割(与 CG_YMonotonePartition、CG_GreeneApproxConvexPartition 和 CG_OptimalConvexPartition 相同的示例)
SELECT ST_AsText(CG_ApproxConvexPartition('POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry));
GEOMETRYCOLLECTION(POLYGON((156 150,83 181,89 131,148 120,156 150)),POLYGON((32 159,0 45,41 86,32 159)),POLYGON((107 61,32 159,41 86,107 61)),POLYGON((45 1,177 2,67 24,45 1)),POLYGON((41 86,45 1,67 24,41 86)),POLYGON((107 61,41 86,67 24,109 31,107 61)),POLYGON((148 120,107 61,109 31,170 60,148 120)),POLYGON((156 150,148 120,170 60,180 110,156 150)))
ST_ApproximateMedialAxis — 计算几何区域的近似中轴。
geometry ST_ApproximateMedialAxis(
geometry geom)
;
![]() | |
ST_ApproximateMedialAxis is deprecated as of 3.5.0. Use CG_ApproximateMedialAxis instead. |
Return an approximate medial axis for the areal input based on its straight skeleton. Uses an SFCGAL specific API when built against a capable version (1.2.0+). Otherwise the function is just a wrapper around CG_StraightSkeleton (slower case).
可用性:2.2.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_ApproximateMedialAxis — 计算几何区域的近似中轴。
geometry CG_ApproximateMedialAxis(
geometry geom)
;
Return an approximate medial axis for the areal input based on its straight skeleton. Uses an SFCGAL specific API when built against a capable version (1.2.0+). Otherwise the function is just a wrapper around CG_StraightSkeleton (slower case).
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_ApproximateMedialAxis(ST_GeomFromText('POLYGON (( 190 190, 10 190, 10 10, 190 10, 190 20, 160 30, 60 30, 60 130, 190 140, 190 190 ))'));
![]() 多边形及其近似中轴 |
ST_ConstrainedDelaunayTriangles — 返回围绕给定输入几何体的约束 Delaunay 三角剖分。
geometry ST_ConstrainedDelaunayTriangles(
geometry g1)
;
![]() | |
ST_ConstrainedDelaunayTriangles is deprecated as of 3.5.0. Use CG_ConstrainedDelaunayTriangles instead. |
返回围绕输入几何体顶点的约束 Delaunay 三角剖分。 输出是 TIN。
该方法需要SFCGAL后端。
可用性:3.0.0
该函数支持 3d 并且不会丢失 z-index。
CG_ConstrainedDelaunayTriangles — 返回围绕给定输入几何体的约束 Delaunay 三角剖分。
geometry CG_ConstrainedDelaunayTriangles(
geometry g1)
;
![]() | |
CG_ConstrainedDelaunayTriangles is deprecated as of 3.5.0. Use CG_ConstrainedDelaunayTriangles instead. |
返回围绕输入几何体顶点的约束 Delaunay 三角剖分。 输出是 TIN。
该方法需要SFCGAL后端。
可用性:3.0.0
该函数支持 3d 并且不会丢失 z-index。
![]() CG_ConstrainedDelaunayTriangles of 2 polygons
select CG_ConstrainedDelaunayTriangles( ST_Union( 'POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'::geometry, ST_Buffer('POINT(110 170)'::geometry, 20) ) );
| ![]() ST_DelaunayTriangles 2 个多边形。 三角形边与多边形边界相交。
select ST_DelaunayTriangles( ST_Union( 'POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'::geometry, ST_Buffer('POINT(110 170)'::geometry, 20) ) );
|
ST_Extrude — 将曲面挤出到相关体积
geometry ST_Extrude(
geometry geom, float x, float y, float z)
;
![]() | |
ST_Extrude is deprecated as of 3.5.0. Use CG_Extrude instead. |
可用性:2.1.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_Extrude — 将曲面挤出到相关体积
geometry CG_Extrude(
geometry geom, float x, float y, float z)
;
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
3D 图像是使用 ST_AsX3D生成的,并使用 X3Dom HTML Javascript 渲染库以 HTML 形式渲染。
SELECT ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30);
![]() 由缓冲点形成的原始八边形 |
CG_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30);
![]() 六边形沿 Z 方向挤压 30 个单位产生多面体表面 Z |
SELECT ST_GeomFromText('LINESTRING(50 50, 100 90, 95 150)')
![]() 原始线串 |
SELECT CG_Extrude( ST_GeomFromText('LINESTRING(50 50, 100 90, 95 150)'),0,0,10));
![]() 沿 Z 方向拉伸的 LineString 会生成 PolyhedralSurfaceZ |
CG_ExtrudeStraightSkeleton — 直线骨架外凸
geometry CG_ExtrudeStraightSkeleton(
geometry geom, float roof_height, float body_height = 0)
;
计算多边形几何图形的最大高度拉伸。
![]() | |
Perhaps the first (historically) use-case of straight skeletons: given a polygonal roof, the straight skeleton directly gives the layout of each tent. If each skeleton edge is lifted from the plane a height equal to its offset distance, the resulting roof is "correct" in that water will always fall down to the contour edges (the roof's border), regardless of where it falls on the roof. The function computes this extrusion aka "roof" on a polygon. If the argument body_height > 0, so the polygon is extruded like with CG_Extrude(polygon, 0, 0, body_height). The result is an union of these polyhedralsurfaces. |
可用性:3.5.0 - 需要 SFCGAL >= 1.5.0。
需要 SFCGAL 版本>= 1.5.0
该方法需要SFCGAL后端。
SELECT ST_AsText(CG_ExtrudeStraightSkeleton('POLYGON (( 0 0, 5 0, 5 5, 4 5, 4 4, 0 4, 0 0 ), (1 1, 1 2,2 2, 2 1, 1 1))', 3.0, 2.0));
POLYHEDRALSURFACE Z (((0 0 0,0 4 0,4 4 0,4 5 0,5 5 0,5 0 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((0 0 0,0 0 2,0 4 2,0 4 0,0 0 0)),((0 4 0,0 4 2,4 4 2,4 4 0,0 4 0)),((4 4 0,4 4 2,4 5 2,4 5 0,4 4 0)),((4 5 0,4 5 2,5 5 2,5 5 0,4 5 0)),((5 5 0,5 5 2,5 0 2,5 0 0,5 5 0)),((5 0 0,5 0 2,0 0 2,0 0 0,5 0 0)),((1 1 0,1 1 2,2 1 2,2 1 0,1 1 0)),((2 1 0,2 1 2,2 2 2,2 2 0,2 1 0)),((2 2 0,2 2 2,1 2 2,1 2 0,2 2 0)),((1 2 0,1 2 2,1 1 2,1 1 0,1 2 0)),((4 5 2,5 5 2,4 4 2,4 5 2)),((2 1 2,5 0 2,0 0 2,2 1 2)),((5 5 2,5 0 2,4 4 2,5 5 2)),((2 1 2,0 0 2,1 1 2,2 1 2)),((1 2 2,1 1 2,0 0 2,1 2 2)),((0 4 2,2 2 2,1 2 2,0 4 2)),((0 4 2,1 2 2,0 0 2,0 4 2)),((4 4 2,5 0 2,2 2 2,4 4 2)),((4 4 2,2 2 2,0 4 2,4 4 2)),((2 2 2,5 0 2,2 1 2,2 2 2)),((0.5 2.5 2.5,0 0 2,0.5 0.5 2.5,0.5 2.5 2.5)),((1 3 3,0 4 2,0.5 2.5 2.5,1 3 3)),((0.5 2.5 2.5,0 4 2,0 0 2,0.5 2.5 2.5)),((2.5 0.5 2.5,5 0 2,3.5 1.5 3.5,2.5 0.5 2.5)),((0 0 2,5 0 2,2.5 0.5 2.5,0 0 2)),((0.5 0.5 2.5,0 0 2,2.5 0.5 2.5,0.5 0.5 2.5)),((4.5 3.5 2.5,5 5 2,4.5 4.5 2.5,4.5 3.5 2.5)),((3.5 2.5 3.5,3.5 1.5 3.5,4.5 3.5 2.5,3.5 2.5 3.5)),((4.5 3.5 2.5,5 0 2,5 5 2,4.5 3.5 2.5)),((3.5 1.5 3.5,5 0 2,4.5 3.5 2.5,3.5 1.5 3.5)),((5 5 2,4 5 2,4.5 4.5 2.5,5 5 2)),((4.5 4.5 2.5,4 4 2,4.5 3.5 2.5,4.5 4.5 2.5)),((4.5 4.5 2.5,4 5 2,4 4 2,4.5 4.5 2.5)),((3 3 3,0 4 2,1 3 3,3 3 3)),((3.5 2.5 3.5,4.5 3.5 2.5,3 3 3,3.5 2.5 3.5)),((3 3 3,4 4 2,0 4 2,3 3 3)),((4.5 3.5 2.5,4 4 2,3 3 3,4.5 3.5 2.5)),((2 1 2,1 1 2,0.5 0.5 2.5,2 1 2)),((2.5 0.5 2.5,2 1 2,0.5 0.5 2.5,2.5 0.5 2.5)),((1 1 2,1 2 2,0.5 2.5 2.5,1 1 2)),((0.5 0.5 2.5,1 1 2,0.5 2.5 2.5,0.5 0.5 2.5)),((1 3 3,2 2 2,3 3 3,1 3 3)),((0.5 2.5 2.5,1 2 2,1 3 3,0.5 2.5 2.5)),((1 3 3,1 2 2,2 2 2,1 3 3)),((2 2 2,2 1 2,2.5 0.5 2.5,2 2 2)),((3.5 2.5 3.5,3 3 3,3.5 1.5 3.5,3.5 2.5 3.5)),((3.5 1.5 3.5,2 2 2,2.5 0.5 2.5,3.5 1.5 3.5)),((3 3 3,2 2 2,3.5 1.5 3.5,3 3 3)))
CG_GreeneApproxConvexPartition — 计算多边形几何图形的近似凸分割
geometry CG_GreeneApproxConvexPartition(
geometry geom)
;
计算多边形几何图形的近似单调凸分割。
![]() | |
多边形 P 的一个划分是指一组多边形,这些多边形的内部不相交,并且这些多边形的并集等于原始多边形 P 的内部。CG_ApproxConvexPartition 和 CG_GreeneApproxConvexPartition 函数生成近似最优的凸分割。这两个函数通过首先将多边形分解为更简单的多边形来生成凸分解;CG_ApproxConvexPartition 使用三角剖分,而 CG_GreeneApproxConvexPartition 使用一个单调分割。这两个函数都保证它们生成的凸片段数不会超过最优数量的四倍,但它们在运行时复杂性上有所不同。尽管基于三角剖分的近似算法通常会产生较少的凸片段,但并非总是如此。 |
可用性:3.5.0 - 需要 SFCGAL >= 1.5.0。
需要 SFCGAL 版本>= 1.5.0
该方法需要SFCGAL后端。
格林近似凸分割(与 CG_YMonotonePartition、CG_ApproxConvexPartition 和 CG_OptimalConvexPartition 相同的示例)
SELECT ST_AsText(CG_GreeneApproxConvexPartition('POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry));
GEOMETRYCOLLECTION(POLYGON((32 159,0 45,41 86,32 159)),POLYGON((45 1,177 2,67 24,45 1)),POLYGON((67 24,109 31,170 60,107 61,67 24)),POLYGON((41 86,45 1,67 24,41 86)),POLYGON((107 61,32 159,41 86,67 24,107 61)),POLYGON((148 120,107 61,170 60,148 120)),POLYGON((148 120,170 60,180 110,156 150,148 120)),POLYGON((156 150,83 181,89 131,148 120,156 150)))
ST_MinkowskiSum — 执行 Minkowski sum
geometry ST_MinkowskiSum(
geometry geom1, geometry geom2)
;
![]() | |
ST_MinkowskiSum is deprecated as of 3.5.0. Use CG_MinkowskiSum instead. |
此函数执行点、线或多边形与多边形的 2D minkowski 和。
两个几何图形 A 和 B 的minkowski和是所有点的集合,这些点是 A 和 B 中任意点的和。minkowski和经常用于运动规划和计算机辅助设计。 有关更多详细信息在维基百科 Minkowski 添加。
第一个参数可以是任何 2D 几何图形(点、线串、多边形)。 如果传递 3D 几何图形,则会通过强制 Z 为 0 将其转换为 2D,从而可能导致无效的情况。 第二个参数必须是二维多边形。
实现利用 CGAL 2D Minkowskisum。
可用性:2.1.0
该方法需要SFCGAL后端。
CG_MinkowskiSum — 执行 Minkowski sum
geometry CG_MinkowskiSum(
geometry geom1, geometry geom2)
;
此函数执行点、线或多边形与多边形的 2D minkowski 和。
两个几何图形 A 和 B 的minkowski和是所有点的集合,这些点是 A 和 B 中任意点的和。minkowski和经常用于运动规划和计算机辅助设计。 有关更多详细信息在维基百科 Minkowski 添加。
第一个参数可以是任何 2D 几何图形(点、线串、多边形)。 如果传递 3D 几何图形,则会通过强制 Z 为 0 将其转换为 2D,从而可能导致无效的情况。 第二个参数必须是二维多边形。
实现利用 CGAL 2D Minkowskisum。
可用性:3.5.0
该方法需要SFCGAL后端。
Minkowski 线串与圆多边形的总和,其中线串穿过圆
![]() 求和前
|
![]() 求和后
|
SELECT CG_MinkowskiSum(line, circle)) FROM (SELECT ST_MakeLine(ST_Point(10, 10),ST_Point(100, 100)) As line, ST_Buffer(ST_GeomFromText('POINT(50 50)'), 30) As circle) As foo; -- wkt -- MULTIPOLYGON(((30 59.9999999999999,30.5764415879031 54.1472903395161,32.2836140246614 48.5194970290472,35.0559116309237 43.3328930094119,38.7867965644036 38.7867965644035,43.332893009412 35.0559116309236,48.5194970290474 32.2836140246614,54.1472903395162 30.5764415879031,60.0000000000001 30,65.8527096604839 30.5764415879031,71.4805029709527 32.2836140246614,76.6671069905881 35.0559116309237,81.2132034355964 38.7867965644036,171.213203435596 128.786796564404,174.944088369076 133.332893009412,177.716385975339 138.519497029047,179.423558412097 144.147290339516,180 150,179.423558412097 155.852709660484,177.716385975339 161.480502970953,174.944088369076 166.667106990588,171.213203435596 171.213203435596,166.667106990588 174.944088369076, 161.480502970953 177.716385975339,155.852709660484 179.423558412097,150 180,144.147290339516 179.423558412097,138.519497029047 177.716385975339,133.332893009412 174.944088369076,128.786796564403 171.213203435596,38.7867965644035 81.2132034355963,35.0559116309236 76.667106990588,32.2836140246614 71.4805029709526,30.5764415879031 65.8527096604838,30 59.9999999999999)))
多边形和多点的 Minkowski 和
![]() 求和前
|
![]() 求和后:复制多边形并转换为点的位置
|
SELECT CG_MinkowskiSum(mp, poly) FROM (SELECT 'MULTIPOINT(25 50,70 25)'::geometry As mp, 'POLYGON((130 150, 20 40, 50 60, 125 100, 130 150))'::geometry As poly ) As foo -- wkt -- MULTIPOLYGON( ((70 115,100 135,175 175,225 225,70 115)), ((120 65,150 85,225 125,275 175,120 65)) )
ST_OptimalAlphaShape — 使用“最佳”alpha 值计算包围几何体的 Alpha 形状。
geometry ST_OptimalAlphaShape(
geometry geom, boolean allow_holes = false, integer nb_components = 1)
;
![]() | |
ST_OptimalAlphaShape is deprecated as of 3.5.0. Use CG_OptimalAlphaShape instead. |
计算几何中点的“最佳”alpha 形状。 alpha 形状是使用所选的 α 值计算的,以便:
多边形元素的数量等于或小于nb_components
(默认为1)
所有输入点都包含在形状中
除非将可选的allow_holes
参数指定为true,否则结果将不包含孔。
可用性:3.3.0 - 需要 SFCGAL >= 1.4.1。
该方法需要SFCGAL后端。
CG_OptimalAlphaShape — 使用“最佳”alpha 值计算包围几何体的 Alpha 形状。
geometry CG_OptimalAlphaShape(
geometry geom, boolean allow_holes = false, integer nb_components = 1)
;
计算几何中点的“最佳”alpha 形状。 alpha 形状是使用所选的 α 值计算的,以便:
多边形元素的数量等于或小于nb_components
(默认为1)
所有输入点都包含在形状中
除非将可选的allow_holes
参数指定为true,否则结果将不包含孔。
Availability: 3.5.0 - requires SFCGAL >= 1.4.1.
该方法需要SFCGAL后端。
Optimal alpha-shape of a MultiPoint (same example as CG_AlphaShape)
SELECT ST_AsText(CG_OptimalAlphaShape('MULTIPOINT((63 84),(76 88),(68 73),(53 18),(91 50),(81 70), (88 29),(24 82),(32 51),(37 23),(27 54),(84 19),(75 87),(44 42),(77 67),(90 30),(36 61),(32 65), (81 47),(88 58),(68 73),(49 95),(81 60),(87 50), (78 16),(79 21),(30 22),(78 43),(26 85),(48 34),(35 35),(36 40),(31 79),(83 29),(27 84),(52 98),(72 95),(85 71), (75 84),(75 77),(81 29),(77 73),(41 42),(83 72),(23 36),(89 53),(27 57),(57 97),(27 77),(39 88),(60 81), (80 72),(54 32),(55 26),(62 22),(70 20),(76 27),(84 35),(87 42),(82 54),(83 64),(69 86),(60 90),(50 86),(43 80),(36 73), (36 68),(40 75),(24 67),(23 60),(26 44),(28 33),(40 32),(43 19),(65 16),(73 16),(38 46),(31 59),(34 86),(45 90),(64 97))'::geometry));
POLYGON((89 53,91 50,87 42,90 30,88 29,84 19,78 16,73 16,65 16,53 18,43 19,37 23,30 22,28 33,23 36, 26 44,27 54,23 60,24 67,27 77,24 82,26 85,34 86,39 88,45 90,49 95,52 98,57 97,64 97,72 95,76 88,75 84,75 77,83 72,85 71,83 64,88 58,89 53))
Optimal alpha-shape of a MultiPoint, allowing holes (same example as CG_AlphaShape)
SELECT ST_AsText(CG_OptimalAlphaShape('MULTIPOINT((63 84),(76 88),(68 73),(53 18),(91 50),(81 70),(88 29),(24 82),(32 51),(37 23),(27 54),(84 19),(75 87),(44 42),(77 67),(90 30),(36 61),(32 65),(81 47),(88 58),(68 73),(49 95),(81 60),(87 50), (78 16),(79 21),(30 22),(78 43),(26 85),(48 34),(35 35),(36 40),(31 79),(83 29),(27 84),(52 98),(72 95),(85 71), (75 84),(75 77),(81 29),(77 73),(41 42),(83 72),(23 36),(89 53),(27 57),(57 97),(27 77),(39 88),(60 81), (80 72),(54 32),(55 26),(62 22),(70 20),(76 27),(84 35),(87 42),(82 54),(83 64),(69 86),(60 90),(50 86),(43 80),(36 73), (36 68),(40 75),(24 67),(23 60),(26 44),(28 33),(40 32),(43 19),(65 16),(73 16),(38 46),(31 59),(34 86),(45 90),(64 97))'::geometry, allow_holes => true));
POLYGON((89 53,91 50,87 42,90 30,88 29,84 19,78 16,73 16,65 16,53 18,43 19,37 23,30 22,28 33,23 36,26 44,27 54,23 60,24 67,27 77,24 82,26 85,34 86,39 88,45 90,49 95,52 98,57 97,64 97,72 95,76 88,75 84,75 77,83 72,85 71,83 64,88 58,89 53),(36 61,36 68,40 75,43 80,50 86,60 81,68 73,77 67,81 60,82 54,81 47,78 43,81 29,76 27,70 20,62 22,55 26,54 32,48 34,44 42,38 46,36 61))
CG_OptimalConvexPartition — 计算多边形几何图形的最优凸分割
geometry CG_OptimalConvexPartition(
geometry geom)
;
计算多边形几何图形的最优凸分割。
![]() | |
多边形 P 的一个划分是指一组多边形,这些多边形的内部不相交,并且这些多边形的并集等于原始多边形 P 的内部。CG_OptimalConvexPartition 生成的划分在片段数量上是最优的。 |
可用性:3.5.0 - 需要 SFCGAL >= 1.5.0。
需要 SFCGAL 版本>= 1.5.0
该方法需要SFCGAL后端。
最优凸分割(与 CG_YMonotonePartition、CG_ApproxConvexPartition 和 CG_GreeneApproxConvexPartition 相同的示例)
SELECT ST_AsText(CG_OptimalConvexPartition('POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry));
GEOMETRYCOLLECTION(POLYGON((156 150,83 181,89 131,148 120,156 150)),POLYGON((32 159,0 45,41 86,32 159)),POLYGON((45 1,177 2,67 24,45 1)),POLYGON((41 86,45 1,67 24,41 86)),POLYGON((107 61,32 159,41 86,67 24,109 31,107 61)),POLYGON((148 120,107 61,109 31,170 60,180 110,148 120)),POLYGON((156 150,148 120,180 110,156 150)))
CG_StraightSkeleton — 从几何体计算直骨架
geometry CG_StraightSkeleton(
geometry geom, boolean use_distance_as_m = false)
;
可用性:3.5.0
Requires SFCGAL >= 1.3.8 for option use_distance_as_m
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_StraightSkeleton(ST_GeomFromText('POLYGON (( 190 190, 10 190, 10 10, 190 10, 190 20, 160 30, 60 30, 60 130, 190 140, 190 190 ))'));
ST_AsText(CG_StraightSkeleton('POLYGON((0 0,1 0,1 1,0 1,0 0))', true);
MULTILINESTRING M ((0 0 0,0.5 0.5 0.5),(1 0 0,0.5 0.5 0.5),(1 1 0,0.5 0.5 0.5),(0 1 0,0.5 0.5 0.5))
![]() 原始多边形 | ![]() 多边形的直骨架 |
ST_StraightSkeleton — 从几何体计算直骨架
geometry ST_StraightSkeleton(
geometry geom)
;
![]() | |
ST_StraightSkeleton is deprecated as of 3.5.0. Use CG_StraightSkeleton instead. |
可用性:2.1.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_StraightSkeleton(ST_GeomFromText('POLYGON (( 190 190, 10 190, 10 10, 190 10, 190 20, 160 30, 60 30, 60 130, 190 140, 190 190 ))'));
![]() 原始多边形 | ![]() 多边形的直骨架 |
ST_Tesselate — 对多边形或多面体表面执行曲面细分,并以 TIN 或 TINS 集合的形式返回
geometry ST_Tesselate(
geometry geom)
;
![]() | |
ST_Tesselate is deprecated as of 3.5.0. Use CG_Tesselate instead. |
将 MULTI(POLYGON) 或 POLYHEDRALSURFACE 等曲面作为输入,并通过使用三角形的细分过程返回 TIN 表示形式。
![]() | |
ST_TriangulatePolygon 与此函数类似,但返回一个多边形的几何集合而不是三角形网,并且仅适用于二维几何。 |
可用性:2.1.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
CG_Tesselate — 对多边形或多面体表面执行曲面细分,并以 TIN 或 TINS 集合的形式返回
geometry CG_Tesselate(
geometry geom)
;
将 MULTI(POLYGON) 或 POLYHEDRALSURFACE 等曲面作为输入,并通过使用三角形的细分过程返回 TIN 表示形式。
![]() | |
ST_TriangulatePolygon 与此函数类似,但返回一个多边形的几何集合而不是三角形网,并且仅适用于二维几何。 |
可用性:3.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT ST_GeomFromText('POLYHEDRALSURFACE Z( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )');
![]() 原始立方体 |
SELECT CG_Tesselate(ST_GeomFromText('POLYHEDRALSURFACE Z( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); ST_AsText 输出: TIN Z (((0 0 0,0 0 1,0 1 1,0 0 0)),((0 1 0,0 0 0,0 1 1,0 1 0)), ((0 0 0,0 1 0,1 1 0,0 0 0)), ((1 0 0,0 0 0,1 1 0,1 0 0)),((0 0 1,1 0 0,1 0 1,0 0 1)), ((0 0 1,0 0 0,1 0 0,0 0 1)), ((1 1 0,1 1 1,1 0 1,1 1 0)),((1 0 0,1 1 0,1 0 1,1 0 0)), ((0 1 0,0 1 1,1 1 1,0 1 0)),((1 1 0,0 1 0,1 1 1,1 1 0)), ((0 1 1,1 0 1,1 1 1,0 1 1)),((0 1 1,0 0 1,1 0 1,0 1 1)))
![]() 带有彩色三角形的细分立方体 |
SELECT 'POLYGON (( 10 190, 10 70, 80 70, 80 130, 50 160, 120 160, 120 190, 10 190 ))'::geometry;
![]() 原始多边形 |
SELECT CG_Tesselate('POLYGON (( 10 190, 10 70, 80 70, 80 130, 50 160, 120 160, 120 190, 10 190 ))'::geometry);
ST_AsText 输出 TIN(((80 130,50 160,80 70,80 130)),((50 160,10 190,10 70,50 160)), ((80 70,50 160,10 70,80 70)),((120 160,120 190,50 160,120 160)), ((120 190,10 190,50 160,120 190))) ![]() 细分多边形 |
CG_Triangulate — Triangulates a polygonal geometry
geometry CG_Triangulate(
geometry geom )
;
Triangulates a polygonal geometry.
Performed by the SFCGAL module
![]() | |
NOTE: this function returns a geometry representing the triangulated result. |
可用性:3.5.0
该方法需要SFCGAL后端。
SELECT CG_Triangulate('POLYGON((0.0 0.0,1.0 0.0,1.0 1.0,0.0 1.0,0.0 0.0),(0.2 0.2,0.2 0.8,0.8 0.8,0.8 0.2,0.2 0.2))'); cg_triangulate ---------------- TIN(((0.8 0.2,0.2 0.2,1 0,0.8 0.2)),((0.2 0.2,0 0,1 0,0.2 0.2)),((1 1,0.8 0.8,0.8 0.2,1 1)),((0 1,0 0,0.2 0.2,0 1)),((0 1,0.2 0.8,1 1,0 1)),((0 1,0.2 0.2,0.2 0.8,0 1)),((0.2 0.8,0.8 0.8,1 1,0.2 0.8)),((0.2 0.8,0.2 0.2,0.8 0.2,0.2 0.8)),((1 1,0.8 0.2,1 0,1 1)),((0.8 0.8,0.2 0.8,0.8 0.2,0.8 0.8))) (1 row)
CG_Visibility — 计算一个从点或多边形几何中的线段生成的可见性多边形
geometry CG_Visibility(
geometry polygon, geometry point)
;
geometry CG_Visibility(
geometry polygon, geometry pointA, geometry pointB)
;
可用性:3.5.0 - 需要 SFCGAL >= 1.5.0。
需要 SFCGAL 版本>= 1.5.0
该方法需要SFCGAL后端。
该函数支持 3d 并且不会丢失 z-index。
该函数支持多面体曲面。
此函数支持三角形和不规则三角网面 (TIN)。
SELECT CG_Visibility('POLYGON((23.5 23.5,23.5 173.5,173.5 173.5,173.5 23.5,23.5 23.5),(108 98,108 36,156 37,155 99,108 98),(107 157.5,107 106.5,135 107.5,133 127.5,143.5 127.5,143.5 108.5,153.5 109.5,151.5 166,107 157.5),(41 95.5,41 35,100.5 36,98.5 68,78.5 68,77.5 96.5,41 95.5),(39 150,40 104,97.5 106.5,95.5 152,39 150))'::geometry, 'POINT(91 87)'::geometry);
SELECT CG_Visibility('POLYGON((23.5 23.5,23.5 173.5,173.5 173.5,173.5 23.5,23.5 23.5),(108 98,108 36,156 37,155 99,108 98),(107 157.5,107 106.5,135 107.5,133 127.5,143.5 127.5,143.5 108.5,153.5 109.5,151.5 166,107 157.5),(41 95.5,41 35,100.5 36,98.5 68,78.5 68,77.5 96.5,41 95.5),(39 150,40 104,97.5 106.5,95.5 152,39 150))'::geometry,'POINT(78.5 68)'::geometry, 'POINT(98.5 68)'::geometry);
![]() 原始多边形 | ![]() 从点的视角来看,可见性 | ![]() 从线段的视角来看,可见性 |
CG_YMonotonePartition — 计算多边形几何的 y 单调分割
geometry CG_YMonotonePartition(
geometry geom)
;
计算多边形几何图形的 y-单调分割。
![]() | |
多边形 P 的一个划分是指一组多边形,这些多边形的内部不相交,并且这些多边形的并集等于原始多边形 P 的内部。一个 y-单调多边形是指其顶点 v1,…,vn 可以划分成两个链 v1,…,vk 和 vk,…,vn,v1,使得任何水平线最多与其中一条链相交一次。该算法不能保证在产生的多边形数量上达到最优数量的界限。 |
可用性:3.5.0 - 需要 SFCGAL >= 1.5.0。
需要 SFCGAL 版本>= 1.5.0
该方法需要SFCGAL后端。
![]() 原始多边形 | ![]() Y-单调分割(与 CG_ApproxConvexPartition、CG_GreeneApproxConvexPartition 和 CG_OptimalConvexPartition 相同的示例) |
SELECT ST_AsText(CG_YMonotonePartition('POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry));
GEOMETRYCOLLECTION(POLYGON((32 159,0 45,41 86,32 159)),POLYGON((107 61,32 159,41 86,45 1,177 2,67 24,109 31,170 60,107 61)),POLYGON((156 150,83 181,89 131,148 120,107 61,170 60,180 110,156 150)))
PostGIS拓扑类型和函数用于管理拓扑对象,例如面、边和节点。
Sandro Santilli在2011年PostGIS Day Paris会议上的演示提供了关于PostGIS拓扑和未来发展方向的很好概述。您可以查看他的幻灯片演示,链接如下:Topology with PostGIS 2.0 slide deck。
Vincent Picavet 在 PostGIS 拓扑 PGConf EU 2012 中对拓扑是什么、如何使用以及支持它的各种 FOSS4G 工具提供了很好的概要和概述。
基于拓扑的 GIS 数据库的一个示例是美国人口普查拓扑集成地理编码和参考系统 (TIGER) 数据库。 如果您想尝试 PostGIS 拓扑并需要一些数据,请查看 Topology_Load_Tiger。
PostGIS 拓扑模块已存在于 PostGIS 的早期版本中,但从未成为官方 PostGIS 文档的一部分。 在 PostGIS 2.0.0 中,正在进行重大清理,以删除其中所有已弃用函数的使用,修复已知的可用性问题,更好地记录特性和函数,添加新函数,并进行增强以更符合 SQL-MM 标准。
该项目的详细信息可以在 PostGIS Topology Wiki 中找到
与该模块关联的所有函数和表都安装在称为拓扑
架构中。
SQL/MM 标准中定义的函数以 ST_ 为前缀,而 PostGIS 特定的函数没有前缀。
从 PostGIS 2.0 开始默认构建拓扑支持,并且可以在构建时指定 --without-topology 配置选项来禁用拓扑支持,如第 2 章 Chapter 2, PostGIS 安装中所述
本节列出了 PostGIS Topology 安装的 PostgreSQL 数据类型。 请注意,我们描述了这些的强制转换行为,这非常重要,尤其是在设计您自己的函数时。
ValidateTopology
的返回类型。getfaceedges_returntype — 由序号和边号组成的复合类型。
由序列号和边号组成的复合类型。 这是 ST_GetFaceEdges
和 GetNodeEdges
函数的返回类型。
sequence
是一个整数:指的是在topology.topology表中定义的拓扑,该表定义了拓扑架构和srid。
edge
是一个整数:边的标识号。
TopoGeometry — 表示拓扑定义的几何图形的复合类型。
一个复合类型,它引用了特定拓扑层中的拓扑几何图形,具有特定的类型和特定的标识符。TopoGeometry 的元素包括属性:topology_id、layer_id、id 整数和 type 整数。
topology_id
是一个整数:指的是在topology.topology 表中定义的拓扑,该表定义了拓扑架构和srid。
layer_id
(整数):拓扑几何所属的图层表中的layer_id。 topology_id 和 layer_id 的组合唯一地引用了拓扑图层表。
id
是一个整数:id 是自动生成的序列号,唯一定义相应拓扑层中的主题几何图形。
type
输入 1 - 4 之间的整数,定义几何类型:1:[多]点、2:[多]线、3:[多]多边形、4:集合
这个部分列出了允许用于这种数据类型的自动转换以及显式转换
转换到 | 行为 |
geometry | automatic |
validatetopology_returntype — 复合类型,由错误消息以及表示错误位置的 id1 和 id2 组成。 这是 ValidateTopology
的返回类型。
由错误消息和两个整数组成的复合类型。ValidateTopology函数返回一组值来表示验证错误,并返回 id1 和 id2 来表示错误中涉及的拓扑对象的 id。
error
为 varchar:表示错误类型。
当前的错误描述符有:重合节点、边交叉节点、边不简单、边结束节点几何形状不匹配、边起始节点几何形状不匹配、面重叠面、面内面,
id1
是一个整数:表示错误的边/面/节点的标识符。
id2
是一个整数:对于涉及 2 个对象的错误,表示次要边缘/或节点
本节列出了 PostGIS Topology 安装的 PostgreSQL 域。 域可以像对象类型一样用作函数或表列的返回对象。 域和类型之间的区别在于,域是绑定了检查约束的现有类型。
TopoElement — 一个由 2 个整数组成的数组,用于表示简单或分层拓扑几何的一个组件。
一个由 2 个整数组成的数组,用于表示简单或分层TopoGeometry的一个组件。
对于简单的 TopoGeometry,数组的第一个元素表示拓扑基元的标识符,第二个元素表示其类型(1:节点、2:边、3:面)。 在分层 TopoGeometry 的情况下,数组的第一个元素表示子 TopoGeometry 的标识符,第二个元素表示其层标识符。
![]() | |
对于任何给定的层次结构 TopoGeometry,所有子 TopoGeometry 元素都将来自同一子层,如所定义的 TopoGeometry 层的 topology.layer 记录中所指定。 |
SELECT te[1] AS id, te[2] AS type FROM ( SELECT ARRAY[1,2]::topology.topoelement AS te ) f; id | type ----+------ 1 | 2
SELECT ARRAY[1,2]::topology.topoelement; te ------- {1,2}
--Example of what happens when you try to case a 3 element array to topoelement -- NOTE: topoement has to be a 2 element array so fails dimension check SELECT ARRAY[1,2,3]::topology.topoelement; ERROR: value for domain topology.topoelement violates check constraint "dimensions"
TopoElementArray — TopoElement 对象的数组。
1 个或多个 TopoElement 对象的数组,通常用于传递 TopoGeometry 对象的组件。
SELECT '{{1,2},{4,3}}'::topology.topoelementarray As tea; tea ------- {{1,2},{4,3}} -- more verbose equivalent -- SELECT ARRAY[ARRAY[1,2], ARRAY[4,3]]::topology.topoelementarray As tea; tea ------- {{1,2},{4,3}} --using the array agg function packaged with topology -- SELECT topology.TopoElementArray_Agg(ARRAY[e,t]) As tea FROM generate_series(1,4) As e CROSS JOIN generate_series(1,3) As t; tea -------------------------------------------------------------------------- {{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3},{4,1},{4,2},{4,3}}
SELECT '{{1,2,4},{3,4,5}}'::topology.topoelementarray As tea; ERROR: value for domain topology.topoelementarray violates check constraint "dimensions"
本节列出了用于构建新拓扑模式、验证拓扑和管理 TopoGeometry 列的拓扑函数
schema_name
中名为 table_name
的表中删除拓扑几何列,并从 topology.layer 表中取消注册这些列。AddTopoGeometryColumn — 将拓扑几何列添加到现有表中,将此新列注册为topology.layer 中的图层并返回新的layer_id。
integer AddTopoGeometryColumn(
varchar topology_name, varchar schema_name, varchar table_name, varchar column_name, varchar feature_type)
;
integer AddTopoGeometryColumn(
varchar topology_name, varchar schema_name, varchar table_name, varchar column_name, varchar feature_type, integer child_layer)
;
每个 TopoGeometry 对象都属于特定拓扑的特定层。 在创建 TopoGeometry 对象之前,您需要创建其 TopologyLayer。 拓扑层是要素表与拓扑的关联。 它还包含类型和层次结构信息。 我们使用 AddTopoGeometryColumn() 函数创建一个图层:
此函数会将请求的列添加到表中,并将包含所有给定信息的记录添加到topology.layer 表中。
如果您不指定 [child_layer](或将其设置为 NULL),该图层将包含基本拓扑几何(由原始拓扑元素组成)。 否则,该层将包含分层的 TopoGeometries(由 child_layer 中的 TopoGeometries 组成)。
创建图层后(其 id 由 AddTopoGeometryColumn 函数返回),您就可以在其中构造 TopoGeometry 对象
有效的 feature_types
为:POINT、MULTIPOINT、LINE、MULTILINE、POLYGON、MULTIPOLYGON、COLLECTION
可用性:1.1
-- Note for this example we created our new table in the ma_topo schema -- though we could have created it in a different schema -- in which case topology_name and schema_name would be different CREATE SCHEMA ma; CREATE TABLE ma.parcels(gid serial, parcel_id varchar(20) PRIMARY KEY, address text); SELECT topology.AddTopoGeometryColumn('ma_topo', 'ma', 'parcels', 'topo', 'POLYGON');
CREATE SCHEMA ri; CREATE TABLE ri.roads(gid serial PRIMARY KEY, road_name text); SELECT topology.AddTopoGeometryColumn('ri_topo', 'ri', 'roads', 'topo', 'LINE');
RenameTopoGeometryColumn — 重命名拓扑几何列
topology.layer RenameTopoGeometryColumn(
regclass layer_table, name feature_column, name new_name)
;
此函数更改现有 TopoGeometry 列的名称,确保有关它的元数据信息相应更新。
可用性:3.4.0
SELECT topology.RenameTopoGeometryColumn('public.parcels', 'topogeom', 'tgeom');
DropTopology — 谨慎使用:删除拓扑模式并从topology.topology 表中删除其引用,并从geometry_columns 表中删除对该模式中表的引用。
integer DropTopology(
varchar topology_schema_name)
;
删除拓扑模式并从topology.topology 表中删除其引用,并从geometry_columns 表中删除对该模式中表的引用。 应谨慎使用此功能,因为它可能会破坏您关心的数据。 如果架构不存在,它只会删除指定架构的引用条目。
可用性:1.1
Cascade 会删除 ma_topo 架构,并删除在topology.topology 和geometry_columns 中对它的所有引用。
SELECT topology.DropTopology('ma_topo');
RenameTopology — 重命名拓扑
varchar RenameTopology(
varchar old_name, varchar new_name)
;
重命名拓扑架构,更新其在topology.topology
表中的元数据记录。
可用性:3.4.0
将拓扑从 topo_stage
重命名为topo_prod
。
SELECT topology.RenameTopology('topo_stage', 'topo_prod');
DropTopoGeometryColumn — 从架构 schema_name
中名为 table_name
的表中删除拓扑几何列,并从 topology.layer 表中取消注册这些列。
text DropTopoGeometryColumn(
varchar schema_name, varchar table_name, varchar column_name)
;
从架构 schema_name
中名为 table_name
的表中删除拓扑几何列,并从 topology.layer 表中取消注册这些列。 返回放置状态的摘要。 注意:它首先将所有值设置为 NULL,然后再删除以绕过引用完整性检查。
可用性:1.1
SELECT topology.DropTopoGeometryColumn('ma_topo', 'parcel_topo', 'topo');
Populate_Topology_Layer — 通过从拓扑表读取元数据,将缺失的条目添加到topology.layer表中。
setof record Populate_Topology_Layer(
)
;
通过检查表上的拓扑约束将缺失的条目添加到topology.layer
表中。 此功能对于在使用拓扑数据恢复模式后修复拓扑目录中的条目非常有用。
它返回创建的条目列表。 返回的列是 schema_name
、table_name
、feature_column
。
可用性:2.3.0
SELECT CreateTopology('strk_topo'); CREATE SCHEMA strk; CREATE TABLE strk.parcels(gid serial, parcel_id varchar(20) PRIMARY KEY, address text); SELECT topology.AddTopoGeometryColumn('strk_topo', 'strk', 'parcels', 'topo', 'POLYGON'); -- this will return no records because this feature is already registered SELECT * FROM topology.Populate_Topology_Layer(); -- let's rebuild TRUNCATE TABLE topology.layer; SELECT * FROM topology.Populate_Topology_Layer(); SELECT topology_id,layer_id, schema_name As sn, table_name As tn, feature_column As fc FROM topology.layer;
schema_name | table_name | feature_column -------------+------------+---------------- strk | parcels | topo (1 row) topology_id | layer_id | sn | tn | fc -------------+----------+------+---------+------ 2 | 2 | strk | parcels | topo (1 row)
TopologySummary — 获取拓扑名称并提供拓扑中对象类型的汇总总数。
text TopologySummary(
varchar topology_schema_name)
;
获取拓扑名称并提供拓扑中对象类型的汇总总数。
可用性: 2.0.0
SELECT topology.topologysummary('city_data'); topologysummary -------------------------------------------------------- Topology city_data (329), SRID 4326, precision: 0 22 nodes, 24 edges, 10 faces, 29 topogeoms in 5 layers Layer 1, type Polygonal (3), 9 topogeoms Deploy: features.land_parcels.feature Layer 2, type Puntal (1), 8 topogeoms Deploy: features.traffic_signs.feature Layer 3, type Lineal (2), 8 topogeoms Deploy: features.city_streets.feature Layer 4, type Polygonal (3), 3 topogeoms Hierarchy level 1, child layer 1 Deploy: features.big_parcels.feature Layer 5, type Puntal (1), 1 topogeoms Hierarchy level 1, child layer 2 Deploy: features.big_signs.feature
ValidateTopology — 返回一组 validatetopology_returntype 对象,详细说明拓扑问题。
setof validatetopology_returntype ValidateTopology(
varchar toponame, geometry bbox)
;
返回一组validatetopology_returntype对象,详细说明拓扑问题,可以选择将检查限制到 bbox
参数指定的区域。
下面显示了可能的错误列表、它们的含义以及返回的 id 代表的内容:
错误 | id1 | id2 | 意义 |
---|---|---|---|
重合节点 | 第一个节点的标识符。 | 第二个节点的标识符。 | 两个节点具有相同的几何形状。 |
边穿过节点 | 边的标识符。 | 节点的标识符。 | 边在其内部有一个节点。 请参阅ST_Relate。 |
无效边 | 边的标识符。 | 无效边几何图形。 请参阅ST_IsValid。 | |
不简单边 | 边的标识符。 | 边几何体具有自相交。 请参阅ST_IsSimple。 | |
边与边交叉 | 第一条边的标识符。 | 第二条边的标识符。 | 两条边有一个内部交叉点。 请参阅ST_Relate。 |
边起始节点几何形状不匹配 | 边的标识符。 | 指示的起始节点的标识符。 | 指示为边的起始节点的节点的几何形状与边几何形状的第一个点不匹配。 请参阅ST_StartPoint。 |
边端节点几何形状不匹配 | 边的标识符。 | 指示的端节点的标识符。 | 指示为边的结束节点的节点的几何形状与边几何形状的最后一个点不匹配。 请参阅ST_EndPoint。 |
无边面 | 孤立面的标识符。 | 没有边报告其两侧存在现有面(left_face、right_face)。 | |
face has no rings(面没有环) | 部分定义的面的标识符。 | 在其侧面报告面的边不形成环。 | |
face has wrong mbr(面的最小边界框错误) | mbr 缓存错误的面的标识符。 | 面的最小边界矩形与报告其侧面的面的边集合的最小边界框不匹配。 | |
hole not in advertised face(孔不在宣传的面内) | 边的签名标识符,标识环。 请参阅GetRingEdges。 | 在其外部报告一个面的边缘环包含在不同的面上。 | |
非隔离节点具有 not- contains_face | 不明确的节点的标识符。 | 被报告为位于一个或多个边界上的节点表示一个包含的面。 | |
孤立节点有 contains_face | 不明确的节点的标识符。 | 一个节点如果没有被报告位于任何边界上,那就缺乏表示包含面的指示。 | |
孤立节点有错误的 contains_face | 错误表述节点的标识符。 | 一个未被报告位于任何边界上的节点指示了一个包含它的面,并且这个面不是实际包含它的面。 请参阅GetFaceContainingPoint。 | |
无效的 next_right_edge | 错误表示的边的标识符。 | 边的有符号 ID,应指示为下一个右边。 | 在沿着一条边的右侧行走时所指示的下一条边是错误的。 |
无效的 next_left_edge | 错误表示的边的标识符。 | 边的有符号 ID,应指示为下一个左边。 | 在沿着一条边的左侧行走时所指示的下一条边是错误的。 |
mixed face labeling in ring(环内混合面标记) | 边的签名标识符,标识环。 请参阅GetRingEdges。 | 环中的边表示了在行走的一侧存在冲突的面。这也被称为 '边界位置冲突'。 | |
非闭合环 | 边的签名标识符,标识环。 请参阅GetRingEdges。 | 由以下 next_left_edge/next_right_edge 属性形成的边环在不同节点上开始和结束。 | |
face has multiple shells(面有多个外壳) | 有争议的面的标识符。 | 边的签名标识符,标识环。 请参阅GetRingEdges。 | 多个环状边界表示了同一个面的内部。 |
可用性:1.0.0
增强:2.0.0 更有效的边缘交叉检测并修复了先前版本中存在的误报。
更改:2.2.0 id1 和 id2 的值被交换为“边缘交叉节点”,以与错误描述一致。
更改:3.2.0 添加了可选的 bbox 参数,执行面标记和边链接检查。
SELECT * FROM topology.ValidateTopology('ma_topo'); error | id1 | id2 -------------------+-----+----- face without edges | 1 |
ValidateTopologyRelation — 返回有关无效拓扑关系记录的信息
setof record ValidateTopologyRelation(
varchar toponame)
;
返回一组记录,提供有关拓扑关系表中无效性的信息。
可用性:3.2.0
FindTopology — 通过不同的方式返回拓扑记录。
topology FindTopology(
TopoGeometry topogeom)
;
topology FindTopology(
regclass layerTable, name layerColumn)
;
topology FindTopology(
name layerSchema, name layerTable, name layerColumn)
;
topology FindTopology(
text topoName)
;
topology FindTopology(
int id)
;
获取拓扑标识符或拓扑相关对象的标识符并返回topology.topology 记录。
可用性:3.2.0
SELECT name(findTopology('features.land_parcels', 'feature')); name ----------- city_data (1 row)
FindLayer — 通过不同的方式返回topology.layer记录。
topology.layer FindLayer(
TopoGeometry tg)
;
topology.layer FindLayer(
regclass layer_table, name feature_column)
;
topology.layer FindLayer(
name schema_name, name table_name, name feature_column)
;
topology.layer FindLayer(
integer topology_id, integer layer_id)
;
获取层标识符或拓扑相关对象的标识符并返回topology.layer 记录。
可用性:3.2.0
SELECT layer_id(findLayer('features.land_parcels', 'feature')); layer_id ---------- 1 (1 row)
本节讨论拓扑构建期间数据库统计信息的管理。
向拓扑添加元素会触发许多数据库查询,以查找将被分割的现有边、添加节点并更新将与新线路连接的边。 因此,有关拓扑表中数据的统计信息是最新的非常有用。
PostGIS 拓扑数据的填充和编辑函数不会自动更新统计信息,因为在每次拓扑更改之后都更新统计信息会显得过于冗余,所以更新统计信息是调用者的责任。
![]() | |
由 autovacuum 更新的统计信息对于在 autovacuum 过程完成之前启动的事务不可见,因此长时间运行的事务将需要自行运行 ANALYZE,以使用更新的统计信息。 |
本节介绍用于创建新拓扑的拓扑函数。
CreateTopology — 创建一个新的拓扑架构并将其注册到topology.topology 表中。
integer CreateTopology(
varchar topology_schema_name)
;
integer CreateTopology(
varchar topology_schema_name, integer srid)
;
integer CreateTopology(
varchar topology_schema_name, integer srid, double precision prec)
;
integer CreateTopology(
varchar topology_schema_name, integer srid, double precision prec, boolean hasz)
;
创建名为topology_name
的新拓扑模式并将其注册到topology.topology
表中。 拓扑必须具有唯一的名称。 拓扑表(edge_data
、face
、node
和relation
)在模式中创建。它返回拓扑的 id。
srid
是拓扑的空间参考系统 SRID。
容差精度
以空间参考系的单位进行测量。 容差默认为 0。
如果未指定,hasz
默认为 false。
这与 SQL/MM ST_InitTopoGeo 类似,但具有更多功能。
可用性:1.1
增强:2.0添加接受hasZ的格式
创建一个名为 ma_topo
的拓扑模式,用于存储马萨诸塞州平面米 (SRID = 26986) 中的边和节点。 由于空间参考系统是基于米的,因此容差表示 0.5 米。
SELECT topology.CreateTopology('ma_topo', 26986, 0.5);
在空间参考系统 State Plane-feet (SRID = 3438) 中为罗德岛创建一个名为 ri_topo
的拓扑
SELECT topology.CreateTopology('ri_topo', 3438) AS topoid; topoid ------ 2
CopyTopology — 将拓扑(节点、边、面、层和拓扑几何)的副本复制到新模式中
integer CopyTopology(
varchar existing_topology_name, varchar new_name)
;
创建名为 new_name
的新拓扑,并使用从 existing_topology_name
复制的 SRID 和精度。existing_topology_name
中的节点、边和面以及层及其关联的 TopoGeometries 都将复制到新拓扑中。
![]() | |
|
可用性: 2.0.0
备份名为 ma_topo
的拓扑。
SELECT topology.CopyTopology('ma_topo', 'ma_topo_backup');
ST_InitTopoGeo — 创建一个新的拓扑架构并将其注册到topology.topology 表中。
text ST_InitTopoGeo(
varchar topology_schema_name)
;
这在 SQL-MM 中相当于CreateTopology。 它缺乏空间参考系统和容差的选项。 它返回拓扑创建的文本描述,而不是拓扑 ID。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM 3 Topo-Geo 和 Topo-Net 3:例程详细信息:X.3.17
SELECT topology.ST_InitTopoGeo('topo_schema_to_create') AS topocreation; astopocreation ------------------------------------------------------------ Topology-Geometry 'topo_schema_to_create' (id:7) created.
ST_CreateTopoGeo — 将几何图形集合添加到给定的空拓扑并返回详细说明成功的消息。
text ST_CreateTopoGeo(
varchar atopology, geometry acollection)
;
将几何图形集合添加到给定的空拓扑并返回详细说明成功的消息。
对于填充空拓扑很有用。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 例程详细信息 -- X.3.18
-- Populate topology -- SELECT topology.ST_CreateTopoGeo('ri_topo', ST_GeomFromText('MULTILINESTRING((384744 236928,384750 236923,384769 236911,384799 236895,384811 236890,384833 236884, 384844 236882,384866 236881,384879 236883,384954 236898,385087 236932,385117 236938, 385167 236938,385203 236941,385224 236946,385233 236950,385241 236956,385254 236971, 385260 236979,385268 236999,385273 237018,385273 237037,385271 237047,385267 237057, 385225 237125,385210 237144,385192 237161,385167 237192,385162 237202,385159 237214, 385159 237227,385162 237241,385166 237256,385196 237324,385209 237345,385234 237375, 385237 237383,385238 237399,385236 237407,385227 237419,385213 237430,385193 237439, 385174 237451,385170 237455,385169 237460,385171 237475,385181 237503,385190 237521, 385200 237533,385206 237538,385213 237541,385221 237542,385235 237540,385242 237541, 385249 237544,385260 237555,385270 237570,385289 237584,385292 237589,385291 237596,385284 237630))',3438) ); st_createtopogeo ---------------------------- Topology ri_topo populated -- create tables and topo geometries -- CREATE TABLE ri.roads(gid serial PRIMARY KEY, road_name text); SELECT topology.AddTopoGeometryColumn('ri_topo', 'ri', 'roads', 'topo', 'LINE');
TopoGeo_AddPoint — 使用容差并可能分割现有边向现有拓扑添加点。
integer TopoGeo_AddPoint(
varchar atopology, geometry apoint, float8 tolerance)
;
向现有拓扑添加一个点并返回其标识符。 给定点将捕捉到给定容差内的现有节点或边。 现有的边可能会被捕捉点分割。
可用性: 2.0.0
TopoGeo_AddLineString — 使用公差并可能分割现有边/面,将线串添加到现有拓扑。 返回边标识符。
SETOF integer TopoGeo_AddLineString(
varchar atopology, geometry aline, float8 tolerance)
;
Adds a linestring to an existing topology and returns a set of edge identifiers forming it up. The given line will snap to existing nodes or edges within given tolerance. Existing edges and faces may be split by the line. New nodes and faces may be added.
![]() | |
更新有关通过此函数加载的拓扑的统计信息由调用者决定,请参阅maintaining statistics during topology editing and population在拓扑编辑和填充期间维护统计信息。 |
可用性: 2.0.0
TopoGeo_AddPolygon — 使用公差并可能分割现有边/面将多边形添加到现有拓扑。 返回面标识符。
SETOF integer TopoGeo_AddPolygon(
varchar atopology, geometry apoly, float8 tolerance)
;
将多边形添加到现有拓扑并返回组成它的一组面标识符。 给定多边形的边界将捕捉到给定容差内的现有节点或边。 现有边和面可能会被新多边形的边界分割。
![]() | |
更新有关通过此函数加载的拓扑的统计信息由调用者决定,请参阅maintaining statistics during topology editing and population在拓扑编辑和填充期间维护统计信息。 |
可用性: 2.0.0
TopoGeo_LoadGeometry — Load a geometry into an existing topology, snapping and splitting as needed.
void TopoGeo_LoadGeometry(
varchar atopology, geometry ageom, float8 tolerance)
;
Loads a geometry into an existing topology. The given geometry will snap to existing nodes or edges within given tolerance. Existing edges and faces may be split as a consequence of the load.
![]() | |
更新有关通过此函数加载的拓扑的统计信息由调用者决定,请参阅maintaining statistics during topology editing and population在拓扑编辑和填充期间维护统计信息。 |
可用性:3.5.0
本节介绍用于添加、移动、删除和分割边、面和节点的拓扑函数。 所有这些函数都是由 ISO SQL/MM 定义的。
alinestring
定义的孤立边添加到连接两个现有孤立节点anode
和anothernode
的拓扑,并返回新边的边id。apoint
几何对象已存在作为一个节点,则会抛出错误。返回移动的描述。ST_AddIsoNode — 将一个孤立的节点添加到拓扑结构中的一个面,并返回新节点的节点ID。如果"face"为空(null),仍然会创建节点。
integer ST_AddIsoNode(
varchar atopology, integer aface, geometry apoint)
;
将具有点位置指定的孤立节点apoint
添加到具有aface
的现有面到拓扑 atopology
拓扑并返回新节点的nodeid。
如果点几何的空间参考系 (srid) 与拓扑不同、 apoint
不是点几何、该点为空或该点与现有边相交(即使在边界处),则例外情况是抛出。 如果该点已作为节点存在,则会引发异常。
如果aface
不为null并且apoint
不在该面内,则抛出异常。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM: Topo-Net 例程: X+1.3.1
ST_AddIsoEdge — 将由几何 alinestring
定义的孤立边添加到连接两个现有孤立节点anode
和anothernode
的拓扑,并返回新边的边id。
integer ST_AddIsoEdge(
varchar atopology, integer anode, integer anothernode, geometry alinestring)
;
将由几何alinestring
定义的孤立边添加到连接两个现有孤立节点anode
和anothernode
的拓扑,并返回新边的边ID。
如果alinestring
几何的空间参考系统 (SRID) 与拓扑不同、不是点几何、点为 NULL 或点与现有边(包括其边界)交互,则会引发异常。 此外,如果该点已作为节点存在,则会引发异常。
如果alinestring
不在anode
和anothernode
所属的面内,那么将抛出一个异常。
如果anode
和anothernode
不是alinestring
的起始点和结束点,则会抛出异常。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo和 Topo-Net 3: 详细例程: X.3.4
ST_AddEdgeNewFaces — 添加新边,如果这样做会分割一个面,请删除原始面并用两个新面替换它。
integer ST_AddEdgeNewFaces(
varchar atopology, integer anode, integer anothernode, geometry acurve)
;
添加新边,如果这样做会分割一个面,请删除原始面并用两个新面替换它。 返回新添加的边的 id。
相应地更新所有现有的连接边和关系。
如果任何参数为null,给定的节点未知(必须已经存在于拓扑模式的node
表中),acurve
不是LINESTRING
,anode
和anothernode
不是acurve
的起始点和终点,则会引发错误。
如果acurve
几何对象的空间参考系统(SRID)与拓扑结构不同,那么将抛出异常。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.12
ST_AddEdgeModFace — 添加新边,如果这样做会分割面,则修改原始面并添加新面。
integer ST_AddEdgeModFace(
varchar atopology, integer anode, integer anothernode, geometry acurve)
;
添加新边,如果这样做会分割面,则修改原始面并添加新面。
![]() | |
如果可能,新面将创建在新边的左侧。 如果左侧的面需要是宇宙面(无界),则这是不可能的。 |
返回新添加的边的 id。
相应地更新所有现有的连接边和关系。
如果任何参数为null,给定的节点未知(必须已经存在于拓扑模式的node
表中),acurve
不是LINESTRING
,anode
和anothernode
不是acurve
的起始点和终点,则会引发错误。
如果acurve
几何对象的空间参考系统(SRID)与拓扑结构不同,那么将抛出异常。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.13
ST_RemEdgeNewFace — 删除一条边,如果删除的边将两个面分开,则删除原始面并用新面替换它们。
integer ST_RemEdgeNewFace(
varchar atopology, integer anedge)
;
删除一条边,如果删除的边将两个面分开,则删除原始面并用新面替换它们。
返回一个新创建的面的ID,或者返回NULL,如果没有创建新的面。当被移除的边是悬挂的、孤立的,或者与宇宙面相连(可能导致宇宙面涌入另一侧的面)时,不会创建新的面。
相应地更新所有现有的连接边和关系。
拒绝移除参与现有TopoGeometry定义的边。如果有任何TopoGeometry只由其中一个面定义而不是另一个面,则拒绝合并这两个面。
如果任何参数为null,给定的边是未知的(必须已经存在于拓扑模式的edge
表中),拓扑名称无效,则会抛出错误。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.14
ST_RemEdgeModFace — 删除一条边,如果该边将两个面分开,则删除一个面并修改另一个面以覆盖两个面的空间。
integer ST_RemEdgeModFace(
varchar atopology, integer anedge)
;
删除一条边,如果删除的边将两个面分开,则删除一个面并修改另一个面以覆盖两个面的空间。 优先将面保持在右侧,以与ST_AddEdgeModFace保持一致。 返回保留的面的 id。
相应地更新所有现有的连接边和关系。
拒绝移除参与现有TopoGeometry定义的边。如果有任何TopoGeometry只由其中一个面定义而不是另一个面,则拒绝合并这两个面。
如果任何参数为null,给定的边是未知的(必须已经存在于拓扑模式的edge
表中),拓扑名称无效,则会抛出错误。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.15
ST_ChangeEdgeGeom — 改变边的形状而不影响拓扑结构。
integer ST_ChangeEdgeGeom(
varchar atopology, integer anedge, geometry acurve)
;
改变边的形状而不影响拓扑结构。
如果任何参数为null,给定的边在拓扑模式的edge
表中不存在,acurve
不是LINESTRING
,或者修改将改变底层拓扑结构,则会抛出错误。
如果acurve
几何对象的空间参考系统(SRID)与拓扑结构不同,那么将抛出异常。
如果新的acurve
不是简单线(simple line),则会抛出错误。
如果将边从旧位置移动到新位置会碰到障碍物,那么会抛出错误。
可用性:1.1.0
增强版 2.0.0 添加了拓扑一致性强制执行功能
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程 X.3.6
SELECT topology.ST_ChangeEdgeGeom('ma_topo', 1, ST_GeomFromText('LINESTRING(227591.9 893900.4,227622.6 893844.3,227641.6 893816.6, 227704.5 893778.5)', 26986) ); ---- Edge 1 changed
ST_ModEdgeSplit — 通过沿现有边创建新节点、修改原始边并添加新边来分割边。
integer ST_ModEdgeSplit(
varchar atopology, integer anedge, geometry apoint)
;
通过沿现有边创建新节点、修改原始边并添加新边来分割边。 相应地更新所有现有的连接边和关系。 返回新添加的节点的标识符。
可用性:1.1
更改:2.0 - 在之前的版本中,它被错误命名为 ST_ModEdgesSplit
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.9
-- Add an edge -- SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227592 893910, 227600 893910)', 26986) ) As edgeid; -- edgeid- 3 -- Split the edge -- SELECT topology.ST_ModEdgeSplit('ma_topo', 3, ST_SetSRID(ST_Point(227594,893910),26986) ) As node_id; node_id ------------------------- 7
ST_ModEdgeHeal — 通过删除连接两条边的节点、修改第一条边并删除第二条边来修复两条边。 返回已删除节点的 id。
int ST_ModEdgeHeal(
varchar atopology, integer anedge, integer anotheredge)
;
通过删除连接两条边的节点、修改第一条边并删除第二条边来修复两条边。 返回已删除节点的 id。 相应地更新所有现有的连接边和关系。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.9
ST_NewEdgeHeal — 通过删除连接两条边的节点、删除两条边并用方向与提供的第一条边相同的边替换它们来修复两条边。
int ST_NewEdgeHeal(
varchar atopology, integer anedge, integer anotheredge)
;
通过删除连接两条边的节点、删除两条边并用方向与提供的第一条边相同的边替换它们来修复两条边。 返回替换已修复边的新边的 ID。 相应地更新所有现有的连接边和关系。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo 和 Topo-Net 3: 详细例程: X.3.9
ST_MoveIsoNode — 在拓扑结构中将一个孤立节点从一个点移动到另一个点。如果新的apoint
几何对象已存在作为一个节点,则会抛出错误。返回移动的描述。
text ST_MoveIsoNode(
varchar atopology, integer anode, geometry apoint)
;
将拓扑中的孤立节点从一点移动到另一点。 如果新的apoint
几何图形作为节点存在,则会抛出错误。
如果任何参数为null,apoint
不是一个点,现有节点不是孤立的(是现有边的起点或终点),新节点位置与现有边相交(即使在端点处也相交),或新位置在不同的面(自3.2.0版本起),则会抛出异常。
如果点几何的空间参考系统 (srid) 与拓扑不同,则会引发异常。
可用性: 2.0.0
增强:3.2.0 确保节点不能移动到不同的面
该方法实现了SQL/MM规范。 SQL-MM: Topo-Net 例程: X.3.2
-- Add an isolated node with no face -- SELECT topology.ST_AddIsoNode('ma_topo', NULL, ST_GeomFromText('POINT(227579 893916)', 26986) ) As nodeid; nodeid -------- 7 -- Move the new node -- SELECT topology.ST_MoveIsoNode('ma_topo', 7, ST_GeomFromText('POINT(227579.5 893916.5)', 26986) ) As descrip; descrip ---------------------------------------------------- Isolated Node 7 moved to location 227579.5,893916.5
ST_NewEdgesSplit — 通过沿现有边创建新节点、删除原始边并用两条新边替换它来分割边。 返回创建的连接新边的新节点的 id。
integer ST_NewEdgesSplit(
varchar atopology, integer anedge, geometry apoint)
;
通过在当前边上创建一个具有点位置apoint
的新节点,删除原始边并用两个新边替换它,来分割具有边IDanedge
的边。返回连接新边的新节点的ID。相应地更新所有已连接的边和关系。
如果点几何对象的空间参考系统(SRID)与拓扑结构不同,apoint
不是点几何对象,点为null,点已经存在作为一个节点,边与现有边不对应,或者点不在边上,则会抛出异常。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM: Topo-Net 例程: X.3.8
-- Add an edge -- SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227575 893917,227592 893900)', 26986) ) As edgeid; -- result- edgeid ------ 2 -- Split the new edge -- SELECT topology.ST_NewEdgesSplit('ma_topo', 2, ST_GeomFromText('POINT(227578.5 893913.5)', 26986) ) As newnodeid; newnodeid --------- 6
ST_RemoveIsoNode — 删除孤立节点并返回操作描述。 如果节点不是孤立的(是边的开始或结束),则会引发异常。
text ST_RemoveIsoNode(
varchar atopology, integer anode)
;
移除一个孤立节点并返回操作的描述。如果节点不是孤立的(是边的起点或终点),则会抛出异常。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo和 Topo-Net 3: 详细例程: X+1.3.3
-- Remove an isolated node with no face -- SELECT topology.ST_RemoveIsoNode('ma_topo', 7 ) As result; result ------------------------- Isolated node 7 removed
ST_RemoveIsoEdge — 删除孤立的边并返回操作的描述。 如果边缘未被隔离,则会引发异常。
text ST_RemoveIsoEdge(
varchar atopology, integer anedge)
;
移除一个孤立的边并返回操作的描述。如果边不是孤立的,将抛出异常。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM: Topo-Geo和 Topo-Net 3: 详细例程: X+1.3.3
-- Remove an isolated node with no face -- SELECT topology.ST_RemoveIsoNode('ma_topo', 7 ) As result; result ------------------------- Isolated node 7 removed
aface
。GetEdgeByPoint — 查找与给定点相交的边的边 ID。
integer GetEdgeByPoint(
varchar atopology, geometry apoint, float8 tol1)
;
检索与 Point 相交的边的 id。
给定拓扑、POINT 和容差,该函数返回一个整数 (id-edge)。 如果容差 = 0,则该点必须与边相交。
如果apoint
与边不相交,返回0。
如果使用的容差(tolerance)大于0,并且在某点附近存在多条边,则会引发异常。
![]() | |
如果tolerance = 0,则该函数使用 ST_Intersects,否则使用 ST_DWithin。 |
这个函数是由 GEOS 模块执行的。
可用性: 2.0.0
这些示例使用我们在 AddEdge中创建的边
SELECT topology.GetEdgeByPoint('ma_topo',geom, 1) As with1mtol, topology.GetEdgeByPoint('ma_topo',geom,0) As withnotol FROM ST_GeomFromEWKT('SRID=26986;POINT(227622.6 893843)') As geom; with1mtol | withnotol -----------+----------- 2 | 0
SELECT topology.GetEdgeByPoint('ma_topo',geom, 1) As nearnode FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom; -- get error -- ERROR: Two or more edges found
GetFaceByPoint — 查找与给定点相交的面。
integer GetFaceByPoint(
varchar atopology, geometry apoint, float8 tol1)
;
查找由点引用且具有给定容差的面。
该函数将有效地查找与以该点为中心、以公差为半径的圆相交的面。
如果没有面与给定查询位置相交,则返回 0(通用面)。
如果多个面与查询位置相交,则会引发异常。
可用性: 2.0.0
增强:3.2.0 更高效的实施和更清晰的契约,停止使用无效的拓扑。
SELECT topology.GetFaceByPoint('ma_topo',geom, 10) As with1mtol, topology.GetFaceByPoint('ma_topo',geom,0) As withnotol FROM ST_GeomFromEWKT('POINT(234604.6 899382.0)') As geom; with1mtol | withnotol -----------+----------- 1 | 0
SELECT topology.GetFaceByPoint('ma_topo',geom, 1) As nearnode FROM ST_GeomFromEWKT('POINT(227591.9 893900.4)') As geom; -- get error -- ERROR: Two or more faces found
GetFaceContainingPoint — 查找包含点的面。
integer GetFaceContainingPoint(
text atopology, geometry apoint)
;
返回包含点的面的 id。
如果点落在面边界上,则会引发异常。
![]() | |
该函数依赖于有效的拓扑,使用边链接和面标记。 |
可用性:3.2.0
GetNodeByPoint — 查找某个点位置处节点的节点 ID。
integer GetNodeByPoint(
varchar atopology, geometry apoint, float8 tol1)
;
检索某个点位置处的节点 id。
给定拓扑( topology)、POINT 和容差(tolerance),该函数返回一个整数(id-node)。 如果公差 = 0 表示精确交集,否则从区间中检索节点。
如果apoint
不与节点相交,则返回 0(零)。
如果设置容差(tolerance)大于0,并且在某点附近存在多个节点(node),那么可能会引发异常。
![]() | |
如果tolerance = 0,则该函数使用 ST_Intersects,否则使用 ST_DWithin。 |
这个函数是由 GEOS 模块执行的。
可用性: 2.0.0
这些示例使用我们在 AddEdge中创建的边
SELECT topology.GetNodeByPoint('ma_topo',geom, 1) As nearnode FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom; nearnode ---------- 2
SELECT topology.GetNodeByPoint('ma_topo',geom, 1000) As too_much_tolerance FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom; ----get error-- ERROR: Two or more nodes found
GetTopologyID — 返回topology.topology表中给定拓扑名称的拓扑的id。
integer GetTopologyID(
varchar toponame)
;
返回topology.topology表中给定拓扑名称的拓扑的id。
可用性:1.1
SELECT topology.GetTopologyID('ma_topo') As topo_id; topo_id --------- 1
GetTopologySRID — 返回拓扑表中给定拓扑名称的拓扑的 SRID。
integer GetTopologyID(
varchar toponame)
;
在给定拓扑名称的情况下,返回topology.topology 表中拓扑的空间参考ID。
可用性: 2.0.0
SELECT topology.GetTopologySRID('ma_topo') As SRID; SRID ------- 4326
GetTopologyName — 返回给定拓扑 ID 的拓扑(架构)名称。
varchar GetTopologyName(
integer topology_id)
;
在给定拓扑的拓扑 ID 的情况下,从 topology.topology 表中返回拓扑的拓扑名称(架构)。
可用性:1.1
SELECT topology.GetTopologyName(1) As topo_name; topo_name ----------- ma_topo
ST_GetFaceEdges — 返回一组有序的边,这些边界绑定了aface
。
getfaceedges_returntype ST_GetFaceEdges(
varchar atopology, integer aface)
;
返回一组有序的边,这些边界绑定了aface
。每个输出包括一个序列号和边ID。序列号从1开始。
每个环边的枚举从具有最小标识符的边开始。 边的顺序遵循左手定则(合界面位于每个有向边的左侧)。
可用性:2.0
该方法实现了SQL/MM规范。 SQL-MM 3 Topo-Geo 和 Topo-Net 3: 详细例程: X.3.5
-- Returns the edges bounding face 1 SELECT (topology.ST_GetFaceEdges('tt', 1)).*; -- result -- sequence | edge ----------+------ 1 | -4 2 | 5 3 | 7 4 | -6 5 | 1 6 | 2 7 | 3 (7 rows)
-- Returns the sequence, edge id -- and geometry of the edges that bound face 1 -- If you just need geom and seq, can use ST_GetFaceGeometry SELECT t.seq, t.edge, geom FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge) INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;
ST_GetFaceGeometry — 返回给定拓扑中具有指定面 ID 的多边形。
geometry ST_GetFaceGeometry(
varchar atopology, integer aface)
;
返回给定拓扑中具有指定面 ID 的多边形。 从构成面的边构建多边形。
可用性:1.1
该方法实现了SQL/MM规范。 SQL-MM 3 Topo-Geo 和 Topo-Net 3: 详细例程: X.3.16
-- Returns the wkt of the polygon added with AddFace SELECT ST_AsText(topology.ST_GetFaceGeometry('ma_topo', 1)) As facegeomwkt; -- result -- facegeomwkt -------------------------------------------------------------------------------- POLYGON((234776.9 899563.7,234896.5 899456.7,234914 899436.4,234946.6 899356.9, 234872.5 899328.7,234891 899285.4,234992.5 899145,234890.6 899069, 234755.2 899255.4,234612.7 899379.4,234776.9 899563.7))
GetRingEdges — 返回按顺序排列的边标识符集合,这些标识符是通过沿给定边的一侧行走时遇到的。
getfaceedges_returntype GetRingEdges(
varchar atopology, integer aring, integer max_edges=null)
;
返回在给定边上行走时遇到的有符号边标识符的有序集合。 每个输出由一个序列和一个带符号的边 id 组成。 序列号从值 1 开始。
如果传递正边缘 id,则行走从相应边缘的左侧开始,并遵循边缘方向。 如果您传递负边缘 ID,则行走从其右侧开始并向后走。
如果 max_edges
不为 null,则该函数返回的记录数不超过这些记录。 在处理可能无效的拓扑时,这是一个安全参数。
![]() | |
该函数使用边环链接元数据。 |
可用性: 2.0.0
GetNodeEdges — 返回与给定节点相关的一组有序边。
getfaceedges_returntype GetNodeEdges(
varchar atopology, integer anode)
;
返回与给定节点相关的一组有序边。 每个输出由一个序列和一个带符号的边 id 组成。 序列号从值 1 开始。上升沿从给定节点开始。 负边沿结束于给定节点。 封闭的边将出现两次(都有两个标志)。 顺序是从北行开始顺时针方向。
![]() | |
该函数计算排序而不是从元数据导出,因此可用于构建边环链接。 |
可用性:2.0
本节介绍以非标准方式处理拓扑的函数。
Polygonize — 查找并注册由拓扑边定义的所有面。
text Polygonize(
varchar toponame)
;
注册可以构建拓扑边基元的所有面。
假设目标拓扑不包含自相交边。
![]() | |
已经识别出已知的面,因此在同一拓扑上多次调用 Polygonize 是安全的。 |
![]() | |
该函数不使用也不设置边表的 next_left_edge 和 next_right_edge 字段。 |
可用性: 2.0.0
AddNode — 将点节点添加到指定拓扑模式的节点表中,并返回新节点的nodeid。 如果点已经作为节点存在,则返回现有的nodeid。
integer AddNode(
varchar toponame, geometry apoint, boolean allowEdgeSplitting=false, boolean computeContainingFace=false)
;
将点节点添加到指定拓扑方案的节点表中。 AddEdge函数在调用时会自动添加边的起点和终点,因此无需显式添加边的节点。
如果发现任何穿过节点的边,则会引发异常或分割边,具体取决于 allowedEdgeSplitting
参数值。
如果computeContainingFace
为真,新添加的节点将计算出正确的包含面。
![]() | |
如果 |
可用性: 2.0.0
SELECT topology.AddNode('ma_topo', ST_GeomFromText('POINT(227641.6 893816.5)', 26986) ) As nodeid; -- result -- nodeid -------- 4
AddEdge — 使用指定的线串几何将线串边添加到边表,并将关联的起点和终点添加到指定拓扑方案的点节点表,并返回新(或现有)边的edgeid。
integer AddEdge(
varchar toponame, geometry aline)
;
使用指定的线串几何图形将边添加到边表,并将关联节点添加到指定toponame
模式的节点表,并返回新记录或现有记录的edgeid。 新添加的边两侧都有“宇宙”面,并与其自身相连。
![]() | |
如果 |
![]() | |
|
这个函数是由 GEOS 模块执行的。
![]() | |
AddEdge is deprecated as of 3.5.0. Use TopoGeo_AddLineString instead. |
可用性: 2.0.0
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227575.8 893917.2,227591.9 893900.4)', 26986) ) As edgeid; -- result- edgeid -------- 1 SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227591.9 893900.4,227622.6 893844.2,227641.6 893816.5, 227704.5 893778.5)', 26986) ) As edgeid; -- result -- edgeid -------- 2 SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227591.2 893900, 227591.9 893900.4, 227704.5 893778.5)', 26986) ) As edgeid; -- gives error -- ERROR: Edge intersects (not on endpoints) with existing edge 1
AddFace — 将面基元注册到拓扑并获取其标识符。
integer AddFace(
varchar toponame, geometry apolygon, boolean force_new=false)
;
将面基元注册到拓扑并获取其标识符。
对于新添加的面,形成其边界的边以及面中包含的边将更新为在 left_face 和 right_face 字段中具有正确的值。 面中包含的孤立节点也将更新为具有正确的 contains_face 字段值。
![]() | |
该函数不使用也不设置边表的 next_left_edge 和 next_right_edge 字段。 |
假定目标拓扑有效(不包含自相交边)。 如果出现以下情况,则会引发异常: 多边形边界未完全由现有边定义,或者多边形与现有面重叠。
如果多边形
几何体已经作为面存在,则: 如果force_new
为假(默认),则返回现有面的面id; 如果force_new
为true,新的id将被分配给新产生的面。
![]() | |
对现有面执行新配准(force_new=true)时,不会采取任何措施来解决边、节点和关系表中对现有面的悬挂引用,也不会更新现有面记录的MBR字段。这由调用者自行处理。 |
![]() | |
|
可用性: 2.0.0
-- first add the edges we use generate_series as an iterator (the below -- will only work for polygons with < 10000 points because of our max in gs) SELECT topology.AddEdge('ma_topo', ST_MakeLine(ST_PointN(geom,i), ST_PointN(geom, i + 1) )) As edgeid FROM (SELECT ST_NPoints(geom) AS npt, geom FROM (SELECT ST_Boundary(ST_GeomFromText('POLYGON((234896.5 899456.7,234914 899436.4,234946.6 899356.9,234872.5 899328.7, 234891 899285.4,234992.5 899145, 234890.6 899069,234755.2 899255.4, 234612.7 899379.4,234776.9 899563.7,234896.5 899456.7))', 26986) ) As geom ) As geoms) As facen CROSS JOIN generate_series(1,10000) As i WHERE i < npt; -- result -- edgeid -------- 3 4 5 6 7 8 9 10 11 12 (10 rows) -- then add the face - SELECT topology.AddFace('ma_topo', ST_GeomFromText('POLYGON((234896.5 899456.7,234914 899436.4,234946.6 899356.9,234872.5 899328.7, 234891 899285.4,234992.5 899145, 234890.6 899069,234755.2 899255.4, 234612.7 899379.4,234776.9 899563.7,234896.5 899456.7))', 26986) ) As faceid; -- result -- faceid -------- 1
ST_Simplify — 使用 Douglas-Peucker 算法返回给定 TopoGeometry 的“简化”几何版本。
geometry ST_Simplify(
TopoGeometry tg, float8 tolerance)
;
在每个组件边上使用 Douglas-Peucker 算法返回给定 TopoGeometry 的“简化”几何版本。
![]() | |
返回的几何图形可能不简单或无效。 拆分组件边缘可能有助于保持简单性/有效性。 |
这个函数是由 GEOS 模块执行的。
可用性:2.1.0
RemoveUnusedPrimitives — 删除定义现有 TopoGeometry 对象不需要的拓扑基元。
int RemoveUnusedPrimitives(
text topology_name, geometry bbox)
;
查找表示现有 TopoGeometry 对象并不严格需要的所有图元(节点、边、面)并将其删除,从而保持拓扑有效性(边链接、面标记)和 TopoGeometry 空间占用。
不会创建新的图元标识符,而是扩展现有图元以包括合并的面(在删除边时)或修复的边(在删除节点时)。
可用性: 3.3.0
本节介绍用于创建新拓扑几何的拓扑函数。
topoelementarray
。CreateTopoGeom — 从拓扑元素数组创建一个新的拓扑几何对象 - tg_type: 1:[多]点, 2:[多]线, 3:[多]多边形, 4:集合
topogeometry CreateTopoGeom(
varchar toponame, integer tg_type, integer layer_id, topoelementarray tg_objs)
;
topogeometry CreateTopoGeom(
varchar toponame, integer tg_type, integer layer_id)
;
为由layer_id
表示的图层创建一个拓扑几何对象,并将其注册到拓扑名称
架构的关系表中。
tg_type
是一个整数:1:[多]点(点)、2:[多]线(线性)、3:[多]多边形(面)、4:集合。 layer_id
是topology.layer 表中的层id。
点状层由一组节点形成,线性层由一组边形成,区域层由一组面形成,集合可以由节点、边和面的混合形成。
省略组件数组会生成一个空的 TopoGeometry 对象。
可用性:1.1
在"ri_topo"模式中为"layer 2"(我们的"ri_roads")创建一个拓扑几何对象,类型为(2) LINE,用于第一条边(我们在ST_CreateTopoGeo
中加载的边)。
INSERT INTO ri.ri_roads(road_name, topo) VALUES('Unknown', topology.CreateTopoGeom('ri_topo',2,2,'{{1,2}}'::topology.topoelementarray);
假设我们有应该由面的集合形成的几何形状。 例如,我们有块组表,并且想知道每个块组的拓扑几何形状。 如果我们的数据完全一致,我们可以这样做:
-- create our topo geometry column -- SELECT topology.AddTopoGeometryColumn( 'topo_boston', 'boston', 'blockgroups', 'topo', 'POLYGON'); -- addtopgeometrycolumn -- 1 -- update our column assuming -- everything is perfectly aligned with our edges UPDATE boston.blockgroups AS bg SET topo = topology.CreateTopoGeom('topo_boston' ,3,1 , foo.bfaces) FROM (SELECT b.gid, topology.TopoElementArray_Agg(ARRAY[f.face_id,3]) As bfaces FROM boston.blockgroups As b INNER JOIN topo_boston.face As f ON b.geom && f.mbr WHERE ST_Covers(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id)) GROUP BY b.gid) As foo WHERE foo.gid = bg.gid;
--the world is rarely perfect allow for some error --count the face if 50% of it falls -- within what we think is our blockgroup boundary UPDATE boston.blockgroups AS bg SET topo = topology.CreateTopoGeom('topo_boston' ,3,1 , foo.bfaces) FROM (SELECT b.gid, topology.TopoElementArray_Agg(ARRAY[f.face_id,3]) As bfaces FROM boston.blockgroups As b INNER JOIN topo_boston.face As f ON b.geom && f.mbr WHERE ST_Covers(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id)) OR ( ST_Intersects(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id)) AND ST_Area(ST_Intersection(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id) ) ) > ST_Area(topology.ST_GetFaceGeometry('topo_boston', f.face_id))*0.5 ) GROUP BY b.gid) As foo WHERE foo.gid = bg.gid; -- and if we wanted to convert our topogeometry back -- to a denormalized geometry aligned with our faces and edges -- cast the topo to a geometry -- The really cool thing is my new geometries -- are now aligned with my tiger street centerlines UPDATE boston.blockgroups SET new_geom = topo::geometry;
toTopoGeom — 将简单几何图形转换为拓扑几何图形。
topogeometry toTopoGeom(
geometry geom, varchar toponame, integer layer_id, float8 tolerance)
;
topogeometry toTopoGeom(
geometry geom, topogeometry topogeom, float8 tolerance)
;
将简单的几何图形转换为拓扑几何图形TopoGeometry。
表示输入几何所需的拓扑基元将被添加到底层拓扑中,可能会拆分现有拓扑,并且它们将与关系
表中的输出 TopoGeometry 相关联。
现有的 TopoGeometry 对象(拓扑几何
可能除外,如果给定的话)将保留其形状。
当给出公差
时,它将用于将输入几何体捕捉到现有图元。
在第一种形式中,将为给定拓扑 (toponame
) 的给定图层 (layer_id
) 创建新的 TopoGeometry。
在第二种形式中,转换产生的图元将被添加到预先存在的 TopoGeometry (topogeom
) 中,可能会为其最终形状添加空间。 要让新形状完全取代旧形状,请参阅clearTopoGeom。
可用性:2.0
增强:2.1.0添加了采用现有TopoGeometry的版本。
这是一个完整的独立工作流程
-- do this if you don't have a topology setup already -- creates topology not allowing any tolerance SELECT topology.CreateTopology('topo_boston_test', 2249); -- create a new table CREATE TABLE nei_topo(gid serial primary key, nei varchar(30)); --add a topogeometry column to it SELECT topology.AddTopoGeometryColumn('topo_boston_test', 'public', 'nei_topo', 'topo', 'MULTIPOLYGON') As new_layer_id; new_layer_id ----------- 1 --use new layer id in populating the new topogeometry column -- we add the topogeoms to the new layer with 0 tolerance INSERT INTO nei_topo(nei, topo) SELECT nei, topology.toTopoGeom(geom, 'topo_boston_test', 1) FROM neighborhoods WHERE gid BETWEEN 1 and 15; --use to verify what has happened -- SELECT * FROM topology.TopologySummary('topo_boston_test'); -- summary-- Topology topo_boston_test (5), SRID 2249, precision 0 61 nodes, 87 edges, 35 faces, 15 topogeoms in 1 layers Layer 1, type Polygonal (3), 15 topogeoms Deploy: public.nei_topo.topo
-- Shrink all TopoGeometry polygons by 10 meters UPDATE nei_topo SET topo = ST_Buffer(clearTopoGeom(topo), -10); -- Get the no-one-lands left by the above operation -- I think GRASS calls this "polygon0 layer" SELECT ST_GetFaceGeometry('topo_boston_test', f.face_id) FROM topo_boston_test.face f WHERE f.face_id > 0 -- don't consider the universe face AND NOT EXISTS ( -- check that no TopoGeometry references the face SELECT * FROM topo_boston_test.relation WHERE layer_id = 1 AND element_id = f.face_id );
TopoElementArray_Agg — 返回一组 element_id、类型数组 (topoelements) 的 topoelementarray
。
topoelementarray TopoElementArray_Agg(
topoelement set tefield)
;
SELECT topology.TopoElementArray_Agg(ARRAY[e,t]) As tea FROM generate_series(1,3) As e CROSS JOIN generate_series(1,4) As t; tea -------------------------------------------------------------------------- {{1,1},{1,2},{1,3},{1,4},{2,1},{2,2},{2,3},{2,4},{3,1},{3,2},{3,3},{3,4}}
TopoElement — 将拓扑几何转换为拓扑元素。
topoelement TopoElement(
topogeometry topo)
;
这是一个完整的独立工作流程
-- do this if you don't have a topology setup already -- Creates topology not allowing any tolerance SELECT TopoElement(topo) FROM neighborhoods;
-- using as cast SELECT topology.TopoElementArray_Agg(topo::topoelement) FROM neighborhoods GROUP BY city;
本节介绍用于编辑现有拓扑几何的拓扑函数。
clearTopoGeom — 清除拓扑几何的内容。
topogeometry clearTopoGeom(
topogeometry topogeom)
;
-- Shrink all TopoGeometry polygons by 10 meters UPDATE nei_topo SET topo = ST_Buffer(clearTopoGeom(topo), -10);
TopoGeom_addElement — 将元素添加到 TopoGeometry 的定义中。
topogeometry TopoGeom_addElement(
topogeometry tg, topoelement el)
;
-- Add edge 5 to TopoGeometry tg UPDATE mylayer SET tg = TopoGeom_addElement(tg, '{5,2}');
TopoGeom_remElement — 从 TopoGeometry 的定义中删除元素。
topogeometry TopoGeom_remElement(
topogeometry tg, topoelement el)
;
-- Remove face 43 from TopoGeometry tg UPDATE mylayer SET tg = TopoGeom_remElement(tg, '{43,3}');
TopoGeom_addTopoGeom — 将一个 TopoGeometry 的元素添加到另一个 TopoGeometry 的定义中。
topogeometry TopoGeom_addTopoGeom(
topogeometry tgt, topogeometry src)
;
将一个TopoGeometry 的元素添加到另一个 TopoGeometry 的定义中,如果需要保存源对象中的所有元素,可能会将其缓存类型(类型属性)更改为集合。
两个 TopoGeometry 对象需要针对“相同”拓扑进行定义,并且如果按层次结构定义,则需要由同一子层的元素组成。
可用性:3.2
-- Set an "overall" TopoGeometry value to be composed by all -- elements of specific TopoGeometry values UPDATE mylayer SET tg_overall = TopoGeom_addTopogeom( TopoGeom_addTopoGeom( clearTopoGeom(tg_overall), tg_specific1 ), tg_specific2 );
topoelementarray
(包含拓扑元素的数组),其中包含给定TopoGeometry的拓扑元素和类型(原始元素)。 topoelement
对象,其中包含给定 TopoGeometry(原始元素)的拓扑 element_id、element_type。GetTopoGeomElementArray — 返回一个topoelementarray
(包含拓扑元素的数组),其中包含给定TopoGeometry的拓扑元素和类型(原始元素)。
topoelementarray GetTopoGeomElementArray(
varchar toponame, integer layer_id, integer tg_id)
;
topoelementarray GetTopoGeomElementArray(
topogeometry tg)
;
返回一个TopoElementArray,其中包含给定 TopoGeometry(原始元素)的拓扑元素和类型。 这与 GetTopoGeomElements 类似,只不过它将元素作为数组而不是数据集返回。
tg_id 是topology.layer 表中layer_id
表示的图层中拓扑中的拓扑几何对象的拓扑几何ID。
可用性:1.1
GetTopoGeomElements — 返回一组 topoelement
对象,其中包含给定 TopoGeometry(原始元素)的拓扑 element_id、element_type。
setof topoelement GetTopoGeomElements(
varchar toponame, integer layer_id, integer tg_id)
;
setof topoelement GetTopoGeomElements(
topogeometry tg)
;
返回一组与基本拓扑元素TopoElement(1:节点,2:边,3:面)对应的element_id、element_type(topoelements),这些元素组成了toponame
模式中的给定拓扑几何对象。
tg_id 是topology.layer 表中layer_id
表示的图层中拓扑中的拓扑几何对象的拓扑几何ID。
可用性: 2.0.0
ST_SRID — 返回拓扑几何的空间参考标识符。
integer ST_SRID(
topogeometry tg)
;
返回ST_Geometry spatial_ref_sys表中定义的空间参考系统标识号。 请参见 Section 4.5, “空间参考系统”
![]() | |
spatial_ref_sys表对 PostGIS 已知的所有参考系进行编目,并用于从一个空间参考系转换为另一个空间参考系。 如果计划转换几何,请务必确保具有正确的空间参考系统标识号。 |
可用性:3.2.0
该方法实现了SQL/MM规范。 SQL-MM 3: 14.1.5
SELECT ST_SRID(ST_GeomFromText('POINT(-71.1043 42.315)',4326)); --result 4326
AsGML — 返回拓扑几何的 GML 表示形式。
text AsGML(
topogeometry tg)
;
text AsGML(
topogeometry tg, text nsprefix_in)
;
text AsGML(
topogeometry tg, regclass visitedTable)
;
text AsGML(
topogeometry tg, regclass visitedTable, text nsprefix)
;
text AsGML(
topogeometry tg, text nsprefix_in, integer precision, integer options)
;
text AsGML(
topogeometry tg, text nsprefix_in, integer precision, integer options, regclass visitedTable)
;
text AsGML(
topogeometry tg, text nsprefix_in, integer precision, integer options, regclass visitedTable, text idprefix)
;
text AsGML(
topogeometry tg, text nsprefix_in, integer precision, integer options, regclass visitedTable, text idprefix, int gmlversion)
;
返回 GML3 版本格式的拓扑几何的 GML 表示形式。 如果未指定 nsprefix_in
,则使用 gml
。 为 nsprefix 传入一个空字符串以获取非限定名称空间。 精度(默认值:15)和选项(默认值 1)参数(如果给定)将原封不动地传递到 ST_AsGML 的底层调用。
VisitedTable
参数(如果给定)用于跟踪访问过的 Node 和 Edge 元素,以便使用交叉引用 (xlink:xref) 而不是重复定义。 该表预计有(至少)两个整数字段:“element_type”和“element_id”。 调用用户必须对给定表具有读取和写入权限。 为了获得最佳性能,应按 element_type
和 element_id
的顺序定义索引。 此类索引将通过向字段添加唯一约束来自动创建。 例子:
CREATE TABLE visited ( element_type integer, element_id integer, unique(element_type, element_id) );
idprefix
参数(如果给定)将被添加到 Edge 和 Node 标记标识符之前。
gmlver
参数(如果给定)将被传递到底层 ST_AsGML。 默认为 3。
可用性: 2.0.0
这使用了我们在CreateTopoGeom中创建的拓扑几何体
SELECT topology.AsGML(topo) As rdgml FROM ri.roads WHERE road_name = 'Unknown'; -- rdgml-- <gml:TopoCurve> <gml:directedEdge> <gml:Edge gml:id="E1"> <gml:directedNode orientation="-"> <gml:Node gml:id="N1"/> </gml:directedNode> <gml:directedNode ></gml:directedNode> <gml:curveProperty> <gml:Curve srsName="urn:ogc:def:crs:EPSG::3438"> <gml:segments> <gml:LineStringSegment> <gml:posList srsDimension="2" >384744 236928 384750 236923 384769 236911 384799 236895 384811 236890 384833 236884 384844 236882 384866 236881 384879 236883 384954 236898 385087 236932 385117 236938 385167 236938 385203 236941 385224 236946 385233 236950 385241 236956 385254 236971 385260 236979 385268 236999 385273 237018 385273 237037 385271 237047 385267 237057 385225 237125 385210 237144 385192 237161 385167 237192 385162 237202 385159 237214 385159 237227 385162 237241 385166 237256 385196 237324 385209 237345 385234 237375 385237 237383 385238 237399 385236 237407 385227 237419 385213 237430 385193 237439 385174 237451 385170 237455 385169 237460 385171 237475 385181 237503 385190 237521 385200 237533 385206 237538 385213 237541 385221 237542 385235 237540 385242 237541 385249 237544 385260 237555 385270 237570 385289 237584 385292 237589 385291 237596 385284 237630</gml:posList> </gml:LineStringSegment> </gml:segments> </gml:Curve> </gml:curveProperty> </gml:Edge> </gml:directedEdge> </gml:TopoCurve>
与之前的练习相同,没有命名空间
SELECT topology.AsGML(topo,'') As rdgml FROM ri.roads WHERE road_name = 'Unknown'; -- rdgml-- <TopoCurve> <directedEdge> <Edge id="E1"> <directedNode orientation="-"> <Node id="N1"/> </directedNode> <directedNode ></directedNode> <curveProperty> <Curve srsName="urn:ogc:def:crs:EPSG::3438"> <segments> <LineStringSegment> <posList srsDimension="2" >384744 236928 384750 236923 384769 236911 384799 236895 384811 236890 384833 236884 384844 236882 384866 236881 384879 236883 384954 236898 385087 236932 385117 236938 385167 236938 385203 236941 385224 236946 385233 236950 385241 236956 385254 236971 385260 236979 385268 236999 385273 237018 385273 237037 385271 237047 385267 237057 385225 237125 385210 237144 385192 237161 385167 237192 385162 237202 385159 237214 385159 237227 385162 237241 385166 237256 385196 237324 385209 237345 385234 237375 385237 237383 385238 237399 385236 237407 385227 237419 385213 237430 385193 237439 385174 237451 385170 237455 385169 237460 385171 237475 385181 237503 385190 237521 385200 237533 385206 237538 385213 237541 385221 237542 385235 237540 385242 237541 385249 237544 385260 237555 385270 237570 385289 237584 385292 237589 385291 237596 385284 237630</posList> </LineStringSegment> </segments> </Curve> </curveProperty> </Edge> </directedEdge> </TopoCurve>
AsTopoJSON — 返回拓扑几何的 TopoJSON 表示形式。
text AsTopoJSON(
topogeometry tg, regclass edgeMapTable)
;
返回拓扑几何的 TopoJSON 表示形式。 如果edgeMapTable
不为空,它将用作边标识符到弧索引的查找/存储映射。 这是为了能够在最终文档中允许紧凑的“arcs”数组。
该表(如果给定)应具有“serial”类型的“arc_id”字段和整数类型的“edge_id”字段; 该代码将查询表中的“edge_id”,因此建议在该字段上添加索引。
![]() | |
TopoJSON 输出中的弧索引是从 0 开始的,但在“edgeMapTable”表中它们是从 1 开始的。 |
除了该函数返回的片段之外,完整的 TopoJSON 文档还需要包含实际的弧和一些标头。 请参阅 TopoJSON 规范。
可用性:2.1.0
增强:2.2.1 添加了对 puntal 输入的支持
CREATE TEMP TABLE edgemap(arc_id serial, edge_id int unique); -- header SELECT '{ "type": "Topology", "transform": { "scale": [1,1], "translate": [0,0] }, "objects": {' -- objects UNION ALL SELECT '"' || feature_name || '": ' || AsTopoJSON(feature, 'edgemap') FROM features.big_parcels WHERE feature_name = 'P3P4'; -- arcs WITH edges AS ( SELECT m.arc_id, e.geom FROM edgemap m, city_data.edge e WHERE e.edge_id = m.edge_id ), points AS ( SELECT arc_id, (st_dumppoints(geom)).* FROM edges ), compare AS ( SELECT p2.arc_id, CASE WHEN p1.path IS NULL THEN p2.geom ELSE ST_Translate(p2.geom, -ST_X(p1.geom), -ST_Y(p1.geom)) END AS geom FROM points p2 LEFT OUTER JOIN points p1 ON ( p1.arc_id = p2.arc_id AND p2.path[1] = p1.path[1]+1 ) ORDER BY arc_id, p2.path ), arcsdump AS ( SELECT arc_id, (regexp_matches( ST_AsGeoJSON(geom), '\[.*\]'))[1] as t FROM compare ), arcs AS ( SELECT arc_id, '[' || array_to_string(array_agg(t), ',') || ']' as a FROM arcsdump GROUP BY arc_id ORDER BY arc_id ) SELECT '}, "arcs": [' UNION ALL SELECT array_to_string(array_agg(a), E',\n') from arcs -- footer UNION ALL SELECT ']}'::text as t; -- Result: { "type": "Topology", "transform": { "scale": [1,1], "translate": [0,0] }, "objects": { "P3P4": { "type": "MultiPolygon", "arcs": [[[-1]],[[6,5,-5,-4,-3,1]]]} }, "arcs": [ [[25,30],[6,0],[0,10],[-14,0],[0,-10],[8,0]], [[35,6],[0,8]], [[35,6],[12,0]], [[47,6],[0,8]], [[47,14],[0,8]], [[35,22],[12,0]], [[35,14],[0,8]] ]}
本节列出了用于检查拓扑几何和拓扑基元之间关系的拓扑函数
Equals — 如果两个拓扑几何由相同的拓扑基元组成,则返回 true。
boolean Equals(
topogeometry tg1, topogeometry tg2)
;
如果两个拓扑几何由相同的拓扑基元组成:面、边、节点,则返回 true。
![]() | |
作为几何集合的拓扑几何不支持此函数。 它也无法比较不同拓扑的拓扑几何形状。 |
可用性:1.1.0
该函数支持 3d 并且不会丢失 z-index。
Intersects — 如果两个拓扑几何中的任何一对图元相交,则返回 true。
boolean Intersects(
topogeometry tg1, topogeometry tg2)
;
如果两个拓扑几何中的任何一对图元相交,则返回 true。
![]() | |
作为几何集合的拓扑几何不支持此函数。 它也无法比较不同拓扑的拓扑几何形状。 目前也不支持分层拓扑几何(由其他拓扑几何组成的拓扑几何)。 |
可用性:1.1.0
该函数支持 3d 并且不会丢失 z-index。
创建拓扑以及关联的拓扑层后,您可能希望将它们导出为基于文件的格式以进行备份或传输到另一个数据库中。
使用 PostgreSQL 的标准转储/恢复工具是有问题的,因为拓扑由一组表(基元为 4 个,层为任意数量)和元数据表中的记录(topology.topology 和 topology.layer)组成。 此外,拓扑标识符在数据库中并不是唯一的,因此在恢复拓扑时需要更改拓扑参数。
为了简化拓扑的导出/恢复,提供了一对可执行文件:pgtopo_export
和pgtopo_import
。 用法示例:
pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db
pgtopo_export
脚本采用数据库和拓扑的名称,并输出转储文件,该文件可用于将拓扑(和关联的层)导入到新数据库中。
默认情况下,pgtopo_export
将转储文件写入标准输出,以便可以将其通过管道传输到 pgtopo_import
或重定向到文件(拒绝写入终端)。 您可以选择使用 -f
命令行开关指定输出文件名。
默认情况下,pgtopo_export
包含针对给定拓扑定义的所有层的转储。 这可能是比您需要的更多的数据,或者可能不起作用(如果您的图层表具有复杂的依赖关系),在这种情况下,您可以使用 --skip-layers
开关请求跳过图层并单独处理这些图层。
调用 pgtopo_export
时使用 --help
(或缩写的 -h
)指令将始终打印简短的用法说明字符串。
转储文件格式是 pgtopo_export
目录的压缩 tar 存档,其中至少包含一个带有格式版本信息的 pgtopo_dump_version
文件。 从版本 1
开始,该目录包含制表符分隔的 CSV 文件,其中包含拓扑基元表的数据(节点、边、面、关系)、与其关联的拓扑和层记录以及(除非给出 --skip-layers
)自定义 -format PostgreSQL 转储表报告为给定拓扑的层。
pgtopo_import
脚本采用 pgtopo_export
格式的拓扑转储和要创建的拓扑的名称,并输出重建拓扑和关联层的 SQL 脚本。
生成的 SQL 文件将包含以下语句:创建具有给定名称的拓扑、在其中加载原始数据、通过将所有 TopoGeometry 值正确链接到其正确的拓扑来恢复和注册所有拓扑层。
默认情况下,pgtopo_import
从标准输入读取转储,以便它可以与管道中的 pgtopo_export
结合使用。 您可以选择使用 -f
命令行开关指定输入文件名。
默认情况下,pgtopo_import
在输出 SQL 文件中包含用于恢复转储中找到的所有层的代码。
如果您的目标数据库已经具有与转储中的表同名的表,这可能是不需要的或不起作用的。 在这种情况下,您可以使用 --skip-layers
命令请求跳过层并单独(或稍后)处理这些层。
可以使用 --only-layers
命令生成仅加载层并将层链接到命名拓扑的 SQL。 这对于在解决命名冲突后加载图层或将图层链接到不同的拓扑(例如起始拓扑的空间简化版本)非常有用。
对于大多数用例,您将通过使用打包的 raster2pgsql
栅格加载器加载现有栅格文件来创建 PostGIS 栅格。
raster2pgsql
是一个用于将 GDAL 支持的栅格格式加载到适合加载到 PostGIS 栅格表的 SQL 的栅格加载器可执行文件。它能够加载文件夹中的栅格文件,同时创建栅格的概览。
由于 raster2pgsql 最常被编译为 PostGIS 的一部分(除非您编译自己的 GDAL 库),因此可执行文件支持的栅格类型将与 GDAL 依赖库中编译的栅格类型相同。 要获取特定 raster2pgsql
支持的栅格类型列表,请使用 -G
指令。
![]() | |
在从一组对齐的栅格创建特定因子的概览时,有可能概览不会对齐。请访问 http://trac.osgeo.org/postgis/ticket/1764 查看一个示例,其中概览未对齐。 |
使用加载器创建输入文件并将其以 100x100 块分块上传的示例会话可能如下所示:
# -s use srid 4326 # -I create spatial index # -C use standard raster constraints # -M vacuum analyze after load # *.tif load all these files # -F include a filename column in the raster table # -t tile the output 100x100 # public.demelevation load into this table raster2pgsql -s 4326 -I -C -M -F -t 100x100 *.tif public.demelevation > elev.sql # -d connect to this database # -f read this file after connecting psql -d gisdb -f elev.sql
![]() | |
如果您没有将架构指定为目标表名称的一部分,则该表将在您所连接的数据库或用户的默认架构中创建。 |
使用 UNIX 管道可以一步完成转换和上传:
raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 public.demelevation | psql -d gisdb
将马萨诸塞州平面米制航空瓦片加载到名为aerial
的架构中,并创建一个全视图,2级和4级概览表,使用复制模式进行插入(没有中间文件,直接到数据库),并且使用“-e”选项来避免强制将所有内容放入一个事务中(如果你希望立即查看表中的数据而不必等待的话)。将栅格分割成128x128像素的瓦片,并应用栅格约束。同时,包括一个名为“filename”的字段,用于存储瓦片所来自的文件的名称。
raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128 -l 2,4 bostonaerials2008/*.jpg aerials.boston | psql -U postgres -d gisdb -h localhost -p 5432
--get a list of raster types supported: raster2pgsql -G
-G 指令输出类似的列表
Available GDAL raster formats: Virtual Raster GeoTIFF National Imagery Transmission Format Raster Product Format TOC format ECRG TOC format Erdas Imagine Images (.img) CEOS SAR Image CEOS Image ... Arc/Info Export E00 GRID ZMap Plus Grid NOAA NGS Geoid Height Grids
-?
显示帮助屏幕。 如果您不传入任何参数,也会显示帮助。
-G
打印支持的栅格格式。
-c
创建新表并用栅格填充它,这是默认模式
-a
将栅格附加到现有表。
-d
删除表,创建新表并用栅格填充它
-p
准备模式,只创建表。
-C
应用栅格约束——srid、像素大小等,以确保栅格在raster_columns
视图中正确配准。
-x
禁用设置最大范围约束。 仅当还使用 -C 指令时才适用。
-r
设置规范块约束(空间唯一和详尽的切片)。 仅当还使用 -C 指令时才适用。
-s <SRID>
使用指定的 SRID 分配输出栅格。 如果未提供或为零,则将检查栅格的元数据以确定适当的 SRID。
-b BAND
从栅格中提取的波段索引(从 1 开始)。 对于多个波段索引,用逗号(,)分隔。 如果未指定,则将提取栅格的所有波段。
-t TILE_SIZE
将光栅切割成图块,以便在每个表行插入一个图块。 TILE_SIZE
表示为 WIDTHxHEIGHT 或设置为值“auto”,以允许加载程序使用第一个栅格计算适当的切片大小并将其应用于所有栅格。
-P
填充最右侧和最底部的图块,以保证所有图块具有相同的宽度和高度。
-R, --register
将栅格注册为文件系统 (out-db) 栅格。
仅栅格的元数据和栅格的路径位置存储在数据库中(而不是像素)。
-l OVERVIEW_FACTOR
创建栅格的概览。 对于多个因素,用逗号(,)分隔。 概览表名称遵循 o_overview Factor
_table
模式,其中概览因子
是数字概览因子的占位符,表
将替换为基表名称。 创建的概述存储在数据库中,不受-R影响。 请注意,生成的 sql 文件将包含主表和概览表。
-N NODATA
NODATA 值用于没有 NODATA 值的带。
-f COLUMN
指定目标栅格列的名称,默认为“rast”
-F
添加包含文件名的列
-n COLUMN
指定文件名列的名称。 意味着-F。
-q
将 PostgreSQL 标识符括在引号中。
-I
在栅格列上创建 GiST 索引。
-M
真空分析栅格表。
-k
保留空的瓦片并跳过每个光栅波段的NODATA值检查。请注意,这样可以节省检查的时间,但可能会导致数据库中出现更多的垃圾行,并且这些垃圾行不会标记为空的瓦片。
-T tablespace
指定新表的表空间。 请注意,索引(包括主键)仍将使用默认表空间,除非还使用了 -X 标志。
-X tablespace
指定表的新索引的表空间。 如果使用 -I 标志,这适用于主键和空间索引。
-Y max_rows_per_copy=50
使用复制语句而不是插入语句。 可以选择指定 max_rows_per_copy
; 未指定时默认为 50。
-e
单独执行每条语句,不使用事务。
-E ENDIAN
控制生成的光栅二进制输出的字节顺序; 为 XDR 指定 0,为 NDR 指定 1(默认); 现在仅支持 NDR 输出
-V version
指定输出格式的版本。 默认为0。目前仅支持0。
在许多情况下,您需要直接在数据库中创建栅格和栅格表。 有很多函数可以做到这一点。 要遵循的一般步骤。
创建一个包含栅格列的表来保存新的栅格记录,可以通过以下方式完成:
CREATE TABLE myrasters(rid serial primary key, rast raster);
有许多功能可以帮助实现这一目标。 如果您创建的栅格不是其他栅格的衍生品,则需要从以下位置开始:ST_MakeEmptyRaster,然后是 ST_AddBand
您还可以从几何图形创建栅格。 为了实现这一点,您可能需要使用 ST_AsRaster 以及其他函数,例如 ST_Union 或 ST_MapAlgebraFct或任何其他地图代数函数系列。
甚至还有更多选项可用于从现有表创建新栅格表。 例如,您可以使用 ST_Transform在与现有投影不同的投影中创建栅格表
最初填充表后,您将需要在栅格列上创建一个空间索引,如下所示:
CREATE INDEX myrasters_rast_st_convexhull_idx ON myrasters USING gist( ST_ConvexHull(rast) );
请注意 ST_ConvexHull的使用,因为大多数栅格运算符都基于栅格的凸包。
![]() | |
PostGIS 栅格 2.0 之前的版本基于最小外接矩形而不是凸包。 为了使空间索引正常工作,您需要删除它们并替换为基于凸包的索引。 |
使用 AddRasterConstraints应用栅格约束
raster2pgsql
工具使用 GDAL 访问栅格数据,并且可以利用 GDAL 的一个关键功能:能够从远程存储在云“对象存储”(例如 AWS S3、Google Cloud Storage)中的栅格中读取数据。
有效使用云存储栅格需要使用“云优化”格式。 最知名和最广泛使用的是“云优化的 GeoTIFF”格式。 使用非云格式(例如 JPEG 或未平铺的 TIFF)将导致性能非常差,因为系统每次需要访问子集时都必须下载整个栅格。
首先,将栅格加载到您选择的云存储中。 一旦加载,您将有一个 URI 来访问它,可以是“http”URI,有时也可以是特定于服务的 URI。 (例如,“s3://bucket/object”)。 要访问非公共存储桶,您需要提供 GDAL 配置选项来验证您的连接。 请注意,此命令是从云栅格读取并写入数据库。
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx \ AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ raster2pgsql \ -s 990000 \ -t 256x256 \ -I \ -R \ /vsis3/your.bucket.com/your_file.tif \ your_table \ | psql your_db
加载表后,您需要通过设置两个权限(postgis.enable_outdb_rasters 和postgis.gdal_enabled_drivers)来授予数据库从远程栅格读取的权限。
SET postgis.enable_outdb_rasters = true; SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
为了使更改生效并持久化,直接在您的数据库上进行设置。您将需要重新连接以体验新的设置。
ALTER DATABASE your_db SET postgis.enable_outdb_rasters = true; ALTER DATABASE your_db SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
对于非公开的栅格数据,你可能需要提供访问密钥来从云端栅格数据中读取。你可以将写入 raster2pgsql
调用时使用的相同密钥设置为在数据库内部使用,使用 postgis.gdal_vsi_options 配置。请注意,可以通过用空格分隔 key=value
对来设置多个选项。
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
加载数据并设置权限后,您可以使用相同的功能像任何其他栅格表一样与栅格表进行交互。 当需要读取像素数据时,数据库将处理连接到云数据的所有机制。
PostGIS 附带了两个栅格目录视图。 两个视图都利用嵌入在栅格表约束中的信息。 因此,由于强制实施了约束,目录视图始终与表中的栅格数据一致。
raster_columns
此视图对数据库中的所有栅格表列进行编目。
raster_overviews
此视图对数据库中的所有栅格表列进行编目,这些列用作更细粒度表的概述。 当您在加载期间使用 -l
开关时,会生成这种类型的表。
raster_columns
是数据库中所有栅格类型的栅格表列的目录。 它是一种利用表约束的视图,因此即使您从另一个数据库的备份恢复一个栅格表,信息也始终保持一致。 raster_columns
目录中存在以下列。
如果您未使用加载器创建表或忘记在加载期间指定 -C
标志,则可以在事后使用 AddRasterConstraints强制执行约束,以便 raster_columns
目录注册有关栅格切片的通用信息。
r_table_catalog
表所在的数据库。这将始终读取当前数据库。
r_table_schema
栅格表所属的数据库模式。
r_table_name
栅格表
r_raster_column
在r_table_name
表中栅格类型的列。 PostGIS 中没有任何内容可以阻止您在每个表中拥有多个栅格列,因此可以多次列出一个栅格表,并且每个表具有不同的栅格列。
srid
栅格的空间参考标识符。 应该是Section 4.5, “空间参考系统”中的条目。
scale_x
几何空间坐标与像素之间的缩放比例。 仅当栅格列中的所有切片具有相同的scale_x
并且应用此约束时,此功能才可用。 有关更多详细信息,请参阅 ST_ScaleX。
scale_y
几何空间坐标与像素之间的缩放比例。 仅当栅格列中的所有切片具有相同的scale_y
并且应用了scale_y
约束时,此功能才可用。 有关详细信息,请参阅 ST_ScaleY。
blocksize_x
每个栅格图块的宽度(跨像素数)。 有关更多详细信息,请参阅ST_Width。
blocksize_y
每个栅格图块的宽度(向下的像素数)。 有关更多详细信息,请参阅ST_Height。
same_alignment
一个布尔值,如果所有栅格图块具有相同的对齐方式,则该值为 true。 有关更多详细信息,请参阅ST_SameAlignment。
Regular_blocking
如果栅格列具有空间唯一性和覆盖范围切片约束,则该值为 TRUE。 否则,它将是 FALSE。
num_bands
栅格集中每个切片中的波段数。 这与 ST_NumBands 提供的信息相同 ST_NumBands
Pixel_types
定义每个波段的像素类型的数组。 该数组中的元素数量与波段的数量相同。 Pixel_types 是 ST_BandPixelType 中定义的以下类型之一。
nodata_values
双精度数字数组,表示每个波段的 nodata_value
。 该数组中的元素数量与带的数量相同。 这些数字定义了大多数操作中应忽略的每个波段的像素值。 这与ST_BandNoDataValue 提供的信息类似。
out_db
布尔标志数组,指示栅格波段数据是否在数据库外部维护。 该数组中的元素数量与带的数量相同。
extent
这是栅格集中所有栅格行的范围。 如果您计划加载更多数据来更改集的范围,则需要在加载之前运行 DropRasterConstraints 函数,然后在加载后使用AddRasterConstraints 重新应用约束。
Spatial_index
如果栅格列具有空间索引,则为 true 的布尔值。
raster_overviews
目录有关用于概览的栅格表列的信息以及在使用概览时了解的有用的附加信息。 概览表在 raster_columns
和 raster_overviews
中进行编目,因为它们本身就是栅格,但还具有作为高分辨率表的较低分辨率的漫画化图像的额外特殊用途。 当您在栅格加载中使用 -l
开关时,它们会与主栅格表一起生成,或者可以使用 AddOverviewConstraints手动生成。
概览表包含与其他栅格表相同的约束以及特定于概览的附加信息约束。
![]() | |
|
进行概览的两个主要原因是:
通常用于快速映射缩小的核心表的低分辨率表示。
它们的计算速度通常比其更高分辨率的父级更快,因为记录更少,每个像素覆盖更多区域。 尽管计算不如它们支持的高分辨率表那么准确,但它们在许多粗略计算中已经足够了。
raster_overviews
目录包含以下信息。
o_table_catalog
概览表所在的数据库。这将始终读取当前数据库。
o_table_schema
概览栅格表所属的数据库架构。
o_table_name
栅格概览表名称
o_raster_column
概览表中的栅格列。
r_table_catalog
该概览服务所在的栅格表所在的数据库。这将始终读取当前数据库。
r_table_schema
此概览服务所属的栅格表的数据库架构。
r_table_name
此概览服务的栅格表。
r_raster_column
此概览列服务的栅格列。
Overview_factor
- 这是概述表的金字塔级别。 数字越大,表的分辨率越低。 raster2pgsql 如果给定图像文件夹,将计算每个图像文件的概述并单独加载。 假定级别为 1,并且始终为原始文件。 2 级是每个图块代表 4 个原始图块。 例如,如果您有一个包含 5000x5000 像素图像文件的文件夹,您选择将其分块为 125x125,则对于每个图像文件,您的基表将有 (5000*5000)/(125*125) 条记录 = 1600,您的 (l=2) o_2
表将有上限(1600/Power(2,2)) = 400 行,您的 (l=3) o_3
将有上限(1600/Power(2,3) ) = 200 行。 如果您的像素不能被图块的大小整除,您将得到一些废图块(未完全填充的图块)。 请注意,raster2pgsql 生成的每个概览图块与其父级图块具有相同数量的像素,但分辨率较低,其中每个像素代表(原始图块的 Power(2,overview_factor) 像素)。
事实上,PostGIS 栅格为您提供了 SQL 函数来以已知图像格式渲染栅格,这为您提供了很多渲染栅格的选项。 例如,您可以使用 OpenOffice / LibreOffice 进行渲染,如 使用 LibreOffice 基础报告渲染 PostGIS 栅格图形中所示。 此外,您还可以使用本节中演示的多种语言。
在本节中,我们将演示如何使用 PHP PostgreSQL 驱动程序和 ST_AsGDALRaster系列函数将栅格的波段 1、2、3 输出到 PHP 请求流,然后将其嵌入到 img src html 标记中。
示例查询演示了如何将一大堆栅格函数组合在一起,以获取与特定 wgs 84 边界框相交的所有图块,然后将相交图块与 ST_Union联合起来,返回所有波段,使用 ST_Transform转换为用户指定的投影,然后输出 使用 ST_AsPNG将结果显示为 png。
您可以使用
http://mywebserver/test_raster.php?srid=2249
调用以下命令来获取马萨诸塞州平面英尺的栅格图像。
<?php /** contents of test_raster.php **/ $conn_str ='dbname=mydb host=localhost port=5432 user=myuser password=mypwd'; $dbconn = pg_connect($conn_str); header('Content-Type: image/png'); /**If a particular projection was requested use it otherwise use mass state plane meters **/ if (!empty( $_REQUEST['srid'] ) && is_numeric( $_REQUEST['srid']) ){ $input_srid = intval($_REQUEST['srid']); } else { $input_srid = 26986; } /** The set bytea_output may be needed for PostgreSQL 9.0+, but not for 8.4 **/ $sql = "set bytea_output='escape'; SELECT ST_AsPNG(ST_Transform( ST_AddBand(ST_Union(rast,1), ARRAY[ST_Union(rast,2),ST_Union(rast,3)]) ,$input_srid) ) As new_rast FROM aerials.boston WHERE ST_Intersects(rast, ST_Transform(ST_MakeEnvelope(-71.1217, 42.227, -71.1210, 42.218,4326),26986) )"; $result = pg_query($sql); $row = pg_fetch_row($result); pg_free_result($result); if ($row === false) return; echo pg_unescape_bytea($row[0]); ?>
在本节中,我们将演示如何使用 Npgsql PostgreSQL .NET 驱动程序和ST_AsGDALRaster系列函数将栅格的波段 1、2、3 输出到 PHP 请求流,然后将其嵌入到 img src html 标记中。
本练习需要 npgsql .NET PostgreSQL 驱动程序,您可以从 http://npgsql.projects.postgresql.org/ 获取最新的驱动程序。 只需下载最新版本并放入 ASP.NET bin 文件夹中即可开始使用。
示例查询演示了如何将一大堆栅格函数组合在一起,以获取与特定 wgs 84 边界框相交的所有图块,然后将相交图块与 ST_Union联合起来,返回所有波段,使用 ST_Transform转换为用户指定的投影,然后输出 使用 ST_AsPNG将结果显示为 png。
该示例与Section 10.3.1, “PHP 示例使用 ST_AsPNG 与其他栅格函数进行输出”示例相同,只不过是在 C# 中实现的。
您可以使用
http://mywebserver/TestRaster.ashx?srid=2249
调用以下命令来获取马萨诸塞州平面英尺的栅格图像。
-- web.config connection string section -- <connectionStrings> <add name="DSN" connectionString="server=localhost;database=mydb;Port=5432;User Id=myuser;password=mypwd"/> </connectionStrings>
// Code for TestRaster.ashx <%@ WebHandler Language="C#" Class="TestRaster" %> using System; using System.Data; using System.Web; using Npgsql; public class TestRaster : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "image/png"; context.Response.BinaryWrite(GetResults(context)); } public bool IsReusable { get { return false; } } public byte[] GetResults(HttpContext context) { byte[] result = null; NpgsqlCommand command; string sql = null; int input_srid = 26986; try { using (NpgsqlConnection conn = new NpgsqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DSN"].ConnectionString)) { conn.Open(); if (context.Request["srid"] != null) { input_srid = Convert.ToInt32(context.Request["srid"]); } sql = @"SELECT ST_AsPNG( ST_Transform( ST_AddBand( ST_Union(rast,1), ARRAY[ST_Union(rast,2),ST_Union(rast,3)]) ,:input_srid) ) As new_rast FROM aerials.boston WHERE ST_Intersects(rast, ST_Transform(ST_MakeEnvelope(-71.1217, 42.227, -71.1210, 42.218,4326),26986) )"; command = new NpgsqlCommand(sql, conn); command.Parameters.Add(new NpgsqlParameter("input_srid", input_srid)); result = (byte[]) command.ExecuteScalar(); conn.Close(); } } catch (Exception ex) { result = null; context.Response.Write(ex.Message.Trim()); } return result; } }
这是一个简单的 java 控制台应用程序,它接受一个返回一张图像并输出到指定文件的查询。
您可以从 http://jdbc.postgresql.org/download.html 下载最新的 PostgreSQL JDBC 驱动程序
您可以使用如下命令编译以下代码:
set env CLASSPATH .:..\postgresql-9.0-801.jdbc4.jar javac SaveQueryImage.java jar cfm SaveQueryImage.jar Manifest.txt *.class
并使用类似的命令从命令行调用它
java -jar SaveQueryImage.jar "SELECT ST_AsPNG(ST_AsRaster(ST_Buffer(ST_Point(1,5),10, 'quad_segs=2'),150, 150, '8BUI',100));" "test.png"
-- Manifest.txt -- Class-Path: postgresql-9.0-801.jdbc4.jar Main-Class: SaveQueryImage
// Code for SaveQueryImage.java import java.sql.Connection; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.io.*; public class SaveQueryImage { public static void main(String[] argv) { System.out.println("Checking if Driver is registered with DriverManager."); try { //java.sql.DriverManager.registerDriver (new org.postgresql.Driver()); Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException cnfe) { System.out.println("Couldn't find the driver!"); cnfe.printStackTrace(); System.exit(1); } Connection conn = null; try { conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb","myuser", "mypwd"); conn.setAutoCommit(false); PreparedStatement sGetImg = conn.prepareStatement(argv[0]); ResultSet rs = sGetImg.executeQuery(); FileOutputStream fout; try { rs.next(); /** Output to file name requested by user **/ fout = new FileOutputStream(new File(argv[1]) ); fout.write(rs.getBytes(1)); fout.close(); } catch(Exception e) { System.out.println("Can't create file"); e.printStackTrace(); } rs.close(); sGetImg.close(); conn.close(); } catch (SQLException se) { System.out.println("Couldn't connect: print out a stack trace and exit."); se.printStackTrace(); System.exit(1); } } }
这是一个 plpython 存储函数,它在服务器目录中为每条记录创建一个文件。 需要你安装了 plpython。 应该可以与 plpythonu 和 plpython3u 一起正常工作。
CREATE OR REPLACE FUNCTION write_file (param_bytes bytea, param_filepath text) RETURNS text AS $$ f = open(param_filepath, 'wb+') f.write(param_bytes) return param_filepath $$ LANGUAGE plpythonu;
--write out 5 images to the PostgreSQL server in varying sizes -- note the postgresql daemon account needs to have write access to folder -- this echos back the file names created; SELECT write_file(ST_AsPNG( ST_AsRaster(ST_Buffer(ST_Point(1,5),j*5, 'quad_segs=2'),150*j, 150*j, '8BUI',100)), 'C:/temp/slices'|| j || '.png') FROM generate_series(1,5) As j; write_file --------------------- C:/temp/slices1.png C:/temp/slices2.png C:/temp/slices3.png C:/temp/slices4.png C:/temp/slices5.png
遗憾的是,PSQL 没有易于使用的内置功能来输出二进制文件。 这是一个有点依赖于 PostgreSQL 遗留的大对象支持的 hack。 要使用,首先启动连接到数据库的 psql 命令行。
与 python 方法不同,此方法在本地计算机上创建文件。
SELECT oid, lowrite(lo_open(oid, 131072), png) As num_bytes FROM ( VALUES (lo_create(0), ST_AsPNG( (SELECT rast FROM aerials.boston WHERE rid=1) ) ) ) As v(oid,png); -- you'll get an output something like -- oid | num_bytes ---------+----------- 2630819 | 74860 -- next note the oid and do this replacing the c:/test.png to file path location -- on your local computer \lo_export 2630819 'C:/temp/aerial_samp.png' -- this deletes the file from large object storage on db SELECT lo_unlink(2630819);
下面给出的功能是 PostGIS Raster 用户可能需要的功能,并且当前在 PostGIS Raster 中可用。 还有一些其他功能是栅格对象所需的支持功能,但对一般用户来说没有用处。
raster
是一种新的 PostGIS 类型,用于存储和分析栅格数据。
有关从光栅文件加载光栅的信息,请参阅Section 10.1, “加载和创建栅格”
对于本参考文献中的示例,我们将使用虚拟栅格的栅格表 - 由以下代码组成
CREATE TABLE dummy_rast(rid integer, rast raster); INSERT INTO dummy_rast(rid, rast) VALUES (1, ('01' -- little endian (uint8 ndr) || '0000' -- version (uint16 0) || '0000' -- nBands (uint16 0) || '0000000000000040' -- scaleX (float64 2) || '0000000000000840' -- scaleY (float64 3) || '000000000000E03F' -- ipX (float64 0.5) || '000000000000E03F' -- ipY (float64 0.5) || '0000000000000000' -- skewX (float64 0) || '0000000000000000' -- skewY (float64 0) || '00000000' -- SRID (int32 0) || '0A00' -- width (uint16 10) || '1400' -- height (uint16 20) )::raster ), -- Raster: 5 x 5 pixels, 3 bands, PT_8BUI pixel type, NODATA = 0 (2, ('01000003009A9999999999A93F9A9999999999A9BF000000E02B274A' || '41000000007719564100000000000000000000000000000000FFFFFFFF050005000400FDFEFDFEFEFDFEFEFDF9FAFEF' || 'EFCF9FBFDFEFEFDFCFAFEFEFE04004E627AADD16076B4F9FE6370A9F5FE59637AB0E54F58617087040046566487A1506CA2E3FA5A6CAFFBFE4D566DA4CB3E454C5665')::raster);
本节列出了专门为支持栅格功能而创建的 PostgreSQL 数据类型。
geomval — 具有两个字段的空间数据类型 - geom(保存几何对象)和 val(保存栅格带中的双精度像素值)。
geomval 是一种复合数据类型,由 .geom 字段引用的几何对象和 val 组成,val 是一个双精度值,表示栅格带中特定几何位置处的像素值。 ST_DumpAsPolygon 和栅格交集函数系列使用它作为输出类型,将栅格带分解为几何多边形。
addbandarg — 用作 ST_AddBand 函数的输入的复合类型,定义新波段的属性和初始值。
用作 ST_AddBand 函数的输入的复合类型,定义新波段的属性和初始值。
index integer
从 1 开始的值,指示新波段将添加到栅格波段中的位置。 如果为 NULL,则新波段将添加到栅格波段的末尾。
pixeltype text
新波段的像素类型。 ST_BandPixelType 中描述的已定义像素类型之一。
initialvalue double precision
新波段的所有像素将设置为的初始值。
nodataval double precision
新波段的 NODATA 值。 如果为 NULL,则新波段将不会分配 NODATA 值。
rastbandarg — 需要表达栅格和该栅格的波段索引时使用的复合类型。
需要表达栅格和该栅格的波段索引时使用的复合类型。
rast raster
有问题的栅格/
nband integer
从 1 开始的值,表示栅格的波段
raster — 栅格空间数据类型。
栅格是一种空间数据类型,用于表示栅格数据,例如从 JPEG、TIFF、PNG、数字高程模型导入的栅格数据。 每个栅格都有 1 个或多个波段,每个波段都有一组像素值。 栅格可以进行地理参考。
![]() | |
需要使用 GDAL 支持来编译 PostGIS。 目前栅格可以隐式转换为几何类型,但转换返回栅格的 ST_ConvexHull。 此自动铸造可能会在不久的将来被删除,因此不要依赖它。 |
这个部分列出了允许用于这种数据类型的自动转换以及显式转换
转换到 | 行为 |
geometry | automatic |
reclassarg — 用作定义重新分类行为的 ST_Reclass 函数的输入的复合类型。
用作定义重新分类行为的 ST_Reclass 函数的输入的复合类型。
nband integer
要重新分类的波段的波段号。
reclassexpr text
由逗号分隔的 range:map_range 映射组成的范围表达式。 :定义映射,定义如何将旧波段值映射到新波段值。 ( 表示 >,) 表示<,] 表示< 或=,[ 表示 > 或=
1. [a-b] = a <= x <= b 2. (a-b] = a < x <= b 3. [a-b) = a <= x < b 4. (a-b) = a < x < b
( 符号是可选的,因此 a-b 与 (a-b) 的含义相同
pixeltype text
ST_BandPixelType中描述的已定义像素类型之一
nodataval double precision
视为无数据的值。 对于支持透明度的图像输出,这些将为空白。
SELECT ROW(2, '0-100:1-10, 101-500:11-150,501 - 10000: 151-254', '8BUI', 255)::reclassarg;
SELECT ROW(1, '0-100]:0, (100-255:1', '1BB', NULL)::reclassarg;
summarystats — ST_SummaryStats 和 ST_SummaryStatsAgg 函数返回的复合类型。
ST_SummaryStats 和 ST_SummaryStatsAgg 函数返回的复合类型。
摘要统计数据的像素数。
所有计数像素值的总和。
所有计数像素值的算术平均值。
所有计数像素值的标准偏差。
计数像素值的最小值。
计数像素值的最大值。
AddRasterConstraints — 将栅格约束添加到已加载的栅格表中,用于特定列,该列约束了空间参考、比例、块大小、对齐、波段、波段类型以及一个标志,用于表示栅格列是否被规则地分块。表必须加载数据才能推断出约束。如果约束设置成功,则返回 true,否则会发出通知。
boolean AddRasterConstraints(
name rasttable, name rastcolumn, boolean srid=true, boolean scale_x=true, boolean scale_y=true, boolean blocksize_x=true, boolean blocksize_y=true, boolean same_alignment=true, boolean regular_blocking=false, boolean num_bands=true , boolean pixel_types=true , boolean nodata_values=true , boolean out_db=true , boolean extent=true )
;
boolean AddRasterConstraints(
name rasttable, name rastcolumn, text[] VARIADIC constraints)
;
boolean AddRasterConstraints(
name rastschema, name rasttable, name rastcolumn, text[] VARIADIC constraints)
;
boolean AddRasterConstraints(
name rastschema, name rasttable, name rastcolumn, boolean srid=true, boolean scale_x=true, boolean scale_y=true, boolean blocksize_x=true, boolean blocksize_y=true, boolean same_alignment=true, boolean regular_blocking=false, boolean num_bands=true, boolean pixel_types=true, boolean nodata_values=true , boolean out_db=true , boolean extent=true )
;
在栅格列上生成约束,用于显示 raster_columns
栅格目录中的信息。 rastschema
是表所在的表模式的名称。srid
必须是对 SPATIAL_REF_SYS 表中条目的整数值引用。
raster2pgsql
加载器使用此函数来注册栅格表
要传入的有效约束名称:有关更多详细信息,请参阅Section 10.2.1, “栅格列目录”。
blocksize
设置 X 和 Y 块大小
blocksize_x
设置 X 个图块(每个图块的宽度(以像素为单位))
blocksize_y
设置 Y 图块(每个图块的像素高度)
extent
计算整个表的范围并应用约束所有栅格必须在该范围内
num_bands
波段数量
Pixel_types
读取每个波段的像素类型数组,确保所有波段 n 具有相同的像素类型
Regular_blocking
设置空间唯一(两个栅格不能在空间上相同)和覆盖图块(栅格与覆盖范围对齐)约束
Same_alignment
确保它们都具有相同的对齐方式,这意味着您比较的任何两个图块都将返回 true。 请参阅 ST_SameAlignment。
srid
确保所有人都有相同的 srid
More--任何列为上述函数输入的内容
![]() | |
该函数根据表中已有的数据推断约束。 因此,要使其正常工作,您必须首先创建栅格列,然后向其加载数据。 |
![]() | |
如果在应用约束后需要在表中加载更多数据,并且数据范围已更改,则可能需要运行 DropRasterConstraints。 |
可用性: 2.0.0
CREATE TABLE myrasters(rid SERIAL primary key, rast raster); INSERT INTO myrasters(rast) SELECT ST_AddBand(ST_MakeEmptyRaster(1000, 1000, 0.3, -0.3, 2, 2, 0, 0,4326), 1, '8BSI'::text, -129, NULL); SELECT AddRasterConstraints('myrasters'::name, 'rast'::name); -- verify if registered correctly in the raster_columns view -- SELECT srid, scale_x, scale_y, blocksize_x, blocksize_y, num_bands, pixel_types, nodata_values FROM raster_columns WHERE r_table_name = 'myrasters'; srid | scale_x | scale_y | blocksize_x | blocksize_y | num_bands | pixel_types| nodata_values ------+---------+---------+-------------+-------------+-----------+-------------+--------------- 4326 | 2 | 2 | 1000 | 1000 | 1 | {8BSI} | {0}
CREATE TABLE public.myrasters2(rid SERIAL primary key, rast raster); INSERT INTO myrasters2(rast) SELECT ST_AddBand(ST_MakeEmptyRaster(1000, 1000, 0.3, -0.3, 2, 2, 0, 0,4326), 1, '8BSI'::text, -129, NULL); SELECT AddRasterConstraints('public'::name, 'myrasters2'::name, 'rast'::name,'regular_blocking', 'blocksize'); -- get notice-- NOTICE: Adding regular blocking constraint NOTICE: Adding blocksize-X constraint NOTICE: Adding blocksize-Y constraint
DropRasterConstraints — 删除引用栅格表列的 PostGIS 栅格约束。 如果您需要重新加载数据或更新栅格列数据,则非常有用。
boolean DropRasterConstraints(
name rasttable, name rastcolumn, boolean srid, boolean scale_x, boolean scale_y, boolean blocksize_x, boolean blocksize_y, boolean same_alignment, boolean regular_blocking, boolean num_bands=true, boolean pixel_types=true, boolean nodata_values=true, boolean out_db=true , boolean extent=true)
;
boolean DropRasterConstraints(
name rastschema, name rasttable, name rastcolumn, boolean srid=true, boolean scale_x=true, boolean scale_y=true, boolean blocksize_x=true, boolean blocksize_y=true, boolean same_alignment=true, boolean regular_blocking=false, boolean num_bands=true, boolean pixel_types=true, boolean nodata_values=true, boolean out_db=true , boolean extent=true)
;
boolean DropRasterConstraints(
name rastschema, name rasttable, name rastcolumn, text[] constraints)
;
删除引用由AddRasterConstraints添加的栅格表列的 PostGIS 栅格约束。 如果您需要加载更多数据或更新栅格列数据,则非常有用。 如果您想要删除栅格表或栅格列,则无需执行此操作。
要删除栅格表,请使用标准
DROP TABLE mytable
要仅删除栅格列并保留表的其余部分,请使用标准 SQL
ALTER TABLE mytable DROP COLUMN rast
如果删除列或表,该表将从 raster_columns
目录中消失。 但是,如果仅删除约束,则栅格列仍将列在 raster_columns
目录中,但除了列名称和表之外,不会有任何其他信息。
可用性: 2.0.0
SELECT DropRasterConstraints ('myrasters','rast'); ----RESULT output --- t -- verify change in raster_columns -- SELECT srid, scale_x, scale_y, blocksize_x, blocksize_y, num_bands, pixel_types, nodata_values FROM raster_columns WHERE r_table_name = 'myrasters'; srid | scale_x | scale_y | blocksize_x | blocksize_y | num_bands | pixel_types| nodata_values ------+---------+---------+-------------+-------------+-----------+-------------+--------------- 0 | | | | | | |
AddOverviewConstraints — 将栅格列标记为另一栅格列的概述。
boolean AddOverviewConstraints(
name ovschema, name ovtable, name ovcolumn, name refschema, name reftable, name refcolumn, int ovfactor)
;
boolean AddOverviewConstraints(
name ovtable, name ovcolumn, name reftable, name refcolumn, int ovfactor)
;
添加对栅格列的约束,用于显示 raster_overviews
栅格目录中的信息。
ovfactor
参数表示概览列中的比例乘数:概览因子越高,分辨率越低。
当省略 ovschema
和 refschema
参数时,将使用扫描 search_path
找到的第一个表。
可用性: 2.0.0
CREATE TABLE res1 AS SELECT ST_AddBand( ST_MakeEmptyRaster(1000, 1000, 0, 0, 2), 1, '8BSI'::text, -129, NULL ) r1; CREATE TABLE res2 AS SELECT ST_AddBand( ST_MakeEmptyRaster(500, 500, 0, 0, 4), 1, '8BSI'::text, -129, NULL ) r2; SELECT AddOverviewConstraints('res2', 'r2', 'res1', 'r1', 2); -- verify if registered correctly in the raster_overviews view -- SELECT o_table_name ot, o_raster_column oc, r_table_name rt, r_raster_column rc, overview_factor f FROM raster_overviews WHERE o_table_name = 'res2'; ot | oc | rt | rc | f ------+----+------+----+--- res2 | r2 | res1 | r1 | 2 (1 row)
DropOverviewConstraints — 取消栅格列作为另一栅格列概览的标记。
boolean DropOverviewConstraints(
name ovschema, name ovtable, name ovcolumn)
;
boolean DropOverviewConstraints(
name ovtable, name ovcolumn)
;
从栅格列中删除用于将其显示为 raster_overviews
栅格目录中另一个栅格列的概述的约束。
当省略 ovschema
参数时,将使用扫描 search_path
找到的第一个表。
可用性: 2.0.0
PostGIS_GDAL_Version — 报告 PostGIS 使用的 GDAL 库的版本。
text PostGIS_GDAL_Version(
)
;
报告 PostGIS 使用的 GDAL 库的版本。 还将检查并报告 GDAL 是否可以找到其数据文件。
SELECT PostGIS_GDAL_Version(); postgis_gdal_version ----------------------------------- GDAL 1.11dev, released 2013/04/13
PostGIS_Raster_Lib_Build_Date — 报告完整的栅格库构建日期。
text PostGIS_Raster_Lib_Build_Date(
)
;
报告栅格构建日期
SELECT PostGIS_Raster_Lib_Build_Date(); postgis_raster_lib_build_date ----------------------------- 2010-04-28 21:15:10
PostGIS_Raster_Lib_Version — 报告完整的栅格版本和构建配置信息。
text PostGIS_Raster_Lib_Version(
)
;
报告完整的栅格版本和构建配置信息。
SELECT PostGIS_Raster_Lib_Version(); postgis_raster_lib_version ----------------------------- 2.0.0
ST_GDALDrivers — 通过 GDAL 返回 PostGIS 支持的栅格格式列表。 ST_AsGDALRaster 仅可使用 can_write=True 的格式
setof record ST_GDALDrivers(
integer OUT idx, text OUT short_name, text OUT long_name, text OUT can_read, text OUT can_write, text OUT create_options)
;
返回 GDAL 支持的每种格式的栅格格式短名称、长名称和创建者选项的列表。 使用短名称作为格式
参数 ST_AsGDALRaster中的输入。 选项根据编译 libgdal 所使用的驱动程序而有所不同。 create_options
返回 XML 格式的 CreationOptionList/Option 集,其中包含特定驱动程序的每个创建者选项的名称和可选type
、description
以及 VALUE
集。
更改:2.5.0 - 添加 can_read 和 can_write 列。
更改:2.0.6、2.1.3 - 默认情况下不启用任何驱动程序,除非设置了 GUC 或环境变量 gdal_enabled_drivers。
可用性:2.0.0 - 需要 GDAL >= 1.6.0。
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL'; SELECT short_name, long_name, can_write FROM st_gdaldrivers() ORDER BY short_name; short_name | long_name | can_write -----------------+-------------------------------------------------------------+----------- AAIGrid | Arc/Info ASCII Grid | t ACE2 | ACE2 | f ADRG | ARC Digitized Raster Graphics | f AIG | Arc/Info Binary Grid | f AirSAR | AirSAR Polarimetric Image | f ARG | Azavea Raster Grid format | t BAG | Bathymetry Attributed Grid | f BIGGIF | Graphics Interchange Format (.gif) | f BLX | Magellan topo (.blx) | t BMP | MS Windows Device Independent Bitmap | f BSB | Maptech BSB Nautical Charts | f PAux | PCI .aux Labelled | f PCIDSK | PCIDSK Database File | f PCRaster | PCRaster Raster File | f PDF | Geospatial PDF | f PDS | NASA Planetary Data System | f PDS4 | NASA Planetary Data System 4 | t PLMOSAIC | Planet Labs Mosaics API | f PLSCENES | Planet Labs Scenes API | f PNG | Portable Network Graphics | t PNM | Portable Pixmap Format (netpbm) | f PRF | Racurs PHOTOMOD PRF | f R | R Object Data Store | t Rasterlite | Rasterlite | t RDA | DigitalGlobe Raster Data Access driver | f RIK | Swedish Grid RIK (.rik) | f RMF | Raster Matrix Format | f ROI_PAC | ROI_PAC raster | f RPFTOC | Raster Product Format TOC format | f RRASTER | R Raster | f RS2 | RadarSat 2 XML Product | f RST | Idrisi Raster A.1 | t SAFE | Sentinel-1 SAR SAFE Product | f SAGA | SAGA GIS Binary Grid (.sdat, .sg-grd-z) | t SAR_CEOS | CEOS SAR Image | f SDTS | SDTS Raster | f SENTINEL2 | Sentinel 2 | f SGI | SGI Image File Format 1.0 | f SNODAS | Snow Data Assimilation System | f SRP | Standard Raster Product (ASRP/USRP) | f SRTMHGT | SRTMHGT File Format | t Terragen | Terragen heightfield | f TIL | EarthWatch .TIL | f TSX | TerraSAR-X Product | f USGSDEM | USGS Optional ASCII DEM (and CDED) | t VICAR | MIPL VICAR file | f VRT | Virtual Raster | t WCS | OGC Web Coverage Service | f WMS | OGC Web Map Service | t WMTS | OGC Web Map Tile Service | t XPM | X11 PixMap Format | t XYZ | ASCII Gridded XYZ | t ZMap | ZMap Plus Grid | t
-- Output the create options XML column of JPEG as a table -- -- Note you can use these creator options in ST_AsGDALRaster options argument SELECT (xpath('@name', g.opt))[1]::text As oname, (xpath('@type', g.opt))[1]::text As otype, (xpath('@description', g.opt))[1]::text As descrip FROM (SELECT unnest(xpath('/CreationOptionList/Option', create_options::xml)) As opt FROM st_gdaldrivers() WHERE short_name = 'JPEG') As g; oname | otype | descrip --------------------+---------+------------------------------------------------- PROGRESSIVE | boolean | whether to generate a progressive JPEG QUALITY | int | good=100, bad=0, default=75 WORLDFILE | boolean | whether to geneate a worldfile INTERNAL_MASK | boolean | whether to generate a validity mask COMMENT | string | Comment SOURCE_ICC_PROFILE | string | ICC profile encoded in Base64 EXIF_THUMBNAIL | boolean | whether to generate an EXIF thumbnail(overview). By default its max dimension will be 128 THUMBNAIL_WIDTH | int | Forced thumbnail width THUMBNAIL_HEIGHT | int | Forced thumbnail height (9 rows)
-- raw xml output for creator options for GeoTiff -- SELECT create_options FROM st_gdaldrivers() WHERE short_name = 'GTiff'; <CreationOptionList> <Option name="COMPRESS" type="string-select"> <Value >NONE</Value> <Value >LZW</Value> <Value >PACKBITS</Value> <Value >JPEG</Value> <Value >CCITTRLE</Value> <Value >CCITTFAX3</Value> <Value >CCITTFAX4</Value> <Value >DEFLATE</Value> </Option> <Option name="PREDICTOR" type="int" description="Predictor Type"/> <Option name="JPEG_QUALITY" type="int" description="JPEG quality 1-100" default="75"/> <Option name="ZLEVEL" type="int" description="DEFLATE compression level 1-9" default="6"/> <Option name="NBITS" type="int" description="BITS for sub-byte files (1-7), sub-uint16 (9-15), sub-uint32 (17-31)"/> <Option name="INTERLEAVE" type="string-select" default="PIXEL"> <Value >BAND</Value> <Value >PIXEL</Value> </Option> <Option name="TILED" type="boolean" description="Switch to tiled format"/> <Option name="TFW" type="boolean" description="Write out world file"/> <Option name="RPB" type="boolean" description="Write out .RPB (RPC) file"/> <Option name="BLOCKXSIZE" type="int" description="Tile Width"/> <Option name="BLOCKYSIZE" type="int" description="Tile/Strip Height"/> <Option name="PHOTOMETRIC" type="string-select"> <Value >MINISBLACK</Value> <Value >MINISWHITE</Value> <Value >PALETTE</Value> <Value >RGB</Value> <Value >CMYK</Value> <Value >YCBCR</Value> <Value >CIELAB</Value> <Value >ICCLAB</Value> <Value >ITULAB</Value> </Option> <Option name="SPARSE_OK" type="boolean" description="Can newly created files have missing blocks?" default="FALSE"/> <Option name="ALPHA" type="boolean" description="Mark first extrasample as being alpha"/> <Option name="PROFILE" type="string-select" default="GDALGeoTIFF"> <Value >GDALGeoTIFF</Value> <Value >GeoTIFF</Value> <Value >BASELINE</Value> </Option> <Option name="PIXELTYPE" type="string-select"> <Value >DEFAULT</Value> <Value >SIGNEDBYTE</Value> </Option> <Option name="BIGTIFF" type="string-select" description="Force creation of BigTIFF file"> <Value >YES</Value> <Value >NO</Value> <Value >IF_NEEDED</Value> <Value >IF_SAFER</Value> </Option> <Option name="ENDIANNESS" type="string-select" default="NATIVE" description="Force endianness of created file. For DEBUG purpose mostly"> <Value >NATIVE</Value> <Value >INVERTED</Value> <Value >LITTLE</Value> <Value >BIG</Value> </Option> <Option name="COPY_SRC_OVERVIEWS" type="boolean" default="NO" description="Force copy of overviews of source dataset (CreateCopy())"/> </CreationOptionList> -- Output the create options XML column for GTiff as a table -- SELECT (xpath('@name', g.opt))[1]::text As oname, (xpath('@type', g.opt))[1]::text As otype, (xpath('@description', g.opt))[1]::text As descrip, array_to_string(xpath('Value/text()', g.opt),', ') As vals FROM (SELECT unnest(xpath('/CreationOptionList/Option', create_options::xml)) As opt FROM st_gdaldrivers() WHERE short_name = 'GTiff') As g; oname | otype | descrip | vals --------------------+---------------+----------------------------------------------------------------------+--------------------------------------------------------------------------- COMPRESS | string-select | | NONE, LZW, PACKBITS, JPEG, CCITTRLE, CCITTFAX3, CCITTFAX4, DEFLATE PREDICTOR | int | Predictor Type | JPEG_QUALITY | int | JPEG quality 1-100 | ZLEVEL | int | DEFLATE compression level 1-9 | NBITS | int | BITS for sub-byte files (1-7), sub-uint16 (9-15), sub-uint32 (17-31) | INTERLEAVE | string-select | | BAND, PIXEL TILED | boolean | Switch to tiled format | TFW | boolean | Write out world file | RPB | boolean | Write out .RPB (RPC) file | BLOCKXSIZE | int | Tile Width | BLOCKYSIZE | int | Tile/Strip Height | PHOTOMETRIC | string-select | | MINISBLACK, MINISWHITE, PALETTE, RGB, CMYK, YCBCR, CIELAB, ICCLAB, ITULAB SPARSE_OK | boolean | Can newly created files have missing blocks? | ALPHA | boolean | Mark first extrasample as being alpha | PROFILE | string-select | | GDALGeoTIFF, GeoTIFF, BASELINE PIXELTYPE | string-select | | DEFAULT, SIGNEDBYTE BIGTIFF | string-select | Force creation of BigTIFF file | YES, NO, IF_NEEDED, IF_SAFER ENDIANNESS | string-select | Force endianness of created file. For DEBUG purpose mostly | NATIVE, INVERTED, LITTLE, BIG COPY_SRC_OVERVIEWS | boolean | Force copy of overviews of source dataset (CreateCopy()) | (19 rows)
ST_Contour — 使用 GDAL 轮廓算法从提供的栅格波段生成一组矢量轮廓。
setof record ST_Contour(
raster rast, integer bandnumber=1, double precision level_interval=100.0, double precision level_base=0.0, double precision[] fixed_levels=ARRAY[], boolean polygonize=false)
;
使用 GDAL 轮廓算法从提供的栅格带生成一组矢量轮廓。
当fixed_levels
参数为非空数组时,level_interval
和level_base
参数被忽略。
输入参数为:
rast
生成等高线的栅格
bandnumber
用于生成等高线的波段
level_interval
生成的等高线之间的高程间隔
level_base
用于应用等高线间隔的 “基准”通常为零,但也可以是不同的值。要生成高程为10米的等高线,间隔为5、15、25、...,LEVEL_BASE 将设为5。
fixed_levels
生成的等高线之间的高程间隔
polygonize
如果 true
,将创建等高线多边形,而不是多边形线。
返回值是一组具有以下属性的记录:
geom
轮廓线的几何形状。
id
GDAL 赋予轮廓线的唯一标识符。
value
该线代表的栅格值。 对于高程 DEM 输入,这将是输出等高线的高程。
可用性:3.2.0
WITH c AS ( SELECT (ST_Contour(rast, 1, fixed_levels => ARRAY[100.0, 200.0, 300.0])).* FROM dem_grid WHERE rid = 1 ) SELECT st_astext(geom), id, value FROM c;
ST_InterpolateRaster — 基于输入的 3 维点集插值网格表面,使用 X 和 Y 值在网格上定位点,并使用点的 Z 值作为表面高程。
raster ST_InterpolateRaster(
geometry input_points, text algorithm_options, raster template, integer template_band_num=1)
;
基于输入的 3 维点集插值网格表面,使用 X 和 Y 值在网格上定位点,并使用点的 Z 值作为表面高程。 有五种可用的插值算法:反距离、反距离最近邻、移动平均、最近邻和线性插值。 有关算法及其参数的更多详细信息,请参阅 gdal_grid 文档。 有关如何计算插值的更多信息,请参阅 GDAL 网格教程。
输入参数为:
input_points
驱动插值的点。 任何具有 Z 值的几何图形都是可接受的,将使用输入中的所有点。
algorithm_options
定义算法和算法选项的字符串,采用 gdal_grid 使用的格式。 例如,对于平滑度为 2 的反距离插值,您可以使用“invdist:smoothing=2.0”
template
用于驱动输出栅格几何形状的栅格模板。 宽度、高度、像素大小、空间范围和像素类型将从该模板中读取。
template_band_num
默认情况下,模板栅格中的第一个波段用于驱动输出栅格,但可以使用此参数进行调整。
可用性:3.2.0
SELECT ST_InterpolateRaster( 'MULTIPOINT(10.5 9.5 1000, 11.5 8.5 1000, 10.5 8.5 500, 11.5 9.5 500)'::geometry, 'invdist:smoothing:2.0', ST_AddBand(ST_MakeEmptyRaster(200, 400, 10, 10, 0.01, -0.005, 0, 0), '16BSI') )
UpdateRasterSRID — 更改用户指定的列和表中所有栅格的 SRID。
raster UpdateRasterSRID(
name schema_name, name table_name, name column_name, integer new_srid)
;
raster UpdateRasterSRID(
name table_name, name column_name, integer new_srid)
;
更改用户指定的列和表中所有栅格的 SRID。 在更改指定列栅格的 SRID 之前,该函数将删除所有适当的列约束(范围、对齐方式和 SRID)。
![]() | |
此函数不会触及栅格的数据(波段像素值)。 仅栅格的元数据发生更改。 |
可用性:2.1.0
ST_CreateOverview — 创建给定栅格覆盖范围的降低分辨率版本。
regclass ST_CreateOverview(
regclass tab, name col, int factor, text algo='NearestNeighbor')
;
使用源表中重新采样的图块创建一个概览表。 输出图块将具有与输入图块相同的大小,并以较低的分辨率覆盖相同的空间范围(像素大小在两个方向上都是原始图块的 1/factor
)。
概览表将在 raster_overviews
目录中提供,并将强制执行栅格约束。
算法选项有:“NearestNeighbor”、“Bilinear”、“Cubic”、“CubicSpline”和“Lanczos”。 有关更多详细信息,请参阅:GDAL Warp 重采样方法。
可用性:2.2.0
输出质量通常较好,但产品格式较慢
SELECT ST_CreateOverview('mydata.mytable'::regclass, 'rast', 2, 'Lanczos');
输出到更快地处理默认最近邻
SELECT ST_CreateOverview('mydata.mytable'::regclass, 'rast', 2);
ST_AddBand — 返回一个栅格,其中在给定索引位置添加了给定类型的新波段和给定初始值。 如果未指定索引,则将带添加到末尾。
(1) raster ST_AddBand(
raster rast, addbandarg[] addbandargset)
;
(2) raster ST_AddBand(
raster rast, integer index, text pixeltype, double precision initialvalue=0, double precision nodataval=NULL)
;
(3) raster ST_AddBand(
raster rast, text pixeltype, double precision initialvalue=0, double precision nodataval=NULL)
;
(4) raster ST_AddBand(
raster torast, raster fromrast, integer fromband=1, integer torastindex=at_end)
;
(5) raster ST_AddBand(
raster torast, raster[] fromrasts, integer fromband=1, integer torastindex=at_end)
;
(6) raster ST_AddBand(
raster rast, integer index, text outdbfile, integer[] outdbindex, double precision nodataval=NULL)
;
(7) raster ST_AddBand(
raster rast, text outdbfile, integer[] outdbindex, integer index=at_end, double precision nodataval=NULL)
;
返回一个栅格,其中在给定位置(索引)、给定类型、给定初始值和给定 nodata 值中添加了新波段。 如果未指定索引,则将带添加到末尾。 如果未指定 fromband
,则假定为 band 1。 像素类型是 ST_BandPixelType 中指定的像素类型之一的字符串表示形式。 如果指定了现有索引,则所有>=该索引的后续波段都会增加 1。如果指定的初始值大于像素类型的最大值,则初始值将设置为像素类型允许的最高值。
对于采用 addbandarg数组的格式(格式 1),特定addbandarg 的索引值与该 addbandarg 描述的波段添加到栅格时的栅格相关。 请参阅下面的多个新波段示例。
对于采用栅格数组的格式(格式 5),如果 torast
为 NULL,则数组中每个栅格的 fromband
波段将累积到新栅格中。
对于采用 outdbfile
的格式(格式6 和 7),该值必须包含栅格文件的完整路径。 该文件还必须可供 postgres 服务器进程访问。
增强:2.1.0 添加了对 addbandarg 的支持。
增强:2.1.0 添加了对新的 out-db波段的支持。
-- Add another band of type 8 bit unsigned integer with pixels initialized to 200 UPDATE dummy_rast SET rast = ST_AddBand(rast,'8BUI'::text,200) WHERE rid = 1;
-- Create an empty raster 100x100 units, with upper left right at 0, add 2 bands (band 1 is 0/1 boolean bit switch, band2 allows values 0-15) -- uses addbandargs INSERT INTO dummy_rast(rid,rast) VALUES(10, ST_AddBand(ST_MakeEmptyRaster(100, 100, 0, 0, 1, -1, 0, 0, 0), ARRAY[ ROW(1, '1BB'::text, 0, NULL), ROW(2, '4BUI'::text, 0, NULL) ]::addbandarg[] ) ); -- output meta data of raster bands to verify all is right -- SELECT (bmd).* FROM (SELECT ST_BandMetaData(rast,generate_series(1,2)) As bmd FROM dummy_rast WHERE rid = 10) AS foo; --result -- pixeltype | nodatavalue | isoutdb | path -----------+----------------+-------------+---------+------ 1BB | | f | 4BUI | | f | -- output meta data of raster - SELECT (rmd).width, (rmd).height, (rmd).numbands FROM (SELECT ST_MetaData(rast) As rmd FROM dummy_rast WHERE rid = 10) AS foo; -- result -- upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands ------------+------------+-------+--------+------------+------------+-------+-------+------+---------- 0 | 0 | 100 | 100 | 1 | -1 | 0 | 0 | 0 | 2
SELECT * FROM ST_BandMetadata( ST_AddBand( ST_MakeEmptyRaster(10, 10, 0, 0, 1, -1, 0, 0, 0), ARRAY[ ROW(NULL, '8BUI', 255, 0), ROW(NULL, '16BUI', 1, 2), ROW(2, '32BUI', 100, 12), ROW(2, '32BF', 3.14, -1) ]::addbandarg[] ), ARRAY[]::integer[] ); bandnum | pixeltype | nodatavalue | isoutdb | path ---------+-----------+-------------+---------+------ 1 | 8BUI | 0 | f | 2 | 32BF | -1 | f | 3 | 32BUI | 12 | f | 4 | 16BUI | 2 | f |
-- Aggregate the 1st band of a table of like rasters into a single raster -- with as many bands as there are test_types and as many rows (new rasters) as there are mice -- NOTE: The ORDER BY test_type is only supported in PostgreSQL 9.0+ -- for 8.4 and below it usually works to order your data in a subselect (but not guaranteed) -- The resulting raster will have a band for each test_type alphabetical by test_type -- For mouse lovers: No mice were harmed in this exercise SELECT mouse, ST_AddBand(NULL, array_agg(rast ORDER BY test_type), 1) As rast FROM mice_studies GROUP BY mouse;
SELECT * FROM ST_BandMetadata( ST_AddBand( ST_MakeEmptyRaster(10, 10, 0, 0, 1, -1, 0, 0, 0), '/home/raster/mytestraster.tif'::text, NULL::int[] ), ARRAY[]::integer[] ); bandnum | pixeltype | nodatavalue | isoutdb | path ---------+-----------+-------------+---------+------ 1 | 8BUI | | t | /home/raster/mytestraster.tif 2 | 8BUI | | t | /home/raster/mytestraster.tif 3 | 8BUI | | t | /home/raster/mytestraster.tif
ST_AsRaster — 将 PostGIS 几何图形转换为 PostGIS 栅格。
raster ST_AsRaster(
geometry geom, raster ref, text pixeltype, double precision value=1, double precision nodataval=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, raster ref, text[] pixeltype=ARRAY['8BUI'], double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], boolean touched=false)
;
raster ST_AsRaster(
geometry geom, double precision scalex, double precision scaley, double precision gridx, double precision gridy, text pixeltype, double precision value=1, double precision nodataval=0, double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, double precision scalex, double precision scaley, double precision gridx=NULL, double precision gridy=NULL, text[] pixeltype=ARRAY['8BUI'], double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, double precision scalex, double precision scaley, text pixeltype, double precision value=1, double precision nodataval=0, double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, double precision scalex, double precision scaley, text[] pixeltype, double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, integer width, integer height, double precision gridx, double precision gridy, text pixeltype, double precision value=1, double precision nodataval=0, double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, integer width, integer height, double precision gridx=NULL, double precision gridy=NULL, text[] pixeltype=ARRAY['8BUI'], double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, integer width, integer height, text pixeltype, double precision value=1, double precision nodataval=0, double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false)
;
raster ST_AsRaster(
geometry geom, integer width, integer height, text[] pixeltype, double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false)
;
将一个 PostGIS 几何对象转换为 PostGIS 栅格。这些不同的变体提供了三组可能性,用于设置生成的栅格的对齐方式和像素大小。
第一组由前两个变体组成,生成具有与所提供的参考栅格相同的对齐方式(scalex
、scaley
、gridx
和 gridy
)、像素类型和节点数据值的栅格。 通常,您可以通过将包含几何图形的表与包含参考栅格的表连接来传递此参考栅格。
第二组,由四个变体组成,允许您通过提供像素大小的参数(scalex
& scaley
以及 skewx
& skewy
)来设置栅格的尺寸。生成的栅格的宽度
& 高度
将根据几何对象的范围进行调整。在大多数情况下,您必须将整数的 scalex
& scaley
参数强制转换为双精度,以便 PostgreSQL 选择正确的变体。
第三组,由四个变体组成,允许您通过提供栅格的尺寸(宽度
& 高度
)来固定栅格的尺寸。生成的栅格的像素大小参数(scalex
& scaley
以及 skewx
& skewy
)将被调整以适应几何对象的范围。
这两个最后两组中的前两个变体允许您使用对齐网格的任意角(gridx
& gridy
)指定对齐方式,而最后两个变体则使用左上角(upperleftx
& upperlefty
)指定对齐方式。
每组变体都允许生成单波段栅格或多波段栅格。 要生成多波段栅格,必须提供像素类型数组 (pixeltype[]
)、初始值数组 (value
) 和 nodata 值数组 (nodataval
)。 如果未提供,pixeltyped 默认为 8BUI,值为 1,nodataval 为 0。
输出栅格将与源几何具有相同的空间参考。 唯一的例外是具有参考栅格的变体。 在这种情况下,生成的栅格将获得与参考栅格相同的 SRID。
可选的参数 touched
默认值为 false,并映射到 GDAL 中的 ALL_TOUCHED 栅格化选项,该选项确定由线或多边形接触的像素是否会被设置值。不仅仅是那些在线渲染路径上的像素,或者它们的中心点位于多边形内的像素。
当与 ST_AsPNG和其他 ST_AsGDALRaster 系列函数结合使用时,这对于直接从数据库渲染几何图形的 jpeg 和 png 特别有用。
可用性:2.0.0 - 需要 GDAL >= 1.6.0。
![]() | |
目前还无法渲染复杂的几何类型,例如曲线、TINS 和多面体曲面,但一旦 GDAL 可以了,也应该可以了。 |
黑色圆圈
-- this will output a black circle taking up 150 x 150 pixels -- SELECT ST_AsPNG(ST_AsRaster(ST_Buffer(ST_Point(1,5),10),150, 150));
仅使用 PostGIS 渲染的缓冲区的示例
-- the bands map to RGB bands - the value (118,154,118) - teal -- SELECT ST_AsPNG( ST_AsRaster( ST_Buffer( ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10,'join=bevel'), 200,200,ARRAY['8BUI', '8BUI', '8BUI'], ARRAY[118,154,118], ARRAY[0,0,0]));
ST_Band — 返回现有栅格的一个或多个波段作为新栅格。 对于从现有栅格构建新栅格非常有用。
raster ST_Band(
raster rast, integer[] nbands = ARRAY[1])
;
raster ST_Band(
raster rast, integer nband)
;
raster ST_Band(
raster rast, text nbands, character delimiter=,)
;
返回现有栅格的一个或多个波段作为新栅格。 对于从现有栅格构建新栅格或仅导出栅格的选定波段或重新排列栅格中波段的顺序非常有用。 如果未指定波段或栅格中不存在任何指定波段,则返回所有波段。 用作各种功能中的辅助功能,例如删除波段。
![]() | |
对于函数的 |
可用性: 2.0.0
-- Make 2 new rasters: 1 containing band 1 of dummy, second containing band 2 of dummy and then reclassified as a 2BUI SELECT ST_NumBands(rast1) As numb1, ST_BandPixelType(rast1) As pix1, ST_NumBands(rast2) As numb2, ST_BandPixelType(rast2) As pix2 FROM ( SELECT ST_Band(rast) As rast1, ST_Reclass(ST_Band(rast,3), '100-200):1, [200-254:2', '2BUI') As rast2 FROM dummy_rast WHERE rid = 2) As foo; numb1 | pix1 | numb2 | pix2 -------+------+-------+------ 1 | 8BUI | 1 | 2BUI
-- Return bands 2 and 3. Using array cast syntax SELECT ST_NumBands(ST_Band(rast, '{2,3}'::int[])) As num_bands FROM dummy_rast WHERE rid=2; num_bands ---------- 2 -- Return bands 2 and 3. Use array to define bands SELECT ST_NumBands(ST_Band(rast, ARRAY[2,3])) As num_bands FROM dummy_rast WHERE rid=2;
![]() 原始(列栅格) | ![]() 双波段 | ![]() 单波段 |
--Make a new raster with 2nd band of original and 1st band repeated twice, and another with just the third band SELECT rast, ST_Band(rast, ARRAY[2,1,1]) As dupe_band, ST_Band(rast, 3) As sing_band FROM samples.than_chunked WHERE rid=35;
ST_MakeEmptyCoverage — 用空栅格图块网格覆盖地理参考区域。
raster ST_MakeEmptyCoverage(
integer tilewidth, integer tileheight, integer width, integer height, double precision upperleftx, double precision upperlefty, double precision scalex, double precision scaley, double precision skewx, double precision skewy, integer srid=unknown)
;
使用 ST_MakeEmptyRaster 创建一组栅格瓦片。栅格维度由宽度(width
)& 高度(height
)确定,而瓦片维度则由瓦片宽度(tilewidth
)& 瓦片高度(tileheight
)确定。覆盖的地理参考区域从左上角(upperleftx
,upperlefty
)延伸到右下角(upperleftx
+ width
* scalex
,upperlefty
+ height
* scaley
)。
![]() | |
请注意,对于栅格,scaley 通常为负值,scalex 通常为正值。 所以右下角的 y 值会比左上角低,x 值会比左上角高。 |
可用性:2.4.0
在 4x4 网格中创建 16 个图块,以覆盖从左上角 (22, 77) 到右下角 (55, 33) 的 WGS84 区域。
SELECT (ST_MetaData(tile)).* FROM ST_MakeEmptyCoverage(1, 1, 4, 4, 22, 33, (55 - 22)/(4)::float, (33 - 77)/(4)::float, 0., 0., 4326) tile; upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands ------------------------------------------------------------------------------------- 22 | 33 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 30.25 | 33 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 38.5 | 33 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 46.75 | 33 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 22 | 22 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 30.25 | 22 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 38.5 | 22 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 46.75 | 22 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 22 | 11 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 30.25 | 11 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 38.5 | 11 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 46.75 | 11 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 22 | 0 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 30.25 | 0 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 38.5 | 0 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0 46.75 | 0 | 1 | 1 | 8.25 | -11 | 0 | 0 | 4326 | 0
ST_MakeEmptyRaster — 返回一个空白栅格(不包含波段),其具有给定的尺寸(宽度和高度)、左上角 X 和 Y 坐标、像素大小和旋转参数(scalex、scaley、skewx 和 skewy),以及参考系统(SRID)。如果传递了一个栅格,则返回一个具有相同大小、对齐方式和 SRID 的新栅格。如果省略了 SRID,则空间参考将设置为未知(0)。
raster ST_MakeEmptyRaster(
raster rast)
;
raster ST_MakeEmptyRaster(
integer width, integer height, float8 upperleftx, float8 upperlefty, float8 scalex, float8 scaley, float8 skewx, float8 skewy, integer srid=unknown)
;
raster ST_MakeEmptyRaster(
integer width, integer height, float8 upperleftx, float8 upperlefty, float8 pixelsize)
;
返回一个空白栅格(没有波段),其具有给定的尺寸(宽度和高度)并以空间(或世界)坐标进行地理参考,具有左上角 X 坐标(upperleftx)、左上角 Y 坐标(upperlefty)、像素大小和旋转参数(scalex、scaley、skewx 和 skewy),以及参考系统(SRID)。
最后一个版本使用单个参数来指定像素大小(pixelsize)。 scalex 设置为此参数,scaley 设置为此参数的负值。 skewx 和 skewy 设置为 0。
如果传入现有栅格,它将返回具有相同元数据设置(不带波段)的新栅格。
如果未指定 srid,则默认为 0。创建空栅格后,您可能想要向其中添加波段并可能对其进行编辑。 参考 ST_AddBand定义波段,参考 ST_SetValue设置初始像素值。
INSERT INTO dummy_rast(rid,rast) VALUES(3, ST_MakeEmptyRaster( 100, 100, 0.0005, 0.0005, 1, 1, 0, 0, 4326) ); --use an existing raster as template for new raster INSERT INTO dummy_rast(rid,rast) SELECT 4, ST_MakeEmptyRaster(rast) FROM dummy_rast WHERE rid = 3; -- output meta data of rasters we just added SELECT rid, (md).* FROM (SELECT rid, ST_MetaData(rast) As md FROM dummy_rast WHERE rid IN(3,4)) As foo; -- output -- rid | upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands -----+------------+------------+-------+--------+------------+------------+-------+-------+------+---------- 3 | 0.0005 | 0.0005 | 100 | 100 | 1 | 1 | 0 | 0 | 4326 | 0 4 | 0.0005 | 0.0005 | 100 | 100 | 1 | 1 | 0 | 0 | 4326 | 0
ST_AddBand, ST_MetaData, ST_ScaleX, ST_ScaleY, ST_SetValue, ST_SkewX, , ST_SkewY
ST_Tile — 返回根据输出栅格的所需维度分割输入栅格而产生的一组栅格。
setof raster ST_Tile(
raster rast, int[] nband, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL)
;
setof raster ST_Tile(
raster rast, integer nband, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL)
;
setof raster ST_Tile(
raster rast, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL)
;
返回根据输出栅格的所需维度分割输入栅格而产生的一组栅格。
如果 padwithnodata
= FALSE,则栅格右侧和底侧的边缘切片可能具有与其余切片不同的维度。 如果 padwithnodata
= TRUE,则所有图块将具有相同的维度,并且边缘图块可能会用 NODATA 值填充。 如果栅格波段未指定 NODATA 值,则可以通过设置 nodataval
来指定 NODATA 值。
![]() | |
如果输入栅格的指定波段处于数据库外,则输出栅格中的相应波段也将处于数据库外。 |
可用性:2.1.0
WITH foo AS ( SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0), 2, '8BUI', 10, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 3, 0, 1, -1, 0, 0, 0), 1, '8BUI', 2, 0), 2, '8BUI', 20, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 6, 0, 1, -1, 0, 0, 0), 1, '8BUI', 3, 0), 2, '8BUI', 30, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, -3, 1, -1, 0, 0, 0), 1, '8BUI', 4, 0), 2, '8BUI', 40, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 3, -3, 1, -1, 0, 0, 0), 1, '8BUI', 5, 0), 2, '8BUI', 50, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 6, -3, 1, -1, 0, 0, 0), 1, '8BUI', 6, 0), 2, '8BUI', 60, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, -6, 1, -1, 0, 0, 0), 1, '8BUI', 7, 0), 2, '8BUI', 70, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 3, -6, 1, -1, 0, 0, 0), 1, '8BUI', 8, 0), 2, '8BUI', 80, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 6, -6, 1, -1, 0, 0, 0), 1, '8BUI', 9, 0), 2, '8BUI', 90, 0) AS rast ), bar AS ( SELECT ST_Union(rast) AS rast FROM foo ), baz AS ( SELECT ST_Tile(rast, 3, 3, TRUE) AS rast FROM bar ) SELECT ST_DumpValues(rast) FROM baz; st_dumpvalues ------------------------------------------ (1,"{{1,1,1},{1,1,1},{1,1,1}}") (2,"{{10,10,10},{10,10,10},{10,10,10}}") (1,"{{2,2,2},{2,2,2},{2,2,2}}") (2,"{{20,20,20},{20,20,20},{20,20,20}}") (1,"{{3,3,3},{3,3,3},{3,3,3}}") (2,"{{30,30,30},{30,30,30},{30,30,30}}") (1,"{{4,4,4},{4,4,4},{4,4,4}}") (2,"{{40,40,40},{40,40,40},{40,40,40}}") (1,"{{5,5,5},{5,5,5},{5,5,5}}") (2,"{{50,50,50},{50,50,50},{50,50,50}}") (1,"{{6,6,6},{6,6,6},{6,6,6}}") (2,"{{60,60,60},{60,60,60},{60,60,60}}") (1,"{{7,7,7},{7,7,7},{7,7,7}}") (2,"{{70,70,70},{70,70,70},{70,70,70}}") (1,"{{8,8,8},{8,8,8},{8,8,8}}") (2,"{{80,80,80},{80,80,80},{80,80,80}}") (1,"{{9,9,9},{9,9,9},{9,9,9}}") (2,"{{90,90,90},{90,90,90},{90,90,90}}") (18 rows)
WITH foo AS ( SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0), 2, '8BUI', 10, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 3, 0, 1, -1, 0, 0, 0), 1, '8BUI', 2, 0), 2, '8BUI', 20, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 6, 0, 1, -1, 0, 0, 0), 1, '8BUI', 3, 0), 2, '8BUI', 30, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, -3, 1, -1, 0, 0, 0), 1, '8BUI', 4, 0), 2, '8BUI', 40, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 3, -3, 1, -1, 0, 0, 0), 1, '8BUI', 5, 0), 2, '8BUI', 50, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 6, -3, 1, -1, 0, 0, 0), 1, '8BUI', 6, 0), 2, '8BUI', 60, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, -6, 1, -1, 0, 0, 0), 1, '8BUI', 7, 0), 2, '8BUI', 70, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 3, -6, 1, -1, 0, 0, 0), 1, '8BUI', 8, 0), 2, '8BUI', 80, 0) AS rast UNION ALL SELECT ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 6, -6, 1, -1, 0, 0, 0), 1, '8BUI', 9, 0), 2, '8BUI', 90, 0) AS rast ), bar AS ( SELECT ST_Union(rast) AS rast FROM foo ), baz AS ( SELECT ST_Tile(rast, 3, 3, 2) AS rast FROM bar ) SELECT ST_DumpValues(rast) FROM baz; st_dumpvalues ------------------------------------------ (1,"{{10,10,10},{10,10,10},{10,10,10}}") (1,"{{20,20,20},{20,20,20},{20,20,20}}") (1,"{{30,30,30},{30,30,30},{30,30,30}}") (1,"{{40,40,40},{40,40,40},{40,40,40}}") (1,"{{50,50,50},{50,50,50},{50,50,50}}") (1,"{{60,60,60},{60,60,60},{60,60,60}}") (1,"{{70,70,70},{70,70,70},{70,70,70}}") (1,"{{80,80,80},{80,80,80},{80,80,80}}") (1,"{{90,90,90},{90,90,90},{90,90,90}}") (9 rows)
ST_Retile — 从任意平铺的栅格覆盖范围返回一组配置的平铺。
SETOF raster ST_Retile(
regclass tab, name col, geometry ext, float8 sfx, float8 sfy, int tw, int th, text algo='NearestNeighbor')
;
返回一组具有指定比例 (sfx
, sfy
) 和最大尺寸 (tw
, th
) 并使用来自指定栅格覆盖范围 (tab
, col
) 的数据覆盖指定范围 (ext
) 的图块。
算法选项有:“NearestNeighbor”、“Bilinear”、“Cubic”、“CubicSpline”和“Lanczos”。 有关更多详细信息,请参阅:GDAL Warp 重采样方法。
可用性:2.2.0
ST_FromGDALRaster — 从受支持的 GDAL 栅格文件返回栅格。
raster ST_FromGDALRaster(
bytea gdaldata, integer srid=NULL)
;
从受支持的 GDAL 栅格文件返回栅格。 gdaldata
是 bytea 类型,应该是 GDAL 栅格文件的内容。
如果 srid
为 NULL,该函数将尝试自动从 GDAL 栅格分配 SRID。 如果提供了 srid
,则提供的值将覆盖任何自动分配的 SRID。
可用性:2.1.0
WITH foo AS ( SELECT ST_AsPNG(ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 0.1, -0.1, 0, 0, 4326), 1, '8BUI', 1, 0), 2, '8BUI', 2, 0), 3, '8BUI', 3, 0)) AS png ), bar AS ( SELECT 1 AS rid, ST_FromGDALRaster(png) AS rast FROM foo UNION ALL SELECT 2 AS rid, ST_FromGDALRaster(png, 3310) AS rast FROM foo ) SELECT rid, ST_Metadata(rast) AS metadata, ST_SummaryStats(rast, 1) AS stats1, ST_SummaryStats(rast, 2) AS stats2, ST_SummaryStats(rast, 3) AS stats3 FROM bar ORDER BY rid; rid | metadata | stats1 | stats2 | stats3 -----+---------------------------+---------------+---------------+---------------- 1 | (0,0,2,2,1,-1,0,0,0,3) | (4,4,1,0,1,1) | (4,8,2,0,2,2) | (4,12,3,0,3,3) 2 | (0,0,2,2,1,-1,0,0,3310,3) | (4,4,1,0,1,1) | (4,8,2,0,2,2) | (4,12,3,0,3,3) (2 rows)
ST_GeoReference — 返回 GDAL 或 ESRI 格式的地理配准元数据,如世界文件中常见的格式。 默认为 GDAL。
text ST_GeoReference(
raster rast, text format=GDAL)
;
返回地理配准元数据,包括 GDAL 或 ESRI 格式的回车符,如世界文件中常见的那样。 如果未指定类型,则默认为 GDAL。 类型是字符串“GDAL”或“ESRI”。
格式表示的区别如下:
GDAL
:
scalex skewy skewx scaley upperleftx upperlefty
ESRI
:
scalex skewy skewx scaley upperleftx + scalex*0.5 upperlefty + scaley*0.5
SELECT ST_GeoReference(rast, 'ESRI') As esri_ref, ST_GeoReference(rast, 'GDAL') As gdal_ref FROM dummy_rast WHERE rid=1; esri_ref | gdal_ref --------------+-------------- 2.0000000000 | 2.0000000000 0.0000000000 : 0.0000000000 0.0000000000 : 0.0000000000 3.0000000000 : 3.0000000000 1.5000000000 : 0.5000000000 2.0000000000 : 0.5000000000
ST_Height — 返回栅格的高度(以像素为单位)。
integer ST_Height(
raster rast)
;
返回栅格的高度(以像素为单位)。
SELECT rid, ST_Height(rast) As rastheight FROM dummy_rast; rid | rastheight -----+------------ 1 | 20 2 | 5
ST_IsEmpty — 如果栅格为空(宽度 = 0 且高度 = 0),则返回 true。 否则,返回 false。
boolean ST_IsEmpty(
raster rast)
;
如果栅格为空(宽度 = 0 且高度 = 0),则返回 true。 否则,返回 false。
可用性: 2.0.0
SELECT ST_IsEmpty(ST_MakeEmptyRaster(100, 100, 0, 0, 0, 0, 0, 0)) st_isempty | -----------+ f | SELECT ST_IsEmpty(ST_MakeEmptyRaster(0, 0, 0, 0, 0, 0, 0, 0)) st_isempty | -----------+ t |
ST_MemSize — 返回栅格占用的空间量(以字节为单位)。
integer ST_MemSize(
raster rast)
;
返回栅格占用的空间量(以字节为单位)。
这是对 PostgreSQL 内置函数 pg_column_size、pg_size_pretty、pg_relation_size、pg_total_relation_size 的一个很好的补充。
![]() | |
给出表的字节大小的 pg_relation_size 可能返回小于 ST_MemSize 的字节大小。 这是因为 pg_relation_size 不会添加 toasted 表贡献,并且大型几何图形存储在 TOAST 表中。 pg_column_size 可能返回较低的值,因为它返回压缩后的大小。 pg_total_relation_size - 包括表、压缩表和索引。 |
可用性:2.2.0
SELECT ST_MemSize(ST_AsRaster(ST_Buffer(ST_Point(1,5),10,1000),150, 150, '8BUI')) As rast_mem; rast_mem -------- 22568
ST_MetaData — 返回有关栅格对象的基本元数据,例如像素大小、旋转(倾斜)、左上、左下等。
record ST_MetaData(
raster rast)
;
返回有关栅格对象的基本元数据,例如像素大小、旋转(倾斜)、左上、左下等。返回的列: upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands
SELECT rid, (foo.md).* FROM (SELECT rid, ST_MetaData(rast) As md FROM dummy_rast) As foo; rid | upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands ----+------------+------------+-------+--------+--------+-----------+-------+-------+------+------- 1 | 0.5 | 0.5 | 10 | 20 | 2 | 3 | 0 | 0 | 0 | 0 2 | 3427927.75 | 5793244 | 5 | 5 | 0.05 | -0.05 | 0 | 0 | 0 | 3
ST_NumBands — 返回栅格对象中的波段数。
integer ST_NumBands(
raster rast)
;
返回栅格对象中的波段数。
SELECT rid, ST_NumBands(rast) As numbands FROM dummy_rast; rid | numbands ----+---------- 1 | 0 2 | 3
ST_PixelHeight — 返回空间参考系统的几何单位的像素高度。
double precision ST_PixelHeight(
raster rast)
;
SELECT ST_Height(rast) As rastheight, ST_PixelHeight(rast) As pixheight, ST_ScaleX(rast) As scalex, ST_ScaleY(rast) As scaley, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy FROM dummy_rast; rastheight | pixheight | scalex | scaley | skewx | skewy ------------+-----------+--------+--------+-------+---------- 20 | 3 | 2 | 3 | 0 | 0 5 | 0.05 | 0.05 | -0.05 | 0 | 0
SELECT ST_Height(rast) As rastheight, ST_PixelHeight(rast) As pixheight, ST_ScaleX(rast) As scalex, ST_ScaleY(rast) As scaley, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy FROM (SELECT ST_SetSKew(rast,0.5,0.5) As rast FROM dummy_rast) As skewed; rastheight | pixheight | scalex | scaley | skewx | skewy -----------+-------------------+--------+--------+-------+---------- 20 | 3.04138126514911 | 2 | 3 | 0.5 | 0.5 5 | 0.502493781056044 | 0.05 | -0.05 | 0.5 | 0.5
ST_PixelWidth — 返回空间参考系统的几何单位的像素宽度。
double precision ST_PixelWidth(
raster rast)
;
返回空间参考系统的几何单位中像素的宽度。 在没有倾斜的常见情况下,像素宽度只是几何坐标与光栅像素之间的比例。
下图展示了这种关系:
像素宽度:i方向的像素大小
像素高度:j方向的像素大小
SELECT ST_Width(rast) As rastwidth, ST_PixelWidth(rast) As pixwidth, ST_ScaleX(rast) As scalex, ST_ScaleY(rast) As scaley, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy FROM dummy_rast; rastwidth | pixwidth | scalex | scaley | skewx | skewy -----------+----------+--------+--------+-------+---------- 10 | 2 | 2 | 3 | 0 | 0 5 | 0.05 | 0.05 | -0.05 | 0 | 0
SELECT ST_Width(rast) As rastwidth, ST_PixelWidth(rast) As pixwidth, ST_ScaleX(rast) As scalex, ST_ScaleY(rast) As scaley, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy FROM (SELECT ST_SetSkew(rast,0.5,0.5) As rast FROM dummy_rast) As skewed; rastwidth | pixwidth | scalex | scaley | skewx | skewy -----------+-------------------+--------+--------+-------+---------- 10 | 2.06155281280883 | 2 | 3 | 0.5 | 0.5 5 | 0.502493781056044 | 0.05 | -0.05 | 0.5 | 0.5
ST_ScaleX — 返回像素宽度的 X 分量(以坐标参考系为单位)。
float8 ST_ScaleX(
raster rast)
;
SELECT rid, ST_ScaleX(rast) As rastpixwidth FROM dummy_rast; rid | rastpixwidth -----+-------------- 1 | 2 2 | 0.05
ST_ScaleY — 返回像素高度的 Y 分量(以坐标参考系为单位)。
float8 ST_ScaleY(
raster rast)
;
SELECT rid, ST_ScaleY(rast) As rastpixheight FROM dummy_rast; rid | rastpixheight -----+--------------- 1 | 3 2 | -0.05
ST_RasterToWorldCoord — 在给定列和行的情况下,以几何 X 和 Y(经度和纬度)形式返回栅格的左上角。 列和行从 1 开始。
record ST_RasterToWorldCoord(
raster rast, integer xcolumn, integer yrow)
;
在给定列和行的情况下,以几何 X 和 Y(经度和纬度)形式返回左上角。 返回的 X 和 Y 采用地理参考栅格的几何单位。 列和行的编号从 1 开始,但如果向任一参数传递零、负数或大于栅格相应维度的数字,则假定栅格网格适用于栅格边界之外,它将返回栅格外部的坐标 。
可用性:2.1.0
-- non-skewed raster SELECT rid, (ST_RasterToWorldCoord(rast,1, 1)).*, (ST_RasterToWorldCoord(rast,2, 2)).* FROM dummy_rast rid | longitude | latitude | longitude | latitude -----+------------+----------+-----------+------------ 1 | 0.5 | 0.5 | 2.5 | 3.5 2 | 3427927.75 | 5793244 | 3427927.8 | 5793243.95
-- skewed raster SELECT rid, (ST_RasterToWorldCoord(rast, 1, 1)).*, (ST_RasterToWorldCoord(rast, 2, 3)).* FROM ( SELECT rid, ST_SetSkew(rast, 100.5, 0) As rast FROM dummy_rast ) As foo rid | longitude | latitude | longitude | latitude -----+------------+----------+-----------+----------- 1 | 0.5 | 0.5 | 203.5 | 6.5 2 | 3427927.75 | 5793244 | 3428128.8 | 5793243.9
ST_RasterToWorldCoordX — 返回栅格、列和行左上角的几何 X 坐标。 列和行的编号从 1 开始。
float8 ST_RasterToWorldCoordX(
raster rast, integer xcolumn)
;
float8 ST_RasterToWorldCoordX(
raster rast, integer xcolumn, integer yrow)
;
返回栅格列中一行的左上角 X 坐标,以地理参考栅格的几何单位表示。列和行的编号从1开始,但如果传入一个负数或大于栅格中列的数量的数字,它将给出栅格文件外部左侧或右侧的坐标,假设倾斜度和像素大小与所选的栅格相同。
![]() | |
对于非倾斜栅格,提供 X 列就足够了。 对于倾斜栅格,地理参考坐标是 ST_ScaleX 和 ST_SkewX 以及行和列的函数。 如果您只为倾斜栅格提供 X 列,则会出现错误。 |
更改:2.1.0 在之前的版本中,这称为 ST_Raster2WorldCoordX
-- non-skewed raster providing column is sufficient SELECT rid, ST_RasterToWorldCoordX(rast,1) As x1coord, ST_RasterToWorldCoordX(rast,2) As x2coord, ST_ScaleX(rast) As pixelx FROM dummy_rast; rid | x1coord | x2coord | pixelx -----+------------+-----------+-------- 1 | 0.5 | 2.5 | 2 2 | 3427927.75 | 3427927.8 | 0.05
-- for fun lets skew it SELECT rid, ST_RasterToWorldCoordX(rast, 1, 1) As x1coord, ST_RasterToWorldCoordX(rast, 2, 3) As x2coord, ST_ScaleX(rast) As pixelx FROM (SELECT rid, ST_SetSkew(rast, 100.5, 0) As rast FROM dummy_rast) As foo; rid | x1coord | x2coord | pixelx -----+------------+-----------+-------- 1 | 0.5 | 203.5 | 2 2 | 3427927.75 | 3428128.8 | 0.05
ST_RasterToWorldCoordY — 返回栅格、列和行的左上角的几何 Y 坐标。 列和行的编号从 1 开始。
float8 ST_RasterToWorldCoordY(
raster rast, integer yrow)
;
float8 ST_RasterToWorldCoordY(
raster rast, integer xcolumn, integer yrow)
;
以地理参考栅格的几何单位返回栅格列行的左上角 Y 坐标。 列和行的编号从 1 开始,但如果您传入负数或高于栅格中的列/行数的数字,它会为您提供栅格文件外部向左或向右的坐标,并假设倾斜和像素 尺寸与选定的栅格图块相同。
![]() | |
对于非倾斜栅格,提供 Y 列就足够了。 对于倾斜栅格,地理参考坐标是 ST_ScaleY 和 ST_SkewY 以及行和列的函数。 如果您仅给出倾斜栅格的 Y 行,则会出现错误。 |
更改:2.1.0 在之前的版本中,这称为 ST_Raster2WorldCoordY
-- non-skewed raster providing row is sufficient SELECT rid, ST_RasterToWorldCoordY(rast,1) As y1coord, ST_RasterToWorldCoordY(rast,3) As y2coord, ST_ScaleY(rast) As pixely FROM dummy_rast; rid | y1coord | y2coord | pixely -----+---------+-----------+-------- 1 | 0.5 | 6.5 | 3 2 | 5793244 | 5793243.9 | -0.05
-- for fun lets skew it SELECT rid, ST_RasterToWorldCoordY(rast,1,1) As y1coord, ST_RasterToWorldCoordY(rast,2,3) As y2coord, ST_ScaleY(rast) As pixely FROM (SELECT rid, ST_SetSkew(rast,0,100.5) As rast FROM dummy_rast) As foo; rid | y1coord | y2coord | pixely -----+---------+-----------+-------- 1 | 0.5 | 107 | 3 2 | 5793244 | 5793344.4 | -0.05
ST_Rotation — 返回栅格的旋转弧度。
float8 ST_Rotation(
raster rast)
;
返回栅格的均匀旋转弧度。 如果栅格没有均匀旋转,则返回 NaN。 有关更多详细信息,请参阅 世界文件。
SELECT rid, ST_Rotation(ST_SetScale(ST_SetSkew(rast, sqrt(2)), sqrt(2))) as rot FROM dummy_rast; rid | rot -----+------------------- 1 | 0.785398163397448 2 | 0.785398163397448
ST_SkewX — 返回地理参考 X 倾斜(或旋转参数)。
float8 ST_SkewX(
raster rast)
;
返回地理参考 X 倾斜(或旋转参数)。 有关更多详细信息,请参阅世界文件。
SELECT rid, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy, ST_GeoReference(rast) as georef FROM dummy_rast; rid | skewx | skewy | georef -----+-------+-------+-------------------- 1 | 0 | 0 | 2.0000000000 : 0.0000000000 : 0.0000000000 : 3.0000000000 : 0.5000000000 : 0.5000000000 : 2 | 0 | 0 | 0.0500000000 : 0.0000000000 : 0.0000000000 : -0.0500000000 : 3427927.7500000000 : 5793244.0000000000
ST_SkewY — 返回地理参考 Y 倾斜(或旋转参数)。
float8 ST_SkewY(
raster rast)
;
返回地理参考 Y 倾斜(或旋转参数)。 有关更多详细信息,请参阅世界文件。
SELECT rid, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy, ST_GeoReference(rast) as georef FROM dummy_rast; rid | skewx | skewy | georef -----+-------+-------+-------------------- 1 | 0 | 0 | 2.0000000000 : 0.0000000000 : 0.0000000000 : 3.0000000000 : 0.5000000000 : 0.5000000000 : 2 | 0 | 0 | 0.0500000000 : 0.0000000000 : 0.0000000000 : -0.0500000000 : 3427927.7500000000 : 5793244.0000000000
ST_SRID — 返回在spatial_ref_sys表中定义的栅格的空间参考标识符。
integer ST_SRID(
raster rast)
;
返回在 Spatial_ref_sys 表中定义的栅格对象的空间参考标识符。
![]() | |
从 PostGIS 2.0 开始,非地理参考栅格/几何图形的 srid 为 0,而不是之前的 -1。 |
SELECT ST_SRID(rast) As srid FROM dummy_rast WHERE rid=1; srid ---------------- 0
ST_Summary — 返回栅格内容的文本摘要。
text ST_Summary(
raster rast)
;
返回栅格内容的文本摘要。
可用性:2.1.0
SELECT ST_Summary( ST_AddBand( ST_AddBand( ST_AddBand( ST_MakeEmptyRaster(10, 10, 0, 0, 1, -1, 0, 0, 0) , 1, '8BUI', 1, 0 ) , 2, '32BF', 0, -9999 ) , 3, '16BSI', 0, NULL ) ); st_summary ------------------------------------------------------------------ Raster of 10x10 pixels has 3 bands and extent of BOX(0 -10,10 0)+ band 1 of pixtype 8BUI is in-db with NODATA value of 0 + band 2 of pixtype 32BF is in-db with NODATA value of -9999 + band 3 of pixtype 16BSI is in-db with no NODATA value (1 row)
ST_UpperLeftX — 返回投影空间参考中栅格的左上角 X 坐标。
float8 ST_UpperLeftX(
raster rast)
;
返回投影空间参考中栅格的左上角 X 坐标。
SELECt rid, ST_UpperLeftX(rast) As ulx FROM dummy_rast; rid | ulx -----+------------ 1 | 0.5 2 | 3427927.75
ST_UpperLeftY — 返回投影空间参考中栅格的左上角 Y 坐标。
float8 ST_UpperLeftY(
raster rast)
;
返回投影空间参考中栅格的左上角 Y 坐标。
SELECT rid, ST_UpperLeftY(rast) As uly FROM dummy_rast; rid | uly -----+--------- 1 | 0.5 2 | 5793244
ST_Width — 返回栅格的宽度(以像素为单位)。
integer ST_Width(
raster rast)
;
返回栅格的宽度(以像素为单位)。
SELECT ST_Width(rast) As rastwidth FROM dummy_rast WHERE rid=1; rastwidth ---------------- 10
ST_WorldToRasterCoord — 给定几何 X 和 Y(经度和纬度)或以栅格的空间参考坐标系表示的点几何,将左上角作为列和行返回。
record ST_WorldToRasterCoord(
raster rast, geometry pt)
;
record ST_WorldToRasterCoord(
raster rast, double precision longitude, double precision latitude)
;
在给定几何 X 和 Y(经度和纬度)或点几何的情况下,将左上角作为列和行返回。 无论几何 X 和 Y 或点几何是否位于栅格范围之外,此函数都会起作用。 几何X和Y必须在栅格的空间参考坐标系中表示。
可用性:2.1.0
SELECT rid, (ST_WorldToRasterCoord(rast,3427927.8,20.5)).*, (ST_WorldToRasterCoord(rast,ST_GeomFromText('POINT(3427927.8 20.5)',ST_SRID(rast)))).* FROM dummy_rast; rid | columnx | rowy | columnx | rowy -----+---------+-----------+---------+----------- 1 | 1713964 | 7 | 1713964 | 7 2 | 2 | 115864471 | 2 | 115864471
ST_WorldToRasterCoordX — 返回栅格中点几何 (pt) 的列或以栅格世界空间参考系表示的 X 和 Y 世界坐标 (xw, yw)。
integer ST_WorldToRasterCoordX(
raster rast, geometry pt)
;
integer ST_WorldToRasterCoordX(
raster rast, double precision xw)
;
integer ST_WorldToRasterCoordX(
raster rast, double precision xw, double precision yw)
;
返回点几何 (pt) 或 X 和 Y 世界坐标 (xw, yw) 的栅格中的列。 一个点,或者(如果栅格倾斜,则需要 xw 和 yw 世界坐标)。 如果栅格没有倾斜,则 xw 就足够了。 世界坐标位于栅格的空间参考坐标系中。
更改:2.1.0 在之前的版本中,这称为 ST_World2RasterCoordX
SELECT rid, ST_WorldToRasterCoordX(rast,3427927.8) As xcoord, ST_WorldToRasterCoordX(rast,3427927.8,20.5) As xcoord_xwyw, ST_WorldToRasterCoordX(rast,ST_GeomFromText('POINT(3427927.8 20.5)',ST_SRID(rast))) As ptxcoord FROM dummy_rast; rid | xcoord | xcoord_xwyw | ptxcoord -----+---------+---------+---------- 1 | 1713964 | 1713964 | 1713964 2 | 1 | 1 | 1
ST_WorldToRasterCoordY — 返回点几何图形 (pt) 的栅格中的行或以栅格的世界空间参考系表示的 X 和 Y 世界坐标 (xw, yw)。
integer ST_WorldToRasterCoordY(
raster rast, geometry pt)
;
integer ST_WorldToRasterCoordY(
raster rast, double precision xw)
;
integer ST_WorldToRasterCoordY(
raster rast, double precision xw, double precision yw)
;
返回点几何 (pt) 或 X 和 Y 世界坐标 (xw, yw) 的栅格中的行。 一个点,或者(如果栅格倾斜,则需要 xw 和 yw 世界坐标)。 如果栅格没有倾斜,则 xw 就足够了。 世界坐标位于栅格的空间参考坐标系中。
更改:2.1.0 在之前的版本中,这称为 ST_World2RasterCoordY
SELECT rid, ST_WorldToRasterCoordY(rast,20.5) As ycoord, ST_WorldToRasterCoordY(rast,3427927.8,20.5) As ycoord_xwyw, ST_WorldToRasterCoordY(rast,ST_GeomFromText('POINT(3427927.8 20.5)',ST_SRID(rast))) As ptycoord FROM dummy_rast; rid | ycoord | ycoord_xwyw | ptycoord -----+-----------+-------------+----------- 1 | 7 | 7 | 7 2 | 115864471 | 115864471 | 115864471
ST_BandMetaData — 返回特定栅格波段的基本元数据。 如果未指定,则假定波段编号为 1。
(1) record ST_BandMetaData(
raster rast, integer band=1)
;
(2) record ST_BandMetaData(
raster rast, integer[] band)
;
返回有关栅格波段的基本元数据。 返回的列:pixeltype、nodatavalue、isoutdb、path、outdbbandnum、filesize、filetimestamp。
![]() | |
如果栅格不包含波段,则会引发错误。 |
![]() | |
如果 band 没有 NODATA 值,则 nodatavalue 为 NULL。 |
![]() | |
如果 isoutdb 为 False,则路径、outdbbandnum、文件大小和文件时间戳为 NULL。 如果禁用 outdb 访问,则文件大小和文件时间戳也将为 NULL。 |
增强:2.5.0 包括 outdbbandnum、文件大小和文件时间戳 for outdb 栅格。
SELECT rid, (foo.md).* FROM ( SELECT rid, ST_BandMetaData(rast, 1) AS md FROM dummy_rast WHERE rid=2 ) As foo; rid | pixeltype | nodatavalue | isoutdb | path | outdbbandnum -----+-----------+---- --------+---------+------+-------------- 2 | 8BUI | 0 | f | |
WITH foo AS ( SELECT ST_AddBand(NULL::raster, '/home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif', NULL::int[]) AS rast ) SELECT * FROM ST_BandMetadata( (SELECT rast FROM foo), ARRAY[1,3,2]::int[] ); bandnum | pixeltype | nodatavalue | isoutdb | path | outdbbandnum | filesize | filetimestamp | ---------+-----------+-------------+---------+--------------------------------------------------------------------------------+---------------+----------+---------------+- 1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 | 12345 | 1521807257 | 3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3 | 12345 | 1521807257 | 2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 2 | 12345 | 1521807257 |
ST_BandNoDataValue — 返回表示无数据的给定波段中的值。如果没有指定波段编号,默认为波段1。
double precision ST_BandNoDataValue(
raster rast, integer bandnum=1)
;
返回表示该波段中无数据的数值
SELECT ST_BandNoDataValue(rast,1) As bnval1, ST_BandNoDataValue(rast,2) As bnval2, ST_BandNoDataValue(rast,3) As bnval3 FROM dummy_rast WHERE rid = 2; bnval1 | bnval2 | bnval3 --------+--------+-------- 0 | 0 | 0
ST_BandIsNoData — 如果波段仅填充无数据值,则返回 true。
boolean ST_BandIsNoData(
raster rast, integer band, boolean forceChecking=true)
;
boolean ST_BandIsNoData(
raster rast, boolean forceChecking=true)
;
如果波段仅填充无数据值,则返回 true。 如果未指定,则假定波段为1。 如果最后一个参数为 TRUE,则逐像素检查整个波段。 否则,该函数仅返回该带的 isnodata 标志的值。 如果未指定,此参数的默认值为 FALSE。
可用性: 2.0.0
![]() | |
如果标志位为 "dirty"(即,使用 TRUE 作为最后一个参数和不使用它的结果不同),您应该更新栅格,将该标志设置为 true,可以使用 ST_SetBandIsNodata() 或 ST_SetBandNodataValue(),并将 TRUE 作为最后一个参数。请参阅 ST_SetBandIsNoData。 |
-- Create dummy table with one raster column create table dummy_rast (rid integer, rast raster); -- Add raster with two bands, one pixel/band. In the first band, nodatavalue = pixel value = 3. -- In the second band, nodatavalue = 13, pixel value = 4 insert into dummy_rast values(1, ( '01' -- little endian (uint8 ndr) || '0000' -- version (uint16 0) || '0200' -- nBands (uint16 0) || '17263529ED684A3F' -- scaleX (float64 0.000805965234044584) || 'F9253529ED684ABF' -- scaleY (float64 -0.00080596523404458) || '1C9F33CE69E352C0' -- ipX (float64 -75.5533328537098) || '718F0E9A27A44840' -- ipY (float64 49.2824585505576) || 'ED50EB853EC32B3F' -- skewX (float64 0.000211812383858707) || '7550EB853EC32B3F' -- skewY (float64 0.000211812383858704) || 'E6100000' -- SRID (int32 4326) || '0100' -- width (uint16 1) || '0100' -- height (uint16 1) || '6' -- hasnodatavalue and isnodata value set to true. || '2' -- first band type (4BUI) || '03' -- novalue==3 || '03' -- pixel(0,0)==3 (same that nodata) || '0' -- hasnodatavalue set to false || '5' -- second band type (16BSI) || '0D00' -- novalue==13 || '0400' -- pixel(0,0)==4 )::raster ); select st_bandisnodata(rast, 1) from dummy_rast where rid = 1; -- Expected true select st_bandisnodata(rast, 2) from dummy_rast where rid = 1; -- Expected false
ST_BandPath — 返回存储在文件系统中的波段的系统文件路径。 如果未指定波段号,则假定为 1。
text ST_BandPath(
raster rast, integer bandnum=1)
;
返回指定波段的系统文件路径。如果调用时使用数据库中的波段,则会抛出错误。
ST_BandFileSize — 返回文件系统中存储的波段的文件大小。 如果未指定波段号,则假定为 1。
bigint ST_BandFileSize(
raster rast, integer bandnum=1)
;
返回文件系统中存储的波段的文件大小。 如果使用 in db band 调用,或者未启用 outdb 访问,则会引发错误。
此函数通常与 ST_BandPath() 和 ST_BandFileTimestamp() 结合使用,以便客户端可以确定它看到的 outdb 栅格文件名是否与服务器看到的文件名相同。
可用性:2.5.0
SELECT ST_BandFileSize(rast,1) FROM dummy_rast WHERE rid = 1; st_bandfilesize ----------------- 240574
ST_BandFileTimestamp — 返回文件系统中存储的波段的文件时间戳。 如果未指定 波段号,则假定为 1。
bigint ST_BandFileTimestamp(
raster rast, integer bandnum=1)
;
返回文件系统中存储的波段的文件时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数)。 如果使用 in db band 调用,或者未启用 outdb 访问,则会引发错误。
此函数通常与 ST_BandPath() 和 ST_BandFileSize() 结合使用,以便客户端可以确定它所看到的 outdb 栅格的文件名是否与服务器所看到的相同。
可用性:2.5.0
SELECT ST_BandFileTimestamp(rast,1) FROM dummy_rast WHERE rid = 1; st_bandfiletimestamp ---------------------- 1521807257
ST_BandPixelType — 返回给定波段的像素类型。 如果未指定 波段号,则假定为 1。
text ST_BandPixelType(
raster rast, integer bandnum=1)
;
返回描述给定带区每个单元格中存储的数据类型和值大小的名称。
有 11 种像素类型。 支持的像素类型如下:
1BB - 1 位布尔值
2BUI - 2 位无符号整数
4BUI - 4位无符号整数
8BSI - 8 位有符号整数
8BUI - 8 位无符号整数
16BSI - 16 位有符号整数
16BUI - 16 位无符号整数
32BSI - 32 位有符号整数
32BUI - 32 位无符号整数
32BF - 32 位浮点数
64BF - 64 位浮点数
SELECT ST_BandPixelType(rast,1) As btype1, ST_BandPixelType(rast,2) As btype2, ST_BandPixelType(rast,3) As btype3 FROM dummy_rast WHERE rid = 2; btype1 | btype2 | btype3 --------+--------+-------- 8BUI | 8BUI | 8BUI
ST_MinPossibleValue — 返回此像素类型可以存储的最小值。
integer ST_MinPossibleValue(
text pixeltype)
;
返回此像素类型可以存储的最小值。
SELECT ST_MinPossibleValue('16BSI'); st_minpossiblevalue --------------------- -32768 SELECT ST_MinPossibleValue('8BUI'); st_minpossiblevalue --------------------- 0
ST_HasNoBand — 如果不存在具有给定波段编号的波段,则返回 true。 如果未指定波段号,则假定波段号为 1。
boolean ST_HasNoBand(
raster rast, integer bandnum=1)
;
如果不存在具有给定波段编号的波段,则返回 true。 如果未指定波段号,则假定波段号为 1。
可用性: 2.0.0
SELECT rid, ST_HasNoBand(rast) As hb1, ST_HasNoBand(rast,2) as hb2, ST_HasNoBand(rast,4) as hb4, ST_NumBands(rast) As numbands FROM dummy_rast; rid | hb1 | hb2 | hb4 | numbands -----+-----+-----+-----+---------- 1 | t | t | t | 0 2 | f | f | t | 3
exclude_nodata_value
设置为 false,则所有像素都被认为与 nodata
像素相交并返回其值。如果未传递参数 exclude_nodata_value
,则从栅格的元数据中读取该值。 NODATA
值或以与栅格相同的空间参考坐标系表示的几何点。 NODATA
值的二维双精度数组,该给定波段像素由 columnX 和 rowY 或以与栅格相同的空间参考坐标系表示的几何点指定。 ST_PixelAsPolygon — 返回限定特定行和列的像素的多边形几何形状。
geometry ST_PixelAsPolygon(
raster rast, integer columnx, integer rowy)
;
返回限定特定行和列的像素的多边形几何形状。
可用性: 2.0.0
-- get raster pixel polygon SELECT i,j, ST_AsText(ST_PixelAsPolygon(foo.rast, i,j)) As b1pgeom FROM dummy_rast As foo CROSS JOIN generate_series(1,2) As i CROSS JOIN generate_series(1,1) As j WHERE rid=2; i | j | b1pgeom ---+---+----------------------------------------------------------------------------- 1 | 1 | POLYGON((3427927.75 5793244,3427927.8 5793244,3427927.8 5793243.95,... 2 | 1 | POLYGON((3427927.8 5793244,3427927.85 5793244,3427927.85 5793243.95, ..
ST_PixelAsPolygons — 返回包围栅格带的每个像素的多边形几何图形以及每个像素的值、X 和 Y 栅格坐标。
setof record ST_PixelAsPolygons(
raster rast, integer band=1, boolean exclude_nodata_value=TRUE)
;
返回包围栅格带的每个像素的多边形几何图形以及每个像素的值(双精度)、X 和 Y 栅格坐标(整数)。
返回记录格式:geom
geometry,val
双精度,x
整数,y
整数。
![]() | |
当 |
![]() | |
ST_PixelAsPolygons 为每个像素返回一个多边形几何图形。 这与 ST_DumpAsPolygons 不同,其中每个几何图形代表一个或多个具有相同像素值的像素。 |
可用性: 2.0.0
增强:2.1.0 添加了 except_nodata_value 可选参数。
更改:2.1.1 更改了 except_nodata_value 的行为。
-- get raster pixel polygon SELECT (gv).x, (gv).y, (gv).val, ST_AsText((gv).geom) geom FROM (SELECT ST_PixelAsPolygons( ST_SetValue(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 0.001, -0.001, 0.001, 0.001, 4269), '8BUI'::text, 1, 0), 2, 2, 10), 1, 1, NULL) ) gv ) foo; x | y | val | geom ---+---+----------------------------------------------------------------------------- 1 | 1 | | POLYGON((0 0,0.001 0.001,0.002 0,0.001 -0.001,0 0)) 1 | 2 | 1 | POLYGON((0.001 -0.001,0.002 0,0.003 -0.001,0.002 -0.002,0.001 -0.001)) 2 | 1 | 1 | POLYGON((0.001 0.001,0.002 0.002,0.003 0.001,0.002 0,0.001 0.001)) 2 | 2 | 10 | POLYGON((0.002 0,0.003 0.001,0.004 0,0.003 -0.001,0.002 0))
ST_PixelAsPoint — 返回像素左上角的点几何形状。
geometry ST_PixelAsPoint(
raster rast, integer columnx, integer rowy)
;
返回像素左上角的点几何形状。
可用性:2.1.0
SELECT ST_AsText(ST_PixelAsPoint(rast, 1, 1)) FROM dummy_rast WHERE rid = 1; st_astext ---------------- POINT(0.5 0.5)
ST_PixelAsPoints — 返回栅格波段的每个像素的点几何图形以及每个像素的值、X 和 Y 栅格坐标。 点几何的坐标是像素的左上角。
setof record ST_PixelAsPoints(
raster rast, integer band=1, boolean exclude_nodata_value=TRUE)
;
返回栅格波段的每个像素的点几何图形以及每个像素的值、X 和 Y 栅格坐标。 点几何的坐标是像素的左上角。
返回记录格式:geom
geometry,val
双精度,x
整数,y
整数。
![]() | |
当 |
可用性:2.1.0
更改:2.1.1 更改了 except_nodata_value 的行为。
SELECT x, y, val, ST_AsText(geom) FROM (SELECT (ST_PixelAsPoints(rast, 1)).* FROM dummy_rast WHERE rid = 2) foo; x | y | val | st_astext ---+---+-----+------------------------------ 1 | 1 | 253 | POINT(3427927.75 5793244) 2 | 1 | 254 | POINT(3427927.8 5793244) 3 | 1 | 253 | POINT(3427927.85 5793244) 4 | 1 | 254 | POINT(3427927.9 5793244) 5 | 1 | 254 | POINT(3427927.95 5793244) 1 | 2 | 253 | POINT(3427927.75 5793243.95) 2 | 2 | 254 | POINT(3427927.8 5793243.95) 3 | 2 | 254 | POINT(3427927.85 5793243.95) 4 | 2 | 253 | POINT(3427927.9 5793243.95) 5 | 2 | 249 | POINT(3427927.95 5793243.95) 1 | 3 | 250 | POINT(3427927.75 5793243.9) 2 | 3 | 254 | POINT(3427927.8 5793243.9) 3 | 3 | 254 | POINT(3427927.85 5793243.9) 4 | 3 | 252 | POINT(3427927.9 5793243.9) 5 | 3 | 249 | POINT(3427927.95 5793243.9) 1 | 4 | 251 | POINT(3427927.75 5793243.85) 2 | 4 | 253 | POINT(3427927.8 5793243.85) 3 | 4 | 254 | POINT(3427927.85 5793243.85) 4 | 4 | 254 | POINT(3427927.9 5793243.85) 5 | 4 | 253 | POINT(3427927.95 5793243.85) 1 | 5 | 252 | POINT(3427927.75 5793243.8) 2 | 5 | 250 | POINT(3427927.8 5793243.8) 3 | 5 | 254 | POINT(3427927.85 5793243.8) 4 | 5 | 254 | POINT(3427927.9 5793243.8) 5 | 5 | 254 | POINT(3427927.95 5793243.8)
ST_PixelAsCentroid — 返回像素表示的区域的质心(点几何)。
geometry ST_PixelAsCentroid(
raster rast, integer x, integer y)
;
返回像素表示的区域的质心(点几何)。
增强:3.2.0 Faster 现在用 C 实现。
可用性:2.1.0
SELECT ST_AsText(ST_PixelAsCentroid(rast, 1, 1)) FROM dummy_rast WHERE rid = 1; st_astext -------------- POINT(1.5 2)
ST_PixelAsCentroids — 返回栅格波段的每个像素的质心(点几何)以及每个像素的值、X 和 Y 栅格坐标。 点几何是像素表示的区域的质心。
setof record ST_PixelAsCentroids(
raster rast, integer band=1, boolean exclude_nodata_value=TRUE)
;
返回栅格波段的每个像素的质心(点几何)以及每个像素的值、X 和 Y 栅格坐标。 点几何是像素表示的区域的质心。
返回记录格式:geom
geometry,val
双精度,x
整数,y
整数。
![]() | |
当 |
增强:3.2.0 Faster 现在用 C 实现。
更改:2.1.1 更改了 except_nodata_value 的行为。
可用性:2.1.0
--LATERAL syntax requires PostgreSQL 9.3+ SELECT x, y, val, ST_AsText(geom) FROM (SELECT dp.* FROM dummy_rast, LATERAL ST_PixelAsCentroids(rast, 1) AS dp WHERE rid = 2) foo; x | y | val | st_astext ---+---+-----+-------------------------------- 1 | 1 | 253 | POINT(3427927.775 5793243.975) 2 | 1 | 254 | POINT(3427927.825 5793243.975) 3 | 1 | 253 | POINT(3427927.875 5793243.975) 4 | 1 | 254 | POINT(3427927.925 5793243.975) 5 | 1 | 254 | POINT(3427927.975 5793243.975) 1 | 2 | 253 | POINT(3427927.775 5793243.925) 2 | 2 | 254 | POINT(3427927.825 5793243.925) 3 | 2 | 254 | POINT(3427927.875 5793243.925) 4 | 2 | 253 | POINT(3427927.925 5793243.925) 5 | 2 | 249 | POINT(3427927.975 5793243.925) 1 | 3 | 250 | POINT(3427927.775 5793243.875) 2 | 3 | 254 | POINT(3427927.825 5793243.875) 3 | 3 | 254 | POINT(3427927.875 5793243.875) 4 | 3 | 252 | POINT(3427927.925 5793243.875) 5 | 3 | 249 | POINT(3427927.975 5793243.875) 1 | 4 | 251 | POINT(3427927.775 5793243.825) 2 | 4 | 253 | POINT(3427927.825 5793243.825) 3 | 4 | 254 | POINT(3427927.875 5793243.825) 4 | 4 | 254 | POINT(3427927.925 5793243.825) 5 | 4 | 253 | POINT(3427927.975 5793243.825) 1 | 5 | 252 | POINT(3427927.775 5793243.775) 2 | 5 | 250 | POINT(3427927.825 5793243.775) 3 | 5 | 254 | POINT(3427927.875 5793243.775) 4 | 5 | 254 | POINT(3427927.925 5793243.775) 5 | 5 | 254 | POINT(3427927.975 5793243.775)
ST_Value — 返回指定列 x、行 y 像素或特定几何点处给定波段的值。波段编号从 1 开始,如果未指定,则默认为 1。如果将参数 exclude_nodata_value
设置为 false,则所有像素都被认为与 nodata
像素相交并返回其值。如果未传递参数 exclude_nodata_value
,则从栅格的元数据中读取该值。
double precision ST_Value(
raster rast, geometry pt, boolean exclude_nodata_value=true)
;
double precision ST_Value(
raster rast, integer band, geometry pt, boolean exclude_nodata_value=true, text resample='nearest')
;
double precision ST_Value(
raster rast, integer x, integer y, boolean exclude_nodata_value=true)
;
double precision ST_Value(
raster rast, integer band, integer x, integer y, boolean exclude_nodata_value=true)
;
返回给定列 x、行 y 像素或给定几何点处给定波段的值。波段编号从1开始,如果未指定波段,则默认为1。
如果 except_nodata_value
设置为 true,则仅考虑非nodata
像素。 如果 except_nodata_value
设置为 false,则考虑所有像素。
重采样
参数的允许值为“nearest”(执行默认的最近邻重采样)和“bilinear”(执行 双线性插值 以估计像素中心之间的值)。
增强:添加了 3.2.0 重新采样可选参数。
增强:2.0.0 添加了 except_nodata_value 可选参数。
-- get raster values at particular postgis geometry points -- the srid of your geometry should be same as for your raster SELECT rid, ST_Value(rast, foo.pt_geom) As b1pval, ST_Value(rast, 2, foo.pt_geom) As b2pval FROM dummy_rast CROSS JOIN (SELECT ST_SetSRID(ST_Point(3427927.77, 5793243.76), 0) As pt_geom) As foo WHERE rid=2; rid | b1pval | b2pval -----+--------+-------- 2 | 252 | 79 -- general fictitious example using a real table SELECT rid, ST_Value(rast, 3, sometable.geom) As b3pval FROM sometable WHERE ST_Intersects(rast,sometable.geom);
SELECT rid, ST_Value(rast, 1, 1, 1) As b1pval, ST_Value(rast, 2, 1, 1) As b2pval, ST_Value(rast, 3, 1, 1) As b3pval FROM dummy_rast WHERE rid=2; rid | b1pval | b2pval | b3pval -----+--------+--------+-------- 2 | 253 | 78 | 70
--- Get all values in bands 1,2,3 of each pixel -- SELECT x, y, ST_Value(rast, 1, x, y) As b1val, ST_Value(rast, 2, x, y) As b2val, ST_Value(rast, 3, x, y) As b3val FROM dummy_rast CROSS JOIN generate_series(1, 1000) As x CROSS JOIN generate_series(1, 1000) As y WHERE rid = 2 AND x <= ST_Width(rast) AND y <= ST_Height(rast); x | y | b1val | b2val | b3val ---+---+-------+-------+------- 1 | 1 | 253 | 78 | 70 1 | 2 | 253 | 96 | 80 1 | 3 | 250 | 99 | 90 1 | 4 | 251 | 89 | 77 1 | 5 | 252 | 79 | 62 2 | 1 | 254 | 98 | 86 2 | 2 | 254 | 118 | 108 : :
--- Get all values in bands 1,2,3 of each pixel same as above but returning the upper left point point of each pixel -- SELECT ST_AsText(ST_SetSRID( ST_Point(ST_UpperLeftX(rast) + ST_ScaleX(rast)*x, ST_UpperLeftY(rast) + ST_ScaleY(rast)*y), ST_SRID(rast))) As uplpt , ST_Value(rast, 1, x, y) As b1val, ST_Value(rast, 2, x, y) As b2val, ST_Value(rast, 3, x, y) As b3val FROM dummy_rast CROSS JOIN generate_series(1,1000) As x CROSS JOIN generate_series(1,1000) As y WHERE rid = 2 AND x <= ST_Width(rast) AND y <= ST_Height(rast); uplpt | b1val | b2val | b3val -----------------------------+-------+-------+------- POINT(3427929.25 5793245.5) | 253 | 78 | 70 POINT(3427929.25 5793247) | 253 | 96 | 80 POINT(3427929.25 5793248.5) | 250 | 99 | 90 :
--- Get a polygon formed by union of all pixels that fall in a particular value range and intersect particular polygon -- SELECT ST_AsText(ST_Union(pixpolyg)) As shadow FROM (SELECT ST_Translate(ST_MakeEnvelope( ST_UpperLeftX(rast), ST_UpperLeftY(rast), ST_UpperLeftX(rast) + ST_ScaleX(rast), ST_UpperLeftY(rast) + ST_ScaleY(rast), 0 ), ST_ScaleX(rast)*x, ST_ScaleY(rast)*y ) As pixpolyg, ST_Value(rast, 2, x, y) As b2val FROM dummy_rast CROSS JOIN generate_series(1,1000) As x CROSS JOIN generate_series(1,1000) As y WHERE rid = 2 AND x <= ST_Width(rast) AND y <= ST_Height(rast)) As foo WHERE ST_Intersects( pixpolyg, ST_GeomFromText('POLYGON((3427928 5793244,3427927.75 5793243.75,3427928 5793243.75,3427928 5793244))',0) ) AND b2val != 254; shadow ------------------------------------------------------------------------------------ MULTIPOLYGON(((3427928 5793243.9,3427928 5793243.85,3427927.95 5793243.85,3427927.95 5793243.9, 3427927.95 5793243.95,3427928 5793243.95,3427928.05 5793243.95,3427928.05 5793243.9,3427928 5793243.9)),((3427927.95 5793243.9,3427927.95 579324 3.85,3427927.9 5793243.85,3427927.85 5793243.85,3427927.85 5793243.9,3427927.9 5793243.9,3427927.9 5793243.95, 3427927.95 5793243.95,3427927.95 5793243.9)),((3427927.85 5793243.75,3427927.85 5793243.7,3427927.8 5793243.7,3427927.8 5793243.75 ,3427927.8 5793243.8,3427927.8 5793243.85,3427927.85 5793243.85,3427927.85 5793243.8,3427927.85 5793243.75)), ((3427928.05 5793243.75,3427928.05 5793243.7,3427928 5793243.7,3427927.95 5793243.7,3427927.95 5793243.75,3427927.95 5793243.8,3427 927.95 5793243.85,3427928 5793243.85,3427928 5793243.8,3427928.05 5793243.8, 3427928.05 5793243.75)),((3427927.95 5793243.75,3427927.95 5793243.7,3427927.9 5793243.7,3427927.85 5793243.7, 3427927.85 5793243.75,3427927.85 5793243.8,3427927.85 5793243.85,3427927.9 5793243.85, 3427927.95 5793243.85,3427927.95 5793243.8,3427927.95 5793243.75)))
--- Checking all the pixels of a large raster tile can take a long time. --- You can dramatically improve speed at some lose of precision by orders of magnitude -- by sampling pixels using the step optional parameter of generate_series. -- This next example does the same as previous but by checking 1 for every 4 (2x2) pixels and putting in the last checked -- putting in the checked pixel as the value for subsequent 4 SELECT ST_AsText(ST_Union(pixpolyg)) As shadow FROM (SELECT ST_Translate(ST_MakeEnvelope( ST_UpperLeftX(rast), ST_UpperLeftY(rast), ST_UpperLeftX(rast) + ST_ScaleX(rast)*2, ST_UpperLeftY(rast) + ST_ScaleY(rast)*2, 0 ), ST_ScaleX(rast)*x, ST_ScaleY(rast)*y ) As pixpolyg, ST_Value(rast, 2, x, y) As b2val FROM dummy_rast CROSS JOIN generate_series(1,1000,2) As x CROSS JOIN generate_series(1,1000,2) As y WHERE rid = 2 AND x <= ST_Width(rast) AND y <= ST_Height(rast) ) As foo WHERE ST_Intersects( pixpolyg, ST_GeomFromText('POLYGON((3427928 5793244,3427927.75 5793243.75,3427928 5793243.75,3427928 5793244))',0) ) AND b2val != 254; shadow ------------------------------------------------------------------------------------ MULTIPOLYGON(((3427927.9 5793243.85,3427927.8 5793243.85,3427927.8 5793243.95, 3427927.9 5793243.95,3427928 5793243.95,3427928.1 5793243.95,3427928.1 5793243.85,3427928 5793243.85,3427927.9 5793243.85)), ((3427927.9 5793243.65,3427927.8 5793243.65,3427927.8 5793243.75,3427927.8 5793243.85,3427927.9 5793243.85, 3427928 5793243.85,3427928 5793243.75,3427928.1 5793243.75,3427928.1 5793243.65,3427928 5793243.65,3427927.9 5793243.65)))
ST_NearestValue — 返回由 columnx 和 rowy 指定的给定带像素的最接近的非 NODATA
值或以与栅格相同的空间参考坐标系表示的几何点。
double precision ST_NearestValue(
raster rast, integer bandnum, geometry pt, boolean exclude_nodata_value=true)
;
double precision ST_NearestValue(
raster rast, geometry pt, boolean exclude_nodata_value=true)
;
double precision ST_NearestValue(
raster rast, integer bandnum, integer columnx, integer rowy, boolean exclude_nodata_value=true)
;
double precision ST_NearestValue(
raster rast, integer columnx, integer rowy, boolean exclude_nodata_value=true)
;
返回给定列 x、行y像素或特定几何点中给定带的最接近的非 NODATA
值。 如果列x、行y像素或指定几何点处的像素为NODATA
,则函数将查找距离列x、行y像素或值为非NODATA
的几何点最近的像素。
Band 编号从 1 开始,如果未指定,则 bandnum
假定为 1。 如果 except_nodata_value
设置为 false,则所有包含 nodata
像素的像素都被视为相交并返回值。 如果exclude_nodata_value
未传入,则从栅格的元数据中读取它。
可用性:2.1.0
![]() | |
ST_NearestValue 是 ST_Value 的直接替代品。 |
-- pixel 2x2 has value SELECT ST_Value(rast, 2, 2) AS value, ST_NearestValue(rast, 2, 2) AS nearestvalue FROM ( SELECT ST_SetValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0), '8BUI'::text, 1, 0 ), 1, 1, 0. ), 2, 3, 0. ), 3, 5, 0. ), 4, 2, 0. ), 5, 4, 0. ) AS rast ) AS foo value | nearestvalue -------+-------------- 1 | 1
-- pixel 2x3 is NODATA SELECT ST_Value(rast, 2, 3) AS value, ST_NearestValue(rast, 2, 3) AS nearestvalue FROM ( SELECT ST_SetValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0), '8BUI'::text, 1, 0 ), 1, 1, 0. ), 2, 3, 0. ), 3, 5, 0. ), 4, 2, 0. ), 5, 4, 0. ) AS rast ) AS foo value | nearestvalue -------+-------------- | 1
ST_SetZ — 返回与输入几何图形具有相同 X/Y 坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到 Z 维度。
geometry ST_SetZ(
raster rast, geometry geom, text resample=nearest, integer band=1)
;
返回与输入几何图形具有相同 X/Y 坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到 Z 维度。
重采样
参数可以设置为 "nearest",以复制每个顶点所在单元格的值,或者设置为 "bilinear",以使用双线性插值来计算考虑到相邻单元格的值。
可用性:3.2.0
-- -- 2x2 test raster with values -- -- 10 50 -- 40 20 -- WITH test_raster AS ( SELECT ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(width => 2, height => 2, upperleftx => 0, upperlefty => 2, scalex => 1.0, scaley => -1.0, skewx => 0, skewy => 0, srid => 4326), index => 1, pixeltype => '16BSI', initialvalue => 0, nodataval => -999), 1,1,1, newvalueset =>ARRAY[ARRAY[10.0::float8, 50.0::float8], ARRAY[40.0::float8, 20.0::float8]]) AS rast ) SELECT ST_AsText( ST_SetZ( rast, band => 1, geom => 'SRID=4326;LINESTRING(1.0 1.9, 1.0 0.2)'::geometry, resample => 'bilinear' )) FROM test_raster st_astext ---------------------------------- LINESTRING Z (1 1.9 38,1 0.2 27)
ST_SetM — 返回与输入几何图形具有相同 X/Y 坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到 M 维度。
geometry ST_SetM(
raster rast, geometry geom, text resample=nearest, integer band=1)
;
返回与输入几何图形具有相同 X/Y 坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到 M 维度。
重采样
参数可以设置为 "nearest",以复制每个顶点所在单元格的值,或者设置为 "bilinear",以使用双线性插值来计算考虑到相邻单元格的值。
可用性:3.2.0
-- -- 2x2 test raster with values -- -- 10 50 -- 40 20 -- WITH test_raster AS ( SELECT ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(width => 2, height => 2, upperleftx => 0, upperlefty => 2, scalex => 1.0, scaley => -1.0, skewx => 0, skewy => 0, srid => 4326), index => 1, pixeltype => '16BSI', initialvalue => 0, nodataval => -999), 1,1,1, newvalueset =>ARRAY[ARRAY[10.0::float8, 50.0::float8], ARRAY[40.0::float8, 20.0::float8]]) AS rast ) SELECT ST_AsText( ST_SetM( rast, band => 1, geom => 'SRID=4326;LINESTRING(1.0 1.9, 1.0 0.2)'::geometry, resample => 'bilinear' )) FROM test_raster st_astext ---------------------------------- LINESTRING M (1 1.9 38,1 0.2 27)
ST_Neighborhood — 返回给定波段像素周围非 NODATA
值的二维双精度数组,该给定波段像素由 columnX 和 rowY 或以与栅格相同的空间参考坐标系表示的几何点指定。
double precision[][] ST_Neighborhood(
raster rast, integer bandnum, integer columnX, integer rowY, integer distanceX, integer distanceY, boolean exclude_nodata_value=true)
;
double precision[][] ST_Neighborhood(
raster rast, integer columnX, integer rowY, integer distanceX, integer distanceY, boolean exclude_nodata_value=true)
;
double precision[][] ST_Neighborhood(
raster rast, integer bandnum, geometry pt, integer distanceX, integer distanceY, boolean exclude_nodata_value=true)
;
double precision[][] ST_Neighborhood(
raster rast, geometry pt, integer distanceX, integer distanceY, boolean exclude_nodata_value=true)
;
返回一个二维双精度数组,其中包含围绕给定波段的像素的非NODATA
值。这可以通过指定列X和行Y,或者使用与栅格相同的空间参考坐标系统表示的几何点来完成。参数distanceX
和distanceY
定义了X和Y轴上指定像素周围的像素数量,例如,我想获取我感兴趣的像素周围X轴方向上3个像素距离和Y轴方向上2个像素距离内的所有值。二维数组的中心值将是由列X和行Y或几何点指定的像素的值。
Band 编号从 1 开始,如果未指定,则 bandnum
假定为 1。 如果 except_nodata_value
设置为 false,则所有包含 nodata
像素的像素都被视为相交并返回值。 如果exclude_nodata_value
未传入,则从栅格的元数据中读取它。
![]() | |
返回的二维数组沿每个轴的元素数量为 2 * ( |
![]() | |
二维数组输出可以传递给任何栅格处理内置函数,例如 ST_Min4ma、ST_Sum4ma、ST_Mean4ma。 |
可用性:2.1.0
-- pixel 2x2 has value SELECT ST_Neighborhood(rast, 2, 2, 1, 1) FROM ( SELECT ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0), '8BUI'::text, 1, 0 ), 1, 1, 1, ARRAY[ [0, 1, 1, 1, 1], [1, 1, 1, 0, 1], [1, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 0, 1, 1] ]::double precision[], 1 ) AS rast ) AS foo st_neighborhood --------------------------------- {{NULL,1,1},{1,1,1},{1,NULL,1}}
-- pixel 2x3 is NODATA SELECT ST_Neighborhood(rast, 2, 3, 1, 1) FROM ( SELECT ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0), '8BUI'::text, 1, 0 ), 1, 1, 1, ARRAY[ [0, 1, 1, 1, 1], [1, 1, 1, 0, 1], [1, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 0, 1, 1] ]::double precision[], 1 ) AS rast ) AS foo st_neighborhood ------------------------------ {{1,1,1},{1,NULL,1},{1,1,1}}
-- pixel 3x3 has value -- exclude_nodata_value = FALSE SELECT ST_Neighborhood(rast, 3, 3, 1, 1, false) FROM ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0), '8BUI'::text, 1, 0 ), 1, 1, 1, ARRAY[ [0, 1, 1, 1, 1], [1, 1, 1, 0, 1], [1, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 0, 1, 1] ]::double precision[], 1 ) AS rast st_neighborhood --------------------------- {{1,1,0},{0,1,1},{1,1,1}}
ST_SetValue — 返回修改后的栅格,其结果是将给定波段中的值设置为指定列x、行y像素或与特定几何图形相交的像素。波段编号从1开始,如果未指定波段,则默认为1。
raster ST_SetValue(
raster rast, integer bandnum, geometry geom, double precision newvalue)
;
raster ST_SetValue(
raster rast, geometry geom, double precision newvalue)
;
raster ST_SetValue(
raster rast, integer bandnum, integer columnx, integer rowy, double precision newvalue)
;
raster ST_SetValue(
raster rast, integer columnx, integer rowy, double precision newvalue)
;
返回修改后的栅格,该栅格是通过将指定像素的值设置为给定栅格的行和列或几何图形的指定波段的新值而产生的。 如果未指定波段,则假定为 1。
增强:2.1.0 ST_SetValue() 的 几何变体现在支持任何几何类型,而不仅仅是点。 几何变体是 ST_SetValues() 的 geomval[] 变体的包装
-- Geometry example SELECT (foo.geomval).val, ST_AsText(ST_Union((foo.geomval).geom)) FROM (SELECT ST_DumpAsPolygons( ST_SetValue(rast,1, ST_Point(3427927.75, 5793243.95), 50) ) As geomval FROM dummy_rast where rid = 2) As foo WHERE (foo.geomval).val < 250 GROUP BY (foo.geomval).val; val | st_astext -----+------------------------------------------------------------------- 50 | POLYGON((3427927.75 5793244,3427927.75 5793243.95,3427927.8 579324 ... 249 | POLYGON((3427927.95 5793243.95,3427927.95 5793243.85,3427928 57932 ...
-- Store the changed raster -- UPDATE dummy_rast SET rast = ST_SetValue(rast,1, ST_Point(3427927.75, 5793243.95),100) WHERE rid = 2 ;
ST_SetValues — 返回通过设置给定波段的值而产生的修改后的栅格。
raster ST_SetValues(
raster rast, integer nband, integer columnx, integer rowy, double precision[][] newvalueset, boolean[][] noset=NULL, boolean keepnodata=FALSE)
;
raster ST_SetValues(
raster rast, integer nband, integer columnx, integer rowy, double precision[][] newvalueset, double precision nosetvalue, boolean keepnodata=FALSE)
;
raster ST_SetValues(
raster rast, integer nband, integer columnx, integer rowy, integer width, integer height, double precision newvalue, boolean keepnodata=FALSE)
;
raster ST_SetValues(
raster rast, integer columnx, integer rowy, integer width, integer height, double precision newvalue, boolean keepnodata=FALSE)
;
raster ST_SetValues(
raster rast, integer nband, geomval[] geomvalset, boolean keepnodata=FALSE)
;
返回通过将指定波段的指定像素设置为新值而产生的修改后的栅格。 columnx
和 rowy
是 从1 开始索引的。
如果keepnodata
为TRUE,那些值为NODATA的像素将不会被设置为newvalueset
中的相应值。
对于变体1,要设置的特定像素由columnx
、rowy
像素坐标和newvalueset
数组的尺寸决定。noset
可以用来防止设置具有newvalueset
中存在的值的像素(因为PostgreSQL不允许不规则数组)。请参见变体1的示例。
变体2与变体1类似,但是使用简单的双精度nosetvalue
而不是布尔型的noset
数组。newvalueset
中具有nosetvalue
值的元素将被跳过。请参见变体2的示例。
对于变体3,要设置的特定像素由columnx
、rowy
像素坐标、width
和height
决定。请参见变体3的示例。
变体4与变体3相同,唯一的区别是它假定将设置rast
的第一个波段的像素。
对于变体5,将使用geomval数组来确定要设置的特定像素。如果数组中的所有几何图形都是点类型或多点类型,函数将使用一种快捷方式,其中每个点的经度和纬度用于直接设置像素。否则,几何图形将转换为栅格,然后一次迭代通过它们。请参见变体5的示例。
可用性:2.1.0
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 1 | 1 | + - + - + - + + - + - + - + | 1 | 1 | 1 | = > | 1 | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 2, 2, ARRAY[[9, 9], [9, 9]]::double precision[][] ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 2 | 1 | 1 2 | 2 | 9 2 | 3 | 9 3 | 1 | 1 3 | 2 | 9 3 | 3 | 9
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 9 | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | = > | 9 | | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 9 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 1, 1, ARRAY[[9, 9, 9], [9, NULL, 9], [9, 9, 9]]::double precision[][] ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 9 1 | 2 | 9 1 | 3 | 9 2 | 1 | 9 2 | 2 | 2 | 3 | 9 3 | 1 | 9 3 | 2 | 9 3 | 3 | 9
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 9 | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | => | 1 | | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 9 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 1, 1, ARRAY[[9, 9, 9], [9, NULL, 9], [9, 9, 9]]::double precision[][], ARRAY[[false], [true]]::boolean[][] ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 9 1 | 2 | 1 1 | 3 | 9 2 | 1 | 9 2 | 2 | 2 | 3 | 9 3 | 1 | 9 3 | 2 | 9 3 | 3 | 9
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | | 1 | 1 | | | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | => | 1 | | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 9 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 1, 1, NULL ), 1, 1, 1, ARRAY[[9, 9, 9], [9, NULL, 9], [9, 9, 9]]::double precision[][], ARRAY[[false], [true]]::boolean[][], TRUE ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 1 | 2 | 1 1 | 3 | 9 2 | 1 | 9 2 | 2 | 2 | 3 | 9 3 | 1 | 9 3 | 2 | 9 3 | 3 | 9
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 1 | 1 | + - + - + - + + - + - + - + | 1 | 1 | 1 | => | 1 | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 1, 1, ARRAY[[-1, -1, -1], [-1, 9, 9], [-1, 9, 9]]::double precision[][], -1 ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 2 | 1 | 1 2 | 2 | 9 2 | 3 | 9 3 | 1 | 1 3 | 2 | 9 3 | 3 | 9
/* This example is like the previous one. Instead of nosetvalue = -1, nosetvalue = NULL The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 1 | 1 | + - + - + - + + - + - + - + | 1 | 1 | 1 | => | 1 | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 1, 1, ARRAY[[NULL, NULL, NULL], [NULL, 9, 9], [NULL, 9, 9]]::double precision[][], NULL::double precision ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 2 | 1 | 1 2 | 2 | 9 2 | 3 | 9 3 | 1 | 1 3 | 2 | 9 3 | 3 | 9
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 1 | 1 | + - + - + - + + - + - + - + | 1 | 1 | 1 | => | 1 | 9 | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 2, 2, 2, 2, 9 ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 2 | 1 | 1 2 | 2 | 9 2 | 3 | 9 3 | 1 | 1 3 | 2 | 9 3 | 3 | 9
/* The ST_SetValues() does the following... + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 1 | 1 | + - + - + - + + - + - + - + | 1 | | 1 | => | 1 | | 9 | + - + - + - + + - + - + - + | 1 | 1 | 1 | | 1 | 9 | 9 | + - + - + - + + - + - + - + */ SELECT (poly).x, (poly).y, (poly).val FROM ( SELECT ST_PixelAsPolygons( ST_SetValues( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0 ), 1, 2, 2, NULL ), 1, 2, 2, 2, 2, 9, TRUE ) ) AS poly ) foo ORDER BY 1, 2; x | y | val ---+---+----- 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 2 | 1 | 1 2 | 2 | 2 | 3 | 9 3 | 1 | 1 3 | 2 | 9 3 | 3 | 9
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0) AS rast ), bar AS ( SELECT 1 AS gid, 'SRID=0;POINT(2.5 -2.5)'::geometry geom UNION ALL SELECT 2 AS gid, 'SRID=0;POLYGON((1 -1, 4 -1, 4 -4, 1 -4, 1 -1))'::geometry geom UNION ALL SELECT 3 AS gid, 'SRID=0;POLYGON((0 0, 5 0, 5 -1, 1 -1, 1 -4, 0 -4, 0 0))'::geometry geom UNION ALL SELECT 4 AS gid, 'SRID=0;MULTIPOINT(0 0, 4 4, 4 -4)'::geometry ) SELECT rid, gid, ST_DumpValues(ST_SetValue(rast, 1, geom, gid)) FROM foo t1 CROSS JOIN bar t2 ORDER BY rid, gid; rid | gid | st_dumpvalues -----+-----+--------------------------------------------------------------------------------------------------------------------------------------------- 1 | 1 | (1,"{{NULL,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,NULL},{NULL,NULL,1,NULL,NULL},{NULL,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,NULL}}") 1 | 2 | (1,"{{NULL,NULL,NULL,NULL,NULL},{NULL,2,2,2,NULL},{NULL,2,2,2,NULL},{NULL,2,2,2,NULL},{NULL,NULL,NULL,NULL,NULL}}") 1 | 3 | (1,"{{3,3,3,3,3},{3,NULL,NULL,NULL,NULL},{3,NULL,NULL,NULL,NULL},{3,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,NULL}}") 1 | 4 | (1,"{{4,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,NULL},{NULL,NULL,NULL,NULL,4}}") (4 rows)
下面显示了数组中后面的 geomvals 可以覆盖前面的 geomvals
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0) AS rast ), bar AS ( SELECT 1 AS gid, 'SRID=0;POINT(2.5 -2.5)'::geometry geom UNION ALL SELECT 2 AS gid, 'SRID=0;POLYGON((1 -1, 4 -1, 4 -4, 1 -4, 1 -1))'::geometry geom UNION ALL SELECT 3 AS gid, 'SRID=0;POLYGON((0 0, 5 0, 5 -1, 1 -1, 1 -4, 0 -4, 0 0))'::geometry geom UNION ALL SELECT 4 AS gid, 'SRID=0;MULTIPOINT(0 0, 4 4, 4 -4)'::geometry ) SELECT t1.rid, t2.gid, t3.gid, ST_DumpValues(ST_SetValues(rast, 1, ARRAY[ROW(t2.geom, t2.gid), ROW(t3.geom, t3.gid)]::geomval[])) FROM foo t1 CROSS JOIN bar t2 CROSS JOIN bar t3 WHERE t2.gid = 1 AND t3.gid = 2 ORDER BY t1.rid, t2.gid, t3.gid; rid | gid | gid | st_dumpvalues -----+-----+-----+--------------------------------------------------------------------------------------------------------------------- 1 | 1 | 2 | (1,"{{NULL,NULL,NULL,NULL,NULL},{NULL,2,2,2,NULL},{NULL,2,2,2,NULL},{NULL,2,2,2,NULL},{NULL,NULL,NULL,NULL,NULL}}") (1 row)
这个例子与前面的例子相反
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0) AS rast ), bar AS ( SELECT 1 AS gid, 'SRID=0;POINT(2.5 -2.5)'::geometry geom UNION ALL SELECT 2 AS gid, 'SRID=0;POLYGON((1 -1, 4 -1, 4 -4, 1 -4, 1 -1))'::geometry geom UNION ALL SELECT 3 AS gid, 'SRID=0;POLYGON((0 0, 5 0, 5 -1, 1 -1, 1 -4, 0 -4, 0 0))'::geometry geom UNION ALL SELECT 4 AS gid, 'SRID=0;MULTIPOINT(0 0, 4 4, 4 -4)'::geometry ) SELECT t1.rid, t2.gid, t3.gid, ST_DumpValues(ST_SetValues(rast, 1, ARRAY[ROW(t2.geom, t2.gid), ROW(t3.geom, t3.gid)]::geomval[])) FROM foo t1 CROSS JOIN bar t2 CROSS JOIN bar t3 WHERE t2.gid = 2 AND t3.gid = 1 ORDER BY t1.rid, t2.gid, t3.gid; rid | gid | gid | st_dumpvalues -----+-----+-----+--------------------------------------------------------------------------------------------------------------------- 1 | 2 | 1 | (1,"{{NULL,NULL,NULL,NULL,NULL},{NULL,2,2,2,NULL},{NULL,2,1,2,NULL},{NULL,2,2,2,NULL},{NULL,NULL,NULL,NULL,NULL}}") (1 row)
ST_DumpValues — 获取指定 band(波段) 的值作为二维数组。
setof record ST_DumpValues(
raster rast , integer[] nband=NULL , boolean exclude_nodata_value=true )
;
double precision[][] ST_DumpValues(
raster rast , integer nband , boolean exclude_nodata_value=true )
;
获取指定 band 的值作为二维数组(第一个索引是行,第二个索引是列)。 如果 nband
为 NULL 或未提供,则处理所有栅格波段。
可用性:2.1.0
WITH foo AS ( SELECT ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI'::text, 1, 0), 2, '32BF'::text, 3, -9999), 3, '16BSI', 0, 0) AS rast ) SELECT (ST_DumpValues(rast)).* FROM foo; nband | valarray -------+------------------------------------------------------ 1 | {{1,1,1},{1,1,1},{1,1,1}} 2 | {{3,3,3},{3,3,3},{3,3,3}} 3 | {{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}} (3 rows)
WITH foo AS ( SELECT ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI'::text, 1, 0), 2, '32BF'::text, 3, -9999), 3, '16BSI', 0, 0) AS rast ) SELECT (ST_DumpValues(rast, ARRAY[3, 1])).* FROM foo; nband | valarray -------+------------------------------------------------------ 3 | {{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}} 1 | {{1,1,1},{1,1,1},{1,1,1}} (2 rows)
WITH foo AS ( SELECT ST_SetValue(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0), 1, 2, 5) AS rast ) SELECT (ST_DumpValues(rast, 1))[2][1] FROM foo; st_dumpvalues --------------- 5 (1 row)
ST_PixelOfValue — 获取值等于搜索值的像素的列x、行y坐标。
setof record ST_PixelOfValue(
raster rast , integer nband , double precision[] search , boolean exclude_nodata_value=true )
;
setof record ST_PixelOfValue(
raster rast , double precision[] search , boolean exclude_nodata_value=true )
;
setof record ST_PixelOfValue(
raster rast , integer nband , double precision search , boolean exclude_nodata_value=true )
;
setof record ST_PixelOfValue(
raster rast , double precision search , boolean exclude_nodata_value=true )
;
获取值等于搜索值的像素的列x、行y坐标。 如果未指定波段,则假定为波段 1。
可用性:2.1.0
SELECT (pixels).* FROM ( SELECT ST_PixelOfValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0), '8BUI'::text, 1, 0 ), 1, 1, 0 ), 2, 3, 0 ), 3, 5, 0 ), 4, 2, 0 ), 5, 4, 255 ) , 1, ARRAY[1, 255]) AS pixels ) AS foo val | x | y -----+---+--- 1 | 1 | 2 1 | 1 | 3 1 | 1 | 4 1 | 1 | 5 1 | 2 | 1 1 | 2 | 2 1 | 2 | 4 1 | 2 | 5 1 | 3 | 1 1 | 3 | 2 1 | 3 | 3 1 | 3 | 4 1 | 4 | 1 1 | 4 | 3 1 | 4 | 4 1 | 4 | 5 1 | 5 | 1 1 | 5 | 2 1 | 5 | 3 255 | 5 | 4 1 | 5 | 5
ST_SetGeoReference — 在一次调用中设置 Georeference 6 地理配准参数。 数字应该用空格分隔。 接受 GDAL 或 ESRI 格式的输入。 默认为 GDAL。
raster ST_SetGeoReference(
raster rast, text georefcoords, text format=GDAL)
;
raster ST_SetGeoReference(
raster rast, double precision upperleftx, double precision upperlefty, double precision scalex, double precision scaley, double precision skewx, double precision skewy)
;
在一次调用中设置 Georeference 6 地理配准参数。 接受“GDAL”或“ESRI”格式的输入。 默认为 GDAL。 如果未提供 6 个坐标,则返回 null。
格式表示的区别如下:
GDAL
:
scalex skewy skewx scaley upperleftx upperlefty
ESRI
:
scalex skewy skewx scaley upperleftx + scalex*0.5 upperlefty + scaley*0.5
![]() | |
如果栅格具有数据库外波段,则更改地理参考可能会导致无法正确访问该波段的外部存储数据。 |
增强:2.1.0 添加 ST_SetGeoReference(raster, double precision, ...) 变体
WITH foo AS ( SELECT ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0) AS rast ) SELECT 0 AS rid, (ST_Metadata(rast)).* FROM foo UNION ALL SELECT 1, (ST_Metadata(ST_SetGeoReference(rast, '10 0 0 -10 0.1 0.1', 'GDAL'))).* FROM foo UNION ALL SELECT 2, (ST_Metadata(ST_SetGeoReference(rast, '10 0 0 -10 5.1 -4.9', 'ESRI'))).* FROM foo UNION ALL SELECT 3, (ST_Metadata(ST_SetGeoReference(rast, 1, 1, 10, -10, 0.001, 0.001))).* FROM foo rid | upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands -----+--------------------+--------------------+-------+--------+--------+--------+-------+-------+------+---------- 0 | 0 | 0 | 5 | 5 | 1 | -1 | 0 | 0 | 0 | 0 1 | 0.1 | 0.1 | 5 | 5 | 10 | -10 | 0 | 0 | 0 | 0 2 | 0.0999999999999996 | 0.0999999999999996 | 5 | 5 | 10 | -10 | 0 | 0 | 0 | 0 3 | 1 | 1 | 5 | 5 | 10 | -10 | 0.001 | 0.001 | 0 | 0
ST_SetRotation — 以弧度设置栅格的旋转。
raster ST_SetRotation(
raster rast, float8 rotation)
;
均匀旋转栅格。 旋转以弧度为单位。 有关更多详细信息,请参阅世界文件。
SELECT ST_ScaleX(rast1), ST_ScaleY(rast1), ST_SkewX(rast1), ST_SkewY(rast1), ST_ScaleX(rast2), ST_ScaleY(rast2), ST_SkewX(rast2), ST_SkewY(rast2) FROM ( SELECT ST_SetRotation(rast, 15) AS rast1, rast as rast2 FROM dummy_rast ) AS foo; st_scalex | st_scaley | st_skewx | st_skewy | st_scalex | st_scaley | st_skewx | st_skewy ---------------------+---------------------+--------------------+--------------------+-----------+-----------+----------+---------- -1.51937582571764 | -2.27906373857646 | 1.95086352047135 | 1.30057568031423 | 2 | 3 | 0 | 0 -0.0379843956429411 | -0.0379843956429411 | 0.0325143920078558 | 0.0325143920078558 | 0.05 | -0.05 | 0 | 0
ST_SetScale — 以坐标参考系为单位设置像素的 X 和 Y 大小。 数字单位/像素宽度/高度。
raster ST_SetScale(
raster rast, float8 xy)
;
raster ST_SetScale(
raster rast, float8 x, float8 y)
;
以坐标参考系为单位设置像素的 X 和 Y 大小。 数字单位/像素宽度/高度。 如果只传入一个单位,则假设 X 和 Y 是相同的数字。
![]() | |
ST_SetScale 与ST_Rescale 的不同之处在于 ST_SetScale 不会对栅格重新采样以匹配栅格范围。 它仅更改栅格的元数据(或地理参考)以纠正最初错误指定的缩放比例。 ST_Rescale 会生成具有不同宽度和高度的栅格,计算结果以适合输入栅格的地理范围。 ST_SetScale 不修改栅格的宽度或高度。 |
更改:2.0.0 在 WKTRaster 版本中,这称为 ST_SetPixelSize。 这在 2.0.0 中发生了变化。
UPDATE dummy_rast SET rast = ST_SetScale(rast, 1.5) WHERE rid = 2; SELECT ST_ScaleX(rast) As pixx, ST_ScaleY(rast) As pixy, Box3D(rast) As newbox FROM dummy_rast WHERE rid = 2; pixx | pixy | newbox ------+------+---------------------------------------------- 1.5 | 1.5 | BOX(3427927.75 5793244 0, 3427935.25 5793251.5 0)
UPDATE dummy_rast SET rast = ST_SetScale(rast, 1.5, 0.55) WHERE rid = 2; SELECT ST_ScaleX(rast) As pixx, ST_ScaleY(rast) As pixy, Box3D(rast) As newbox FROM dummy_rast WHERE rid = 2; pixx | pixy | newbox ------+------+-------------------------------------------- 1.5 | 0.55 | BOX(3427927.75 5793244 0,3427935.25 5793247 0)
ST_SetSkew — 设置地理参考 X 和 Y 倾斜(或旋转参数)。 如果只传入一个,则将X和Y设置为相同的值。
raster ST_SetSkew(
raster rast, float8 skewxy)
;
raster ST_SetSkew(
raster rast, float8 skewx, float8 skewy)
;
设置地理参考 X 和 Y 倾斜(或旋转参数)。 如果只传入一个,则将X和Y设置为相同的值。 有关更多详细信息,请参阅世界文件。
-- Example 1 UPDATE dummy_rast SET rast = ST_SetSkew(rast,1,2) WHERE rid = 1; SELECT rid, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy, ST_GeoReference(rast) as georef FROM dummy_rast WHERE rid = 1; rid | skewx | skewy | georef ----+-------+-------+-------------- 1 | 1 | 2 | 2.0000000000 : 2.0000000000 : 1.0000000000 : 3.0000000000 : 0.5000000000 : 0.5000000000
-- Example 2 set both to same number: UPDATE dummy_rast SET rast = ST_SetSkew(rast,0) WHERE rid = 1; SELECT rid, ST_SkewX(rast) As skewx, ST_SkewY(rast) As skewy, ST_GeoReference(rast) as georef FROM dummy_rast WHERE rid = 1; rid | skewx | skewy | georef -----+-------+-------+-------------- 1 | 0 | 0 | 2.0000000000 : 0.0000000000 : 0.0000000000 : 3.0000000000 : 0.5000000000 : 0.5000000000
ST_SetSRID — 将栅格的 SRID 设置为在 Spatial_ref_sys 表中定义的特定整数 srid。
raster ST_SetSRID(
raster rast, integer srid)
;
将栅格上的 SRID 设置为特定整数值。
![]() | |
此函数不会以任何方式转换栅格 - 它只是设置定义其当前所在坐标参考系统的空间参考的元数据。对于以后的转换很有用。 |
ST_SetUpperLeft — 将栅格左上角的值设置为投影的X和Y坐标。
raster ST_SetUpperLeft(
raster rast, double precision x, double precision y)
;
将栅格像素左上角的值设置为投影的 X 和 Y 坐标
SELECT ST_SetUpperLeft(rast,-71.01,42.37) FROM dummy_rast WHERE rid = 2;
ST_Resample — 重采样一个栅格图像,可以指定重新采样算法、新的尺寸、任意的栅格角点,以及一组栅格地理参考属性,这些属性可以自己定义,也可以从另一个栅格图像中借用。
raster ST_Resample(
raster rast, integer width, integer height, double precision gridx=NULL, double precision gridy=NULL, double precision skewx=0, double precision skewy=0, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Resample(
raster rast, double precision scalex=0, double precision scaley=0, double precision gridx=NULL, double precision gridy=NULL, double precision skewx=0, double precision skewy=0, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Resample(
raster rast, raster ref, text algorithm=NearestNeighbor, double precision maxerr=0.125, boolean usescale=true)
;
raster ST_Resample(
raster rast, raster ref, boolean usescale, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
使用指定的重新采样算法、新的尺寸(width&height)、一个网格角点(gridx & gridy),以及一组栅格地理参考属性(scalex、scaley、skewx & skewy),这些属性可以自己定义,也可以从另一个栅格图像中借用。如果使用参考栅格图像,那么这两个栅格图像必须具有相同的空间参考ID(SRID)。
使用以下重采样算法之一计算新像素值:
NearestNeighbor (英语或美式拼写)
Bilinear
Cubic
CubicSpline
Lanczos
Max
Min
默认值是“NearestNeighbor”,它速度最快,但插值效果最差。
如果未指定 maxerr
,则使用 0.125 的 maxerror 百分比。
![]() | |
有关更多详细信息,请参阅:GDAL Warp 重采样方法。 |
可用性:2.0.0 需要 GDAL 1.6.1+
增强:3.4.0 添加了最大和最小重采样选项
SELECT ST_Width(orig) AS orig_width, ST_Width(reduce_100) AS new_width FROM ( SELECT rast AS orig, ST_Resample(rast,100,100) AS reduce_100 FROM aerials.boston WHERE ST_Intersects(rast, ST_Transform( ST_MakeEnvelope(-71.128, 42.2392,-71.1277, 42.2397, 4326),26986) ) LIMIT 1 ) AS foo; orig_width | new_width ------------+------------- 200 | 100
ST_Rescale — 通过仅调整栅格的比例(或像素大小)来重新采样栅格。 新的像素值是使用 NearestNeighbor(英语或美式拼写)、Bilinear、Cubic、CubicSpline、 Lanczos、Max或Min重采样算法计算的。 默认为NearestNeighbor。
raster ST_Rescale(
raster rast, double precision scalexy, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Rescale(
raster rast, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
通过仅调整栅格的比例(或像素大小)来重新采样栅格。 使用以下重采样算法之一计算新像素值:
NearestNeighbor (英语或美式拼写)
Bilinear
Cubic
CubicSpline
Lanczos
Max
Min
默认值是“NearestNeighbor”,它速度最快,但插值效果最差。
scalex
和scaley
定义新的像素大小。 为了获得良好定向的栅格,scaley 通常必须为负值。
当新的scalex或scaley不是栅格宽度或高度的约数时,生成的栅格的范围将扩展以包含所提供栅格的范围。 如果您想确保保留精确的输入范围,请参阅 ST_Resize
maxerr
是重采样算法进行变换近似的阈值(以像素为单位)。 如果未指定 maxerr
,则使用默认值 0.125,该值与 GDAL gdalwarp 实用程序中使用的值相同。 如果设置为零,则不会发生近似。
![]() | |
有关更多详细信息,请参阅:GDAL Warp 重采样方法。 |
![]() | |
ST_Rescale 与ST_SetScale的不同之处在于 ST_SetScale 不会对栅格重新采样以匹配栅格范围。 ST_SetScale 仅更改栅格的元数据(或地理参考)以纠正最初错误指定的缩放比例。 ST_Rescale 会生成具有不同宽度和高度的栅格,计算结果以适合输入栅格的地理范围。 ST_SetScale 不修改栅格的宽度或高度。 |
可用性:2.0.0 需要 GDAL 1.6.1+
增强:3.4.0 添加了最大和最小重采样选项
更改:2.1.0 适用于没有 SRID 的栅格
将栅格从 0.001 度的像素大小重新缩放为 0.0015 度的像素大小的简单示例。
-- the original raster pixel size SELECT ST_PixelWidth(ST_AddBand(ST_MakeEmptyRaster(100, 100, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0)) width width ---------- 0.001 -- the rescaled raster raster pixel size SELECT ST_PixelWidth(ST_Rescale(ST_AddBand(ST_MakeEmptyRaster(100, 100, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0), 0.0015)) width width ---------- 0.0015
ST_Reskew — 通过仅调整栅格的倾斜(或旋转参数)来重采样栅格。 新的像素值是使用 NearestNeighbor(英语或美式拼写)、Bilinear、Cubic、CubicSpline或 Lanczos 重采样算法计算的。 默认为NearestNeighbor。
raster ST_Reskew(
raster rast, double precision skewxy, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Reskew(
raster rast, double precision skewx, double precision skewy, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
通过仅调整栅格的倾斜(或旋转参数)来重采样栅格。 新的像素值是使用NearestNeighbor (英语或美式拼写)、Bilinear, Cubic, CubicSpline或 Lanczos 重采样算法计算的。 默认值是“NearestNeighbor”,它速度最快,但插值效果最差。
skewx
和 skewy
定义新的倾斜。
新栅格的范围将包含所提供栅格的范围。
如果未指定 maxerr
,则 maxerror 百分比为 0.125。
![]() | |
有关更多详细信息,请参阅:GDAL Warp 重采样方法。 |
![]() | |
ST_Reskew 与 ST_SetSkew 的不同之处在于 ST_SetSkew 不会对栅格重新采样以匹配栅格范围。 ST_SetSkew 仅更改栅格的元数据(或地理参考)以纠正最初错误指定的倾斜。 ST_Reskew 会生成具有不同宽度和高度的栅格,计算结果以适合输入栅格的地理范围。 ST_SetSkew 不修改栅格的宽度或高度。 |
可用性:2.0.0 需要 GDAL 1.6.1+
更改:2.1.0 适用于没有 SRID 的栅格
将栅格从倾斜 0.0 重新倾斜到倾斜 0.0015 的简单示例。
-- the original raster non-rotated SELECT ST_Rotation(ST_AddBand(ST_MakeEmptyRaster(100, 100, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0)); -- result 0 -- the reskewed raster raster rotation SELECT ST_Rotation(ST_Reskew(ST_AddBand(ST_MakeEmptyRaster(100, 100, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0), 0.0015)); -- result -0.982793723247329
ST_SnapToGrid — 通过将栅格捕捉到网格来重采样栅格。 新的像素值是使用NearestNeighbor(英语或美式拼写)、Bilinear, Cubic, CubicSpline 或 Lanczos 重采样算法计算的。 默认为NearestNeighbor。
raster ST_SnapToGrid(
raster rast, double precision gridx, double precision gridy, text algorithm=NearestNeighbor, double precision maxerr=0.125, double precision scalex=DEFAULT 0, double precision scaley=DEFAULT 0)
;
raster ST_SnapToGrid(
raster rast, double precision gridx, double precision gridy, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_SnapToGrid(
raster rast, double precision gridx, double precision gridy, double precision scalexy, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
通过将栅格图像重新采样,将其对齐到由任意像素角点(gridx & gridy)定义的网格,可选地使用像素大小(scalex & scaley)。新的像素值是使用最近邻(NearestNeighbor,英式或美式拼写)、双线性(Bilinear)、三次样条(Cubic)、立方样条(CubicSpline)或兰索斯(Lanczos)重新采样算法计算的。默认情况下使用最近邻(NearestNeighbor),这是最快但插值效果最差的算法。
gridx
和 gridy
定义新网格的任意像素角。 这不一定是新栅格的左上角,也不必位于新栅格范围的内部或边缘。
您可以选择使用scalex
和scaley
定义新网格的像素大小。
新栅格的范围将包含所提供栅格的范围。
如果未指定 maxerr
,则 maxerror 百分比为 0.125。
![]() | |
有关更多详细信息,请参阅:GDAL Warp 重采样方法。 |
![]() | |
如果您需要对网格参数进行更多控制,请使用 ST_Resample。 |
可用性:2.0.0 需要 GDAL 1.6.1+
更改:2.1.0 适用于没有 SRID 的栅格
将栅格捕捉到稍微不同的网格的简单示例。
-- the original raster upper left X SELECT ST_UpperLeftX(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0)); -- result 0 -- the upper left of raster after snapping SELECT ST_UpperLeftX(ST_SnapToGrid(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0), 0.0002, 0.0002)); --result -0.0008
ST_Resize — 将栅格大小调整为新的宽度/高度
raster ST_Resize(
raster rast, integer width, integer height, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Resize(
raster rast, double precision percentwidth, double precision percentheight, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Resize(
raster rast, text width, text height, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
将栅格大小调整为新的宽度/高度。 新的宽度/高度可以以精确的像素数或栅格宽度/高度的百分比来指定。 新栅格的范围将与提供的栅格的范围相同。
新的像素值是使用NearestNeighbor(英语或美式拼写)、Bilinear, Cubic, CubicSpline或 Lanczos 重采样算法计算的。 默认值是“NearestNeighbor”,它速度最快,但插值效果最差。
变体 1 期望输出栅格的实际宽度/高度。
变体 2 期望零 (0) 和一 (1) 之间的十进制值,表示输入栅格宽度/高度的百分比。
变体3可以接受输出栅格图像的实际宽度/高度,也可以接受文本百分比(例如 "20%"),表示输入栅格图像宽度/高度的百分比。
可用性:2.1.0 需要 GDAL 1.6.1+
WITH foo AS( SELECT 1 AS rid, ST_Resize( ST_AddBand( ST_MakeEmptyRaster(1000, 1000, 0, 0, 1, -1, 0, 0, 0) , 1, '8BUI', 255, 0 ) , '50%', '500') AS rast UNION ALL SELECT 2 AS rid, ST_Resize( ST_AddBand( ST_MakeEmptyRaster(1000, 1000, 0, 0, 1, -1, 0, 0, 0) , 1, '8BUI', 255, 0 ) , 500, 100) AS rast UNION ALL SELECT 3 AS rid, ST_Resize( ST_AddBand( ST_MakeEmptyRaster(1000, 1000, 0, 0, 1, -1, 0, 0, 0) , 1, '8BUI', 255, 0 ) , 0.25, 0.9) AS rast ), bar AS ( SELECT rid, ST_Metadata(rast) AS meta, rast FROM foo ) SELECT rid, (meta).* FROM bar rid | upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands -----+------------+------------+-------+--------+--------+--------+-------+-------+------+---------- 1 | 0 | 0 | 500 | 500 | 1 | -1 | 0 | 0 | 0 | 1 2 | 0 | 0 | 500 | 100 | 1 | -1 | 0 | 0 | 0 | 1 3 | 0 | 0 | 250 | 900 | 1 | -1 | 0 | 0 | 0 | 1 (3 rows)
ST_Transform — 使用指定的重采样算法将已知空间参考系统中的栅格重新投影到另一个已知空间参考系统。 选项有 NearestNeighbor、Bilinear、Cubic、CubicSpline、Lanczos(默认为 NearestNeighbor)。
raster ST_Transform(
raster rast, integer srid, text algorithm=NearestNeighbor, double precision maxerr=0.125, double precision scalex, double precision scaley)
;
raster ST_Transform(
raster rast, integer srid, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
raster ST_Transform(
raster rast, raster alignto, text algorithm=NearestNeighbor, double precision maxerr=0.125)
;
使用指定的像素扭曲算法将已知空间参考系统中的栅格重新投影到另一个已知空间参考系统。 如果未指定算法,则使用“NearestNeighbor”;如果未指定 maxerr,则使用 0.125 的 maxerror 百分比。
算法选项有:“NearestNeighbor”、“Bilinear”、“Cubic”、“CubicSpline”和“Lanczos”。 有关更多详细信息,请参阅:GDAL Warp 重采样方法。
ST_Transform 经常与 ST_SetSRID() 混淆。 ST_Transform 实际上将栅格的坐标从一种空间参考系统更改为另一种空间参考系统(并对像素值进行重新采样),而 ST_SetSRID() 只是更改栅格的 SRID 标识符。
与其他变体不同,变体 3 需要参考栅格作为alignto
。 转换后的栅格将转换为参考栅格的空间参考系统 (SRID),并与参考栅格对齐 (ST_SameAlignment = TRUE)。
![]() | |
如果您发现转换支持无法正常工作,您可能需要将环境变量 PROJSO 设置为 PostGIS 正在使用的 .so 或 .dll 投影库。 只需要文件名即可。 例如,在 Windows 上,您可以在控制面板 -> 系统 -> 环境变量中添加一个名为 |
![]() | |
在转换图块覆盖范围时,您几乎总是希望使用参考栅格来确保图块中的对齐方式相同并且没有间隙,如示例所示:变体 3。 |
可用性:2.0.0 需要 GDAL 1.6.1+
增强:2.1.0 添加 ST_Transform(rast,alignto) 变体
SELECT ST_Width(mass_stm) As w_before, ST_Width(wgs_84) As w_after, ST_Height(mass_stm) As h_before, ST_Height(wgs_84) As h_after FROM ( SELECT rast As mass_stm, ST_Transform(rast,4326) As wgs_84 , ST_Transform(rast,4326, 'Bilinear') AS wgs_84_bilin FROM aerials.o_2_boston WHERE ST_Intersects(rast, ST_Transform(ST_MakeEnvelope(-71.128, 42.2392,-71.1277, 42.2397, 4326),26986) ) LIMIT 1) As foo; w_before | w_after | h_before | h_after ----------+---------+----------+--------- 200 | 228 | 200 | 170
![]() 原始的马萨诸塞州平面米(mass_stm) | ![]() 转换为 wgs 84 经纬度 (wgs_84) 后 | ![]() 使用双线性算法而不是 NN 默认值 (wgs_84_bilin) 转换为 wgs 84 经纬度后 |
下面展示了使用 ST_Transform(raster, srid) 和 ST_Transform(raster,alignto) 之间的区别
WITH foo AS ( SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 1, 0) AS rast UNION ALL SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 2, 0) AS rast UNION ALL SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 3, 0) AS rast UNION ALL SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 10, 0) AS rast UNION ALL SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 20, 0) AS rast UNION ALL SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 30, 0) AS rast UNION ALL SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 100, 0) AS rast UNION ALL SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 200, 0) AS rast UNION ALL SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 300, 0) AS rast ), bar AS ( SELECT ST_Transform(rast, 4269) AS alignto FROM foo LIMIT 1 ), baz AS ( SELECT rid, rast, ST_Transform(rast, 4269) AS not_aligned, ST_Transform(rast, alignto) AS aligned FROM foo CROSS JOIN bar ) SELECT ST_SameAlignment(rast) AS rast, ST_SameAlignment(not_aligned) AS not_aligned, ST_SameAlignment(aligned) AS aligned FROM baz rast | not_aligned | aligned ------+-------------+--------- t | f | t
![]() 未对齐
| ![]() 对齐
|
ST_SetBandNoDataValue — 设置代表无数据的给定波段的值。 如果未指定波段,则假定为波段 1。 要将波段标记为没有 nodata 值,请设置 nodata 值 = NULL。
raster ST_SetBandNoDataValue(
raster rast, double precision nodatavalue)
;
raster ST_SetBandNoDataValue(
raster rast, integer band, double precision nodatavalue, boolean forcechecking=false)
;
设置表示该带没有数据的值。 如果未指定,则假定为波段 1。 这将影响ST_Polygon、ST_DumpAsPolygons 和 ST_PixelAs...() 函数的结果。
-- change just first band no data value UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast,1, 254) WHERE rid = 2; -- change no data band value of bands 1,2,3 UPDATE dummy_rast SET rast = ST_SetBandNoDataValue( ST_SetBandNoDataValue( ST_SetBandNoDataValue( rast,1, 254) ,2,99), 3,108) WHERE rid = 2; -- wipe out the nodata value this will ensure all pixels are considered for all processing functions UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast,1, NULL) WHERE rid = 2;
ST_SetBandIsNoData — 将带区的 isnodata 标志设置为 TRUE。
raster ST_SetBandIsNoData(
raster rast, integer band=1)
;
将带的isnodata标志设置为true。如果未指定,将假定为第1带。只有在被认为是脏标志时才应调用此函数。也就是说,当调用 ST_BandIsNoData 作为最后一个参数使用 TRUE 和不使用 TRUE 时的结果不同时
可用性: 2.0.0
-- Create dummy table with one raster column create table dummy_rast (rid integer, rast raster); -- Add raster with two bands, one pixel/band. In the first band, nodatavalue = pixel value = 3. -- In the second band, nodatavalue = 13, pixel value = 4 insert into dummy_rast values(1, ( '01' -- little endian (uint8 ndr) || '0000' -- version (uint16 0) || '0200' -- nBands (uint16 0) || '17263529ED684A3F' -- scaleX (float64 0.000805965234044584) || 'F9253529ED684ABF' -- scaleY (float64 -0.00080596523404458) || '1C9F33CE69E352C0' -- ipX (float64 -75.5533328537098) || '718F0E9A27A44840' -- ipY (float64 49.2824585505576) || 'ED50EB853EC32B3F' -- skewX (float64 0.000211812383858707) || '7550EB853EC32B3F' -- skewY (float64 0.000211812383858704) || 'E6100000' -- SRID (int32 4326) || '0100' -- width (uint16 1) || '0100' -- height (uint16 1) || '4' -- hasnodatavalue set to true, isnodata value set to false (when it should be true) || '2' -- first band type (4BUI) || '03' -- novalue==3 || '03' -- pixel(0,0)==3 (same that nodata) || '0' -- hasnodatavalue set to false || '5' -- second band type (16BSI) || '0D00' -- novalue==13 || '0400' -- pixel(0,0)==4 )::raster ); select st_bandisnodata(rast, 1) from dummy_rast where rid = 1; -- Expected false select st_bandisnodata(rast, 1, TRUE) from dummy_rast where rid = 1; -- Expected true -- The isnodata flag is dirty. We are going to set it to true update dummy_rast set rast = st_setbandisnodata(rast, 1) where rid = 1; select st_bandisnodata(rast, 1) from dummy_rast where rid = 1; -- Expected true
ST_SetBandPath — 更新out-db band的外部路径和band编号
raster ST_SetBandPath(
raster rast, integer band, text outdbpath, integer outdbindex, boolean force=false)
;
更新 out-db band 的外部栅格文件路径和外部波段 编号。
![]() | |
如果 |
可用性:2.5.0
WITH foo AS ( SELECT ST_AddBand(NULL::raster, '/home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif', NULL::int[]) AS rast ) SELECT 1 AS query, * FROM ST_BandMetadata( (SELECT rast FROM foo), ARRAY[1,3,2]::int[] ) UNION ALL SELECT 2, * FROM ST_BandMetadata( ( SELECT ST_SetBandPath( rast, 2, '/home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected2.tif', 1 ) AS rast FROM foo ), ARRAY[1,3,2]::int[] ) ORDER BY 1, 2; query | bandnum | pixeltype | nodatavalue | isoutdb | path | outdbbandnum -------+---------+-----------+-------------+---------+---------------------------------------------------------------------------------+-------------- 1 | 1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 1 | 2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 2 1 | 3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3 2 | 1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 2 | 2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected2.tif | 1 2 | 3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3
ST_SetBandIndex — 更新out-db band的external band编号
raster ST_SetBandIndex(
raster rast, integer band, integer outdbindex, boolean force=false)
;
更新 out-db band 的外部 band 编号。 这不会触及与 out-db band 关联的外部栅格文件
![]() | |
如果 |
![]() | |
在内部,此方法将索引 |
可用性:2.5.0
WITH foo AS ( SELECT ST_AddBand(NULL::raster, '/home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif', NULL::int[]) AS rast ) SELECT 1 AS query, * FROM ST_BandMetadata( (SELECT rast FROM foo), ARRAY[1,3,2]::int[] ) UNION ALL SELECT 2, * FROM ST_BandMetadata( ( SELECT ST_SetBandIndex( rast, 2, 1 ) AS rast FROM foo ), ARRAY[1,3,2]::int[] ) ORDER BY 1, 2; query | bandnum | pixeltype | nodatavalue | isoutdb | path | outdbbandnum -------+---------+-----------+-------------+---------+---------------------------------------------------------------------------------+-------------- 1 | 1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 1 | 2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 2 1 | 3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3 2 | 1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 2 | 2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 2 | 3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3
ST_Count — 返回栅格或栅格覆盖范围的给定波段中的像素数。 如果未指定 band,则默认为 band 1。如果 except_nodata_value 设置为 true,则仅计算不等于 nodata 值的像素。
bigint ST_Count(
raster rast, integer nband=1, boolean exclude_nodata_value=true)
;
bigint ST_Count(
raster rast, boolean exclude_nodata_value)
;
返回栅格或栅格覆盖范围的给定波段中的像素数。 如果未指定 band,则 nband
默认为 1。
![]() | |
如果 |
更改:3.1.0 - 删除了 ST_Count(rastertable, rastercolumn, ...) 变体。 请改用 ST_CountAgg。
可用性: 2.0.0
--example will count all pixels not 249 and one will count all pixels. -- SELECT rid, ST_Count(ST_SetBandNoDataValue(rast,249)) As exclude_nodata, ST_Count(ST_SetBandNoDataValue(rast,249),false) As include_nodata FROM dummy_rast WHERE rid=2; rid | exclude_nodata | include_nodata -----+----------------+---------------- 2 | 23 | 25
ST_CountAgg — 总计的。 返回一组栅格的给定波段中的像素数。 如果未指定 band,则默认为 band 1。如果 except_nodata_value 设置为 true,则仅计算不等于 NODATA 值的像素。
bigint ST_CountAgg(
raster rast, integer nband, boolean exclude_nodata_value, double precision sample_percent)
;
bigint ST_CountAgg(
raster rast, integer nband, boolean exclude_nodata_value)
;
bigint ST_CountAgg(
raster rast, boolean exclude_nodata_value)
;
返回一组栅格的给定波段中的像素数。 如果未指定 band,则 nband
默认为 1。
如果 excex_nodata_value
设置为 true,则仅计算值不等于栅格 NODATA
值的像素。 将 except_nodata_value
设置为 false 以计算所有像素
默认情况下将对所有像素进行采样。 要获得更快的响应,请将sample_percent
设置为零 (0) 到一 (1) 之间的值
可用性:2.2.0
WITH foo AS ( SELECT rast.rast FROM ( SELECT ST_SetValue( ST_SetValue( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,0) , 1, '64BF', 0, 0 ) , 1, 1, 1, -10 ) , 1, 5, 4, 0 ) , 1, 5, 5, 3.14159 ) AS rast ) AS rast FULL JOIN ( SELECT generate_series(1, 10) AS id ) AS id ON 1 = 1 ) SELECT ST_CountAgg(rast, 1, TRUE) FROM foo; st_countagg ------------- 20 (1 row)
ST_Histogram — 返回一组记录,总结了栅格或栅格覆盖数据分布,其中包括分离的分箱范围。如果未指定,将自动计算分箱数。
SETOF record ST_Histogram(
raster rast, integer nband=1, boolean exclude_nodata_value=true, integer bins=autocomputed, double precision[] width=NULL, boolean right=false)
;
SETOF record ST_Histogram(
raster rast, integer nband, integer bins, double precision[] width=NULL, boolean right=false)
;
SETOF record ST_Histogram(
raster rast, integer nband, boolean exclude_nodata_value, integer bins, boolean right)
;
SETOF record ST_Histogram(
raster rast, integer nband, integer bins, boolean right)
;
返回每个 bin 给定栅格波段的记录集,其中包含最小值、最大值、计数、百分比。 如果未指定 band,则 nband
默认为 1。
![]() | |
默认情况下,仅考虑不等于 |
width
width:一个数组,指示每个category/bin 的宽度。 如果箱的数量大于宽度的数量,则宽度会重复。
示例:9 个 bin,宽度为 [a, b, c] 将输出为 [a, b, c, a, b, c, a, b, c]
bins
分组数量——这是您将从函数中返回的记录数(如果指定)。 如果未指定,则自动计算分组数量。
right
从右侧而不是从左侧计算直方图(默认)。 这将评估值 x 的标准从 [a, b) 更改为 (a, b]
更改:3.1.0 删除了 ST_Histogram(table_name, column_name) 变体。
可用性: 2.0.0
SELECT band, (stats).* FROM (SELECT rid, band, ST_Histogram(rast, band) As stats FROM dummy_rast CROSS JOIN generate_series(1,3) As band WHERE rid=2) As foo; band | min | max | count | percent ------+-------+-------+-------+--------- 1 | 249 | 250 | 2 | 0.08 1 | 250 | 251 | 2 | 0.08 1 | 251 | 252 | 1 | 0.04 1 | 252 | 253 | 2 | 0.08 1 | 253 | 254 | 18 | 0.72 2 | 78 | 113.2 | 11 | 0.44 2 | 113.2 | 148.4 | 4 | 0.16 2 | 148.4 | 183.6 | 4 | 0.16 2 | 183.6 | 218.8 | 1 | 0.04 2 | 218.8 | 254 | 5 | 0.2 3 | 62 | 100.4 | 11 | 0.44 3 | 100.4 | 138.8 | 5 | 0.2 3 | 138.8 | 177.2 | 4 | 0.16 3 | 177.2 | 215.6 | 1 | 0.04 3 | 215.6 | 254 | 4 | 0.16
SELECT (stats).* FROM (SELECT rid, ST_Histogram(rast, 2,6) As stats FROM dummy_rast WHERE rid=2) As foo; min | max | count | percent ------------+------------+-------+--------- 78 | 107.333333 | 9 | 0.36 107.333333 | 136.666667 | 6 | 0.24 136.666667 | 166 | 0 | 0 166 | 195.333333 | 4 | 0.16 195.333333 | 224.666667 | 1 | 0.04 224.666667 | 254 | 5 | 0.2 (6 rows) -- Same as previous but we explicitly control the pixel value range of each bin. SELECT (stats).* FROM (SELECT rid, ST_Histogram(rast, 2,6,ARRAY[0.5,1,4,100,5]) As stats FROM dummy_rast WHERE rid=2) As foo; min | max | count | percent -------+-------+-------+---------- 78 | 78.5 | 1 | 0.08 78.5 | 79.5 | 1 | 0.04 79.5 | 83.5 | 0 | 0 83.5 | 183.5 | 17 | 0.0068 183.5 | 188.5 | 0 | 0 188.5 | 254 | 6 | 0.003664 (6 rows)
ST_Quantile — 计算样本或总体上下文中栅格或栅格表覆盖范围的分位数。 因此,可以检查某个值是否位于栅格的 25%、50%、75% 百分位处。
SETOF record ST_Quantile(
raster rast, integer nband=1, boolean exclude_nodata_value=true, double precision[] quantiles=NULL)
;
SETOF record ST_Quantile(
raster rast, double precision[] quantiles)
;
SETOF record ST_Quantile(
raster rast, integer nband, double precision[] quantiles)
;
double precision ST_Quantile(
raster rast, double precision quantile)
;
double precision ST_Quantile(
raster rast, boolean exclude_nodata_value, double precision quantile=NULL)
;
double precision ST_Quantile(
raster rast, integer nband, double precision quantile)
;
double precision ST_Quantile(
raster rast, integer nband, boolean exclude_nodata_value, double precision quantile)
;
double precision ST_Quantile(
raster rast, integer nband, double precision quantile)
;
计算样本或总体上下文中栅格或栅格表覆盖范围的分位数。 因此,可以检查某个值是否位于栅格的 25%、50%、75% 百分位处。
![]() | |
如果 |
更改:3.1.0 删除了 ST_Quantile(table_name, column_name) 变体。
可用性: 2.0.0
UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast,249) WHERE rid=2; --Example will consider only pixels of band 1 that are not 249 and in named quantiles -- SELECT (pvq).* FROM (SELECT ST_Quantile(rast, ARRAY[0.25,0.75]) As pvq FROM dummy_rast WHERE rid=2) As foo ORDER BY (pvq).quantile; quantile | value ----------+------- 0.25 | 253 0.75 | 254 SELECT ST_Quantile(rast, 0.75) As value FROM dummy_rast WHERE rid=2; value ------ 254
--real live example. Quantile of all pixels in band 2 intersecting a geometry SELECT rid, (ST_Quantile(rast,2)).* As pvc FROM o_4_boston WHERE ST_Intersects(rast, ST_GeomFromText('POLYGON((224486 892151,224486 892200,224706 892200,224706 892151,224486 892151))',26986) ) ORDER BY value, quantile,rid ; rid | quantile | value -----+----------+------- 1 | 0 | 0 2 | 0 | 0 14 | 0 | 1 15 | 0 | 2 14 | 0.25 | 37 1 | 0.25 | 42 15 | 0.25 | 47 2 | 0.25 | 50 14 | 0.5 | 56 1 | 0.5 | 64 15 | 0.5 | 66 2 | 0.5 | 77 14 | 0.75 | 81 15 | 0.75 | 87 1 | 0.75 | 94 2 | 0.75 | 106 14 | 1 | 199 1 | 1 | 244 2 | 1 | 255 15 | 1 | 255
ST_SummaryStats — 返回一组总结统计信息,包括给定栅格或栅格覆盖的栅格带的计数、总和、均值、标准差、最小值和最大值。如果未指定带号,则假定为带1。
summarystats ST_SummaryStats(
raster rast, boolean exclude_nodata_value)
;
summarystats ST_SummaryStats(
raster rast, integer nband, boolean exclude_nodata_value)
;
返回栅格或栅格覆盖范围的给定栅格波段的summarystats统计信息,其中包含计数、总和、平均值、标准差、最小值、最大值。 如果未指定 band,则 nband
默认为 1。
![]() | |
默认情况下,仅考虑不等于 |
![]() | |
默认情况下将对所有像素进行采样。 为了获得更快的响应,请将 |
更改:3.1.0 ST_SummaryStats(rastertable, rastercolumn, ...) 变体已删除。 请改用 ST_SummaryStatsAgg。
可用性: 2.0.0
SELECT rid, band, (stats).* FROM (SELECT rid, band, ST_SummaryStats(rast, band) As stats FROM dummy_rast CROSS JOIN generate_series(1,3) As band WHERE rid=2) As foo; rid | band | count | sum | mean | stddev | min | max -----+------+-------+------+------------+-----------+-----+----- 2 | 1 | 23 | 5821 | 253.086957 | 1.248061 | 250 | 254 2 | 2 | 25 | 3682 | 147.28 | 59.862188 | 78 | 254 2 | 3 | 25 | 3290 | 131.6 | 61.647384 | 62 | 254
此示例在 64 位 PostGIS 窗口上花费了 574 毫秒,包含所有波士顿建筑物和空中图块(每个图块 150x150 像素 ~ 134,000 个图块),约 102,000 个建筑记录
WITH -- our features of interest feat AS (SELECT gid As building_id, geom_26986 As geom FROM buildings AS b WHERE gid IN(100, 103,150) ), -- clip band 2 of raster tiles to boundaries of builds -- then get stats for these clipped regions b_stats AS (SELECT building_id, (stats).* FROM (SELECT building_id, ST_SummaryStats(ST_Clip(rast,2,geom)) As stats FROM aerials.boston INNER JOIN feat ON ST_Intersects(feat.geom,rast) ) As foo ) -- finally summarize stats SELECT building_id, SUM(count) As num_pixels , MIN(min) As min_pval , MAX(max) As max_pval , SUM(mean*count)/SUM(count) As avg_pval FROM b_stats WHERE count > 0 GROUP BY building_id ORDER BY building_id; building_id | num_pixels | min_pval | max_pval | avg_pval -------------+------------+----------+----------+------------------ 100 | 1090 | 1 | 255 | 61.0697247706422 103 | 655 | 7 | 182 | 70.5038167938931 150 | 895 | 2 | 252 | 185.642458100559
-- stats for each band -- SELECT band, (stats).* FROM (SELECT band, ST_SummaryStats('o_4_boston','rast', band) As stats FROM generate_series(1,3) As band) As foo; band | count | sum | mean | stddev | min | max ------+---------+--------+------------------+------------------+-----+----- 1 | 8450000 | 725799 | 82.7064349112426 | 45.6800222638537 | 0 | 255 2 | 8450000 | 700487 | 81.4197705325444 | 44.2161184161765 | 0 | 255 3 | 8450000 | 575943 | 74.682739408284 | 44.2143885481407 | 0 | 255 -- For a table -- will get better speed if set sampling to less than 100% -- Here we set to 25% and get a much faster answer SELECT band, (stats).* FROM (SELECT band, ST_SummaryStats('o_4_boston','rast', band,true,0.25) As stats FROM generate_series(1,3) As band) As foo; band | count | sum | mean | stddev | min | max ------+---------+--------+------------------+------------------+-----+----- 1 | 2112500 | 180686 | 82.6890480473373 | 45.6961043857248 | 0 | 255 2 | 2112500 | 174571 | 81.448503668639 | 44.2252623171821 | 0 | 255 3 | 2112500 | 144364 | 74.6765884023669 | 44.2014869384578 | 0 | 255
ST_SummaryStatsAgg — 总计的。 返回一组栅格的给定栅格波段的摘要统计信息,其中包含计数、总和、平均值、标准差、最小值、最大值。 如果未指定带号,则假定为带1。
summarystats ST_SummaryStatsAgg(
raster rast, integer nband, boolean exclude_nodata_value, double precision sample_percent)
;
summarystats ST_SummaryStatsAgg(
raster rast, boolean exclude_nodata_value, double precision sample_percent)
;
summarystats ST_SummaryStatsAgg(
raster rast, integer nband, boolean exclude_nodata_value)
;
返回栅格或栅格覆盖范围的给定栅格波段的summarystats统计信息,其中包含计数、总和、平均值、标准差、最小值、最大值。 如果未指定 band,则 nband
默认为 1。
![]() | |
默认情况下,仅考虑不等于 |
![]() | |
默认情况下将对所有像素进行采样。 为了获得更快的响应,请将 |
可用性:2.2.0
WITH foo AS ( SELECT rast.rast FROM ( SELECT ST_SetValue( ST_SetValue( ST_SetValue( ST_AddBand( ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,0) , 1, '64BF', 0, 0 ) , 1, 1, 1, -10 ) , 1, 5, 4, 0 ) , 1, 5, 5, 3.14159 ) AS rast ) AS rast FULL JOIN ( SELECT generate_series(1, 10) AS id ) AS id ON 1 = 1 ) SELECT (stats).count, round((stats).sum::numeric, 3), round((stats).mean::numeric, 3), round((stats).stddev::numeric, 3), round((stats).min::numeric, 3), round((stats).max::numeric, 3) FROM ( SELECT ST_SummaryStatsAgg(rast, 1, TRUE, 1) AS stats FROM foo ) bar; count | round | round | round | round | round -------+---------+--------+-------+---------+------- 20 | -68.584 | -3.429 | 6.571 | -10.000 | 3.142 (1 row)
ST_ValueCount — 返回一组记录,其中包含像素带值以及具有给定值集的栅格(或栅格覆盖范围)给定带中的像素数计数。 如果未指定波段,则默认为波段 1。默认情况下,不计算节点数据值像素。 输出像素中的所有其他值,并将像素带值四舍五入到最接近的整数。
SETOF record ST_ValueCount(
raster rast, integer nband=1, boolean exclude_nodata_value=true, double precision[] searchvalues=NULL, double precision roundto=0, double precision OUT value, integer OUT count)
;
SETOF record ST_ValueCount(
raster rast, integer nband, double precision[] searchvalues, double precision roundto=0, double precision OUT value, integer OUT count)
;
SETOF record ST_ValueCount(
raster rast, double precision[] searchvalues, double precision roundto=0, double precision OUT value, integer OUT count)
;
bigint ST_ValueCount(
raster rast, double precision searchvalue, double precision roundto=0)
;
bigint ST_ValueCount(
raster rast, integer nband, boolean exclude_nodata_value, double precision searchvalue, double precision roundto=0)
;
bigint ST_ValueCount(
raster rast, integer nband, double precision searchvalue, double precision roundto=0)
;
SETOF record ST_ValueCount(
text rastertable, text rastercolumn, integer nband=1, boolean exclude_nodata_value=true, double precision[] searchvalues=NULL, double precision roundto=0, double precision OUT value, integer OUT count)
;
SETOF record ST_ValueCount(
text rastertable, text rastercolumn, double precision[] searchvalues, double precision roundto=0, double precision OUT value, integer OUT count)
;
SETOF record ST_ValueCount(
text rastertable, text rastercolumn, integer nband, double precision[] searchvalues, double precision roundto=0, double precision OUT value, integer OUT count)
;
bigintST_ValueCount(
text rastertable, text rastercolumn, integer nband, boolean exclude_nodata_value, double precision searchvalue, double precision roundto=0)
;
bigint ST_ValueCount(
text rastertable, text rastercolumn, double precision searchvalue, double precision roundto=0)
;
bigint ST_ValueCount(
text rastertable, text rastercolumn, integer nband, double precision searchvalue, double precision roundto=0)
;
返回一组具有列值
计数的记录
,其中包含像素波段值以及所选波段的栅格切片或栅格覆盖范围中的像素计数。
如果未指定波段,则 nband
默认为 1。如果未指定搜索值
,将返回在栅格或栅格覆盖范围中找到的所有像素值。 如果给定一个搜索值,将返回一个整数,而不是表示具有该像素带值的像素计数的记录
![]() | |
如果 |
可用性: 2.0.0
UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast,249) WHERE rid=2; --Example will count only pixels of band 1 that are not 249. -- SELECT (pvc).* FROM (SELECT ST_ValueCount(rast) As pvc FROM dummy_rast WHERE rid=2) As foo ORDER BY (pvc).value; value | count -------+------- 250 | 2 251 | 1 252 | 2 253 | 6 254 | 12 -- Example will coount all pixels of band 1 including 249 -- SELECT (pvc).* FROM (SELECT ST_ValueCount(rast,1,false) As pvc FROM dummy_rast WHERE rid=2) As foo ORDER BY (pvc).value; value | count -------+------- 249 | 2 250 | 2 251 | 1 252 | 2 253 | 6 254 | 12 -- Example will count only non-nodata value pixels of band 2 SELECT (pvc).* FROM (SELECT ST_ValueCount(rast,2) As pvc FROM dummy_rast WHERE rid=2) As foo ORDER BY (pvc).value; value | count -------+------- 78 | 1 79 | 1 88 | 1 89 | 1 96 | 1 97 | 1 98 | 1 99 | 2 112 | 2 :
--real live example. Count all the pixels in an aerial raster tile band 2 intersecting a geometry -- and return only the pixel band values that have a count > 500 SELECT (pvc).value, SUM((pvc).count) As total FROM (SELECT ST_ValueCount(rast,2) As pvc FROM o_4_boston WHERE ST_Intersects(rast, ST_GeomFromText('POLYGON((224486 892151,224486 892200,224706 892200,224706 892151,224486 892151))',26986) ) ) As foo GROUP BY (pvc).value HAVING SUM((pvc).count) > 500 ORDER BY (pvc).value; value | total -------+----- 51 | 502 54 | 521
-- Just return count of pixels in each raster tile that have value of 100 of tiles that intersect a specific geometry -- SELECT rid, ST_ValueCount(rast,2,100) As count FROM o_4_boston WHERE ST_Intersects(rast, ST_GeomFromText('POLYGON((224486 892151,224486 892200,224706 892200,224706 892151,224486 892151))',26986) ) ; rid | count -----+------- 1 | 56 2 | 95 14 | 37 15 | 64
ST_RastFromWKB — 从熟知的二进制 (WKB) 栅格返回栅格值。
raster ST_RastFromWKB(
bytea wkb)
;
给定熟知的二进制 (WKB) 栅格,返回一个栅格。
可用性:2.5.0
SELECT (ST_Metadata( ST_RastFromWKB( '\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\010@\000\000\000\000\000\000\340?\000\000\000\000\000\000\340?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\024\000'::bytea ) )).* AS metadata; upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands ------------+------------+-------+--------+--------+--------+-------+-------+------+---------- 0.5 | 0.5 | 10 | 20 | 2 | 3 | 0 | 0 | 10 | 0
ST_RastFromHexWKB — 从熟知的二进制 (WKB) 栅格的十六进制表示形式返回栅格值。
raster ST_RastFromHexWKB(
text wkb)
;
给定十六进制表示形式的熟知的二进制 (WKB) 栅格,返回一个栅格。
可用性:2.5.0
SELECT (ST_Metadata( ST_RastFromHexWKB( '010000000000000000000000400000000000000840000000000000E03F000000000000E03F000000000000000000000000000000000A0000000A001400' ) )).* AS metadata; upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands ------------+------------+-------+--------+--------+--------+-------+-------+------+---------- 0.5 | 0.5 | 10 | 20 | 2 | 3 | 0 | 0 | 10 | 0
ST_AsBinary/ST_AsWKB — 返回栅格的熟知的二进制 (WKB) 表示形式。
bytea ST_AsBinary(
raster rast, boolean outasin=FALSE)
;
bytea ST_AsWKB(
raster rast, boolean outasin=FALSE)
;
返回栅格的二进制表示形式。 如果 outasin
为 TRUE,则 out-db 带将被视为 in-db。 有关表示的详细信息,请参阅位于 PostGIS 源文件夹中的 raster/doc/RFC2-WellKnownBinaryFormat。
这在二进制游标中非常有用,可以从数据库中提取数据而不将其转换为字符串表示形式。
![]() | |
默认情况下,WKB 输出包含 out-db band 的外部文件路径。 如果客户端无权访问 out-db band 下的栅格文件,请将 |
增强:2.1.0 添加outasin
增强:2.5.0 添加 ST_AsWKB
SELECT ST_AsBinary(rast) As rastbin FROM dummy_rast WHERE rid=1; rastbin --------------------------------------------------------------------------------- \001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\010@\000\000\000\000\000\000\340?\000\000\000\000\000\000\340?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\024\000
ST_AsHexWKB — 返回栅格的十六进制表示形式的熟知的二进制 (WKB)。
bytea ST_AsHexWKB(
raster rast, boolean outasin=FALSE)
;
返回栅格的十六进制表示形式的二进制表示形式。 如果 outasin
为 TRUE,则 out-db 带将被视为 in-db。 有关表示的详细信息,请参阅位于 PostGIS 源文件夹中的 raster/doc/RFC2-WellKnownBinaryFormat。
![]() | |
默认情况下,十六进制 WKB 输出包含 out-db band 的外部文件路径。 如果客户端无权访问 out-db band 下的栅格文件,请将 |
可用性:2.5.0
SELECT ST_AsHexWKB(rast) As rastbin FROM dummy_rast WHERE rid=1; st_ashexwkb ---------------------------------------------------------------------------------------------------------------------------- 010000000000000000000000400000000000000840000000000000E03F000000000000E03F000000000000000000000000000000000A0000000A001400
ST_AsGDALRaster — 以指定的 GDAL 栅格格式返回栅格图块。 栅格格式是编译库支持的格式之一。 使用 ST_GDALDrivers() 获取您的库支持的格式列表。
bytea ST_AsGDALRaster(
raster rast, text format, text[] options=NULL, integer srid=sameassource)
;
返回指定格式的栅格图块。 参数逐项列举如下:
format
格式来输出。 这取决于 libgdal 库中编译的驱动程序。 通常可用的有“JPEG”、“GTIff”、“PNG”。 使用 ST_GDALDrivers获取您的库支持的格式列表。
options
GDAL 选项的文本数组。 有效选项取决于格式。 有关更多详细信息,请参阅 GDAL 栅格格式选项。
srs
要嵌入图像中的 proj4text 或 srtext(来自Spatial_ref_sys)
可用性:2.0.0 - 需要 GDAL >= 1.6.0。
SELECT ST_AsGDALRaster(ST_Union(rast), 'JPEG', ARRAY['QUALITY=50']) As rastjpg FROM dummy_rast WHERE rast && ST_MakeEnvelope(10, 10, 11, 11);
将栅格导出为另一种格式的一种方法是使用 PostgreSQL 大对象导出函数。 我们将重复前面的示例,但也会导出。 请注意,您需要拥有对数据库的超级用户访问权限,因为它使用服务器端 lo 函数。 它还将导出到服务器网络上的路径。 如果需要本地导出,请使用 psql 等效的 lo_ 函数,该函数导出到本地文件系统而不是服务器文件系统。
DROP TABLE IF EXISTS tmp_out ; CREATE TABLE tmp_out AS SELECT lo_from_bytea(0, ST_AsGDALRaster(ST_Union(rast), 'JPEG', ARRAY['QUALITY=50']) ) AS loid FROM dummy_rast WHERE rast && ST_MakeEnvelope(10, 10, 11, 11); SELECT lo_export(loid, '/tmp/dummy.jpg') FROM tmp_out; SELECT lo_unlink(loid) FROM tmp_out;
SELECT ST_AsGDALRaster(rast, 'GTiff') As rastjpg FROM dummy_rast WHERE rid=2; -- Out GeoTiff with jpeg compression, 90% quality SELECT ST_AsGDALRaster(rast, 'GTiff', ARRAY['COMPRESS=JPEG', 'JPEG_QUALITY=90'], 4269) As rasttiff FROM dummy_rast WHERE rid=2;
ST_AsJPEG — 将栅格图块选定的波段作为单个联合摄影导出组 (JPEG) 图像(字节数组)返回。 如果未指定波段且有 1 个或 3 个以上波段,则仅使用第一个波段。 如果只有 3 个波段,则使用所有 3 个波段并将其映射到 RGB。
bytea ST_AsJPEG(
raster rast, text[] options=NULL)
;
bytea ST_AsJPEG(
raster rast, integer nband, integer quality)
;
bytea ST_AsJPEG(
raster rast, integer nband, text[] options=NULL)
;
bytea ST_AsJPEG(
raster rast, integer[] nbands, text[] options=NULL)
;
bytea ST_AsJPEG(
raster rast, integer[] nbands, integer quality)
;
将栅格的选定波段作为单个联合摄影导出组图像 (JPEG) 返回。 如果需要导出为不太常见的栅格类型,请使用 ST_AsGDALRaster。 如果未指定波段且有 1 个或 3 个以上波段,则仅使用第一个波段。 如果有 3 个波段,则使用所有 3 个波段。 该功能有许多变体和许多选项。 以下逐项列出:
nband
用于单波段导出。
nbands
是要导出的波段数组(请注意,JPEG 的最大值为 3),波段的顺序为 RGB。 例如 ARRAY[3,2,1] 表示将波段 3 映射到红色,将波段 2 映射到绿色,将波段 1 映射到蓝色
quality
数字从 0 到 100。数字越高,图像越清晰。
options
text 为 JPEG 定义的 GDAL 选项数组(请查看 JPEG ST_GDALDrivers 的 create_options)。 对于 JPEG,有效的是 PROGRESSIVE
ON 或 OFF,QUALITY
的范围为 0 到 100,默认为 75。有关更多详细信息,请参阅 GDAL 光栅格式选项 。
可用性:2.0.0 - 需要 GDAL >= 1.6.0。
-- output first 3 bands 75% quality SELECT ST_AsJPEG(rast) As rastjpg FROM dummy_rast WHERE rid=2; -- output only first band as 90% quality SELECT ST_AsJPEG(rast,1,90) As rastjpg FROM dummy_rast WHERE rid=2; -- output first 3 bands (but make band 2 Red, band 1 green, and band 3 blue, progressive and 90% quality SELECT ST_AsJPEG(rast,ARRAY[2,1,3],ARRAY['QUALITY=90','PROGRESSIVE=ON']) As rastjpg FROM dummy_rast WHERE rid=2;
ST_AsPNG — 将栅格图块选定的波段作为单个便携式网络图形 (PNG) 图像(字节数组)返回。 如果栅格中有 1、3 或 4 个波段且未指定波段,则使用所有波段。 如果有 2 个以上或多于 4 个波段且未指定波段,则仅使用波段 1。 波段映射到 RGB 或 RGBA 空间。
bytea ST_AsPNG(
raster rast, text[] options=NULL)
;
bytea ST_AsPNG(
raster rast, integer nband, integer compression)
;
bytea ST_AsPNG(
raster rast, integer nband, text[] options=NULL)
;
bytea ST_AsPNG(
raster rast, integer[] nbands, integer compression)
;
bytea ST_AsPNG(
raster rast, integer[] nbands, text[] options=NULL)
;
将栅格的选定波段作为单个便携式网络图形图像 (PNG) 返回。 如果需要导出为不太常见的栅格类型,请使用ST_AsGDALRaster。 如果未指定波段,则导出前 3 个波段。 该功能有许多变体和许多选项。 如果未指定 srid
,则使用栅格的 srid。 以下逐项列出:
nband
用于单波段导出。
nbands
是要导出的波段数组(请注意,PNG 的最大值为 4),波段的顺序为 RGBA。 例如 ARRAY[3,2,1] 表示将波段 3 映射到红色,将波段 2 映射到绿色,将波段 1 映射到蓝色
compression
编号从 1 到 9。数字越大,压缩越大。
options
text 为 PNG 定义的 GDAL 选项数组(请查看 ST_GDALDrivers 的 PNG 的 create_options)。 对于 PNG 来说,有效的只是 ZLEVEL(压缩所花费的时间——默认 6),例如 数组['ZLEVEL=9']。 不允许 WORLDFILE,因为该函数必须输出两个输出。 有关更多详细信息,请参阅 GDAL 栅格格式选项。
可用性:2.0.0 - 需要 GDAL >= 1.6.0。
SELECT ST_AsPNG(rast) As rastpng FROM dummy_rast WHERE rid=2; -- export the first 3 bands and map band 3 to Red, band 1 to Green, band 2 to blue SELECT ST_AsPNG(rast, ARRAY[3,1,2]) As rastpng FROM dummy_rast WHERE rid=2;
ST_AsTIFF — 将栅格选定的波段作为单个 TIFF 图像(字节数组)返回。 如果未指定波段或栅格中不存在任何指定波段,则将尝试使用所有波段。
bytea ST_AsTIFF(
raster rast, text[] options='', integer srid=sameassource)
;
bytea ST_AsTIFF(
raster rast, text compression='', integer srid=sameassource)
;
bytea ST_AsTIFF(
raster rast, integer[] nbands, text compression='', integer srid=sameassource)
;
bytea ST_AsTIFF(
raster rast, integer[] nbands, text[] options, integer srid=sameassource)
;
以单个标记图像文件格式 (TIFF) 返回栅格的选定波段。 如果未指定波段,将尝试使用所有波段。 这是 ST_AsGDALRaster 的包装。 如果需要导出为不太常见的栅格类型,请使用 ST_AsGDALRaster。 该功能有许多变体和许多选项。 如果不存在空间参考 SRS 文本,则使用栅格的空间参考。 以下逐项列出:
nbands
是要导出的波段数组(请注意,PNG 的最大值为 3),波段的顺序为 RGB。 例如 ARRAY[3,2,1] 表示将波段 3 映射到红色,将波段 2 映射到绿色,将波段 1 映射到蓝色
compression
Compression表达式——JPEG90(或其他百分比)、LZW、JPEG、DEFLATE9。
options
text 为 GTiff 定义的 GDAL 创建选项数组(请查看ST_GDALDrivers 的 GTiff 的 create_options)。 或参阅 GDAL 栅格格式选项了解更多详细信息。
srid
栅格的spatial_ref_sys 的srid。 这用于填充地理参考信息
可用性:2.0.0 - 需要 GDAL >= 1.6.0。
SELECT ST_AsTIFF(rast, 'JPEG90') As rasttiff FROM dummy_rast WHERE rid=2;
裁剪
未指定或为 TRUE,则输出栅格将被裁剪。ST_Clip — 返回由输入几何图形裁剪的栅格。 如果未指定波段号,则处理所有波段。 如果裁剪
未指定或为 TRUE,则输出栅格将被裁剪。
raster ST_Clip(
raster rast, integer[] nband, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE)
;
raster ST_Clip(
raster rast, integer nband, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE)
;
raster ST_Clip(
raster rast, integer nband, geometry geom, boolean crop, boolean touched=FALSE)
;
raster ST_Clip(
raster rast, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE)
;
raster ST_Clip(
raster rast, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE)
;
raster ST_Clip(
raster rast, geometry geom, boolean crop, boolean touched=FALSE)
;
返回由输入几何体 geom
裁剪的栅格。 如果未指定波段索引,则处理所有波段。
ST_Clip 生成的栅格必须为剪切区域分配一个节点数据值,每个波段一个。 如果未提供任何内容,并且输入栅格未定义 nodata 值,则生成的栅格的 nodata 值将设置为 ST_MinPossibleValue(ST_BandPixelType(rast, band))。 当数组中的nodata值的数量小于波段的数量时,数组中的最后一个值用于剩余的波段。 如果节点数据值的数量大于波段数量,则忽略多余的节点数据值。 所有接受节点数据值数组的变体也接受将分配给每个波段的单个值。
如果未指定crop
,则假定为true,表示输出栅格将被裁剪到geom
和rast
范围的交集。如果将crop
设置为false,则新的栅格将具有与rast
相同的范围。如果将touched
设置为true,则选择与几何图形相交的rast
中的所有像素。
![]() | |
默认行为是touched=false,这将仅选择像素中心被几何图形覆盖的像素。 |
增强版:3.5.0 - 添加了touched参数。
可用性: 2.0.0
增强:2.1.0 用 C 重写
这里的示例使用马萨诸塞州航拍数据,该数据可在MassGIS网站的MassGIS Aerial Orthos页面上找到。
SELECT ST_Count(rast) AS count_pixels_in_orig, ST_Count(rast_touched) AS all_touched_pixels, ST_Count(rast_not_touched) AS default_clip FROM ST_AsRaster(ST_Letters('R'), scalex = > 1.0, scaley = > -1.0) AS r(rast) INNER JOIN ST_GeomFromText('LINESTRING(0 1, 5 6, 10 10)') AS g(geom) ON ST_Intersects(r.rast,g.geom) , ST_Clip(r.rast, g.geom, touched = > true) AS rast_touched , ST_Clip(r.rast, g.geom, touched = > false) AS rast_not_touched; count_pixels_in_orig | all_touched_pixels | default_clip ----------------------+--------------------+-------------- 2605 | 16 | 10 (1 row)
-- Clip the first band of an aerial tile by a 20 meter buffer. SELECT ST_Clip(rast, 1, ST_Buffer(ST_Centroid(ST_Envelope(rast)),20) ) from aerials.boston WHERE rid = 4;
-- Demonstrate effect of crop on final dimensions of raster -- Note how final extent is clipped to that of the geometry -- if crop = true SELECT ST_XMax(ST_Envelope(ST_Clip(rast, 1, clipper, true))) As xmax_w_trim, ST_XMax(clipper) As xmax_clipper, ST_XMax(ST_Envelope(ST_Clip(rast, 1, clipper, false))) As xmax_wo_trim, ST_XMax(ST_Envelope(rast)) As xmax_rast_orig FROM (SELECT rast, ST_Buffer(ST_Centroid(ST_Envelope(rast)),6) As clipper FROM aerials.boston WHERE rid = 6) As foo; xmax_w_trim | xmax_clipper | xmax_wo_trim | xmax_rast_orig ------------------+------------------+------------------+------------------ 230657.436173996 | 230657.436173996 | 230666.436173996 | 230666.436173996
![]() 裁剪前的完整栅格图块
|
![]() 裁剪后
|
-- Same example as before, but we need to set crop to false to be able to use ST_AddBand -- because ST_AddBand requires all bands be the same Width and height SELECT ST_AddBand(ST_Clip(rast, 1, ST_Buffer(ST_Centroid(ST_Envelope(rast)),20),false ), ARRAY[ST_Band(rast,2),ST_Band(rast,3)] ) from aerials.boston WHERE rid = 6;
![]() 裁剪前的完整栅格图块
|
![]() 剪裁后——超现实
|
-- Clip all bands of an aerial tile by a 20 meter buffer. -- Only difference is we don't specify a specific band to clip -- so all bands are clipped SELECT ST_Clip(rast, ST_Buffer(ST_Centroid(ST_Envelope(rast)), 20), false ) from aerials.boston WHERE rid = 4;
![]() 裁剪前的完整栅格图块
|
![]() 裁剪后
|
ST_ColorMap — 根据源栅格和指定波段创建最多四个 8BUI 波段(灰度、RGB、RGBA)的新栅格。 如果未指定,则假定为波段 1。
raster ST_ColorMap(
raster rast, integer nband=1, text colormap=grayscale, text method=INTERPOLATE)
;
raster ST_ColorMap(
raster rast, text colormap, text method=INTERPOLATE)
;
将colormap
应用于 rast
的 nband
处的波段,从而生成最多由四个 8BUI 波段组成的新栅格。 新栅格中的 8BUI 波段数量由colormap
中定义的颜色分量数量决定。
如果未指定 nband
,则假定为波段 1。
colormap
可以是预定义颜色图的关键字或定义值和颜色分量的一组线。
有效的预定义colormap
关键字:
grayscale
或greyscale
的一个 8BUI 波段栅格的灰度。
pseudocolor
四 8BUI (RGBA) 波段栅格的伪彩色,颜色从蓝色到绿色再到红色。
fire
为四 8BUI (RGBA) 波段栅格,颜色从黑色到红色到浅黄色。
bluered
表示四 8BUI (RGBA) 波段栅格,颜色从蓝色到浅白色再到红色。
用户可以通过 colormap
参数传递一组条目(每行一个)来指定自定义的颜色映射。每个条目通常包括五个值:像素值以及相应的红色、绿色、蓝色、Alpha 组件(颜色组件的取值范围在 0 到 255 之间)。可以使用百分比值代替像素值,其中 0% 和 100% 分别表示栅格带中找到的最小值和最大值。值可以使用逗号(',')、制表符、冒号(':')和/或空格分隔。像素值可以设置为 nv、null 或 nodata,表示 NODATA 值。以下是一个示例。
5 0 0 0 255 4 100:50 55 255 1 150,100 150 255 0% 255 255 255 255 nv 0 0 0 0
colormap
的语法与 GDAL gdaldem 的颜色浮雕模式类似。
method
的有效关键字:
INTERPOLATE
使用线性插值来平滑地混合给定像素值之间的颜色
EXACT
仅严格匹配颜色图中找到的像素值。 值与颜色图条目不匹配的像素将被设置为 0 0 0 0 (RGBA)
NEAREST
使用其值最接近像素值的颜色图条目
![]() | |
ColorBrewer 是色彩图的一个很好的参考。 |
![]() | |
新栅格的结果波段将没有设置 NODATA 值。 如果需要,请使用 ST_SetBandNoDataValue 设置 NODATA 值。 |
可用性:2.1.0
这是一个用于练习的表格
-- setup test raster table -- DROP TABLE IF EXISTS funky_shapes; CREATE TABLE funky_shapes(rast raster); INSERT INTO funky_shapes(rast) WITH ref AS ( SELECT ST_MakeEmptyRaster( 200, 200, 0, 200, 1, -1, 0, 0) AS rast ) SELECT ST_Union(rast) FROM ( SELECT ST_AsRaster( ST_Rotate( ST_Buffer( ST_GeomFromText('LINESTRING(0 2,50 50,150 150,125 50)'), i*2 ), pi() * i * 0.125, ST_Point(50,50) ), ref.rast, '8BUI'::text, i * 5 ) AS rast FROM ref CROSS JOIN generate_series(1, 10, 3) AS i ) AS shapes;
SELECT ST_NumBands(rast) As n_orig, ST_NumBands(ST_ColorMap(rast,1, 'greyscale')) As ngrey, ST_NumBands(ST_ColorMap(rast,1, 'pseudocolor')) As npseudo, ST_NumBands(ST_ColorMap(rast,1, 'fire')) As nfire, ST_NumBands(ST_ColorMap(rast,1, 'bluered')) As nbluered, ST_NumBands(ST_ColorMap(rast,1, ' 100% 255 0 0 80% 160 0 0 50% 130 0 0 30% 30 0 0 20% 60 0 0 0% 0 0 0 nv 255 255 255 ')) As nred FROM funky_shapes;
n_orig | ngrey | npseudo | nfire | nbluered | nred --------+-------+---------+-------+----------+------ 1 | 1 | 4 | 4 | 4 | 3
SELECT ST_AsPNG(rast) As orig_png, ST_AsPNG(ST_ColorMap(rast,1,'greyscale')) As grey_png, ST_AsPNG(ST_ColorMap(rast,1, 'pseudocolor')) As pseudo_png, ST_AsPNG(ST_ColorMap(rast,1, 'nfire')) As fire_png, ST_AsPNG(ST_ColorMap(rast,1, 'bluered')) As bluered_png, ST_AsPNG(ST_ColorMap(rast,1, ' 100% 255 0 0 80% 160 0 0 50% 130 0 0 30% 30 0 0 20% 60 0 0 0% 0 0 0 nv 255 255 255 ')) As red_png FROM funky_shapes;
![]() orig_png
|
![]() grey_png
|
![]() pseudo_png
|
![]() fire_png
|
![]() bluered_png
|
![]() red_png
|
ST_Grayscale — 根据源栅格和代表红色、绿色和蓝色的指定波段创建新的 1-8BUI 波段栅格
(1) raster ST_Grayscale(
raster rast, integer redband=1, integer greenband=2, integer blueband=3, text extenttype=INTERSECTION)
;
(2) raster ST_Grayscale(
rastbandarg[] rastbandargset, text extenttype=INTERSECTION)
;
给定三个输入波段(来自一个或多个栅格),创建一个具有 8BUI 波段的栅格。 任何像素类型不是 8BUI 的输入波段都将使用 ST_Reclass 进行重分类。
![]() | |
此函数与ST_ColorMap不同,ST_ColorMap带有 |
可用性:2.5.0
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL'; SET postgis.enable_outdb_rasters = True; WITH apple AS ( SELECT ST_AddBand( ST_MakeEmptyRaster(350, 246, 0, 0, 1, -1, 0, 0, 0), '/tmp/apple.png'::text, NULL::int[] ) AS rast ) SELECT ST_AsPNG(rast) AS original_png, ST_AsPNG(ST_Grayscale(rast)) AS grayscale_png FROM apple;
![]() original_png
|
![]() grayscale_png
|
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL'; SET postgis.enable_outdb_rasters = True; WITH apple AS ( SELECT ST_AddBand( ST_MakeEmptyRaster(350, 246, 0, 0, 1, -1, 0, 0, 0), '/tmp/apple.png'::text, NULL::int[] ) AS rast ) SELECT ST_AsPNG(rast) AS original_png, ST_AsPNG(ST_Grayscale( ARRAY[ ROW(rast, 1)::rastbandarg, -- red ROW(rast, 2)::rastbandarg, -- green ROW(rast, 3)::rastbandarg, -- blue ]::rastbandarg[] )) AS grayscale_png FROM apple;
ST_Intersection — 返回一个栅格或一组几何像素值对,表示两个栅格的共享部分或栅格矢量化和几何图形的几何交集。
setof geomval ST_Intersection(
geometry geom, raster rast, integer band_num=1)
;
setof geomval ST_Intersection(
raster rast, geometry geom)
;
setof geomval ST_Intersection(
raster rast, integer band, geometry geomin)
;
raster ST_Intersection(
raster rast1, raster rast2, double precision[] nodataval)
;
raster ST_Intersection(
raster rast1, raster rast2, text returnband, double precision[] nodataval)
;
raster ST_Intersection(
raster rast1, integer band1, raster rast2, integer band2, double precision[] nodataval)
;
raster ST_Intersection(
raster rast1, integer band1, raster rast2, integer band2, text returnband, double precision[] nodataval)
;
返回一个栅格或一组几何像素值对,表示两个栅格的共享部分或栅格矢量化和几何图形的几何交集。
前三个变体返回一组 geomval,在向量空间中工作。 首先将栅格矢量化(使用ST_DumpAsPolygons)为一组 geomval 行,然后使用 ST_Intersection (geometry, Geometry) PostGIS 函数将这些行与几何相交。 仅与栅格的无数据值区域相交的几何将返回空几何。 通常通过在 WHERE 子句中正确使用 ST_Intersects将它们从结果中排除。
您可以通过用括号将它们括起来并在表达式末尾添加“.geom”或“.val”来访问几何图形和生成的 geomval 集的值部分。 例如 (ST_Intersection(rast, geom)).geom
其他变体返回光栅,在光栅空间中工作。 他们使用 ST_MapAlgebraExpr 的两个栅格版本来执行交集。
生成的栅格范围对应于两个栅格范围的几何交集。 生成的栅格包含“BAND1”、“BAND2”或“BOTH”波段,遵循作为 returnband
参数传递的内容。 任何波段中存在的无数据值区域都会导致结果的每个波段中出现无数据值区域。 换句话说,与无数据值像素相交的任何像素都成为结果中的无数据值像素。
由 ST_Intersection 生成的栅格必须为不相交的区域分配 nodata 值。 您可以通过提供一个包含一个或两个 nodata 值的 nodataval[]
数组来定义或替换任何结果频段的 nodata 值,具体取决于您是否请求“BAND1”、“BAND2”或“BOTH”频段。 数组中的第一个值替换第一个带中的无数据值,第二个值替换第二个带中的无数据值。 如果一个输入带没有定义 nodata 值并且没有以数组形式提供,则使用 ST_MinPossibleValue 函数选择一个。 所有接受 nodata 值数组的变体也可以接受单个值,该值将分配给每个请求的带。
在所有变体中,如果未指定波段编号,则假定波段 1。 如果您需要栅格和返回栅格的几何图形之间的交集,请参阅 ST_Clip。
![]() | |
要更好地控制结果范围或遇到无数据值时返回的内容,请使用 ST_MapAlgebraExpr的两个栅格版本。 |
![]() | |
要计算栅格波段与栅格空间中几何图形的交集,请使用 ST_Clip。 ST_Clip 适用于多波段栅格,并且不返回与栅格化几何对应的波段。 |
![]() | |
ST_Intersection 应与 ST_Intersects 以及栅格列和/或几何列上的索引结合使用。 |
增强:2.0.0 - 引入了光栅空间中的交集。 在 2.0.0 之前的早期版本中,仅支持在向量空间中执行交集。
SELECT foo.rid, foo.gid, ST_AsText((foo.geomval).geom) As geomwkt, (foo.geomval).val FROM ( SELECT A.rid, g.gid, ST_Intersection(A.rast, g.geom) As geomval FROM dummy_rast AS A CROSS JOIN ( VALUES (1, ST_Point(3427928, 5793243.85) ), (2, ST_GeomFromText('LINESTRING(3427927.85 5793243.75,3427927.8 5793243.75,3427927.8 5793243.8)')), (3, ST_GeomFromText('LINESTRING(1 2, 3 4)')) ) As g(gid,geom) WHERE A.rid = 2 ) As foo; rid | gid | geomwkt | val -----+-----+--------------------------------------------------------------------------------------------- 2 | 1 | POINT(3427928 5793243.85) | 249 2 | 1 | POINT(3427928 5793243.85) | 253 2 | 2 | POINT(3427927.85 5793243.75) | 254 2 | 2 | POINT(3427927.8 5793243.8) | 251 2 | 2 | POINT(3427927.8 5793243.8) | 253 2 | 2 | LINESTRING(3427927.8 5793243.75,3427927.8 5793243.8) | 252 2 | 2 | MULTILINESTRING((3427927.8 5793243.8,3427927.8 5793243.75),...) | 250 2 | 3 | GEOMETRYCOLLECTION EMPTY
ST_MapAlgebra (callback function version) — 回调函数版本 - 给定一个或多个输入栅格、波段索引和一个用户指定的回调函数,返回单波段栅格。
raster ST_MapAlgebra(
rastbandarg[] rastbandargset, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast, integer[] nband, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=FIRST, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast, integer nband, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=FIRST, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast1, integer nband1, raster rast2, integer nband2, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL)
;
raster ST_MapAlgebra(
raster rast, integer nband, regprocedure callbackfunc, float8[] mask, boolean weighted, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, text[] VARIADIC userargs=NULL)
;
给定一个或多个输入栅格、波段索引和一个用户指定的回调函数,返回单波段栅格。
rast,rast1,rast2, rastbandargset
评估地图代数过程的栅格。
rastbandargset
允许在许多栅格和/或许多波段上使用地图代数运算。 请参见示例变体 1。
nband, nband1, nband2
要评估的栅格的波段号。 nband 可以是表示波段的整数或整数[]。 对于 hte 2 raster/2band 情况,nband1 是 rast1 上的波段,nband2 是 rast2 上的波段。
callbackfunc
callbackfunc
参数必须是 SQL 或 PL/pgSQL 函数的名称和签名,转换为 regprocedure。 PL/pgSQL 函数示例如下:
CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], position integer[][], VARIADIC userargs text[]) RETURNS double precision AS $$ BEGIN RETURN 0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
Callbackfunc
必须具有三个参数:一个 3 维双精度数组、一个 2 维整数数组和一个可变的 1 维文本数组。 第一个参数value
是所有输入栅格的值集(双精度)。 三个维度(其中索引从 1 开始)是:栅格编号、行 y、列 x。 第二个参数position
是输出栅格和输入栅格的像素位置集。 外部维度(索引从 0 开始)是栅格#。 外部维度索引 0 处的位置是输出栅格的像素位置。 对于每个外部维度,内部维度中有两个元素用于 X 和 Y。第三个参数 userargs
用于传递任何用户指定的参数。
将 regprocedure 参数传递给 SQL 函数需要传递完整的函数签名,然后转换为 regprocedure 类型。 要将上述示例 PL/pgSQL 函数作为参数传递,参数的 SQL 为:
'sample_callbackfunc(double precision[], integer[], text[])'::regprocedure
请注意,参数包含函数名称、函数参数类型、名称和参数类型周围的引号以及对 regprocedure 的强制转换。
mask
n 维数字数组(矩阵),用于过滤传递给映射代数回调函数的单元格。 0 表示相邻像元值应被视为无数据,1 表示值应被视为数据。 如果权重设置为 true,则这些值将用作乘数,以乘以邻域位置中该值的像素值。
weighted
布尔值(true/false)表示掩码值是否应该加权(乘以原始值)(仅适用于采用掩码的原型)。
pixeltype
如果传入像素类型
,则新栅格的一个波段将属于该像素类型。 如果将像素类型传递为 NULL 或省略,则新栅格波段将具有与第一个栅格的指定波段(对于范围类型:INTERSECTION、UNION、FIRST、CUSTOM)或相应栅格的指定波段(对于范围)相同的像素类型。 类型:第二个、最后一个)。 如果有疑问,请始终指定像素类型
。
输出栅格的结果像素类型必须是ST_BandPixelType 中列出的类型,或者省略或设置为 NULL。
extenttype
可能的值为 INTERSECTION(默认)、UNION、FIRST(一个栅格变体的默认值)、SECOND、LAST、CUSTOM。
customextent
如果extenttype
是CUSTOM,则必须为customextent
提供栅格。 请参见变体 1 的示例 4。
distancex
x 方向上距参考单元格的距离(以像素为单位)。 因此,结果矩阵的宽度将为 2*distancex + 1
。如果未指定,则仅考虑参考单元(0 的邻域)。
distancey
y 方向上距参考单元的距离(以像素为单位)。 结果矩阵的高度将为 2*distancey + 1
。如果未指定,则仅考虑参考单元格(0 的邻域)。
userargs
callbackfunc
的第三个参数是一个可变文本数组。 所有尾随文本参数都传递到指定的callbackfunc
,并包含在 userargs
参数中。
![]() | |
有关 VARIADIC 关键字的更多信息,请参阅 PostgreSQL 文档和查询语言 (SQL) 函数的“具有可变参数数量的 SQL 函数”部分。 |
![]() | |
无论您是否选择将任何参数传递给回调函数进行处理, text[] 参数在 |
变体 1 接受 rastbandarg
数组,允许在许多栅格和/或许多波段上使用地图代数运算。 请参见示例变体 1。
变体 2 和 3 对一个栅格的一个或多个波段进行操作。 请参阅示例变体 2 和 3。
变体 4 对两个栅格进行操作,每个栅格一个波段。 请参见示例变体 4。
可用性:2.2.0:能够添加遮罩
可用性:2.1.0
一个栅格,一个波段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast ) SELECT ST_MapAlgebra( ARRAY[ROW(rast, 1)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
一个栅格,多个波段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast ) SELECT ST_MapAlgebra( ARRAY[ROW(rast, 3), ROW(rast, 1), ROW(rast, 3), ROW(rast, 2)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
多个栅格,多个波段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast ) SELECT ST_MapAlgebra( ARRAY[ROW(t1.rast, 3), ROW(t2.rast, 1), ROW(t2.rast, 3), ROW(t1.rast, 2)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 1 AND t2.rid = 2
邻域覆盖图块的完整示例。 此查询仅适用于 PostgreSQL 9.1 或更高版本。
WITH foo AS ( SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast UNION ALL SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, 0, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0) AS rast UNION ALL SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, 0, 1, -1, 0, 0, 0), 1, '16BUI', 3, 0) AS rast UNION ALL SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -2, 1, -1, 0, 0, 0), 1, '16BUI', 10, 0) AS rast UNION ALL SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -2, 1, -1, 0, 0, 0), 1, '16BUI', 20, 0) AS rast UNION ALL SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -2, 1, -1, 0, 0, 0), 1, '16BUI', 30, 0) AS rast UNION ALL SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast ) SELECT t1.rid, ST_MapAlgebra( ARRAY[ROW(ST_Union(t2.rast), 1)]::rastbandarg[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure, '32BUI', 'CUSTOM', t1.rast, 1, 1 ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 4 AND t2.rid BETWEEN 0 AND 8 AND ST_Intersects(t1.rast, t2.rast) GROUP BY t1.rid, t1.rast
示例类似于前一个具有邻域覆盖范围的图块,但适用于 PostgreSQL 9.0。
WITH src AS ( SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast UNION ALL SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, 0, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0) AS rast UNION ALL SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, 0, 1, -1, 0, 0, 0), 1, '16BUI', 3, 0) AS rast UNION ALL SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -2, 1, -1, 0, 0, 0), 1, '16BUI', 10, 0) AS rast UNION ALL SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -2, 1, -1, 0, 0, 0), 1, '16BUI', 20, 0) AS rast UNION ALL SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -2, 1, -1, 0, 0, 0), 1, '16BUI', 30, 0) AS rast UNION ALL SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast ) WITH foo AS ( SELECT t1.rid, ST_Union(t2.rast) AS rast FROM src t1 JOIN src t2 ON ST_Intersects(t1.rast, t2.rast) AND t2.rid BETWEEN 0 AND 8 WHERE t1.rid = 4 GROUP BY t1.rid ), bar AS ( SELECT t1.rid, ST_MapAlgebra( ARRAY[ROW(t2.rast, 1)]::rastbandarg[], 'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure, '32BUI', 'CUSTOM', t1.rast, 1, 1 ) AS rast FROM src t1 JOIN foo t2 ON t1.rid = t2.rid ) SELECT rid, (ST_Metadata(rast)), (ST_BandMetadata(rast, 1)), ST_Value(rast, 1, 1, 1) FROM bar;
一个栅格,多个波段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast ) SELECT ST_MapAlgebra( rast, ARRAY[3, 1, 3, 2]::integer[], 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
一个栅格,一个波段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast ) SELECT ST_MapAlgebra( rast, 2, 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo
两个栅格,两个波段
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast ) SELECT ST_MapAlgebra( t1.rast, 2, t2.rast, 1, 'sample_callbackfunc(double precision[], int[], text[])'::regprocedure ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 1 AND t2.rid = 2
WITH foo AS (SELECT ST_SetBandNoDataValue( ST_SetValue(ST_SetValue(ST_AsRaster( ST_Buffer( ST_GeomFromText('LINESTRING(50 50,100 90,100 50)'), 5,'join=bevel'), 200,200,ARRAY['8BUI'], ARRAY[100], ARRAY[0]), ST_Buffer('POINT(70 70)'::geometry,10,'quad_segs=1') ,50), 'LINESTRING(20 20, 100 100, 150 98)'::geometry,1),0) AS rast ) SELECT 'original' AS title, rast FROM foo UNION ALL SELECT 'no mask mean value' AS title, ST_MapAlgebra(rast,1,'ST_mean4ma(double precision[], int[], text[])'::regprocedure) AS rast FROM foo UNION ALL SELECT 'mask only consider neighbors, exclude center' AS title, ST_MapAlgebra(rast,1,'ST_mean4ma(double precision[], int[], text[])'::regprocedure, '{{1,1,1}, {1,0,1}, {1,1,1}}'::double precision[], false) As rast FROM foo UNION ALL SELECT 'mask weighted only consider neighbors, exclude center multi otehr pixel values by 2' AS title, ST_MapAlgebra(rast,1,'ST_mean4ma(double precision[], int[], text[])'::regprocedure, '{{2,2,2}, {2,0,2}, {2,2,2}}'::double precision[], true) As rast FROM foo;
![]() 原始的
|
![]() 无掩模均值(与遮罩矩阵中全为1相同)
|
![]() 掩模 只考虑邻居,排除中心
|
![]() 掩模加权仅考虑相邻像素,排除中心像素,并将其他像素值乘以2
|
ST_MapAlgebra (expression version) — 表达式版本 - 在给定一两个输入栅格、波段索引和一个或多个用户指定的 SQL 表达式的情况下,返回单波段栅格。
raster ST_MapAlgebra(
raster rast, integer nband, text pixeltype, text expression, double precision nodataval=NULL)
;
raster ST_MapAlgebra(
raster rast, text pixeltype, text expression, double precision nodataval=NULL)
;
raster ST_MapAlgebra(
raster rast1, integer nband1, raster rast2, integer nband2, text expression, text pixeltype=NULL, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL)
;
raster ST_MapAlgebra(
raster rast1, raster rast2, text expression, text pixeltype=NULL, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL)
;
表达式版本 - 在给定一两个输入栅格、波段索引和一个或多个用户指定的 SQL 表达式的情况下,返回单波段栅格。
可用性:2.1.0
通过应用由输入栅格 (rast
) 上的expression
定义的有效 PostgreSQL 代数运算来创建新的单波段栅格。 如果未提供 nband
,则假定为波段 1。 新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果传入像素类型
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL,则新的栅格带将具有与输入栅格
带相同的像素类型。
允许expression
的关键字
[rast]
- 感兴趣像素的像素值
[rast.val]
- 感兴趣像素的像素值
[rast.x]
- 感兴趣像素的基于 1 的像素列
[rast.y]
- 感兴趣像素的从 1 开始的像素行
通过对两个输入栅格波段 rast1
, (rast2
) 上的expression
定义的两个波段应用有效的 PostgreSQL 代数运算,创建一个新的单波段栅格。 如果没有 band1
,则指定 band2
,则假定为 band 1。 生成的栅格将在第一个栅格定义的网格上对齐(比例、倾斜和像素角)。 生成的栅格将具有由extenttype
参数定义的范围。
expression
涉及两个栅格的 PostgreSQL 代数表达式和 PostgreSQL 定义的函数/运算符,用于定义像素相交时的像素值。 例如 (([rast1] [rast2])/2.0)::integer
pixeltype
输出栅格的结果像素类型。 必须是ST_BandPixelType 中列出的一项,可省略或设置为 NULL。 如果未传入或设置为 NULL,将默认为第一个栅格的像素类型。
extenttype
控制生成的栅格的范围
INTERSECTION
- 新栅格的范围是两个栅格的交集。 这是默认设置。
UNION
- 新栅格的范围是两个栅格的并集。
FIRST
- 新栅格的范围与第一个栅格的范围相同。
SECOND
- 新栅格的范围与第二个栅格的范围相同。
nodata1expr
仅涉及 rast2
的代数表达式或定义当 rast1
的像素为无数据值并且空间对应的 rast2 像素具有值时返回的内容的常量。
nodata2expr
仅涉及 rast1
常量的代数表达式,该常量定义当 rast2
的像素为无数据值且空间对应的 rast1 像素具有值时返回的内容。
nodatanodataval
当空间对应的 rast1 和 rast2 像素均为无数据值时要返回的数值常量。
expression
、nodata1expr
和 nodata2expr
中允许使用的关键字
[rast1]
- rast1
中感兴趣的像素的像素值
[rast1.val]
- rast1
中感兴趣像素的像素值
[rast1.x]
- 来自 rast1
的感兴趣像素的基于 1 的像素列
[rast1.y]
- 来自 rast1
的感兴趣像素的基于 1 的像素行
[rast2]
- rast2
中感兴趣像素的像素值
[rast2.val]
- rast2
中感兴趣像素的像素值
[rast2.x]
- 来自 rast2
的感兴趣像素的基于 1 的像素列
[rast2.y]
- 来自 rast2
的感兴趣像素的基于 1 的像素行
WITH foo AS ( SELECT ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 1, 1, 0, 0, 0), '32BF'::text, 1, -1) AS rast ) SELECT ST_MapAlgebra(rast, 1, NULL, 'ceil([rast]*[rast.x]/[rast.y]+[rast.val])') FROM foo;
WITH foo AS ( SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI'::text, 100, 0) AS rast UNION ALL SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI'::text, 300, 0) AS rast ) SELECT ST_MapAlgebra( t1.rast, 2, t2.rast, 1, '([rast2] + [rast1.val]) / 2' ) AS rast FROM foo t1 CROSS JOIN foo t2 WHERE t1.rid = 1 AND t2.rid = 2;
ST_MapAlgebraExpr — 1 栅格波段版本:通过对输入栅格波段和提供的像素类型应用有效的 PostgreSQL 代数运算来创建新的单波段栅格。 如果未指定波段,则假定为波段 1。
raster ST_MapAlgebraExpr(
raster rast, integer band, text pixeltype, text expression, double precision nodataval=NULL)
;
raster ST_MapAlgebraExpr(
raster rast, text pixeltype, text expression, double precision nodataval=NULL)
;
![]() | |
ST_MapAlgebraExpr 自 2.1.0 起已弃用。 使用 ST_MapAlgebra (expression version)(表达式版本)代替。 |
通过应用由输入栅格 (rast
) 上的expression
的有效 PostgreSQL 代数运算来创建新的单波段栅格。 如果未指定波段
,则假定为波段 1。 新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果传入像素类型
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL,则新的栅格带将具有与输入栅格
带相同的像素类型。
在表达式中,您可以使用术语 [rast]
来引用原始波段的像素值,[rast.x]
来引用基于 1 的像素列索引,[rast.y]
来引用基于 1 的像素列索引。 像素行索引。
可用性: 2.0.0
根据原始栅格创建一个新的 1 波段栅格,该栅格是原始栅格波段的模 2 的函数。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster; UPDATE dummy_rast SET map_rast = ST_MapAlgebraExpr(rast,NULL,'mod([rast]::numeric,2)') WHERE rid = 2; SELECT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast, 1, i, j) As mapval FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j WHERE rid = 2; origval | mapval ---------+-------- 253 | 1 254 | 0 253 | 1 253 | 1 254 | 0 254 | 0 250 | 0 254 | 0 254 | 0
从我们重新分类的原始栅格中创建一个新的像素类型 2BUI 的 1 波段栅格,并将 nodata 值设置为 0。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster; UPDATE dummy_rast SET map_rast2 = ST_MapAlgebraExpr(rast,'2BUI'::text,'CASE WHEN [rast] BETWEEN 100 and 250 THEN 1 WHEN [rast] = 252 THEN 2 WHEN [rast] BETWEEN 253 and 254 THEN 3 ELSE 0 END'::text, '0') WHERE rid = 2; SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1, i, j) As mapval FROM dummy_rast CROSS JOIN generate_series(1, 5) AS i CROSS JOIN generate_series(1,5) AS j WHERE rid = 2; origval | mapval ---------+-------- 249 | 1 250 | 1 251 | 252 | 2 253 | 3 254 | 3 SELECT ST_BandPixelType(map_rast2) As b1pixtyp FROM dummy_rast WHERE rid = 2; b1pixtyp ---------- 2BUI
![]() 原始(rast_view 列)
|
![]() rast_view_ma
|
从原始 3 波段栅格创建一个与像素类型相同的新 3 波段栅格,其中第一个波段由地图代数更改,其余 2 个波段保持不变。
SELECT ST_AddBand( ST_AddBand( ST_AddBand( ST_MakeEmptyRaster(rast_view), ST_MapAlgebraExpr(rast_view,1,NULL,'tan([rast])*[rast]') ), ST_Band(rast_view,2) ), ST_Band(rast_view, 3) ) As rast_view_ma FROM wind WHERE rid=167;
ST_MapAlgebraExpr — 2 栅格波段版本:通过对提供的两个输入栅格波段和像素类型应用有效的 PostgreSQL 代数运算来创建新的单波段栅格。 如果未指定波段编号,则假定每个栅格的波段 1。 生成的栅格将在第一个栅格定义的网格上对齐(比例、倾斜和像素角),并具有由“extenttype”参数定义的范围。 “extenttype”的值可以是:INTERSECTION、UNION、FIRST、SECOND。
raster ST_MapAlgebraExpr(
raster rast1, raster rast2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL)
;
raster ST_MapAlgebraExpr(
raster rast1, integer band1, raster rast2, integer band2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL)
;
![]() | |
ST_MapAlgebraExpr 自 2.1.0 起已弃用。 使用 ST_MapAlgebra (expression version)(表达式版本)代替。 |
通过对两个输入栅格波段 rast1
, (rast2
) 上的expression
定义的两个波段应用有效的 PostgreSQL 代数运算,创建一个新的单波段栅格。 如果没有 band1
,则指定 band2
,则假定为 band 1。 生成的栅格将在第一个栅格定义的网格上对齐(比例、倾斜和像素角)。 生成的栅格将具有由extenttype
参数定义的范围。
expression
涉及两个栅格的 PostgreSQL 代数表达式和 PostgreSQL 定义的函数/运算符,用于定义像素相交时的像素值。 例如 (([rast1] [rast2])/2.0)::integer
pixeltype
输出栅格的结果像素类型。 必须是ST_BandPixelType 中列出的一项,可省略或设置为 NULL。 如果未传入或设置为 NULL,将默认为第一个栅格的像素类型。
extenttype
控制生成的栅格的范围
INTERSECTION
- 新栅格的范围是两个栅格的交集。 这是默认设置。
UNION
- 新栅格的范围是两个栅格的并集。
FIRST
- 新栅格的范围与第一个栅格的范围相同。
SECOND
- 新栅格的范围与第二个栅格的范围相同。
nodata1expr
仅涉及 rast2
的代数表达式或定义当 rast1
的像素为无数据值并且空间对应的 rast2 像素具有值时返回的内容的常量。
nodata2expr
仅涉及 rast1
常量的代数表达式,该常量定义当 rast2
的像素为无数据值且空间对应的 rast1 像素具有值时返回的内容。
nodatanodataval
当空间对应的 rast1 和 rast2 像素均为无数据值时要返回的数值常量。
如果传入pixeltype
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL 或未指定像素类型,则新的栅格波段将具有与输入 rast1
波段相同的像素类型。
使用术语 [rast1.val]
[rast2.val]
指代原始栅格波段的像素值,使用 [rast1.x]
、[rast1.y]
等指代像素的列/行位置。
可用性: 2.0.0
根据原始栅格创建一个新的 1 波段栅格,该栅格是原始栅格波段的模 2 的函数。
--Create a cool set of rasters -- DROP TABLE IF EXISTS fun_shapes; CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster); -- Insert some cool shapes around Boston in Massachusetts state plane meters -- INSERT INTO fun_shapes(fun_name, rast) VALUES ('ref', ST_AsRaster(ST_MakeEnvelope(235229, 899970, 237229, 901930,26986),200,200,'8BUI',0,0)); INSERT INTO fun_shapes(fun_name,rast) WITH ref(rast) AS (SELECT rast FROM fun_shapes WHERE fun_name = 'ref' ) SELECT 'area' AS fun_name, ST_AsRaster(ST_Buffer(ST_SetSRID(ST_Point(236229, 900930),26986), 1000), ref.rast,'8BUI', 10, 0) As rast FROM ref UNION ALL SELECT 'rand bubbles', ST_AsRaster( (SELECT ST_Collect(geom) FROM (SELECT ST_Buffer(ST_SetSRID(ST_Point(236229 + i*random()*100, 900930 + j*random()*100),26986), random()*20) As geom FROM generate_series(1,10) As i, generate_series(1,10) As j ) As foo ), ref.rast,'8BUI', 200, 0) FROM ref; --map them - SELECT ST_MapAlgebraExpr( area.rast, bub.rast, '[rast2.val]', '8BUI', 'INTERSECTION', '[rast2.val]', '[rast1.val]') As interrast, ST_MapAlgebraExpr( area.rast, bub.rast, '[rast2.val]', '8BUI', 'UNION', '[rast2.val]', '[rast1.val]') As unionrast FROM (SELECT rast FROM fun_shapes WHERE fun_name = 'area') As area CROSS JOIN (SELECT rast FROM fun_shapes WHERE fun_name = 'rand bubbles') As bub
![]() 交集代数
|
![]() 地图代数并集
|
-- we use ST_AsPNG to render the image so all single band ones look grey -- WITH mygeoms AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(1,5),10) As geom UNION ALL SELECT 3 AS bnum, ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10,'join=bevel') As geom UNION ALL SELECT 1 As bnum, ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 5,'join=bevel') As geom ), -- define our canvas to be 1 to 1 pixel to geometry canvas AS (SELECT ST_AddBand(ST_MakeEmptyRaster(200, 200, ST_XMin(e)::integer, ST_YMax(e)::integer, 1, -1, 0, 0) , '8BUI'::text,0) As rast FROM (SELECT ST_Extent(geom) As e, Max(ST_SRID(geom)) As srid from mygeoms ) As foo ), rbands AS (SELECT ARRAY(SELECT ST_MapAlgebraExpr(canvas.rast, ST_AsRaster(m.geom, canvas.rast, '8BUI', 100), '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') As rast FROM mygeoms AS m CROSS JOIN canvas ORDER BY m.bnum) As rasts ) SELECT rasts[1] As rast1 , rasts[2] As rast2, rasts[3] As rast3, ST_AddBand( ST_AddBand(rasts[1],rasts[2]), rasts[3]) As final_rast FROM rbands;
![]() rast1
|
![]() rast2
|
![]() rast3
|
![]() final_rast
|
-- Create new 3 band raster composed of first 2 clipped bands, and overlay of 3rd band with our geometry -- This query took 3.6 seconds on PostGIS windows 64-bit install WITH pr AS -- Note the order of operation: we clip all the rasters to dimensions of our region (SELECT ST_Clip(rast,ST_Expand(geom,50) ) As rast, g.geom FROM aerials.o_2_boston AS r INNER JOIN -- union our parcels of interest so they form a single geometry we can later intersect with (SELECT ST_Union(ST_Transform(geom,26986)) AS geom FROM landparcels WHERE pid IN('0303890000', '0303900000')) As g ON ST_Intersects(rast::geometry, ST_Expand(g.geom,50)) ), -- we then union the raster shards together -- ST_Union on raster is kinda of slow but much faster the smaller you can get the rasters -- therefore we want to clip first and then union prunion AS (SELECT ST_AddBand(NULL, ARRAY[ST_Union(rast,1),ST_Union(rast,2),ST_Union(rast,3)] ) As clipped,geom FROM pr GROUP BY geom) -- return our final raster which is the unioned shard with -- with the overlay of our parcel boundaries -- add first 2 bands, then mapalgebra of 3rd band + geometry SELECT ST_AddBand(ST_Band(clipped,ARRAY[1,2]) , ST_MapAlgebraExpr(ST_Band(clipped,3), ST_AsRaster(ST_Buffer(ST_Boundary(geom),2),clipped, '8BUI',250), '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') ) As rast FROM prunion;
![]() 蓝线是选定地块的边界
|
ST_MapAlgebraFct — 1 波段版本 - 通过在输入栅格波段和提供的像素类型上应用有效的 PostgreSQL 函数来创建新的单波段栅格。 如果未指定波段,则假定为波段 1。
raster ST_MapAlgebraFct(
raster rast, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
raster ST_MapAlgebraFct(
raster rast, text pixeltype, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
raster ST_MapAlgebraFct(
raster rast, integer band, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, integer band, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
raster ST_MapAlgebraFct(
raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc)
;
raster ST_MapAlgebraFct(
raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args)
;
![]() | |
ST_MapAlgebraFct 自 2.1.0 起已弃用。 使用ST_MapAlgebra (callback function version)(回调函数版本)代替。 |
创建一个新的单波段栅格,该栅格是通过在输入栅格 (rast
) 上应用 oneerasteruserfunc
指定的有效 PostgreSQL 函数而形成的。 如果未指定波段
,则假定为波段 1。 新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果传入像素类型
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL,则新的栅格带将具有与输入栅格
带相同的像素类型。
oneerasteruserfunc
参数必须是 SQL 或 PL/pgSQL 函数的名称和签名,转换为 regprocedure。 一个非常简单且无用的 PL/pgSQL 函数示例是:
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[]) RETURNS FLOAT AS $$ BEGIN RETURN 0.0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
userfunction
可以接受两个或三个参数:一个浮点值、一个可选的整数数组和一个可变文本数组。 第一个参数是单个栅格像元的值(无论栅格数据类型如何)。 第二个参数是当前处理单元的位置,格式为“{x,y}”。 第三个参数指示 ST_MapAlgebraFct 的所有剩余参数应传递给userfunction
。
将 regprodedure 参数传递给 SQL 函数需要传递完整的函数签名,然后转换为 regprocedure 类型。 要将上述示例 PL/pgSQL 函数作为参数传递,参数的 SQL 为:
'simple_function(float,integer[],text[])'::regprocedure
请注意,参数包含函数名称、函数参数类型、名称和参数类型周围的引号以及对 regprocedure 的强制转换。
userfunction
的第三个参数是一个可变文本数组。 任何ST_MapAlgebraFct 调用的所有尾随文本参数都会传递到指定的userfunction
,并包含在 args
参数中。
![]() | |
有关 VARIADIC 关键字的更多信息,请参阅 PostgreSQL 文档和查询语言 (SQL) 函数的“具有可变参数数量的 SQL 函数”部分。 |
![]() | |
无论您是否选择将任何参数传递给userfunction进行处理, text[] 参数在 |
可用性: 2.0.0
根据原始栅格创建一个新的 1 波段栅格,该栅格是原始栅格波段的模 2 的函数。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster; CREATE FUNCTION mod_fct(pixel float, pos integer[], variadic args text[]) RETURNS float AS $$ BEGIN RETURN pixel::integer % 2; END; $$ LANGUAGE 'plpgsql' IMMUTABLE; UPDATE dummy_rast SET map_rast = ST_MapAlgebraFct(rast,NULL,'mod_fct(float,integer[],text[])'::regprocedure) WHERE rid = 2; SELECT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast, 1, i, j) As mapval FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j WHERE rid = 2; origval | mapval ---------+-------- 253 | 1 254 | 0 253 | 1 253 | 1 254 | 0 254 | 0 250 | 0 254 | 0 254 | 0
从我们的原始栅格中创建一个新的像素类型 2BUI 的 1 波段栅格,并将其重新分类,并将 nodata 值设置为传递给用户函数的参数 (0)。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster; CREATE FUNCTION classify_fct(pixel float, pos integer[], variadic args text[]) RETURNS float AS $$ DECLARE nodata float := 0; BEGIN IF NOT args[1] IS NULL THEN nodata := args[1]; END IF; IF pixel < 251 THEN RETURN 1; ELSIF pixel = 252 THEN RETURN 2; ELSIF pixel > 252 THEN RETURN 3; ELSE RETURN nodata; END IF; END; $$ LANGUAGE 'plpgsql'; UPDATE dummy_rast SET map_rast2 = ST_MapAlgebraFct(rast,'2BUI','classify_fct(float,integer[],text[])'::regprocedure, '0') WHERE rid = 2; SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1, i, j) As mapval FROM dummy_rast CROSS JOIN generate_series(1, 5) AS i CROSS JOIN generate_series(1,5) AS j WHERE rid = 2; origval | mapval ---------+-------- 249 | 1 250 | 1 251 | 252 | 2 253 | 3 254 | 3 SELECT ST_BandPixelType(map_rast2) As b1pixtyp FROM dummy_rast WHERE rid = 2; b1pixtyp ---------- 2BUI
![]() 原始(rast-view列) | ![]() rast_view_ma |
从原始 3 波段栅格创建一个与像素类型相同的新 3 波段栅格,其中第一个波段由地图代数更改,其余 2 个波段保持不变。
CREATE FUNCTION rast_plus_tan(pixel float, pos integer[], variadic args text[]) RETURNS float AS $$ BEGIN RETURN tan(pixel) * pixel; END; $$ LANGUAGE 'plpgsql'; SELECT ST_AddBand( ST_AddBand( ST_AddBand( ST_MakeEmptyRaster(rast_view), ST_MapAlgebraFct(rast_view,1,NULL,'rast_plus_tan(float,integer[],text[])'::regprocedure) ), ST_Band(rast_view,2) ), ST_Band(rast_view, 3) As rast_view_ma ) FROM wind WHERE rid=167;
ST_MapAlgebraFct — 2 波段版本 - 通过在提供的 2 个输入栅格波段和像素类型上应用有效的 PostgreSQL 函数来创建新的单波段栅格。 如果未指定波段,则假定为波段 1。 如果未指定,范围类型默认为 INTERSECTION。
raster ST_MapAlgebraFct(
raster rast1, raster rast2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs)
;
raster ST_MapAlgebraFct(
raster rast1, integer band1, raster rast2, integer band2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs)
;
![]() | |
ST_MapAlgebraFct 自 2.1.0 起已弃用。 使用ST_MapAlgebra (callback function version)(回调函数版本)代替。 |
创建一个新的单波段栅格,该栅格是通过对输入栅格 rast1
、rast2
应用由tworastuserfunc
指定的有效 PostgreSQL 函数而形成的。 如果未指定 band1
或 band2
,则假定为 band 1。 新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果传入pixeltype
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL 或省略,则新的栅格波段将具有与输入 rast1
波段相同的像素类型。
Tworastuserfunc
参数必须是 SQL 或 PL/pgSQL 函数的名称和签名,转换为 regprocedure。 PL/pgSQL 函数示例如下:
CREATE OR REPLACE FUNCTION simple_function_for_two_rasters(pixel1 FLOAT, pixel2 FLOAT, pos INTEGER[], VARIADIC args TEXT[]) RETURNS FLOAT AS $$ BEGIN RETURN 0.0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
Tworastuserfunc
可以接受三个或四个参数:一个双精度值、一个双精度值、一个可选的整数数组和一个可变文本数组。 第一个参数是 rast1
中单个栅格像元的值(无论栅格数据类型如何)。 第二个参数是 rast2
中的单个栅格像元值。 第三个参数是当前处理单元的位置,格式为“{x,y}”。 第四个参数指示ST_MapAlgebraFct 的所有剩余参数均应传递给tworastuserfunc
。
将 regprodedure 参数传递给 SQL 函数需要传递完整的函数签名,然后转换为 regprocedure 类型。 要将上述示例 PL/pgSQL 函数作为参数传递,参数的 SQL 为:
'simple_function(double precision, double precision, integer[], text[])'::regprocedure
请注意,参数包含函数名称、函数参数类型、名称和参数类型周围的引号以及对 regprocedure 的强制转换。
Tworastuserfunc
的第四个参数是可变文本数组。 任何 ST_MapAlgebraFct 调用的所有尾随文本参数都会传递到指定的tworastuserfunc
,并包含在 userargs
参数中。
![]() | |
有关 VARIADIC 关键字的更多信息,请参阅 PostgreSQL 文档和查询语言 (SQL) 函数的“具有可变参数数量的 SQL 函数”部分。 |
![]() | |
无论您是否选择将任何参数传递给用户函数进行处理,text[] 参数在 |
可用性: 2.0.0
-- define our user defined function -- CREATE OR REPLACE FUNCTION raster_mapalgebra_union( rast1 double precision, rast2 double precision, pos integer[], VARIADIC userargs text[] ) RETURNS double precision AS $$ DECLARE BEGIN CASE WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN RETURN ((rast1 + rast2)/2.); WHEN rast1 IS NULL AND rast2 IS NULL THEN RETURN NULL; WHEN rast1 IS NULL THEN RETURN rast2; ELSE RETURN rast1; END CASE; RETURN NULL; END; $$ LANGUAGE 'plpgsql' IMMUTABLE COST 1000; -- prep our test table of rasters DROP TABLE IF EXISTS map_shapes; CREATE TABLE map_shapes(rid serial PRIMARY KEY, rast raster, bnum integer, descrip text); INSERT INTO map_shapes(rast,bnum, descrip) WITH mygeoms AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(90,90),30) As geom, 'circle' As descrip UNION ALL SELECT 3 AS bnum, ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 15) As geom, 'big road' As descrip UNION ALL SELECT 1 As bnum, ST_Translate(ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 8,'join=bevel'), 10,-6) As geom, 'small road' As descrip ), -- define our canvas to be 1 to 1 pixel to geometry canvas AS ( SELECT ST_AddBand(ST_MakeEmptyRaster(250, 250, ST_XMin(e)::integer, ST_YMax(e)::integer, 1, -1, 0, 0 ) , '8BUI'::text,0) As rast FROM (SELECT ST_Extent(geom) As e, Max(ST_SRID(geom)) As srid from mygeoms ) As foo ) -- return our rasters aligned with our canvas SELECT ST_AsRaster(m.geom, canvas.rast, '8BUI', 240) As rast, bnum, descrip FROM mygeoms AS m CROSS JOIN canvas UNION ALL SELECT canvas.rast, 4, 'canvas' FROM canvas; -- Map algebra on single band rasters and then collect with ST_AddBand INSERT INTO map_shapes(rast,bnum,descrip) SELECT ST_AddBand(ST_AddBand(rasts[1], rasts[2]),rasts[3]), 4, 'map bands overlay fct union (canvas)' FROM (SELECT ARRAY(SELECT ST_MapAlgebraFct(m1.rast, m2.rast, 'raster_mapalgebra_union(double precision, double precision, integer[], text[])'::regprocedure, '8BUI', 'FIRST') FROM map_shapes As m1 CROSS JOIN map_shapes As m2 WHERE m1.descrip = 'canvas' AND m2.descrip < > 'canvas' ORDER BY m2.bnum) As rasts) As foo;
![]() 地图带叠加(画布)(R:小路,G:圆形,B:大路)
|
CREATE OR REPLACE FUNCTION raster_mapalgebra_userargs( rast1 double precision, rast2 double precision, pos integer[], VARIADIC userargs text[] ) RETURNS double precision AS $$ DECLARE BEGIN CASE WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN RETURN least(userargs[1]::integer,(rast1 + rast2)/2.); WHEN rast1 IS NULL AND rast2 IS NULL THEN RETURN userargs[2]::integer; WHEN rast1 IS NULL THEN RETURN greatest(rast2,random()*userargs[3]::integer)::integer; ELSE RETURN greatest(rast1, random()*userargs[4]::integer)::integer; END CASE; RETURN NULL; END; $$ LANGUAGE 'plpgsql' VOLATILE COST 1000; SELECT ST_MapAlgebraFct(m1.rast, 1, m1.rast, 3, 'raster_mapalgebra_userargs(double precision, double precision, integer[], text[])'::regprocedure, '8BUI', 'INTERSECT', '100','200','200','0') FROM map_shapes As m1 WHERE m1.descrip = 'map bands overlay fct union (canvas)';
用户使用额外参数和来自同一栅格的不同波段定义
ST_MapAlgebraFctNgb — 1-波段版本:使用用户定义的 PostgreSQL 函数映射代数最近邻。 返回一个栅格,其值是涉及输入栅格波段值的邻域的 PLPGSQL 用户函数的结果。
raster ST_MapAlgebraFctNgb(
raster rast, integer band, text pixeltype, integer ngbwidth, integer ngbheight, regprocedure onerastngbuserfunc, text nodatamode, text[] VARIADIC args)
;
![]() | |
ST_MapAlgebraFctNgb 自 2.1.0 起已弃用。 使用ST_MapAlgebra (callback function version)(回调函数版本)代替。 |
(一个栅格版本)返回一个栅格,其值是涉及输入栅格波段值的邻域的 PLPGSQL 用户函数的结果。 用户函数将像素值的邻域作为数字数组,对于每个像素,返回用户函数的结果,用函数结果替换当前检查像素的像素值。
rast
评估用户函数的栅格。
band
要评估的栅格的波段号。 默认为 1。
pixeltype
输出栅格的结果像素类型。 必须是ST_BandPixelType 中列出的一项,或者省略或设置为 NULL。 如果未传入或设置为 NULL,将默认为 rast
的像素类型。 如果结果大于像素类型允许的值,则会被截断。
ngbwidth
邻域的宽度(以单元格为单位)。
ngbheight
邻域的高度(以单元格为单位)。
onerastngbuserfunc
PLPGSQL/psql 用户函数应用于栅格单个波段的邻域像素。 第一个元素是表示矩形像素邻域的二维数字数组
nodatamode
定义要为无数据或 NULL 的邻域像素传递给函数的值
'ignore':计算忽略在邻域中遇到的任何 NODATA 值 - 该标志必须发送到用户回调函数,并且用户函数决定如何忽略它。
“NULL”:在邻域中遇到的任何 NODATA 值都将导致结果像素为 NULL——在这种情况下将跳过用户回调函数。
“value”:在邻域中遇到的任何 NODATA 值都将替换为参考像素(邻域中心的像素)。 请注意,如果该值为 NODATA,则行为与“NULL”相同(对于受影响的邻域)
args
要传递给用户函数的参数。
可用性: 2.0.0
示例利用 http://trac.osgeo.org/gdal/wiki/frmts_wtkraster.html 中描述的作为单个图块加载的卡特里娜栅格,然后在 ST_Rescale 示例中准备
-- -- A simple 'callback' user function that averages up all the values in a neighborhood. -- CREATE OR REPLACE FUNCTION rast_avg(matrix float[][], nodatamode text, variadic args text[]) RETURNS float AS $$ DECLARE _matrix float[][]; x1 integer; x2 integer; y1 integer; y2 integer; sum float; BEGIN _matrix := matrix; sum := 0; FOR x in array_lower(matrix, 1)..array_upper(matrix, 1) LOOP FOR y in array_lower(matrix, 2)..array_upper(matrix, 2) LOOP sum := sum + _matrix[x][y]; END LOOP; END LOOP; RETURN (sum*1.0/(array_upper(matrix,1)*array_upper(matrix,2) ))::integer ; END; $$ LANGUAGE 'plpgsql' IMMUTABLE COST 1000; -- now we apply to our raster averaging pixels within 2 pixels of each other in X and Y direction -- SELECT ST_MapAlgebraFctNgb(rast, 1, '8BUI', 4,4, 'rast_avg(float[][], text, text[])'::regprocedure, 'NULL', NULL) As nn_with_border FROM katrinas_rescaled limit 1;
![]() 我们栅格的第一个波段
|
![]() 对彼此之间 4x4 像素的像素进行平均后的新栅格
|
ST_Reclass — 创建由从原始数据重新分类的波段类型组成的新栅格。 nband 是要更改的波段。 如果未指定 nband,则假定为 1。所有其他波段均按原样返回。 使用案例:将 16BUI 波段转换为 8BUI 等,以便更简单地呈现为可视格式。
raster ST_Reclass(
raster rast, integer nband, text reclassexpr, text pixeltype, double precision nodataval=NULL)
;
raster ST_Reclass(
raster rast, reclassarg[] VARIADIC reclassargset)
;
raster ST_Reclass(
raster rast, text reclassexpr, text pixeltype)
;
通过对输入栅格 (rast
) 应用由 reclassexpr
定义的有效 PostgreSQL 代数运算来创建新栅格。 如果未指定波段
,则假定为波段 1。 新栅格将具有与原始栅格相同的地理参考、宽度和高度。 未指定的波段将保持不变。 有关有效重分类表达式的说明,请参阅 reclassarg。
新栅格的波段将具有 Pixeltype
的像素类型。 如果传入 reclassargset
,则每个 reclassarg 定义生成的每个带的行为。
可用性: 2.0.0
从原始栅格创建一个新栅格,其中波段 2 从 8BUI 转换为 4BUI,并且 101-254 中的所有值都设置为 nodata 值。
ALTER TABLE dummy_rast ADD COLUMN reclass_rast raster; UPDATE dummy_rast SET reclass_rast = ST_Reclass(rast,2,'0-87:1-10, 88-100:11-15, 101-254:0-0', '4BUI',0) WHERE rid = 2; SELECT i as col, j as row, ST_Value(rast,2,i,j) As origval, ST_Value(reclass_rast, 2, i, j) As reclassval, ST_Value(reclass_rast, 2, i, j, false) As reclassval_include_nodata FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j WHERE rid = 2; col | row | origval | reclassval | reclassval_include_nodata -----+-----+---------+------------+--------------------------- 1 | 1 | 78 | 9 | 9 2 | 1 | 98 | 14 | 14 3 | 1 | 122 | | 0 1 | 2 | 96 | 14 | 14 2 | 2 | 118 | | 0 3 | 2 | 180 | | 0 1 | 3 | 99 | 15 | 15 2 | 3 | 112 | | 0 3 | 3 | 169 | | 0
从原始栅格创建一个新栅格,其中波段 1、2、3 分别转换为 1BB、4BUI、4BUI 并重新分类。 请注意,这使用可变的reclassarg
参数,该参数可以将不确定数量的重新分类参数作为输入(理论上与您拥有的波段一样多)
UPDATE dummy_rast SET reclass_rast = ST_Reclass(rast, ROW(2,'0-87]:1-10, (87-100]:11-15, (101-254]:0-0', '4BUI',NULL)::reclassarg, ROW(1,'0-253]:1, 254:0', '1BB', NULL)::reclassarg, ROW(3,'0-70]:1, (70-86:2, [86-150):3, [150-255:4', '4BUI', NULL)::reclassarg ) WHERE rid = 2; SELECT i as col, j as row,ST_Value(rast,1,i,j) As ov1, ST_Value(reclass_rast, 1, i, j) As rv1, ST_Value(rast,2,i,j) As ov2, ST_Value(reclass_rast, 2, i, j) As rv2, ST_Value(rast,3,i,j) As ov3, ST_Value(reclass_rast, 3, i, j) As rv3 FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j WHERE rid = 2; col | row | ov1 | rv1 | ov2 | rv2 | ov3 | rv3 ----+-----+-----+-----+-----+-----+-----+----- 1 | 1 | 253 | 1 | 78 | 9 | 70 | 1 2 | 1 | 254 | 0 | 98 | 14 | 86 | 3 3 | 1 | 253 | 1 | 122 | 0 | 100 | 3 1 | 2 | 253 | 1 | 96 | 14 | 80 | 2 2 | 2 | 254 | 0 | 118 | 0 | 108 | 3 3 | 2 | 254 | 0 | 180 | 0 | 162 | 4 1 | 3 | 250 | 1 | 99 | 15 | 90 | 3 2 | 3 | 254 | 0 | 112 | 0 | 108 | 3 3 | 3 | 254 | 0 | 169 | 0 | 175 | 4
从只有一个 32bf 波段的栅格创建一个新的 3 波段(8BUI、8BUI、8BUI 可查看栅格)
ALTER TABLE wind ADD COLUMN rast_view raster; UPDATE wind set rast_view = ST_AddBand( NULL, ARRAY[ ST_Reclass(rast, 1,'0.1-10]:1-10,9-10]:11,(11-33:0'::text, '8BUI'::text,0), ST_Reclass(rast,1, '11-33):0-255,[0-32:0,(34-1000:0'::text, '8BUI'::text,0), ST_Reclass(rast,1,'0-32]:0,(32-100:100-255'::text, '8BUI'::text,0) ] );
ST_Union — 将一组栅格切片的并集返回为由 1 个或多个波段组成的单个栅格。
raster ST_Union(
setof raster rast)
;
raster ST_Union(
setof raster rast, unionarg[] unionargset)
;
raster ST_Union(
setof raster rast, integer nband)
;
raster ST_Union(
setof raster rast, text uniontype)
;
raster ST_Union(
setof raster rast, integer nband, text uniontype)
;
将一组栅格切片的并集返回为由至少一个波段组成的单个栅格。 生成的栅格范围是整个栅格集的范围。 在交集的情况下,结果值由 uniontype
定义,它是以下之一:LAST(默认)、FIRST、MIN、MAX、COUNT、SUM、MEAN、RANGE。
![]() | |
为了合并栅格,它们必须具有相同的对齐方式。 使用 ST_SameAlignment和 ST_NotSameAlignmentReason 获取更多详细信息和帮助。 解决对齐问题的一种方法是使用 ST_Resample并使用相同的参考栅格进行对齐。 |
可用性: 2.0.0
增强:2.1.0 提高速度(完全基于 C)。
可用性:2.1.0 引入了 ST_Union(rast, unionarg) 变体。
增强:2.1.0 ST_Union(rast)(变体 1)合并所有输入栅格的所有波段。 PostGIS 的早期版本采用第一个波段。
增强:2.1.0 ST_Union(rast, uniontype)(变体 4)合并所有输入栅格的所有波段。
-- this creates a single band from first band of raster tiles -- that form the original file system tile SELECT filename, ST_Union(rast,1) As file_rast FROM sometable WHERE filename IN('dem01', 'dem02') GROUP BY filename;
-- this creates a multi band raster collecting all the tiles that intersect a line -- Note: In 2.0, this would have just returned a single band raster -- , new union works on all bands by default -- this is equivalent to unionarg: ARRAY[ROW(1, 'LAST'), ROW(2, 'LAST'), ROW(3, 'LAST')]::unionarg[] SELECT ST_Union(rast) FROM aerials.boston WHERE ST_Intersects(rast, ST_GeomFromText('LINESTRING(230486 887771, 230500 88772)',26986) );
如果我们只想要波段的子集或者想要更改波段的顺序,则这里我们使用更长的语法
-- this creates a multi band raster collecting all the tiles that intersect a line SELECT ST_Union(rast,ARRAY[ROW(2, 'LAST'), ROW(1, 'LAST'), ROW(3, 'LAST')]::unionarg[]) FROM aerials.boston WHERE ST_Intersects(rast, ST_GeomFromText('LINESTRING(230486 887771, 230500 88772)',26986) );
ST_Distinct4ma — 栅格处理函数,用于计算邻域中唯一像素值的数量。
float8 ST_Distinct4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_Distinct4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中唯一像素值的数量。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, NULL, 1, 1, 'st_distinct4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+---------- 2 | 3 (1 row)
ST_InvDistWeight4ma — 从像素的邻域内插像素值的栅格处理函数。
double precision ST_InvDistWeight4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
使用反距离加权方法计算像素的插值。
有两个可选参数可以通过 userargs
传递。 第一个参数是反距离加权方程中使用的介于 0 和 1 之间的功率因数(下面方程中的变量 k)。 如果未指定,则默认值为 1。第二个参数是仅当感兴趣像素的值包含在邻域的插值中时应用的权重百分比。 如果未指定并且感兴趣的像素具有值,则返回该值。
基本反距离权重方程为:
k = 功率因数,0 到 1 之间的实数
![]() | |
该函数是一个专门的回调函数,用作 ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
可用性:2.1.0
-- NEEDS EXAMPLE
ST_Max4ma — 计算邻域中最大像素值的栅格处理函数。
float8 ST_Max4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_Max4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中的最大像素值。
对于格式 2,可以通过将该值传递给 userargs 来指定 NODATA 像素的替换值。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, NULL, 1, 1, 'st_max4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+---------- 2 | 254 (1 row)
ST_Mean4ma — 计算邻域中平均像素值的栅格处理函数。
float8 ST_Mean4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_Mean4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中的平均像素值。
对于格式 2,可以通过将该值传递给 userargs 来指定 NODATA 像素的替换值。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, '32BF', 1, 1, 'st_mean4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+------------------ 2 | 253.222229003906 (1 row)
SELECT rid, st_value( ST_MapAlgebra(rast, 1, 'st_mean4ma(double precision[][][], integer[][], text[])'::regprocedure,'32BF', 'FIRST', NULL, 1, 1) , 2, 2) FROM dummy_rast WHERE rid = 2; rid | st_value -----+------------------ 2 | 253.222229003906 (1 row)
ST_Min4ma — 计算邻域中最小像素值的栅格处理函数。
float8 ST_Min4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_Min4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中的最小像素值。
对于格式 2,可以通过将该值传递给 userargs 来指定 NODATA 像素的替换值。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, NULL, 1, 1, 'st_min4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+---------- 2 | 250 (1 row)
ST_MinDist4ma — 返回感兴趣像素与具有值的相邻像素之间的最小距离(以像素数为单位)的栅格处理函数。
double precision ST_MinDist4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
返回感兴趣的像素与邻域中具有值的最近像素之间的最短距离(以像素数为单位)。
![]() | |
此函数的目的是提供信息丰富的数据点,帮助从ST_InvDistWeight4ma推断感兴趣像素的插值的有用性。 当社区人口稀少时,此功能特别有用。 |
![]() | |
该函数是一个专门的回调函数,用作 ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
可用性:2.1.0
-- NEEDS EXAMPLE
ST_Range4ma — 计算邻域中像素值范围的栅格处理函数。
float8 ST_Range4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_Range4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中的像素值范围。
对于格式 2,可以通过将该值传递给 userargs 来指定 NODATA 像素的替换值。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, NULL, 1, 1, 'st_range4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+---------- 2 | 4 (1 row)
ST_StdDev4ma — 计算邻域中像素值的标准偏差的栅格处理函数。
float8 ST_StdDev4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_StdDev4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中像素值的标准偏差。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, '32BF', 1, 1, 'st_stddev4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+------------------ 2 | 1.30170822143555 (1 row)
ST_Sum4ma — 栅格处理函数,计算邻域中所有像素值的总和。
float8 ST_Sum4ma(
float8[][] matrix, text nodatamode, text[] VARIADIC args)
;
double precision ST_Sum4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
计算像素邻域中所有像素值的总和。
对于格式 2,可以通过将该值传递给 userargs 来指定 NODATA 像素的替换值。
![]() | |
格式 1 是一个专门的回调函数,用作ST_MapAlgebraFctNgb的回调参数。 |
![]() | |
格式 2 是一个专门的回调函数,用作ST_MapAlgebra (callback function version)(回调函数版本)的回调参数。 |
![]() | |
不鼓励使用格式 1,因为 ST_MapAlgebraFctNgb 自 2.1.0 起已被弃用。 |
可用性: 2.0.0
增强:2.1.0 添加格式 2
SELECT rid, st_value( st_mapalgebrafctngb(rast, 1, '32BF', 1, 1, 'st_sum4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 ) FROM dummy_rast WHERE rid = 2; rid | st_value -----+---------- 2 | 2279 (1 row)
ST_Aspect — 返回高程栅格波段的坡向(默认以度为单位)。 对于分析地形很有用。
raster ST_Aspect(
raster rast, integer band=1, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE)
;
raster ST_Aspect(
raster rast, integer band, raster customextent, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE)
;
返回高程栅格波段的坡向(默认以度为单位)。 利用地图代数并将长宽比方程应用于相邻像素。
units
表示坡度的单位。可能的取值有:RADIANS(弧度),DEGREES(度,默认值)。
当units
= RADIANS 时,值介于 0 到 2 * pi 弧度之间,从北向顺时针测量。
当units
= DEGREES 时,值介于 0 到 360 度之间(从北向顺时针测量)。
如果像素的斜率为零,则像素的纵横比为-1。
![]() | |
有关坡度、坡向和山体阴影的更多信息,请参阅 ESRI - 山体阴影的工作原理和 ERDAS 现场指南 - 坡向图像。 |
可用性: 2.0.0
增强:2.1.0 使用 ST_MapAlgebra() 并添加可选的 interpolate_nodata
函数参数
更改:2.1.0 在之前的版本中,返回值以弧度为单位。 现在,返回值默认为度数
WITH foo AS ( SELECT ST_SetValues( ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1], [1, 2, 2, 2, 1], [1, 2, 3, 2, 1], [1, 2, 2, 2, 1], [1, 1, 1, 1, 1] ]::double precision[][] ) AS rast ) SELECT ST_DumpValues(ST_Aspect(rast, 1, '32BF')) FROM foo st_dumpvalues ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------- (1,"{{315,341.565063476562,0,18.4349479675293,45},{288.434936523438,315,0,45,71.5650482177734},{270,270,-1,90,90},{251.565048217773,225,180,135,108.434951782227},{225,198.43495178 2227,180,161.565048217773,135}}") (1 row)
覆盖范围图块的完整示例。 此查询仅适用于 PostgreSQL 9.1 或更高版本。
WITH foo AS ( SELECT ST_Tile( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999 ), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2, 1], [1, 2, 2, 3, 3, 1], [1, 1, 3, 2, 1, 1], [1, 2, 2, 1, 2, 1], [1, 1, 1, 1, 1, 1] ]::double precision[] ), 2, 2 ) AS rast ) SELECT t1.rast, ST_Aspect(ST_Union(t2.rast), 1, t1.rast) FROM foo t1 CROSS JOIN foo t2 WHERE ST_Intersects(t1.rast, t2.rast) GROUP BY t1.rast;
ST_HillShade — 使用提供的方位角、高度、亮度和比例输入返回高程栅格带的假设照明。
raster ST_HillShade(
raster rast, integer band=1, text pixeltype=32BF, double precision azimuth=315, double precision altitude=45, double precision max_bright=255, double precision scale=1.0, boolean interpolate_nodata=FALSE)
;
raster ST_HillShade(
raster rast, integer band, raster customextent, text pixeltype=32BF, double precision azimuth=315, double precision altitude=45, double precision max_bright=255, double precision scale=1.0, boolean interpolate_nodata=FALSE)
;
使用方位角、高度、亮度和比例输入返回高程栅格带的假设照明。 利用地图代数并将山体阴影方程应用于相邻像素。 返回像素值介于 0 到 255 之间。
方位角(azimuth)
是从北向顺时针测量的 0 到 360 度之间的值。
高度(altitude)
是 0 到 90 度之间的值,其中 0 度位于地平线,90 度位于正上方。
亮度(max_bright)
是 0 到 255 之间的值,其中 0 表示无亮度,255 表示最大亮度。
比例(scale)
是垂直单位与水平单位的比率。 对于英尺:LatLon 使用scale=370400,对于米:LatLon 使用scale=111120。
如果 interpolate_nodata
为 TRUE,则在计算山体阴影照明之前,将使用ST_InvDistWeight4ma对输入栅格中的 NODATA 像素值进行插值。
![]() | |
有关山体阴影的更多信息,请参阅山体阴影的工作原理。 |
可用性: 2.0.0
增强:2.1.0 使用 ST_MapAlgebra() 并添加可选的 interpolate_nodata
函数参数
更改:2.1.0 在之前的版本中,方位角和高度以弧度表示。 现在,方位角和高度以度表示
WITH foo AS ( SELECT ST_SetValues( ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1], [1, 2, 2, 2, 1], [1, 2, 3, 2, 1], [1, 2, 2, 2, 1], [1, 1, 1, 1, 1] ]::double precision[][] ) AS rast ) SELECT ST_DumpValues(ST_Hillshade(rast, 1, '32BF')) FROM foo st_dumpvalues ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ----------------------------------------------------------------------- (1,"{{NULL,NULL,NULL,NULL,NULL},{NULL,251.32763671875,220.749786376953,147.224319458008,NULL},{NULL,220.749786376953,180.312225341797,67.7497863769531,NULL},{NULL,147.224319458008 ,67.7497863769531,43.1210060119629,NULL},{NULL,NULL,NULL,NULL,NULL}}") (1 row)
覆盖范围图块的完整示例。 此查询仅适用于 PostgreSQL 9.1 或更高版本。
WITH foo AS ( SELECT ST_Tile( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999 ), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2, 1], [1, 2, 2, 3, 3, 1], [1, 1, 3, 2, 1, 1], [1, 2, 2, 1, 2, 1], [1, 1, 1, 1, 1, 1] ]::double precision[] ), 2, 2 ) AS rast ) SELECT t1.rast, ST_Hillshade(ST_Union(t2.rast), 1, t1.rast) FROM foo t1 CROSS JOIN foo t2 WHERE ST_Intersects(t1.rast, t2.rast) GROUP BY t1.rast;
ST_Roughness — 返回一个计算出的数字高程模型(DEM)的 '粗糙度' 的栅格。
raster ST_Roughness(
raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE )
;
通过给定区域的最小值减去最大值来计算 数字高程模型(DEM )的“粗糙度”。
可用性:2.1.0
-- needs examples
ST_Slope — 返回高程栅格带的坡度(默认以度为单位)。 对于分析地形很有用。
raster ST_Slope(
raster rast, integer nband=1, text pixeltype=32BF, text units=DEGREES, double precision scale=1.0, boolean interpolate_nodata=FALSE)
;
raster ST_Slope(
raster rast, integer nband, raster customextent, text pixeltype=32BF, text units=DEGREES, double precision scale=1.0, boolean interpolate_nodata=FALSE)
;
返回高程栅格带的坡度(默认以度为单位)。 利用地图代数并将斜率方程应用于相邻像素。
units
表示斜率的单位。 可能的值为:弧度、度(默认)、百分比。
比例(scale)
是垂直单位与水平单位的比率。 对于英尺:LatLon 使用scale=370400,对于米:LatLon 使用scale=111120。
如果 interpolate_nodata
为 TRUE,则在计算表面坡度之前,将使用 ST_InvDistWeight4ma对输入栅格中的 NODATA 像素值进行插值。
![]() | |
有关坡度、坡向和山体阴影的更多信息,请参阅 ESRI - 山体阴影的工作原理和 ERDAS 现场指南 - 坡度图像。 |
可用性: 2.0.0
增强:2.1.0 使用 ST_MapAlgebra() 并添加可选units
、scale
、interpolate_nodata
函数参数
更改:2.1.0 在之前的版本中,返回值以弧度为单位。 现在,返回值默认为度数
WITH foo AS ( SELECT ST_SetValues( ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1], [1, 2, 2, 2, 1], [1, 2, 3, 2, 1], [1, 2, 2, 2, 1], [1, 1, 1, 1, 1] ]::double precision[][] ) AS rast ) SELECT ST_DumpValues(ST_Slope(rast, 1, '32BF')) FROM foo st_dumpvalues ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------- (1,"{{10.0249881744385,21.5681285858154,26.5650520324707,21.5681285858154,10.0249881744385},{21.5681285858154,35.2643890380859,36.8698959350586,35.2643890380859,21.5681285858154}, {26.5650520324707,36.8698959350586,0,36.8698959350586,26.5650520324707},{21.5681285858154,35.2643890380859,36.8698959350586,35.2643890380859,21.5681285858154},{10.0249881744385,21. 5681285858154,26.5650520324707,21.5681285858154,10.0249881744385}}") (1 row)
覆盖范围图块的完整示例。 此查询仅适用于 PostgreSQL 9.1 或更高版本。
WITH foo AS ( SELECT ST_Tile( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999 ), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2, 1], [1, 2, 2, 3, 3, 1], [1, 1, 3, 2, 1, 1], [1, 2, 2, 1, 2, 1], [1, 1, 1, 1, 1, 1] ]::double precision[] ), 2, 2 ) AS rast ) SELECT t1.rast, ST_Slope(ST_Union(t2.rast), 1, t1.rast) FROM foo t1 CROSS JOIN foo t2 WHERE ST_Intersects(t1.rast, t2.rast) GROUP BY t1.rast;
ST_TPI — 返回一个计算出的地形位置指数(Topographic Position Index)的栅格。
raster ST_TPI(
raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE )
;
计算地形位置指数,其定义为半径为 1 的焦点平均值减去中心像元。
![]() | |
此函数仅支持焦点平均半径为 1。 |
可用性:2.1.0
-- needs examples
ST_TRI — 返回具有计算的地形坚固性指数的栅格。
raster ST_TRI(
raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE )
;
地形坚固性指数是通过将中心像素与其相邻像素进行比较、取差异的绝对值并对结果求平均值来计算的。
![]() | |
此函数仅支持焦点平均半径为 1。 |
可用性:2.1.0
-- needs examples
Box3D — 返回栅格封闭框的box 3d 表示形式。
box3d Box3D(
raster rast)
;
返回表示栅格范围的框。
多边形由边界框的角点定义 ((MINX
, MINY
), (MAXX
, MAXY
))
更改:2.0.0 在 2.0 之前的版本中,曾经有 box2d 而不是 box3d。 由于 box2d 是已弃用的类型,因此已更改为 box3d。
SELECT rid, Box3D(rast) AS rastbox FROM dummy_rast; rid | rastbox ----+------------------------------------------------- 1 | BOX3D(0.5 0.5 0,20.5 60.5 0) 2 | BOX3D(3427927.75 5793243.5 0,3427928 5793244 0)
ST_ConvexHull — 返回栅格的凸包几何形状,包括等于 BandNoDataValue 的像素值。 对于规则形状和非倾斜栅格,这给出与 ST_Envelope 相同的结果,因此仅对不规则形状或倾斜栅格有用。
geometry ST_ConvexHull(
raster rast)
;
返回栅格的凸包几何形状,包括 NoDataBandValue 带像素。 对于规则形状和非倾斜栅格,这或多或少会产生与 ST_Envelope 相同的结果,因此仅对不规则形状或倾斜栅格有用。
![]() | |
ST_Envelope 将坐标向下取整,因此在栅格周围添加了一小部分缓冲区,因此结果与不对坐标向下取整的 ST_ConvexHull 稍有不同。 |
有关此图,请参阅 PostGIS Raster Specific 。
-- Note envelope and convexhull are more or less the same SELECT ST_AsText(ST_ConvexHull(rast)) As convhull, ST_AsText(ST_Envelope(rast)) As env FROM dummy_rast WHERE rid=1; convhull | env --------------------------------------------------------+------------------------------------ POLYGON((0.5 0.5,20.5 0.5,20.5 60.5,0.5 60.5,0.5 0.5)) | POLYGON((0 0,20 0,20 60,0 60,0 0))
-- now we skew the raster -- note how the convex hull and envelope are now different SELECT ST_AsText(ST_ConvexHull(rast)) As convhull, ST_AsText(ST_Envelope(rast)) As env FROM (SELECT ST_SetRotation(rast, 0.1, 0.1) As rast FROM dummy_rast WHERE rid=1) As foo; convhull | env --------------------------------------------------------+------------------------------------ POLYGON((0.5 0.5,20.5 1.5,22.5 61.5,2.5 60.5,0.5 0.5)) | POLYGON((0 0,22 0,22 61,0 61,0 0))
ST_DumpAsPolygons — 从给定的栅格带中返回一组 geomval (geom,val) 行。 如果未指定波段 编号,则波段编号默认为 1。
setof geomval ST_DumpAsPolygons(
raster rast, integer band_num=1, boolean exclude_nodata_value=TRUE)
;
这是一个集合返回函数(SRF)。 它返回一组 geomval 行,由几何图形 (geom) 和像素带值 (val) 组成。 每个多边形是该带的所有像素的并集,这些像素具有由 val 表示的相同像素值。
ST_DumpAsPolygon 对于多边形化栅格很有用。 它与 GROUP BY 相反,它创建新行。 例如,它可用于将单个栅格扩展为多个 POLYGONS/MULTIPOLYGONS。
改变 3.3.0,禁用验证和修复以提高性能。 可能会导致无效的几何图形。
可用性:需要 GDAL 1.7 或更高版本。
![]() | |
如果没有为波段设置数据值,则不会返回具有该值的像素,除非 except_nodata_value=false。 |
![]() | |
如果您只关心栅格中具有给定值的像素计数,则使用 ST_ValueCount 速度更快。 |
![]() | |
这与 ST_PixelAsPolygons 不同,在 ST_PixelAsPolygons 中,无论像素值如何,都会为每个像素返回一个几何图形。 |
-- this syntax requires PostgreSQL 9.3+ SELECT val, ST_AsText(geom) As geomwkt FROM ( SELECT dp.* FROM dummy_rast, LATERAL ST_DumpAsPolygons(rast) AS dp WHERE rid = 2 ) As foo WHERE val BETWEEN 249 and 251 ORDER BY val; val | geomwkt -----+-------------------------------------------------------------------------- 249 | POLYGON((3427927.95 5793243.95,3427927.95 5793243.85,3427928 5793243.85, 3427928 5793243.95,3427927.95 5793243.95)) 250 | POLYGON((3427927.75 5793243.9,3427927.75 5793243.85,3427927.8 5793243.85, 3427927.8 5793243.9,3427927.75 5793243.9)) 250 | POLYGON((3427927.8 5793243.8,3427927.8 5793243.75,3427927.85 5793243.75, 3427927.85 5793243.8, 3427927.8 5793243.8)) 251 | POLYGON((3427927.75 5793243.85,3427927.75 5793243.8,3427927.8 5793243.8, 3427927.8 5793243.85,3427927.75 5793243.85))
ST_Envelope — 返回栅格范围的多边形表示形式。
geometry ST_Envelope(
raster rast)
;
返回栅格范围的多边形表示形式(以 srid 定义的空间坐标单位表示)。 它是一个表示为多边形的 float8 最小边界框。
多边形由边界框的角点定义((MINX
, MINY
), (MINX
, MAXY
), (MAXX
, MAXY
), (MAXX
, MINY
), (MINX
, MINY
))
SELECT rid, ST_AsText(ST_Envelope(rast)) As envgeomwkt FROM dummy_rast; rid | envgeomwkt -----+-------------------------------------------------------------------- 1 | POLYGON((0 0,20 0,20 60,0 60,0 0)) 2 | POLYGON((3427927 5793243,3427928 5793243, 3427928 5793244,3427927 5793244, 3427927 5793243))
ST_MinConvexHull — 返回栅格的凸包几何形状(不包括 NODATA 像素)。
geometry ST_MinConvexHull(
raster rast, integer nband=NULL)
;
返回栅格的凸包几何形状(不包括 NODATA 像素)。 如果 nband
为 NULL,则考虑栅格的所有波段。
可用性:2.1.0
WITH foo AS ( SELECT ST_SetValues( ST_SetValues( ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(9, 9, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0), 2, '8BUI', 1, 0), 1, 1, 1, ARRAY[ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 1], [0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0] ]::double precision[][] ), 2, 1, 1, ARRAY[ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0] ]::double precision[][] ) AS rast ) SELECT ST_AsText(ST_ConvexHull(rast)) AS hull, ST_AsText(ST_MinConvexHull(rast)) AS mhull, ST_AsText(ST_MinConvexHull(rast, 1)) AS mhull_1, ST_AsText(ST_MinConvexHull(rast, 2)) AS mhull_2 FROM foo hull | mhull | mhull_1 | mhull_2 ----------------------------------+-------------------------------------+-------------------------------------+------------------------------------- POLYGON((0 0,9 0,9 -9,0 -9,0 0)) | POLYGON((0 -3,9 -3,9 -9,0 -9,0 -3)) | POLYGON((3 -3,9 -3,9 -6,3 -6,3 -3)) | POLYGON((0 -3,6 -3,6 -9,0 -9,0 -3))
ST_Polygon — 返回由具有非无数据值的像素值的像素并集形成的多多边形几何体。 如果未指定波段 编号,则 波段 编号默认为 1。
geometry ST_Polygon(
raster rast, integer band_num=1)
;
改变 3.3.0,禁用验证和修复以提高性能。 可能会导致无效的几何图形。
可用性:0.1.6 需要 GDAL 1.7 或更高版本。
增强:2.1.0 提高速度(完全基于 C)并且确保返回的多边形有效。
更改:2.1.0 在之前的版本中有时会返回多边形,更改为始终返回多多边形。
-- by default no data band value is 0 or not set, so polygon will return a square polygon SELECT ST_AsText(ST_Polygon(rast)) As geomwkt FROM dummy_rast WHERE rid = 2; geomwkt -------------------------------------------- MULTIPOLYGON(((3427927.75 5793244,3427928 5793244,3427928 5793243.75,3427927.75 5793243.75,3427927.75 5793244))) -- now we change the no data value of first band UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast,1,254) WHERE rid = 2; SELECt rid, ST_BandNoDataValue(rast) from dummy_rast where rid = 2; -- ST_Polygon excludes the pixel value 254 and returns a multipolygon SELECT ST_AsText(ST_Polygon(rast)) As geomwkt FROM dummy_rast WHERE rid = 2; geomwkt --------------------------------------------------------- MULTIPOLYGON(((3427927.9 5793243.95,3427927.85 5793243.95,3427927.85 5793244,3427927.9 5793244,3427927.9 5793243.95)),((3427928 5793243.85,3427928 5793243.8,3427927.95 5793243.8,3427927.95 5793243.85,3427927.9 5793243.85,3427927.9 5793243.9,3427927.9 5793243.95,3427927.95 5793243.95,3427928 5793243.95,3427928 5793243.85)),((3427927.8 5793243.75,3427927.75 5793243.75,3427927.75 5793243.8,3427927.75 5793243.85,3427927.75 5793243.9,3427927.75 5793244,3427927.8 5793244,3427927.8 5793243.9,3427927.8 5793243.85,3427927.85 5793243.85,3427927.85 5793243.8,3427927.85 5793243.75,3427927.8 5793243.75))) -- Or if you want the no data value different for just one time SELECT ST_AsText( ST_Polygon( ST_SetBandNoDataValue(rast,1,252) ) ) As geomwkt FROM dummy_rast WHERE rid =2; geomwkt --------------------------------- MULTIPOLYGON(((3427928 5793243.85,3427928 5793243.8,3427928 5793243.75,3427927.85 5793243.75,3427927.8 5793243.75,3427927.8 5793243.8,3427927.75 5793243.8,3427927.75 5793243.85,3427927.75 5793243.9,3427927.75 5793244,3427927.8 5793244,3427927.85 5793244,3427927.9 5793244,3427928 5793244,3427928 5793243.95,3427928 5793243.85),(3427927.9 5793243.9,3427927.9 5793243.85,3427927.95 5793243.85,3427927.95 5793243.9,3427927.9 5793243.9)))
&& — 如果 A 的边界框与 B 的边界框相交,则返回 TRUE
。
boolean &&(
raster A , raster B )
;
boolean &&(
raster A , geometry B )
;
boolean &&(
geometry B , raster A )
;
&&
运算符在栅格/几何体 A 的边界框与栅格/几何体 B 的边界框相交时返回 TRUE
。
![]() | |
该操作数将利用栅格上可能可用的任何索引。 |
可用性: 2.0.0
SELECT A.rid As a_rid, B.rid As b_rid, A.rast && B.rast As intersect FROM dummy_rast AS A CROSS JOIN dummy_rast AS B LIMIT 3; a_rid | b_rid | intersect -------+-------+--------- 2 | 2 | t 2 | 3 | f 2 | 1 | f
&< — 如果 A 的边界框位于 B 的左侧,则返回 TRUE
。
boolean &<(
raster A , raster B )
;
&<
运算符在栅格 A 的边界框与栅格 B 的边界框重叠或位于栅格 B 的边界框的左侧时返回 TRUE
,或者更准确地说,在栅格 B 的边界框的右侧没有重叠时返回 TRUE。
![]() | |
该操作数将利用栅格上可能可用的任何索引。 |
SELECT A.rid As a_rid, B.rid As b_rid, A.rast &< B.rast As overleft FROM dummy_rast AS A CROSS JOIN dummy_rast AS B; a_rid | b_rid | overleft ------+-------+---------- 2 | 2 | t 2 | 3 | f 2 | 1 | f 3 | 2 | t 3 | 3 | t 3 | 1 | f 1 | 2 | t 1 | 3 | t 1 | 1 | t
&> — 如果 A 的边界框位于 B 的右侧,则返回 TRUE
。
boolean &>(
raster A , raster B )
;
&>
运算符在栅格 A 的边界框与栅格 B 的边界框重叠或位于栅格 B 的边界框的右侧时返回 TRUE
,或者更准确地说,在栅格 B 的边界框的左侧没有重叠时返回 TRUE。
![]() | |
该操作符将利用几何上可能可用的任何索引。 |
SELECT A.rid As a_rid, B.rid As b_rid, A.rast & > B.rast As overright FROM dummy_rast AS A CROSS JOIN dummy_rast AS B; a_rid | b_rid | overright -------+-------+---------- 2 | 2 | t 2 | 3 | t 2 | 1 | t 3 | 2 | f 3 | 3 | t 3 | 1 | f 1 | 2 | f 1 | 3 | t 1 | 1 | t
= — 如果 A 的边界框与 B 的边界框相同,则返回 TRUE
。 使用双精度边界框。
boolean =(
raster A , raster B )
;
=
运算符在栅格 A 的边界框与栅格 B 的边界框相同时返回 TRUE
。PostgreSQL 使用为栅格定义的 =、< 和 > 运算符来执行栅格的内部排序和比较(例如,在 GROUP BY 或 ORDER BY 子句中)。
![]() | |
这个操作符不会使用可能存在于栅格上的任何索引。请使用 ~= 代替。这个操作符主要存在是为了可以按栅格列进行分组。 |
可用性:2.1.0
@ — 如果 A 的边界框包含在 B 的边界框中,则返回 TRUE
。 使用双精度边界框。
boolean @(
raster A , raster B )
;
boolean @(
geometry A , raster B )
;
boolean @(
raster B , geometry A )
;
@
运算符在栅格/几何体 A 的边界框被栅格/几何体 B 的边界框包含时返回 TRUE
。
![]() | |
该操作符将使用栅格上的空间索引。 |
可用性:2.0.0 raster@raster、raster@geometry 引入
可用性:2.0.5 geometry @ raster引入
~= — 如果 A 的边界框与 B 的边界框相同,则返回 TRUE
。
boolean ~=(
raster A , raster B )
;
~=
运算符在栅格 A 的边界框与栅格 B 的边界框相同时返回 TRUE
。
![]() | |
该操作数将利用栅格上可能可用的任何索引。 |
可用性: 2.0.0
非常有用的用例是获取两组具有相同块但代表不同主题的单波段栅格并创建多波段栅格
SELECT ST_AddBand(prec.rast, alt.rast) As new_rast FROM prec INNER JOIN alt ON (prec.rast ~= alt.rast);
~ — 如果 A 的边界框包含 B 的边界框,则返回 TRUE
。 使用双精度边界框。
boolean ~(
raster A , raster B )
;
boolean ~(
geometry A , raster B )
;
boolean ~(
raster B , geometry A )
;
如果栅格/几何 A 的边界框包含栅格/几何 B 的边界框,则 ~
运算符返回 TRUE
。
![]() | |
该操作符将使用栅格上的空间索引。 |
可用性: 2.0.0
ST_Contains — 如果栅格 rastB 中没有点位于栅格 rastA 的外部且 rastB 的内部至少有一个点位于 rastA 的内部,则返回 true。
boolean ST_Contains(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Contains(
raster rastA , raster rastB )
;
栅格 rastA 包含 rastB 当且仅当 rastB 中没有点位于 rastA 的外部且 rastB 的内部至少有一个点位于 rastA 的内部时。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_Contains(ST_Polygon(raster),geometry)或 ST_Contains(geometry,ST_Polygon(raster))。 |
![]() | |
ST_Contains() 是 ST_Within() 的逆函数。 因此,ST_Contains(rastA, rastB) 意味着 ST_Within(rastB, rastA)。 |
可用性:2.1.0
-- specified band numbers SELECT r1.rid, r2.rid, ST_Contains(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 1; NOTICE: The first raster provided has no bands rid | rid | st_contains -----+-----+------------- 1 | 1 | 1 | 2 | f
-- no band numbers specified SELECT r1.rid, r2.rid, ST_Contains(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 1; rid | rid | st_contains -----+-----+------------- 1 | 1 | t 1 | 2 | f
ST_ContainsProperly — 如果 rastB 与 rastA 的内部相交,但不与 rastA 的边界或外部相交,则返回 true。
boolean ST_ContainsProperly(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_ContainsProperly(
raster rastA , raster rastB )
;
如果 rastB 与 rastA 的内部相交,但不与 rastA 的边界或外部相交,则栅格 rastA 正确包含 rastB。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
栅格 rastA 未正确包含其自身,但确实包含其自身。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_ContainsProperly(ST_Polygon(raster),geometry)或 ST_ContainsProperly(geometry,ST_Polygon(raster))。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_ContainsProperly(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_containsproperly -----+-----+--------------------- 2 | 1 | f 2 | 2 | f
ST_Covers — 如果栅格 rastB 中没有点位于栅格 rastA 之外,则返回 true。
boolean ST_Covers(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Covers(
raster rastA , raster rastB )
;
栅格 rastA 覆盖 rastB 当且仅当 rastB 中没有点位于 rastA 的外部。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_Covers(ST_Polygon(raster),geometry)或 ST_Covers(geometry,ST_Polygon(raster))。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_Covers(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_covers -----+-----+----------- 2 | 1 | f 2 | 2 | t
ST_CoveredBy — 如果栅格 rastA 中没有点位于栅格 rastB 之外,则返回 true。
boolean ST_CoveredBy(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_CoveredBy(
raster rastA , raster rastB )
;
当且仅当 rastA 中没有点位于 rastB 的外部时,栅格 rastA 才会被 rastB 覆盖。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_CoveredBy(ST_Polygon(raster), geometry) 或 ST_CoveredBy(geometry, ST_Polygon(raster))。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_CoveredBy(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_coveredby -----+-----+-------------- 2 | 1 | f 2 | 2 | t
ST_Disjoint — 如果栅格 rastA 在空间上不与 rastB 相交,则返回 true。
boolean ST_Disjoint(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Disjoint(
raster rastA , raster rastB )
;
如果栅格 rastA 和 rastB 不共享任何空间,则它们是脱节的。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
该函数不使用任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_Disjoint(ST_Polygon(raster),geometry)。 |
可用性:2.1.0
-- rid = 1 has no bands, hence the NOTICE and the NULL value for st_disjoint SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; NOTICE: The second raster provided has no bands rid | rid | st_disjoint -----+-----+------------- 2 | 1 | 2 | 2 | f
-- this time, without specifying band numbers SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_disjoint -----+-----+------------- 2 | 1 | t 2 | 2 | f
ST_Intersects — 如果栅格 rastA 与栅格 rastB 空间相交,则返回 true。
boolean ST_Intersects(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Intersects(
raster rastA , raster rastB )
;
boolean ST_Intersects(
raster rast , integer nband , geometry geommin )
;
boolean ST_Intersects(
raster rast , geometry geommin , integer nband=NULL )
;
boolean ST_Intersects(
geometry geommin , raster rast , integer nband=NULL )
;
如果栅格 rastA 与栅格 rastB 空间相交,则返回 true。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
增强:2.0.0引入了 支持栅格/栅格相交。
![]() | |
已更改:2.1.0 ST_Intersects(raster,geometry)变体的行为已更改以匹配 ST_Intersects(geometry,raster)的行为。 |
-- different bands of same raster SELECT ST_Intersects(rast, 2, rast, 3) FROM dummy_rast WHERE rid = 2; st_intersects --------------- t
ST_Overlaps — 如果栅格 rastA 和 rastB 相交,但其中一个不完全包含另一个,则返回 true。
boolean ST_Overlaps(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Overlaps(
raster rastA , raster rastB )
;
如果栅格 rastA 在空间上与栅格 rastB 重叠,则返回 true。 这意味着 rastA 和 rastB 相交,但其中一个不完全包含另一个。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_Overlaps(ST_Polygon(raster),geometry)。 |
可用性:2.1.0
-- comparing different bands of same raster SELECT ST_Overlaps(rast, 1, rast, 2) FROM dummy_rast WHERE rid = 2; st_overlaps ------------- f
ST_Touches — 如果栅格 rastA 和 rastB 至少有一个共同点但它们的内部不相交,则返回 true。
boolean ST_Touches(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Touches(
raster rastA , raster rastB )
;
如果栅格 rastA 在空间上接触栅格 rastB,则返回 true。 这意味着 rastA 和 rastB 至少有一个共同点,但它们的内部不相交。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
此函数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_Touches(ST_Polygon(raster),geometry)。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_Touches(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_touches -----+-----+------------ 2 | 1 | f 2 | 2 | f
ST_SameAlignment — 如果栅格具有相同的倾斜、比例、空间参考和偏移(像素可以放在同一网格上而不切割成像素),则返回 true;如果没有注意细节问题,则返回 false。
boolean ST_SameAlignment(
raster rastA , raster rastB )
;
boolean ST_SameAlignment(
double precision ulx1 , double precision uly1 , double precision scalex1 , double precision scaley1 , double precision skewx1 , double precision skewy1 , double precision ulx2 , double precision uly2 , double precision scalex2 , double precision scaley2 , double precision skewx2 , double precision skewy2 )
;
boolean ST_SameAlignment(
raster set rastfield )
;
非聚合版本(变体 1 和 2):如果两个栅格(直接提供或使用左上角、比例、倾斜和 srid 的值制作)具有相同的比例、倾斜、srid 以及至少其中之一,则返回 true ,一个栅格的任何像素的四个角落在另一个栅格的网格的任何角上。 如果不这样做则返回 false 并详细说明对齐问题的通知。
聚合版本(变体 3):从一组栅格中,如果该组中的所有栅格都对齐,则返回 true。 ST_SameAlignment() 函数是 PostgreSQL 术语中的“聚合”函数。 这意味着它对数据行进行操作,与 SUM() 和 AVG() 函数的操作方式相同。
可用性: 2.0.0
增强:2.1.0 添加聚合变体
SELECT ST_SameAlignment( ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0), ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0) ) as sm; sm ---- t
SELECT ST_SameAlignment(A.rast,b.rast) FROM dummy_rast AS A CROSS JOIN dummy_rast AS B; NOTICE: The two rasters provided have different SRIDs NOTICE: The two rasters provided have different SRIDs st_samealignment ------------------ t f f f
ST_NotSameAlignmentReason — 返回说明栅格是否对齐的文本,如果未对齐,则说明原因。
text ST_NotSameAlignmentReason(
raster rastA, raster rastB)
;
返回说明栅格是否对齐的文本,如果未对齐,则说明原因。
![]() | |
如果栅格未对齐的原因有多种,则仅返回一个原因(第一个失败的测试)。 |
可用性:2.1.0
SELECT ST_SameAlignment( ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0), ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0) ), ST_NotSameAlignmentReason( ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0), ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0) ) ; st_samealignment | st_notsamealignmentreason ------------------+------------------------------------------------- f | The rasters have different scales on the X axis (1 row)
ST_Within — 如果栅格 rastA 中没有点位于栅格 rastB 的外部且 rastA 的内部至少有一个点位于 rastB 的内部,则返回 true。
boolean ST_Within(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Within(
raster rastA , raster rastB )
;
栅格 rastA 位于 rastB 内当且仅当 rastA 中没有点位于 rastB 的外部且 rastA 内部的至少一个点位于 rastB 的内部时。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
![]() | |
该操作数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_Within(ST_Polygon(raster),geometry)或 ST_Within(geometry,ST_Polygon(raster))。 |
![]() | |
ST_Within() 是 ST_Contains() 的逆函数。 因此,ST_Within(rastA, rastB) 意味着 ST_Contains(rastB, rastA)。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_Within(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_within -----+-----+----------- 2 | 1 | f 2 | 2 | t
ST_DWithin — 如果栅格 rastA 和 rastB 彼此之间的距离在指定距离内,则返回 true。
boolean ST_DWithin(
raster rastA , integer nbandA , raster rastB , integer nbandB , double precision distance_of_srid )
;
boolean ST_DWithin(
raster rastA , raster rastB , double precision distance_of_srid )
;
如果栅格 rastA 和 rastB 彼此之间的距离在指定距离内,则返回 true。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
距离以栅格空间参考系定义的单位指定。 为了使此函数有意义,源栅格必须具有相同的坐标投影并具有相同的 SRID。
![]() | |
该操作数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_DWithin(ST_Polygon(raster),geometry)。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_DWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_dwithin -----+-----+------------ 2 | 1 | f 2 | 2 | t
ST_DFullyWithin — 如果栅格 rastA 和 rastB 彼此完全在指定距离内,则返回 true。
boolean ST_DFullyWithin(
raster rastA , integer nbandA , raster rastB , integer nbandB , double precision distance_of_srid )
;
boolean ST_DFullyWithin(
raster rastA , raster rastB , double precision distance_of_srid )
;
如果栅格 rastA 和 rastB 彼此完全在指定距离内,则返回 true。 如果未提供波段编号(或设置为 NULL),则测试中仅考虑栅格的凸包。 如果提供了波段编号,则测试中仅考虑那些具有值(而不是 NODATA)的像素。
距离以栅格空间参考系定义的单位指定。 为了使此函数有意义,源栅格必须具有相同的坐标投影并具有相同的 SRID。
![]() | |
该操作数将利用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用 ST_Polygon,例如 ST_DFullyWithin(ST_Polygon(raster),geometry)。 |
可用性:2.1.0
SELECT r1.rid, r2.rid, ST_DFullyWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2; rid | rid | st_dfullywithin -----+-----+----------------- 2 | 1 | f 2 | 2 | t
本节记录了与 PostGIS Raster 相关的各种问题和技巧。
当 GDAL 打开一个文件时,GDAL 会立即扫描该文件的目录以构建其他文件的目录。 如果此目录包含许多文件(例如数千、数百万),则打开该文件会变得非常慢(特别是如果该文件恰好位于 NFS 等网络驱动器上)。
为了控制此行为,GDAL 提供了以下环境变量: GDAL_DISABLE_READDIR_ON_OPEN。 将 GDAL_DISABLE_READDIR_ON_OPEN
设置为 TRUE
以禁用目录扫描。
在 Ubuntu 中(假设您使用的是 PostgreSQL 的 Ubuntu 软件包),可以设置 GDAL_DISABLE_READDIR_ON_OPEN
在 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment 中(其中 POSTGRESQL_VERSION 是 PostgreSQL 的版本,例如 9.6,CLUSTER_NAME 是集群的名称,例如 9.6)。 主数据库)。 您还可以在此处设置 PostGIS 环境变量。
# environment variables for postmaster process
# This file has the same syntax as postgresql.conf:
# VARIABLE = simple_value
# VARIABLE2 = 'any value!'
# I. e. you need to enclose any value which does not only consist of letters,
# numbers, and '-', '_', '.' in single quotes. Shell commands are not
# evaluated.
POSTGIS_GDAL_ENABLED_DRIVERS = 'ENABLE_ALL'
POSTGIS_ENABLE_OUTDB_RASTERS = 1
GDAL_DISABLE_READDIR_ON_OPEN = 'TRUE'
Linux 和 PostgreSQL 允许的最大打开文件数通常是相对保守的(通常是每个进程最多 1024 个打开文件),这是基于这样一种假设而设置的,即系统主要由人类用户使用。然而,对于 Out-DB栅格数据,一个有效的查询很容易超过这个限制(例如,一个包含了 10 年的栅格数据集,每天都有一个栅格包含了最低和最高温度数据,我们想要知道该数据集中某个像素的绝对最小和最大值)。
最简单的更改是以下 PostgreSQL 设置:max_files_per_process。 默认设置为 1000,这对于Out-DB栅格来说太低了。 安全的起始值可能是 65536,但这实际上取决于您的数据集以及针对这些数据集运行的查询。 此设置只能在服务器启动时进行,并且可能只能在 PostgreSQL 配置文件中进行(例如 Ubuntu 环境中的 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/postgresql.conf )。
...
# - Kernel Resource Usage -
max_files_per_process = 65536 # min 25
# (change requires restart)
...
要做的主要更改是 Linux 内核的打开文件限制。 这有两个部分:
整个系统最大打开文件数
每个进程的最大打开文件数
您可以通过以下示例检查整个系统当前最大打开文件数:
$ sysctl -a | grep fs.file-max fs.file-max = 131072
如果返回的值不够大,请按照以下示例将文件添加到 /etc/sysctl.d/ 中:
$ echo "fs.file-max = 6145324" >> /etc/sysctl.d/fs.conf $ cat /etc/sysctl.d/fs.conf fs.file-max = 6145324 $ sysctl -p --system * Applying /etc/sysctl.d/fs.conf ... fs.file-max = 2097152 * Applying /etc/sysctl.conf ... $ sysctl -a | grep fs.file-max fs.file-max = 6145324
我们需要增加 PostgreSQL 服务器进程每个进程打开文件的最大数量。
要查看当前 PostgreSQL 服务进程使用的最大打开文件数,请按照以下示例执行操作(确保 PostgreSQL 正在运行):
$ ps aux | grep postgres
postgres 31713 0.0 0.4 179012 17564 pts/0 S Dec26 0:03 /home/dustymugs/devel/postgresql/sandbox/10/usr/local/bin/postgres -D /home/dustymugs/devel/postgresql/sandbox/10/pgdata
postgres 31716 0.0 0.8 179776 33632 ? Ss Dec26 0:01 postgres: checkpointer process
postgres 31717 0.0 0.2 179144 9416 ? Ss Dec26 0:05 postgres: writer process
postgres 31718 0.0 0.2 179012 8708 ? Ss Dec26 0:06 postgres: wal writer process
postgres 31719 0.0 0.1 179568 7252 ? Ss Dec26 0:03 postgres: autovacuum launcher process
postgres 31720 0.0 0.1 34228 4124 ? Ss Dec26 0:09 postgres: stats collector process
postgres 31721 0.0 0.1 179308 6052 ? Ss Dec26 0:00 postgres: bgworker: logical replication launcher
$ cat /proc/31718/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 15738 15738 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 15738 15738 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
在上面的示例中,我们检查了进程 31718 的打开文件限制。无论是哪个 PostgreSQL 进程,它们中的任何一个都可以。 我们感兴趣的响应是最大打开文件数。
我们希望将最大打开文件数的软限制和硬限制增加到大于我们为 PostgreSQL 设置 max_files_per_process
指定的值。 在我们的示例中,我们将 max_files_per_process
设置为 65536。
在 Ubuntu 中(假设您使用 Ubuntu 的 PostgreSQL 软件包),更改软限制和硬限制的最简单方法是编辑 /etc/init.d/postgresql (SysV) 或 /lib/systemd/system/postgresql*.service(系统)。
让我们首先解决 SysV Ubuntu 的情况,其中我们将 ulimit -H -n 262144 和 ulimit -n 131072 添加到 /etc/init.d/postgresql。
...
case "$1" in
start|stop|restart|reload)
if [ "$1" = "start" ]; then
create_socket_directory
fi
if [ -z "`pg_lsclusters -h`" ]; then
log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
exit 0
fi
ulimit -H -n 262144
ulimit -n 131072
for v in $versions; do
$1 $v || EXIT=$?
done
exit ${EXIT:-0}
;;
status)
...
现在来解决 Ubuntu 中的 systemd 问题。我们将在每个/lib/systemd/system/postgresql*.service文件的 [Service]部分中添加 LimitNOFILE=131072。
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
进行必要的 systemd 更改后,请确保重新加载守护进程
systemctl daemon-reload
本章记录了 PostGIS 源 tarball 和源存储库的 extras 文件夹中的功能。 这些并不总是与 PostGIS 二进制版本一起打包,但通常是基于 PL/pgSQL 或可以按原样运行的标准 shell 脚本。
这是 PAGC 标准化器的一个分支(这部分的原始代码是 PAGC PostgreSQL 地址标准化器)。
地址标准化器是一个单行地址解析器,它获取输入地址并根据存储在表以及辅助 lex 和 gaz 表中的一组规则对其进行规范化。
该代码内置于一个名为 address_standardizer
的 PostgreSQL 扩展库中,可以使用 CREATE EXTENSION address_standardizer;
安装。 除了address_standardizer 扩展之外,还构建了一个名为address_standardizer_data_us
扩展的示例数据扩展,其中包含US 数据的gaz、lex 和规则表。 该扩展可以通过以下方式安装:CREATE EXTENSION address_standardizer_data_us;
此扩展的代码可以在 PostGIS extensions/address_standardizer
中找到,并且当前是独立的。
有关安装说明,请参阅:Section 2.3, “安装和使用地址标准化工具”。
解析器从右到左工作,首先查看邮政编码、州/省、城市的宏观元素,然后查看微观元素以确定我们是否正在处理门牌号、街道、十字路口或地标。 目前,它不查找国家/地区代码或名称,但将来可能会引入。
根据邮政编码为美国或加拿大,或者州/省为美国或加拿大,否则为美国
这些是使用 Perl 兼容的正则表达式来识别的。 这些正则表达式当前位于 parseaddress-api.c 中,并且在需要时进行更改相对简单。
这些是使用 Perl 兼容的正则表达式来识别的。 这些正则表达式当前位于 parseaddress-api.c 中,但将来可能会被移至包含中以便于维护。
本节列出了由 Address Standardizer 扩展安装的 PostgreSQL 数据类型。 请注意,我们描述了这些的强制转换行为,这非常重要,尤其是在设计您自己的函数时。
standardize_address
函数的返回类型。stdaddr — 由地址元素组成的复合类型。 这是 standardize_address
函数的返回类型。
由地址元素组成的复合类型。 这是 standardize_address 函数的返回类型。 一些元素描述借用自 PAGC 邮政属性。
令牌编号表示rules table中的输出参考编号。
该方法需要address_standardizer扩展。
building
是文本(标记编号 0
):指建筑物编号或名称。 未解析的建筑物标识符和类型。 大多数地址通常为空白。
house_num
这是一段文本(标记号码为 1
):这是街道上的街道号码。例如, 75在75 State Street
中。
predir
是文本(标记编号 2
):街道名称预指示,例如北、南、东、西等。
qual
是文本(标记编号 3
):街道名称预修饰符示例 OLD in 3715 OLD HIGHWAY 99
。
pretype
是文本(标记编号 4
):街道前缀类型
name
是文本(标记编号 5
):街道名称
suftype
这是文本(标记号码为 6
):街道后缀类型,例如 St、Ave、Cir。这是跟在根街道名称后面的街道类型。例如,STREET 位于 75 State Street
中。
sufdir
是文本(标记编号 7
):STREET POST-DIRECTIONAL 街道名称后面的方向修饰符。示例WEST 位于3715 TENTH AVENUE WEST
中。
ruralroute
这是文本(标记号码为 8
):农村路线。例如, 7位于 RR 7
中。
extra
这是文本:额外信息,例如楼层号码。
city
这是文本(标记号码为 10
):例如,波士顿。
state
这是文本(标记号码为 11
):例如,MASSACHUSETTS
country
这是文本(标记号码为 12
):例如,USA
postcode
这是文本(标记号码为 13
):邮政编码(ZIP CODE)的示例:02109
box
这是文本(标记号码为 14 和 15
):邮政信箱号码的示例:02109
unit
这是文本(标记号码为 17
):公寓号码或套房号码的示例,例如,在 3B 位于 APT 3B
中。
本节列出了 address_standardizer 用于规范化地址的 PostgreSQL 表格式。 请注意,这些表的名称不需要与此处引用的名称相同。 例如,您可以为每个国家/地区或您的自定义地理编码器设置不同的 lex、gaz、规则表。 这些表的名称被传递到地址标准化器函数中。
打包的扩展address_standardizer_data_us
包含用于标准化美国地址的数据。
rules table — 规则表包含一组规则,将地址输入序列标记映射到标准化的输出序列。规则被定义为一组输入标记,后跟 -1(终止符),然后是一组输出标记,后跟 -1,后跟表示规则类型的数字,最后是规则的排名。
规则表必须至少包含以下列,但您可以添加更多列供自己使用。
id
表的主键
rule
表示规则的文本字段。 详细信息请参见PAGC 地址标准化器规则记录。
一条规则由一组表示输入标记的非负整数组成,以 -1 结束,然后是相同数量的非负整数,表示邮政属性,以 -1 结束,然后是表示规则类型的整数,最后是表示规则排名的整数。规则的排名从 0(最低)到 17(最高)。
例如,规则 2 0 2 22 3 -1 5 5 6 7 3 -1 2 6
映射到输出标记序列 TYPE NUMBER TYPE DIRECT QUALIF到输出序列 STREET STREET SUFTYP SUFDIR QUALIF。 该规则是等级 6 的 ARC_C 规则。
stdaddr中列出了相应输出标记的编号。
每个规则都以一组输入标记开始,后跟终止符 -1
。 从 PAGC 输入令牌中摘录的有效输入令牌如下:
基于表单的输入令牌
AMPERS
(13). "&" 符号经常用于缩写单词 "and"。
DASH
(9). 标点符号字符。
DOUBLE
(21).两个字母的序列。 经常用作标识符。
FRACT
(25).分数有时用于公民数字或单位数字。
MIXED
(23).包含字母和数字的字母数字字符串。 用于标识符。
NUMBER
(0). 一串数字。
ORD
(15). 诸如 First 或 1st 之类的表示。 常用于街道名称。
ORD
(18).一个字母。
WORD
(1). 单词是任意长度的字母串。 单个字母既可以是 SINGLE,也可以是 WORD。
基于功能的输入令牌
BOXH
(14). 用于表示邮政信箱的词汇。例如 Box 或 PO Box。
BUILDH
(19). 用于表示建筑物或建筑群的词汇,通常作为前缀。例如,在 Tower 7A 中的 Tower。
BUILDT
(24).用于表示建筑物或建筑群的单词和缩写,通常作为后缀。 例如:购物中心。
DIRECT
(22).用于表示方向的单词,例如北。
MILE
(20). 用于表示里程碑地址的单词。
ROAD
(6). 用于表示高速公路和道路的词汇和缩写。例如,在 Interstate 5 中的 Interstate
RR
(8).用于表示乡村路线的单词和缩写。 RR。
TYPE
(2). 用于表示街道类型的单词和缩写。 例如:ST or AVE。
UNITH
(16). 用于表示内部子地址的单词和缩写。 例如,APT 或 UNIT。
邮政类型输入令牌
QUINT
(28).5 位数字。 识别邮政编码
QUAD
(29). 一个4位数字,用于识别 ZIP4 编码。
PCH
(27). 由字母、数字和字母组成的3个字符序列。用于识别 FSA,即加拿大邮政编码的前3个字符。
PCT
(26). 由数字、字母和数字组成的3个字符序列。用于识别 LDU,即加拿大邮政编码的最后3个字符。
停用词
STOPWORDS 与 WORDS 结合。 在规则中,多个 WORD 和 STOPWORD 组成的字符串将由单个 WORD 标记表示。
STOPWORD
(7). 具有低词汇重要性的词,可以在解析中省略。例如:THE。
在第一个 -1(终止符)之后,跟随输出标记及其顺序,然后是终止符 -1
。 stdaddr中列出了相应输出标记的编号。 允许的内容取决于规则的类型。the section called “规则类型和等级”部分列出了对每种规则类型有效的输出标记。
规则的最后部分是规则类型,由以下之一表示,后跟规则等级。 规则的排名从 0(最低)到 17(最高)。
MACRO_C
(令牌编号=“0”)。 用于解析 MACRO 子句(例如 PLACE STATE ZIP)的规则类
MACRO_C
输出标记(摘自 http://www.pagcgeo.org/docs/html/pagc-12.html#--r-typ--。
CITY
(令牌编号“10”)。 示例“Albany”
STATE
(令牌编号“11”)。 示例“NY”
NATION
(令牌编号“12”)。 大多数参考文件中不使用此属性。 示例“USA”
POSTAL
(令牌编号“13”)。 (SADS 元素“ZIP CODE”、“PLUS 4”)。 此属性用于美国邮政编码和加拿大邮政编码。
MICRO_C
(令牌编号=“1”)。 用于解析完整 MICRO 子句(例如 House、street、sufdir、predir、pretyp、suftype、qualif)的规则类(即 ARC_C 加 CIVIC_C)。 这些规则不会在构建阶段使用。
MICRO_C
输出令牌(摘自 http://www.pagcgeo.org/docs/html/pagc-12.html#--r-typ--。
HOUSE
这是一段文本(标记号码为 1
):这是街道上的街道号码。例如, 75在75 State Street
中。
predir
是文本(标记编号 2
):街道名称预指示,例如北、南、东、西等。
qual
是文本(标记编号 3
):街道名称预修饰符示例 OLD in 3715 OLD HIGHWAY 99
。
pretype
是文本(标记编号 4
):街道前缀类型
street
是文本(标记编号 5
):街道名称
suftype
这是文本(标记号码为 6
):街道后缀类型,例如 St、Ave、Cir。这是跟在根街道名称后面的街道类型。例如,STREET 位于 75 State Street
中。
sufdir
是文本(标记编号 7
):STREET POST-DIRECTIONAL 街道名称后面的方向修饰符。示例WEST 位于3715 TENTH AVENUE WEST
中。
ARC_C
(令牌编号=“2”)。 用于解析 MICRO 子句的规则类,不包括 HOUSE 属性。 因此,使用与 MICRO_C 相同的一组输出令牌减去 HOUSE 令牌。
CIVIC_C
(令牌编号=“3”)。 用于解析 HOUSE 属性的规则类。
EXTRA_C
(令牌编号=“4”)。 用于解析额外属性的规则类 - 从地理编码中排除的属性。 这些规则不会在构建阶段使用。
EXTRA_C
输出令牌(摘自 http://www.pagcgeo.org/docs/html/pagc-12.html#--r-typ--。
BLDNG
(令牌编号 0
):未解析的建筑物标识符和类型。
BOXH
(令牌编号 14
):BOX位于 BOX 3B
中
BOXT
(令牌编号 15
): 3B位于 BOX 3B
中
RR
(令牌编号 8
):RR位于 RR 7
中
UNITH
(令牌编号 16
): APT 位于 APT 3B
中
UNITT
(令牌编号 17
): 3B位于APT 3B
中
UNKNWN
(标记编号 9
):否则未分类的输出。
lex table — lex 表用于对字母数字输入进行分类,并将该输入与 (a) 输入标记(请参阅the section called “输入令牌”一节)和 (b) 标准化表示相关联。
词汇(lex)表用于分类字母数字输入并将该输入与(a)规则the section called “输入令牌”和(b)标准化表示相关联。在这些表中,您会找到例如将 ONE
映射到标准单词 1
的映射关系。
一个 lex 在表中至少有以下列。 您可以添加
id
表的主键
seq
整数:定义号?
word
文本:输入的单词
stdword
text:标准化的替换词
token
整数:它是什么类型的单词。 只有在这个上下文中使用它才会被替换。 请参阅 PAGC 令牌。
gaz table — gaz 表用于标准化地名,并将该输入与 (a) 输入令牌(请参阅“the section called “输入令牌””一节)和 (b) 标准化表示相关联。
gaz(地名词典的缩写)表用于标准化地名,并将该输入与称为“the section called “输入令牌””的部分和 (b) 标准化表示相关联。 例如,如果您在美国,您可以加载州名称和相关缩写。
gaz 表中至少包含以下列。 如果您愿意出于自己的目的,可以添加更多列。
id
表的主键
seq
整数:定义号? - 用于该单词实例的标识符
word
文本:输入的单词
stdword
text:标准化的替换词
token
整数:它是什么类型的单词。 只有在这个上下文中使用它才会被替换。 请参阅 PAGC 令牌。
debug_standardize_address — 返回 json 格式的文本,列出解析标记和标准化
text debug_standardize_address(
text lextab, text gaztab, text rultab, text micro, text macro=NULL)
;
这是一个用于调试地址标准化器规则和 lex/gaz 映射的函数。 它返回一个 json 格式的文本,其中包括匹配规则、令牌映射以及使用 lex table的表名称、gaz table和rules table的表名称和地址的输入地址的最佳标准化地址stdaddr 形式。
对于单行地址,仅使用 micro
对于两行地址,一个是由micro
的邮政地址第一行组成,例如 house_num street
,另一个是由标准的邮政地址第二行组成,例如 city, state postal_code country
。
json文档中返回的元素是
input_tokens
对于输入地址中的每个单词,返回该单词的位置、该单词的标记类别以及它映射到的标准单词。 请注意,对于某些输入单词,您可能会返回多个记录,因为某些输入可以归类为多个事物。
rules
与输入匹配的规则集以及每个规则对应的分数。 第一条规则(最高分)用于标准化
stdaddr
运行 standardize_address时将返回的标准化地址元素 stdaddr
可用性:3.4.0
该方法需要address_standardizer扩展。
使用address_standardizer_data_us扩展
CREATE EXTENSION address_standardizer_data_us; -- only needs to be done once
变体 1:单行地址并返回输入标记
SELECT it->>'pos' AS position, it->>'word' AS word, it->>'stdword' AS standardized_word, it->>'token' AS token, it->>'token-code' AS token_code FROM jsonb( debug_standardize_address('us_lex', 'us_gaz', 'us_rules', 'One Devonshire Place, PH 301, Boston, MA 02109') ) AS s, jsonb_array_elements(s->'input_tokens') AS it;
position | word | standardized_word | token | token_code ----------+------------+-------------------+--------+------------ 0 | ONE | 1 | NUMBER | 0 0 | ONE | 1 | WORD | 1 1 | DEVONSHIRE | DEVONSHIRE | WORD | 1 2 | PLACE | PLACE | TYPE | 2 3 | PH | PATH | TYPE | 2 3 | PH | PENTHOUSE | UNITT | 17 4 | 301 | 301 | NUMBER | 0 (7 rows)
变体 2:多行地址并返回第一条规则输入映射和分数
SELECT (s->'rules'->0->>'score')::numeric AS score, it->>'pos' AS position, it->>'input-word' AS word, it->>'input-token' AS input_token, it->>'mapped-word' AS standardized_word, it->>'output-token' AS output_token FROM jsonb( debug_standardize_address('us_lex', 'us_gaz', 'us_rules', 'One Devonshire Place, PH 301', 'Boston, MA 02109') ) AS s, jsonb_array_elements(s->'rules'->0->'rule_tokens') AS it;
score | position | word | input_token | standardized_word | output_token ----------+----------+------------+-------------+-------------------+-------------- 0.876250 | 0 | ONE | NUMBER | 1 | HOUSE 0.876250 | 1 | DEVONSHIRE | WORD | DEVONSHIRE | STREET 0.876250 | 2 | PLACE | TYPE | PLACE | SUFTYP 0.876250 | 3 | PH | UNITT | PENTHOUSE | UNITT 0.876250 | 4 | 301 | NUMBER | 301 | UNITT (5 rows)
parse_address — 获取 1 行地址并分成几部分
record parse_address(
text address)
;
Returns 将地址作为输入,并返回由字段 num、street、street2、address1、city、state、zip、zipplus、country 组成的记录输出。
可用性:2.2.0
该方法需要address_standardizer扩展。
单一地址
SELECT num, street, city, zip, zipplus FROM parse_address('1 Devonshire Place, Boston, MA 02109-1234') AS a;
num | street | city | zip | zipplus -----+------------------+--------+-------+--------- 1 | Devonshire Place | Boston | 02109 | 1234
地址表
-- basic table CREATE TABLE places(addid serial PRIMARY KEY, address text); INSERT INTO places(address) VALUES ('529 Main Street, Boston MA, 02129'), ('77 Massachusetts Avenue, Cambridge, MA 02139'), ('25 Wizard of Oz, Walaford, KS 99912323'), ('26 Capen Street, Medford, MA'), ('124 Mount Auburn St, Cambridge, Massachusetts 02138'), ('950 Main Street, Worcester, MA 01610'); -- parse the addresses -- if you want all fields you can use (a).* SELECT addid, (a).num, (a).street, (a).city, (a).state, (a).zip, (a).zipplus FROM (SELECT addid, parse_address(address) As a FROM places) AS p;
addid | num | street | city | state | zip | zipplus -------+-----+----------------------+-----------+-------+-------+--------- 1 | 529 | Main Street | Boston | MA | 02129 | 2 | 77 | Massachusetts Avenue | Cambridge | MA | 02139 | 3 | 25 | Wizard of Oz | Walaford | KS | 99912 | 323 4 | 26 | Capen Street | Medford | MA | | 5 | 124 | Mount Auburn St | Cambridge | MA | 02138 | 6 | 950 | Main Street | Worcester | MA | 01610 | (6 rows)
standardize_address — 利用 lex、gaz 和规则表返回输入地址的 stdaddr 形式。
stdaddr standardize_address(
text lextab, text gaztab, text rultab, text address)
;
stdaddr standardize_address(
text lextab, text gaztab, text rultab, text micro, text macro)
;
使用 lex table的表名称、gaz table和rules table的表名称和地址返回输入地址的 stdaddr 形式。
变体 1:将地址视为一行。
变体 2:将地址分为 2 部分。 由 micro
第一行邮政地址组成的微信,例如 house_num street
,以及由地址的标准邮政第二行组成的宏,例如 city, state postal_code country
。
可用性:2.2.0
该方法需要address_standardizer扩展。
使用address_standardizer_data_us扩展
CREATE EXTENSION address_standardizer_data_us; -- only needs to be done once
变体 1:单行地址。 这不适用于非美国地址
SELECT house_num, name, suftype, city, country, state, unit FROM standardize_address('us_lex', 'us_gaz', 'us_rules', 'One Devonshire Place, PH 301, Boston, MA 02109');
house_num | name | suftype | city | country | state | unit ----------+------------+---------+--------+---------+---------------+----------------- 1 | DEVONSHIRE | PLACE | BOSTON | USA | MASSACHUSETTS | # PENTHOUSE 301
使用与 Tiger 地理编码器打包的表格。 此示例仅在您安装了 postgis_tiger_geocoder
时才有效。
SELECT * FROM standardize_address('tiger.pagc_lex', 'tiger.pagc_gaz', 'tiger.pagc_rules', 'One Devonshire Place, PH 301, Boston, MA 02109-1234');
为了更容易阅读,我们将使用 hstore 扩展转储输出 CREATE EXTENSION hstore; 你需要安装
SELECT (each(hstore(p))).* FROM standardize_address('tiger.pagc_lex', 'tiger.pagc_gaz', 'tiger.pagc_rules', 'One Devonshire Place, PH 301, Boston, MA 02109') As p;
key | value ------------+----------------- box | city | BOSTON name | DEVONSHIRE qual | unit | # PENTHOUSE 301 extra | state | MA predir | sufdir | country | USA pretype | suftype | PL building | postcode | 02109 house_num | 1 ruralroute | (16 rows)
变体 2:作为两部分地址
SELECT (each(hstore(p))).* FROM standardize_address('tiger.pagc_lex', 'tiger.pagc_gaz', 'tiger.pagc_rules', 'One Devonshire Place, PH 301', 'Boston, MA 02109, US') As p;
key | value ------------+----------------- box | city | BOSTON name | DEVONSHIRE qual | unit | # PENTHOUSE 301 extra | state | MA predir | sufdir | country | USA pretype | suftype | PL building | postcode | 02109 house_num | 1 ruralroute | (16 rows)
一个基于 plpgsql 的地理编码器,旨在与美国人口普查局发布的 TIGER(拓扑集成地理编码和参考系统)/线路和主地址数据库导出配合使用。
地理编码器有四个组件:数据加载器函数、地址标准化器、地址地理编码器和反向地理编码器。
尽管它是专门为美国设计的,但许多概念和功能都是适用的,并且可以适应其他国家的地址和道路网络。
该脚本构建了一个名为tiger
的模式,以容纳所有与“tiger”相关的功能、可重用的查找数据(例如道路类型前缀、后缀、状态)、用于管理数据加载的各种控制表以及所有“tiger”加载表所继承的骨架基表。
另一个名为 tiger_data
的模式也被创建,它存储了加载器从人口普查网站下载并加载到数据库中的每个州的所有人口普查数据。在当前的模型中,每组州的表都以州的代码为前缀,例如 ma_addr
、ma_edges
等,具有强制执行只包括该州数据的约束。每个这些表都继承自 tiger schema
中的表 addr
、faces
、edges
等。
所有地理编码函数仅引用基表,因此不需要将数据模式称为tiger_data
,也不要求数据不能进一步划分为其他模式——例如,每个州有不同的模式,只要所有表 从 Tiger
模式中的表继承。
有关如何在数据库中启用扩展程序以及如何使用它加载数据的说明,请参阅Section 2.4.1, “在 PostGIS 数据库中启用Tiger地理编码器”。
![]() | |
如果您使用 Tiger 地理编码器 (tiger_2010),则可以使用 extras/tiger 中随附的 upload_geocoder.bat / .sh 脚本升级脚本。 |
![]() | |
PostGIS 2.2.0 版本中的新功能是支持 Tiger 2015 数据并将地址标准化器包含为 PostGIS 的一部分。 如果您运行的是 PostgreSQL 9.1+,PostGIS 2.1.0 版本中的新功能是能够使用 PostgreSQL 扩展模型安装 Tiger 地理编码器。 有关详细信息,请参阅Section 2.4.1, “在 PostGIS 数据库中启用Tiger地理编码器”。 |
Pagc_Normalize_Address函数可替代内置 Normalize_Address。 有关编译和安装说明,请参阅Section 2.3, “安装和使用地址标准化工具”。
设计:
该项目的目标是构建一个功能齐全的地理编码器,可以处理任意美国地址字符串并使用标准化的 TIGER 人口普查数据,生成反映给定地址位置和位置可能性的点几何和评级。 评级数字越高,结果越差。
PostGIS 2.0.0 中引入的reverse_geocode
函数对于导出GPS 位置的街道地址和交叉街道非常有用。
对于熟悉 PostGIS 的任何人来说,地理编码器都应该易于安装和使用,并且应该可以在 PostGIS 支持的所有平台上轻松安装和使用。
尽管存在格式和拼写错误,但它应该足够强大,能够正常运行。
它应该具有足够的可扩展性,以便与未来的数据更新一起使用,或者以最少的编码更改来替代数据源。
![]() | |
必须将 |
Tiger_data
。 County_all
、state_all
或state代码开头,后跟county
或state
的所有表。Tiger_data
。标准化地址
(addy )每个位置以及评级。 评级越低,匹配的可能性越大。 结果首先按最低评分排序。 可以选择传入最大结果,默认为 10。使用 Tiger 数据(edges、faces、addr)、PostgreSQL 模糊字符串匹配(soundex、levenshtein)。Tiger_data
架构中。 每个状态脚本都作为单独的记录返回。Tiger_data
模式中。 每个状态脚本都作为单独的记录返回。 最新版本支持 Tiger 2010 结构变化,还加载人口普查区、区块组和区块表。norm_addy
类型,该类型具有道路后缀、前缀和标准化类型、街道、街道名称等,分为单独的字段。 该函数仅适用于与 Tiger_geocoder 打包的查找数据(不需要tiger普查数据)。norm_addy
类型,该类型具有道路后缀、前缀和标准化类型、街道、街道名称等,分为单独的字段。 该函数仅适用于与 Tiger_geocoder 打包的查找数据(不需要tiger普查数据)。 需要 address_standardizer 扩展。norm_addy
复合类型对象,返回它的漂亮的打印表示。 通常与normalize_address结合使用。PostGIS 还有其他几个开源地理编码器,与 Tiger 地理编码器不同,它们具有多国家地理编码支持的优势
Nominatim 使用 OpenStreetMap 地名词典格式的数据。 它需要 osm2pgsql 来加载数据、PostgreSQL 8.4 +和 PostGIS 1.5+ 才能运行。 它被打包为Web服务接口,并且似乎被设计为作为Web服务来调用。 就像 Tiger 地理编码器一样,它同时具有地理编码器和反向地理编码器组件。 从文档来看,尚不清楚它是否具有像 Tiger 地理编码器一样的纯 SQL 接口,或者大量逻辑是否在 Web 接口中实现。
GIS Graphy 还利用 PostGIS,并且像 Nominatim 一样使用 OpenStreetMap (OSM) 数据。 它配备了一个加载器来加载 OSM 数据,并且与 Nominatim 类似,不仅能够进行美国地理编码。 与 Nominatim 非常相似,它作为 Web 服务运行并依赖于 Java 1.5、Servlet 应用程序、Solr。 GisGraphy 是跨平台的,并且还具有反向地理编码器以及其他一些简洁的功能。
Drop_Indexes_Generate_Script — 生成一个脚本,删除 Tiger 架构和用户指定架构上的所有非主键和非唯一索引。 如果未指定架构,则默认架构为 Tiger_data
。
text Drop_Indexes_Generate_Script(
text param_schema=tiger_data)
;
生成一个脚本,删除 Tiger 架构和用户指定架构上的所有非主键和非唯一索引。 如果未指定架构,则默认架构为 Tiger_data
。
这对于最大限度地减少索引膨胀很有用,索引膨胀可能会混淆查询规划器或占用不必要的空间。 与 Install_Missing_Indexes结合使用,仅添加地理编码器使用的索引。
可用性: 2.0.0
SELECT drop_indexes_generate_script() As actionsql; actionsql --------------------------------------------------------- DROP INDEX tiger.idx_tiger_countysub_lookup_lower_name; DROP INDEX tiger.idx_tiger_edges_countyfp; DROP INDEX tiger.idx_tiger_faces_countyfp; DROP INDEX tiger.tiger_place_the_geom_gist; DROP INDEX tiger.tiger_edges_the_geom_gist; DROP INDEX tiger.tiger_state_the_geom_gist; DROP INDEX tiger.idx_tiger_addr_least_address; DROP INDEX tiger.idx_tiger_addr_tlid; DROP INDEX tiger.idx_tiger_addr_zip; DROP INDEX tiger.idx_tiger_county_countyfp; DROP INDEX tiger.idx_tiger_county_lookup_lower_name; DROP INDEX tiger.idx_tiger_county_lookup_snd_name; DROP INDEX tiger.idx_tiger_county_lower_name; DROP INDEX tiger.idx_tiger_county_snd_name; DROP INDEX tiger.idx_tiger_county_the_geom_gist; DROP INDEX tiger.idx_tiger_countysub_lookup_snd_name; DROP INDEX tiger.idx_tiger_cousub_countyfp; DROP INDEX tiger.idx_tiger_cousub_cousubfp; DROP INDEX tiger.idx_tiger_cousub_lower_name; DROP INDEX tiger.idx_tiger_cousub_snd_name; DROP INDEX tiger.idx_tiger_cousub_the_geom_gist; DROP INDEX tiger_data.idx_tiger_data_ma_addr_least_address; DROP INDEX tiger_data.idx_tiger_data_ma_addr_tlid; DROP INDEX tiger_data.idx_tiger_data_ma_addr_zip; DROP INDEX tiger_data.idx_tiger_data_ma_county_countyfp; DROP INDEX tiger_data.idx_tiger_data_ma_county_lookup_lower_name; DROP INDEX tiger_data.idx_tiger_data_ma_county_lookup_snd_name; DROP INDEX tiger_data.idx_tiger_data_ma_county_lower_name; DROP INDEX tiger_data.idx_tiger_data_ma_county_snd_name; : :
Drop_Nation_Tables_Generate_Script — 生成一个脚本,删除指定架构中以 County_all
、state_all
或state代码开头,后跟county
或state
的所有表。
text Drop_Nation_Tables_Generate_Script(
text param_schema=tiger_data)
;
生成一个脚本,删除指定架构中以 County_all
、state_all
或state代码开头,后跟county
或state
的所有表。 如果您要从 Tiger_2010
数据升级到 Tiger_2011
数据,则需要执行此操作。
可用性:2.1.0
SELECT drop_nation_tables_generate_script(); DROP TABLE tiger_data.county_all; DROP TABLE tiger_data.county_all_lookup; DROP TABLE tiger_data.state_all; DROP TABLE tiger_data.ma_county; DROP TABLE tiger_data.ma_state;
Drop_State_Tables_Generate_Script — 生成一个脚本,该脚本删除指定架构中以state缩写为前缀的所有表。 如果未指定架构,则默认架构为 Tiger_data
。
text Drop_State_Tables_Generate_Script(
text param_state, text param_schema=tiger_data)
;
生成一个脚本,该脚本删除指定架构中以state缩写为前缀的所有表。 如果未指定架构,则默认架构为 Tiger_data
。 此函数对于在重新加载状态之前删除状态表非常有用,以防在上次加载期间出现问题。
可用性: 2.0.0
SELECT drop_state_tables_generate_script('PA'); DROP TABLE tiger_data.pa_addr; DROP TABLE tiger_data.pa_county; DROP TABLE tiger_data.pa_county_lookup; DROP TABLE tiger_data.pa_cousub; DROP TABLE tiger_data.pa_edges; DROP TABLE tiger_data.pa_faces; DROP TABLE tiger_data.pa_featnames; DROP TABLE tiger_data.pa_place; DROP TABLE tiger_data.pa_state; DROP TABLE tiger_data.pa_zip_lookup_base; DROP TABLE tiger_data.pa_zip_state; DROP TABLE tiger_data.pa_zip_state_loc;
Geocode — 将地址作为字符串(或其他标准化地址)输入,并输出一组可能的位置,其中包括 NAD 83经纬度中的点几何图形、每个位置的标准化地址以及评级。 评级越低,匹配的可能性越大。 结果首先按最低评分排序。 可以选择传入最大结果数,默认为10,以及restrict_region(默认为NULL)
setof record geocode(
varchar address, integer max_results=10, geometry restrict_region=NULL, norm_addy OUT addy, geometry OUT geomout, integer OUT rating)
;
setof record geocode(
norm_addy in_addy, integer max_results=10, geometry restrict_region=NULL, norm_addy OUT addy, geometry OUT geomout, integer OUT rating)
;
将地址作为字符串(或已经标准化的地址)并输出一组可能的位置,其中包括 NAD 83 经纬度中的点几何形状、每个位置的标准化地址
(addy) 以及评级。 评级越低,匹配的可能性越大。 结果首先按最低评分排序。 使用 Tiger 数据(edges、faces、addr)、PostgreSQL 模糊字符串匹配(soundex、levenshtein)和 PostGIS 线插值函数沿 Tiger 边缘插值地址。 评级越高,地理编码正确的可能性就越小。 地理编码点默认为从中心线到街道地址所在一侧 (L/R) 的偏移 10 米。
增强功能:2.0.0支持Tiger 2010结构化数据并修改了一些逻辑以提高地理编码的速度和准确性,并将点从中心线偏移到街道地址所在的一侧。 新参数 max_results
可用于指定最佳结果的数量或仅返回最佳结果。
下面的示例计时是在一台 3.0 GHZ 单处理器 Windows 7 计算机上进行的,该计算机具有 2GB 内存,运行 PostgreSQL 9.1rc1/PostGIS 2.0,加载了所有 MA、MN、CA、RI state Tiger 数据。
精确匹配的计算速度更快(61 毫秒)
SELECT g.rating, ST_X(g.geomout) As lon, ST_Y(g.geomout) As lat, (addy).address As stno, (addy).streetname As street, (addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip FROM geocode('75 State Street, Boston MA 02109', 1) As g; rating | lon | lat | stno | street | styp | city | st | zip --------+-------------------+----------------+------+--------+------+--------+----+------- 0 | -71.0557505845646 | 42.35897920691 | 75 | State | St | Boston | MA | 02109
即使 zip 没有传入地理编码器也可以猜测(大约需要 122-150 毫秒)
SELECT g.rating, ST_AsText(ST_SnapToGrid(g.geomout,0.00001)) As wktlonlat, (addy).address As stno, (addy).streetname As street, (addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip FROM geocode('226 Hanover Street, Boston, MA',1) As g; rating | wktlonlat | stno | street | styp | city | st | zip --------+---------------------------+------+---------+------+--------+----+------- 1 | POINT(-71.05528 42.36316) | 226 | Hanover | St | Boston | MA | 02113
可以处理拼写错误,并提供不止一种可能的解决方案和评级,并且需要更长的时间(500ms)。
SELECT g.rating, ST_AsText(ST_SnapToGrid(g.geomout,0.00001)) As wktlonlat, (addy).address As stno, (addy).streetname As street, (addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip FROM geocode('31 - 37 Stewart Street, Boston, MA 02116',1) As g; rating | wktlonlat | stno | street | styp | city | st | zip --------+---------------------------+------+--------+------+--------+----+------- 70 | POINT(-71.06466 42.35114) | 31 | Stuart | St | Boston | MA | 02116
用于对地址进行批量地理编码。 最简单的方法是设置 max_results=1
。 仅处理尚未地理编码的内容(没有评级)。
CREATE TABLE addresses_to_geocode(addid serial PRIMARY KEY, address text, lon numeric, lat numeric, new_address text, rating integer); INSERT INTO addresses_to_geocode(address) VALUES ('529 Main Street, Boston MA, 02129'), ('77 Massachusetts Avenue, Cambridge, MA 02139'), ('25 Wizard of Oz, Walaford, KS 99912323'), ('26 Capen Street, Medford, MA'), ('124 Mount Auburn St, Cambridge, Massachusetts 02138'), ('950 Main Street, Worcester, MA 01610'); -- only update the first 3 addresses (323-704 ms - there are caching and shared memory effects so first geocode you do is always slower) -- -- for large numbers of addresses you don't want to update all at once -- since the whole geocode must commit at once -- For this example we rejoin with LEFT JOIN -- and set to rating to -1 rating if no match -- to ensure we don't regeocode a bad address UPDATE addresses_to_geocode SET (rating, new_address, lon, lat) = ( COALESCE(g.rating,-1), pprint_addy(g.addy), ST_X(g.geomout)::numeric(8,5), ST_Y(g.geomout)::numeric(8,5) ) FROM (SELECT addid, address FROM addresses_to_geocode WHERE rating IS NULL ORDER BY addid LIMIT 3) As a LEFT JOIN LATERAL geocode(a.address,1) As g ON true WHERE a.addid = addresses_to_geocode.addid; result ----- Query returned successfully: 3 rows affected, 480 ms execution time. SELECT * FROM addresses_to_geocode WHERE rating is not null; addid | address | lon | lat | new_address | rating -------+----------------------------------------------+-----------+----------+-------------------------------------------+-------- 1 | 529 Main Street, Boston MA, 02129 | -71.07177 | 42.38357 | 529 Main St, Boston, MA 02129 | 0 2 | 77 Massachusetts Avenue, Cambridge, MA 02139 | -71.09396 | 42.35961 | 77 Massachusetts Ave, Cambridge, MA 02139 | 0 3 | 25 Wizard of Oz, Walaford, KS 99912323 | -97.92913 | 38.12717 | Willowbrook, KS 67502 | 108 (3 rows)
SELECT g.rating, ST_AsText(ST_SnapToGrid(g.geomout,0.00001)) As wktlonlat, (addy).address As stno, (addy).streetname As street, (addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip FROM geocode('100 Federal Street, MA', 3, (SELECT ST_Union(the_geom) FROM place WHERE statefp = '25' AND name = 'Lynn')::geometry ) As g; rating | wktlonlat | stno | street | styp | city | st | zip --------+---------------------------+------+---------+------+------+----+------- 7 | POINT(-70.96796 42.4659) | 100 | Federal | St | Lynn | MA | 01905 16 | POINT(-70.96786 42.46853) | NULL | Federal | St | Lynn | MA | 01905 (2 rows) Time: 622.939 ms
Geocode_Intersection — 接收 2 条相交的街道以及state、city、zip,并输出位于交叉路口的第一个交叉街道上的一组可能位置,还包括一个 geomout 作为 NAD 83 经纬度中的点位置,一个标准化地址
(addy )每个位置以及评级。 评级越低,匹配的可能性越大。 结果首先按最低评分排序。 可以选择传入最大结果,默认为 10。使用 Tiger 数据(edges、faces、addr)、PostgreSQL 模糊字符串匹配(soundex、levenshtein)。
setof record geocode_intersection(
text roadway1, text roadway2, text in_state, text in_city, text in_zip, integer max_results=10, norm_addy OUT addy, geometry OUT geomout, integer OUT rating)
;
该函数接受两条交叉的街道、一个state、city、zip作为输入,并输出位于交叉口上的第一条街道上的可能位置集合。每个位置包括 NAD 83 经纬度的点几何、每个位置的规范化地址以及评分。评分越低,匹配度越高。结果按照评分从低到高排序。还可以选择传入最大结果数,默认为 10。函数返回每个结果的标准化地址
(addy)、NAD 83 经纬度的点位置(geomout)以及评分。评分越低,匹配度越高。结果按照评分从低到高排序。此函数使用 Tiger 数据(edges、faces、addr)和 PostgreSQL 模糊字符串匹配(soundex、levenshtein)进行计算
可用性: 2.0.0
下面的示例计时是在一台 3.0 GHZ 单处理器 Windows 7 计算机上进行的,该计算机具有 2GB RAM,运行 PostgreSQL 9.0/PostGIS 1.5,并加载了所有 MA 状态 Tiger 数据。 目前有点慢(3000 毫秒)
在 Windows 2003 64 位 8GB 上测试 PostGIS 2.0 PostgreSQL 64 位 Tiger 2011 数据加载 -- (41ms)
SELECT pprint_addy(addy), st_astext(geomout),rating FROM geocode_intersection( 'Haverford St','Germania St', 'MA', 'Boston', '02130',1); pprint_addy | st_astext | rating ----------------------------------+----------------------------+-------- 98 Haverford St, Boston, MA 02130 | POINT(-71.101375 42.31376) | 0
即使没有在地理编码器中传递 zip,也可以猜测(在 Windows 7 上大约花费了 3500 毫秒),在 Windows 2003 64 位上花费了 741 毫秒
SELECT pprint_addy(addy), st_astext(geomout),rating FROM geocode_intersection('Weld', 'School', 'MA', 'Boston'); pprint_addy | st_astext | rating -------------------------------+--------------------------+-------- 98 Weld Ave, Boston, MA 02119 | POINT(-71.099 42.314234) | 3 99 Weld Ave, Boston, MA 02119 | POINT(-71.099 42.314234) | 3
Get_Geocode_Setting — 返回存储在 Tiger.geocode_settings 表中的特定设置的值。
text Get_Geocode_Setting(
text setting_name)
;
返回存储在 Tiger.geocode_settings 表中的特定设置的值。 设置允许您切换功能的调试。 稍后的计划将是通过设置来控制评级。 当前设置列表如下:
name | setting | unit | category | short_desc --------------------------------+---------+---------+-----------+------------------------------------------------------------------------------------------------------------------------------ debug_geocode_address | false | boolean | debug | outputs debug information in notice log such as queries when geocode_address is called if true debug_geocode_intersection | false | boolean | debug | outputs debug information in notice log such as queries when geocode_intersection is called if true debug_normalize_address | false | boolean | debug | outputs debug information in notice log such as queries and intermediate expressions when normalize_address is called if true debug_reverse_geocode | false | boolean | debug | if true, outputs debug information in notice log such as queries and intermediate expressions when reverse_geocode reverse_geocode_numbered_roads | 0 | integer | rating | For state and county highways, 0 - no preference in name, 1 - prefer the numbered highway name, 2 - prefer local state/county name use_pagc_address_parser | false | boolean | normalize | If set to true, will try to use the address_standardizer extension (via pagc_normalize_address) instead of tiger normalize_address built one
更改:2.2.0:默认设置现在保存在名为 geocode_settings_default 的表中。 使用自定义设置a位于geocode_settings中,并且仅包含用户设置的设置。
可用性:2.1.0
SELECT get_geocode_setting('debug_geocode_address) As result; result --------- false
Get_Tract — 从几何图形所在的区域表中返回人口普查区域或字段。 默认返回区域的短名称。
text get_tract(
geometry loc_geom, text output_field=name)
;
给定一个几何图形将返回该几何图形的人口普查区位置。 如果未指定空间参考系统,则假定 NAD 83经纬度。
![]() | |
此函数使用人口普查的 如果您尚未加载状态数据并希望加载这些附加表,请执行以下操作 UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock'); 然后它们将被 Loader_Generate_Script包含。 |
可用性: 2.0.0
SELECT get_tract(ST_Point(-71.101375, 42.31376) ) As tract_name; tract_name --------- 1203.01
--this one returns the tiger geoid SELECT get_tract(ST_Point(-71.101375, 42.31376), 'tract_id' ) As tract_id; tract_id --------- 25025120301
Install_Missing_Indexes — 查找具有在地理编码器连接和过滤条件中使用的键列的所有表,这些表缺少这些列上使用的索引,并将添加它们。
boolean Install_Missing_Indexes(
)
;
查找 Tiger
和 Tiger_data
架构中的所有表,其中包含在地理编码器连接和过滤器中使用的关键列,这些列上缺少索引,并将输出 SQL DDL 来定义这些表的索引,然后执行生成的脚本。 这是一个辅助函数,它添加了使查询更快所需的新索引,而这些索引可能在加载过程中丢失。 此函数是Missing_Indexes_Generate_Script的配套函数,除了生成创建索引脚本之外,还执行它。 它作为 update_geocode.sql
升级脚本的一部分被调用。
可用性: 2.0.0
SELECT install_missing_indexes(); install_missing_indexes ------------------------- t
Loader_Generate_Census_Script — 为指定states的指定平台生成 shell 脚本,该脚本将下载 Tiger 人口普查state区、bg 和 tabblocks 数据表、暂存并加载到 Tiger_data
架构中。 每个状态脚本都作为单独的记录返回。
setof text loader_generate_census_script(
text[] param_states, text os)
;
生成一个用于指定平台和指定州的 shell 脚本,该脚本将下载 Tiger 数据中的人口普查州 tract
、分组区块 bg
和 tabblocks
数据表,然后将这些数据表分阶段加载到 tiger_data
模式中。每个州的脚本将作为一个单独的记录返回。
它在 Linux 上使用 unzip(默认情况下在 Windows 上使用 7-zip),并使用 wget 进行下载。它使用 Section 4.7.2, “使用Shapefile加载器” 来加载数据。请注意,它的最小处理单元是整个州。它只会处理暂存和临时文件夹中的文件。
它使用以下控制表来控制进程和不同的操作系统 shell 语法变化。
loader_variables
跟踪各种变量,例如人口普查站点、年份、数据和暂存模式
loader_platform
各种平台的配置文件以及各种可执行文件所在的位置。 自带windows和linux。 还可以添加更多。
loader_lookuptables
每条记录定义一种表(州、县)、是否处理其中的记录以及如何加载它们。定义每个记录的导入数据、暂存数据、添加、删除列、索引和约束的步骤。 每个表都以状态为前缀,并继承自 Tiger 模式中的表。 例如 创建从tiger.faces
继承的tiger_data.ma_faces
可用性: 2.0.0
![]() | |
Loader_Generate_Script 包含此逻辑,但如果您在 PostGIS 2.0.0 alpha5 之前安装了 Tiger 地理编码器,则需要在已完成的状态上运行此逻辑以获得这些附加表。 |
生成脚本以加载 Windows shell 脚本格式的选定状态的数据。
SELECT loader_generate_census_script(ARRAY['MA'], 'windows'); -- result -- set STATEDIR="\gisdata\www2.census.gov\geo\pvs\tiger2010st\25_Massachusetts" set TMPDIR=\gisdata\temp\ set UNZIPTOOL="C:\Program Files\7-Zip\7z.exe" set WGETTOOL="C:\wget\wget.exe" set PGBIN=C:\projects\pg\pg91win\bin\ set PGPORT=5432 set PGHOST=localhost set PGUSER=postgres set PGPASSWORD=yourpasswordhere set PGDATABASE=tiger_postgis20 set PSQL="%PGBIN%psql" set SHP2PGSQL="%PGBIN%shp2pgsql" cd \gisdata %WGETTOOL% http://www2.census.gov/geo/pvs/tiger2010st/25_Massachusetts/25/ --no-parent --relative --accept=*bg10.zip,*tract10.zip,*tabblock10.zip --mirror --reject=html del %TMPDIR%\*.* /Q %PSQL% -c "DROP SCHEMA tiger_staging CASCADE;" %PSQL% -c "CREATE SCHEMA tiger_staging;" cd %STATEDIR% for /r %%z in (*.zip) do %UNZIPTOOL% e %%z -o%TMPDIR% cd %TMPDIR% %PSQL% -c "CREATE TABLE tiger_data.MA_tract(CONSTRAINT pk_MA_tract PRIMARY KEY (tract_id) ) INHERITS(tiger.tract); " %SHP2PGSQL% -c -s 4269 -g the_geom -W "latin1" tl_2010_25_tract10.dbf tiger_staging.ma_tract10 | %PSQL% %PSQL% -c "ALTER TABLE tiger_staging.MA_tract10 RENAME geoid10 TO tract_id; SELECT loader_load_staged_data(lower('MA_tract10'), lower('MA_tract')); " %PSQL% -c "CREATE INDEX tiger_data_MA_tract_the_geom_gist ON tiger_data.MA_tract USING gist(the_geom);" %PSQL% -c "VACUUM ANALYZE tiger_data.MA_tract;" %PSQL% -c "ALTER TABLE tiger_data.MA_tract ADD CONSTRAINT chk_statefp CHECK (statefp = '25');" :
生成sh脚本
STATEDIR="/gisdata/www2.census.gov/geo/pvs/tiger2010st/25_Massachusetts" TMPDIR="/gisdata/temp/" UNZIPTOOL=unzip WGETTOOL="/usr/bin/wget" export PGBIN=/usr/pgsql-9.0/bin export PGPORT=5432 export PGHOST=localhost export PGUSER=postgres export PGPASSWORD=yourpasswordhere export PGDATABASE=geocoder PSQL=${PGBIN}/psql SHP2PGSQL=${PGBIN}/shp2pgsql cd /gisdata wget http://www2.census.gov/geo/pvs/tiger2010st/25_Massachusetts/25/ --no-parent --relative --accept=*bg10.zip,*tract10.zip,*tabblock10.zip --mirror --reject=html rm -f ${TMPDIR}/*.* ${PSQL} -c "DROP SCHEMA tiger_staging CASCADE;" ${PSQL} -c "CREATE SCHEMA tiger_staging;" cd $STATEDIR for z in *.zip; do $UNZIPTOOL -o -d $TMPDIR $z; done : :
Loader_Generate_Script — 为指定平台的指定状态生成 shell 脚本,该脚本将下载 Tiger 数据、暂存并加载到 Tiger_data
模式中。 每个状态脚本都作为单独的记录返回。 最新版本支持 Tiger 2010 结构变化,还加载人口普查区、区块组和区块表。
setof text loader_generate_script(
text[] param_states, text os)
;
为指定平台的指定状态生成 shell 脚本,该脚本将下载 Tiger 数据、暂存并加载到 Tiger_data
模式中。 每个状态脚本都作为单独的记录返回。
它在 Linux 上使用 unzip(在 Windows 上默认为 7-zip)和 wget 来进行下载。 它使用Section 4.7.2, “使用Shapefile加载器”来加载数据。 请注意,它的最小单位是整个状态,但您可以通过自己下载文件来覆盖它。 它只会处理暂存文件夹和临时文件夹中的文件。
它使用以下控制表来控制进程和不同的操作系统 shell 语法变化。
loader_variables
跟踪各种变量,例如人口普查站点、年份、数据和暂存模式
loader_platform
各种平台的配置文件以及各种可执行文件所在的位置。 自带windows和linux。 还可以添加更多。
loader_lookuptables
每条记录定义一种表(州、县)、是否处理其中的记录以及如何加载它们。定义每个记录的导入数据、暂存数据、添加、删除列、索引和约束的步骤。 每个表都以状态为前缀,并继承自 Tiger 模式中的表。 例如 创建从tiger.faces
继承的tiger_data.ma_faces
可用性:2.0.0支持Tiger 2010结构化数据并加载人口普查区(tract)、区块组(bg)和区块(tabblocks)表。
![]() | |
如果您使用 pgAdmin 3,请注意默认情况下 pgAdmin 3 会截断长文本。 要修复此问题,请更改文件File -> Options ->Query Tool -> Query Editor ->Max.每列字符数大于 50000 个字符。 |
使用 psql,其中 gitest 是您的数据库,/gisdata/data_load.sh
是使用要运行的 shell 命令创建的文件。
psql -U postgres -h localhost -d gistest -A -t \ -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'gistest')" > /gisdata/data_load.sh;
生成脚本以加载 Windows shell 脚本格式的 2 个状态的数据。
SELECT loader_generate_script(ARRAY['MA','RI'], 'windows') AS result; -- result -- set TMPDIR=\gisdata\temp\ set UNZIPTOOL="C:\Program Files\7-Zip\7z.exe" set WGETTOOL="C:\wget\wget.exe" set PGBIN=C:\Program Files\PostgreSQL\9.4\bin\ set PGPORT=5432 set PGHOST=localhost set PGUSER=postgres set PGPASSWORD=yourpasswordhere set PGDATABASE=geocoder set PSQL="%PGBIN%psql" set SHP2PGSQL="%PGBIN%shp2pgsql" cd \gisdata cd \gisdata %WGETTOOL% ftp://ftp2.census.gov/geo/tiger/TIGER2015/PLACE/tl_*_25_* --no-parent --relative --recursive --level=2 --accept=zip --mirror --reject=html cd \gisdata/ftp2.census.gov/geo/tiger/TIGER2015/PLACE : :
生成sh脚本
SELECT loader_generate_script(ARRAY['MA','RI'], 'sh') AS result; -- result -- TMPDIR="/gisdata/temp/" UNZIPTOOL=unzip WGETTOOL="/usr/bin/wget" export PGBIN=/usr/lib/postgresql/9.4/bin -- variables used by psql: https://www.postgresql.org/docs/current/static/libpq-envars.html export PGPORT=5432 export PGHOST=localhost export PGUSER=postgres export PGPASSWORD=yourpasswordhere export PGDATABASE=geocoder PSQL=${PGBIN}/psql SHP2PGSQL=${PGBIN}/shp2pgsql cd /gisdata cd /gisdata wget ftp://ftp2.census.gov/geo/tiger/TIGER2015/PLACE/tl_*_25_* --no-parent --relative --recursive --level=2 --accept=zip --mirror --reject=html cd /gisdata/ftp2.census.gov/geo/tiger/TIGER2015/PLACE rm -f ${TMPDIR}/*.* : :
Loader_Generate_Nation_Script — 为指定平台生成加载到县和州查找表中的 shell 脚本。
text loader_generate_nation_script(
text os)
;
为指定平台生成 shell 脚本,将 County_all
、county_all_lookup
、state_all
表加载到 Tiger_data
架构中。 它们分别继承自tiger
模式中的 County
、county_lookup
、state
表。
它在 Linux 上使用 unzip(在 Windows 上默认为 7-zip)和 wget 来进行下载。 它使用Section 4.7.2, “使用Shapefile加载器”来加载数据。
它使用以下控制表 Tiger.loader_platform
、tiger.loader_variables
和 Tiger.loader_lookuptables
来控制进程和不同操作系统 shell 语法变化。
loader_variables
跟踪各种变量,例如人口普查站点、年份、数据和暂存模式
loader_platform
各种平台的配置文件以及各种可执行文件所在的位置。 带有 windows 和 linux/unix。 还可以添加更多。
loader_lookuptables
每条记录定义一种表(州、县)、是否处理其中的记录以及如何加载它们。定义每个记录的导入数据、暂存数据、添加、删除列、索引和约束的步骤。 每个表都以状态为前缀,并继承自 Tiger 模式中的表。 例如 创建从tiger.faces
继承的tiger_data.ma_faces
增强:2.4.1 邮政编码 5 制表区域 (zcta5) 加载步骤已修复,启用后,zcta5 数据将作为名为 zcta5_all 的单个表加载,作为国家脚本加载的一部分。
可用性:2.1.0
![]() | |
如果您希望将邮政编码 5 制表区域 (zcta5) 包含在您的国家脚本加载中,请执行以下操作: UPDATE tiger.loader_lookuptables SET load = true WHERE table_name = 'zcta510'; |
![]() | |
如果您运行的是 |
生成脚本来加载Windows的国家数据。
SELECT loader_generate_nation_script('windows');
生成脚本来加载 Linux/Unix 系统的数据。
SELECT loader_generate_nation_script('sh');
Missing_Indexes_Generate_Script — 查找具有在地理编码器联接中使用的键列的所有表,这些表缺少这些列上的索引,并将输出 SQL DDL 来定义这些表的索引。
text Missing_Indexes_Generate_Script(
)
;
查找 tiger
和 Tiger_data
架构中的所有表,其中包含在地理编码器联接中使用的关键列,这些列上缺少索引,并将输出 SQL DDL 来定义这些表的索引。 这是一个辅助函数,它添加了使查询更快所需的新索引,而这些索引可能在加载过程中丢失。 随着地理编码器的改进,该函数将更新以适应正在使用的新索引。 如果此函数没有输出任何内容,则意味着您的所有表都具有我们认为的关键索引。
可用性: 2.0.0
SELECT missing_indexes_generate_script(); -- output: This was run on a database that was created before many corrections were made to the loading script --- CREATE INDEX idx_tiger_county_countyfp ON tiger.county USING btree(countyfp); CREATE INDEX idx_tiger_cousub_countyfp ON tiger.cousub USING btree(countyfp); CREATE INDEX idx_tiger_edges_tfidr ON tiger.edges USING btree(tfidr); CREATE INDEX idx_tiger_edges_tfidl ON tiger.edges USING btree(tfidl); CREATE INDEX idx_tiger_zip_lookup_all_zip ON tiger.zip_lookup_all USING btree(zip); CREATE INDEX idx_tiger_data_ma_county_countyfp ON tiger_data.ma_county USING btree(countyfp); CREATE INDEX idx_tiger_data_ma_cousub_countyfp ON tiger_data.ma_cousub USING btree(countyfp); CREATE INDEX idx_tiger_data_ma_edges_countyfp ON tiger_data.ma_edges USING btree(countyfp); CREATE INDEX idx_tiger_data_ma_faces_countyfp ON tiger_data.ma_faces USING btree(countyfp);
Normalize_Address — 给定文本街道地址,返回复合的norm_addy
类型,该类型具有道路后缀、前缀和标准化类型、街道、街道名称等,分为单独的字段。 该函数仅适用于与 Tiger_geocoder 打包的查找数据(不需要tiger普查数据)。
norm_addy normalize_address(
varchar in_address)
;
给定文本街道地址,返回复合的norm_addy
类型,该类型具有道路后缀、前缀和标准化类型、街道、街道名称等,分为单独的字段。 这是地理编码过程中将所有地址转换为标准化邮政形式的第一步。 除了地理编码器打包的数据之外,不需要其他数据。
此函数仅使用使用 Tiger_geocoder 预加载并位于tiger
模式中的各种方向/状态/后缀查找表,因此不需要您下载tiger普查数据或任何其他附加数据来使用它。 您可能会发现需要向 Tiger
模式中的各种查找表添加更多缩写或替代命名。
它使用位于 tiger
模式中的各种控制查找表来标准化输入地址。
该函数返回的norm_addy
类型对象中的字段按以下顺序排列,其中()表示地理编码器所需的字段,[]表示可选字段:
(address) [predirAbbrev] (streetName) [streetTypeAbbrev] [postdirAbbrev] [internal] [location] [stateAbbrev] [zip] [parsed] [zip4] [address_alphanumeric]
增强:2.4.0norm_addy对象包括附加字段zip4和address_alphanumeric。
address
是一个整数:街道号码
predirAbbrev
是 varchar:道路的方向前缀,例如 N、S、E、W 等。这些是使用 Direction_lookup
表进行控制的。
streetName
是varchar
streetTypeAbbrev
varchar 街道类型的缩写版本:例如 St, Ave, Cir。 这些是使用 street_type_lookup
表进行控制的。
postdirAbbrev
varchar类型是 道路 N、S、E、W 等方向的缩写。这些是使用 Direction_lookup
表进行控制的。
internal
varchar类型内部地址,例如公寓或套房号。
location
varchar类型, 通常是城市或管辖省份。
stateAbbrev
varchar类型 两个字符的美国州。 例如MA, NY, MI。 这些由 state_lookup
表控制。
zip
varchar类型, 5 位邮政编码。 例如 02109。
parsed
boolean类型 - 表示地址是否是由标准化过程形成的。 Normalize_address 函数在返回地址之前将其设置为 true。
zip4
9 位邮政编码的最后 4 位数字。 可用性:PostGIS 2.4.0。
address_alphanumeric
完整的街道号码,即使它具有字母字符(如 17R)。 对此的解析最好使用Pagc_Normalize_Address 函数。 可用性:PostGIS 2.4.0。
输出选择字段。 如果您想要漂亮的文本输出,请使用 Pprint_Addy。
SELECT address As orig, (g.na).streetname, (g.na).streettypeabbrev FROM (SELECT address, normalize_address(address) As na FROM addresses_to_geocode) As g; orig | streetname | streettypeabbrev -----------------------------------------------------+---------------+------------------ 28 Capen Street, Medford, MA | Capen | St 124 Mount Auburn St, Cambridge, Massachusetts 02138 | Mount Auburn | St 950 Main Street, Worcester, MA 01610 | Main | St 529 Main Street, Boston MA, 02129 | Main | St 77 Massachusetts Avenue, Cambridge, MA 02139 | Massachusetts | Ave 25 Wizard of Oz, Walaford, KS 99912323 | Wizard of Oz |
Pagc_Normalize_Address — 给定文本街道地址,返回复合的norm_addy
类型,该类型具有道路后缀、前缀和标准化类型、街道、街道名称等,分为单独的字段。 该函数仅适用于与 Tiger_geocoder 打包的查找数据(不需要tiger普查数据)。 需要 address_standardizer 扩展。
norm_addy pagc_normalize_address(
varchar in_address)
;
给定文本街道地址,返回复合的norm_addy
类型,该类型具有道路后缀、前缀和标准化类型、街道、街道名称等,分为单独的字段。 这是地理编码过程中将所有地址转换为标准化邮政形式的第一步。 除了地理编码器打包的数据之外,不需要其他数据。
该函数仅使用各种 pagc_* 查找表,这些表由 Tiger_geocoder 预加载并位于 Tiger
模式中,因此不需要您下载tiger普查数据或任何其他附加数据来使用它。 您可能会发现需要向 Tiger
模式中的各种查找表添加更多缩写或替代命名。
它使用位于 tiger
模式中的各种控制查找表来标准化输入地址。
该函数返回的norm_addy
类型对象中的字段按以下顺序排列,其中()表示地理编码器所需的字段,[]表示可选字段:
Normalize_Address 的大小写和格式略有不同。
可用性:2.1.0
该方法需要address_standardizer扩展。
(address) [predirAbbrev] (streetName) [streetTypeAbbrev] [postdirAbbrev] [internal] [location] [stateAbbrev] [zip]
目前,address_standardizer 扩展的本机 standardaddr 比norm_addy 丰富一些,因为它旨在支持国际地址(包括国家/地区)。 standardaddr 等效字段是:
house_num,predir, name, suftype, sufdir, unit, city, state, postcode
增强:2.4.0norm_addy对象包括附加字段zip4和address_alphanumeric。
address
是一个整数:街道号码
predirAbbrev
是 varchar:道路的方向前缀,例如 N、S、E、W 等。这些是使用 Direction_lookup
表进行控制的。
streetName
是varchar
streetTypeAbbrev
varchar 街道类型的缩写版本:例如 St, Ave, Cir。 这些是使用 street_type_lookup
表进行控制的。
postdirAbbrev
varchar类型是 道路 N、S、E、W 等方向的缩写。这些是使用 Direction_lookup
表进行控制的。
internal
varchar类型内部地址,例如公寓或套房号。
location
varchar类型, 通常是城市或管辖省份。
stateAbbrev
varchar类型 两个字符的美国州。 例如MA, NY, MI。 这些由 state_lookup
表控制。
zip
varchar类型, 5 位邮政编码。 例如 02109。
parsed
boolean类型 - 表示地址是否是由标准化过程形成的。 Normalize_address 函数在返回地址之前将其设置为 true。
zip4
9 位邮政编码的最后 4 位数字。 可用性:PostGIS 2.4.0。
address_alphanumeric
完整的街道号码,即使它具有字母字符(如 17R)。 对此的解析最好使用Pagc_Normalize_Address 函数。 可用性:PostGIS 2.4.0。
单次调用示例
SELECT addy.* FROM pagc_normalize_address('9000 E ROO ST STE 999, Springfield, CO') AS addy; address | predirabbrev | streetname | streettypeabbrev | postdirabbrev | internal | location | stateabbrev | zip | parsed ---------+--------------+------------+------------------+---------------+-----------+-------------+-------------+-----+-------- 9000 | E | ROO | ST | | SUITE 999 | SPRINGFIELD | CO | | t
批量调用。 目前,postgis_tiger_geocoder 包装 address_standardizer 的方式存在速度问题。 这些问题有望在以后的版本中得到解决。 为了解决这些问题,如果您需要批量地理编码的速度以批量模式调用生成normaddy,建议您直接调用address_standardizer standardize_address函数,如下所示,这与我们在Normalize_Address中所做的类似,使用在Geocode中创建的数据 。
WITH g AS (SELECT address, ROW((sa).house_num, (sa).predir, (sa).name , (sa).suftype, (sa).sufdir, (sa).unit , (sa).city, (sa).state, (sa).postcode, true)::norm_addy As na FROM (SELECT address, standardize_address('tiger.pagc_lex' , 'tiger.pagc_gaz' , 'tiger.pagc_rules', address) As sa FROM addresses_to_geocode) As g) SELECT address As orig, (g.na).streetname, (g.na).streettypeabbrev FROM g; orig | streetname | streettypeabbrev -----------------------------------------------------+---------------+------------------ 529 Main Street, Boston MA, 02129 | MAIN | ST 77 Massachusetts Avenue, Cambridge, MA 02139 | MASSACHUSETTS | AVE 25 Wizard of Oz, Walaford, KS 99912323 | WIZARD OF | 26 Capen Street, Medford, MA | CAPEN | ST 124 Mount Auburn St, Cambridge, Massachusetts 02138 | MOUNT AUBURN | ST 950 Main Street, Worcester, MA 01610 | MAIN | ST
Pprint_Addy — 给定一个norm_addy
复合类型对象,返回它的漂亮的打印表示。 通常与normalize_address结合使用。
varchar pprint_addy(
norm_addy in_addy)
;
漂亮地打印一个地址
SELECT pprint_addy(normalize_address('202 East Fremont Street, Las Vegas, Nevada 89101')) As pretty_address; pretty_address --------------------------------------- 202 E Fremont St, Las Vegas, NV 89101
漂亮的打印地址地址表
SELECT address As orig, pprint_addy(normalize_address(address)) As pretty_address FROM addresses_to_geocode; orig | pretty_address -----------------------------------------------------+------------------------------------------- 529 Main Street, Boston MA, 02129 | 529 Main St, Boston MA, 02129 77 Massachusetts Avenue, Cambridge, MA 02139 | 77 Massachusetts Ave, Cambridge, MA 02139 28 Capen Street, Medford, MA | 28 Capen St, Medford, MA 124 Mount Auburn St, Cambridge, Massachusetts 02138 | 124 Mount Auburn St, Cambridge, MA 02138 950 Main Street, Worcester, MA 01610 | 950 Main St, Worcester, MA 01610
Reverse_Geocode — 获取已知空间参考系统中的几何点并返回一条记录,其中包含理论上可能的地址数组和交叉街道数组。 如果 include_strnum_range = true,则包括交叉街道中的街道范围。
record Reverse_Geocode(
geometry pt, boolean include_strnum_range=false, geometry[] OUT intpt, norm_addy[] OUT addy, varchar[] OUT street)
;
获取已知空间参考中的几何点并返回一条记录,其中包含理论上可能的地址数组和十字街道数组。 如果 include_strnum_range = true,则包括交叉街道中的街道范围。 如果未传入,则 include_strnum_range 默认为 false。地址根据点最接近的道路进行排序,因此第一个地址很可能是正确的地址。
为什么我们说理论地址而不是实际地址。 Tiger 数据没有真实地址,只有街道范围。 因此,理论地址是基于街道范围的内插地址。 例如,插入我的地址之一会返回 26 Court St. 和 26 Court Sq.,尽管不存在 26 Court Sq. 这样的地方。 这是因为一个点可能位于 2 条街道的拐角处,因此逻辑会沿着两条街道进行插值。 该逻辑还假设地址沿着街道均匀分布,这当然是错误的,因为您可以让市政建筑占据街道范围的很大一部分,而其余建筑物则聚集在末端。
注意:嗯,这个功能依赖于 Tiger 数据。 如果您还没有加载覆盖该点区域的数据,那么您将得到一条充满 NULL 的记录。
返回的记录元素如下:
intpt
是一个点数组:这些是街道上最接近输入点的中心线点。 有多少个地址就有多少个点。
addy
是一个norm_addy(规范化地址)数组:这些是适合输入点的可能地址数组。 数组中的第一个最有可能。 一般来说应该只有一个,除非某个点位于 2 或 3 条街道的拐角处,或者该点位于道路上的某个位置而不是在侧面。
street varchar
数组:这些是交叉街道(或街道)(相交的街道或者是点投影所在的街道)。
增强:2.4.1 如果加载了可选的 zcta5 数据集,即使未加载特定的状态数据,reverse_geocode 函数也可以解析为状态和 zip。 有关加载 zcta5 数据的详细信息,请参阅 Loader_Generate_Nation_Script。
可用性: 2.0.0
位于两条街道拐角处但最接近一条街道的点示例。 这是 MIT 的大致位置:77 Massachusetts Ave, Cambridge, MA 02139 请注意,虽然我们没有 3 条街道,但 PostgreSQL 只会为高于上限的条目返回 null,因此可以安全使用。 这包括街道范围
SELECT pprint_addy(r.addy[1]) As st1, pprint_addy(r.addy[2]) As st2, pprint_addy(r.addy[3]) As st3, array_to_string(r.street, ',') As cross_streets FROM reverse_geocode(ST_GeomFromText('POINT(-71.093902 42.359446)',4269),true) As r; result ------ st1 | st2 | st3 | cross_streets -------------------------------------------+-----+-----+---------------------------------------------- 67 Massachusetts Ave, Cambridge, MA 02139 | | | 67 - 127 Massachusetts Ave,32 - 88 Vassar St
在这里,我们选择不包括十字路口的地址范围,并选择了一个非常靠近两条街道拐角处的位置,因此可以通过两个不同的地址来识别。
SELECT pprint_addy(r.addy[1]) As st1, pprint_addy(r.addy[2]) As st2, pprint_addy(r.addy[3]) As st3, array_to_string(r.street, ',') As cross_str FROM reverse_geocode(ST_GeomFromText('POINT(-71.06941 42.34225)',4269)) As r; result -------- st1 | st2 | st3 | cross_str ---------------------------------+---------------------------------+-----+------------------------ 5 Bradford St, Boston, MA 02118 | 49 Waltham St, Boston, MA 02118 | | Waltham St
对于这一点,我们重用Geocode 中的地理编码示例,并且只需要主要地址和最多 2 个交叉街道。
SELECT actual_addr, lon, lat, pprint_addy((rg).addy[1]) As int_addr1, (rg).street[1] As cross1, (rg).street[2] As cross2 FROM (SELECT address As actual_addr, lon, lat, reverse_geocode( ST_SetSRID(ST_Point(lon,lat),4326) ) As rg FROM addresses_to_geocode WHERE rating > -1) As foo; actual_addr | lon | lat | int_addr1 | cross1 | cross2 -----------------------------------------------------+-----------+----------+-------------------------------------------+-----------------+------------ 529 Main Street, Boston MA, 02129 | -71.07181 | 42.38359 | 527 Main St, Boston, MA 02129 | Medford St | 77 Massachusetts Avenue, Cambridge, MA 02139 | -71.09428 | 42.35988 | 77 Massachusetts Ave, Cambridge, MA 02139 | Vassar St | 26 Capen Street, Medford, MA | -71.12377 | 42.41101 | 9 Edison Ave, Medford, MA 02155 | Capen St | Tesla Ave 124 Mount Auburn St, Cambridge, Massachusetts 02138 | -71.12304 | 42.37328 | 3 University Rd, Cambridge, MA 02138 | Mount Auburn St | 950 Main Street, Worcester, MA 01610 | -71.82368 | 42.24956 | 3 Maywood St, Worcester, MA 01603 | Main St | Maywood Pl
Topology_Load_Tiger — 将tiger数据的定义区域加载到 PostGIS 拓扑中,并将老虎数据转换为拓扑的空间参考,并捕捉到拓扑的精度公差。
text Topology_Load_Tiger(
varchar topo_name, varchar region_type, varchar region_id)
;
将定义的tiger数据区域加载到 PostGIS 拓扑中。 面、节点和边将转换为目标拓扑的空间参考系统,点将捕捉到目标拓扑的容差。 创建的面、节点、边与原始 Tiger 数据面、节点、边保持相同的 ID,以便数据集将来可以更轻松地与 Tiger 数据进行协调。 返回有关流程的摘要详细信息。
例如,这对于重新划分数据非常有用,在这种情况下,您需要新形成的多边形遵循街道的中心线,并且生成的多边形不重叠。
![]() | |
该功能依赖Tiger数据以及PostGIS拓扑模块的安装。 有关更多信息,请参阅Chapter 9, 拓扑结构和Section 2.2.3, “构建配置”。 如果您尚未加载覆盖感兴趣区域的数据,则不会创建任何拓扑记录。 如果您没有使用拓扑函数创建拓扑,此函数也会失败。 |
![]() | |
大多数拓扑验证错误都是由于公差问题造成的,即变换后边缘点没有完全对齐或重叠。 为了纠正这种情况,如果拓扑验证失败,您可能需要提高或降低精度。 |
所需参数:
topo_name
要加载数据的现有 PostGIS 拓扑的名称。
Region_type
边界区域的类型。 目前仅支持place
和county
。 计划是再多几个。 这是用于定义区域边界的表格。 例如,tiger.place
、tiger.county
Region_id
这就是 TIGER 所说的大地水准面。 它是表中区域的唯一标识符。 对于 place,它是 Tiger.place
中的 plcidfp
列。 对于county,它是 Tiger.county
中的 cntyidfp
列
可用性: 2.0.0
在 Mass State Plane Feet (2249) 中创建马萨诸塞州波士顿的拓扑,容差为 0.25 英尺,然后加载到波士顿城市tiger面、边缘、节点。
SELECT topology.CreateTopology('topo_boston', 2249, 0.25); createtopology -------------- 15 -- 60,902 ms ~ 1 minute on windows 7 desktop running 9.1 (with 5 states tiger data loaded) SELECT tiger.topology_load_tiger('topo_boston', 'place', '2507000'); -- topology_loader_tiger -- 29722 edges holding in temporary. 11108 faces added. 1875 edges of faces added. 20576 nodes added. 19962 nodes contained in a face. 0 edge start end corrected. 31597 edges added. -- 41 ms -- SELECT topology.TopologySummary('topo_boston'); -- topologysummary-- Topology topo_boston (15), SRID 2249, precision 0.25 20576 nodes, 31597 edges, 11109 faces, 0 topogeoms in 0 layers -- 28,797 ms to validate yeh returned no errors -- SELECT * FROM topology.ValidateTopology('topo_boston'); error | id1 | id2 -------------------+----------+-----------
在 Mass State Plane Meters (26986) 中创建马萨诸塞州萨福克市的拓扑,容差为 0.25 米,然后加载到萨福克县tiger面、边、节点。
SELECT topology.CreateTopology('topo_suffolk', 26986, 0.25); -- this took 56,275 ms ~ 1 minute on Windows 7 32-bit with 5 states of tiger loaded -- must have been warmed up after loading boston SELECT tiger.topology_load_tiger('topo_suffolk', 'county', '25025'); -- topology_loader_tiger -- 36003 edges holding in temporary. 13518 faces added. 2172 edges of faces added. 24761 nodes added. 24075 nodes contained in a face. 0 edge start end corrected. 38175 edges added. -- 31 ms -- SELECT topology.TopologySummary('topo_suffolk'); -- topologysummary-- Topology topo_suffolk (14), SRID 26986, precision 0.25 24761 nodes, 38175 edges, 13519 faces, 0 topogeoms in 0 layers -- 33,606 ms to validate -- SELECT * FROM topology.ValidateTopology('topo_suffolk'); error | id1 | id2 -------------------+----------+----------- coincident nodes | 81045651 | 81064553 edge crosses node | 81045651 | 85737793 edge crosses node | 81045651 | 85742215 edge crosses node | 81045651 | 620628939 edge crosses node | 81064553 | 85697815 edge crosses node | 81064553 | 85728168 edge crosses node | 81064553 | 85733413
Set_Geocode_Setting — 设置影响地理编码器功能行为的设置。
text Set_Geocode_Setting(
text setting_name, text setting_value)
;
设置存储在 Tiger.geocode_settings
表中的特定设置的值。 设置允许您切换功能的调试。 稍后的计划将是通过设置来控制评级。 当前设置列表列在 Get_Geocode_Setting 中。
可用性:2.1.0
如果您在该函数为 true 时运行Geocode,则 NOTICE 日志将输出计时和查询。
SELECT set_geocode_setting('debug_geocode_address', 'true') As result; result --------- true
下面的函数是空间聚合函数,其使用方式与 SQL 聚合函数(例如 sum
和average
)相同。
下面的函数是空间窗口函数,其使用方式与 SQL 窗口函数(例如 row_number()
、lead()
和 lag()
)相同。 它们后面必须跟有 OVER()
子句。
下面给出的函数是符合 SQL/MM 3 标准的 PostGIS 函数
以下列出的函数和操作符是 PostGIS 函数/操作符,它们的输入或输出涉及到 geography 数据类型对象。
![]() | |
带有 (T) 的函数不是本机大地测量函数,并且使用与几何之间的 ST_Transform 调用来执行操作。 因此,当越过日期变更线、极点以及覆盖多个 UTM 区域的大型几何图形或几何图形对时,它们可能不会按预期运行。 基本变换 - (有利于 UTM、兰伯特方位角(北/南),并在最坏的情况下依靠墨卡托) |
下面给出的函数和运算符是 PostGIS 函数/运算符,它们将raster数据类型对象作为输入或返回作为输出。 按字母顺序列出。
下面给出的函数是 PostGIS 函数,它们将一组或单个 Geometry_dump 或 geomval 数据类型对象作为输入或返回作为输出。
下面给出的函数是 PostGIS 函数,它们将 Box* 系列 PostGIS 空间类型作为输入或返回作为输出。 box 系列类型由 box2d 和 box3d 组成
下面给出的函数是不会丢弃 Z-Index 的 PostGIS 函数。
下面给出的函数是 PostGIS 函数,可以使用 CIRCULARSTRING、CURVEPOLYGON 和其他曲线几何类型
下面给出的函数是可以使用 POLYHEDRALSURFACE、POLYHEDRALSURFACEM 几何图形的 PostGIS 函数
下面按字母顺序列出了 PostGIS 中的空间特殊函数以及它们使用的空间类型或它们试图遵守的 OGC/SQL 合规性。
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 3.5
PostGIS 中的功能发生变化 3.5
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 3.4
PostGIS 的功能增强 3.4
PostGIS 中的功能发生变化 3.4
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 3.3
PostGIS 的功能增强 3.3
PostGIS 中的功能发生变化 3.3
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 3.2
PostGIS 的功能增强 3.2
PostGIS 中的功能发生变化 3.2
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 3.1
PostGIS 的功能增强 3.1
PostGIS 中的功能发生变化 3.1
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 3.0
PostGIS 的功能增强 3.0
PostGIS 中的功能发生变化 3.0
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 2.5
PostGIS 的功能增强 2.5
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 2.4
PostGIS 的功能增强 2.4
PostGIS 中的功能发生变化 2.4
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 2.3
PostGIS 的功能增强 2.3
PostGIS 中的功能发生变化 2.3
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 2.2
PostGIS 的功能增强 2.2
PostGIS 中的功能发生变化 2.2
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 2.1
PostGIS 的功能增强 2.1
PostGIS 中的功能发生变化 2.1
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 2.0
PostGIS 的功能增强 2.0
PostGIS 中的功能发生变化 2.0
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 1.5
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 1.4
下面给出的功能是添加或增强的 PostGIS 功能。
PostGIS 中的新功能 1.3
有效报告错误是帮助 PostGIS 开发的基本方法。 最有效的错误报告是使 PostGIS 开发人员能够重现它,因此它最好包含触发它的脚本以及有关检测到它的环境的所有信息。 运行 SELECT postgis_full_version()
[对于 PostGIS] 和 SELECT version()
[对于 postgresql] 可以提取足够好的信息。
如果您没有使用最新版本,则值得先查看其版本变更日志,以了解您的错误是否已得到修复。
使用 PostGIS 错误跟踪器将确保您的报告不会被丢弃,并让您随时了解其处理过程。 在报告新错误之前,请查询数据库以查看它是否是已知错误,如果是,请添加您所掌握的有关它的任何新信息。
在提交新报告之前,您可能需要阅读 Simon Tatham 关于如何有效报告错误 。
文档应准确反映软件的功能和行为。 如果没有,可能是因为软件错误或文档错误或缺陷。
文档问题也可以报告给 PostGIS bug 跟踪器。
如果您的修订很简单,只需在新的错误跟踪器问题中对其进行描述,并具体说明其在文档中的位置。
如果您的更改更广泛,那么补丁绝对是首选。 这是 Unix 上的四步过程(假设您已经安装了 git ):
克隆 PostGIS 的 git 存储库。 在 Unix 上,输入:
git clone https://git.osgeo.org/gitea/postgis/postgis.git
这将存储在 postgis 目录中
使用您最喜欢的文本编辑器对文档进行更改。 在 Unix 上,键入(例如):
vim doc/postgis.xml
请注意,该文档是用 DocBook XML 而不是 HTML 编写的,因此如果您不熟悉它,请按照文档其余部分的示例进行操作。
制作一个包含与文档主副本的差异的补丁文件。 在 Unix 上,输入:
git diff doc/postgis.xml > doc.patch
将补丁附加到错误跟踪器中的新问题。
2023/08/15
此版本需要 PostgreSQL 12-16、GEOS 3.6 或更高版本以及 Proj 6.1 。 要利用所有功能,需要 GEOS 3.12。 要利用 SFCGAL 的所有功能,需要 SFCGAL 1.4.1。
注意:GEOS 3.12.0 详细信息请参见 GEOS 3.12.0 发行说明
非常感谢我们的翻译团队,特别是:
Teramoto Ikuhiro (Japanese Team)
Vincent Bre (French Team)
有 2 个新的 ./configure 开关:
--disable-extension-upgrades-install,将跳过安装除 ANY--current 版本之外的所有扩展升级脚本。 如果您使用它,您可以使用 postgis 命令行工具安装选择升级
--without-pg_config,即使未安装 PostgreSQL,也将仅构建命令行工具 raster2pgsql 和 shp2pgsql
5055,完成手册国际化工作(Sandro Santilli)
5052,postgis_extensions_upgrade 中的目标版本支持 (Sandro Santilli)
5306,在编译时公开 GEOS 版本 (Sandro Santilli)
postgis 脚本中的新 install-extension-upgrades 命令 (Sandro Santilli)
5257、5261、5277,PostgreSQL 16 的支持更改 (Regina Obe)
5006、 705、ST_Transform:支持 PROJ 管道(Robert Coup、Koitudes)
5283, [postgis_topology] 重命名拓扑 (Sandro Santilli)
5286, [postgis_topology] 重命名TopoGeometryColumn (Sandro Santilli)
703、[postgis_raster] 添加最小/最大重采样选项(Christian Schroeder)
5336, [postgis_topology] 拓扑几何转换为拓扑元素支持 (Regina Obe)
允许将单个几何体插入到 Geometry(Multi*) 列中 (Paul Ramsey)
721、新的基于窗口的 ST_ClusterWithinWin 和 ST_ClusterIntersectingWin (Paul Ramsey)
5397, [address_standardizer] debug_standardize_address 函数 (Regina Obe)
5373ST_LargestEmptyCircle,公开有关圆查找的额外语义。 需要 Geos 3.9+(Martin Davis)
5267、ST_Project 几何签名和两点签名 (Paul Ramsey)
5267, ST_LineExtend 用于扩展线串 (Paul Ramsey)
新的覆盖函数 ST_CoverageInvalidEdges、ST_CoverageSimplify、ST_CoverageUnion (Paul Ramsey)
5194,不要从 postgis_extensions_upgrade 更新系统目录(Sandro Santilli)
5092,减少系统上安装的升级路径数量(Sandro Santilli)
635、honor --bindir(和 --prefix)为可执行文件配置开关(Sandro Santilli)
Honor --mandir (和 --prefix)配置手册页安装路径开关(Sandro Santilli)
Honor --htmldir (以及 --docdir 和 --prefix)配置 html 页面安装路径的开关 (Sandro Santilli)
5447 为 postgis 和 postgis_restore 实用程序添加了手册页 (Sandro Santilli)
[postgis_topology] 加快无边拓扑面的检查速度 (Sandro Santilli)
[postgis_topology] 加速拓扑验证中的重合节点检查 (Sandro Santilli)
718、ST_QuantizeCooperatives():加速实现(Even Rouault)
修复空间规划器统计信息以对包含/内部查询使用计算选择性 (Paul Ramsey)
734,postgis_proj_version 中 Proj 安装的附加元数据 (Paul Ramsey)
5177, 允许构建没有 PostgreSQL 服务器标头的工具。 尊遵循工具安装的前缀/bin (Sandro Santilli)
ST_Project 几何签名和两点签名 (Paul Ramsey)
4913、ST_AsSVG 支持曲线类型 CircularString、CompoundCurve、MultiCurve 和 MultiSurface (Regina Obe)
5266、ST_ClosestPoint、ST_ShortestLine、ST_LineSubString 支持地理类型(MobilityDB Esteban Zimanyi、Maxime Schoemans、Paul Ramsey)
5229,放弃对 Proj < 6.1 和 PG 11 的支持(Regina Obe)
5306、734、postgis_full_version() 和 postgis_proj_version() 现在输出有关 proj 网络配置和数据路径的更多信息。 如果与运行时不同,也会显示 GEOS 编译时版本(Paul Ramsey、Sandro Santilli)
5447, postgis_restore.pl 重命名为 postgis_restore (Sandro Santilli)
实用程序现在安装在操作系统 bin 或用户指定的 --bindir 和 --prefix 中,而不是 postgresql bin 中,并且扩展名被删除,Windows 上除外(postgis、postgis_restore、shp2pgsql、raster2pgsql、pgsql2shp、pgtopo_import、pgtopo_export)