PostGIS是对 PostgreSQL 对象关系数据库系统,允许将GIS(地理信息系统)对象存储在数据库中。PostGIS包括对基于GIST的R-Tree空间索引的支持,以及用于分析和处理GIS对象的函数。
这是版本手册 3.3.0dev
这项工作是根据 知识共享署名-类似共享3.0许可证 。您可以随意使用此材料,但我们要求您将功劳归功于PostGIS项目,并尽可能提供指向 http://postgis.net 。
PostGIS是由Refrtions Research Inc.创建的PostgreSQL关系数据库的空间扩展,是一个空间数据库技术研究项目。Refltions是一家位于加拿大不列颠哥伦比亚省维多利亚市的地理信息系统和数据库咨询公司,专门从事数据集成和定制软件开发。
PostGIS现在是OSGeo基金会的一个项目,由世界各地的许多FOSS4G开发人员和组织开发和资助,他们从它的功能和多功能性中获得了巨大的好处。
PostGIS项目开发小组计划支持和增强PostGIS,以更好地支持OGC和SQL/MM空间标准、高级拓扑结构(覆盖面、表面、网络)、桌面用户界面工具的数据源、查看和编辑地理信息系统数据的工具以及基于网络的访问工具等领域的一系列重要的地理信息系统功能。
邮政地理信息系统项目指导委员会(PSC)负责协调邮政地理信息系统项目的总体方向、发布周期、文件编制和推广工作。此外,PSC还提供一般用户支持,接受和批准来自一般PostGIS社区的补丁,并就涉及PostGIS的其他问题进行投票,例如开发人员提交访问权限、新的PSC成员或重大API更改。
MVT支持、错误修复、性能和稳定性改进、GitHub管理、使PostGIS与PostgreSQL版本保持一致
Buildbot维护、Windows生产和实验版本、文档、PostGIS与PostgreSQL版本的一致性、X3D支持、Tiger地理编码器支持、管理功能。
索引改进、错误修复和几何/地理功能改进、SFCGAL、栅格、GitHub管理和机器人维护。
邮政地理信息系统项目的联合创始人。一般错误修复、地理支持、地理和几何索引支持(2D、3D、ND索引和任何空间索引)、底层几何内部结构、GEOS功能集成和与GEOS版本的对齐、PostGIS与PostgreSQL版本的对齐、加载器/转储程序和Shapefile图形用户界面加载器。
Bug修复和维护、Buildbot维护、Git镜像管理、管理功能、新GEOS功能的集成以及与GEOS版本的协调、拓扑支持、栅格框架和低级API函数。
距离函数增强功能(包括3D距离和关系函数)和附加功能、微型WKB(TWKB)输出格式和常规用户支持
几何聚类功能添加、其他几何算法增强、GEOS增强和常规用户支持
GEOS增强功能和文档
Mapbox向量平铺和GeoBuf函数。Gogs测试和GitLab实验。
几何处理、PostgreSQL要点、常规错误修复
前PSC成员。栅格开发、与GDAL的集成、栅格加载器、用户支持、常规错误修复、在各种操作系统(Slackware、Mac、Windows等)上的测试
前PSC成员。协调的错误修复和维护工作、空间索引选择性和绑定、加载器/转储程序和Shapefile图形用户界面加载器,集成了新的和新的功能增强。
栅格开发、GDAL驱动程序支持、加载器
(荣休)输入/输出XML(KML、GML)/GeoJSON函数、3D支持和错误修复。
前PSC成员。一般开发、场地和建筑机器人维护、OSGeo孵化管理
CMake支持PostGIS,构建了原始的Python栅格加载器和低级栅格API函数
前PSC成员。文档和文档支持工具、构建机器人维护、对PostGIS新闻组的高级用户支持以及对PostGIS维护功能的增强。
PostGIS的原始开发者/联合创始人。Dave编写了服务器端对象、索引绑定和许多服务器端分析函数。
Shapefile加载器/翻车机的原始开发。
持续维护和发展核心职能。增强的曲线支持。Shapefile图形用户界面加载器。
PostGIS栅格实施的架构师。栅格整体架构、原型、编程支持
栅格开发(主要是地图代数解析函数)
亚历克斯·博德纳鲁 | 格雷格·特罗克塞尔 | 马特·布雷尔 |
亚历克斯·梅罗费尔 | 纪尧姆·拉尔日 | 马提亚斯湾 |
安德里亚·佩里 | 朱塞佩·布罗科洛 | 马克西姆·吉洛 |
安德烈亚斯·托勒夫森 | 韩旺 | 马克西姆·范·诺本 |
安德烈亚斯·诺伊曼 | Haribabu Kommi | 迈克尔·福尔 |
安德鲁·吉尔斯 | Havard Tveite | 迈克·图伊斯 |
安妮·吉斯拉 | 饭田哲司 | 内森·瓦格纳 |
安托万·巴约莱特 | 英格维尔德·尼斯图恩 | 纳撒尼尔·克莱 |
亚瑟·莱苏伊斯 | 冷成龙 | 尼基塔·舒尔加 |
阿图尔·扎基罗夫 | 詹姆斯·马卡 | 诺曼·维恩 |
芭芭拉·菲利波特 | 简·卡廷斯 | 帕特里夏·托泽 |
本·朱布 | 杰森·史密斯 | 拉法尔·马格达 |
伯恩哈德·赖特 | 杰夫·亚当斯 | 拉尔夫·梅森 |
比约恩·埃塞尔 | 吉姆·琼斯 | 雷米·库拉 |
布莱恩·哈姆林 | 乔·康威 | 理查德·格林伍德 |
布鲁斯·林达尔 | 乔恩·萨沃莱宁 | 罗杰船员 |
布鲁诺·沃尔夫三世 | 何塞·卡洛斯·马丁内斯·拉利 | 罗恩·梅耶尔 |
布莱斯·L·诺德格伦 | 约尔格·哈伯尼赫特 | Sebastiaan Couwenberg |
卡尔·安德森 | 朱利安·鲁豪德 | 谢尔盖·舒尔巴科夫 |
查理·萨维奇 | 卡希夫·拉苏尔 | 谢尔盖·费多塞夫 |
克里斯托夫·伯格 | 克劳斯·福斯特 | 杉山真一 |
克里斯托夫·莫奇-泰格德 | 克里斯·尤尔卡 | Shoaib Burq |
Dane Springmeyer | 劳伦茨·阿尔贝 | 西尔维奥·格罗索 |
戴夫·富里 | 拉尔斯·罗斯西格 | 斯特凡·科尼利乌·佩特里亚 |
大卫·加尼耶 | 徐利奥 | 斯特芬·麦克 |
大卫·斯基亚 | 洛伊克·巴托莱蒂 | 斯捷潘·库兹明 |
大卫·特谢尔 | Loic Dachary | 斯蒂芬·弗罗斯特 |
德米特里·瓦西里耶夫 | 卢卡·S·珀西奇 | 史蒂文·奥滕斯 |
埃杜因·卡里洛 | 卢卡斯·C·比利亚·雷亚尔 | 塔尔哈·里兹万 |
尤金·安蒂米罗夫 | 玛丽亚·阿里亚斯·德·雷纳 | 汤姆·格兰西 |
甚至连鲁奥特 | 马克·杜科布 | 汤姆·范·蒂尔伯格 |
弗兰克·沃默达姆 | 马克·桑德海姆 | 文森特·莫拉 |
乔治·席尔瓦 | 马库斯·沙伯 | 文森特·皮卡韦 |
杰拉尔德·费诺伊 | 马库斯·万纳 | Volf Tomáš |
吉诺·卢克雷齐 | 马特·阿莫斯 |
这些是为PostGIS项目贡献开发人员时间、托管或直接货币资金的公司实体。按字母顺序排列:
众筹活动是我们开展的活动,目的是为能够服务于大量人的急需的功能提供资金。每个活动都特别关注一个或一组特定的功能。每个赞助商只需投入所需资金的一小部分,而且有足够的人/组织捐款,我们就有资金支付将帮助许多人的工作。如果你有一个功能的想法,你认为许多其他人会愿意共同出资,请张贴到 PostGIS新闻组 你的想法和我们的共同努力可以让它成为现实。
PostGIS2.0.0是我们尝试这一策略的第一个版本。我们用了 PledgeBank 我们从中获得了两次成功的竞选活动。
后牙周学 -10个以上的赞助商每人出资250美元来构建toTopGeometry函数并在2.0.0中增强对拓扑的支持。事情发生了。
Postgis64windows -20多个赞助商每人捐赠了100美元,用于支付在Windows上解决PostGIS 64位问题所需的工作。事情发生了。
这个 GEOS 几何运算库
这个 GDAL 地理空间数据抽象库用于增强PostGIS2中引入的大部分栅格功能。同样,GDAL中支持PostGIS所需的改进也将回馈给GDAL项目。
这个 PROJ 地图投影库
最后但并非最不重要, PostgreSQL ,邮政地理信息系统赖以生存的巨人。如果没有PostgreSQL提供的可扩展性、强大的查询规划器、GIST索引和大量的SQL特性,PostGIS的大部分速度和灵活性都是不可能的。
本章详细介绍安装PostGIS所需的步骤。
要在假设搜索路径中具有所有依赖项的情况下进行编译,请执行以下操作:
tar -xvfz postgis-3.3.0dev.tar.gz cd postgis-3.3.0dev ./configure make make install
安装PostGIS后,需要启用它( Section 3.3, “创建空间数据库” )或升级( Section 3.4, “升级空间数据库” )在要在其中使用它的每个单独数据库中。
![]() | |
许多操作系统现在都包含针对PostgreSQL/PostGIS的预建程序包。在许多情况下,只有当您想要最先进的版本或您是包的维护者时,编译才是必要的。 本节包括一般编译说明,如果您正在为Windows ETC或其他操作系统编译,您可以在以下位置找到更多更详细的帮助 PostGIS用户贡献的编译指南 和 PostGIS开发人员维基 。 中列出了针对各种操作系统的预建程序包 PostGIS预建程序包 如果您是Windows用户,则可以通过StackBuilder或 PostGIS Windows下载站点 我们也有 非常尖端的Windows试验性构建 通常每周建造一到两次,或者每当有令人兴奋的事情发生时。您可以使用这些工具来体验正在进行的PostGIS版本 |
The PostGIS module is an extension to the PostgreSQL backend server. As such, PostGIS 3.3.0dev requires full PostgreSQL server headers access in order to compile. It can be built against PostgreSQL versions 11 or higher. Earlier versions of PostgreSQL are not supported.
如果您尚未安装PostgreSQL,请参阅PostgreSQL安装指南。 http://www.postgresql.org 。
![]() | |
对于GEOS功能,在安装PostgresSQL时,可能需要将PostgreSQL显式链接到标准C++库: LDFLAGS=-lstdc++./在此处配置[您的选项] 这是一种针对伪C++异常与旧开发工具交互的变通方法。如果您遇到奇怪的问题(后端意外关闭或类似的事情),请尝试此技巧。当然,这需要从头开始重新编译您的PostgreSQL。 |
以下步骤概述了PostGIS源代码的配置和编译。它们是为Linux用户编写的,不能在Windows或Mac上运行。
Retrieve the PostGIS source archive from the downloads website http://postgis.net/stuff/postgis-3.3.0dev.tar.gz
wget http://postgis.net/stuff/postgis-3.3.0dev.tar.gz tar -xvzf postgis-3.3.0dev.tar.gz
这将创建一个名为 邮局- 3.3.0dev
在当前工作目录中。
或者,从 吉特 存储库 https://git.osgeo.org/gitea/postgis/postgis/ 。
Git克隆https://git.osgeo.org/gitea/postgis/postgis.git Postgis
更改为新创建的 PostGIS
目录以继续安装。
PostGIS对构建和使用有以下要求:
必填项
PostgreSQL 11 或者更高。需要完整安装PostgreSQL(包括服务器标头)。可从以下网址获得PostgreSQL http://www.postgresql.org 。
有关完整的PostgreSQL/PostGIS支持列表和PostGIS/GEOS支持列表,请参阅 http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS
GNU C编译器( GCC
)。其他一些ANSI C编译器可用于编译PostGIS,但我们在使用编译时发现问题要少得多 GCC
。
GNU Make( GMake
或 制作
)。对于许多系统,GNU 制作
是Make的默认版本。通过调用以下命令检查版本 Make-V
。其他版本的 制作
可能不会处理PostGIS 生成文件
恰到好处。
项目重投影库。要求项目4.9或以上。Proj库用于在PostGIS中提供坐标重投影支持。可从以下地址下载项目 https://proj.org/ 。
GEOS几何库,3.6版或更高版本,但需要GEOS 3.9+才能充分利用所有新功能和特性。可从以下地址下载GEOS http://trac.osgeo.org/geos/ 。
LibXML2,2.5.x版或更高版本。LibXML2目前用于一些导入函数(ST_GeomFromGML和ST_GeomFromKML)。LibXML2可从以下地址下载 http://xmlsoft.org/downloads.html 。
JSON-C,0.9版或更高版本。JSON-C目前用于通过函数ST_GeomFromGeoJson导入GeoJSON。JSON-C可从以下地址下载 https://github.com/json-c/json-c/releases/ 。
需要GDAL版本2+,最好是3+版本。这是栅格支持所必需的。 http://trac.osgeo.org/gdal/wiki/DownloadSource 。
如果使用PostgreSQL+JIT编译,则为LLVM版本 > =6是必填项 https://trac.osgeo.org/postgis/ticket/4125 。
可选
GDAL(伪可选)只有当您不想要栅格时,才可以省略它。此外,请确保启用要使用的驱动程序,如中所述 Section 3.2, “配置栅格支持” 。
Gtk(需要gtk+2.0、2.8+)来编译shp2pgsql-gui图形文件加载器。 http://www.gtk.org/ 。
建议使用SFCGAL 1.3.1(或更高版本)、1.4.0或更高版本。SFCGAL可用于为PostGIS cf提供额外的2D和3D高级分析功能 Section 8.20, “SFCGAL函数” 。还允许将SFCGAL而不是GEOS用于由两个后端提供的一些2D函数(例如,ST_Interaction或ST_Area)。一个PostgreSQL配置变量 postgis.backend
如果安装了SFCGAL(默认情况下是GEOS),允许最终用户控制他想要使用的后端。注意:SFCGAL 1.2至少需要CGAL 4.3和Boost 1.54(参见: https://oslandia.gitlab.io/SFCGAL/dev.html ) https://gitlab.com/Oslandia/SFCGAL/ 。
为了建造 Section 14.1, “地址标准器” 您还需要PCRE http://www.pcre.org (它通常已经安装在NIX系统上)。 正则表达式::装配
Perl CPAN包仅在您想要重建在 Parseaddress-stcities.h
。 Section 14.1, “地址标准器” 如果它检测到PCRE库,或者您传入了有效的 --with-pcre-dir=/Path/to/pcre
在配置过程中。
要启用ST_AsMVT Protobuf-c库1.1.0或更高版本(用于使用)和proc-c编译器(用于构建)。此外,需要使用pkg-config来验证正确的最低版本的probuf-c。看见 Protobuf-c 。默认情况下,Postgis将使用Wagyu更快地验证MVT多边形,这需要C++11编译器。它将使用CXXFLAGS和与PostgreSQL安装相同的编译器。要禁用此功能并改用GEOS,请使用 --无和酒
在配置步骤期间。
CUnit( CUnit
)。这是回归测试所必需的。 http://cunit.sourceforge.net/
DocBook( Xsltproc
)是构建文档所必需的。Docbook可从 http://www.docbook.org/ 。
DBLatex( Dblatex
)是构建PDF格式文档所必需的。DBLatex可从以下网址获得 http://dblatex.sourceforge.net/ 。
ImageMagick( 转换
)才能生成文档中使用的图像。ImageMagick可从 http://www.imagemagick.org/ 。
与大多数Linux安装一样,第一步是生成将用于构建源代码的Makefile。这是通过运行外壳脚本来完成的
./configure
在没有附加参数的情况下,该命令将尝试自动定位在您的系统上构建PostGIS源代码所需的组件和库。尽管这是最常见的 ./配置 对于那些在非标准位置拥有所需的库和程序的用户,该脚本接受几个参数。
以下列表仅显示最常用的参数。有关完整列表,请使用 --救命 或 --帮助=简短 参数。
从PostGIS 3.0开始,默认生成的库文件将不再将次要版本作为文件名的一部分。这意味着所有的PostGIS 3库都将以 Postgis-3
。这样做是为了使PG_Upgrade更容易,缺点是您只能在服务器上安装一个版本的PostGIS3系列。要获取包括次要版本的文件的旧行为:例如 Postgis-3.0
将此开关添加到您的配置语句中。
这是将安装PostGIS加载器可执行文件和共享库的位置。默认情况下,此位置与检测到的PostgreSQL安装位置相同。
![]() | |
此参数当前无效,因为该程序包将仅安装到PostgreSQL安装目录中。参观 http://trac.osgeo.org/postgis/ticket/635 来追踪这个窃听器。 |
PostgreSQL提供了一个名为 pg_config 以使像PostGIS这样的扩展能够找到PostgreSQL安装目录。使用此参数( --with-pgCONFIG=/路径/至/PG_CONFIG )以手动指定特定的PostgreSQL安装,PostGIS将基于该安装进行构建。
GDAL是必需库,提供栅格支持所需的功能 Gdal-配置 以使软件安装能够找到GDAL安装目录。使用此参数( --with-gdalconfig=/路径/至/gdal-config 手动指定一个特定的GDAL安装,PostGIS将基于该安装进行构建。
GEOS是必需的几何库,它提供了一个名为的实用程序 GEOS-配置 以使软件安装能够找到GEOS安装目录。使用此参数( --with-geosconfig=/路径/至/geos-config 手动指定特定的GEOS安装,PostGIS将基于该安装进行构建。
LibXML是执行GeomFromKML/GML过程所需的库。如果您已安装libxml,则通常会找到它,但如果未安装或想要使用特定版本,则需要将PostGIS指向特定的 XML2-配置
配置文件,使软件安装能够找到LibXML安装目录。使用此参数(
>--with-xml2config=/Path/to/xml2-config 手动指定特定的LibXML安装,PostGIS将基于该安装进行构建。
Proj是PostGIS所需的重投影库。使用此参数( --with-projdir=/路径/至/projdir )手动指定特定的项目安装目录,PostGIS将根据该目录进行构建。
安装图标v的目录。
JSON-C 是PostGIS ST_GeomFromJSON支持所需的麻省理工学院许可的JSON库。使用此参数( --with-jsondir=/Path/to/jsondir )来手动指定特定的JSON-C安装目录,PostGIS将根据该目录进行构建。
PCRE 是ADDRESS_STANDAREZER扩展所需的BSD许可的Perl兼容正则表达式库。使用此参数( --with-pcredir=/路径/至/pcredir )手动指定特定的PCRE安装目录,PostGIS将根据该目录进行构建。
编译数据导入图形用户界面(需要GTK+2.0)。这将创建shp2pgsql-gui到shp2pgsql的图形界面。
在没有栅格支持的情况下编译。
禁用拓扑支持。没有相应的库,因为拓扑所需的所有逻辑都在postgis中- 3.3.0dev 类库。
默认情况下,PostGIS将尝试检测GetText支持并使用它进行编译,但是如果遇到导致加载程序损坏的不兼容问题,可以使用此命令完全禁用它。请参阅票证 http://trac.osgeo.org/postgis/ticket/748 对于通过使用此配置解决的问题的示例。注意:关闭此功能不会错过太多内容。它用于对图形用户界面加载器的国际帮助/标签支持,该加载器尚未形成文档,仍处于实验阶段。
默认情况下,如果没有此开关,PostGIS将不会安装sfcga支持。 PATH
是一个可选参数,它允许指定sfcga-config的替代路径。
禁用更新postgis_revision.h以匹配git存储库的当前头。
![]() | |
如果您是从 代码库 ,第一步是真正运行脚本 ./autogen.sh 此脚本将生成 配置 脚本,而该脚本又用于定制PostGIS的安装。 如果您以tarball的形式获取了PostGIS,运行 ./Autogen.sh 不是必需的,因为 配置 已经生成了。 |
生成Makefile后,构建PostGIS就像运行
make
输出的最后一行应该是“ 邮政地理信息系统建设成功。已准备好安装。
“
从PostGISv1.4.0开始,所有函数都有从文档生成的注释。如果您希望稍后将这些注释安装到空间数据库中,请运行需要docbook的命令。Postgis_Comments.sql和其他包注释文件raster_Comments.sql、topology_Comments.sql也打包在文档文件夹中的tar.gz分发包中,因此如果从tar ball安装,则不需要做任何注释。注释也是创建扩展安装的一部分。
发表评论
在PostGIS 2.0中引入。这将生成适合快速参考或学生讲义的html作弊单。这需要xsltproc来构建,并将在文档文件夹中生成4个文件 topology_cheatsheet.html
, tiger_geocoder_cheatsheet.html
, raster_cheatsheet.html
, postgis_cheatsheet.html
您可以从以下地址下载一些预构建的文档:html和pdf PostGIS/PostgreSQL学习指南
制作小抄
如果您使用的是PostgreSQL 9.1+,则会自动构建和安装PostGIS扩展。
如果您是从源代码库构建,则需要首先构建函数描述。如果您安装了Docbook,就会构建这些文档。您还可以使用以下语句手动构建:
发表评论
如果您是从发布焦油球构建的,那么构建注释是不必要的,因为它们已经与tar球一起打包好了。
这些扩展应该作为Make Install过程的一部分自动构建。如果需要,您可以从扩展文件夹进行构建,或者在不同的服务器上复制需要的文件。
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和PostgreSQL的扩展文件总是相同的,所以只要您的服务器上已经安装了PostGIS二进制文件,就可以将扩展文件从一个操作系统复制到另一个操作系统。
如果要在不同于开发的单独服务器上手动安装扩展模块,则需要将以下文件从扩展文件夹复制到 PostgreSQL/共享/扩展
您的PostgreSQL安装的文件夹,以及常规PostGIS所需的二进制文件(如果服务器上还没有它们的话)。
这些是控制文件,表示要安装的扩展的版本等信息(如果未指定)。 Postgis.control、postgis_topology.control
。
每个扩展名的/SQL文件夹中的所有文件。请注意,需要将这些文件复制到PostgreSQL共享/扩展文件夹的根目录 extensions/postgis/sql/*.sql
, extensions/postgis_topology/sql/*.sql
一旦你这样做了,你应该会看到 PostGIS
, postgis_topology
作为PgAdmin->扩展中的可用扩展。
如果您使用的是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.3.0dev | 3.3.0dev address_standardizer_data_us | 3.3.0dev | 3.3.0dev postgis | 3.3.0dev | 3.3.0dev postgis_raster | 3.3.0dev | 3.3.0dev postgis_sfcgal | 3.3.0dev | postgis_tiger_geocoder | 3.3.0dev | 3.3.0dev postgis_topology | 3.3.0dev | (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.3.0dev 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.3.0dev Schema | tiger Description | PostGIS tiger geocoder and reverse geocoder -[ RECORD 4 ]------------------------------------------------- Name | postgis_topology Version | 3.3.0dev Schema | topology Description | PostGIS topology spatial types and functions
![]() | |
扩展表 |
如果您安装了 3.3.0dev ,在不使用我们出色的扩展系统的情况下,您可以通过运行以下命令将函数打包到各自的扩展中,从而将其更改为基于扩展的。安装使用 `unpackaged` 已在PostgreSQL 13中删除,因此建议您在升级到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构建,请运行
勾选
上面的命令将使用生成的库对实际的PostgreSQL数据库运行各种检查和回归测试。
![]() | |
如果使用非标准的PostgreSQL、GEOS或Proj位置配置了PostGIS,则可能需要将它们的库位置添加到 |
![]() | |
目前, 勾选 依赖于 |
如果成功,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
和 address_standardizer
扩展,目前只支持标准的PostgreSQL安装检查。要测试这些功能,请使用以下代码。注意:如果您已经在PostGIS代码文件夹的根目录下进行了安装,则不需要进行Make Install。
对于ADDRESS_STANDIZER:
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扩展。如果您构建的postgis支持ADDRESS_STANDIZER,则ADDRESS_STANDAREZER测试也会生效:
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,请输入
制造安装
这会将PostGIS安装文件复制到由指定的相应子目录中 --前缀 配置参数。特别是:
加载器和转储程序二进制文件安装在 [前缀]/bin
。
SQL文件,如 postgis.sql
、安装在 [前缀]/Share/Conrib
。
PostGIS库安装在 [前缀]/lib
。
如果您以前运行过 发表评论 命令来生成 postgis_comments.sql
, raster_comments.sql
文件中,通过运行以下命令安装SQL文件
发表评论-安装
![]() | |
|
这个 address_standardizer
扩展曾经是一个单独的包,需要单独下载。从PostGIS2.2开始,它现在被捆绑在一起。有关ADDRESS_STANDARIZE、它的作用以及如何根据您的需要进行配置的详细信息,请参阅 Section 14.1, “地址标准器” 。
此标准化程序可与PostGIS打包的Tiger地理编码器扩展模块配合使用,以替代 Normalize_Address 讨论过。要用作替代,请参阅 Section 2.4.3, “将地址标准化扩展与Tiger地理编码器结合使用” 。您还可以使用它作为您自己的地理编码器的构建块,或者使用它来标准化您的地址,以便更容易地比较地址。
地址标准化程序依赖于PCRE,它通常已经安装在许多NIX系统上,但您可以在以下位置下载最新版本: http://www.pcre.org 。如果在此期间 Section 2.2.3, “生成配置” ,则将自动构建地址标准化扩展。如果您有想要使用的自定义PCRE安装,请转到配置 --with-pcredir=/PATH/TO/PCRE
哪里 /Path/to/pcre
是您的PCRE Include和lib目录的根文件夹。
对于Windows用户,PostGIS 2.1+捆绑包已打包为ADDRESS_STANDAREZER,因此无需编译即可直接转到 创建扩展名
一步。
安装后,您可以连接到数据库并运行SQL:
创建扩展地址_标准化器;
以下测试不需要规则、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
Perl Regex:编译ADDRESS_STANDAREZER扩展不再需要ASSEMBLE,因为它生成的文件是源代码树的一部分。但是,如果您需要编辑 Usps-st-city-orig.txt
或 Usps-st-City-Orig.txt usps-st-City-adds.tx
,你需要重建 Parseaddress-stcities.h
这确实需要Regex:组装。
CPAN Regexp::汇编
或者,如果您使用的是Ubuntu/Debian,您可能需要这样做
Sudo Perl-MCPAN-e“Install Regexp::ASSEMBLE”
在您的PostGIS发行版中可能不会打包额外的组件,如Tiger GeoCoder。如果您缺少Tiger地理编码器扩展模块,或者想要一个比您安装的版本更新的版本,请使用 share/extension/postgis_tiger_geocoder.*
中的包中的文件 Windows未发布版本 部分,用于您的PostgreSQL版本。虽然这些包是针对Windows的,但是postgis_Tiger_Geocoder扩展文件可以在任何操作系统上运行,因为该扩展只是一个SQL/plpgsql扩展。
如果您使用的是PostgreSQL9.1+和PostGIS2.1+,您可以利用新的扩展模型来安装Tiger Geocoder。要执行此操作,请执行以下操作:
首先获取用于PostGIS2.1+的二进制文件,或者像往常一样编译和安装。这应该也会为Tiger地理编码器安装必要的扩展文件。
通过psql或pgAdmin或其他工具连接到您的数据库,并运行以下SQL命令。请注意,如果您要在已安装了postgis的数据库中进行安装,则不需要执行第一步。如果你有 模糊匹配
扩展已经安装,您也不需要执行第二步。
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
表中包含可执行文件和服务器的路径。
例如,要创建一个名为Debbie的配置文件,如下所示 SH
这是惯例。您会这样做:
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、解压缩、shp2pgsql、psql等路径位置的位置。
如果你不编辑这个 loader_platform
表中,它将只包含项目的常见案例位置,并且您必须在生成脚本后编辑生成的脚本。
从PostGIS 2.4.1开始,邮政编码-5位数字制表区域 Zcta5
已修改加载步骤以加载当前的zcta5数据,该步骤是 Loader_Generate_Nation_Script 启用时。默认情况下,它被关闭,因为它需要相当长的加载时间(20到60分钟),占用相当多的磁盘空间,并且不经常使用。
要启用它,请执行以下操作:
UPDATE tiger.loader_lookupables set Load=true where table_name=‘zcta510’;
如果存在,则 地理编码 函数可以使用它,如果添加了边界过滤器以将其限制为仅在该边界内压缩。这个 Reverse_Geocode 如果返回的地址缺少邮政编码,函数会使用它,这在高速公路反向地理编码中经常发生。
创建一个名为 地理数据
在服务器的根目录或您的本地PC上(如果您有到服务器的快速网络连接)。该文件夹是Tiger文件下载和处理的位置。如果您不满意将文件夹放在服务器的根目录下,或者只是想切换到其他文件夹进行转移,请编辑该字段 staging_fold
在 tiger.loader_variables
桌子。
在中创建一个名为Temp的文件夹 地理数据
文件夹或您指定的 staging_fold
成为。这将是加载器提取下载的Tiger数据的文件夹。
然后运行 Loader_Generate_Nation_Script SQL函数确保使用您的自定义配置文件的名称,并将脚本复制到.sh或.bat文件。因此,举例来说,要建立国家负载:
Psql-c“SELECT Loader_GENERATE_Nation_SCRIPT(‘Debbie’)”-d地理编码器-Ta >/gisdata/National_SCRIPT_load.sh
运行生成的National Load命令行脚本。
cd /gisdata sh nation_script_load.sh
在完成国家脚本的运行之后,您的 tiger_data
架构,并且它们应该用数据填充。通过从psql或pgAdmin执行以下查询来确认
SELECT count(*) FROM tiger_data.county_all;
count ------- 3233 (1 row)
SELECT count(*) FROM tiger_data.state_all;
count ------- 56 (1 row)
默认情况下,与 BG
, 道
, 选项卡块
都没有装填。这些表不被地理编码员使用,但被人们用于人口统计。如果希望将它们作为状态加载的一部分进行加载,请运行以下语句以启用它们。
UPDATE tiger.loader_lookupables set LOAD=TRUE WHERE LOAD=FALSE AND LOOKUP_NAME IN(‘TRACE’,‘BG’,‘TABBLOCK’);
或者,也可以在加载状态数据后使用 Loader_Generate_Census_Script
对于要加载数据的每个州,生成一个状态脚本 Loader_Generate_Script 。
![]() | |
在加载国家数据之前,不要生成州脚本,因为州脚本使用由国家脚本加载的县列表。 |
Psql-c“选择加载器生成脚本(数组[‘MA’],‘Debbie’)”-d地理编码器-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.zip_lookup_base; vacuum (analyze, verbose) tiger.zip_state; vacuum (analyze, verbose) tiger.zip_state_loc;
如果您安装了Tiger地理编码器而不使用扩展模型,则可以按如下方式转换为扩展模型:
按照中的说明操作 Section 2.4.5, “升级您的Tiger地理编码器安装” 用于非扩展型号升级。
使用psql或pgAdmin连接到您的数据库,并运行以下命令:
从解包创建扩展postgis_Tiger_Geocoder;
首先按照前面的说明安装PostGIS。
如果您没有附加文件夹,请下载 http://postgis.net/stuff/postgis-3.3.0dev.tar.gz
TAR xvfz postgis- 3.3.0dev .tar.gz
CD Postgis- 3.3.0dev /extras/tiger_geocoder
编辑 tiger_loader_2015.sql
(或您找到的最新加载程序文件,除非您想加载不同的年份)到您的可执行文件服务器的路径等,或者您也可以更新 loader_platform
表一旦安装。如果您不编辑此文件或 loader_platform
表中,它将只包含项的常见用例位置,并且您必须在运行 Loader_Generate_Nation_Script 和 Loader_Generate_Script SQL函数。
如果您是第一次安装Tiger Geocoder,请编辑 create_geocode.bat
如果您使用的是Windows或 create_geocode.sh
如果您在Linux/Unix/Mac OSX上使用您的PostgreSQL特定设置,并从命令行运行相应的脚本。
验证您现在是否拥有 老虎
模式,并且它是数据库Search_PATH的一部分。如果不是,则使用以下行的命令添加它:
ALTER DATABASE geocoder SET search_path=public, tiger;
标准化地址功能或多或少地在没有任何数据的情况下工作,除了棘手的地址。运行此测试并验证情况如下:
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
人们抱怨的众多问题之一是地址归一化功能 Normalize_Address 在进行地理编码之前对地址进行标准化以进行准备的功能。规格化器远不是完美的,试图修补其不完美需要大量的资源。因此,我们已经与另一个具有更好的地址标准化引擎的项目进行了集成。要使用这个新的ADDRESS_STANDAREZER,请按照中所述编译扩展 Section 2.3, “安装和使用地址标准化程序” 并作为扩展安装在您的数据库中。
在已安装的数据库中安装此扩展模块后 postgis_tiger_geocoder
,然后 Pagc_Normalize_Address 可以用来代替 Normalize_Address 。该扩展与Tiger无关,因此可以与其他数据源一起使用,例如国际地址。Tiger地理编码器扩展模块与其自己的自定义版本打包在一起 规则表 ( tiger.pagc_rules
)、 GAZ表 ( tiger.pagc_gaz
),以及 Lex表 ( tiger.pagc_lex
)。您可以添加和更新这些,以改善您的标准化体验,以满足您自己的需求。
加载数据的说明以更详细的形式在 extras/tiger_geocoder/tiger_2011/README
。这只包括一般步骤。
加载过程从人口普查网站下载所请求的各个国家文件、州的数据,提取文件,然后将每个州加载到其自己的一组单独的州表中。每个状态表继承自中定义的表 老虎
模式,因此只需查询这些表即可访问所有数据,并在任何时候使用 Drop_State_Tables_Generate_Script 如果您需要重新加载状态,或者只是不再需要状态。
为了能够加载数据,您需要以下工具:
一个从人口普查网站解压压缩文件的工具。
对于类Unix系统: 解压缩
通常已经安装在大多数类Unix平台上的可执行文件。
Windows 7-Zip,这是一个免费的压缩/解压缩工具,您可以从 http://www.7-zip.org/
shp2pgsql
默认情况下在安装PostGIS时安装的命令行。
WGET
这是一种通常安装在大多数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 这是升级(从2010年起)和新安装时应该完成的一次性步骤。
要加载状态数据,请参阅 Loader_Generate_Script 为您的平台生成所需状态的数据加载脚本。请注意,您可以逐个安装这些组件。您不必一次加载您想要的所有状态。您可以在需要时加载它们。
加载所需的状态后,请确保运行:
选择INSTALL_MISSING_INDEX();
如中所述 Install_Missing_Indexes 。
要测试是否正常运行,请尝试使用以下命令对您所在州的地址运行地理编码 地理编码
如果你已经安装了2.0+的Tiger Geocode包,你可以在任何时候升级功能,即使是从临时的焦油球,如果有你迫切需要的修复程序。这将仅适用于未安装扩展的Tiger Geocoder。
如果您没有附加文件夹,请下载 http://postgis.net/stuff/postgis-3.3.0dev.tar.gz
TAR xvfz postgis- 3.3.0dev .tar.gz
CD Postgis- 3.3.0dev /extras/tiger_geocoder/tiger_2011
找到 upgrade_geocoder.bat
如果您使用的是Windows或 upgrade_geocoder.sh
如果您使用的是Linux/Unix/Mac OSX。编辑该文件以拥有您的Postgis数据库凭据。
如果要从2010或2011升级,请确保取消对加载器脚本行的注释,以便获得用于加载2012年数据的最新脚本。
然后从命令行运行相应的脚本。
接下来,删除所有的国家表并加载新的表。使用此SQL语句生成删除脚本,详细信息请参见 Drop_Nation_Tables_Generate_Script
SELECT drop_nation_tables_generate_script();
运行生成的DROP SQL语句。
使用此SELECT语句生成国家加载脚本,详细信息请参见 Loader_Generate_Nation_Script
对于Windows
SELECT loader_generate_nation_script('windows');
适用于Unix/Linux
SELECT loader_generate_nation_script('sh');
请参阅 Section 2.4.4, “正在加载TIGER数据” 以获取有关如何运行生成脚本的说明。这只需要做一次。
![]() | |
您可以混合使用2010/2011州表,并且可以分别升级每个州。在将一个州升级到2011年之前,首先需要使用以下命令删除该州的2010个表 Drop_State_Tables_Generate_Script 。 |
当您的安装或升级没有按照预期进行时,有几点需要检查。
检查您是否已安装PostgreSQL 11 或更高版本,并且您正在使用与正在运行的PostgreSQL版本相同的PostgreSQL源代码版本进行编译。当您的(Linux)发行版已经安装了PostgreSQL,或者您以前安装了PostgreSQL但忘记了它时,可能会发生混淆。PostGIS将仅与PostgreSQL配合使用 11 或者,如果您使用较旧的版本,则会出现更新的、奇怪的、意外的错误消息。要检查正在运行的PostgreSQL的版本,请使用psql连接到数据库并运行以下查询:
SELECT version();
如果您运行的是基于RPM的发行版,则可以使用 转速 命令如下: Rpm-qa|grep PostgreSQL
如果升级失败,请确保正在还原到已安装了PostGIS的数据库。
SELECT postgis_full_version();
还要检查Configure是否正确检测到了PostgreSQL、Proj库和GEOS库的位置和版本。
CONFigure的输出用于生成 postgis_config.h
文件。检查是否有 POSTGIS_PGSQL_VERSION
, POSTGIS_PROJ_VERSION
和 POSTGIS_GEOS_VERSION
变量已正确设置。
针对PostGIS性能进行的调优与针对任何PostgreSQL工作负载进行的调优非常相似。唯一需要注意的是,几何图形和栅格通常都很大,因此与内存相关的优化通常比其他类型的PostgreSQL查询对PostGIS的影响更大。
有关优化PostgreSQL的一般详细信息,请参阅 调整您的PostgreSQL服务器 。
对于PostgreSQL 9.4+,无需接触即可在服务器级别设置配置 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 8.23, “大统一自定义变量(GUC)” 。
这些设置在中配置 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,但开发人员很少:
将work_mem设置为‘256MB’;
maintenance_work_mem -真空、创建索引等使用的内存大小。
默认:16-64MB
通常过低-占用I/O,在交换内存时锁定对象
建议在具有大量RAM的生产服务器上使用32MB到1 GB,但这取决于并发用户数。如果您有大量的RAM,但开发人员很少:
将Maintenance_Work_mem设置为‘1 GB’;
max_parallel_workers_per_gather
此设置仅适用于PostgreSQL 9.6+,并且只会影响PostGIS 2.3+,因为只有PostGIS 2.3+支持并行查询。如果设置为大于0,则某些查询(如涉及关系函数的查询)如下 ST_Intersects
可以使用多个进程,并且运行速度是多个进程的两倍以上。如果您有很多处理器可供备用,则应该将此值更改为您所拥有的处理器数量。也要确保你的身体健康 max_worker_processes
至少和这个数字一样高。
默认值:0
设置一台计算机可以启动的最大工作进程数 聚集在一起
节点。并行工作进程是从 max_worker_processes
。请注意,所请求的工作进程数在运行时可能实际上不可用。如果发生这种情况,该计划运行时的员工人数将少于预期,这可能会降低效率。将此值设置为0(默认值)将禁用并行查询执行。
如果您启用了栅格支持,您可能希望阅读下面的如何正确配置它。
从PostGIS 2.1.3开始,默认情况下禁用数据库外栅格和所有栅格驱动程序。要重新启用这些环境变量,您需要设置以下环境变量 POSTGIS_GDAL_ENABLED_DRIVERS
和 POSTGIS_ENABLE_OUTDB_RASTERS
在服务器环境中。对于PostGIS 2.2,您可以使用更具跨平台的方法来设置相应的 Section 8.23, “大统一自定义变量(GUC)” 。
如果要启用脱机栅格,请执行以下操作:
POSTGIS_ENABLE_OUTDB_RASTERS=1
任何其他设置或根本没有设置都将禁用数据库栅格。
要启用GDAL安装中可用的所有GDAL驱动程序,请按如下方式设置此环境变量
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
如果只想启用特定驱动程序,请按如下方式设置环境变量:
POSTGIS_GDAL_ENABLED_DRIVERS=“GTiff PNG JPEG GIF XYZ”
![]() | |
如果您使用的是Windows,请不要引用驱动程序列表 |
环境变量的设置因操作系统而异。对于通过apt-postgreSQL安装在Ubuntu或Debian上的PostgreSQL,首选方式是编辑 /ETC/PostgreSQL/
其中,10表示PostgreSQL的版本,main表示集群。 10
/ 主干道
/环境
在Windows上,如果你是作为一项服务运行的,你可以通过系统变量来设置在Windows 7中,你可以通过右击Computer- > 属性高级系统设置或在资源管理器中导航到 控制面板\所有控制面板项目\系统
。然后点击 高级系统设置- > 高级->环境变量 以及添加新的系统变量。
设置环境变量后,需要重新启动PostgreSQL服务才能使更改生效。
如果您使用的是PostgreSQL9.1+,并且已经编译和安装了扩展/postgis模块,则可以使用扩展机制将数据库转换为空间数据库。
核心的Postgis扩展包括几何、地理、空间参考系统以及所有的函数和注释。栅格和拓扑被打包为单独的扩展。
在要在空间上启用的数据库中运行以下SQL代码片段:
CREATE EXTENSION IF NOT EXISTS plpgsql; CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; -- OPTIONAL CREATE EXTENSION postgis_topology; -- OPTIONAL
![]() | |
通常只有当您不能或不想在PostgreSQL扩展目录中安装PostGIS时(例如,在测试、开发期间或在受限环境中),才需要这样做。 |
将PostGIS对象和函数定义添加到数据库中的方法是加载位于 [前缀]/Share/Conrib
如在构建阶段指定的。
核心PostGIS对象(几何和地理类型及其支持函数)位于 postgis.sql
剧本。栅格对象位于 rtpostgis.sql
剧本。拓扑对象位于 topology.sql
剧本。
对于一组完整的EPSG坐标系定义标识符,还可以将 spatial_ref_sys.sql
定义文件并填充 spatial_ref_sys
桌子。这将允许您对几何体执行ST_Transform()操作。
如果您想要向PostGIS函数添加注释,可以在 postgis_comments.sql
剧本。只需输入以下内容即可查看评论 \DD[函数名] 从一个 PSQL 终端窗口。
在您的终端中运行以下外壳命令:
DB=[yourdatabase] SCRIPTSDIR=`pg_config --sharedir`/contrib/postgis-3.2/ # 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的Win32安装程序 > =1.1.5)将PostGIS函数加载到名为 template_postgis
。如果 template_postgis
数据库存在于您的PostgreSQL安装中,则用户和/或应用程序可以使用单个命令创建空间启用的数据库。请注意,在这两种情况下,数据库用户都必须被授予创建新数据库的权限。
从外壳中:
#createdb-T模板_postgis我的空间数据库
来自SQL:
Postgres=#CREATE DATABASE MY_SPATIAL_DBTEMPLATE=TEMPLATE_POSTGIS
升级现有的空间数据库可能很棘手,因为它需要替换或引入新的PostGIS对象定义。
遗憾的是,并不是所有的定义都可以在实时数据库中轻松替换,所以有时您最好的选择是转储/重新加载过程。
PostGIS为次要或错误修复版本提供了软升级过程,为主要版本提供了硬升级过程。
在尝试升级PostGIS之前,备份您的数据总是值得的。如果您使用-fc标志来pg_ump,您将始终能够通过硬升级恢复转储。
如果您使用扩展安装数据库,则还需要使用扩展模型进行升级。如果您使用旧的SQL脚本方式安装,建议您将安装切换到扩展,因为脚本方式不再受支持。
如果您最初安装的是带有扩展的PostGIS,那么您也需要使用扩展进行升级。用扩展进行一个小的升级是相当容易的。
如果您运行的是PostGIS3或更高版本,则应使用 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.3.0dev"; ALTER EXTENSION postgis_topology UPDATE TO "3.3.0dev";
如果收到类似以下内容的错误通知:
没有为…定义迁移路径至 3.3.0dev
然后,您需要备份数据库,创建一个新的数据库,如中所述 Section 3.3.1, “使用扩展在空间上启用数据库” 然后在这个新数据库上恢复备份。
如果您收到如下通知消息:
版本“ 3.3.0dev 已安装扩展模块“postgis”的
那么一切都已经是最新的,您可以放心地忽略它。 UNLESS 您正在尝试从开发版本升级到下一个版本(没有获得新的版本号);在这种情况下,您可以在版本字符串后附加“Next”,下一次您将需要再次删除“Next”后缀:
ALTER EXTENSION postgis UPDATE TO "3.3.0devnext"; ALTER EXTENSION postgis_topology UPDATE TO "3.3.0devnext";
![]() | |
如果最初安装的PostGIS没有指定版本,则在恢复之前通常可以跳过重新安装postgis扩展模块,因为备份刚刚 |
![]() | |
如果要从3.0.0之前的版本升级PostGIS扩展模块,您将拥有一个新的扩展模块 postgis_raster 如果您不需要栅格支持,则可以安全地将其删除。您可以按如下方式删除: 删除扩展postgis_raster; |
本节仅适用于安装了未使用扩展的PostGIS的用户。如果您有扩展并尝试使用此方法进行升级,您将收到如下消息:
无法丢弃…因为postgis扩展依赖于它。
注意:如果要从PostGIS 1.*迁移到PostGIS 2.*或从PostGIS 2.*迁移到r7409之前的版本,则不能使用此过程,而是需要执行 硬升级 。
在编译和安装(Make Install)之后,您应该会找到一组 *_upgrade.sql
安装文件夹中的文件。您可以使用以下命令将它们全部列出:
LS `pg_config --sharedir` /conrib/postgis- 3.3.0dev /*_upgrade.sql
依次加载它们,从 postgis_upgrade.sql
。
Psql-f postgis_upgrade.sql-d您的空间数据库
同样的过程也适用于栅格、拓扑和sfcga扩展模块,升级文件的名称为 rtpostgis_upgrade.sql
, topology_upgrade.sql
和 sfcgal_upgrade.sql
分别为。如果需要,请执行以下操作:
Psql-f rtpostgis_upgrade.sql-d您的空间数据库
Psql-f topology_upgrade.sql-d您的空间数据库
Psql-f sfcga_upgrade.sql-d您的空间数据库
建议您通过运行以下命令切换到基于扩展的安装
Psql-c“选择postgis_扩展_升级();”
![]() | |
如果您找不到 |
这个 PostGIS_Full_Version 函数应使用“PROCS Need Upgrade”消息通知您是否需要运行此类升级。
我们所说的硬升级是指完全转储/重新加载启用了postgis的数据库。当PostGIS对象的内部存储发生变化或无法进行软升级时,您需要进行硬升级。这个 发行说明 附录报告了每个版本是否需要转储/重新加载(硬升级)才能升级。
转储/重新加载过程得到postgis_Restore.pl脚本的帮助,该脚本负责从转储跳过属于PostGIS(包括旧定义)的所有定义,允许您将模式和数据恢复到安装了PostGIS的数据库中,而不会出现重复的符号错误或转发不推荐使用的对象。
有关Windows用户的补充说明,请访问 Windows硬件升级 。
具体步骤如下:
为您想要升级的数据库创建一个“定制格式”的转储文件(我们称之为 老古董
)包括二进制斑点(-b)和详细(-v)输出。用户可以是数据库的所有者,不需要是postgres超级帐户。
Pg_ump-h本地主机-p 5432-U postgres-fc-b-v-f“/Somepath/olddb.backup”olddb
在新数据库中全新安装PostGIS--我们将该数据库称为 Newdb
。请参阅 Section 3.3.2, “在不使用扩展的情况下在空间上启用数据库(不鼓励)” 和 Section 3.3.1, “使用扩展在空间上启用数据库” 获取有关如何执行此操作的说明。
将恢复在转储中找到的SPATIAL_REF_SYS条目,但不会覆盖SPATIAL_REF_SYS中的现有条目。这是为了确保官方集中的修复将被正确地传播到恢复的数据库。如果出于任何原因,您确实希望覆盖自己的标准条目,那么在创建新的数据库时,不要加载spatial_ref_sys.sql文件。
如果您的数据库真的很旧,或者您知道您在视图和函数中使用了长期不推荐使用的函数,则可能需要加载 legacy.sql
以便您的所有函数和视图等都能正常恢复。只有在真的需要时才这样做。如果可能的话,在转储之前考虑升级您的视图和功能。不推荐使用的函数稍后可以通过加载 uninstall_legacy.sql
。
将您的备份恢复到新的 Newdb
使用postgis_Restore.pl的数据库。意外错误(如果有)将由psql打印到标准错误流中。把这些都记下来。
Perl utils/postgis_Restore.pl“/Somepath/olddb.backup”|psql-h本地主机-p 5432-U postgres newdb 2 >errors.txt
在以下情况下可能会出现错误:
您的一些视图或函数使用了不推荐使用的PostGIS对象。要修复此问题,您可以尝试加载 legacy.sql
在恢复之前编写脚本,否则您将不得不恢复到仍然包含这些对象的PostGIS版本,并在移植代码后再次尝试迁移。如果 legacy.sql
方法适用于您,不要忘记修复您的代码以停止使用不推荐使用的函数,并停止加载它们 uninstall_legacy.sql
。
转储文件中SPATIAL_REF_SYS的某些自定义记录的SRID值无效。有效的SRID值大于0小于999000。999000.999999范围内的值保留供内部使用,而大于999999的值根本不能使用。具有无效SRID的所有自定义记录都将被保留,那些 >999999的记录将被移入保留范围,但是SPATIAL_REF_SYS表将失去一个检查约束,该约束保护该不变量以及它的主键(当多个无效的SRID被转换为相同的保留SRID值时)。
In order to fix this you should copy your custom SRS to a SRID with a valid value (maybe in the 910000..910999 range), convert all your tables to the new srid (see 更新几何SRID), delete the invalid entry from spatial_ref_sys and re-construct the check(s) with:
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));
If you are upgrading an old database containing french IGN cartography, you will have probably SRIDs out of range and you will see, when importing your database, issues like this :
WARNING: SRID 310642222 converted to 999175 (in reserved zone)
In this case, you can try following steps : first throw out completely the IGN from the sql which is resulting from postgis_restore.pl. So, after having run :
perl utils/postgis_restore.pl "/somepath/olddb.backup" > olddb.sql
run this command :
grep -v IGNF olddb.sql > olddb-without-IGN.sql
Create then your newdb, activate the required Postgis extensions, and insert properly the french system IGN with : this script After these operations, import your data :
Psql-h本地主机-p 5432-U postgres-d newdb-f olddb-less-IGN.sql 2 >errors.txt
开放地理空间联盟(OGC)开发了 简单功能访问 标准(SFA),为地理空间数据提供模型。它定义了的基本空间类型 几何体 以及操作和转换几何值以执行空间分析任务的操作。PostGIS将OGC几何模型实现为PostgreSQL数据类型 几何体 和 地理学 。
几何学是一种 摘要 键入。几何值属于其 混凝土 代表各种类型和尺寸的几何形状的子类型。其中包括 原子性 类型 点 , LineString , LinearRing 和 多边形 ,以及 征集 类型 MultiPoint , MultiLineString , MultiPolygon 和 GeometryCollection 。这个 简单功能访问.第1部分:通用体系结构v1.2.1 为结构添加子类型 PolyhedralSurface , 三角形 和 TIN 。
几何图形在2维笛卡尔平面中对形状建模。多面体曲面、三角形和三角网类型也可以表示三维空间中的形状。形状的大小和位置由其 坐标 。每个坐标都有一个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模型将其称为 信封 。这是包含几何体坐标的二维或三维长方体。它是表示几何图形在坐标空间中的范围以及检查两个几何图形是否相互作用的有效方法。
几何模型允许评估拓扑空间关系,如中所述 Section 5.1.1, “量纲扩展的9交点模型” 。为了支持这一点, 室内 , 边界 和 外部 为每种几何图形类型定义。几何图形在拓扑上是封闭的,因此它们始终包含它们的边界。边界是一个比几何体本身的维度小一的几何体。
OGC几何模型定义了每种几何类型的有效性规则。这些规则确保几何体值表示真实情况(例如,可以指定一个位于壳外部的洞的多边形,但这在几何上没有意义,因此是无效的)。PostGIS还允许存储和操作无效的几何值。这允许在需要时检测和修复它们。看见 Section 4.4, “几何图形验证”
线串是由连续的线段序列形成的一维直线。每条线段由两个点定义,其中一条线段的终点构成下一条线段的起点。OGC有效的线串可以是零个点,也可以是两个或多个点,但PostGIS也允许使用单点线串。线串可以相互交叉(自相交)。线条是 关着的不营业的 如果起点和终点相同。线条是 简单 如果它没有自交的话。
线条(1 2,3 4,5 6)
LinearRing是一种既封闭又简单的线串。第一个点和最后一个点必须相等,并且直线不能自相交。
线性排列(0 0 0,4 0 0,4 4 0,0 4 0,0 0 0)
多边形是由外部边界(壳)和零个或多个内部边界(洞)分隔的二维平面区域。每个边界都是一个 LinearRing 。
多边形((0 0 0,4 0 0,4 4 0,0 40,0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 2 0))
多重多边形是不重叠、不相邻的多边形的集合。集合中的多边形只能在有限数量的点处接触。
MULTIPOLYGON(1 5,5 5,5 1,11,1 5)),((6 5,9 1,6 1,6 5)
多面体曲面是共享某些边的面片或面片的连续集合。每个面片都是一个平面多边形。如果多边形坐标具有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)) )
这个 ISO/IEC 13249-3SQL多媒体-空间 标准(SQL/MM)扩展了OGC SFA以定义包含圆弧曲线的几何子类型。SQL/MM类型支持3DM、3DZ和4D坐标。
![]() | |
SQL-MM实现中的所有浮点比较都按照指定的容差执行,当前为1E-8。 |
CircularString是基本的曲线类型,类似于线性世界中的LineString。单个圆弧段由三个点指定:起点和终点(第一个和第三个)以及圆弧上的某个其他点。要指定闭合圆,起点和终点相同,并且中点是圆直径(即圆弧的中心)上的相反点。在圆弧序列中,前一个圆弧的终点是下一个圆弧的起点,就像线串的线段一样。这意味着CircularString必须具有大于1的奇数个点。
CIRCULARSTRING(0 0, 1 1, 1 0) CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
复合曲线是一条可以同时包含圆弧段和线性段的单条连续曲线。这意味着,除了具有结构良好的组件外,每个组件的终点(最后一个除外)必须与下一个组件的起点重合。
CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1)
CurvePolygon就像一个多边形,有一个外环和零个或多个内环。不同之处在于,环可以是CircularString或CompoundCurve,也可以是线串。
从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,其壳由包含CircularString和LineString的CompoundCurve定义,以及一个孔由CircularString定义
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) )
多重曲线是一组曲线,其中可以包括LineStrings、CircularStrings或CompoundCurve。
MULTICURVE((0 0,5 5),Circularstring(4 0,4 4,8 4))
OGC SFA规范定义了两种用于表示供外部使用的几何值的格式:熟知文本(WKT)和熟知二进制(WKB)。WKT和WKB都包括有关对象类型和定义它的坐标的信息。
熟知文本(WKT)提供了空间数据的标准文本表示。空间对象的WKT表示的示例如下:
点(0 0)
点Z(0 0 0)
ZM点(0 0 0)
点为空
LINESTRING(0,1 1 1 2)
线路设置为空
多边形((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,12,1 1))
多点((0),(1 2))
多点Z((0 0 0),(1 2 3))
多点为空
多行((0,1,1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(0 0,4 0,44,04,0 0),(1,2 1,2 2,12,11)),((-1-1,-1-2,-2-2,-2-1,-1-1))
几何测量选择(点(2 3),直线(2 3,3 4))
几何测量集合为空
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:点(1 1)
WKB:010100000000000000000000F03F000000000000F03
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通过定义名为的PostgreSQL数据类型实现OGC简单要素模型 几何体
。它使用内部类型代码表示所有几何子类型(请参见 GeometryType 和 ST_GeometryType )。这允许将空间要素建模为使用类型为的列定义的表行 几何体
。
这个 几何体
数据类型为 不透明 这意味着所有访问都是通过对几何值调用函数来完成的。函数允许创建几何对象、访问或更新所有内部字段以及计算新的几何值。PostGIS支持OGC中指定的所有功能 简单功能访问.第2部分:SQL选项 (SFS)规范,以及许多其他规范。看见 Chapter 8, 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。这允许通过使用将HEXEWKB或EWKT中的文本值转换为几何值来创建几何值 ::几何图形
。对于输出,二进制的规范形式是EWKB,而文本的规范形式是HEXEWKB(十六进制编码的EWKB)。
例如,此语句通过从EWKT文本值强制转换来创建几何图形,并使用HEXEWKB的规范形式输出该几何图形:
SELECT 'SRID=4;POINT(0 0)'::geometry; geometry ---------------------------------------------------- 01010000200400000000000000000000000000000000000000
PostGIS EWKT输出与OGC WKT有几点不同:
对于3DZ几何图形,省略Z限定符:
OGC:点Z(1 2 3)
EWKT:点(1 2 3)
对于3 DM几何图形,包括M限定符:
OGC:点M(1 2 3)
EWKT:POINTM(1 2 3)
对于4D几何图形,省略ZM限定符:
OGC:点ZM(1 2 3 4)
EWKT:点(1 2 3 4)
EWKT避免过度指定维度和OGC/ISO格式可能出现的不一致,例如:
ZM点(1 1)
ZM点(1 1 1)
点(1 1 1)
![]() | |
PostGIS扩展格式目前是OGC格式的超集,因此每个有效的OGC WKB/WKT也是有效的EWKB/EWKT。然而,如果OGC以与PosGIS定义冲突的方式扩展一种格式,这在未来可能会有所不同。因此,您不应该依赖这种兼容性! |
空间对象的EWKT文本表示的示例如下:
点(0 0 0)--XYZ
SRID=32632;点(0 0)--带SRID的XY
POINTM(00 0)--XYM
点(0 0 0)--XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 21)--带SRID的XYM
多行((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
多边形((0 0 0,4 0 0,4 4 0,0 40,0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 2 0))
MULTIPOLYGON(0 0 0,4 0 0,4 4 0,0 4 0,0 4 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,1 0 0,1 0 1,0 0 1,0 0 0)),(1 1 0,1 1,1 0 1,1 0 0,1 0)),(0 1 0,0 1,1 1,1 0,0 0),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1))
三角形((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几何数据类型的基础是平面。平面上两点之间的最短路径是一条直线。这意味着几何上的函数(面积、距离、长度、交点等)是使用直线向量和笛卡尔数学来计算的。这使得它们更容易实现和更快地执行,但也使它们对地球球面上的数据不准确。
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 以米为单位。
您可以使用创建一个表来存储地理数据 创建表格 具有以下类型列的SQL语句 地理学
。以下样例创建一个表,其中包含存储WGS84大地坐标系(SRID 4326)中的二维线串的地理列:
CREATE TABLE global_points ( id SERIAL PRIMARY KEY, name VARCHAR(64), location geography(POINT,4326) );
地理类型支持两个可选的类型修饰符:
空间类型修饰符限制列中允许的造型和尺寸标注的类型。空间类型允许的值为:POINT、LINESTRING、POLYGON、MULTPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION。地理类型不支持曲线、三角网或多角曲线。修改器通过添加后缀Z、M和ZM来支持坐标维度限制。例如,修饰符‘LINESTRINGM’只允许具有三个维度的线串,并将第三个维度视为测量。同样,‘POINTZM’需要四维(XYZM)数据。
SRID修饰符将空间参考系统SRID限制为特定数字。如果省略,则SRID默认为4326(WGS84大地坐标),并且所有计算都使用WGS84执行。
创建包含地理列的表格的示例:
使用默认SRID 4326(WGS84经度/纬度)创建具有二维点地理位置的表格:
创建表ptgeogwgs(gid序列主键,geog地理(Point));
在NAD83 Longlat中创建包含二维点地理信息的表格:
创建表ptgeognad83(gid序列主键,地理记录地理(point,4269));
创建具有3D(XYZ)点和显式SRID 4326的表:
创建表ptzgeogwgs84(gid序列主键,地理日志地理(POINTZ,4326));
使用默认SRID 4326创建具有二维线列地理位置的表格:
创建表lgeog(gid序列主键,geog地理(LINESTRING));
使用SRID 4267(NAD 1927经度)创建具有2D多边形地理位置的表格:
创建表lgeognad27(GID序列主键,地理日志地理(Polygon,4267));
地理字段在中注册 geography_columns
系统视图。您可以查询 geography_columns
查看并查看该表是否已列出:
SELECT * FROM geography_columns;
创建空间索引与创建几何图形列的工作原理相同。PostGIS将注意到列类型是地理类型,并创建适当的基于球体的索引,而不是通常用于几何图形的平面索引。
-- 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.051.5))到雷克雅未克(点(-21.9664.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时间来执行。
您选择的数据类型应该由您正在构建的应用程序的预期工作区确定。您的数据将覆盖全球或大片大陆地区,还是某个州、县或市的本地数据?
如果您的数据包含在较小的区域中,您可能会发现,就性能和可用的功能而言,选择适当的投影并使用几何体是最佳解决方案。
如果您的数据是全球性的或覆盖大陆地区,您可能会发现地理位置允许您构建一个系统,而不必担心预测细节。您以经度/纬度存储数据,并使用已在地理上定义的函数。
如果您不了解投影,也不想学习它们,并且准备接受地理中可用功能的限制,那么使用地理可能比使用几何更容易。只需将您的数据加载为经度/纬度,然后从那里开始。
请参阅 Section 15.11, “PostGIS Function Support Matrix” 用于比较地理与几何支持的内容。有关地理函数的简短列表和说明,请参阅 Section 15.4, “PostGIS Geography Support Functions”
4.3.4.1. | 你算的是球体还是椭球体? |
默认情况下,所有距离和面积计算都在椭球体上完成。您应该会发现,局部区域的计算结果将与良好的局部投影中的局部平面结果相匹配。在更大的区域上,球面计算将比在投影平面上进行的任何计算更准确。 所有地理函数都可以选择使用球体计算,方法是将最后一个布尔参数设置为‘False’。这将在一定程度上加快计算速度,特别是在几何体非常简单的情况下。 | |
4.3.4.2. | 日期线和电线杆呢? |
所有的计算都没有日期线或极点的概念,坐标是球形的(经度/纬度),所以从计算的角度来看,穿过日期线的形状与任何其他形状没有什么不同。 | |
4.3.4.3. | 你能处理的最长弧线是多少? |
我们使用大圆弧作为两点之间的“插值线”。这意味着任何两个点实际上是以两种方式连接在一起的,这取决于你沿着大圆圈旅行的方向。我们所有的代码都假设这些点是由沿着大圆的两条路径中的较短路径连接的。因此,弧度超过180度的形状将无法正确建模。 | |
4.3.4.4. | 为什么计算欧洲/俄罗斯/在这里插入大的地理区域的面积会这么慢? |
因为这个多边形太大了!大区域不好有两个原因:它们的边界很大,所以无论运行什么查询,索引都会拉出特征;顶点数量很大,测试(距离、包容)必须至少遍历顶点列表一次,有时必须遍历N次(N是另一个候选特征中的顶点数)。 与几何学一样,我们建议,当您有非常大的多边形,但在较小的区域进行查询时,您可以将几何数据“反规格化”成较小的块,以便索引可以有效地子查询对象的各个部分,这样查询就不必每次都取出整个对象。请咨询 ST_Subdivide 功能文档。仅仅因为你可以将整个欧洲存储在一个多边形中,并不意味着你应该。 |
PostGIS符合开放地理空间联盟(OGC)的简单要素规范。该标准定义了几何的概念 简单 和 有效 。这些定义允许简单要素几何模型以一致且明确的方式表示空间对象,从而支持高效计算。(注:OGC SF和SQL/MM对简单和有效的定义相同。)
A 简单 几何体是指没有不规则几何点的几何体,例如自交或自切。
A POINT
与生俱来 简单 作为0维几何图形对象。
MULTIPOINT
%s是 简单 如果没有两个坐标( POINT
S)相等(具有相同的坐标值)。
A LINESTRING
是 简单 如果它没有两次通过相同的点,除了端点。如果简单线串的端点相同,则称为 关着的不营业的 并被称为线性环。
(A) 和 (C) 都很简单 |
![]() (A) | ![]() (B) |
![]() (C) | ![]() (D) |
A 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 。
几何有效性主要适用于2维几何图形( POLYGON
S和 MULTIPOLYGON
S)。有效性由允许多边形几何体明确建模平面区域的规则定义。
A POLYGON
是 有效 如果:
多边形边界环(外壳环和内孔环)是 简单 (请勿交叉或自行触摸)。正因为如此,多边形不能有切割线、尖峰或环。这意味着多边形洞必须用内环来表示,而不是用外环自接触(所谓的“倒置洞”)来表示。
边界环不交叉
边界环可以在点上接触,但只能作为切线(即不在一条线上)
内环包含在外环中
多边形内部是简单连接的(即环不能以将多边形分割为多个部分的方式接触)
(H) 和 (I) 是有效的 |
![]() (H) | ![]() (I) | ![]() (J) |
![]() (K) | ![]() (L) | ![]() (M) |
A MULTIPOLYGON
是 有效 如果:
其要素 POLYGON
%s有效
元素不能重叠(即其内部不得相交)
元素仅在点上接触(即不沿线)
(N) 是有效的 |
![]() (N) | ![]() (O) | ![]() (P) |
这些规则意味着有效的面几何也是 简单 。
对于线性几何,唯一的有效性规则是 LINESTRING
%s必须至少有两个点并且长度不为零(或者等价地,至少有两个不同的点)。请注意,非简单(自交)线是有效的。
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 cross()抛出错误!”),您应该首先确认函数参数有效。如果它们不是,则考虑使用以下技术之一来确保您正在处理的数据是有效的。
![]() | |
如果函数使用有效的输入报告错误,则您可能在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
是空间函数的一个例子,该函数 会吗? 允许无效输入!)
默认情况下,PostGIS在加载几何体时不会检查有效性,因为对于复杂的几何体,有效性测试可能会占用大量的CPU时间。如果不信任数据源,可以通过添加检查约束对表强制执行有效性检查:
ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));
A 空间参考系 (SRS)(也称为坐标参考系(CRS))定义几何图形如何参考地球表面上的位置。有三种类型的SR:
A 大地测量学 SRS使用直接映射到地球表面的角坐标(经度和纬度)。
A 预计 SRS使用数学投影变换将球形地球的表面“展平”到一个平面上。它以允许直接测量距离、面积和角度等数量的方式指定位置坐标。坐标系是笛卡尔坐标系,这意味着它有一个定义的原点和两个垂直轴(通常指向北和东)。每个投影的SRS使用规定的长度单位(通常为米或英尺)。投影的SRS可以在其适用范围内受到限制,以避免变形并符合所定义的坐标范围。
A 本地 SRS是不以地球表面为基准的笛卡尔坐标系。在PostGIS中,这由SRID值0指定。
有许多不同的空间参考系统在使用中。欧洲石油勘探组对常见的SRS进行了标准化 EPSG数据库 。为方便起见,PostGIS(和许多其他空间系统)使用称为SRID的整数标识符来引用SRS定义。
几何通过其SRID值与空间参考系相关联,该值可通过访问 ST_SRID 。可以使用指定几何的SRID ST_SetSRID 。某些几何构造函数允许提供SRID(例如 ST_Point 和 ST_MakeEnvelope )。这个 EWKT 格式支持SRID和 SRID=n;
前缀。
处理几何对的空间函数(例如 覆盖层 和 关系 函数)要求输入几何图形在相同的空间参考系中(具有相同的SRID)。可以使用将几何数据转换为不同的空间参考系 ST_Transform 。从函数返回的几何图形具有与输入几何图形相同的SRS。
这个 SPATIAL_REF_SYS
PostGIS使用的表是与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) )
这些列包括:
唯一标识 空间参考系 (SRS)在数据库中。
本参考系统引用的标准或标准机构的名称。例如,“EPSG”是有效的 auth_name
。
引用的管理局定义的空间参考系统的ID auth_name
。对于EPSG,这是EPSG代码。
空间参考系的众所周知的文本表示法。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标准 坐标参考系的熟知文本表示法 。
PostGIS使用Proj库来提供坐标转换功能。这个 项目4Text
列包含特定SRID的项目坐标定义字符串。例如:
+项目=utm+区域=10+ellps=clrk66+datum=NAD27+单位=m
有关详细信息,请参阅 项目网站 。这个 spatial_ref_sys.sql
文件同时包含两者 源文本
和 项目4Text
所有EPSG预测的定义。
在检索用于转换的空间参考系定义时,PostGIS使用以下策略:
如果 auth_name
和 auth_srid
存在(非空),则根据这些条目使用项目SR(如果存在)。
如果 源文本
如果可能,请使用它创建一个SRS。
如果 项目4Text
如果可能,请使用它创建一个SRS。
邮政地理信息系统 spatial_ref_sys
表包含3000多个最常见的空间参考系统定义,这些定义由 PROJ 投影库。但有许多坐标系是它不包含的。如果您具有有关空间参考系统的所需信息,则可以将SRS定义添加到表中。或者,如果您熟悉项目构造,也可以定义自己的自定义空间参考系统。请记住,大多数空间参考系统都是区域性的,在超出它们的预期范围使用时没有任何意义。
用于查找核心集中未定义的空间参考系的资源是 http://spatialreference.org/
一些常用的空间参考系统包括: 4326-WGS 84经度 , 4269-NAD 83经度 , 3395-WGS 84世界墨卡托 , 2163-美国国家地图集等面积 ,和60个WGS84 UTM地带。UTM区域是最理想的测量区域之一,但仅覆盖6度区域。(要确定将哪个UTM区域用于您感兴趣的区域,请参阅 Utmzone PostGIS plpgsql Helper函数 。)
美国各州使用州平面空间参考系统(基于米或英尺)-通常每个州存在一个或两个。大多数基于仪表的文档位于核心集合中,但许多基于英尺的文档或ESRI创建的文档将需要从 spatialreference.org 。
您甚至可以定义非地球坐标系,例如 火星2000 该火星坐标系是非平面的(单位为椭球度),但您可以将其与 地理学
键入以获取以米为单位的长度和邻近度,而不是度。
以下是使用未指定的SRID和以美国为中心的Lambert Conform投影的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语句 几何体
。下面的示例创建一个表,其中包含存储BC-Albers坐标系(SRID 3005)中的二维(XY)线串的几何图形列:
CREATE TABLE roads ( id SERIAL PRIMARY KEY, name VARCHAR(64), geom geometry(LINESTRING,3005) );
这个 几何体
类型支持两个可选的 类型修饰符 :
使用几何图形列创建表格的示例:
创建包含具有默认SRID的任何类型几何图形的表:
创建表geom(gid序列主键、geom几何);
使用默认SRID创建具有二维点几何图形的表:
创建表PTS(GID序列主键、几何几何(点));
创建具有3D(XYZ)点和显式SRID 3005的表:
创建表PTS(GID序列主键,GEOM几何(POINTZ,3005));
使用默认SRID创建具有四维(XYZM)线条几何图形的表:
创建表行(GID序列主键、几何几何(LINESTRINGZM));
使用SRID 4267(NAD 1927经度)创建具有二维多边形几何图形的表格:
创建表POLY(GID序列主键,几何几何(Polygon,4267));
一个表中可以有多个几何图形列。这可以在创建表时指定,也可以使用 ALTER TABLE SQL语句。此示例添加一个可以包含3D线条字符串的列:
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);
《OGC》 针对SQL的简单功能规范 定义 GEOMETRY_COLUMNS
描述几何表结构的元数据表。在PostGIS中 geometry_columns
是从数据库系统目录表中读取的视图。这确保空间元数据信息始终与当前定义的表和视图一致。视图结构为:
\d几何体_列
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) |
这些列包括:
包含几何图形列的要素表的完全限定名称。没有类似于“CATALOG”的PostgreSQL,因此该列保留为空。对于“SCHEMA”,使用PostgreSQL模式名称( 公共的
是默认设置)。
要素表中几何图形列的名称。
柱的坐标尺寸(2、3或4)。
此表中用于坐标几何的空间参考系的ID。它是对 spatial_ref_sys
表(请参见 Section 4.5.1, “SPATIAL_REF_SYS表” )。
空间对象的类型。若要将空间列限制为单一类型,请使用下列选项之一:POINT、LINESTRING、POLYGON、MULTPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION或相应的XYM版本POINTM、LINESTRINGM、POLYGONM、MULTIPOINTM、MULTILINESTRINGM、MULTIPOLYGONM、GEOMETRYCOLLECTIONM。对于异类(混合类型)集合,可以使用“GEOMETRY”作为类型。
您可能需要这样做的两种情况是SQL视图和批量插入。对于大容量插入,您可以通过约束列或执行ALTER TABLE来更正GEOMETRY_COLUMNS表中的注册。对于视图,您可以使用强制转换操作来公开。请注意,如果您的列是基于类型模式的,则创建过程将正确注册它,因此不需要执行任何操作。此外,未对几何图形应用空间函数的视图将与基础表几何图形列注册相同。
-- 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中,类型模式列也是如此。在本例中,我们使用tymod定义了一个列,并使用约束定义了另一个列。
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';
基于tymod的geom view列可以正确注册,但基于约束的geom view列不能正确注册。
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语句或使用shapefile加载器。
如果空间数据可以转换为文本表示形式(如WKT或WKB),那么使用SQL可能是将数据转换到PostGIS的最简单方法。可通过加载SQL的文本文件将数据批量加载到PostGIS/PostgreSQL中 INSERT
语句使用 PSQL
SQL实用程序。
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文件加载到PostgreSQL中 PSQL
:
Psql-d[数据库]-f Roads s.sql
这个 shp2pgsql
数据加载器将shapefile转换为适合以几何或地理格式插入到PostGIS/PostgreSQL数据库中的SQL。加载器有几种通过命令行标志选择的操作模式。
也有一个 Shp2pgsql-gui
图形界面,具有大多数选项作为命令行加载器。这可能更容易用于一次性非脚本加载,或者如果您是PostGIS的新手。它也可以配置为PgAdminIII的插件。
创建新表格并从shapefile填充该表格。 这是默认模式。
将Shapefile中的数据附加到数据库表中。请注意,要使用此选项加载多个文件,这些文件必须具有相同的属性和相同的数据类型。
在使用shapefile中的数据创建新表之前删除数据库表。
只生成表创建SQL代码,而不添加任何实际数据。如果您需要将表创建和数据加载步骤完全分开,则可以使用此方法。
显示帮助屏幕。
输出数据使用PostgreSQL“转储”格式。它可以与-a、-c和-d组合使用。它的加载速度比默认的“插入”SQL格式快得多。对于非常大的数据集,请使用此选项。
使用指定的SRID创建并填充几何表。(可选)指定输入的形文件使用给定的FROM_SRID,在这种情况下,几何图形将被重新投影到目标SRID。
保留标识符大小写(列、模式和属性)。请注意,shapefile中的属性均为大写。
将所有整数强制为标准的32位整数,不要创建64位大整数,即使DBF标头签名似乎保证了这一点。
在几何图形列上创建一个Gist索引。
-m a_file_name
指定一个文件,其中包含一组从(长)列名到10个字符的DBF列名的映射。文件的内容是一个或多个两个名称的行,中间用空格分隔,没有尾随或前导空格。例如:
COLUMNNAME DBFFIELD1 AVERYLONGCOLUMNNAME DBFFIELD2
生成简单的几何图形,而不是多个几何图形。仅当所有几何体实际上都是单个几何体(即,具有单个壳的多点或具有单个顶点的多点)时,才会成功。
强制输出几何图形具有指定的维度。使用以下字符串表示维度:2D、3DZ、3DM、4D。
如果输入的维度少于指定的维度,则输出将使用零填充这些维度。如果输入的尺寸超过指定的尺寸,则不需要的尺寸将被去除。
输出WKT格式,而不是WKB。请注意,这可能会由于精度损失而导致坐标漂移。
单独执行每条语句,而不使用事务。这允许在存在一些会产生错误的坏几何图形时加载大多数好数据。请注意,这不能与-D标志一起使用,因为“转储”格式总是使用事务。
指定输入数据(DBF文件)的编码。使用时,DBF的所有属性都将从指定的编码转换为UTF8。生成的SQL输出将包含一个 将CLIENT_ENCODING设置为UTF8
命令,这样后端将能够从UTF8重新转换为数据库内部配置使用的任何编码。
空几何图形处理策略(插入*、跳过、中止)
-n仅导入DBF文件。如果您的数据没有对应的shapefile,它将自动切换到此模式并仅加载DBF。因此,只有在设置了完整的shapefile,并且只需要属性数据而不需要几何体时,才需要设置此标志。
在WGS84经度(SRID=4326)中使用地理类型而不是几何图形(需要经纬度数据)
指定新表的表空间。除非还使用-X参数,否则索引仍将使用默认表空间。PostgreSQL文档对何时使用自定义表空间有很好的描述。
为新表的索引指定表空间。这适用于主键索引,如果还使用了-i,则还可以使用GIST空间索引。
使用时,此标志将防止生成 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 myHEMA|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语法。在空间限制的情况下,以下函数非常有用:
此函数用于告知两个几何图形是否共享任何空间。
这将测试两个几何图形是否在几何上相同。例如,如果‘Polygon((0 0,1,1,1 0,0 0))’与‘Polygon((0 0,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[ < 选项 > ] < 数据库 > [ < 模式 > ] < 表格 >
pgsql2shp [<options>] <database> <query>
命令行选项包括:
将输出写入特定的文件名。
要连接到的数据库主机。
数据库主机上要连接到的端口。
连接到数据库时使用的密码。
连接到数据库时使用的用户名。
如果表格具有多个几何图形列,则为写入形状文件时要使用的几何图形列。
使用二进制游标。这将使操作更快,但如果表中的任何非几何属性缺少转换为文本,则不起作用。
原始模式。请不要将 GID
字段或转义列名。
文件名
将标识符重映射到十个字符名称。文件的内容是由两个符号组成的行,由一个空格分隔,没有尾随或前导空格:VERYLONGSYMBOL SHORTONE ANOTHERVERYLONGSYMBOL SHORTER等。
空间索引使对大型数据集使用空间数据库成为可能。在没有索引的情况下,搜索特征需要对数据库中的每条记录进行顺序扫描。索引通过将数据组织到可以快速遍历以找到匹配记录的结构来加快搜索速度。
通常用于属性数据的B树索引方法对于空间数据并不是很有用,因为它只支持在单个维度中存储和查询数据。诸如几何图形(具有2个或更多维)之类的数据需要支持跨所有数据维的范围查询的索引方法。PostgreSQL用于空间数据处理的关键优势之一是它提供了几种适用于多维数据的索引方法:GIST、BRIN和SP-GIST索引。
GIST(通用搜索树) 索引将数据分解为“一侧的事物”、“重叠的事物”和“内部的事物”,可用于包括地理信息系统数据在内的各种数据类型。PostGIS使用在GIST之上实现的R-Tree索引来索引空间数据。GIST是最常用、用途最广的空间索引方法,具有很好的查询性能。
BRIN(块范围索引) 索引的运行方式是汇总表记录范围的空间范围。搜索是通过扫描范围完成的。BRIN仅适用于某些类型的数据(按空间排序,不频繁更新或不更新)。但它提供了更快的索引创建时间和更小的索引大小。
SP-GIST(空间分割广义搜索树) 是一种支持分区搜索树(如四叉树、k-d树和基数树(Try))的通用索引方法。
空间索引只存储几何图形的边界框。空间查询使用索引作为 主过滤器 以快速确定可能匹配查询条件的一组几何图形。大多数空间查询都需要 二次过滤器 它使用空间谓词函数来测试更具体的空间条件。有关使用空间谓词排队的更多信息,请参见 Section 5.2, “使用空间索引” 。
另请参阅 PostGIS专题讨论会关于空间索引的部分 ,以及 PostgreSQL手册 。
GIST代表“通用搜索树”,是多维数据的通用索引形式。PostGIS使用在GIST之上实现的R-Tree索引来索引空间数据。GIST是最常用、用途最广的空间索引方法,具有很好的查询性能。GIST的其他实现被用来加速对所有类型的不规则数据结构(整数数组、光谱数据等)的搜索,这些数据结构不符合正常的B树索引。有关详细信息,请参阅 PostgreSQL手册 。
一旦空间数据表超过几千行,您就需要构建索引来加快数据的空间搜索(除非所有搜索都是基于属性的,在这种情况下,您需要在属性字段上构建普通索引)。
在“GEOMETRY”列上构建GIST索引的语法如下:
使用GIST([geometryfield])对[Tablename]创建索引[indexname];
上述语法将始终构建2D索引。要获取几何图形类型的n维索引,可以使用以下语法创建一个索引:
使用GIST([geometryfield]gist_geomy_ops_nd)在[Tablename]上创建索引[indexname];
构建空间索引是一项计算密集型的工作。它还会在创建的时间内阻止对表的写入访问,因此在生产系统上,您可能希望以一种较慢的并发感知方式执行操作:
使用GIST([geometryfield])在[表名]上并发创建索引[indexname];
建立索引后,强制PostgreSQL收集用于优化查询计划的表统计信息有时会很有帮助:
真空分析[表名][(列名)];
Brin代表“区块范围指数”。它是在PostgreSQL 9.5中引入的一种通用索引方法。布林是一个 Lossy 索引方法,这意味着需要进行二次检查以确认记录与给定的搜索条件匹配(所有提供的空间索引都是这种情况)。它提供了更快的索引创建速度和更小的索引大小,并具有合理的读取性能。它的主要目的是支持在与表中的物理位置相关的列上对非常大的表进行索引。除了空间索引,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;
对象上构建Brin索引的语法 几何体
列为:
使用Brin([geome_ol])在[表名]上创建索引[indexname];
上面的语法构建了一个2D索引。要构建3D索引,请使用以下语法:
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索引支持数据类型。在地理列上构建Brin索引的语法为:
使用Brin([geog_ol])在[表名]上创建索引[indexname];
上述语法为椭球体上的地理空间对象构建2D索引。
目前,只提供“包含支持”,这意味着只有 & &
, ~
和 @
运算符可用于2D情况(用于两种情况 几何体
和 地理学
),并且仅仅是 & & &
用于3D几何图形的运算符。目前不支持KNN搜索。
Brin与其他索引类型之间的一个重要区别是,数据库不动态维护索引。对表中空间数据的更改将简单地附加到索引的末尾。这将导致索引搜索性能随着时间的推移而降低。可以通过执行以下操作更新索引 VACUUM
,或通过使用特殊函数 BRIN_SUMMARM_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索引的语法如下:
使用SPGIST([geometryfield])在[表名]上创建索引[indexname];
上面的语法将构建一个2维索引。可以使用3D运算符类创建几何图形类型的三维索引:
使用SPGIST([geometryfield]spgist_geometryops_3d)在[Tablename]上创建索引[indexname];
构建空间索引是一项计算密集型操作。它还会在创建的时间内阻止对表的写入访问,因此在生产系统上,您可能希望以一种较慢的并发感知方式执行操作:
使用SPGIST([geometryfield])对[Tablename]并发创建索引[indexname];
建立索引后,强制PostgreSQL收集用于优化查询计划的表统计信息有时会很有帮助:
真空分析[表名][(列名)];
SP-GIST索引可以加速涉及以下运算符的查询:
< < , & < , & > , > > , < < |, & < |, | & > ,| > > , & & ,@ > , < @和~=,对于二维索引,
& / & ,~==,@ > > ,以及 < < @,表示三维索引。
目前不支持KNN搜索。
通常,索引会以无形的方式加速数据访问:一旦构建了索引,PostgreSQL查询规划器就会自动决定何时使用它来提高查询性能。但在某些情况下,规划者不会选择使用现有索引,因此查询最终会使用缓慢的顺序扫描,而不是空间索引。
如果您发现您的空间索引未被使用,您可以执行以下操作:
检查查询计划并检查您的查询是否实际计算了您需要的内容。错误的联接(无论是忘记的联接还是连接到错误的表)可能会意外地多次检索表记录。要获取查询计划,请使用执行 EXPLAIN
在查询的前面。
确保收集了有关表中值的数量和分布的统计信息,以便为查询规划者提供更好的信息,以做出有关索引使用的决策。 真空分析 将两者都计算出来。
无论如何,你都应该定期清理你的数据库。许多PostgreSQL DBA运行 VACUUM 作为一份非高峰期的定期工作。
如果清理无济于事,您可以使用以下命令临时强制规划器使用索引信息 将ENABLE_SEQSCAN设置为OFF; 。这样,您就可以检查规划器是否能够为您的查询生成索引加速的查询计划。您应该只使用此命令进行调试;一般来说,规划器比您更清楚何时使用索引。运行完查询后,不要忘记运行 将ENABLE_SEQSCAN设置为ON; 以便计划器将对其他查询正常运行。
如果 将ENABLE_SEQSCAN设置为OFF; 帮助您的查询运行得更快,您的Postgres可能没有针对您的硬件进行调整。如果您发现规划者在顺序扫描与索引扫描的成本上是错误的,请尝试减少 RANDOM_PAGE_COST
在……里面 postgresql.conf
,或使用 设置RANDOM_PAGE_COST为1.1; 。的默认值 RANDOM_PAGE_COST
是4.0。尝试将其设置为1.1(对于固态硬盘)或2.0(对于快速磁盘)。减小该值会使规划器更有可能使用索引扫描。
如果 将ENABLE_SEQSCAN设置为OFF; 对您的查询没有帮助,查询可能正在使用Postgres规划器尚不能优化的SQL结构。有可能以规划者能够处理的方式重写查询。例如,带有内联SELECT的子查询可能不会生成有效的计划,但可能会使用横向联接重写。
有关更多信息,请参阅上的Postgres手册部分 查询规划 。
这个 《理由》 空间数据库的一个重要功能是在数据库内执行查询,这通常需要桌面地理信息系统功能。有效地使用PostGIS需要了解哪些空间函数可用,如何在查询中使用它们,并确保适当的索引到位以提供良好的性能。
空间关系指示两个几何图形如何相互作用。它们是查询几何图形的基本功能。
根据 OpenGIS针对SQL的简单功能实现规范 比较两个几何图形的基本方法是对两个几何图形的内部、边界和外部的交点进行成对测试,并根据得到的‘交集’矩阵中的条目对两个几何图形之间的关系进行分类。
在点集拓扑理论中,嵌入到2维空间中的几何中的点被分为三个集合:
几何体的边界是下一个较低维度的几何体的集合。为 POINT
S,其维度为0,则边界为空集。的边界 LINESTRING
是两个端点。为 POLYGON
S,则边界是外环和内环的线条。
几何图形的内部是指几何图形中不在边界内的点。为 POINT
S,内部就是点本身。它的内部是 LINESTRING
是终结点之间的点集。为 POLYGON
S,则内部是多边形内部的面积曲面。
几何图形的外部是嵌入几何图形的空间的其余部分;换句话说,不在几何图形内部或边界上的所有点。它是一个二维非闭合曲面。
这个 量纲扩展的9交点模型 (De-9IM)通过为每个几何图形指定上述集合之间的9个交叉点的尺寸来描述两个几何图形之间的空间关系。相交尺寸可以形式地表示为3x3 交集矩阵 。
For a geometry g the Interior, Boundary, and Exterior are denoted using the notation I(g), B(g), and E(g). Also, dim(s) denotes the dimension of a set s with the domain of {0,1,2,F}
:
0
= > 点
1
= > 线
2
= > 面积
F
= > 空集
使用此表示法,两个几何图形的交矩阵 一个 和 B类 是:
内饰 | 边界 | 外部 | |
---|---|---|---|
内饰 | Dim(i(A)∩I(B)) | Dim(I(A)∩B(B)) | Dim(i(A)∩E(B)) |
边界 | Dim(B(A)∩I(B)) | Dim(B(A)∩B(B)) | Dim(B(A)∩E(B)) |
外部 | Dim(E(A)∩I(B)) | Dim(E(A)∩B(B)) | Dim(E(A)∩E(B)) |
从视觉上看,对于两个重叠的多边形几何体,如下所示:
| ||||||||||||||||||
|
|
从左到右和从上到下阅读,交集矩阵表示为文本字符串‘ 212101212 ‘。
有关详细信息,请参阅:
OpenGIS针对SQL的简单功能实现规范 (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);
有关更多详细信息和插图,请参阅 邮政地理信息系统专题讨论会。
在某些情况下,命名的空间关系不足以提供所需的空间过滤条件。
![]() 例如,考虑表示公路网的线性数据集。可能需要识别彼此交叉的所有路段,不是在一点,而是在一条线上(可能是为了验证某些业务规则)。在这种情况下 ST_Crosses 不提供必要的空间过滤器,因为对于线状要素,它会返回 一个分两步进行的解决方案是首先计算实际交点( ST_Intersection )空间相交的成对道路线( ST_Intersects ),然后检查交叉口是否 ST_GeometryType IS‘ 显然,更简单、更快速的解决方案是可取的。 |
![]() 第二个例子是在一条线上定位与湖泊边界相交的码头,码头的一端在岸上。换句话说,如果码头位于湖泊内,但不完全被湖泊所控制,则码头与湖泊的边界在一条线上相交,并且码头的一个端点恰好在湖泊的边界之内或之上。可以使用空间谓词的组合来查找所需的功能:
|
这些要求可以通过计算完整的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
To test a particular spatial relationship, an intersection matrix pattern is used. This is the matrix representation augmented with the additional symbols {T,*}
:
T
=> intersection dimension is non-empty; i.e. is in {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 8.10.1, “边界框运算符” 获取完整列表)和最近邻查询中使用的距离运算符(最常见的是 < - > ;请参阅 Section 8.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()
使用 & &
查询几何图形的展开边界框上的内部运算符。如果上有空间索引 几何图形
,查询规划器将认识到它可以在计算距离之前使用索引来减少扫描的行数。空间索引仅允许检索其边界框与展开范围重叠的几何的记录 威力 在要求的距离内。然后计算实际距离以确认是否将该记录包括在结果集中。
有关更多信息和示例,请参阅 PostGIS研讨会 。
本节中的示例使用线性道路表格和多边形市政当局边界表格。定义的定义 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)
当前的PostgreSQL版本(包括9.6)在Toast表方面存在查询优化器的弱点。Toast表是一种用于存储不适合正常数据页(如长文本、图像或具有许多顶点的复杂几何图形)的大值(从数据大小的意义上)的“扩展空间”,请参见 Toast的PostgreSQL文档 了解更多信息)。
如果您碰巧有一个包含相当大的几何图形的表,但它们的行数不是太多(就像一个包含所有欧洲国家边界的高分辨率表),那么问题就会出现。然后桌子本身很小,但它使用了大量的烤面包空间。在我们的示例中,表本身有大约80行,只使用了3个数据页,但toast表使用了8225页。
现在发出一个使用几何运算符的查询 & & 以搜索仅与这些行中的极少数行匹配的边界框。现在,查询优化器看到该表只有3页和80行。它估计,在这样一个小表上进行顺序扫描比使用索引快得多。因此,它决定忽略GIST指数。通常情况下,这种估计是正确的。但在我们的案例中, & & 操作员必须从磁盘获取每个几何图形来比较边界框,从而也读取所有吐司页面。
要查看您是否存在此问题,请使用“EXPLAIN ANALYE”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_seqcan to off;”发送到服务器。这基本上迫使查询规划器尽可能避免顺序扫描。因此,它照常使用GIST指数。但是,必须在每个连接上设置该标志,并且它会导致查询规划器在其他情况下做出错误估计,因此您应该在查询之后将ENABLE_seqcan设置为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列保持最新,或者在每次修改后运行上面的更新查询。
对于大多数是只读的表,并且大多数查询使用单个索引,PostgreSQL提供了CLUSTER命令。该命令以与索引条件相同的顺序对所有数据行进行物理重新排序,从而产生两个性能优势:首先,对于索引范围扫描,大大减少了数据表上的查找次数。其次,如果您的工作集集中在索引上的一些小间隔上,您将拥有更高效的缓存,因为数据行分布在较少的数据页上。(现在请阅读PostgreSQL手册中的集群命令文档。)
但是,目前PostgreSQL不允许在PostGIS GIST索引上进行群集,因为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
当然,如果您的几何图形列中实际上需要空值,这将不起作用。此外,您必须使用上面的方法来添加约束,使用类似“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子句和主键或其他可行的条件将更新限制到表的一部分,并在更新之间运行简单的“Vacuum;”,从而将此更新分成较小的部分。这极大地减少了对临时磁盘空间的需求。此外,如果您有混合的尺寸几何图形,则通过“WHERE DIMENSION(Geom)”限制更新 > 2“跳过重写已在2D中的几何图形。
明尼苏达州地图服务器是符合OpenGIS网络地图服务规范的互联网网络地图服务器。
地图服务器主页位于 http://mapserver.org 。
OpenGIS Web地图服务规范位于 http://www.opengeospatial.org/standards/wms 。
要在MapServer中使用PostGIS,您需要了解如何配置MapServer,这不在本文档的讨论范围之内。本节介绍特定的PostGIS问题和配置详细信息。
要将PostGIS与MapServer配合使用,您将需要:
PostGIS的0.6版或更高版本。
MapServer 3.5版或更高版本。
MapServer像访问任何其他PostgreSQL客户端一样,使用 Libpq
界面。这意味着MapServer可以安装在任何可以通过网络访问PostGIS服务器的计算机上,并使用PostGIS作为数据源。系统之间的连接越快越好。
使用您想要的任何选项编译和安装MapServer,包括“--with-postgis”配置选项。
在MapServer Mapfile 中,添加一个PostGIS图层。例如:
LAYER CONNECTIONTYPE postgis NAME "widehighways" # Connect to a remote spatial database CONNECTION "user=dbuser dbname=gisdatabase host=bigserver" PROCESSING "CLOSE_CONNECTION=DEFER" # Get the lines from the 'geom' column of the 'roads' table DATA "geom from roads using srid=4326 using unique gid" STATUS ON TYPE LINE # Of the lines in the extents, only render the wide highways FILTER "type = 'highway' and numlanes >= 4" CLASS # Make the superhighways brighter and 2 pixels wide EXPRESSION ([numlanes] >= 6) STYLE COLOR 255 22 22 WIDTH 2 END END CLASS # All the rest are darker and only 1 pixel wide EXPRESSION ([numlanes] < 6) STYLE COLOR 205 92 82 END END END
在上面的示例中,特定于PostGIS的指令如下:
对于PostGIS图层,此名称始终为“postgis”。
数据库连接由a‘连接字符串’控制,这是一组标准的键和值,如下所示(在 < > ):
用户= < 用户名 > 密码= < 密码 > 数据库名= < 用户名 > 主机名= < 服务器 > 端口= < 5432 >
空的连接字符串仍然有效,任何键/值对都可以省略。至少,您通常需要提供要连接的数据库名称和用户名。
此参数的形式为“ < 地理柱 > 从… < 表名 > 使用SRID= < 格栅 > 使用唯一 < 主键 > “其中,列是要呈现到地图的空间列,SRID是列使用的SRID,主键是表主键(或任何其他具有索引的唯一值列)。
您可以省略“USING SRID”和“USING UNIQUE”子句,如果可能,MapServer将自动确定正确的值,但代价是为每个地图绘制在服务器上运行几个额外的查询。
如果有多个层,则输入CLOSE_CONNECTION=DEFER将重用现有连接,而不是关闭它们。这提高了速度。请参阅以了解 MapServer PostGIS性能提示 以获得更详细的解释。
筛选器必须是有效的SQL字符串,对应于SQL查询中通常跟随在“WHERE”关键字之后的逻辑。因此,例如,要仅渲染具有6条或更多车道的道路,请使用过滤器“num_lanes > =6“。
在空间数据库中,确保已为要绘制的任何图层构建了空间(GIST)索引。
使用GIST([GeometryColumn])对[Tablename]创建索引[indexname];
如果要使用MapServer查询图层,还需要在DATA语句中使用“USING UNIQUE”子句。
在执行查询时,MapServer需要每个空间记录的唯一标识符,而MapServer的PostGIS模块使用您指定的唯一值来提供这些唯一标识符。使用表主键是最佳实践。
这个 USING
伪SQL子句用于添加一些信息,以帮助地图服务器了解更复杂查询的结果。更具体地说,当视图或子选择用作源表时( DATA
定义)对于mapserver来说,自动确定每一行的唯一标识符以及表的SRID更加困难。这个 USING
子句可以为映射服务器提供以下两条信息:
DATA "geom FROM ( SELECT table1.geom AS geom, table1.gid AS gid, table2.data AS data FROM table1 LEFT JOIN table2 ON table1.id = table2.id ) AS new_table USING UNIQUE gid USING SRID=4326"
在执行地图查询时,MapServer要求每行具有唯一的ID,以便标识该行。通常,它从系统表中标识主键。但是,视图和子选择不会自动具有已知的唯一列。如果要使用MapServer的查询功能,则需要确保您的视图或子选择包含唯一值列,并使用 使用唯一
。例如,您可以为此显式选择表的主键值中的一个,或者选择保证对结果集唯一的任何其他列。
![]() | |
“查询地图”是点击地图以查询该位置的地图要素信息的操作。不要将“映射查询”与 |
PostGIS需要知道几何图形正在使用哪个空间参考系统,以便将正确的数据返回给MapServer。通常,可以在PostGIS数据库的“GEOMETRY_COLUMNS”表中找到此信息,但是,对于在即创建的表(如SUBSELECT和VIEW),这是不可能的。因此, 使用SRID=
选项允许在 DATA
定义。
让我们从一个简单的例子开始,然后逐步向上。请考虑以下MapServer图层定义:
LAYER CONNECTIONTYPE postgis NAME "roads" CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" DATA "geom from roads" STATUS ON TYPE LINE CLASS STYLE COLOR 0 0 0 END END END
此图层将以黑线显示Roads表中的所有道路几何图形。
现在,假设我们只想显示高速公路,直到我们放大到至少1:100000的比例--下两个层将实现此效果:
LAYER CONNECTIONTYPE postgis CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" PROCESSING "CLOSE_CONNECTION=DEFER" DATA "geom from roads" MINSCALE 100000 STATUS ON TYPE LINE FILTER "road_type = 'highway'" CLASS COLOR 0 0 0 END END LAYER CONNECTIONTYPE postgis CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" PROCESSING "CLOSE_CONNECTION=DEFER" DATA "geom from roads" MAXSCALE 100000 STATUS ON TYPE LINE CLASSITEM road_type CLASS EXPRESSION "highway" STYLE WIDTH 2 COLOR 255 0 0 END END CLASS STYLE COLOR 0 0 0 END END END
第一个层在比例大于1:100000时使用,并且仅以黑线显示“高速公路”类型的道路。这个 FILTER
选项会导致仅显示“高速公路”类型的道路。
第二层在比例小于1:100000时使用,并将高速公路显示为双粗红线,其他道路显示为常规黑线。
因此,我们只使用MapServer功能做了几件有趣的事情,但我们的 DATA
SQL语句保持简单。假设道路的名称存储在另一个表中(无论出于何种原因),我们需要做一个连接来获取它并标记我们的道路。
LAYER CONNECTIONTYPE postgis CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" DATA "geom FROM (SELECT roads.gid AS gid, roads.geom AS geom, road_names.name as name FROM roads LEFT JOIN road_names ON roads.road_name_id = road_names.road_name_id) AS named_roads USING UNIQUE gid USING SRID=4326" MAXSCALE 20000 STATUS ON TYPE ANNOTATION LABELITEM name CLASS LABEL ANGLE auto SIZE 8 COLOR 0 192 0 TYPE truetype FONT arial END END END
当比例尺降至1:20000或更小时,此注释图层会为所有道路添加绿色标签。它还演示了如何在 DATA
定义。
Java客户端可以直接以文本表示形式或使用与PostGIS捆绑在一起的JDBC扩展对象来访问PostgreSQL数据库中的PostGIS“几何”对象。为了使用扩展对象,“postgis.jar”文件必须与“postgresql.jar”JDBC驱动程序包一起位于您的CLASSPATH中。
import java.sql.*; import java.util.*; import java.lang.*; import org.postgis.*; public class JavaGIS { public static void main(String[] args) { java.sql.Connection conn; try { /* * Load the JDBC driver and establish a connection. */ Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql://localhost:5432/database"; conn = DriverManager.getConnection(url, "postgres", ""); /* * Add the geometry types to the connection. Note that you * must cast the connection to the pgsql-specific connection * implementation before calling the addDataType() method. */ ((org.postgresql.PGConnection)conn).addDataType("geometry",Class.forName("org.postgis.PGgeometry")); ((org.postgresql.PGConnection)conn).addDataType("box3d",Class.forName("org.postgis.PGbox3d")); /* * Create a statement and execute a select query. */ Statement s = conn.createStatement(); ResultSet r = s.executeQuery("select geom,id from geomtable"); while( r.next() ) { /* * Retrieve the geometry as an object then cast it to the geometry type. * Print things out. */ PGgeometry geom = (PGgeometry)r.getObject(1); int id = r.getInt(2); System.out.println("Row " + id + ":"); System.out.println(geom.toString()); } s.close(); conn.close(); } catch( Exception e ) { e.printStackTrace(); } } }
根据类型:点、线串、多边形、多点、多线串、多面,包含特定的拓扑几何对象(抽象类的子类)的包装对象。
PGgeometry geom = (PGgeometry)r.getObject(1); if( geom.getType() == Geometry.POLYGON ) { Polygon pl = (Polygon)geom.getGeometry(); for( int r = 0; r < pl.numRings(); r++) { LinearRing rng = pl.getRing(r); System.out.println("Ring: " + r); for( int p = 0; p < rng.numPoints(); p++ ) { Point pt = rng.getPoint(p); System.out.println("Point: " + p); System.out.println(pt.toString()); } } }
扩展对象的JavaDoc为几何对象中的各种数据访问器函数提供了参考。
下面给出的功能是PostGIS用户可能需要的功能。还有其他功能是对一般用户不使用的PostGIS对象所需的支持功能。
![]() | |
PostGIS已经开始从现有的命名约定向以SQL-MM为中心的约定过渡。因此,您熟悉和喜爱的大多数函数都使用标准空间类型(ST)前缀进行了重命名。以前的函数仍然可用,尽管本文档中没有列出更新后的函数是等效的。本文档中未列出的非ST_Functions已弃用,并将在未来版本中删除,因此请停止使用它们。 |
本节列出了由PostGIS安装的用于表示空间数据的自定义PostgreSQL数据类型。
每种数据类型都描述其类型转换行为。一个 类型铸型 将一种数据类型的值转换为另一种类型。PostgreSQL允许定义自定义类型的强制转换行为,以及用于转换类型值的函数。投射可以有 自动 行为,允许将函数参数自动转换为该函数支持的类型。
一些演员有 显式 行为,这意味着必须使用语法指定强制转换 演员阵容(Myval As Sometype)
或 Myval::sometype
。显式强制转换避免了二义性强制转换的问题,当使用不支持给定类型的重载函数时可能会发生这种情况。例如,函数可能接受box2d或box3d,但不接受几何体。由于几何体自动强制转换为两种长方体类型,因此会产生一个“歧义函数”错误。要防止该错误,请使用显式强制转换为所需的框类型。
所有数据类型都可以强制转换为 文本
,因此这不需要显式指定。
框2d — 表示二维边框的类型。
框2d
是一种空间数据类型,用于表示包围几何图形或几何图形集合的二维边界框。例如, ST_Extent 聚合函数返回一个 框2d
对象。
该制图表达包含值 Xmin、ymin、xmax、ymax
。这些是X和Y范围的最小值和最大值。
框2d
对象有一个文本表示形式,如下所示 方框(1 2 5 6)
。
方框3d — 表示三维边框的类型。
方框3d
是一种PostGIS空间数据类型,用于表示包围几何图形或几何图形集合的三维边界框。例如, ST_3DExtent 聚合函数返回一个 方框3d
对象。
该制图表达包含值 Xmin、ymin、zmin、xmax、ymax、zmax
。这些是X、Y和Z范围的最小值和最大值。
方框3d
对象有一个文本表示形式,如下所示 BOX3D(1 2 3 5 6 5)
。
geometry_dump — 一种复合类型,用于描述复杂几何图形的各个部分。
geometry_dump
是一种 复合数据类型 包含以下字段:
几何图形
-表示转储几何体的组件的几何体。几何图形类型取决于原始函数。
路径[]
-一个整数数组,它定义转储的几何体中指向 几何图形
组件。路径数组以1为基础(即 路径[1]
是第一个元素。)
它由 ST_Dump*
作为输出类型的函数族,用于将复杂几何图形分解为其组成部分。
AddGeometryColumn — 将几何图形列添加到现有表格。
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
表架构的名称。这个 格栅
必须是对SPATIAL_REF_SYS表中条目的整数值引用。这个 类型
必须是与几何类型对应的字符串,例如‘Polygon’或‘MULTILINESTRING’。如果架构名称不存在(或在当前SEARCH_PATH中不可见),或者指定的SRID、几何类型或尺寸无效,则会引发错误。
![]() | |
已更改:2.0.0此函数不再更新GEOMETRY_COLUMNS,因为GEOMETRY_COLUMNS是从系统目录读取的视图。默认情况下,它也不创建约束,而是使用PostgreSQL的内置类型修饰符行为。因此,例如,使用此函数构建一个WGS84点列现在相当于: 已更改:2.0.0如果需要旧的约束行为,请使用缺省值 |
![]() | |
已更改:2.0.0视图不能再在GEOMETRY_COLUMNS中手动注册,但是,针对几何类型模表几何构建并在没有包装函数的情况下使用的视图将正确注册自身,因为它们继承了其父表列的类型模式行为。使用输出其他几何图形的几何函数的视图需要转换为类型模化几何图形,以便在GEOMETRY_COLUMNS中正确注册这些视图几何图形列。参考 Section 4.6.3, “手动注册几何图形列” 。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
增强:2.0.0引入了USE_TYPMOD参数。默认情况下创建TypeMod几何图形列,而不是基于约束。
-- 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 — 从空间表中删除几何图形列。
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字段匹配。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
![]() | |
已更改: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现在是系统编目的视图,您就可以像删除任何其他表一样删除具有几何列的表 |
Find_SRID — 返回为几何列定义的SRID。
integer Find_SRID(
varchar a_schema_name, varchar a_table_name, varchar a_geomfield_name)
;
Populate_Geometry_Columns — 确保使用类型修饰符定义几何图形列或具有适当的空间约束。
text Populate_Geometry_Columns(
boolean use_typmod=true)
;
int Populate_Geometry_Columns(
oid relation_oid, boolean use_typmod=true)
;
确保几何图形列具有适当的类型修饰符或空间约束,以确保它们在 geometry_columns
查看。默认情况下,会将所有没有类型修饰符的几何图形列转换为有类型修饰符的几何图形列。
出于向后兼容性和空间需求(如表继承,其中每个子表可能具有不同的几何类型),仍然支持旧的CHECK约束行为。如果需要旧的行为,则需要将新的可选参数作为False传递 use_typmod=false
。完成此操作后,将创建不带类型修饰符的几何柱,但将定义3个约束。特别是,这意味着属于表的每个几何图形列至少有三个约束:
enforce_dims_geom
-确保每个几何图形具有相同的尺寸(请参见 ST_NDims )
enforce_geotype_geom
-确保每个几何图形的类型相同(请参见 GeometryType )
enforce_srid_geom
-确保每个几何图形都在同一投影中(请参见 ST_SRID )
如果一张桌子 OID
时,此函数尝试确定表中所有几何图形列的sRID、尺寸和几何图形类型,并根据需要添加约束。如果成功,则在GEOMETRY_COLUMNS表中插入适当的行,否则将捕获异常并引发描述问题的错误通知。
如果 OID
时,此函数尝试确定视图中所有几何图形的sRID、尺寸和类型,并将适当的条目插入 geometry_columns
表,但不执行任何操作来强制约束。
无参数变量是参数变量的简单包装器,它首先截断并重新填充数据库中每个空间表和视图的GEOMETRY_COLUMNS表,在适当的地方向表添加空间约束。它返回在数据库中检测到的几何列数和插入到 geometry_columns
桌子。参数化版只返回插入到 geometry_columns
桌子。
可用性:1.4.0
已更改:2.0.0默认情况下,现在使用类型修饰符而不是检查约束来约束几何体类型。仍然可以使用检查约束行为,方法是使用新的 use_typmod
并将其设置为False。
增强版:2.0.0 use_typmod
引入了可选参数,允许控制是使用类型修饰符还是使用检查约束来创建列。
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)
更新几何SRID — 更新几何图形列中所有要素的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()。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
将几何插入到已使用SRID集的道路表中 EWKT格式 :
COPY roads (geom) FROM STDIN; SRID=4326;LINESTRING(0 0, 10 10) SRID=4326;LINESTRING(10 10, 15 0) \.
这将把sRid of the Roads表从以前的版本更改为4326:
SELECT UpdateGeometrySRID('roads','geom',4326);
前面的示例等同于下面的DDL语句:
ALTER TABLE roads ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326) USING ST_SetSRID(geom,4326);
如果你在加载中搞错了投影(或者把它作为未知的东西带进来),你想一下子转换成网络墨卡托,你可以用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)
;
将几何图形收集到几何图形集合中。结果是一个多*或一个GeometryCollection,这取决于输入几何的类型是相同的还是不同的(同构或异类)。输入几何图形在集合中保持不变。
变体1: 接受两个输入几何
变体2: 接受几何图形数组
变体3: 接受几何图形行集的聚合函数。
![]() | |
如果任何输入几何图形是集合(多*或GeometryCollection),ST_Collect将返回GeometryCollection(因为这是唯一可以包含嵌套集合的类型)。要防止出现这种情况,请使用 ST_Dump 在子查询中将输入集合扩展到它们的原子元素(请参见下面的示例)。 |
![]() | |
ST_COLLECT和 ST_Union 看起来很相似,但实际上运作方式截然不同。ST_Collect将几何图形聚合到一个集合中,而不会以任何方式更改它们。ST_UNION以几何形式合并重叠的几何图形,并在交点处拆分线串。融合边界时,它可能会返回单个几何图形。 |
可用性:1.4.0-ST_COLLECT(Geomray)已推出。ST_Collect得到了增强,可以更快地处理更多的几何图形。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
收集二维点。
SELECT ST_AsText( ST_Collect( ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(-2 3)') )); st_astext ---------- MULTIPOINT((1 2),(-2 3))
收集三维点。
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))
ST_LineFromMultiPoint — 从多点几何图形创建线串。
geometry ST_LineFromMultiPoint(
geometry aMultiPoint)
;
从多点几何图形创建线串。
使用 ST_MakeLine 从点或线串输入创建直线的步骤。
This function supports 3d and will not drop the z-index.
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的情况下指定信封的功能。
ST_MakeLine — 从点、多点或线串几何图形创建线串。
geometry ST_MakeLine(
geometry geom1, geometry geom2)
;
geometry ST_MakeLine(
geometry[] geoms_array)
;
geometry ST_MakeLine(
geometry set geoms)
;
创建包含点、多点或线串几何图形的点的线串。其他几何图形类型会导致错误。
变体1: 接受两个输入几何
变体2: 接受几何图形数组
变体3: 接受几何图形行集的聚合函数。要确保输入几何的顺序,请使用 排序依据
在函数调用中,或具有 排序依据
条款。
Input LineStrings开头的重复节点将折叠为一个点。点和多点输入中的重复点不会折叠。 ST_RemoveRepeatedPoints 可用于折叠输出线串中的重复点。
This function supports 3d and will not drop the z-index.
可用性:2.3.0-引入了对多点输入元素的支持
可用性:2.0.0-引入了对线串输入元素的支持
可获得性:1.4.0-ST_MakeLine(地理阵列)已推出。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跟踪点按行进顺序组成的线串。
使用聚合 排序依据
提供排序正确的线串。
SELECT gps.track_id, ST_MakeLine(gps.geom ORDER BY gps_time) As geom FROM gps_points As gps GROUP BY track_id;
在PostgreSQL9之前,可以使用子查询中的排序。但是,有时查询计划可能不尊重子查询的顺序。
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 — 创建二维、三维或四维点。
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、3D Z或4D ZM点几何图形。
使用 ST_MakePointM 使用XYM坐标制作点。
虽然不符合OGC, ST_MakePoint
速度更快,精度更高 ST_GeomFromText 和 ST_PointFromText 。对于数值坐标值,它也更易于使用。
![]() | |
对于大地坐标, |
This function supports 3d and will not drop the z-index.
--Return point with unknown SRID SELECT ST_MakePoint(-71.1043443253471, 42.3150676015829); --Return point marked as WGS 84 long lat SELECT ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829),4326); --Return 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)
;
创建具有未知SRID的点。
SELECT ST_AsEWKT( ST_MakePointM(-71.1043443253471, 42.3150676015829, 10) ); st_asewkt ----------------------------------------------- POINTM(-71.1043443253471 42.3150676015829 10)
使用WGS 84大地坐标系中的测量创建点。
SELECT ST_AsEWKT( ST_SetSRID( ST_MakePointM(-71.104, 42.315, 10), 4326)); st_asewkt --------------------------------------------------------- SRID=4326;POINTM(-71.104 42.315 10)
获取创建点的度量值。
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: 接受壳线串和内部(孔)线串的数组。可以使用PostgreSQL ARRAY_AGG()、ARRAY[]或ARRAY()构造几何数组。
![]() | |
此函数不接受多行字符串。使用 ST_LineMerge 要生成线条,或 ST_Dump 若要提取线条字符串,请执行以下操作。 |
This function supports 3d and will not drop the z-index.
从二维线串创建多边形。
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;
从三维线串创建面
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))
从带测量的线串创建面
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 。(但是,请注意,如果某个省有多个区域或岛屿,则会生成无效的面。)使用左连接可确保包括所有省份,即使它们没有湖泊。
![]() | |
之所以使用CASE构造,是因为将空数组传递到ST_MakePolygon会导致空返回值。 |
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;
另一种技术是利用相关子查询和将行集转换为数组的数组()构造函数。
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坐标值的点。这是的SQL-MM等效项 ST_MakePoint 这只需要X和Y。
![]() | |
对于大地坐标, |
增强:添加了3.2.0 sRID作为额外的可选参数。较早的安装需要与ST_SetSRID组合以在几何体上标记sRID。
This method implements the SQL/MM specification. SQL-MM 3:6.1.2
SELECT ST_Point( -71.104, 42.315);
SELECT ST_SetSRID(ST_Point( -71.104, 42.315),4326);
3.2.0中的新功能:指定了SRID
SELECT ST_Point( -71.104, 42.315, 4326);
PostGIS 3.2之前版本的语法
SELECT CAST( ST_SetSRID(ST_Point( -71.104, 42.315), 4326) AS geography);
3.2和上,您可以包括sRID
SELECT CAST( ST_Point( -71.104, 42.315, 4326) AS geography);
PostgreSQL还提供了 ::
铸造速记
SELECT ST_Point( -71.104, 42.315, 4326)::geography;
如果点坐标不在大地坐标系(例如WGS84)中,则必须在投射到地理位置之前重新投影它们。在本例中,宾夕法尼亚州平面英尺(SRID 2273)中的一个点被投影到WGS84(SRID 4326)。
SELECT ST_Transform(ST_SetSRID( 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)
;
ST_PointM — 使用X、Y、M和SRID值创建点。
geometry ST_PointM(
float x, float y, float m, integer srid=unknown)
;
ST_PointZM — 使用X、Y、Z、M和SRID值创建点。
geometry ST_PointZM(
float x, float y, float z, float m, integer srid=unknown)
;
ST_Polygon — 从具有指定SRID的线串创建多边形。
geometry ST_Polygon(
geometry lineString, integer srid)
;
返回从给定线串构建的面,并从 格栅
。
ST_Polygon类似于 ST_MakePolygon 变体1,增加了设置SRID。
要创建带有孔的多边形,请使用 ST_MakePolygon 变体2,然后 ST_SetSRID 。
![]() | |
此函数不接受多行字符串。使用 ST_LineMerge 要生成线条,或 ST_Dump 若要提取线条字符串,请执行以下操作。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:8.3.2
This function supports 3d and will not drop the 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))
创建3D多边形。
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))
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)
;
在中创建矩形多边形 Web墨卡托 (SRID:3857)使用 XYZ瓷砖系统 。默认情况下,界限是使用Web墨卡托系统的标准范围(-20037508.342789,20037508.342789)的EPSG:3857中的。可选的边界参数可用于为任何平铺方案生成封套:提供一个几何图形,该几何图形具有要内嵌平铺系统的初始“缩放级别为零”正方形的SRID和范围。
可选的边距参数可用于按给定百分比增大切片,例如边距=0.125将切片增大12.5%,这相当于当范围为4096时缓冲区=512%,如中所用 ST_AsMVTGeom 。这对于创建平铺缓冲区很有用--包括位于平铺可见区域之外的数据,但这些数据的存在会影响当前平铺的渲染。例如,城市名称(地理点)可能靠近瓷砖的边缘,但文本需要渲染在两个瓷砖上,即使该地理位置只位于一个瓷砖的可见区域。在搜索中使用展开的切片将包括两个切片的城市地理位置。改为使用负值来收缩平铺。禁止使用小于-0.5的值,因为这会完全消除平铺。请勿对ST_AsMVTGeom()使用页边距。请参见中的示例 ST_AsMVT 。
增强:3.1.0增加了边距参数。
可用性: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的原点开始,平面有一个唯一的六边形平铺,即平铺(SRS,SIZE)。此函数回答以下问题:给定平铺(SRS,大小)中的哪些六边形与给定边界重叠。
输出六边形的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列表中以前的表时,集合返回函数隐含了关键字SLATEAL。因此,对于本例来说,CROSS JOIN、CROSS JOIN或只是纯连接是等价的构造。 |
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
ST_SquareGrid — 返回一组完全覆盖几何参数边界的网格正方形和单元格索引。
setof record ST_SquareGrid(
float8 size, geometry bounds)
;
从平面的正方形平铺的概念开始。对于给定的平面SRS和给定的边大小,从SRS的原点开始,平面有一个唯一的正方形平铺,即平铺(SRS,SIZE)。此函数用于回答以下问题:给定平铺(SRS,大小)中的哪些栅格与给定边界重叠。
输出正方形的SRS是由边界几何体提供的SRS。
正方形的加倍或边缘大小会生成一个新的父平铺,该平铺与原始平铺完美匹配。墨卡托中的标准网络地图拼贴只是墨卡托平面中的2次方格网。
可用性: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
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
ST_Letters — 返回呈现为几何图形的输入字母,该几何图形的默认起始位置为原点,默认文本高度为100。
geometry ST_Letters(
text letters, json font)
;
geometry_dump
几何图形组件的行。 geometry_dump
几何图形中坐标的行。 geometry_dump
几何图形中线段的行。 geometry_dump
多边形的外环和内环的行。GeometryType — 以文本形式返回几何图形的类型。
text GeometryType(
geometry geomA)
;
以字符串形式返回几何图形的类型。例如:“LINESTRING”、“POLYGON”、“MULTPOINT”等。
OGC规范s2.1.1.1-返回该Geometry实例所属的Geometry的可实例化的子类型的名称。几何图形的可实例化的子类型的名称以字符串形式返回。
![]() | |
此函数还通过返回形式为‘POINTM’的字符串来指示是否测量几何图形。 |
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method supports Circular Strings and Curves
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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)
;
返回此几何图形的组合边界的闭合。组合边界的定义如OGC规范的第3.12.3.2节所述。由于此函数的结果是闭包,因此在拓扑上是闭合的,因此可以使用OGC规范第3.12.2节中讨论的表示几何基元来表示结果边界。
由GEOS模块执行
![]() | |
在2.0.0之前,如果与一起使用,此函数将引发异常 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. OGC规范s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.14
This function supports 3d and will not drop the z-index.
增强:2.1.0引入了对三角形的支持
已更改:3.2.0支持TIN,不使用GEOS,不线性化曲线
![]() 边界点叠加的线串
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)
;
以线串形式返回所提供几何图形的边框的对角线。对角线是由两点组成的线串,每个标注的最小值位于其起点,最大值位于其终点。如果输入几何图形为空,则对角线为空。
可选的 配合
参数指定是否需要最佳匹配。如果为False,则可以接受稍大的边界框的对角线(对于具有多个顶点的几何体,这会更快地进行计算)。在这两种情况下,返回的对角线的边界框始终覆盖输入几何图形。
返回的几何图形保留输入几何图形的SRID和维度(Z和M存在)。
![]() | |
在退化的情况下(即输入中的单个顶点),返回的线串将在形式上无效(没有内部)。这一结果在拓扑上仍然有效。 |
可用性:2.2.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
ST_CoordDim — 返回几何图形的坐标尺寸。
integer ST_CoordDim(
geometry geomA)
;
返回ST_Geometry值的坐标尺寸。
这是的符合MM的别名 ST_NDims
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:5.1.3
This method supports Circular Strings and Curves
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
ST_Dimension — 返回几何图形的拓扑尺寸。
integer ST_Dimension(
geometry g)
;
返回此几何对象的拓扑维,它必须小于或等于坐标维。OGC规范s2.1.1.1-返回0 POINT
,1表示 LINESTRING
,2个用于 POLYGON
的组件的最大维度。 GEOMETRYCOLLECTION
。如果维度未知(例如,对于空的 GEOMETRYCOLLECTION
)返回0。
This method implements the SQL/MM specification. SQL-MM 3:5.1.2
增强:2.0.0引入了对多面体曲面和三角网的支持。如果给定的几何图形为空,则不再引发异常。
![]() | |
在2.0.0之前的版本中,如果与空几何图形一起使用,此函数会引发异常。 |
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
ST_Dump — 返回一组 geometry_dump
几何图形组件的行。
geometry_dump[] ST_Dump(
geometry g1)
;
提取几何体组件的集返回函数(SRF)。它返回一组 geometry_dump 行,每个行包含一个几何图形( 几何图形
字段)和一个整数数组( 路径
字段)。
对于原子几何类型(POINT、LINESTRING、POLGON),返回的单个记录为空 路径
数组和输入几何图形为 几何图形
。对于集合或多几何图形,返回每个集合组件的记录,并且 路径
表示组件在集合内的位置。
ST_DUMP对于展开几何图形非常有用。它是与 ST_Collect /GROUP BY,因为它创建新行。例如,它可以用于将MULTIPOLYGONS扩展为多边形。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
提供:PostGIS 1.0.0RC1.需要PostgreSQL 7.3或更高版本。
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the 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 行,每个行包含一个几何图形( 几何图形
字段)和一个整数数组( 路径
字段)。
这个 几何图形
字段 POINT
表示提供的几何图形的坐标。
the path
field (an integer[]
) is an index enumerating the coordinate positions in the elements of the supplied geometry. The indices are 1-based. For example, for a LINESTRING
the paths are {i}
where i
is the nth
coordinate in the LINESTRING
. For a POLYGON
the paths are {i,j}
where i
is the ring number (1 is outer; inner rings follow) and j
is the coordinate position in the ring.
要获取包含坐标的单个几何图形,请使用 ST_Points 。
增强:2.1.0更快的速度。重新实现为本机-C。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
可用性:1.5.0
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the 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 行,每个行包含一个几何图形( 几何图形
字段)和一个整数数组( 路径
字段)。
这个 几何图形
字段 LINESTRING
表示所提供几何图形的线段。
the path
field (an integer[]
) is an index enumerating the segment start point positions in the elements of the supplied geometry. The indices are 1-based. For example, for a LINESTRING
the paths are {i}
where i
is the nth
segment start point in the LINESTRING
. For a POLYGON
the paths are {i,j}
where i
is the ring number (1 is outer; inner rings follow) and j
is the segment start point position in the ring.
可用性:3.2.0
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the 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 行,每个行包含一个几何图形( 几何图形
字段)和一个整数数组( 路径
字段)。
这个 几何图形
该字段将每个环包含为一个多边形。这个 路径
字段是包含多边形环索引的长度为1的整数数组。外环(壳)的索引为0。内环(孔)的折射率为1或更高。
![]() | |
这仅适用于多边形几何体。它不适用于多聚合一 |
提供:PostGIS 1.1.3。需要PostgreSQL 7.3或更高版本。
This function supports 3d and will not drop the 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
。退货 NULL
如果输入不是 LINESTRING
或 CIRCULARLINESTRING
。
This method implements the SQL/MM specification. SQL-MM 3:7.1.4
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
![]() | |
已更改:2.0.0不再适用于单个几何体多行字符串。在较早版本的PostGIS中,单行多行字符串将与此函数一起使用并返回终点。在2.0.0中,它像任何其他多行字符串一样返回NULL。旧的行为是一个没有文档记录的功能,但是那些认为他们的数据存储为LINESTRING的人可能会在2.0.0中遇到这些返回NULL的情况。 |
线条的终点
postgis=# SELECT ST_AsText(ST_EndPoint('LINESTRING(1 1, 2 2, 3 3)'::geometry)); st_astext ------------ POINT(3 3)
非线型字符串的终点为空
SELECT ST_EndPoint('POINT(1 1)'::geometry) IS NULL AS is_null; is_null ---------- t
三维线串的终点
--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)
;
以几何体的形式返回所提供几何体的双精度(浮点8)最小边界框。多边形由边界框的角点定义(( MINX
, MINY
)、( MINX
, MAXY
)、( MAXX
, MAXY
)、( MAXX
, MINY
)、( MINX
, MINY
))。(PostGIS将添加一个 ZMIN
/ ZMAX
也要协调)。
退化情况(垂直线、点)将返回低于以下维度的几何 POLYGON
,即。 POINT
或 LINESTRING
。
可用性:1.5.0行为更改为输出双精度,而不是浮动4
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.15
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 — 返回表示多边形外环的线串。
geometry ST_ExteriorRing(
geometry a_polygon)
;
返回表示多边形的外环(壳)的LINESTRING。如果几何图形不是多边形,则返回NULL。
![]() | |
此函数不支持MULTIPOLYGON。对于与一起使用的MULTIPOLYGON ST_GeometryN 或 ST_Dump |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. 2.1.5.1
This method implements the SQL/MM specification. SQL-MM 3:8.2.3、8.3.3
This function supports 3d and will not drop the 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、MULTIPPOINT、MULTILINESTRING、MULTICURVE、MULTICURVE或POLYHEDRALSURFACE。否则,返回NULL。
![]() | |
从0.8.0版开始,OGC规范的索引是从1开始的。以前的版本将其实现为从0开始。 |
![]() | |
要提取几何图形的所有元素,请执行以下操作 ST_Dump 效率更高,适用于原子几何。 |
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
已更改:2.0.0之前的版本将为奇异几何图形返回NULL。这已更改为返回ST_GeometryN(..,1)大小写的几何图形。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:9.1.5
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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)
;
以字符串形式返回几何图形的类型。此函数与GeometryType(几何)的不同之处在于返回的字符串和前面的ST的大小写,以及它不会指示是否测量几何图形。
增强:引入了对多面体曲面的2.0.0支持。
This method implements the SQL/MM specification. SQL-MM 3:5.1.4
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
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?
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
ST_InteriorRingN — 返回多边形的第N个内环(孔)。
geometry ST_InteriorRingN(
geometry a_polygon, integer n)
;
将多边形几何体的第N个内环(孔)作为LINESTRING返回。索引从1开始。如果几何图形不是多边形或索引超出范围,则返回NULL。
![]() | |
此函数不支持MULTIPOLYGON。对于与一起使用的MULTIPOLYGON ST_GeometryN 或 ST_Dump |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:8.2.6、8.3.5
This function supports 3d and will not drop the z-index.
ST_IsClosed — 测试LineStrings的起点和终点是否重合。对于多面体曲面,测试其是否闭合(体积)。
boolean ST_IsClosed(
geometry g)
;
退货 TRUE
如果 LINESTRING
的起点和终点重合。对于多面体曲面,报告曲面是平面(开放)还是体积(闭合)。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:7.1.5、9.3.3
![]() | |
SQL-MM定义以下结果 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
增强:引入了对多面体曲面的2.0.0支持。
This function supports Polyhedral surfaces.
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
如果参数的几何类型为几何集合类型。集合类型如下:
GEOMETRYCOLLECTION
多个{点、面、直线、曲线、曲面}
COMPOUNDCURVE
![]() | |
此函数用于分析几何图形的类型。这意味着它将返回 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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。如果为真,则此几何图形表示空的几何图形集合、多边形、点等。
![]() | |
SQL-MM将ST_IsEmpty(NULL)的结果定义为0,而PostGIS返回NULL。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.7
This method supports Circular Strings and Curves
![]() | |
已更改:在以前版本的PostGIS ST_GeomFromText(‘GEOMETRYCOLLECTION(Empty)’)中允许2.0.0。现在,为了更好地符合SQL/MM标准,这在PostGIS 2.0.0中是非法的 |
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。
![]() | |
闭合线串不被视为多边形分量,因此,无论其方向如何,通过传递单个闭合线串仍可获得真正的返回。 |
![]() | |
如果多边形几何体未对内环使用反向方向(即,如果一个或多个内环与外环方向相同),则ST_IsPolygonCW和ST_IsPolygonCCW都将返回FALSE。 |
可用性:2.4.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
ST_IsPolygonCW — 测试多边形是否具有顺时针方向的外环和逆时针方向的内环。
boolean ST_IsPolygonCW (
geometry geom )
;
如果输入几何体的所有多边形组件的外环使用顺时针方向,所有内环使用逆时针方向,则返回True。
如果几何体没有多边形组件,则返回TRUE。
![]() | |
闭合线串不被视为多边形分量,因此,无论其方向如何,通过传递单个闭合线串仍可获得真正的返回。 |
![]() | |
如果多边形几何体未对内环使用反向方向(即,如果一个或多个内环与外环方向相同),则ST_IsPolygonCW和ST_IsPolygonCCW都将返回FALSE。 |
可用性:2.4.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
ST_IsRing — 测试线串是否闭合且简单。
boolean ST_IsRing(
geometry g)
;
Returns TRUE
if this LINESTRING
is both ST_IsClosed (ST_StartPoint(
g
)~=
ST_Endpoint(
) and ST_IsSimple (does not self intersect).g
)
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. 2.1.5.1
This method implements the SQL/MM specification. 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)
;
如果此几何图形没有异常几何点(如自交或自切),则返回True。有关OGC对几何简单性和有效性的定义的详细信息,请参阅 “确保几何图形的OpenGIS兼容性”
![]() | |
SQL-MM将ST_isSimple(NULL)的结果定义为0,而PostGIS返回NULL。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.8
This function supports 3d and will not drop the z-index.
ST_M — 返回点的M坐标。
float ST_M(
geometry a_point)
;
返回点的M坐标,如果不可用,则返回NULL。输入必须是点。
![]() | |
这还不是OGC规范的一部分,但在此列出是为了完成点坐标提取函数列表。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification.
This function supports 3d and will not drop the z-index.
ST_MemSize — 返回几何体占用的内存空间量。
integer ST_MemSize(
geometry geomA)
;
返回几何体占用的内存空间量(以字节为单位)。
这是对PostgreSQL内置功能的补充 数据库对象函数 PG_Column_Size、PG_Size_Pretty、PG_Relationship_Size、PG_Total_Relationship_Size。
![]() | |
给出表的字节大小的PG_Relationship_SIZE可能返回小于ST_MemSize的字节大小。这是因为PG_Relationship_SIZE不添加烤面包表贡献,并且大几何图形存储在烤面包表中。 PG_TOTAL_RELATION_SIZE-包括、表、烤面包表和索引。 PG_COLUMN_SIZE返回考虑压缩后几何在列中所占的空间量,因此可能低于ST_MemSize |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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
This function supports 3d and will not drop the z-index.
ST_NPoints — 返回几何体中的点(顶点)数。
integer ST_NPoints(
geometry g1)
;
返回几何图形中的点数。适用于所有几何体。
增强:引入了对多面体曲面的2.0.0支持。
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
ST_NRings — 返回多边形几何体中的环形数。
integer ST_NRings(
geometry geomA)
;
如果几何体是一个多边形或多个多边形,则返回环形数。与NumInteriorRings不同,它也计算外环。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
ST_NumGeometries — 返回几何图形集合中的元素数。
integer ST_NumGeometries(
geometry geom)
;
返回几何图形的数量。如果GEOMETRYCOLLECTION(或MULTI*)为GEOMETRYCOLLECTION,则返回几何图形的数量,对于单个几何图形将返回1,否则返回NULL。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
已更改:2.0.0在早期版本中,如果几何体不是集合/多类型,则返回NULL。2.0.0+现在为单个几何图形返回1,例如多边形、线条、点。
This method implements the SQL/MM specification. SQL-MM 3:9.1.4
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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。
This method implements the SQL/MM specification. SQL-MM 3:8.2.5
已更改:2.0.0-在以前的版本中,它允许传递MULTIPOLYGON,返回第一个多边形的内部环数。
--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的AIAS
integer ST_NumInteriorRing(
geometry a_polygon)
;
ST_NumPatches — 返回多面体曲面上的面数。对于非多面体几何图形将返回NULL。
integer ST_NumPatches(
geometry g1)
;
返回多面体曲面上的面数。对于非多面体几何图形,将返回NULL。这是ST_NumGeometries的别名,用于支持MM命名。如果您不关心MM约定,则使用ST_NumGeometries的速度更快。
可用性:2.0.0
This function supports 3d and will not drop the z-index.
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:?
This function supports Polyhedral surfaces.
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,它具有多用途,可用于多种几何图形类型。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:7.2.4
ST_PatchN — 返回多面体曲面的第N个几何图形(面)。
geometry ST_PatchN(
geometry geomA, integer n)
;
如果第N个几何图形是POLYHEDRALSURFACE或POLYHEDRALSURFACEM,则返回从1开始的第N个几何图形(面)。否则,返回NULL。这将返回与多面体曲面的ST_GeometryN相同的答案。使用ST_GeometryN更快。
![]() | |
索引以1为基数。 |
![]() | |
如果要提取几何图形的所有元素 ST_Dump 效率更高。 |
可用性:2.0.0
This method implements the SQL/MM specification. SQL-MM 3:?
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
--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个点。负值从线串的末尾向后计数,因此-1是最后一个点。如果几何图形中没有线串,则返回NULL。
![]() | |
从0.8.0版开始,OGC规范的索引是从1开始的。向后索引(负索引)不在OGC中,以前的版本将其实现为从0开始。 |
![]() | |
如果要获取多重线串中每条线串的第N点,请与ST_DUMP结合使用 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:7.2.5、7.3.5
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
![]() | |
已更改:2.0.0不再适用于单个几何体多线串。在旧版本的PostGIS中,单行多行字符串可以很好地与该函数配合使用,并返回起点。在2.0.0中,它只是像任何其他多行字符串一样返回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 — 返回包含几何图形坐标的多点。
geometry ST_Points(
geometry geom )
;
返回包含几何图形的所有坐标的多点。将保留重复的点,包括环形几何图形的起点和终点。(如果需要,可以通过调用 ST_RemoveRepeatedPoints 在结果上)。
要获取有关父几何中每个坐标位置的信息,请使用 ST_DumpPoints 。
如果存在M和Z坐标,则会保留它们。
This method supports Circular Strings and Curves
This function supports 3d and will not drop the z-index.
可用性:2.3.0
ST_StartPoint — 返回线串的第一个点。
geometry ST_StartPoint(
geometry geomA)
;
函数的第一个点。 LINESTRING
或 CIRCULARLINESTRING
几何体作为 POINT
。退货 NULL
如果输入不是 LINESTRING
或 CIRCULARLINESTRING
。
This method implements the SQL/MM specification. SQL-MM 3:7.1.3
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
![]() | |
增强:3.2.0为所有几何图形返回点。如果输入不是线串,则前一行为返回Nulls。 已更改:2.0.0不再适用于单个几何体多行字符串。在较早版本的PostGIS中,单行多行字符串可以很好地与该函数配合使用,并返回起点。在2.0.0中,它只返回NULL,就像其他任何多行字符串一样。旧的行为是一个没有文档记录的功能,但是那些认为他们的数据存储为LINESTRING的人可能会在2.0.0中遇到这些返回NULL的情况。 |
线串的起点
SELECT ST_AsText(ST_StartPoint('LINESTRING(0 1, 0 2)'::geometry)); st_astext ------------ POINT(0 1)
非线条的起始点为空
SELECT ST_StartPoint('POINT(0 1)'::geometry) IS NULL AS is_null; is_null ---------- t
三维线串的起点
SELECT ST_AsEWKT(ST_StartPoint('LINESTRING(0 1 1, 0 2 2)'::geometry)); st_asewkt ------------ POINT(0 1 1)
圆形字符串的起点
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:有空间参照系
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
可用性:1.2.2
增强:2.0.0添加了对地理位置的支持
增强:2.1.0 S标志,表示是否具有已知的空间参考系统
增强:2.2.0添加了对三角网和曲线的支持
=# 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坐标,如果不可用,则返回值为空。输入必须是一个点。
This method implements the SQL/MM specification. SQL-MM 3:6.1.3
This function supports 3d and will not drop the z-index.
ST_Y — 返回点的Y坐标。
float ST_Y(
geometry a_point)
;
返回点的Y坐标,如果不可用,则返回值为空。输入必须是一个点。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:6.1.4
This function supports 3d and will not drop the z-index.
ST_Z — 返回点的Z坐标。
float ST_Z(
geometry a_point)
;
ST_Zmflag — 返回指示几何图形的ZM坐标尺寸的代码。
smallint ST_Zmflag(
geometry geomA)
;
返回指示几何图形的ZM坐标尺寸的代码。
值为:0=2D、1=3D-M、2=3D-Z、3=4D。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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_AddPoint — 将点添加到线串。
geometry ST_AddPoint(
geometry linestring, geometry point)
;
geometry ST_AddPoint(
geometry linestring, geometry point, integer position = -1)
;
将点添加到索引之前的线串 职位
(使用从0开始的索引)。如果 职位
参数被省略或为-1,则将该点附加到线串的末尾。
可用性:1.1.0
This function supports 3d and will not drop the 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)
;
给定几何图形集合,返回同构多几何图形。
如果 类型
未指定,则返回仅包含最高维度的几何图形的多重几何图形。因此,多边形比线更受欢迎,而线比点更受欢迎。
如果 类型
则返回仅包含该类型的多重几何图形。如果没有正确类型的子几何图形,则返回空几何图形。仅支持点、线和面。类型编号为:
1==点
2==线条
3==多边形
对于原子几何体输入,如果输入类型与请求的类型匹配,几何体将原封不动地恢复。否则,结果是指定类型的空几何图形。如果需要,可以使用将这些几何转换为多个几何 ST_Multi 。
![]() | |
不检查多重多边形结果的有效性。如果多边形分量相邻或重叠,则结果将无效。(例如,将此函数应用于 ST_Split 结果。)这种情况可以通过以下方式进行核实 ST_IsValid 并用其修复 ST_MakeValid 。 |
可用性:1.5.0
![]() | |
在1.5.3之前,此函数返回未更改的原子输入,无论类型如何。在1.5.3中,不匹配的单个几何图形返回空结果。在2.0.0中,不匹配的单一几何图形返回请求类型的空结果。 |
提取最高维度类型:
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION( POINT(0 0), LINESTRING(1 1, 2 2) )')); st_astext --------------- MULTILINESTRING((1 1, 2 2))
提取点(类型1==点):
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))', 1 )); st_astext --------------- MULTIPOINT((0 0))
提取线(类型2==线条):
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)
;
给定一个几何集合,返回内容的“最简单”表示形式。
同构(统一)集合作为适当的多重几何体返回。
异类(混合)集合被展平为单个GeometryCollection。
包含单个原子元素的集合将作为该元素返回。
原子几何图形返回时不变。如果需要,可以使用将这些几何转换为多几何 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))
嵌套的异类集合展平为GeometryCollection:
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)
;
将圆形字符串转换为常规LINESTRING或将CURVEPOLYGON转换为多边形或将多曲面转换为MULTIPOLYGON。用于输出到不支持CIRCULARSTRING几何类型的设备
将给定的几何图形转换为线性几何图形。每个曲线几何图形或线段都使用给定的 `tolerance` 和选项(每个象限32个分段,默认情况下没有选项)。
TERTENCE_TYPE参数确定对 `tolerance` 争论。它可以采用下列值:
0(默认):公差是每个象限的最大分段数。
1:公差是直线与曲线的最大偏差,以源单位表示。
2:公差是最大角度,以弧度为单位,在生成半径之间。
“FLAGS”参数是一个位字段。默认情况下为0。支持的位包括:
1:对称(方向相关)输出。
2:保留角度,避免在生成对称输出时减小角度(线段长度)。当对称标志处于禁用状态时不起作用。
可用性:1.3.0
增强:2.4.0增加了对最大偏差和最大角度公差以及对称输出的支持。
增强:3.0.0实现了每个线性化圆弧的最小分段数,以防止拓扑崩溃。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:7.1.7
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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)
;
将闭合线串的起点/终点更改为给定顶点 点
。
可用性:3.2.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
ST_FlipCoordinates — 返回X轴和Y轴翻转的几何体版本。
geometry ST_FlipCoordinates(
geometry geom)
;
返回X轴和Y轴翻转的给定几何图形的版本。用于固定包含以纬度/经度(Y,X)表示的坐标的几何图形。
可用性:2.0.0
This method supports Circular Strings and Curves
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
ST_Force2D — 强制几何图形进入“2维模式”。
geometry ST_Force2D(
geometry geomA)
;
将几何体强制为“2维模式”,以便所有输出表示将只有X和Y坐标。这对于FORCE OGC兼容的输出非常有用(因为OGC仅指定2-D几何图形)。
增强:引入了对多面体曲面的2.0.0支持。
更改:2.1.0。直到2.0.x版本,这被称为ST_Force_2D。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the 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值的支持。
This function supports Polyhedral surfaces.
This method supports Circular Strings and Curves
This function supports 3d and will not drop the 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值的支持。
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
--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分量,则一个 MValue
M坐标已附加上。如果它具有Z分量,则会移除Z
更改:2.1.0。直到2.0.x版本,这被称为ST_Force_3 DM。
更改:3.1.0。添加了对提供非零M值的支持。
This method supports Circular Strings and Curves
--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值
和 MValue
分别为缺失的Z和M尺寸添加。
更改:2.1.0。直到2.0.x版本,这被称为ST_Force_4D。
更改:3.1.0。添加了对提供非零Z和M值的支持。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
--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_ForcePolygonCCW — 逆时针方向调整所有外环方向,顺时针方向调整所有内环方向。
geometry ST_ForcePolygonCCW (
geometry geom )
;
ST_ForceCollection — 将几何图形转换为GEOMETRYCOLLECTION。
geometry ST_ForceCollection(
geometry geomA)
;
将几何图形转换为几何图形。这对于简化WKB表示非常有用。
增强:引入了对多面体曲面的2.0.0支持。
可用性:1.2.2,1.3.4之前,此函数将与Curves一起崩溃。这在1.3.4+中已修复
更改:2.1.0。直到2.0.x,这被称为ST_Force_Collection。
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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_ForcePolygonCW — 顺时针定向所有外环,逆时针定向所有内环。
geometry ST_ForcePolygonCW (
geometry geom )
;
ST_ForceSFS — 强制几何图形仅使用SFS 1.1几何图形类型。
geometry ST_ForceSFS(
geometry geomA)
;
geometry ST_ForceSFS(
geometry geomA, text version)
;
ST_ForceRHR — 强制多边形中顶点的方向遵循右手规则。
geometry ST_ForceRHR(
geometry g)
;
强制多边形中顶点的方向遵循右手规则,在该规则中,由多边形界定的区域位于边界的右侧。具体地,外环以顺时针方向定向,而内环以逆时针方向定向。此函数是以下项的同义词 ST_ForcePolygonCW
![]() | |
上述右手规则的定义与其他上下文中使用的定义冲突。为避免混淆,建议使用ST_ForcePolygonCW。 |
增强:引入了对多面体曲面的2.0.0支持。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
ST_ForceCurve — 如果适用,将几何图形向上转换为其曲线类型。
geometry ST_ForceCurve(
geometry g)
;
将几何图形转换为其曲线表示(如果适用):直线变为复合曲线,多线变为多曲线,多边形变为曲线多边形变为多曲面。如果几何图形输入已经是曲线表示,则返回与输入相同的表示。
可用性:2.2.0
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
ST_LineToCurve — 将线性几何图形转换为曲线几何图形。
geometry ST_LineToCurve(
geometry geomANoncircular)
;
将普通线条/多边形转换为圆形字符串和弯曲多边形。请注意,用更少的点来描述曲线等价物。
![]() | |
如果输入LINESTRING/POLYGON曲线不够弯曲,无法清楚地表示曲线,则该函数将返回相同的输入几何图形。 |
可用性:1.3.0
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
-- 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 — 将几何图形作为多*几何图形返回。
geometry ST_Multi(
geometry geom)
;
ST_Normalize — 以其规范形式返回几何图形。
geometry ST_Normalize(
geometry geom)
;
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_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 data,它作为地理坐标提供,小数点后有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)
;
给定线串索引(从0开始),从线串中删除点。用于将闭合直线(环)转换为开放线串。
增强版:3.2.0
可用性:1.1.0
This function supports 3d and will not drop the z-index.
ST_RemoveRepeatedPoints — 返回删除了重复点的几何图形版本。
geometry ST_RemoveRepeatedPoints(
geometry geom, float8 tolerance)
;
返回删除了重复的连续点的给定几何图形的版本。该函数仅处理(多)线串、(多)多边形和多点,但可以使用任何类型的几何体进行调用。GeometryCollection的元素是单独处理的。线串的端点将被保留。
如果 容忍度
参数,则彼此公差距离内的顶点被视为重复。
增强版:3.2.0
可用性:2.2.0
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the 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_Reverse — 返回顶点顺序颠倒的几何体。
geometry ST_Reverse(
geometry g1)
;
ST_Segmentize — 返回线段长度不超过给定距离的修改后的几何图形/地理图形。
geometry ST_Segmentize(
geometry geom, float max_segment_length)
;
geography ST_Segmentize(
geography geog, float max_segment_length)
;
返回线段长度不超过给定值的已修改几何 max_segment_length
。距离计算仅在2维时间内执行。对于几何图形,长度单位使用空间参考单位。对于地理,单位以米为单位。
可用性:1.2.2
增强:3.0.0分段几何体现在使用等长分段
增强:2.3.0分段地理现在使用等长分段
增强:2.1.0引入了对地理位置的支持。
更改:2.1.0由于引入了地理支持:构造 SELECT ST_Segentize(‘LINESTRING(1 2,3 4)’,0.5);
将导致二义性函数错误。您需要具有正确类型的对象,例如几何/地理列,请使用ST_GeomFromText、ST_GeogFromText或 SELECT ST_Segentize(‘LINESTRING(1 2,3 4)’::Geomety,0.5);
![]() | |
这只会增加细分市场。它不会加长短于最大长度的线段 |
SELECT ST_AsText(ST_Segmentize( ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))') ,5) ); st_astext -------------------------------------------------------------------------------------------------- MULTILINESTRING((-29 -27,-30 -29.7,-34.886615700134 -30.758766735029,-36 -31, -40.8809353009198 -32.0846522890933,-45 -33), (-45 -33,-46 -32)) (1 row) SELECT ST_AsText(ST_Segmentize(ST_GeomFromText('POLYGON((-29 28, -30 40, -29 28))'),10)); st_astext ----------------------- POLYGON((-29 28,-29.8304547985374 37.9654575824488,-30 40,-29.1695452014626 30.0345424175512,-29 28)) (1 row)
ST_SetPoint — 将线串的点替换为给定点。
geometry ST_SetPoint(
geometry linestring, integer zerobasedposition, geometry point)
;
将线串的点N替换为给定点。指数是以0为基数的。负指数被倒数计算,因此-1是最后一个点。当一个顶点移动时尝试保持关节关系时,这在触发器中特别有用。
可用性:1.1.0
更新2.3.0:负面索引
This function supports 3d and will not drop the 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..180数据的0..360表示和0..360数据的-180..180表示。
![]() | |
这仅对具有经度/纬度坐标的数据有用;例如SRID 4326(WGS 84地理位置) |
![]() | |
1.3.4之前的错误阻止了这一点的多点工作。1.3.4+也适用于多点。 |
This function supports 3d and will not drop the z-index.
增强:引入了对多面体曲面和三角网的2.0.0支持。
注意:此函数在2.2.0中从“ST_SHIFT_LONGATION”重命名
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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’的左侧(对于正的‘Move’)的组件按照‘Move’参数指定的方向移动,最后将碎片重新组合在一起。
![]() | |
这有助于将较长时间输入重新定为中心,以使感兴趣的特征不会从一边产生到另一边。 |
可用性:2.3.0需要GEOS
This function supports 3d and will not drop the z-index.
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支持
This function supports 3d and will not drop the 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)
;
返回交换了给定坐标的给定几何图形的版本。
这个 奥兹
参数是命名要交换的坐标的两个字符的字符串。有效名称为:x、y、z和m。
可用性:2.2.0
This method supports Circular Strings and Curves
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
valid_detail
表示几何图形是否有效或原因和位置是否有效的行。ST_IsValid — 测试几何图形在二维中是否格式良好。
boolean ST_IsValid(
geometry g)
;
boolean ST_IsValid(
geometry g, integer flags)
;
根据OGC规则测试ST_Geometry值在二维中是否格式正确且有效。对于三维和四维的几何图形,有效性仍然只在两个维度上进行测试。对于无效的几何图形,将发出PostgreSQL通知,详细说明无效的原因。
对于包含 旗帜
参数,支持的值记录在 ST_IsValidDetail 此版本不会打印解释无效的通知。
有关几何有效性定义的详细信息,请参阅 Section 4.4, “几何图形验证”
![]() | |
SQL-MM将ST_IsValid(NULL)的结果定义为0,而PostGIS返回NULL。 |
由GEOS模块执行。
版本接受标志从2.0.0开始可用。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:5.1.9
![]() | |
OGC-SFS和SQL-MM规范都不包含ST_IsValid的标志参数。该标志是PostGIS的扩展。 |
ST_IsValidDetail — 返回一个 valid_detail
表示几何图形是否有效或原因和位置是否有效的行。
valid_detail ST_IsValidDetail(
geometry geom, integer flags)
;
返回一个 valid_detail
行,包含一个布尔值( 有效
)声明几何图形是否有效,则使用varchar( 原因
)说明无效的原因,以及几何图形( 位置
)指出其无效之处。
有助于改进以下各项的组合 ST_IsValid 和 ST_IsValidReason 以生成无效几何图形的详细报告。
可选的 旗帜
参数是位字段。它可以具有下列值:
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 生成无效几何图形和原因的详细报告。
允许 旗帜
都记录在 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)
;
该函数尝试在不丢失任何输入顶点的情况下创建给定无效几何体的有效表示。返回有效的几何图形时不会更改。
支持的输入包括:POINTS、MULTIPOINTS、LINESTRINGS、MULTILINESTRINGS、POLGON、MULTIPOLYGONS和GEOMETRYCOLLECTIONS,其中包含它们的任意组合。
在完全或部分维度收拢的情况下,输出几何图形可以是较低维度的几何图形的集合,也可以是较低维度的几何图形的集合。
在自交的情况下,单个多边形可能会变成多个几何图形。
这个 参数
参数可用于提供选项字符串,以选择用于生成有效几何图形的方法。选项字符串的格式为“METHOD=LINEWORK|Structure Keep Caved=TRUE|FALSE”。
“方法”键有两个值。
“线条”是原始算法,它通过首先提取所有线条,将线条连接在一起,然后从线条生成输出值来构建有效的几何图形。
“结构”是一种区分内环和外环的算法,通过联合外环,然后区分所有内环来构建新的几何体。
该键仅对“Structure”算法有效,取值为“True”或“False”。当设置为“False”时,折叠到较低维度的几何图形组件将被丢弃,例如一点线串。
由GEOS模块执行。
可用性:2.0.0
增强版:2.0.1,速度提升
增强:2.1.0,添加了对GEOMETRYCOLLECTION和多点的支持。
增强:3.1.0,添加了移除带有NaN值的坐标。
增强:3.2.0,增加了算法选项,‘线条’和‘结构’。
This function supports 3d and will not drop the z-index.
![]() BEFORE_GEOM:两个重叠多边形的多重投影
![]() After_geom:4个非重叠多边形的多重聚
![]() AFTER_GEOM_STRUCTURE:1个非重叠多边形的多重组合
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:6个重叠多边形的多重聚
![]() After_geom:由14个不重叠的多边形组成的多重多边形
![]() AFTER_GEOM_STRUCTURE:1个非重叠多边形的多重组合
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;
|
ST_SetSRID — 在几何图形上设置SRID。
geometry ST_SetSRID(
geometry geom, integer srid)
;
将几何图形上的SRID设置为特定整数值。在构造查询的边界框时非常有用。
![]() | |
此函数不以任何方式转换几何图形坐标-它只是设置定义几何图形所在的空间参考系的元数据。使用 ST_Transform 如果要将几何图形转换为新投影。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method supports Circular Strings and Curves
-- Mark a point as WGS 84 long lat --
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)
-- Mark a point as WGS 84 long lat and then transform to web mercator (Spherical 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)
;
返回在SPATIAL_REF_SYS表中定义的ST_Geometry的空间参考标识符。 Section 4.5, “空间参考系”
![]() | |
Space_ref_sys表是一个表,它编目了PostGIS已知的所有空间参考系统,并用于从一个空间参考系统到另一个空间参考系统的转换。因此,如果您计划转换几何图形,验证您拥有正确的空间参考系统标识符是很重要的。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.5
This method supports Circular Strings and Curves
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标识符。
![]() | |
需要在支持项目的情况下编译PostGIS。使用 PostGIS_Full_Version 以确认您已编译了项目支持。 |
![]() | |
如果使用多个转换,则对常用转换使用函数索引以利用索引使用是很有用的。 |
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
增强:引入了对多面体曲面的2.0.0支持。
增强:2.3.0引入了对直接PROJ.4文本的支持。
This method implements the SQL/MM specification. SQL-MM 3:5.1.6
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
将马萨诸塞州平面US Foot几何体更改为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将引发错误,但可以通过测试不同的SRID来配置此行为 to_proj
PROJ.4文本的值,或更改 项目4Text
中的值。 spatial_ref_sys
桌子。
例如,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,@ntw2_0.gsb,@ntw1_can.dat,NULL+no_Defs’,其中sRID=4267;
ST_BdPolyFromText — 构造给定任意闭合线串集合作为MultiLineString熟知文字表示的多边形。
geometry ST_BdPolyFromText(
text WKT, integer srid)
;
构造给定任意闭合线串集合作为MultiLineString熟知文字表示的多边形。
![]() | |
如果wkt不是MULTILINESTRING,则引发错误。如果输出是MULTIPOLYGON,则抛出错误;在这种情况下使用ST_BdMPolyFromText,或参见ST_BuildArea()以了解特定于PostGIS的方法。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
由GEOS模块执行。
可用性:1.1.0
ST_BdMPolyFromText — 构造一个给定任意闭合线串集合的多重多边形作为多重线串文本表示众所周知的文本表示。
geometry ST_BdMPolyFromText(
text WKT, integer srid)
;
构造一个给定任意集合的闭合线串、多边形、多线串作为熟知文本表示。
![]() | |
如果wkt不是MULTILINESTRING,则引发错误。强制MULTIPOLYGON输出,即使结果实际上只由一个面组成;使用 ST_BdPolyFromText 如果您确定操作将产生一个面,或者请参见 ST_BuildArea() 用于后地理信息系统特定的方法。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
由GEOS模块执行。
可用性:1.1.0
ST_GeogFromText — 从熟知文本表示形式或扩展(WKT)中返回指定的地理值。
geography ST_GeogFromText(
text EWKT)
;
--- 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)
;
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不是GEOMETRYCOLLECTION,则返回NULL
![]() | |
如果您绝对确定您的所有wkt几何图形都是集合,请不要使用此函数。它比ST_GeomFromText慢,因为它增加了一个额外的验证步骤。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification.
ST_GeomFromEWKT — 从扩展熟知文本表示法(EWKT)返回指定的ST_Geometry值。
geometry ST_GeomFromEWKT(
text EWKT)
;
从OGC扩展熟知文本(EWKT)表示法构造一个PostGIS ST_Geometry对象。
![]() | |
EWKT格式不是OGC标准,而是包含空间参考系(SRID)标识符的特定于PostGIS的格式 |
增强:引入了对多面体曲面和三角网的2.0.0支持。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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_GeometryFromText — 从熟知文字表示法(WKT)返回指定的ST_Geometry值。这是ST_GeomFromText的别名
geometry ST_GeometryFromText(
text WKT)
;
geometry ST_GeometryFromText(
text WKT, integer srid)
;
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:5.1.40
ST_GeomFromText — 从熟知文字表示法(WKT)返回指定的ST_Geometry值。
geometry ST_GeomFromText(
text WKT)
;
geometry ST_GeomFromText(
text WKT, integer srid)
;
从OGC熟知文本表示形式构造一个PostGIS ST_Geometry对象。
![]() | |
ST_GeomFromText函数有两个变体。第一个不采用SRID,并返回没有定义的空间参考系统(SRID=0)的几何图形。第二个函数将SRID作为第二个参数,并返回包含此SRID的几何体作为其元数据的一部分。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S3.2.6.2-选项SRID来自一致性套件。
This method implements the SQL/MM specification. SQL-MM 3:5.1.40
This method supports Circular Strings and Curves
![]() | |
虽然不符合OGC, ST_MakePoint 比ST_GeomFromText和ST_PointFromText更快。对于数值坐标值,它也更易于使用。 ST_Point 是另一个在速度上类似于 ST_MakePoint 并且符合OGC标准,但只支持2D点。 |
![]() | |
已更改:在以前版本的PostGIS ST_GeomFromText(‘GEOMETRYCOLLECTION(Empty)’)中允许2.0.0。现在,为了更好地符合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来自一致性套件。 |
![]() | |
如果您知道所有的几何图形都是LINESTRINGS,那么只使用ST_GeomFromText会更有效。这只是调用ST_GeomFromText并添加额外的验证,以确保它返回一个线串。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification. SQL-MM 3:7.2.8
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不是MULTILINESTRING,则返回NULL
![]() | |
如果您绝对确定所有的WKT几何图形都是点,请不要使用此函数。它比ST_GeomFromText慢,因为它增加了一个额外的验证步骤。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification. SQL-MM 3:9.4.4
ST_MPointFromText — 使用给定的SRID从WKT创建几何图形。如果未提供SRID,则默认为0。
geometry ST_MPointFromText(
text WKT, integer srid)
;
geometry ST_MPointFromText(
text WKT)
;
使用给定的SRID从WKT创建几何图形。如果未提供SRID,则默认为0。
OGC规范3.2.6.2-选项SRID来自一致性套件
如果WKT不是多点,则返回NULL
![]() | |
如果您绝对确定所有的WKT几何图形都是点,请不要使用此函数。它比ST_GeomFromText慢,因为它增加了一个额外的验证步骤。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. 3.2.6.2
This method implements the SQL/MM specification. SQL-MM 3:9.2.4
ST_MPolyFromText — 使用给定的SRID从WKT创建多重多边形几何图形。如果未提供SRID,则默认为0。
geometry ST_MPolyFromText(
text WKT, integer srid)
;
geometry ST_MPolyFromText(
text WKT)
;
使用给定的SRID从WKT生成多重多边形。如果未提供SRID,则默认为0。
OGC规范3.2.6.2-选项SRID来自一致性套件
如果WKT不是MULTIPOLYGON,则引发错误
![]() | |
如果您绝对确定您的所有WKT几何图形都是多面体,请不要使用此函数。它比ST_GeomFromText慢,因为它增加了一个额外的验证步骤。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification. 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函数有两个变体,第一个不接受SRID,并返回没有定义的空间参考系统的几何图形。第二个参数将空间参考id作为第二个参数,并返回一个ST_Geometry值,该值将此sRID作为其元数据的一部分。SRID必须在SPATIAL_REF_SYS表中定义。 |
![]() | |
如果您绝对确定所有的WKT几何图形都是点,请不要使用此函数。它比ST_GeomFromText慢,因为它增加了一个额外的验证步骤。如果您从较长后方坐标构建点,且更关心性能和准确性,而不是OGC合规性,请使用 ST_MakePoint 或符合OGC标准的别名 ST_Point 。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S3.2.6.2-选项SRID来自一致性套件。
This method implements the SQL/MM specification. SQL-MM 3:6.1.8
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慢,因为它增加了一个额外的验证步骤。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification. 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
LINESTRING
从具有给定SRID的WKBST_GeogFromWKB — 从熟知二进制几何表示(WKB)或扩展熟知二进制(EWKB)创建地理实例。
geography ST_GeogFromWKB(
bytea wkb)
;
这个 ST_GeogFromWKB
函数,获取几何图形的众所周知的二进制表示(WKB)或PostGIS扩展的WKB,并创建相应地理类型的实例。此函数在SQL中扮演几何图形工厂的角色。
如果未指定SRID,则默认为4326(WGS 84 Long Lat)。
This method supports Circular Strings and Curves
--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支持。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
NAD 83 Long Late(4269)中行字符串二进制表示为LINESTRING(-71.160281 42.258729、-71.160837 42.259113、-71.161144 42.25932)。
![]() | |
注意:即使字节数组用\分隔,并且可能有‘,如果STANDARD_CONFINGING_STRINGS为OFF,我们也需要使用\和’进行转义。因此,它看起来并不完全像它的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_CONFINGING_STRINGS设置为ON,而在以前的版本中将其设置为OFF。您可以根据需要更改单个查询的默认设置,也可以在数据库或服务器级别更改。下面是在STANDARD_CONFINGING_STRINGS=ON的情况下如何执行此操作。在本例中,我们转义了‘with Standard 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(未知)。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S3.2.7.2-可选的SRID来自一致性套件
This method implements the SQL/MM specification. SQL-MM 3:5.1.41
This method supports Circular Strings and Curves
--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 — 使之成为 LINESTRING
从具有给定SRID的WKB
geometry ST_LineFromWKB(
bytea WKB)
;
geometry ST_LineFromWKB(
bytea WKB, integer srid)
;
这个 ST_LineFromWKB
函数接受几何图形的众所周知的二进制表示形式和空间参考系ID( SRID
),并创建相应几何图形类型的实例-在本例中为 LINESTRING
几何图形。此函数在SQL中扮演几何图形工厂的角色。
如果未指定SRID,则默认为0。 NULL
如果输入的是 喝杯茶
并不代表 LINESTRING
。
![]() | |
OGC规范3.2.6.2-选项SRID来自一致性套件。 |
![]() | |
如果你知道你所有的几何图形都是 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification. SQL-MM 3:7.2.9
ST_LinestringFromWKB — 使用给定的SRID从WKB创建几何图形。
geometry ST_LinestringFromWKB(
bytea WKB)
;
geometry ST_LinestringFromWKB(
bytea WKB, integer srid)
;
这个 ST_LinestringFromWKB
函数接受几何图形的众所周知的二进制表示形式和空间参考系ID( SRID
),并创建相应几何图形类型的实例-在本例中为 LINESTRING
几何图形。此函数在SQL中扮演几何图形工厂的角色。
如果未指定SRID,则默认为0。 NULL
如果输入的是 喝杯茶
并不代表 LINESTRING
几何图形。这是的别名 ST_LineFromWKB 。
![]() | |
OGC规范3.2.6.2-可选的SRID来自一致性套件。 |
![]() | |
如果你知道你所有的几何图形都是 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.6.2
This method implements the SQL/MM specification. SQL-MM 3:7.2.9
ST_PointFromWKB — 使用给定的SRID从WKB创建几何图形
geometry ST_GeomFromWKB(
bytea geom)
;
geometry ST_GeomFromWKB(
bytea geom, integer srid)
;
这个 ST_PointFromWKB
函数接受几何图形的众所周知的二进制表示形式和空间参考系ID( SRID
),并创建相应几何图形类型的实例-在本例中为 POINT
几何图形。此函数在SQL中扮演几何图形工厂的角色。
如果未指定SRID,则默认为0。 NULL
如果输入的是 喝杯茶
并不代表 POINT
几何图形。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s3.2.7.2
This method implements the SQL/MM specification. SQL-MM 3:6.1.9
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
ST_Box2dFromGeoHash — 从GeoHash字符串返回BOX2D。
box2d ST_Box2dFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
从GeoHash字符串返回BOX2D。
如果没有 精度
被指定为ST_Box2dFromGeoHash根据输入GeoHash字符串的全精度返回BOX2D。
如果 精度
则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边界的多边形。
如果没有 精度
指定ST_GeomFromGeoHash将根据输入GeoHash字符串的全精度返回一个多边形。
如果 精度
则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 versions supported:
GML 3.2.1 Namespace
GML 3.1.1 Simple Features profile SF-2 (with GML 3.1.0 and 3.0.0 backward compatibility)
GML 2.1.2
OGC GML standards, cf: http://www.opengeospatial.org/standards/gml:
可用性:1.5,需要libxml2 1.6+
增强:引入了对多面体曲面和三角网的2.0.0支持。
增强:增加了2.0.0默认SRID可选参数。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
GML允许混合维度(例如,同一多几何图形中的2D和3D)。与PostGIS几何图形不同,如果一次发现缺少Z维度,则ST_GeomFromGML会将整个几何图形转换为2D。
GML支持在同一多几何图形中混合SR。与PostGIS几何图形不同,在本例中,ST_GeomFromGML将所有子几何图形重新投影到SRS根节点。如果没有可用于GML根节点的srsName属性,该函数将抛出错误。
ST_GeomFromGML函数对于显式的GML命名空间并不迂腐。对于常见用法,您可以避免明确提及它。但是,如果您想在GML中使用XLink功能,则需要它。
![]() | |
ST_GeomFromGML函数不支持SQL/MM曲线几何。 |
SELECT ST_GeomFromGML(' <gml:LineString 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> <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=4326。
增强:2.5.0现在可以接受json和jsonb作为输入。
可用性:2.0.0需要-JSON-C > =0.9
![]() | |
如果您没有启用JSON-C,Support您将收到错误通知,而不是看到输出。要启用JSON-C,运行CONFigure--with-jsondir=/path/to/json-c。看见 Section 2.2.3, “生成配置” 有关详细信息,请参阅。 |
This function supports 3d and will not drop the 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 versions supported:
KML 2.2.0 Namespace
OGC KML standards, cf: http://www.opengeospatial.org/standards/kml:
可用性:1.5,需要libxml2 2.6+
This function supports 3d and will not drop the z-index.
![]() | |
ST_GeomFromKML函数不支持SQL/MM曲线几何。 |
ST_GeomFromTWKB — 从TWKB创建几何图形实例(“ 微小的众所周知的二进制 “)几何表示法。
geometry ST_GeomFromTWKB(
bytea 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)
;
ST_LineFromEncodedPolyline — 从编码的多段线创建线串。
geometry ST_LineFromEncodedPolyline(
text polyline, integer precision=5)
;
从编码的多段线字符串创建线串。
可选 精度
指定将在编码多段线中保留的小数位数。编码和解码的值应该是相同的,否则坐标会错误。
请参阅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的中心点。
如果没有 精度
指定ST_PointFromGeoHash将根据输入GeoHash字符串的全精度返回点。
如果 精度
则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字节不能超过1 GB。
表格类型
对表类型的引用。
数据
输入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为前缀的几何图形的熟知文本表示形式。可选的 最大小数位数
参数可用于减少输出中浮点后使用的最大小数位数(默认为15)。
要执行从EWKT制图表达到PostGIS几何的逆转换,请使用 ST_GeomFromEWKT 。
![]() | |
使用 |
![]() | |
WKT规范不包括SRID。要获取OGC WKT格式,请使用 ST_AsText 。 |
![]() | |
WKT格式不能保持精度,因此为了防止浮动截断,请使用 ST_AsBinary 或 ST_AsEWKB 传输格式。 |
增强:3.1.0支持可选精度参数。
增强:2.0.0引入了对地理、多面体曲面、三角形和三角网的支持。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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)几何图形/地理图形的表示。可选的 最大小数位数
参数可用于限制输出纵坐标中小数点后的位数(默认为15)。
要执行从WKT制图表达到PostGIS几何的逆转换,请使用 ST_GeomFromText 。
![]() | |
标准OGC WKT表示不包括SRID。要将SRID作为输出表示的一部分,请使用非标准的PostGIS函数 ST_AsEWKT |
![]() | |
WKT中数字的文本表示可能不会保持完全的浮点精度。为确保数据存储或传输的完全准确性,最好使用 熟知的二进制 (WKB)格式(请参阅 ST_AsBinary 和 |
![]() | |
使用 |
可用性:1.5-引入了对地理位置的支持。
增强:2.5-引入可选参数精度。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.25
This method supports Circular Strings and Curves
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)
这个 最大小数位数
参数可用于限制输出精度。
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中的默认行为已更改为十六进制编码的OUTPUT BYTE。如果您的图形用户界面工具需要旧的行为,那么在您的数据库中设置TEA_OUTPUT=‘ESCRAPE’。 |
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
增强:2.0.0引入了对更高坐标维度的支持。
增强:2.0.0引入了对使用地理位置指定字节顺序的支持。
可用性:引入了1.5.0地理支持。
已更改:2.0.0此函数的输入不能是未知的--必须是几何图形。构造,如 ST_AsBinary(‘point(1 2)’)
不再有效,并且您将获得 N st_as二进制(未知)不是唯一错误
。这样的代码需要更改为 ST_AsBinary(‘point(1 2)’::Geomety);
。如果这是不可能的,则安装 legacy.sql
。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.1
This method implements the SQL/MM specification. SQL-MM 3:5.1.37
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the 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)
;
返回 扩展的熟知二进制 (EWKB)具有SRID元数据的几何图形的表示。第一个函数变量默认为使用服务器端进行编码。第二个函数变量接受一个文本参数,指定字节顺序编码,可以是小端(‘ndr’)或大端(‘xdr’)。
WKB格式对于从数据库中读取几何图形数据并保持完全的数值精度非常有用。这避免了使用文本格式(如WKT)时可能发生的精确舍入。
要执行EWKB到PostGIS几何的逆转换,请使用 ST_GeomFromEWKB 。
![]() | |
要获取OGC/ISO WKB格式,请使用 ST_AsBinary 。请注意,OGC/ISO WKB格式不包括SRID。 |
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 — 从线串几何图形返回编码的多段线。
text ST_AsEncodedPolyline(
geometry geom, integer precision=5)
;
将几何图形作为编码的多段线返回。精度为5的Google Maps和精度为5和6的Open Source Routing Machine使用此格式。
可选 精度
指定将在编码多段线中保留的小数位数。编码和解码的值应该是相同的,否则坐标会错误。
可用性: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;
当您用查询结果替换$VARIABLE时,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)
;
返回FlatGeobuf表示形式( http://flatgeobuf.org )对应于FeatureCollection的一组行。注意:PostgreSQL字节不能超过1 GB。
划
至少包含一个几何图形列的行数据。
索引
切换空间索引创建。默认值为FALSE。
geom_name
行数据中几何图形列的名称。如果为空,则默认为找到的第一个几何图形列。
可用性:3.2.0
ST_AsGeobuf — 返回一组行的Geobuf表示形式。
bytea ST_AsGeobuf(
anyelement set row)
;
bytea ST_AsGeobuf(
anyelement row, text geom_name)
;
返回Geobuf表示形式( https://github.com/mapbox/geobuf )对应于FeatureCollection的一组行。对每个输入几何图形进行分析,以确定最佳存储的最大精度。请注意,当前形式的Geobuf不能流传输,因此完整的输出将在内存中汇编。
划
至少包含一个几何图形列的行数据。
geom_name
行数据中几何图形列的名称。如果为空,则默认为找到的第一个几何图形列。
可用性:2.4.0
ST_AsGeoJSON — 将几何图形作为GeoJSON元素返回。
text ST_AsGeoJSON(
record feature, text geomcolumnname, integer maxdecimaldigits=9, boolean pretty_bool=false)
;
text ST_AsGeoJSON(
geometry geom, integer maxdecimaldigits=9, integer options=8)
;
text ST_AsGeoJSON(
geography geog, integer maxdecimaldigits=9, integer options=0)
;
将几何图形作为GeoJSON“几何图形”返回,或将行作为GeoJSON“要素”返回。(请参阅 GeoJSON规范RFC 7946 )。同时支持2D和3D几何图形。GeoJSON仅支持SFS 1.1几何体类型(例如,不支持曲线)。
这个 最大小数位数
参数可用于减少输出中使用的最大小数位数(默认为9)。如果您使用的是EPSG:4326并且输出的几何图形仅用于显示, 最大小数位数
=6对于许多贴图来说可能是一个很好的选择。
![]() | |
使用 |
这个 选项
参数可用于在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(默认)
GeoJSON规范规定,使用右手规则来确定多边形的方向,有些客户端要求使用此方向。这可以通过使用 ST_ForcePolygonCCW 。该规范还要求几何图形采用WGS84坐标系(SRID=4326)。如有必要,可以使用将几何图形投影到WGS84中 ST_Transform : ST_Transform(geom,4326)
。
GeoJSON可在线测试和查看,网址为 geojson.io 和 geojsonlint.com 。它得到了Web地图框架的广泛支持:
可用性:1.3.4
可用性:引入了1.5.0地理支持。
已更改:2.0.0支持默认参数和命名参数。
更改:3.0.0支持记录作为输入
已更改:3.0.0如果不是EPSG:4326,则输出SRID。
This function supports 3d and will not drop the z-index.
生成FeatureCollection:
SELECT json_build_object( 'type', 'FeatureCollection', 'features', json_agg(ST_AsGeoJSON(t.*)::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”,“Feature”:[{“type”:“Feature”,“geomety”:{“type”:“Point”,“coels”:[1,1]},“Properties”:{“id”:1,“name”:“one”}},{“type”:“Feature”,“geomety”:{“type”:“Point”,“coels”:[2,2]},“Properties”:{“id”:2,“名称”:“二”}},{“类型”:“要素”,“几何”:{“类型”:“点”,“坐标”:[3,3]},“属性”:{“id”:3,“名称”:“三”}}]}
生成特征:
SELECT ST_AsGeoJSON(t.*) FROM (VALUES (1, 'one', 'POINT(1 1)'::geometry)) AS t(id, name, geom);
st_asgeojson ----------------------------------------------------------------------------------------------------------------- {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "properties": {"id": 1, "name": "one"}}
使用生成要素的另一种方法 ID号
属性是使用JSONB函数和运算符:
SELECT jsonb_build_object( 'type', 'Feature', 'id', id, 'geometry', ST_AsGeoJSON(geom)::jsonb, 'properties', to_jsonb( t.* ) - 'id' - 'geom' ) AS json FROM (VALUES (1, 'one', 'POINT(1 1)'::geometry)) AS t(id, name, geom);
json ----------------------------------------------------------------------------------------------------------------- {"id": 1, "type": "Feature", "geometry": {"type": "Point", "coordinates": [1, 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”:“线串”,“坐标”:[[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)元素返回。Version参数(如果指定)可以是2或3。如果未指定Version参数,则默认为2。 最大小数位数
参数可用于减少输出中使用的最大小数位数(默认为15)。
![]() | |
使用 |
GML 2指2.1.2版,GML 3指3.1.1版
‘Options’参数是一个位字段。它可用于在GML输出中定义CRS输出类型,并将数据声明为经度/经度:
0:GML短CRS(如EPSG:4326),默认值
1:GML长CRS(例如urn:ogc:def:crs:epsg::4326)
2:仅适用于GML 3,从输出中删除srsDimension属性。
4:仅适用于GML 3,使用 < LineString > 而不是 < 曲线 > 行的标记。
16:声明数据是晚/长的(例如,sRID=4326)。默认情况下,假定数据为Planars。此选项仅适用于与轴顺序相关的GML 3.1.1输出。因此,如果您设置它,它将交换坐标,以便稍后排序,而不是稍后更改数据库。
32:输出几何体(封套)的长方体。
‘Namespace Prefix’参数可用于指定自定义命名空间前缀或无前缀(如果为空)。如果使用的是NULL或省略的‘GML’前缀
可用性:1.3.2
可用性:引入了1.5.0地理支持。
增强:引入了2.0.0前缀支持。引入了GML3的选项4,以允许对线使用线串而不是曲线标记。介绍了GML3对多面体曲面和三角网的支持。引入了选项32来输出箱。
已更改:2.0.0使用默认命名参数
增强:为GML 3引入了2.1.0id支持。
![]() | |
只有版本3+的ST_AsGML支持多面体曲面和三角网。 |
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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,默认命名空间为无前缀。
![]() | |
使用 |
![]() | |
需要在支持项目的情况下编译PostGIS。使用 PostGIS_Full_Version 以确认您已编译了项目支持。 |
![]() | |
可用性:1.2.2-1.3.2中包含版本参数的更高版本 |
![]() | |
增强:2.0.0-添加前缀命名空间,使用默认和命名参数 |
![]() | |
已更改:3.0.0-删除了“Versioned”变体签名 |
![]() | |
AsKML输出将不适用于没有SRID的几何 |
This function supports 3d and will not drop the 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_AsMVTGeom — 将几何图形变换到 地图框向量平铺 。
geometry ST_AsMVTGeom(
geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true)
;
将几何图形变换到 地图框向量平铺 对应于某一层的一组行。尽最大努力保持甚至纠正有效性,并可能在此过程中将几何图形折叠到较低的维度。
几何图形
是要变换的几何体。
边界
是无缓冲区的平铺内容的几何边界。
程度
是由定义的切片坐标空间中的切片范围 规格 。如果为空,则默认为4096。
缓冲层
平铺坐标空间中的缓冲区距离,可选择剪裁几何图形。如果为空,则默认为256。
clip_geom
是一个布尔值,用于控制几何图形是否应按原样进行剪裁或编码。如果为空,则默认为真。
可用性: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)))
ST_AsMVT — 返回一组行的MapBox向量平铺表示形式的聚合函数。
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)
;
返回二进制数的聚合函数 地图框向量平铺 对应于平铺层的一组行的表示。行应该包含一个几何图形列,该列将被编码为要素几何图形。几何图形应在平铺坐标空间中,并根据 MVT规范 。 ST_AsMVTGeom 可用于将几何体转换为平铺坐标空间。其他行列被编码为特征属性。
这个 地图框向量平铺 格式可以存储具有不同属性集的要素。要使用此功能,请在包含一级Json对象的行数据中提供一个JSONB列。JSONB值中的键和值将被编码为功能属性。
通过使用串联对此函数的多个调用,可以创建具有多个图层的切片 ||
或 STRING_AGG
。
![]() | |
不要用电话呼叫 |
划
至少包含一个几何图形列的行数据。
名字
是层的名称。DEFAULT是字符串“Default”。
程度
是规范定义的屏幕空间中的平铺范围。默认为4096。
geom_name
行数据中几何图形列的名称。默认为第一个几何图形列。请注意,默认情况下,PostgreSQL会自动 将未加引号的标识符折换成小写 这意味着除非用引号引用几何图形列,例如 “MyMVTGeom”
,则此参数必须以小写形式提供。
feature_id_name
是行数据中的要素ID列的名称。如果为空或负,则不设置功能ID。匹配名称和有效类型(Smallint、INTEGER、BIGINT)的第一列将用作功能ID,后续任何列都将作为属性添加。不支持JSON属性。
增强版:3.0-新增对功能ID的支持。
增强:2.5.0新增支持并行查询。
可用性:2.4.0
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’为1时,将呈现为x/y。多点几何图形由逗号(“,”)分隔,GeometryCollection几何图形由分号(“;”)分隔。
![]() | |
可用性:1.2.2。可用性:在PostGIS 1.4.0中对1.4.0进行了更改,在绝对路径中包含L命令以符合 Http://www.w3.org/TR/SVG/paths.html#PathDataBNF |
已更改:2.0.0以使用默认参数并支持命名参数
ST_AsTWKB — 将几何图形返回为TWKB,也称为“极小的熟知二进制”
bytea ST_AsTWKB(
geometry g1, integer decimaldigits_xy=0, integer decimaldigits_z=0, integer decimaldigits_m=0, boolean include_sizes=false, boolean include_bounding boxes=false)
;
bytea ST_AsTWKB(
geometry[] geometries, bigint[] unique_ids, integer decimaldigits_xy=0, integer decimaldigits_z=0, integer decimaldigits_m=0, boolean include_sizes=false, boolean include_bounding_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对象,首先使用“arrayagg()”聚合所需的几何图形和对象,然后调用适当的TWKB函数。
SELECT ST_AsTWKB(array_agg(geom), array_agg(gid)) FROM mytable; st_astwkb -------------------------------------------- \x040402020400000202
ST_AsX3D — 返回X3DXML节点元素格式的几何图形:ISO-IEC-19776-1.2-X3DEncoding-xml
text ST_AsX3D(
geometry g1, integer maxdecimaldigits=15, integer options=0)
;
将几何作为X3D XML格式的节点元素返回 http://www.web3d.org/standards/number/19776-1 。如果 最大小数位数
(精度)未指定,则默认为15。
![]() | |
将PostGIS几何图形转换为X3D有多种选择,因为X3D几何图形类型不直接映射到PostGIS几何图形类型和一些较新的X3D类型,这些类型可能是我们避免的更好的映射,因为大多数渲染工具目前不支持它们。这些是我们已经确定的映射。如果您对我们的想法或方法有任何想法,或者我们可以让人们指明他们喜欢的映射,请随时发布错误罚单。 下面是我们当前如何将PostGIS 2D/3D类型映射到X3D类型 |
‘Options’参数是一个位字段。对于PostGIS 2.2+,这用于指示是否使用X3D地理坐标地理空间节点来表示坐标,以及是否翻转x/y轴。默认情况下, ST_AsX3D
数据库形式的输出(Long,Lat或X,Y),但X3D默认的经度/经度,y/x可能是首选。
0:数据库顺序中的X/Y(例如,LONG/LAT=X,Y是标准数据库顺序)、默认值和非空间坐标(只是常规的旧坐标标记)。
1:翻转X和Y。如果与地理坐标选项开关一起使用,则输出将是默认的“Latitude_First”,坐标也将被翻转。
2:以地理空间地理坐标形式输出坐标。如果几何图形不在WGS 84 Long Late(SRID:4326)中,则此选项将引发错误。这是目前唯一受支持的地理坐标类型。 请参考指定空间参考系的X3D等级库。 。默认输出将为 地理坐标地理系统=‘“GD”“WE”“经度优先”’
。如果您更喜欢X3D缺省值 地理坐标地理系统=‘“GD”“WE”“纬度_First”’
使用 (2+1)
= 3
邮政编码类型 | 2D X3D类型 | 3D X3D类型 |
---|---|---|
LINESTRING | 尚未实施-将为PolyLine2D | LineSet |
MULTILINESTRING | 尚未实施-将为PolyLine2D | IndexedLineSet |
MULTIPOINT | 多点二维 | PointSet |
POINT | 输出以空格分隔的坐标 | 输出以空格分隔的坐标 |
(多)多边形、多面体曲面 | 无效的X3D标记 | IndexedFaceSet(内环当前作为另一个面输出) |
TIN | TriangleSet2D(尚未实现) | IndexedTriangleSet |
![]() | |
二维几何图形支持尚未完成。内环当前仅绘制为单独的多边形。我们正在努力解决这些问题。 |
在3D空间中发生了许多进步,特别是 X3D与HTML5的集成
还有一个很好的开源X3D查看器,可以用来查看渲染的几何图形。免费WRL http://freewrl.sourceforge.net/ 可用于Mac、Linux和Windows的二进制文件。使用打包的FreeWRL_Launcher查看几何图形。
还可以结账 PostGIS极简主义X3D查看器 利用此函数并 X3dDom html/js开源工具包 。
可用性:2.0.0:ISO-IEC-19776-1.2-X3D编码-可扩展标记语言
增强:2.2.0:支持地理坐标和轴(x/y,经度/经度)翻转。请查看选项以了解详细信息。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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表示形式( http://en.wikipedia.org/wiki/Geohash )。GeoHash将点编码为文本形式,该文本形式可基于前缀进行排序和搜索。较短的GeoHash表示点的精确度较低。它也可以被认为是一个盒子,其中包含实际的点。
如果没有 Maxchars
指定ST_GeoHash将根据输入几何图形类型的全精度返回GeoHash。Points返回一个包含20个字符精度的GeoHash(大约足以保持输入的两倍精度)。其他类型根据要素的大小返回具有可变精度的GeoHash。较大的要素以较低的精度表示,较小的要素以较高的精度表示。其想法是,由GeoHash暗示的框将始终包含输入特性。
如果 Maxchars
被指定为ST_GeoHash将返回最多包含相同字符的GeoHash,因此输入几何图形的表示精度可能较低。对于非点,计算的起点是几何图形边界框的中心。
可用性:1.4.0
![]() | |
ST_GeoHash不适用于不在地理(经度/经度)坐标中的几何图形。 |
This method supports Circular Strings and Curves
TRUE
如果A的2D边界框与B的2D边界框相交。 TRUE
如果几何体的(缓存)2D边界框与2D浮点精度边界框(BOX2DF)相交。 TRUE
如果2D浮点精度边界框(BOX2DF)与几何体的(缓存)2D边界框相交。 TRUE
如果两个2D浮点精度边界框(BOX2DF)彼此相交。 TRUE
如果A的n维边界框与B的n维边界框相交。 TRUE
如果几何体的(缓存)n维边界框与n维浮点精度边界框(GIDX)相交。 TRUE
如果n维浮点精度边界框(GIDX)与几何体的(缓存)n维边界框相交。 TRUE
如果两个n维浮点精度边界框(GIDX)彼此相交。 TRUE
如果A的边界框与B的边界框重叠或在B的左侧。 TRUE
如果A的边界框重叠或低于B的边界框。 TRUE
如果A‘边界框重叠或在B边界框的右侧。 TRUE
如果A的边界框严格位于B的左侧。 TRUE
如果A的包围盒严格低于B的包围盒。 TRUE
如果几何/地理A的坐标和坐标顺序与几何/地理B的坐标和坐标顺序相同。 TRUE
如果A的边界框严格位于B的右侧。 TRUE
如果A的包围盒包含在B的包围盒中。 TRUE
如果几何体的2D边界框包含在2D浮点精度边界框(BOX2DF)中。 TRUE
如果将2D浮点精度边界框(BOX2DF)包含在几何体的2D边界框中。 TRUE
如果一个2D浮点精度边界框(BOX2DF)包含在另一个2D浮点精度边界框中。 TRUE
如果A的边界框与B的边界框重叠或在B的边界框之上。 TRUE
如果A的边界框严格高于B的边界框。 TRUE
如果A的包围盒包含B。 TRUE
如果几何体的2D粘合框包含2D浮点精度边界框(GIDX)。 TRUE
如果2D浮点精度边界框(BOX2DF)包含几何图形的2D粘合框。 TRUE
如果一个2D浮点精度边界框(BOX2DF)包含另一个2D浮点精度边界框(BOX2DF)。 TRUE
如果A的边界框与B的边界框相同。& & — 退货 TRUE
如果A的2D边界框与B的2D边界框相交。
boolean &&(
geometry A , geometry B )
;
boolean &&(
geography A , geography B )
;
这个 & &
运算符返回 TRUE
如果几何图形A的二维边界框与几何图形B的二维边界框相交。
![]() | |
此操作数将使用几何图形上可用的任何索引。 |
增强:引入了对多面体曲面的2.0.0支持。
可用性:引入了对地理的1.5.0支持。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
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)
& & (几何体,长方体2df) — 退货 TRUE
如果几何体的(缓存)2D边界框与2D浮点精度边界框(BOX2DF)相交。
boolean &&(
geometry A , box2df B )
;
这个 & &
运算符返回 TRUE
如果缓存的几何体A的2D边界框与2D边界框B相交,则使用浮点精度。这意味着如果B是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
& & (box2df,几何体) — 退货 TRUE
如果2D浮点精度边界框(BOX2DF)与几何体的(缓存)2D边界框相交。
boolean &&(
box2df A , geometry B )
;
这个 & &
运算符返回 TRUE
如果2D边界框A与几何体B的缓存2D边界框相交,则使用浮点精度。这意味着如果A是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
& & (box2df,box2df) — 退货 TRUE
如果两个2D浮点精度边界框(BOX2DF)彼此相交。
boolean &&(
box2df A , box2df B )
;
这个 & &
运算符返回 TRUE
如果两个2D边界框A和B彼此相交,则使用浮点精度。这意味着如果A(或B)是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此运算符旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
& & & — 退货 TRUE
如果A的n维边界框与B的n维边界框相交。
boolean &&&(
geometry A , geometry B )
;
这个 & & &
运算符返回 TRUE
如果几何A的n维边界框与几何B的n维边界框相交。
![]() | |
此操作数将使用几何图形上可用的任何索引。 |
可用性:2.0.0
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the 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
& & & (几何体,gidx) — 退货 TRUE
如果几何体的(缓存)n维边界框与n维浮点精度边界框(GIDX)相交。
boolean &&&(
geometry A , gidx B )
;
这个 & & &
运算符返回 TRUE
如果缓存的几何A的n维边界框与n维边界框B相交,则使用浮点精度。这意味着如果B是(双精度)框3d,则它将在内部转换为浮点精度3D边界框(GIDX)
![]() | |
此运算符旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the z-index.
& & & (gidx,几何体) — 退货 TRUE
如果n维浮点精度边界框(GIDX)与几何体的(缓存)n维边界框相交。
boolean &&&(
gidx A , geometry B )
;
这个 & & &
运算符返回 TRUE
如果n维边界框A与几何图形B的缓存n维边界框相交,则使用浮点精度。这意味着如果A是(双精度)框3d,它将在内部转换为浮点精度3D边界框(GIDX)
![]() | |
此运算符旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the z-index.
& & & (gidx,gidx) — 退货 TRUE
如果两个n维浮点精度边界框(GIDX)彼此相交。
boolean &&&(
gidx A , gidx B )
;
这个 & & &
运算符返回 TRUE
如果两个n维边界框A和B彼此相交,则使用浮点精度。这意味着如果A(或B)是(双精度)框3d,它将在内部转换为浮点精度3D边界框(GIDX)
![]() | |
此运算符旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the z-index.
& < — 退货 TRUE
如果A的边界框与B的边界框重叠或在B的左侧。
boolean &<(
geometry A , geometry 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)
& < | — 退货 TRUE
如果A的边界框重叠或低于B的边界框。
boolean &<|(
geometry A , geometry B )
;
这个 & < |
运算符返回 TRUE
如果几何图形A的边界框与几何图形B的边界框重叠或在其下方,或者更准确地说,与几何图形B的边界框重叠或不在几何图形B的边界框之上。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
![]() | |
此操作数将使用几何图形上可用的任何索引。 |
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)
& > — 退货 TRUE
如果A‘边界框重叠或在B边界框的右侧。
boolean &>(
geometry A , geometry 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)
< < — 退货 TRUE
如果A的边界框严格位于B的左侧。
boolean <<(
geometry A , geometry B )
;
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)
< < | — 退货 TRUE
如果A的包围盒严格低于B的包围盒。
boolean <<|(
geometry A , geometry B )
;
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)
= — 退货 TRUE
如果几何/地理A的坐标和坐标顺序与几何/地理B的坐标和坐标顺序相同。
boolean =(
geometry A , geometry B )
;
boolean =(
geography A , geography B )
;
这个 =
运算符返回 TRUE
如果坐标和坐标顺序几何/地理A与几何/地理B的坐标和坐标顺序相同,则PostgreSQL使用=, < ,以及 > 为几何定义的运算符,用于执行几何的内部排序和比较(即在GROUP BY或ORDER BY子句中)。
![]() | |
只有在所有方面都完全相等、具有相同坐标、相同顺序的几何图形/地理区域才被该运算符视为相等。对于“空间相等”,这忽略了诸如坐标顺序之类的东西,并且可以检测覆盖具有不同表示的相同空间区域的要素,使用 ST_OrderingEquals 或 ST_Equals |
![]() | |
此操作数不会使用几何图形上可能可用的任何索引。对于索引辅助的精确相等测试,请组合 = 使用 & & 。 |
已更改:2.4.0,在以前的版本中,这是边界框相等,而不是几何相等。如果需要边界框相等,请使用 ~= 取而代之的是。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
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
> > — 退货 TRUE
如果A的边界框严格位于B的右侧。
boolean >>(
geometry A , geometry B )
;
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)
@ — 退货 TRUE
如果A的包围盒包含在B的包围盒中。
boolean @(
geometry A , geometry B )
;
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)
@(几何体,长方体2df) — 退货 TRUE
如果几何体的2D边界框包含在2D浮点精度边界框(BOX2DF)中。
boolean @(
geometry A , box2df B )
;
这个 @
运算符返回 TRUE
如果A几何体的2D边界框包含2D边界框B,则使用浮点精度。这意味着如果B是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
@(box2df,几何体) — 退货 TRUE
如果将2D浮点精度边界框(BOX2DF)包含在几何体的2D边界框中。
boolean @(
box2df A , geometry B )
;
这个 @
运算符返回 TRUE
如果2D边界框A包含在B几何体的2D边界框中,则使用浮点精度。这意味着如果B是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
@(box2df,box2df) — 退货 TRUE
如果一个2D浮点精度边界框(BOX2DF)包含在另一个2D浮点精度边界框中。
boolean @(
box2df A , box2df B )
;
这个 @
运算符返回 TRUE
如果2D边界框A包含在2D边界框B中,则使用浮点精度。这意味着如果A(或B)是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
| & > — 退货 TRUE
如果A的边界框与B的边界框重叠或在B的边界框之上。
boolean |&>(
geometry A , geometry B )
;
这个 | & >
运算符返回 TRUE
如果几何图形A的边界框与几何图形B的边界框重叠或位于几何图形B的边界框之上,或者更准确地说,与几何图形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)
| > > — 退货 TRUE
如果A的边界框严格高于B的边界框。
boolean |>>(
geometry A , geometry B )
;
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)
~ — 退货 TRUE
如果A的包围盒包含B。
boolean ~(
geometry A , geometry B )
;
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)
~(几何体,长方体2df) — 退货 TRUE
如果几何体的2D粘合框包含2D浮点精度边界框(GIDX)。
boolean ~(
geometry A , box2df B )
;
这个 ~
运算符返回 TRUE
如果几何图形A的二维边界框包含二维边界框B,则使用浮点精度。这意味着如果B是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
~(box2df,几何体) — 退货 TRUE
如果2D浮点精度边界框(BOX2DF)包含几何图形的2D粘合框。
boolean ~(
box2df A , geometry B )
;
这个 ~
运算符返回 TRUE
如果2D边界框A包含B几何体的边界框,则使用浮点精度。这意味着如果A是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
~(box2df,box2df) — 退货 TRUE
如果一个2D浮点精度边界框(BOX2DF)包含另一个2D浮点精度边界框(BOX2DF)。
boolean ~(
box2df A , box2df B )
;
这个 ~
运算符返回 TRUE
如果二维边界框A包含二维边界框B,则使用浮点精度。这意味着如果A是(双精度)框2d,它将在内部转换为浮点精度2D边界框(BOX2DF)
![]() | |
此操作数旨在供Brin索引内部使用,而不是供用户使用。 |
可用性:2.3.0推出了对数据块范围索引(Brin)的支持。需要PostgreSQL 9.5+。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
~= — 退货 TRUE
如果A的边界框与B的边界框相同。
boolean ~=(
geometry A , geometry B )
;
这个 ~=
运算符返回 TRUE
如果几何/地理A的边界框与几何/地理B的边界框相同。
![]() | |
此操作数将使用几何图形上可用的任何索引。 |
可用性:1.5.0更改的行为
This function supports Polyhedral surfaces.
![]() | |
此操作符已将PostGIS 1.5中的行为从测试实际几何相等更改为仅检查边界框相等。让事情变得复杂的是,它还取决于您是否进行了硬升级或软升级,您的数据库具有哪些行为。要找出您的数据库具有哪种行为,可以运行下面的查询。要检查是否真的相等,请使用 ST_OrderingEquals 或 ST_Equals 。 |
< - > — 返回A和B之间的2D距离。
double precision <->(
geometry A , geometry B )
;
double precision <->(
geography A , geography B )
;
这个 < - >
运算符返回两个几何图形之间的2D距离。在“ORDER BY”子句中使用提供索引辅助的最近邻结果集。对于低于9.5的PostgreSQL,仅提供边界框的质心距离,对于PostgreSQL 9.5+,执行True KNN距离搜索,提供几何图形之间的真实距离,以及地理的距离球体。
![]() | |
此操作数将使用几何图形上可能可用的2D Gist索引。它与其他使用空间索引的运算符的不同之处在于,仅当运算符位于ORDER BY子句中时才使用空间索引。 |
![]() | |
仅当其中一个几何图形是常量(不在子查询/CTE中)时,索引才起作用。例如:‘SRID=3005;POINT(1011102 450541)’::几何图形而不是a.geom |
请参阅 PostGIS专题讨论会:最近邻搜索 查看详细的示例。
增强:2.2.0--PostgreSQL 9.5+的几何和地理的True KNN(“K近邻”)行为。请注意,KNN是基于球面而不是椭球体的。对于PostgreSQL 9.4和更低版本,地理支持是新的,但只支持质心框。
更改:2.2.0--对于PostgreSQL9.5用户,旧的混合语法可能会更慢,所以如果您只在PostGIS2.2+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 ANALYSE”,您将看到第二个查询的性能有所提高。
适用于运行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)’::几何图形而不是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-D距离。
double precision <<->>(
geometry A , geometry B )
;
< < # > > — 返回A和B边界框之间的n-D距离。
double precision <<#>>(
geometry A , geometry B )
;
ST_3DIntersects — 如果两个几何图形在三维空间上相交,则返回TRUE-仅对于点、线串、多边形、多面体曲面(面积)。
boolean ST_3DIntersects(
geometry geomA , geometry geomB )
;
重叠、接触、内部都暗示着空间的交集。如果上述任一项返回TRUE,则这些几何图形在空间上也相交。对于空间相交,不相交意味着FALSE。
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
更改:3.0.0 SFCGAL后端已删除,GEOS后端支持TIN。
可用性:2.0.0
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This method is also provided by SFCGAL backend.
This method implements the SQL/MM specification. SQL-MM 3:?
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)
ST_Contains — 如果B的点都不在A的外部,并且A和B至少有一个内点相同,则返回TRUE。
boolean ST_Contains(
geometry geomA, geometry geomB)
;
如果几何图形B完全在几何图形A中,则返回TRUE。当且仅当B的点不在A的外部且B的内部至少有一个点在A的内部时,A包含B。
这个定义的一个微妙之处在于,一个几何图形在其边界内不包含任何东西。因此,面和线可以 不 包含位于其边界内的线和点。有关更多详细信息,请参阅 OGC封面的精妙之处,包含,内 。( ST_Covers 谓词提供了更具包容性的关系。)但是,几何体确实包含其自身。(相比之下,在 ST_ContainsProperly 谓词几何体所做的 不 适当地控制自己。)
ST_CONTAINS是 ST_Within 。所以, ST_包含(A,B)=ST_在(B,A)内
。
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 要避免使用索引,请使用函数 |
由GEOS模块执行
增强:2.3.0对PIP短路的增强扩展到支持多点和少点。以前的版本仅支持多边形中的点。
![]() | |
增强:已启用3.0.0支持 |
![]() | |
请勿对无效的几何图形使用此函数。你会得到意想不到的结果。 |
注意:这是“允许的”版本,返回布尔值,而不是整数。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3-与内(几何图形B、几何图形A)相同
This method implements the SQL/MM specification. SQL-MM 3:5.1.31
ST_Contains
退货 TRUE
在下列情况下:
![]()
| ![]()
|
![]()
| ![]()
|
这个 ST_Contains
谓词返回 FALSE
在下列情况下:
![]()
| ![]()
|
-- 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的内部相交,但不与边界或外部相交,则返回TRUE。
boolean ST_ContainsProperly(
geometry geomA, geometry geomB)
;
如果B与A的内部相交,但不与边界或外部相交,则返回TRUE。
A没有适当地包含它自己,但它确实包含它自己。
其他几何体的每个点都是该几何体内部的一个点。两个几何的DE-9IM交集矩阵与中使用的[T**FF*FF*]匹配 ST_Relate
此谓词的一个示例用例是计算一组几何图形与一个大型多边形几何图形的交集。由于交集是一个相当慢的操作,因此使用ContainsProperly过滤掉完全位于区域内的测试几何图形可能会更有效。在这些情况下,交点是已知的先验精确的原始测试几何图形。
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 要避免使用索引,请使用函数 |
![]() | |
这个谓词的优点是 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之外,则返回TRUE
boolean ST_CoveredBy(
geometry geomA, geometry geomB)
;
boolean ST_CoveredBy(
geography geogA, geography geogB)
;
退货 真的
如果几何图形/地理图形A中没有点位于几何图形/地理图形B的外部,则测试几何图形A的每个点是否都在几何图形B的内部(即,与几何图形B的内部或边界相交)。
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 要避免使用索引,请使用函数 |
![]() | |
增强:已启用3.0.0支持 |
![]() | |
请勿对无效的几何图形使用此函数。你会得到意想不到的结果。 |
由GEOS模块执行
可用性:1.2.2
注意:这是“允许的”版本,返回布尔值,而不是整数。
不是OGC标准,但甲骨文也有。
--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之外,则返回TRUE
boolean ST_Covers(
geometry geomA, geometry geomB)
;
boolean ST_Covers(
geography geogpolyA, geography geogpointB)
;
退货 真的
如果几何图形/地理图形B中没有点在几何图形/地理图形A的外部,则测试几何图形B的每个点是否都在几何图形A的内部(即,与几何图形A的内部或边界相交)。
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 要避免使用索引,请使用函数 |
![]() | |
增强:已启用3.0.0支持 |
![]() | |
请勿对无效的几何图形使用此函数。你会得到意想不到的结果。 |
由GEOS模块执行
增强:2.4.0为地理类型添加了对面中的面和面中的线的支持
增强:2.3.0增强到PIP短路,几何体扩展到支持多点和少点。以前的版本仅支持多边形中的点。
可用性:1.5-引入了对地理位置的支持。
可用性:1.2.2
注意:这是“允许的”版本,返回布尔值,而不是整数。
不是OGC标准,但甲骨文也有。
几何图形示例
--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 — 如果两个几何图形有一些(但不是全部)共有的内部点,则返回True。
boolean ST_Crosses(
geometry g1, geometry g2)
;
ST_Crosses
获取两个几何对象并返回 真的
如果它们的交叉点在空间上是交叉的,也就是说,几何图形有一些但不是所有的内部点是共同的。几何图形内部的交点不能是空集,并且其维度必须小于两个输入几何图形的最大尺寸。此外,两个几何图形的交点不能等于任何一个源几何图形。否则,它将返回 错误
。
用数学术语来说,这是:
如果几何的DE-9IM交阵满足以下条件,则它们相交:
T*T* (适用于点/线、点/面和线/面情况)
T*T** (适用于线/点、面/点和面/线情况)
0* (适用于线路/线路情况)
对于点/点和面/面的情况,此谓词返回 错误
。
OpenGIS简单要素规范仅为点/线、点/面、线/线和线/面情况定义了此谓词。JTS/GEOS将该定义扩展到适用于线/点、面/点和面/线的情况。这使关系成为对称的。
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
![]() | |
增强:已启用3.0.0支持 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.13.3
This method implements the SQL/MM specification. 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 — 如果两个几何图形不相交(它们没有共同点),则返回True。
boolean ST_Disjoint(
geometry A , geometry B )
;
重叠、接触,所有这些都意味着几何图形在空间上不是不相交的。如果上述任一项返回TRUE,则这些几何图形在空间上不是不相交的。对于空间相交,不相交意味着FALSE。
![]() | |
增强:已启用3.0.0支持 |
由GEOS模块执行
![]() | |
此函数调用不使用索引 |
![]() | |
注意:这是“允许的”版本,返回布尔值,而不是整数。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3-a.Relate(b,‘Ff*Ff*’)
This method implements the SQL/MM specification. SQL-MM 3:5.1.26
ST_Equals — 如果两个几何图形包含相同的点集,则返回True。
boolean ST_Equals(
geometry A, geometry B)
;
如果给定的几何图形“在空间上相等”,则返回True。使用此选项可以得到比‘=’更好的答案。注意,我们所说的空间相等是指ST_WITHING(A,B)=TRUE和ST_WITHING(B,A)=TRUE,并且点的平均排序可以是不同的,但表示相同的几何结构。要验证点的顺序是否一致,请使用ST_OrderingEquals(必须注意,ST_OrderingEquals比简单地验证点的顺序相同稍微严格一些)。
![]() | |
增强:已启用3.0.0支持 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.2
This method implements the SQL/MM specification. SQL-MM 3:5.1.24
已更改:即使对于无效几何,如果它们是二进制相等的,2.2.0也会返回TRUE
ST_Intersects — 如果两个几何图形相交(它们至少有一个共同点),则返回True。
boolean ST_Intersects(
geometry geomA , geometry geomB )
;
boolean ST_Intersects(
geography geogA , geography geogB )
;
如果几何图形或地理图形共享任何部分的空间,则它们相交。对于地理位置--公差为0.00001米(因此任何接近的点都被认为是相交的)
ST_Overlaps、ST_Touches、ST_In都隐含着空间交集。如果上述任一项返回TRUE,则这些几何图形在空间上也相交。对于空间相交,不相交意味着FALSE。
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
更改:删除了3.0.0 SFCGAL版本,并添加了对2D TIN的本地支持。
增强:2.5.0支持GEOMETRYCOLLECTION。
增强:2.3.0对PIP短路的增强扩展到支持多点和少点。以前的版本仅支持多边形中的点。
由GEOS模块(用于几何)执行,地理是原生的
可用性:1.5引入了对地理位置的支持。
![]() | |
对于地理,此函数的距离公差约为0.00001米,并使用球体而不是椭球体计算。 |
![]() | |
注意:这是“允许的”版本,返回布尔值,而不是整数。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3-ST_Intersects(G1,G2)-- > NOT(ST_DISCOCT(G1,G2))
This method implements the SQL/MM specification. SQL-MM 3:5.1.27
This method supports Circular Strings and Curves
This function supports Triangles and Triangulated Irregular Network Surfaces (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)
ST_LineCrossingDirection — 返回一个数字,该数字指示两个LineStrings的交叉行为。
integer ST_LineCrossingDirection(
geometry linestringA, geometry linestringB)
;
给定的两个行字符串返回一个介于-3和3之间的整数,指示它们之间存在哪种交叉行为。0表示无交叉。仅在以下情况下才支持 LINESTRING
s.
交叉号的含义如下:
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
示例: 线多点左端和线多点右端
蓝色: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, 2.99 90.16)') 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 — 如果两个几何图形表示相同的几何图形并且具有相同方向顺序的点,则返回True。
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 |
This method implements the SQL/MM specification. 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 — 如果两个几何图形相交且具有相同的尺寸,但不完全包含在彼此之间,则返回True。
boolean ST_Overlaps(
geometry A, geometry B)
;
如果几何图形A和B在空间上重叠,则返回TRUE。如果两个几何图形具有相同的尺寸,每个几何图形至少有一个点不被另一个几何图形共享(或者等价地,两个几何图形都不覆盖另一个),并且它们内部的交点具有相同的尺寸,则两个几何图形重叠。这种重叠关系是对称的。
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 要避免使用索引,请使用函数 |
由GEOS模块执行
![]() | |
增强:已启用3.0.0支持 |
注意:这是“允许的”版本,返回布尔值,而不是整数。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3
This method implements the SQL/MM specification. SQL-MM 3:5.1.32
ST_Overlaps
退货 TRUE
在下列情况下:
![]()
| ![]()
| ![]()
|
包含线串上的点,但由于它的尺寸较低,因此不会重叠或交叉。
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)
;
这些函数允许测试和评估两个几何之间的空间(拓扑)关系,如 量纲扩展的9交点模型 (de-9IM)。
DE-9IM被指定为9元素矩阵,指示两个几何图形的内部、边界和外部的交点的尺寸。它由9个字符的文本字符串表示,使用符号‘F’、‘0’、‘1’、‘2’(例如 ‘FF1FF0102’
)。
通过将交集矩阵与 交集矩阵模式 。模式可以包括附加符号‘T’和‘*’。通用空间关系由命名函数提供 ST_Contains , ST_ContainsProperly , ST_Covers , ST_CoveredBy , ST_Crosses , ST_Disjoint , ST_Equals , ST_Intersects , ST_Overlaps , ST_Touches ,以及 ST_Within 。使用显式模式允许在一步中测试交叉点、十字等的多个条件。它还允许测试不具有命名空间关系功能的空间关系。例如,关系“Internal-Intersects”具有DE-9IM模式 T*
,它不会由任何命名谓词求值。
有关更多信息,请参阅 Section 5.1, “确定空间关系” 。
变体1: 测试两个几何图形是否根据给定的 交集MatrixPattern
。
![]() | |
与大多数命名空间关系谓词不同,这不会自动包括索引调用。原因是某些关系对于不相交的几何图形是正确的(例如,不相交)。如果您正在使用需要交集的关系模式,则包括 & & 索引调用。 |
![]() | |
最好使用命名关系函数(如果可用),因为它们会自动使用存在的空间索引。此外,它们可能会实现完全关联计算中不可用的性能优化。 |
变体2: 返回两个输入几何图形之间的空间关系的DE-9IM矩阵字符串。可以使用以下命令测试矩阵字符串是否与DE-9IM模式匹配 ST_RelateMatch 。
变体3: 与变体2类似,但允许指定 边界结点规则 。边界节点规则允许更精细地控制几何图形边界点是否被视为位于DE-9IM内部或边界。这个 边界结点规则
代码为:1:OGC/MOD2,2:Endpoint,3:MultivalentEndpoint,4:MonovalentEndpoint。
此功能不在OGC规范中,但是隐含的。见s2.1.13.2
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3
This method implements the SQL/MM specification. 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)); st_relate ----------- 0FFFFF212 SELECT ST_Relate( 'LINESTRING(1 2, 3 4)', 'LINESTRING(5 6, 7 8)' ); st_relate ----------- FF1FF0102
ST_RelateMatch — 测试DE-9IM交集矩阵是否与交集矩阵模式匹配
boolean ST_RelateMatch(
text intersectionMatrix, text intersectionMatrixPattern)
;
测试是否存在 量纲扩展的9交点模型 (De-9IM) 交集矩阵
值满足 交集MatrixPattern
。交集矩阵值可以通过以下方式计算 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 — 如果两个几何图形至少有一个共同点,但其内部不相交,则返回True。
boolean ST_Touches(
geometry A, geometry B)
;
退货 TRUE
如果A和B相交,但它们的内部不相交。等价地,A和B至少有一个共同点,并且公共点位于至少一个边界内。对于点/点输入,关系始终为 FALSE
,因为点没有边界。
用数学术语来说,这种关系是:
如果两个几何图形的DE-9IM交集矩阵与以下其中之一匹配,则此关系成立:
FT*
F**T*
F*T*
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 若要避免使用索引,请使用 |
![]() | |
增强:已启用3.0.0支持 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3
This method implements the SQL/MM specification. 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的外部,并且A和B至少有一个内点相同,则返回TRUE。
boolean ST_Within(
geometry A, geometry B)
;
如果几何图形A完全位于几何图形B内,则返回TRUE。要使此函数有意义,源几何图形必须具有相同的坐标投影,且具有相同的SRID。可以肯定的是,如果ST_in(A,B)为真,ST_in(B,A)为真,则认为这两个几何空间相等。
此定义的一个微妙之处在于,几何体的边界不在该几何体内。这意味着位于面或线边界内的线和点 不 在几何体内。有关更多详细信息,请参阅 OGC封面的精妙之处,包含,内 。( ST_CoveredBy 谓词提供了更具包容性的关系)。
ST_WITHING是的反方向 ST_Contains 。所以, ST_WINDOWS(A,B)=ST_CONTAINS(B,A)
。
![]() | |
This function automatically includes a bounding box comparison
that makes use of any spatial indexes that are available on the geometries. 要避免使用索引,请使用函数 |
由GEOS模块执行
增强:2.3.0增强到PIP短路,几何体扩展到支持多点和少点。以前的版本仅支持多边形中的点。
![]() | |
增强:已启用3.0.0支持 |
![]() | |
请勿对无效的几何图形使用此函数。你会得到意想不到的结果。 |
注意:这是“允许的”版本,返回布尔值,而不是整数。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S2.1.1.2//s2.1.13.3-a.Relate(b,‘T*F**F*’)
This method implements the SQL/MM specification. 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距离内,则返回True
boolean ST_3DDWithin(
geometry g1, geometry g2, double precision distance_of_srid)
;
如果两个几何值之间的3D距离不大于距离,则返回True distance_of_srid
。距离以几何图形的空间参考系定义的单位指定。要使此函数有意义,源几何图形必须位于相同的坐标系中(具有相同的SRID)。
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This method implements the SQL/MM specification. 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距离内,则返回True
boolean ST_3DDFullyWithin(
geometry g1, geometry g2, double precision distance)
;
如果3D几何图形完全在彼此的指定距离内,则返回True。距离以几何图形的空间参考系定义的单位指定。要使此函数有意义,源几何图形必须具有相同的坐标投影,并且具有相同的SRID。
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
可用性:2.0.0
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
-- 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 — 如果两个几何完全在给定距离内,则返回True
boolean ST_DFullyWithin(
geometry g1, geometry g2, double precision distance)
;
如果几何图形完全在彼此的指定距离内,则返回True。距离以几何图形的空间参考系定义的单位指定。要使此函数有意义,源几何图形必须具有相同的坐标投影,并且具有相同的SRID。
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
可用性:1.5.0
postgis=# 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 (select ST_GeomFromText('POINT(1 1)') as geom_a,ST_GeomFromText('LINESTRING(1 5, 2 7, 1 9, 14 12)') as geom_b) t1; ----------------- DFullyWithin10 | DWithin10 | DFullyWithin20 | ---------------+----------+---------------+ f | t | t |
ST_DWithin — 如果两个几何在给定距离内,则返回True
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
=真。用于更快的评估使用 use_spheroid
=False以在球体上测量。
![]() | |
使用 ST_3DDWithin 用于3D几何图形。 |
![]() | |
此函数调用包括一个边界框比较,它利用几何图形上可用的任何索引。 |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
可用性:引入了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)
;
如果几何是点并且位于圆心的圆内,则返回True center_x
, center_y
和半径 半径
。
![]() | |
不使用空间索引。使用 ST_DWithin 取而代之的是。 |
可用性:1.2
已更改:2.2.0在以前的版本中,这称为ST_Point_Inside_Circle
ST_Length
ST_Perimeter
。ST_Area — 返回多边形几何体的面积。
float ST_Area(
geometry g1)
;
float ST_Area(
geography geog, boolean use_spheroid=true)
;
返回多边形几何体的面积。对于几何图形类型,计算二维笛卡尔(平面)面积,单位由SRID指定。对于地理类型,默认情况下,面积是在单位为平方米的椭球体上确定的。要使用速度较快但精度较低的球形模型计算面积,请使用 ST_Area(Geog,False)
。
增强:2.0.0-引入了对2D多面体曲面的支持。
增强版:2.2.0-使用GeogicLib对椭球体进行测量,以提高精度和稳健性。需要项目 > =4.9.0以利用新功能。
更改:3.0.0-不再依赖SFCGAL。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:8.1.2、9.5.3
This function supports Polyhedral surfaces.
![]() | |
对于多面体曲面,仅支持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;West=3 π /2;西北=7 π /4.
对于地理类型,方位角解称为 测地线反问题 。
方位角是一个数学概念,定义为参考矢量和点之间的角度,角度单位为弧度。可以使用PostgreSQL函数将以弧度为单位的结果值转换为度 度()
。
方位角可以与 ST_Translate 沿垂直轴移动对象。请参阅 Upgis_linesShift()
中的函数 PostGIS维基 来实现这一点。
可用性:1.1.0
增强:引入了对地理位置的2.0.0支持。
增强:2.2.0使用Gegraph Lib对椭球体进行测量,以提高精度和稳健性。需要项目 > =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函数将弧度结果转换为度 度()
。
请注意, ST_角度(P1、P2、P3)=ST_角度(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的二维点。这是从一个几何图形到另一个几何图形的最短直线的第一个点。
geometry ST_ClosestPoint(
geometry geom1, geometry geom2)
;
返回上的二维点 地理位置1
最接近于 地貌2
。这是几何之间最短直线的第一个点(计算方式为 ST_ShortestLine )。
![]() | |
如果您有3D几何,您可能更喜欢使用 ST_3DClosestPoint 。 |
可用性:1.5.0
点和线串的最近点是点本身。直线串和点的最近点是直线上的点。
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最短直线的第一个点。
geometry ST_3DClosestPoint(
geometry g1, geometry g2)
;
返回G1上最接近G2的三维点。这是3D最短直线的第一个点。3D最短直线的3D长度是3D距离。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
可用性:2.0.0
已更改:2.2.0-如果输入2个2D几何图形,则返回2D点(而不是假设缺少Z的行为为0)。在2D和3D的情况下,对于缺失的Z,不再假定Z为0。
线串和点--三维和二维最近点 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)
|
线串和多点--三维和二维最近点 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)
|
三维和二维最近点的多线串和多边形 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)
;
为 几何体 TYPE以投影单位(空间参考单位)返回两个几何图形之间的最小二维笛卡尔(平面)距离。
为 地理学 类型默认为返回两个地理位置之间的最小测地线距离(以米为单位),并根据SRID确定的椭球体进行计算。如果 use_spheroid
为False,则使用更快的球面计算。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:5.1.23
This method supports Circular Strings and Curves
可用性:1.5.0地理支持是在1.5中引入的。改进了平面的速度,以便更好地处理大型或多个顶点几何图形
增强:2.1.0提高了地理位置的速度。看见 让地理操作更快捷 有关详细信息,请参阅。
增强:2.1.0-引入了对曲线几何图形的支持。
增强版:2.2.0-使用GeogicLib对椭球体进行测量,以提高精度和稳健性。需要项目 > =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,与流行的Web地图上的像素成比例)。虽然它的值是OFF,但可以正确地比较附近的值,这使得它成为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(稍后)更正以考虑变形)
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)
;
以投影单位(空间参考单位)返回两个几何图形之间的三维最小笛卡尔距离。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This method implements the SQL/MM specification. SQL-MM?
可用性: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)
;
返回两个经纬点之间的最小距离(以米为单位)。使用球形地球和从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)
;
返回给定特定椭球体的两个经度/纬度几何图形之间的最小距离(以米为单位)。有关椭球体的说明,请参阅 ST_LengthSpheroid 。
![]() | |
此函数不查看几何体的SRID。它假定几何图形坐标基于提供的椭球体。 |
可用性:1.5-引入了对除点之外的其他几何类型的支持。以前的版本仅适用于点。
已更改:2.2.0在以前的版本中,这称为ST_DISTANCE_ESPOID
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参数设置用于加密每个线段的分数。每个分段将被分成多个等长子分段,其在总长度中的分段最接近给定分段。
单位是几何图形的空间参考系的单位。
![]() | |
当前的实现只支持顶点作为离散位置。这可以扩展到允许使用任意密度的点。 |
![]() | |
我们指定的密度越小,得到的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距离是对两个几何图形相似或不相似程度的度量。
该函数实际计算的是“离散Hausdorff距离”。这是在几何图形上的离散点计算的Hausdorff距离。这个 密纹
参数,以便在计算离散Hausdorff距离之前通过加密线段来提供更准确的答案。每个分段被分成多个等长子分段,其分段长度的分段最接近给定分段。
单位是几何图形的空间参考系的单位。
![]() | |
该算法不等同于标准的Hausdorff距离。但是,它计算的近似值对于大部分有用的情况都是正确的。一个重要的例子是线串,它们彼此大致平行,长度大致相等。这是行匹配的有用度量。 |
可用性:1.5.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
我们保证每栋楼只列出一次。 排序依据..ST_Hausdorff距离
选择与建筑最相似的地块。
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)
;
对于几何图形类型:如果几何图形是线串、多重线串、ST_Curve、ST_MultiCurve,则返回该几何图形的二维笛卡尔长度。对于面状几何图形,返回0;使用 ST_Perimeter 取而代之的是。长度单位由几何图形的空间参考系确定。
对于地理类型:使用反测地线计算执行计算。长度单位以米为单位。如果PostGIS是使用Proj版本4.8.0或更高版本编译的,则椭球体由SRID指定,否则由WGS84独占。如果 use_spheroid=false
,则计算基于球体而不是椭球体。
目前,对于几何体,这是ST_Length2D的别名,但这可能会更改以支持更高的维度。
![]() | |
已更改:2.0.0突破性更改--在以前的版本中,将此选项应用于地理类型的多维/多边形将为您提供多边形/多维/多维OLYGON的周长。在2.0.0中,将其更改为返回0以与几何体行为保持一致。如果需要面的周长,请使用ST_PERIMETER |
![]() | |
对于地理学,计算默认使用椭圆形模型。若要使用速度更快但精度较低的球面计算,请使用ST_LENGTH(gg,FALSE); |
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.5.1
This method implements the SQL/MM specification. SQL-MM 3:7.1.2、9.3.4
可用性:1.5.0地理支持是在1.5中引入的。
This method is also provided by SFCGAL backend.
返回以英尺为单位的线条长度。请注意,这是以英尺为单位的,因为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_3DLength — 返回线性几何图形的三维长度。
float ST_3DLength(
geometry a_3dlinestring)
;
如果几何图形是线串或多重线串,则返回几何图形的三维或二维长度。对于2D行,它将仅返回2D长度(与ST_Length2D和ST_Length2D相同)
This function supports 3d and will not drop the z-index.
已更改:2.0.0在以前的版本中,这过去称为ST_Length3D
ST_LengthSpheroid — 返回椭球体上经度/纬度几何图形的二维或三维长度/周长。
float ST_LengthSpheroid(
geometry a_geometry, spheroid a_spheroid)
;
计算椭球体上几何图形的长度或周长。如果几何图形的坐标位于经度/纬度,并且需要长度而不需要重新投影,则此选项非常有用。椭球体由文本值指定,如下所示:
椭球体[ < NAME > , < 半长轴 > , < 反展平 > ]
例如:
SPHEROID["GRS_1980",6378137,298.257222101]
可用性:1.2.2
已更改:2.2.0在以前的版本中,该名称称为ST_LENGTH_ESPOIDID,别名为ST_3DLength_ESPOIDID
This function supports 3d and will not drop the 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.5.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)
;
返回两个几何图形之间的三维最长直线。如果超过一行,该函数将返回第一行。返回的行从G1开始,以G2结束。线的3D长度等于返回的距离 ST_3DMaxDistance 。
可用性:2.0.0
已更改:2.2.0-如果输入2个2D几何图形,则返回2D点(而不是假设缺少Z的行为为0)。在2D和3D的情况下,对于缺失的Z,不再假定Z为0。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
线串和点--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)
|
线串和多点--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)
|
三维和二维最长线的多重线串和面 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.5.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)
;
以投影单位(空间参考单位)返回两个几何图形之间的三维最大笛卡尔距离。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
可用性: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
到它不是其端点的线段。
如果几何(例如,单点或点相同的多点)不存在最小间隙,则返回值为 无穷大
。
为了避免因精度损失而导致的有效性问题, ST_ReducePrecision 可以降低坐标精度,同时确保多边形几何体保持有效。
可用性:2.3.0
ST_MinimumClearanceLine — 返回跨越几何图形的最小间隙的两点线串。
Geometry ST_MinimumClearanceLine(
geometry g)
;
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的别名,但可能会更改以支持更高的维度。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.5.1
This method implements the SQL/MM specification. 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_3DPerimeter — 返回多边形几何体的3D周长。
float ST_3DPerimeter(
geometry geomA)
;
返回几何体的三维周长(如果它是一个多边形或多个多边形)。如果几何图形是二维的,则返回二维周长。
This function supports 3d and will not drop the z-index.
已更改: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_Project — 返回从起点按距离和方位角(方位角)投影的点。
geography ST_Project(
geography g1, float distance, float azimuth)
;
使用给定的距离和方位角(方位角)返回从起点沿测地线投影的点。这就是所谓的直接测地问题。
距离是以米为单位的。支持负值。
方位角(也称为航向或方位角)以弧度表示。它是从正北(方位角为零)顺时针测量的。东方位角 π /2(90度);南方为方位角 π (180度);西方位角为3 π /2(270度)。负方位角值和大于2的值 π (360度)。
可用性:2.0.0
增强:2.4.0允许负距离和非归一化方位角。
ST_ShortestLine — 返回两个几何之间的2D最短线
geometry ST_ShortestLine(
geometry geom1, geometry geom2)
;
返回两个几何图形之间的二维最短直线。返回的行开始于 地理位置1
并以 地貌2
。如果 地理位置1
和 地貌2
相交结果是一条起点和终点在交点处的直线。这条线的长度与 ST_Distance G1和G2的退货。
可用性:1.5.0
点和线串之间的最短直线
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)
多边形之间的最短直线
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)
;
返回两个几何图形之间的三维最短直线。如果找到多行,则该函数只返回第一个最短的行。如果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。
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
线串和点--三维和二维最短直线 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)
|
线串和多点--三维和二维最短直线 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)
|
三维和二维最短直线的多重线串和面 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)
;
ST_Difference — 计算表示几何图形A中不与几何图形B相交的部分的几何图形。
geometry ST_Difference(
geometry geomA, geometry geomB, float8 gridSize = -1)
;
返回表示几何A中不与几何B相交的部分的几何。这等效于 A-ST_交集(A,B)
。如果A完全包含在B中,则返回适当类型的空原子几何。
![]() | |
这是输入顺序很重要的唯一覆盖函数。ST_Difference(A,B)总是返回A的一部分。 |
如果可选的 网格大小
参数,则将输入捕捉到给定大小的栅格,并在该栅格上计算结果顶点。(需要GEOS-3.9.0或更高版本)
由GEOS模块执行
增强:3.1.0接受GRIDSIZE参数-需要GEOS > =3.9.0
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.3
This method implements the SQL/MM specification. SQL-MM 3:5.1.20
This function supports 3d and will not drop the z-index. 但是,结果仅使用XY计算。结果Z值被复制、平均或内插。
![]() 输入的线串
|
![]() 两条线串的区别
|
二维线串的区别。
SELECT ST_AsText( ST_Difference( 'LINESTRING(50 100, 50 200)'::geometry, 'LINESTRING(50 50, 50 150)'::geometry ) ); st_astext --------- LINESTRING(50 150,50 200)
三维点的差异。
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在这两个几何图形之间共享的部分。
如果几何图形没有公共点(即不相交),则返回适当类型的空原子几何图形。
如果可选的 网格大小
参数,则将输入捕捉到给定大小的栅格,并在该栅格上计算结果顶点。(需要GEOS-3.9.0或更高版本)
ST_交叉口与 ST_Intersects 对于剪裁几何图形非常有用,例如在边界框、缓冲区或区域查询中,其中您只需要几何图形在感兴趣的国家或区域内的部分。
![]() | |
地理:对于地理来说,这实际上是对几何实现的简单包装。它首先确定适合两个地理对象的边界框的最佳SRID(如果地理对象在半个区域内UTM,但不是相同的UTM将拾取其中之一)(倾向于UTM或Lambert方位等面积(LAEA)北/南极,在最坏的情况下退回到墨卡托),然后在最佳匹配的平面空间参考中相交,并重新转换回WGS84地理。 |
![]() | |
此函数将删除M坐标值(如果存在)。 |
![]() | |
如果使用3D几何,则可能需要使用基于SFGCAL ST_3DIntersection 它为3D几何图形进行了适当的3D相交。尽管此函数适用于Z坐标,但它会对Z坐标进行平均。 |
由GEOS模块执行
增强:3.1.0接受GRIDSIZE参数-需要GEOS > =3.9.0
已更改:3.0.0不依赖于SFCGAL。
可用性:1.5引入了对地理数据类型的支持。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.3
This method implements the SQL/MM specification. SQL-MM 3:5.1.18
This function supports 3d and will not drop the 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)
按国家/地区剪裁所有线路(路线)。在这里,我们假设国家地理是多边形或多重几何。注意:我们只保留产生LINESTRING或MULTILINESTRING的交叉点,因为我们不关心只共享一个点的轨迹。需要转储来将几何图形集合扩展为单个多个*零件。下面的代码非常通用,只需更改WHERE子句即可适用于POLY等。
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聚合首先累加一个数组,然后使用快速算法合并内容。 |
This function supports 3d and will not drop the z-index. 但是,结果仅使用XY计算。结果Z值被复制、平均或内插。
ST_Node — 节点是线条的集合.
geometry ST_Node(
geometry geom)
;
返回表示线串集合的完全节点版本的(多)线串。节点保留所有输入节点,并引入尽可能少的新节点。生成的线条将被融合(删除重复的线)。
这是创建适合用作输入的全结点线条的好方法 ST_Polygonize 。
This function supports 3d and will not drop the z-index.
由GEOS模块执行。
可用性:2.0.0
已更改:2.4.0此函数在内部使用GEOSNode,而不是GEOSUnaryUnion。这可能会导致生成的线串具有与PostGIS不同的顺序和方向 < 2.4.
对自相交的三维线串进行节点
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应用于返回的集合理论上应该会生成原始几何图形(尽管由于数字舍入,情况可能并非如此)。
可用性:2.0.0需要GEOS
增强:2.2.0引入了对由多线、多点或(多)多边形边界拆分直线的支持。
增强:2.5.0引入了对通过多线分割多边形的支持。
![]() | |
为了提高ST_Split的健壮性,可以方便地 ST_Snap 将输入的刀片提前使用极低的公差。否则,内部使用的坐标格网可能会导致容差问题,即输入和刀片的坐标不会彼此落在一起,并且输入未被正确分割(请参见 #2192 )。 |
![]() | |
当(多个)多边形作为刀片传递时,其线性组件(边界)用于切割输入。 |
按线切割的多边形
![]() 拆分前
|
![]() 拆分后
|
-- this creates a geometry collection consisting of the 2 halves of the polygon -- this is similar to the example we demonstrated in ST_BuildArea SELECT ST_Split(circle, line) FROM (SELECT ST_MakeLine(ST_Point(10, 10),ST_Point(190, 190)) As line, ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) As circle) As foo; -- result -- GEOMETRYCOLLECTION(POLYGON((150 90,149.039264020162 80.2454838991936,146.193976625564 70.8658283817455,..), POLYGON(..))) -- To convert to individual polygons, you can use ST_Dump or ST_GeometryN SELECT ST_AsText((ST_Dump(ST_Split(circle, line))).geom) As wkt FROM (SELECT ST_MakeLine(ST_Point(10, 10),ST_Point(190, 190)) As line, ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) As circle) As foo; -- result -- wkt --------------- POLYGON((150 90,149.039264020162 80.2454838991936,..)) POLYGON((60.1371179574584 60.1371179574584,58.4265193848728 62.2214883490198,53.8060233744357 ..))
按点剪切的多线串
![]() 拆分前
|
![]() 拆分后
|
SELECT ST_AsText(ST_Split(mline, pt)) As wktcut FROM (SELECT ST_GeomFromText('MULTILINESTRING((10 10, 190 190), (15 15, 30 30, 100 90))') As mline, ST_Point(30,30) As pt) As foo; wktcut ------ GEOMETRYCOLLECTION( LINESTRING(10 10,30 30), LINESTRING(30 30,190 190), LINESTRING(15 15,30 30), LINESTRING(30 30,100 90) )
ST_Subdivide — 计算几何图形的直线细分。
setof geometry ST_Subdivide(
geometry geom, integer max_vertices=256, float8 gridSize = -1)
;
返回一组作为分割结果的几何图形 几何图形
使用直线划分为多个部分,每个部分包含不超过 max_vertices
。
max_vertices
必须为5或更大,因为需要5个点来表示封闭的方框。 网格大小
可以指定在固定精度空间中进行剪裁工作(需要GEOS-3.9.0+)。
对于索引的细分数据集,多边形中点和其他空间操作通常更快。由于部件的边界框通常比原始几何BBox覆盖更小的区域,因此索引查询产生的“命中”案例较少。“命中”情况更快,因为索引重新检查执行的空间操作处理的点数更少。
![]() | |
这是一个 集合返回函数 (SRF),它返回一组包含单个几何值的行。可以在选择列表或FROM子句中使用它来生成一个结果集,其中每个结果几何图形都有一条记录。 |
由GEOS模块执行。
可用性:2.2.0
增强:2.5.0重新使用多边形分割上的现有点,顶点数从8降低到5。
增强:3.1.0接受GRIDSIZE参数,需要GEOS > =3.9.0才能使用此新功能。
示例: 将一个多边形细分为不超过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_Segentize(地理,距离)加密长的地理位置线,然后使用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_SUBDIVE是返回一组单值行的集合返回(表)函数,因此此语法自动生成一个表,每个结果部分对应一行。
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_INTERCESS(A,B)
。它被称为对称差是因为 ST_SymDifference(A,B)=ST_SymDifference(B,A)
。
如果可选的 网格大小
参数,则将输入捕捉到给定大小的栅格,并在该栅格上计算结果顶点。(需要GEOS-3.9.0或更高版本)
由GEOS模块执行
增强:3.1.0接受GRIDSIZE参数-需要GEOS > =3.9.0
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.3
This method implements the SQL/MM specification. SQL-MM 3:5.1.21
This function supports 3d and will not drop the 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 。输入可以是单个几何图形、多几何图形或GeometryCollection。该并集应用于输入的各个元素。
此功能可用于修复因组件重叠而无效的多重多边形。但是,每个输入组件都必须有效。无效的输入组件(如蝴蝶结多边形)可能会导致错误。因此,可能更好地使用 ST_MakeValid 。
此函数的另一个用途是对交叉或重叠的线串集合进行结点和融合,以使它们 简单 。(要添加节点但不融合重复的线条,请使用 ST_Node 。)
可以将ST_UnaryUnion与 ST_Collect 微调一次联合多少个几何体。这允许在内存使用和计算时间之间进行权衡,从而在ST_UNION和 ST_MemUnion 。
如果可选的 网格大小
参数,则将输入捕捉到给定大小的栅格,并在该栅格上计算结果顶点。(需要GEOS-3.9.0或更高版本)
This function supports 3d and will not drop the z-index. 但是,结果仅使用XY计算。结果Z值被复制、平均或内插。
增强:3.1.0接受GRIDSIZE参数-需要GEOS > =3.9.0
可用性: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。
数组变体: 返回一个几何体,它是几何体数组的并集。
聚合变量: 返回几何图形行集的并集的几何图形。在PostgreSQL的术语中,ST_Union()函数是一个“聚合”函数。这意味着它对数据行进行操作,与sum()和avg()函数操作的方式相同,并且像大多数聚合一样,它也忽略空几何图形。
看见 ST_UnaryUnion 用于非聚合、单输入变量。
ST_UNION数组和集合变量使用中介绍的快速级联UNION算法 http://blog.cleverelephant.ca/2009/01/must-faster-unions-in-postgis-14.html
A 网格大小
可以指定在固定精度空间中工作。输入捕捉到给定大小的栅格,并在同一栅格上计算结果顶点。(需要GEOS-3.9.0或更高版本)
![]() | |
ST_Collect 如果不要求结果不重叠,有时可以用来代替ST_UNION。ST_Collect通常比ST_Union快,因为它不对收集的几何图形执行处理。 |
由GEOS模块执行。
ST_UNION将创建多重线串,而不会将线串缝合成单个线串。使用 ST_LineMerge 缝制线条。
注意:该函数以前称为GeomUnion(),因为Union是一个SQL保留字,所以将其从“Union”重命名。
增强:3.1.0接受GRIDSIZE参数-需要GEOS > =3.9.0
已更改:3.0.0不依赖于SFCGAL。
可用性:1.4.0-ST_Union得到增强。引入了ST_UNION(地理阵列),并在PostgreSQL中实现了更快的聚合收集。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.3
![]() | |
OGC规范中没有明确定义聚合版本。 |
This method implements the SQL/MM specification. SQL-MM 3:5.1.19涉及多边形时的z索引(高程)。
This function supports 3d and will not drop the 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 Empty。对于点和线,负距离始终返回空结果。
对于几何图形,距离以几何图形的空间参考系的单位指定。对于地理位置,距离以米为单位指定。
可选的第三个参数控制缓冲区精度和样式。缓冲区中圆弧的精度指定为用于近似四分之一圆的线段数(默认为8)。可以通过提供以空格分隔的键=值对列表来指定缓冲区样式,如下所示:
‘quad_segs=#’:用于近似四分之一圆的线段数(默认为8)。
‘endCap=圆形|扁平|正方形’:收头样式(默认为“圆形”)。‘Butt’被认为是‘Flat’的同义词。
‘JOIN=ROUND|MITRE|BEVELL’:连接样式(默认为“ROUND”)。‘miter’被认为是‘mitre’的同义词。
‘Mitre_Limit=#.#’:斜接比例限制(仅影响斜接样式)。‘Miter_Limit’被接受为‘Mitre_Limit’的同义词。
‘side=Both|Left|Right’:‘Left’或‘Right’在几何体上执行单面缓冲区,缓冲区的一侧相对于直线的方向。这仅适用于LINESTRING几何图形,不影响点几何图形或多边形几何图形。默认情况下,末端封口为正方形。
![]() | |
对于地理,这是几何实现的包装器。它确定最适合地理对象边界框的平面空间参考系(尝试UTM、Lambert方位等面积(LAEA)北/南极,最后尝试墨卡托)。缓冲区在平面空间中计算,然后转换回WGS84。如果输入对象远大于UTM区域或跨越日期线,这可能不会产生所需的行为 |
![]() | |
缓冲区输出始终是有效的多边形几何体。缓冲区可以处理无效输入,因此按距离0进行缓冲区有时用作修复无效多边形的一种方法。 ST_MakeValid 也可用于此目的。 |
![]() | |
缓冲有时用于执行距离内搜索。对于这个用例,使用它会更有效 ST_DWithin 。 |
![]() | |
此函数忽略Z尺寸。即使在3D几何体上使用,它也始终提供2D结果。 |
增强:2.5.0-增强了ST_BUFFER几何支持,以支持端缓冲规范 Side=Both|Left|Right
。
可用性:增强了1.5-ST_BUFFER,以支持不同的EndCaps和Join类型。例如,在将道路线串转换为具有平边或方形边而不是圆边的多边形道路时,这些选项非常有用。添加了地理的薄包装器。
由GEOS模块执行。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.3
This method implements the SQL/MM specification. SQL-MM 3:5.1.17
![]() Quad_segs=8(默认)
SELECT ST_Buffer( ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=8');
| ![]() Quad_segs=2(跛行)
SELECT ST_Buffer( ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2');
| |
![]() 端盖=圆形连接=圆形(默认)
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'endcap=round join=round');
| ![]() 收头=正方形
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'endcap=square join=round');
| ![]() 收头=平面
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'endcap=flat join=round');
|
![]() 连接=倒角
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=bevel');
| ![]() JOIN=斜接限制=5.0(默认斜接限制)
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=mitre mitre_limit=5.0');
| ![]() 连接=斜接_限制=1
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=mitre mitre_limit=1.0');
|
![]() 侧边=左侧
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'side=left');
| ![]() 侧=右
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'side=right');
| ![]() 侧=左连接=斜接
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)
;
创建由输入几何图形的组成线条形成的区域几何图形。输入可以是LINESTRINGS、MULTILINESTRINGS、POLGON、MULTIPOLYGONS和GeometryColltions。结果是一个多边形或多重多边形,具体取决于输入。如果输入线条不形成多边形,则返回NULL。
此函数假定所有内部几何图形都表示孔
![]() | |
必须正确结点输入线条,此功能才能正常工作 |
可用性:1.1.0
![]() 这些将创造一个甜甜圈
--using polygons SELECT ST_BuildArea(ST_Collect(smallc,bigc)) FROM (SELECT ST_Buffer( ST_GeomFromText('POINT(100 90)'), 25) As smallc, ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) As bigc) As foo;
--using linestrings SELECT ST_BuildArea(ST_Collect(smallc,bigc)) FROM (SELECT ST_ExteriorRing(ST_Buffer( ST_GeomFromText('POINT(100 90)'), 25)) As smallc, ST_ExteriorRing(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As bigc) As foo;
|
ST_Node, ST_MakePolygon, ST_MakeValid, ST_BdPolyFromText, ST_BdMPolyFromText (wrappers to this function with standard OGC interface)
ST_Centroid — 返回几何图形的几何中心。
geometry ST_Centroid(
geometry g1)
;
geography ST_Centroid(
geography g1, boolean use_spheroid=true)
;
计算点,该点是几何体的几何质心。适用于[ MULTI
] POINT
S,则质心是输入坐标的算术平均值。适用于[ MULTI
] LINESTRING
S,则使用每条直线段的加权长度来计算质心。适用于[ MULTI
] POLYGON
S,则按面积计算质心。如果提供的是空几何图形,则一个空的 GEOMETRYCOLLECTION
返回。如果 NULL
是提供的, NULL
返回。如果 CIRCULARSTRING
或 COMPOUNDCURVE
,则首先使用CurveToLine将它们转换为线串,然后与 LINESTRING
对于混合维度输入,结果等于最高维度的组件几何的质心(因为较低维度的几何为质心提供了零个“权重”)。
请注意,对于多边形几何体,质心不一定位于多边形的内部。例如,请参见下图所示的C形多边形的质心。要构造保证位于多边形内部的点,请使用 ST_PointOnSurface 。
2.3.0中的新功能:支持 CIRCULARSTRING
和 COMPOUNDCURVE
(使用CurveToLine)
可用性:引入了2.4.0对地理的支持。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
This method implements the SQL/MM specification. SQL-MM 3:8.1.4、9.5.5
在下图中,红点是源几何图形的质心。
![]() A的质心 | ![]() A的质心 |
![]() A的质心 | ![]() A的质心 |
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_ConcaveHull — 计算封闭所有输入几何折点的可能凹的几何
geometry ST_ConcaveHull(
geometry param_geom, float param_pctconvex, boolean param_allow_holes = false)
;
几何体的凹面外壳是封闭输入几何体顶点的可能凹面几何体。在一般情况下,凹面外壳是一个多边形。面将不包含洞,除非可选 param_allow_holes
参数被指定为True。两个或多个共线点的凹面外壳线是两点线串。一个或多个相同点的凹壳称为点。
人们可以把凹面船壳想象成“收缩包装”一组点。这不同于 凸壳 ,这更像是在点上缠上橡皮筋。凹面外壳通常具有较小的面积,并代表输入点更自然的边界。与凸壳类似,凹壳的顶点是输入点的子集,所有其他输入点都包含在其中。
这个 param_pctconvex
控制计算外壳线的凹陷度。值为1将生成凸面外壳线。值为0会生成具有最大凹度的外壳线(但仍为单个多边形)。介于1和0之间的值会产生凹凸度增加的外壳。选择合适的值取决于输入数据的性质,但介于0.3和0.1之间的值通常会产生合理的结果。
从技术上讲,目标百分比将长度确定为输入点的Delaunay三角剖分中最长和最短边之间的差值的一部分。超过此长度的边将从三角剖分中被“侵蚀”。剩下的三角形形成了凹面船体。
这不是聚合函数。要计算一组几何图形的凹壳,请使用 ST_Collect (例如 ST_ConaveHull(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 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模块执行
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. s2.1.1.3
This method implements the SQL/MM specification. SQL-MM 3:5.1.16
This function supports 3d and will not drop the 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))
使用WITH 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, int4 flags)
;
返回 Delaunay三角测量 输入几何图形的顶点的。输出是一个多边形集合(当标志=0时),或者是一个MULTILINESTRING(当标志=1)或三角网(当标志=2)。公差(如果有)用于将输入顶点捕捉到一起。
由GEOS模块执行。
可用性:2.1.0
This function supports 3d and will not drop the z-index.
This function supports Triangles and Triangulated Irregular Network Surfaces (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) ) |
![]() 两个面的ST_Delaunay三角形: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 triangles as multilinestring
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;
|
![]() -- delaunay triangles of 45 points as 55 triangle polygons
-- 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)) : :
|
ST_FilterByM — 根据顶点的M值移除顶点
geometry ST_FilterByM(
geometry geom, double precision min, double precision max = null, boolean returnM = false)
;
根据顶点的M值过滤掉顶点。返回仅具有M值大于或等于最小值且小于或等于最大值的顶点的几何体。如果省略了max-value参数,则只考虑最小值。如果省略了第四个参数,m值将不会出现在生成的几何图形中。如果生成的几何体对于其几何体类型剩余的顶点太少,则将返回空的几何体。在几何图形集合中,没有足够点的几何图形将被静默删除。
此函数主要与ST_SetEffectiveArea配合使用。ST_EffectiveArea以其m值设置顶点的有效面积。使用ST_FilterByM后,只需进行过滤即可获得几何的简化版本,而无需任何计算
![]() | |
与ST_FilterByM相比,当没有足够的点数满足标准时,ST_SimplifyVW返回的结果与ST_FilterByM不同。ST_SimplifyVW返回具有足够点的几何,而ST_FilterByM返回空几何 |
![]() | |
请注意,返回的几何可能无效 |
![]() | |
此函数返回所有尺寸,包括Z值和M值 |
可用性:2.5.0
ST_GeneratePoints — 生成包含在多边形或多重多边形中的随机点。
geometry ST_GeneratePoints(
g geometry , npoints integer )
;
geometry ST_GeneratePoints(
geometry g , integer npoints , integer seed )
;
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
设置为 错误
(默认设置)。
如果一个 容忍度
参数,则根据输入几何图形的范围计算公差值。
如果存在输入点M值,则将其解释为其相对权重。
可用性:2.3.0
增强:2.5.0增加了对M作为点数权重的支持。
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
多点的几何中值(红色)和质心(绿松石)的比较。
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 — 返回由缝合在一起的多重线串形成的线条。
geometry ST_LineMerge(
geometry amultilinestring)
;
返回通过将多重线串的组成线条连接在一起而形成的线串或多重线串。线在双向交点处的端点处连接。线不会跨三向或更大角度的交点连接。
![]() | |
仅与多重线串/线串一起使用。如果将面或GeometryCollection传递给此函数,它将返回空的GeometryCollection |
由GEOS模块执行。
可用性:1.1.0
![]() | |
此函数将剥离M维度。 |
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))' )); st_astext -------------------------------------------------------------------------------------------------- LINESTRING(-29 -27,-30 -29.7,-36 -31,-45 -33,-46 -32)
如果由于非接触线而无法合并,则返回原始的多行字符串。
SELECT ST_AsText(ST_LineMerge( 'MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45.2 -33.2,-46 -32))' )); st_astext ---------------- MULTILINESTRING((-45.2 -33.2,-46 -32),(-29 -27,-30 -29.7,-36 -31,-45 -33))
显示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))' )); st_astext -------------------------------------------------------------------------------------------------- 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)
;
查找完全包含在几何图形中的最大圆。返回一个记录,其中包含圆的中心点、几何图形上最接近圆心的点以及圆的半径。
对于多边形输入,圆内接在外环内,使用内环作为边界。对于线性和点输入,圆内接在输入的凸包内,使用输入作为进一步的边界。
可用性: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_MinimumBoundingCircle — 返回包含几何图形的最小圆形多边形。
geometry ST_MinimumBoundingCircle(
geometry geomA, integer num_segs_per_qt_circ=48)
;
返回包含几何图形的最小圆形多边形。
![]() | |
该圆由一个多边形近似,默认为每个四分之一圆48个线段。由于该多边形是最小边界圆的近似值,因此输入几何体中的某些点可能不包含在该多边形内。可以通过增加分段数来提高近似值,而几乎不会对性能造成影响。对于不适合使用多边形近似的应用程序,可以使用ST_MinimumBordingRadius。 |
它通常与多个和几何体集合一起使用。尽管它不是聚集体,但您可以将其与ST_Collect结合使用,以获得一组几何图形的最小边界圆。ST_MinimumBoundingCircle(ST_Collect(somepointfield)).
多边形面积除以其最小边界圆面积的比率通常称为Roeck检验。
由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)
;
ST_OrientedEnvelope — 返回包含几何图形的最小面积矩形。
geometry ST_OrientedEnvelope(
geometry geom )
;
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或空。
可选的第三个参数允许指定一组空格分隔的键=值对来调整操作,如下所示:
‘quad_segs=#’:用于近似四分之一圆的线段数(默认为8)。
‘JOIN=ROUND|MITRE|BEVELL’:连接样式(默认为“ROUND”)。‘miter’也被认为是‘mitre’的同义词。
‘Mitre_Limit=#.#’:斜接比例限制(仅影响斜接样式)。‘MITER_LIMIT’也可以作为‘MITRE_LIMIT’的同义词。
由GEOS模块执行。
可用性:2.0
增强版:增加了2.5版对地球测量组合和多线串接的支持
![]() | |
此函数忽略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=圆形’原始线及其偏移单位
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,联接=斜接_限制=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
它保证位于曲面(多边形、多重曲面和弯曲多边形)的内部。在PostGIS中,此功能也适用于线和点几何图形。
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1. S3.2.14.2//s3.2.18.2
This method implements the SQL/MM specification. SQL-MM 3:8.1.5、9.5.6。规范仅为曲面几何图形定义ST_PointOnSurface。PostGIS扩展了该功能,以支持所有常见的几何类型。其他数据库(Oracle、DB2、ArcSDE)似乎仅支持曲面的此功能。SQL Server 2008支持所有常见几何图形类型。
This function supports 3d and will not drop the 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。必须正确标记输入线条,此功能才能正常工作。
![]() | |
要确保输入是完全节点的,请使用 ST_Node 在多边形化之前的输入几何体上。 |
![]() | |
GeometryCollection通常很难用第三方工具来处理。使用 ST_Dump 若要将多边形化结果转化为单独的多边形,请执行以下操作。 |
由GEOS模块执行。
可用性:1.0.0RC1
SELECT ST_AsEWKT(ST_Polygonize(geom_4269)) As geomtextrep FROM (SELECT geom_4269 FROM ma.suffolk_edges ORDER BY tlid LIMIT 45) As foo; geomtextrep ------------------------------------- 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))) (1 row) --Use ST_Dump to dump out the polygonize geoms into individual polygons SELECT ST_AsEWKT((ST_Dump(foofoo.polycoll)).geom) As geomtextrep FROM (SELECT ST_Polygonize(geom_4269) As polycoll FROM (SELECT geom_4269 FROM ma.suffolk_edges ORDER BY tlid LIMIT 45) As foo) As foofoo; geomtextrep ------------------------ 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)) (2 rows)
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_SharedPaths — 返回一个集合,其中包含两个输入线串/多线串共享的路径。
geometry ST_SharedPaths(
geometry lineal1, geometry lineal2)
;
返回包含由两个输入几何图形共享的路径的集合。方向相同的元素位于集合的第一个元素中,而方向相反的元素位于第二个元素中。路径本身是在第一个几何图形的方向上指定的。
由GEOS模块执行。
可用性:2.0.0
![]() 多线串和线串 |
![]() 用原始几何图形叠加的多线串和线串的共享路径。
SELECT ST_AsText( ST_SharedPaths( ST_GeomFromText('MULTILINESTRING((26 125,26 200,126 200,126 125,26 125), (51 150,101 150,76 175,51 150))'), ST_GeomFromText('LINESTRING(151 100,126 156.25,126 125,90 161, 76 175)') ) ) As wkt wkt ------------------------------------------------------------- GEOMETRYCOLLECTION(MULTILINESTRING((126 156.25,126 125), (101 150,90 161),(90 161,76 175)),MULTILINESTRING EMPTY)
|
-- same example but linestring orientation flipped SELECT ST_AsText( ST_SharedPaths( ST_GeomFromText('LINESTRING(76 175,90 161,126 125,126 156.25,151 100)'), ST_GeomFromText('MULTILINESTRING((26 125,26 200,126 200,126 125,26 125), (51 150,101 150,76 175,51 150))') ) ) As wkt wkt ------------------------------------------------------------- GEOMETRYCOLLECTION(MULTILINESTRING EMPTY, MULTILINESTRING((76 175,90 161),(90 161,101 150),(126 125,126 156.25)))
|
ST_Simplify — 使用Douglas-Peucker算法返回几何体的简化版本。
geometry ST_Simplify(
geometry geomA, float tolerance)
;
geometry ST_Simplify(
geometry geomA, float tolerance, boolean preserveCollapsed)
;
使用Douglas-Peucker算法返回给定几何体的简化版本。我实际上只对(多)线和(多)多边形做了一些事情,但你可以安全地用任何类型的几何体调用它。由于简化是在逐个对象的基础上进行的,因此您还可以将GeometryCollection提供给此函数。
“保留折叠”标志将保留原本会在给定公差的情况下太小的对象。例如,一条1米长的线路简化为10M公差。如果 保留折叠
参数指定为True,则该行不会消失。此标志对于渲染引擎非常有用,以避免大量非常小的对象从地图上消失,留下令人惊讶的间隙。
![]() | |
请注意,返回的几何可能会失去简单性(请参见 ST_IsSimple ) |
![]() | |
注意:拓扑可能不会保留,并可能导致无效的几何图形。使用(请参见 ST_SimplifyPreserveTopology )以保持拓扑结构。 |
可用性: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 foo; np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_triangle | np100_geometrygoesaway -----------+-------------------+---------------------+-------------+---------------+------------------------ 49 | 33 | 17 | 9 | 4 | t
ST_SimplifyPreserveTopology — 使用Douglas-Peucker算法返回几何图形的简化和有效版本。
geometry ST_SimplifyPreserveTopology(
geometry geomA, float tolerance)
;
使用Douglas-Peucker算法返回给定几何体的简化版本。将避免创建无效的衍生几何图形(特别是多边形)。我实际上只对(多)线和(多)多边形做了一些事情,但你可以安全地用任何类型的几何体调用它。由于简化是在逐个对象的基础上进行的,因此您还可以将GeometryCollection提供给此函数。
由GEOS模块执行。
可用性:1.3.3
与简化相同的示例,但我们看到保留拓扑可防止过度简化。这个圆最多只能变成一个正方形。
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 foo; --result-- np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_square | np100_stillsquare -----------+-------------------+---------------------+-------------+---------------+------------------- 49 | 33 | 17 | 9 | 5 | 5
ST_SimplifyVW — 使用Visvalingam-Whyatt算法返回几何的简化版本
geometry ST_SimplifyVW(
geometry geomA, float tolerance)
;
使用Visvalingam-Whyatt算法返回给定几何体的简化版本。我实际上只对(多)线和(多)多边形做了一些事情,但你可以安全地用任何类型的几何体调用它。由于简化是在逐个对象的基础上进行的,因此您还可以将GeometryCollection提供给此函数。
![]() | |
请注意,返回的几何可能会失去简单性(请参见 ST_IsSimple ) |
![]() | |
注意:拓扑可能不会保留,并可能导致无效的几何图形。使用(请参见 ST_SimplifyPreserveTopology )以保持拓扑结构。 |
![]() | |
此函数处理3D,第三维将影响结果。 |
可用性:2.2.0
ST_ChaikinSmoothing — 使用Chaikin算法返回几何的平滑版本
geometry ST_ChaikinSmoothing(
geometry geom, integer nIterations = 1, boolean preserveEndPoints = false)
;
使用Chaikin算法返回给定几何体的“平滑”版本。看见 查金斯算法 寻求对这一过程的解释。对于每一次迭代,顶点的数量将增加一倍。该函数将新顶点放置在每个点之前和之后直线的1/4处,并删除原始点。要减少点数,请在结果上使用其中一个简化函数。新点获得所有包含的维度的插值值,也包括z和m。
第二个参数,迭代次数限制为最多5次
注意第三个参数仅对面有效,对于线串将被忽略
此函数处理3D,第三维将影响结果。
![]() | |
请注意,返回的几何体将比原始几何体获得更多的点。要再次减少点数,请对结果使用其中一个简化函数。(见 ST_Simplify 和 ST_SimplifyVW ) |
可用性:2.5.0
对三角形进行平滑处理
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)) │ └───────────────────────────────────────────┘
ST_SetEffectiveArea — 使用Visvalingam-Whyatt算法设置每个顶点的有效面积。
geometry ST_SetEffectiveArea(
geometry geomA, float threshold = 0, integer set_area = 1)
;
使用Visvalingam-Whyatt算法设置每个顶点的有效面积。将有效面积存储为顶点的M值。如果使用可选的“thhold”参数,将返回一个简化的几何体,其中只包含有效面积大于或等于阈值的顶点。
当指定阈值时,此函数可用于服务器端简化。另一种选择是使用零的阈值。在这种情况下,完整的几何体将返回有效区域作为M值,客户端可以使用它来非常快速地简化。
我实际上只对(多)线和(多)多边形做了一些事情,但你可以安全地用任何类型的几何体调用它。由于简化是在逐个对象的基础上进行的,因此您还可以将GeometryCollection提供给此函数。
![]() | |
请注意,返回的几何可能会失去简单性(请参见 ST_IsSimple ) |
![]() | |
注意:拓扑可能不会保留,并可能导致无效的几何图形。使用(请参见 ST_SimplifyPreserveTopology )以保持拓扑结构。 |
![]() | |
输出几何将丢失M值中的所有先前信息 |
![]() | |
此函数处理3D和第三个维度将影响有效区域 |
可用性:2.2.0
计算线条的有效面积。由于我们使用的阈值为零,因此将返回输入几何体中的所有顶点。
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_VoronoiLines — 返回几何体顶点的Voronoi图的边界。
geometry ST_VoronoiLines(
g1 geometry , tolerance float8 , extend_to geometry )
;
ST_VoronoiLines计算二维 沃罗诺伊图 从提供的几何图形的顶点返回,并将该关系图中的单元格之间的边界作为多行字符串返回。如果输入几何图形为空,则返回空。如果输入几何只包含一个顶点,则返回空几何集合。如果EXTEND_TO封套的面积为零,则返回空的几何图形集合。
可选参数:
“公差”:顶点被视为相等的距离。通过提供一个非零的容差距离,可以提高算法的鲁棒性。(默认值=0.0)
‘EXTEND_TO’:如果提供一个几何图形作为“EXTEND_TO”参数,则图表将扩展到覆盖“EXTEND_TO”几何图形的包络,除非该包络小于默认包络(默认=NULL,默认包络是输入几何图形的边界框,每个方向扩展约50%)。
由GEOS模块执行。
可用性:2.3.0
![]() 公差为30个单位的Voronoi系列
SELECT ST_VoronoiLines(geom, 30) As geom FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g
-- 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(
g1 geometry , tolerance float8 , extend_to geometry )
;
ST_VoronoiPolygons计算二维 沃罗诺伊图 从提供的几何体的顶点。结果是一个覆盖比输入顶点范围更大的封套的几何体集合。如果输入几何图形为空,则返回空。如果输入几何只包含一个顶点,则返回空几何集合。如果EXTEND_TO封套的面积为零,则返回空的几何图形集合。
可选参数:
“公差”:顶点被视为相等的距离。通过提供一个非零的容差距离,可以提高算法的鲁棒性。(默认值=0.0)
‘EXTEND_TO’:如果提供一个几何图形作为“EXTEND_TO”参数,则图表将扩展到覆盖“EXTEND_TO”几何图形的包络,除非该包络小于默认包络(默认=NULL,默认包络是输入几何图形的边界框,每个方向扩展约50%)。
由GEOS模块执行。
可用性:2.3.0
![]() 叠加在Voronoi图顶部的点
SELECT ST_VoronoiPolygons(geom) As geom FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g;
-- 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(geom, 30) As geom FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g;
-- 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)))
|
![]() Voronoi,公差为30个单位,作为多线串
SELECT ST_VoronoiLines(geom, 30) As geom FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g
-- 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_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仿射变换应用于几何体,一步完成平移、旋转、缩放等操作。
Version 1: The call
ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff)
represents the transformation matrix
/ a b c xoff \ | d e f yoff | | g h i zoff | \ 0 0 0 1 /
and the vertices are transformed as follows:
x' = a*x + b*y + c*z + xoff y' = d*x + e*y + f*z + yoff z' = g*x + h*y + i*z + zoff
All of the translate / scale functions below are expressed via such an affine transformation.
Version 2: Applies a 2d affine transformation to the geometry. The call
ST_Affine(geom, a, b, d, e, xoff, yoff)
represents the transformation matrix
/ 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 /
and the vertices are transformed as follows:
x' = a*x + b*y + xoff y' = d*x + e*y + yoff z' = z
This method is a subcase of the 3D method above.
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
可用性:1.1.2。1.2.2中将名称从Affine更改为ST_Affine
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
--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)
;
绕原点逆时针旋转几何图形弧度。旋转原点可以指定为点几何图形,也可以指定为x和y坐标。如果未指定原点,几何图形将绕点(0 0)旋转。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
增强:2.0.0添加了用于指定旋转原点的其他参数。
可用性:1.1.2。在1.2.2中将名称从Rotate更改为ST_Rotate
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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轴旋转几何图形A-rotRadians。
![]() | |
|
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
可用性:1.1.2。在1.2.2中将名称从RotateX更改为ST_RotateX
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the z-index.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
ST_RotateY — 绕Y轴旋转几何图形。
geometry ST_RotateY(
geometry geomA, float rotRadians)
;
绕y轴旋转几何图形A-rotRadians。
![]() | |
|
可用性:1.1.2。在1.2.2中将名称从RotateY更改为ST_RotateY
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the z-index.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
ST_RotateZ — 绕Z轴旋转几何图形。
geometry ST_RotateZ(
geometry geomA, float rotRadians)
;
绕Z轴旋转几何图形A-rotRadians。
![]() | |
这是ST_Rotate的同义词 |
![]() | |
|
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
可用性:1.1.2。在1.2.2中将名称从RotateZ更改为ST_RotateZ
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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)
;
通过将纵坐标与相应的系数参数相乘,将几何图形缩放到新尺寸。
将几何体作为 因素
参数允许传递2d、3dm、3dz或4d点来为所有支持的维度设置比例因子。中缺少的维度 因素
点等效于不缩放相应的尺寸。
三几何图形变量允许传入用于缩放的“假原点”。例如,使用几何体的质心作为假原点,这样就可以进行“原地缩放”。如果没有假原点,则会相对于实际原点进行缩放,因此所有坐标都将与比例因子相乘。
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
可用性:1.1.0。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
增强:2.2.0支持扩展所有维度( 因素
参数)。
增强:2.5.0支持相对于本地源进行缩放( 原点
参数)。
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports M coordinates.
--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)
;
返回坐标转换为增量x、增量y、增量z单位的新几何图形。单位基于此几何图形的空间参考(SRID)中定义的单位。
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
可用性:1.2.2
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
将一个点移动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)
移动三维点
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)
;
使用增量X和增量Y参数转换几何图形,然后使用仅在二维中工作的X系数和Y系数参数对其进行缩放。
![]() | |
|
![]() | |
在1.3.4之前的版本中,如果与包含曲线的几何体一起使用,此函数会崩溃。这在1.3.4+中已修复 |
可用性:1.1.0。
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 ,它不需要指定簇数,而是使用所需的 距离 ( 易办事
)和密度( MinPoints
)参数来构建每个集群。
如果输入几何体符合以下任一条件,则会将其添加到簇中:
请注意,边界几何图形可能位于 易办事
多个簇中核心几何体的距离;在这种情况下,任一指定都是正确的,并且边界几何体将被任意分配给其中一个可用簇。在这些情况下,可以使用以下数量生成正确的集群 MinPoints
几何图形。当边界几何图形的分配不明确时,如果窗口定义中包括ORDER BY子句,则重复调用ST_ClusterDBSCAN将产生相同的结果,但群集分配可能不同于相同算法的其他实现。
![]() | |
不满足加入任何其他聚类的条件的输入几何图形将被指定簇号为NULL。 |
可用性:2.3.0
将簇号分配给彼此相距50米内的每个多边形。每个聚类至少需要2个面
![]() 在50米范围内,每个集群至少2个。单例的CID为空
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)
;
ST_ClusterIntersecting是一个聚合函数,它返回GeometryCollection数组,其中每个GeometryCollection表示一组相互连接的几何图形。
可用性: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_ClusterKMeans — 窗口函数,使用K-Means算法返回每个输入几何图形的群集ID。
integer ST_ClusterKMeans(
geometry winset geom, integer number_of_clusters, float max_radius)
;
退货 K-均值 每个输入几何体的簇号。用于聚集的距离是二维几何图形的质心之间的距离,以及三维几何图形的边界框中心之间的距离。对于点输入,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聚类和加权对预聚聚的行星规模的数据人口数据集进行聚类。根据以下条件确定至少20个地区 孔图尔人口数据 距离其中心不超过3000公里的区域:
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)
;
ST_ClusterWiThin是一个聚合函数,它返回GeometryCollection数组,其中每个GeometryCollection表示一组相隔不超过指定距离的几何图形。(距离是以SRID为单位的笛卡尔距离。)
可用性: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))
方框2D — 返回表示几何图形的2D范围的BOX2D。
box2d Box2D(
geometry geom)
;
返回一个 框2d 表示几何图形的二维范围。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
Box3D — 返回表示几何图形的3D范围的BOX3D。
box3d Box3D(
geometry geom)
;
返回一个 方框3d 表示几何图形的3D范围。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This function supports 3d and will not drop the z-index.
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)
;
将空间表的估计范围作为 框2d 。如果未指定,则使用当前架构。估计的范围取自几何列的统计数据。这通常比使用以下命令计算表的确切范围快得多 ST_Extent 或 ST_3DExtent 。
默认行为是还使用从子表(带有继承的表)收集的统计信息(如果可用)。如果 parent_only
设置为True,则只使用给定表的统计信息,而忽略子表。
对于PostgreSQL > =8.0.0通过真空分析收集统计数据,结果程度约为实际的95%。对于PostgreSQL < 8.0.0通过运行以下命令收集统计信息 UPDATE_GEOMETRY_STATS()
且结果范围准确。
![]() | |
如果没有统计数据(空表或未调用分析),则此函数返回NULL。在1.5.4版之前,抛出了一个异常。 |
可用性:1.0.0
更改:2.1.0。直到2.0.x版本,这被称为ST_ESTIMATED_EXTEND。
This method supports Circular Strings and Curves
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版本之外,还提供了接受和返回的变体 框2d 和 方框3d 数据类型。
距离以输入的空间参考系为单位。
ST_Expand类似于 ST_Buffer ,除非缓冲在所有方向上扩展几何体,而ST_Expand则沿每个轴扩展边界框。
![]() | |
在1.3版之前,ST_Expand与 ST_Distance 以执行可索引距离查询。例如, |
可用性:1.5.0行为更改为输出双精度,而不是浮动4坐标。
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
增强:增加2.3.0支持,可以在不同的维度以不同的数量扩展一个盒子。
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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)
;
一个聚合函数,它返回 框2d 包围一组几何图形的边界框。
边界框坐标位于输入几何图形的空间参考系中。
ST_EXTEND在概念上类似于Oracle Spatial/Locator的SDO_AGGR_MBR。
![]() | |
ST_Extent返回仅包含X和Y坐标的长方体,即使是3D几何图形也是如此。要返回XYZ坐标,请使用 ST_3DExtent 。 |
![]() | |
归来的人 |
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
![]() | |
以下示例使用马萨诸塞州平面ft(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)
;
一个聚合函数,它返回 方框3d (包括Z坐标)边界一组几何图形的边界框。
边界框坐标位于输入几何图形的空间参考系中。
![]() | |
归来的人 |
增强:2.0.0引入了对多面体曲面、三角形和三角网的支持。
已更改:2.0.0在以前的版本中,这通常称为ST_Extent3D
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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 — 创建由两个二维点几何图形定义的BOX2D。
box2d ST_MakeBox2D(
geometry pointLowLeft, geometry pointUpRight)
;
--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 — 创建由两个三维点几何图形定义的BOX3D。
box3d ST_3DMakeBox(
geometry point3DLowLeftBottom, geometry point3DUpRightTop)
;
ST_XMax — 返回二维或三维边界框或几何图形的X最大值。
float ST_XMax(
box3d aGeomorBox2DorBox3D)
;
返回二维或三维边界框或几何图形的X最大值。
![]() | |
虽然该函数仅为box3d定义,但由于自动强制转换,它也适用于box2d和几何值。但是,它不会接受几何体或box2D文本表示,因为它们不会自动转换。 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 — 返回二维或三维边界框或几何图形的X最小值。
float ST_XMin(
box3d aGeomorBox2DorBox3D)
;
返回二维或三维边界框或几何图形的X最小值。
![]() | |
虽然该函数仅为box3d定义,但由于自动强制转换,它也适用于box2d和几何值。但是,它不会接受几何体或box2D文本表示,因为它们不会自动转换。 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 — 返回二维或三维边界框或几何图形的Y最大值。
float ST_YMax(
box3d aGeomorBox2DorBox3D)
;
返回二维或三维边界框或几何图形的Y最大值。
![]() | |
虽然该函数仅为box3d定义,但由于自动强制转换,它也适用于box2d和几何值。但是,它不会接受几何体或box2D文本表示,因为它们不会自动转换。 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 — 返回二维或三维边界框或几何图形的Y最小值。
float ST_YMin(
box3d aGeomorBox2DorBox3D)
;
返回二维或三维边界框或几何图形的Y最小值。
![]() | |
虽然该函数仅为box3d定义,但由于自动强制转换,它也适用于box2d和几何值。但是,它不会接受几何体或box2D文本表示,因为它们不会自动转换。 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 — 返回二维或三维边界框或几何图形的Z最大值。
float ST_ZMax(
box3d aGeomorBox2DorBox3D)
;
返回二维或三维边界框或几何图形的Z最大值。
![]() | |
虽然该函数仅为box3d定义,但由于自动强制转换,它也适用于box2d和几何值。但是,它不会接受几何体或box2D文本表示,因为它们不会自动转换。 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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 — 返回二维或三维边界框或几何图形的Z最小值。
float ST_ZMin(
box3d aGeomorBox2DorBox3D)
;
返回二维或三维边界框或几何图形的Z最小值。
![]() | |
虽然该函数仅为box3d定义,但由于自动强制转换,它也适用于box2d和几何值。但是,它不会接受几何体或box2D文本表示,因为它们不会自动转换。 |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves
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)
;
返回沿直线在分数位置处插补的点。第一个参数必须是LINESTRING。第二个参数是一个介于0和1之间的浮点数,表示点所在的线长度的分数。如果存在Z值和M值,则会对其进行插补。
看见 ST_LineLocatePoint 用于计算距离点最近的线位置。
![]() | |
此函数计算2D中的点,然后对Z和M的值进行内插,而 ST_3DLineInterpolatePoint 在3D中计算点,并且仅对M值进行内插。 |
![]() | |
从1.1.1版开始,该函数还会插入M和Z值(如果存在),而以前的版本将它们设置为0.0。 |
可用性:1.1.1增加了对0.8.2、Z和M的支持
更改:2.1.0。直到2.0.x,这被称为ST_Line_Interpolate_Point。
This function supports 3d and will not drop the 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)
三维线的中点:
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
ST_LineInterpolatePoints — 返回以分数间隔沿线插值点。
geometry ST_LineInterpolatePoints(
geometry a_linestring, float8 a_fraction, boolean repeat)
;
返回以分数间隔沿直线插补的一个或多个点。第一个参数必须是LINESTRING。第二个参数是一个介于0和1之间的浮点数8,它将点之间的间距表示为线长度的一部分。如果第三个参数为假,则最多构造一个点(相当于 ST_LineInterpolatePoint 。)
如果结果有零个点或一个点,则作为点返回。如果它有两个或多个点,则作为多点返回。
可用性:2.5.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
点每隔20%内插的线串
--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)
;
返回一个介于0和1之间的浮点数,该浮点数表示线串上距离给定点最近的点的位置,作为 二维线 长度。
您可以使用返回的位置提取一个点( 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)
;
计算在给定分数位置开始和结束的输入行的部分。第一个参数必须是LINESTRING。第二个和第三个参数是范围[0,1]中的值,将开始和结束位置表示为线长度的分数。如果存在添加的端点,则会对Z值和M值进行内插。
如果 起始分数
和 尾馏分
具有与此等效值相同的值 ST_LineInterpolatePoint 。
![]() | |
这仅适用于LINESTRING。要在连续的多行字符串上使用,请首先使用 ST_LineMerge 。 |
![]() | |
从版本1.1.1开始,此函数对M值和Z值进行内插。以前的版本将Z和M设置为未指定的值。 |
可用性:1.1.1中增加了1.1.0、Z和M支持
更改:2.1.0。直到2.0.x,这被称为ST_Line_Substring。
This function supports 3d and will not drop the z-index.
1/3中端叠加的线条(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)
如果起点位置和终点位置相同,则结果是一个点。
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(25 50, 100 125, 150 190)', 0.333, 0.333)); ------------------------------------------ POINT(69.2846934853974 94.2846934853974)
将线串剪切为长度为100或更短的部分的查询。它用 GENERATE_Series()
使用横向交叉联接来生成等同于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)
ST_LocateAlong — 返回几何图形上与测量值匹配的点。
geometry ST_LocateAlong(
geometry geom_with_measure, float8 measure, float8 offset = 0)
;
返回沿测量几何图形(作为点或多点)与测量值匹配的位置。不支持多边形元素。
如果 偏移
则结果将向输入行的左侧或右侧偏移指定的距离。正偏移量将位于左侧,负偏移量位于右侧。
![]() | |
仅对具有M分量的几何使用此函数 |
语义由 ISO/IEC 13249-3SQL/MM空间 标准。
可用性:旧名称ST_LOCATE_LONG_MEASURE为1.1.0。
已更改:2.0.0在以前的版本中,这通常称为ST_LOCATE_ALOW_MEASURE。
This function supports M coordinates.
ST_LocateBetween — 返回几何图形中与测量范围匹配的部分。
geometry ST_LocateBetween(
geometry geom, float8 measure_start, float8 measure_end, float8 offset = 0)
;
返回一个几何图形(集合),其中包含与指定测量范围匹配的输入测量几何图形部分(包括在内)。
如果 偏移
则结果将向输入行的左侧或右侧偏移指定的距离。正偏移量将位于左侧,负偏移量位于右侧。
剪裁非凸面多边形可能会产生无效的几何体。
语义由 ISO/IEC 13249-3SQL/MM空间 标准。
可用性:1.1.0旧名称为ST_LOCATE_BETWEEN_MEASURES。
已更改:2.0.0-在以前的版本中,这通常称为ST_LOCATE_BETWEEN_MEASURES。
增强:3.0.0-增加了对多边形、三角网、三角形的支持。
This function supports M coordinates.
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))
测量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-增加了对多边形、三角网、三角形的支持。
This function supports 3d and will not drop the 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 line, geometry point)
;
ST_AddMeasure — 沿线性几何图形内插测量。
geometry ST_AddMeasure(
geometry geom_mline, float8 measure_start, float8 measure_end)
;
返回在起点和终点之间线性插补测量值的衍生几何图形。如果几何图形没有测量尺寸,则会添加一个尺寸。如果几何图形具有测量尺寸,则会使用新值覆盖该尺寸。仅支持LINESTRINGS和MULTILINESTRINGS。
可用性:1.5.0
This function supports 3d and will not drop the 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))
ST_IsValidTrajectory — 测试几何图形是否为有效轨迹。
boolean ST_IsValidTrajectory(
geometry line)
;
测试几何体是否编码了有效的轨迹。有效轨迹表示为 LINESTRING
具有度量(M值)。测量值必须从每个顶点增加到下一个顶点。
有效的轨迹应作为时空函数的输入,例如 ST_ClosestPointOfApproach
可用性:2.2.0
This function supports 3d and will not drop the 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
This function supports 3d and will not drop the 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_Force3DZ(ST_GeometryN(ST_LocateAlong(a,m),1)) pa, ST_Force3DZ(ST_GeometryN(ST_LocateAlong(b,m),1)) pb FROM inp, cpa ) SELECT to_timestamp(m) t, ST_Distance(pa,pb) distance FROM points, cpa; t | distance -------------------------------+------------------ 2015-05-26 10:45:31.034483+02 | 1.96036833151395
ST_DistanceCPA — 返回两个轨迹的最近接近点之间的距离。
float8 ST_DistanceCPA(
geometry track1, geometry track2)
;
返回两个移动对象彼此之间的最小距离。
输入必须是由检查的有效轨迹 ST_IsValidTrajectory 。如果轨迹在其M范围内不重叠,则返回NULL。
可用性:2.2.0
This function supports 3d and will not drop the 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
This function supports 3d and will not drop the 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
SFCGAL是一个围绕CGAL的C++包装库,它提供高级的2D和3D空间函数。出于稳健性考虑,几何图形坐标具有精确的有理数表示法。
库的安装说明可在SFCGAL主页( http://www.sfcgal.org )。要启用这些功能,请使用 创建扩展名postgis_sfcga
。
postgis_sfcgal_version — 返回正在使用的SFCGAL的版本
文本 postgis_sfcgal_version (
void)
;
postgis_sfcgal_full_version — 返回正在使用的SFCGAL的完整版本,包括CGAL和Boost版本
文本 postgis_sfcgal_full_version (
void)
;
ST_3DArea — 计算三维曲面几何图形的面积。对于实体将返回0。
floatST_3DArea(
geometry geom1)
;
可用性:2.1.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
注意:默认情况下,从WKT构建的多面体曲面是曲面几何图形,而不是实体。因此,它有表面积。一旦转换成实体,就没有面积。
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_3DConvexHull — 计算几何体的三维凸包。
geometry ST_3DConvexHull(
geometry geom1)
;
可用性:3.3.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT ST_AsText(ST_3DConvexHull('LINESTRING Z(0 0 5, 1 5 3, 5 7 6, 9 5 3 , 5 7 5, 6 3 5)'::geometry));
多面体曲面Z(1 5 3,9 5 3,0 5,1 5 3)),((1 5 3,0 5,5 7,1 5 3)),((5 7 6,5 75,1 5 3,5 7 6)),((0 5,6 35,5 7 6,0 5)),((6 35,9 5,3,5 3,5 7,6 3 5)),((0 5,9 5 3,6 35,6 35)),((9 5,5 75,5 6,7 6,9 5 3)),((1 5,5,5 75,9 5 3,1 3))
WITH f AS (SELECT i, ST_Extrude(geom, 0,0, i ) AS geom FROM ST_Subdivide(ST_Letters('CH'),5) WITH ORDINALITY AS sd(geom,i) ) SELECT ST_3DConvexHull(ST_Collect(f.geom) ) FROM f;
使用3D凸壳覆盖的原始几何体
ST_3DIntersection — 执行三维相交
geometry ST_3DIntersection(
geometry geom1, geometry geom2)
;
返回属于geom1和geom2之间共享部分的几何体。
可用性:2.1.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
3D图像是使用PostGIS生成的 ST_AsX3D 并使用以下命令在HTML中呈现 X3Dom HTML Java脚本渲染库 。
SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
![]() 覆盖原始3D几何图形。Geom2显示为半透明 |
SELECT ST_3DIntersection(geom1,geom2) FROM ( SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
![]() Geom1和geom2的交集 |
三维线串和多边形
SELECT ST_AsText(ST_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(ST_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 0 0)),((0.5 0,0 0 0,0 0.5 0,0.5 0))
导致体积相交的两个实体的相交也是实体(ST_Dimension返回3)
SELECT ST_AsText(ST_3DIntersection( ST_Extrude(ST_Buffer('POINT(10 20)'::geometry,10,1),0,0,30), ST_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)))
ST_3DDifference — 执行三维差异
geometry ST_3DDifference(
geometry geom1, geometry geom2)
;
返回geom1中不属于geom2的部分。
可用性:2.2.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
3D图像是使用PostGIS生成的 ST_AsX3D 并使用以下命令在HTML中呈现 X3Dom HTML Java脚本渲染库 。
SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
![]() 覆盖原始3D几何图形。Geom2是将被移除的部分。 |
SELECT ST_3DDifference(geom1,geom2) FROM ( SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
![]() 移除geom2后还剩下什么 |
ST_3DUnion — 执行3D合并。
geometry ST_3DUnion(
geometry geom1, geometry geom2)
;
geometry ST_3DUnion(
geometry set g1field)
;
可用性:2.2.0
版本:增加了3.3.0聚合版本
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
聚合变量: 返回作为几何体行集的3D并集的几何体。ST_3DUnion()函数是PostgreSQL术语中的“聚合”函数。这意味着它对数据行进行操作,与sum()和avg()函数操作的方式相同,并且像大多数聚合一样,它也忽略空几何图形。
3D图像是使用PostGIS生成的 ST_AsX3D 并使用以下命令在HTML中呈现 X3Dom HTML Java脚本渲染库 。
SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
![]() 覆盖原始3D几何图形。Geom2是具有透明度的那个。 |
SELECT ST_3DUnion(geom1,geom2) FROM ( SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
![]() Geom1和geom2的结合 |
ST_AlphaShape — 使用CGAL Alpha Shape算法计算可能的凹面几何图形。
geometry ST_AlphaShape(
geometry geom, float alpha, boolean allow_holes = false)
;
假设我们在2D中有一组S个点[...]我们想要一些类似“这些点形成的形状”的东西。这是一个相当模糊的概念,可能有许多可能的解释,α形状就是其中之一。Alpha形状可用于从密集的无组织数据点集重建形状。实际上,α形状是由一个边界来划分的,该边界是原始形状的线性近似[1]。[1]F.Bernardini和C.Bajaj.使用阿尔法形状对流形进行采样和重建。技术报告CSD-TR-97-013,部门电脑。科学出版社,普渡大学,西拉斐特,1997年。资料来源: CGAL Alpha形状 此函数计算一组几何体的凹壳,但使用CGAL和不同于由GEOS模块执行的ST_ConcaeHull的算法。请参阅: JTS中的凹壳
可用性:3.3.0-需要SFCGAL > =1.4.1。
This method needs SFCGAL backend.
多点的凹壳(与ST_OptimalAlphaShape相同的示例)
SELECT ST_AsText(ST_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))
多点的凹壳,允许有洞(与ST_OptimalAlphaShape相同的示例)
SELECT ST_AsText(ST_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,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), (36 61,36 68,40 75,43 80,50 86,60 81,68 73,77 67,81 60,82 54,81 47,78 43,76 27,62 22,54 32,48 34,44 42,38 46,36 61))
多点的凹面外壳线,允许孔(与ST_ConcaeHull相同的示例)
SELECT ST_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((134 80,136 75,130 63,135 45,132 44,126 28,117 24,110 24,98 24,80 27,82 39,72 51,60 48,56 34,52 52,42 50, 34 54,39 66,40 81,34 90,36 100,40 116,36 123,39 128,51 129,58 132,68 135,74 142,78 147,86 146,96 146, 108 142,114 132,112 126,112 116,116 110,120 108,125 108,128 106,125 96,132 87,134 80))
ST_ApproximateMedialAxis — 计算面状几何图形的近似中轴。
geometry ST_ApproximateMedialAxis(
geometry geom)
;
基于其直骨架返回区域输入的近似中轴。在针对功能强大的版本(1.2.0+)构建时,使用SFCGAL特定的API。否则,该函数只是ST_StraightSkype的包装器(较慢的情况)。
可用性:2.2.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
ST_ConstrainedDelaunayTriangles — 返回围绕给定输入几何图元的约束Delaunay三角剖分。
geometry ST_ConstrainedDelaunayTriangles(
geometry g1)
;
返回一个 约束Delaunay三角剖分 围绕输入几何体的顶点。输出是一个罐头。
This method needs SFCGAL backend.
可用性:3.0.0
This function supports 3d and will not drop the z-index.
![]() 两个面的ST_ConstrainedDelaunay三角形
select ST_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)
;
可用性:2.1.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
3D图像是使用PostGIS生成的 ST_AsX3D 并使用以下命令在HTML中呈现 X3Dom HTML Java脚本渲染库 。
SELECT ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30);
![]() 由缓冲点形成的原始八角形 |
ST_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 ST_Extrude( ST_GeomFromText('LINESTRING(50 50, 100 90, 95 150)'),0,0,10));
![]() 沿Z方向拉伸的线串将生成多面体曲面Z |
ST_MakeSolid — 将几何图形投射到实体中。不执行任何检查。要获取有效实体,输入几何图形必须是闭合多面体曲面或闭合三角网。
geometry ST_MakeSolid(
geometry geom1)
;
ST_MinkowskiSum — 执行Minkowski和
geometry ST_MinkowskiSum(
geometry geom1, geometry geom2)
;
此函数执行点、线或多边形与多边形的2D Minkowski求和。
两个几何A和B的Minkowski和是A和B中任意点之和的所有点的集合。Minkowski和经常用于运动规划和计算机辅助设计。更多详细信息,请访问 维基百科Minkowski添加 。
第一个参数可以是任何二维几何图形(点、线串、多边形)。如果传递3D几何体,则通过将Z强制为0将其转换为2D几何体,从而可能导致无效情况。第二个参数必须是2D多边形。
实现利用 CGAL 2D Minkowskisum 。
可用性:2.1.0
This method needs SFCGAL backend.
直线串与圆多边形中线串穿圆的Minkowski和
![]() 在求和之前
|
![]() 求和后
|
SELECT ST_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 ST_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值之后,使用CGAL Alpha Shape算法计算可能的凹面几何体。
geometryST_OptimalAlphaShape(
geometry param_geom, boolean allow_holes = false, integer nb_components)
;
计算几何体集合的“最佳”Alpha形状。CGAL可以自动找到Alpha的最佳值。这个版本使用它来寻找一个“最佳”的阿尔法形状。结果是一个单一的多边形。它不会包含孔,除非可选的 param_allow_holes
参数被指定为True。将生成结果,使得阿尔法形状的实心分量的数量等于或小于 param_nb_components
。
可用性:3.3.0-需要SFCGAL > =1.4.1。
This method needs SFCGAL backend.
多点的凹壳(与ST_AlphaShape相同的示例)
SELECT ST_AsText(ST_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))
多点的凹壳,允许孔(与ST_AlphaShape相同的示例)
SELECT ST_AsText(ST_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));
多边形((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,81 29,76 27,70,62 26,54 2,348,44 2,38 6,436))
ST_StraightSkeleton — 从几何图形计算直骨架
geometry ST_StraightSkeleton(
geometry geom)
;
ST_Tesselate — 执行面或多面体表面的表面镶嵌,并以TIN或TIN集合的形式返回
geometry ST_Tesselate(
geometry geom)
;
将多边形(多边形)或POLYHEDRALSURFACE等曲面作为输入,并通过使用三角形的细分过程返回三角网表示。
可用性:2.1.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (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 ST_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_AS文本输出: 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 ST_Tesselate('POLYGON (( 10 190, 10 70, 80 70, 80 130, 50 160, 120 160, 120 190, 10 190 ))'::geometry);
ST_AS文本输出 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))) ![]() 镶嵌多边形 |
ST_Volume — 计算三维实体的体积。如果应用于曲面(即使是闭合的)几何图形将返回0。
float ST_Volume(
geometry geom1)
;
可用性:2.2.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
使用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
这些函数实现行锁定机制以支持长事务。它们主要是为 Web要素服务 规格。
![]() | |
For the locking mechanism to operate correctly the serializable transaction isolation level must be used. |
AddAuth — 添加要在当前事务中使用的授权令牌。
boolean AddAuth(
text auth_token)
;
CheckAuth — 在表上创建触发器,以基于授权令牌阻止/允许更新和删除行。
integer CheckAuth(
text a_schema_name, text a_table_name, text a_key_column_name)
;
integer CheckAuth(
text a_table_name, text a_key_column_name)
;
DisableLongTransactions — 禁用长事务支持。
text DisableLongTransactions(
)
;
EnableLongTransactions — 启用长事务支持。
text EnableLongTransactions(
)
;
LockRow — 设置表中行的锁定/授权。
integer LockRow(
text a_schema_name, text a_table_name, text a_row_key, text an_auth_token, timestamp expire_dt)
;
integer LockRow(
text a_table_name, text a_row_key, text an_auth_token, timestamp expire_dt)
;
integer LockRow(
text a_table_name, text a_row_key, text an_auth_token)
;
设置表中特定行的锁定/授权。 an_auth_token
是文本值。 expire_dt
是一个时间戳,默认为 现在()+1小时 。如果已分配锁,则返回1;否则返回0(即行已被另一个身份验证锁定)。
可用性:1.1.3
PostGIS_Extensions_Upgrade — 将PostGIS扩展(例如postgis_raster、postgis_topology、postgis_sfcga)打包并升级到最新的可用版本。
text PostGIS_Extensions_Upgrade(
)
;
将PostGIS扩展打包并升级到最新版本。如果需要,只有安装在数据库中的扩展才会打包和升级。报告完整的PostGIS版本和之后的构建配置信息。这是执行多个CREATE扩展的速记。从未打包和更改扩展名..每个PostGIS扩展模块的更新。当前仅尝试升级扩展postgis、postgis_raster、postgis_sfcga、postgis_topology和postgis_Tiger_Geocoder。
可用性:2.5.0
![]() | |
已更改: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(
)
;
SELECT PostGIS_Full_Version(); postgis_full_version ---------------------------------------------------------------------------------- POSTGIS="3.0.0dev r17211" [EXTENSION] PGSQL="110" GEOS="3.8.0dev-CAPI-1.11.0 df24b6bb" SFCGAL="1.3.6" PROJ="Rel. 5.2.0, September 15th, 2018" GDAL="GDAL 2.3.2, released 2018/09/21" LIBXML="2.9.9" LIBJSON="0.13.1" LIBPROTOBUF="1.3.1" WAGYU="0.4.3 (Internal)" TOPOLOGY RASTER (1 row)
PostGIS_GEOS_Version — 返回GEOS库的版本号。
text PostGIS_GEOS_Version(
)
;
PostGIS_Liblwgeom_Version — 返回liblwgeom库的版本号。这应该与PostGIS的版本匹配。
text PostGIS_Liblwgeom_Version(
)
;
PostGIS_PROJ_Version — 返回PROJ4库的版本号。
text PostGIS_PROJ_Version(
)
;
PostGIS_Wagyu_Version — 返回内部和库的版本号。
text PostGIS_Wagyu_Version(
)
;
PostGIS_Scripts_Build_Date — 返回PostGIS脚本的构建日期。
text PostGIS_Scripts_Build_Date(
)
;
PostGIS_Scripts_Installed — 返回此数据库中安装的PostGIS脚本的版本。
text PostGIS_Scripts_Installed(
)
;
返回此数据库中安装的PostGIS脚本的版本。
![]() | |
如果此函数的输出与 PostGIS_Scripts_Released 您可能错过了正确升级现有数据库。请参阅 升级 部分了解更多信息。 |
可用性:0.9.0
PostGIS_Scripts_Released — 返回随已安装的PostGIS库一起发布的postgis.sql脚本的版本号。
text PostGIS_Scripts_Released(
)
;
返回随已安装的PostGIS库一起发布的postgis.sql脚本的版本号。
![]() | |
从版本1.1.0开始,此函数返回相同的值 PostGIS_Lib_Version 。保留是为了向后兼容。 |
可用性:0.9.0
postgis.backend — 后端服务于GEOS和SFCGAL重叠的功能。选项:geos或sfcga。默认为geos。
此GUC仅在您使用sfcga支持编译PostGIS时才相关。默认情况下 GEOS
后端用于GEOS和SFCGAL具有相同命名函数的函数。该变量允许您覆盖sfcga并使其成为服务请求的后端。
可用性:2.1.0
postgis.gdal_datapath — 一个配置选项,用于分配GDAL的GDAL_DATA选项的值。如果未设置,则使用环境设置的GDAL_DATA变量。
用于设置GDAL的GDAL_DATA选项的值的PostgreSQL GUC变量。这个 postgis.gdal_datapath
值应该是指向GDAL数据文件的完整物理路径。
此配置选项最适用于GDAL数据文件路径未硬编码的Windows平台。当GDAL的数据文件不在GDAL的预期路径中时,也应设置此选项。
![]() | |
该选项可以在PostgreSQL的配置文件postgresql.conf中设置。也可以通过连接或事务进行设置。 |
可用性:2.2.0
![]() | |
有关GDAL_DATA的更多信息,请访问GDAL的 配置选项 。 |
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_Drives=‘DISABLE_ALL’;
postgis.enable_outdb_rasters — 一个布尔配置选项,用于启用对Out-db栅格波段的访问。
一个布尔配置选项,用于启用对Out-db栅格波段的访问。该选项可以在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_config_options — 设置使用Out-db栅格时使用的选项的字符串配置。
设置 postgis.gdal_vsi_options
对于当前会话:
设置postgis.gdal_CONFIG_OPTIONS=‘AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy’;
设置 postgis.gdal_vsi_options
只是为了 当前交易 使用 LOCAL
关键词:
设置本地postgis.gdal_CONFIG_OPTIONS=‘AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy’;
PostGIS_AddBBox — 将边界框添加到几何图形。
geometry PostGIS_AddBBox(
geometry geomA)
;
PostGIS_DropBBox — 从几何体中删除边界框缓存。
geometry PostGIS_DropBBox(
geometry geomA)
;
从几何体中删除边界框缓存。这会减小几何体大小,但会降低基于边界框的查询速度。它还用于放置损坏的边界框。缓存边界框损坏的一个明显迹象是ST_Intersects和其他关系查询省略了理应返回TRUE的几何图形。
![]() | |
边界框被自动添加到几何图形中,并提高了查询速度,因此通常不需要这样做,除非生成的边界框以某种方式损坏或您的旧安装缺少边界框。然后你需要去掉旧的和ReadD。在8.3-8.3.6系列中观察到了这种损坏,当几何图形更改时,缓存的bbox并不总是重新计算,并且升级到较新的版本而不重新加载转储不会纠正已经损坏的箱。因此,您可以使用下面的内容手动更正,并读取BBox或执行转储重新加载。 |
This method supports Circular Strings and Curves
--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)
;
如果缓存了此几何体的BBox,则返回True,否则返回False。使用 PostGIS_AddBBox 和 PostGIS_DropBBox 来控制缓存。
This method supports Circular Strings and Curves
9.1. | 我在哪里可以找到有关使用PostGIS的教程、指南和研讨会 | |||
循序渐进的教程指导工作坊 邮政地理信息系统简介 。它包括打包的数据以及使用OpenGeo Suite的简介。这可能是关于PostGIS的最好的教程。 波士顿地理信息系统也有一个 PostGIS近乎白痴的入门指南 。这一次更关注的是Windows用户。 | ||||
9.2. | 我的应用程序和桌面工具可以在PostGIS1.5上运行,但不能在PostGIS2.0上运行。我该怎么解决这个问题? | |||
在PostGIS2.0中,从PostGIS代码库中删除了许多不推荐使用的函数。除了Geoserver、MapServer、QuantumGIS和OpenJump等第三方工具外,这还影响了应用程序。有几种方法可以解决这个问题。对于第三方应用程序,你可以尝试升级到这些应用程序的最新版本,这些版本中的许多问题都得到了修复。对于您自己的代码,您可以更改代码以不使用删除的函数。这些函数中的大多数是ST_UNION、ST_LENGTH等的非ST_别名,作为最后的手段,请安装整个 这个 | ||||
9.3. | 当我用osm2pgsql加载OpenStreetMap数据时,我得到一个错误:失败:操作符类“GIST_GEOMETRY_OPS”不存在,访问方法“GIST”出现错误。这在PostGIS1.5中运行得很好。 | |||
在PostGIS 2中,默认几何运算符类GIST_GEOMETRY_OPS被更改为GIST_GEOMETRY_OPS_2d,并且完全删除了GIST_GEOMETRY_OPS。之所以这样做,是因为PostGIS2还引入了支持3D的ND空间索引,而旧名称被认为令人困惑和用词不当。 一些较旧的应用程序作为该过程的一部分创建表和索引,它们显式引用了运算符类名称。如果需要默认的2D索引,则不需要执行此操作。因此,如果您管理说好,则将索引创建从以下位置更改: 不好的: 使用GIST(Geom GIST_GEOMETRY_OPS)在my_table上创建索引idx_my_table_geom; 转到好: 使用GIST(Geom)在my_table上创建索引idx_my_table_geom; 唯一需要指定运算符类的情况是需要3D空间索引,如下所示: 使用GIST(Geom Gist_Geometryops_Nd)在my_Super3d上创建索引idx_my_Super3d_geom; 如果您不幸地陷入了编译代码的困境,您不能更改硬编码了旧的gist_geometryops的代码,那么您可以使用 | ||||
9.4. | 我正在运行PostgreSQL 9.0,我不能再在OpenJump、Safe FME和其他一些工具中读取/查看几何图形了? | |||
在PostgreSQL 9.0+中,byteA数据的默认编码已更改为十六进制,较旧的JDBC驱动程序仍采用转义格式。这影响了一些应用程序,如使用旧版JDBC驱动程序的Java应用程序或使用旧版npgsql驱动程序的.NET应用程序,这些应用程序期望ST_AsBinary的旧行为。有两种方法可以让这一点再次发挥作用。 您可以将JDBC驱动程序升级到最新的PostgreSQL 9.0版本,您可以从 http://jdbc.postgresql.org/download.html 如果您运行的是.NET应用程序,则可以使用Npgsql 2.0.11或更高版本,可从下载 http://pgfoundry.org/frs/?group_id=1000140 并且如上所述 Francisco Figueiredo的NpgSQL 2.0.11发布博客条目 如果不能升级您的PostgreSQL驱动程序,则可以通过以下更改将默认行为设置回旧行为: ALTER DATABASE mypostgisdb SET bytea_output='escape'; | ||||
9.5. | 我试图使用PgAdmin查看我的几何图形列,但它是空白的,这是怎么回事? | |||
对于大型几何图形,pgAdmin不会显示任何内容。验证几何图形列中是否有数据的最佳方法是? -- this should return no records if all your geom fields are filled in SELECT somefield FROM mytable WHERE geom IS NULL; -- To tell just how large your geometry is do a query of the form --which will tell you the most number of points you have in any of your geometry columns SELECT MAX(ST_NPoints(geom)) FROM sometable; | ||||
9.6. | 我可以存储什么类型的几何对象? | |||
可以存储点几何图形、线串几何图形、多边形几何图形、多点几何图形、多重线串几何图形、多重多边形几何图形和几何集合几何图形。在PostGIS 2.0及更高版本中,您还可以将三角网和多面体曲面存储为基本几何类型。它们以Open GIS熟知文本格式(扩展名为Z、M和ZM)指定。目前支持三种数据类型。标准OGC几何数据类型,使用平面坐标系进行测量;地理数据类型,使用大地坐标系,在球体或椭球体上进行计算。PostGIS空间类型家族的最新成员是用于存储和分析栅格数据的栅格。RASTER有自己的常见问题解答。参考 Chapter 13, PostGIS栅格常见问题解答 和 Chapter 12, 栅格参考 了解更多详细信息。 | ||||
9.7. | 我都糊涂了。我应该使用几何图形还是地理图形的数据存储? | |||
简而言之:地理是一种较新的数据类型,支持长距离测量,但其上的大多数计算比几何上的计算慢。如果你使用地理学,你不需要学习太多关于平面坐标系的知识。如果你所关心的只是测量距离和长度,并且你有来自世界各地的数据,那么地理通常是最好的。几何数据类型是一种较旧的数据类型,具有更多支持它的函数,享有来自第三方工具的更大支持,并且对它的操作通常更快--对于更大的几何图形,有时快10倍。如果您对空间参考系非常熟悉,或者您正在处理的本地化数据中所有数据都可以放在一个 空间参考系(SRID) ,或者需要做大量的空间处理。注意:在这两种类型之间进行一次性转换以获得各自的好处相当容易。参考 Section 15.11, “PostGIS Function Support Matrix” 查看当前支持的内容和不支持的内容。 长长的答案:请参阅我们在 Section 4.3.3, “何时使用地理数据类型” 和 函数类型矩阵 。 | ||||
9.8. | 我对地理有更强烈的疑问,比如我在地理专栏中填入多大的地理区域,还能得到合理的答案。是否有一些限制,比如杆子、场地上的所有东西都必须放在一个半球内(就像SQL Server2008那样)、速度等? | |||
你的问题太深刻和复杂,在这一节中无法得到充分的回答。请参阅我们的 Section 4.3.4, “地理高级常见问题解答” 。 | ||||
9.9. | 如何将地理信息系统对象插入数据库? | |||
首先,您需要创建一个表,其中包含类型为“GEOMETRY”或“GEOGRAPHY”的列,以保存您的GIS数据。存储地理类型数据与存储几何图形略有不同。参考 Section 4.3, “地理数据类型” 获取有关存储地理位置的详细信息。 对于几何图形:使用以下命令连接到数据库 创建表gtest(id序列主键,名称varchar(20),几何几何(LINESTRING)); 如果几何图形列定义失败,则您可能尚未将PostGIS函数和对象加载到此数据库中,或者正在使用早于2.0版本的PostGIS。请参阅 Section 2.2, “从源代码编译和安装” 。 然后,可以使用SQL INSERT语句将几何图形插入到表中。地理信息系统对象本身使用OpenGIS Consortium“熟知文本”格式进行格式化: INSERT INTO gtest (ID, NAME, GEOM) VALUES ( 1, 'First Geometry', ST_GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)') ); 有关其他GIS对象的详细信息,请参阅 对象引用 。 要在表格中查看您的GIS数据,请执行以下操作: SELECT id, name, ST_AsText(geom) AS geom FROM gtest; 返回值应如下所示: id | name | geom ----+----------------+----------------------------- 1 | First Geometry | LINESTRING(2 3,4 5,6 5,7 8) (1 row) | ||||
9.10. | 如何构建空间查询? | |||
构造任何其他数据库查询的方式与构造返回值、函数和布尔测试的SQL组合的方式相同。 对于空间查询,在构建查询时有两个重要的问题需要记住:是否有可以使用的空间索引;以及,您是否在大量几何图形上进行昂贵的计算。 通常,您需要使用“Intersects运算符”( & & ),它测试特征的边界框是否相交。其原因是 & & 运算符之所以有用,是因为如果空间索引可用来加速测试,则 & & 操作员将利用这一点。这可以使查询变得更快。 您还将使用空间函数,如Distance()、ST_Intersects()、ST_CONTAINS()和ST_WITHING()等,以缩小搜索结果的范围。大多数空间查询既包括索引测试,也包括空间函数测试。索引测试用于将返回元组的数量限制为仅 威力 符合相关条件。然后使用空间函数来准确地测试条件。 SELECT id, geom FROM thetable WHERE ST_Contains(geom,'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'); | ||||
9.11. | 如何加快对大型表的空间查询? | |||
对大型表的快速查询是 《理由》 空间数据库(以及事务支持),因此拥有良好的索引是很重要的。 在表上构建空间索引 使用GIST([GeometryColumn])对[Tablename]创建索引[indexname]; “Using GIST”选项告诉服务器使用GIST(通用搜索树)索引。
您还应该确保PostgreSQL查询规划器拥有关于您的索引的足够信息,以便合理地决定何时使用它。要做到这一点,你必须在你的几何表上“收集统计数据”。 对于PostgreSQL 8.0.x和更高版本,只需运行 真空分析 指挥部。 对于PostgreSQL 7.4.x和更低版本,请运行 选择UPDATE_GEOMETRY_STATS() 指挥部。 | ||||
9.12. | 为什么不支持PostgreSQL R-Tree索引? | |||
早期版本的PostGIS使用PostgreSQL R-Tree索引。然而,从版本0.6开始,PostgreSQL R-树已经完全被丢弃,并且空间索引提供了R-Tree-over-gist方案。 我们的测试表明,原生R-Tree和GIST的搜索速度是相当的。原生PostgreSQL R树有两个限制,这使得它们不适合与GIS功能一起使用(请注意,这些限制是由于当前的PostgreSQL原生R树实现,而不是一般的R树概念):
| ||||
9.13. | 我为什么要使用 | |||
如果您不想使用OpenGIS支持功能,则不必使用。只需像在旧版本中一样创建表,在CREATE语句中定义几何列。所有几何的SRID都将为-1,OpenGIS元数据表将 不 要正确填写。但是,这会导致大多数基于PostGIS的应用程序失败,因此通常建议您使用 MapServer是一个利用 | ||||
9.14. | 查找另一个对象半径内的所有对象的最佳方法是什么? | |||
要最有效地使用数据库,最好执行RADIUS查询,将RADIUS测试与边界框测试相结合:边界框测试使用空间索引,从而快速访问数据子集,然后对其应用RADIUS测试。 这个 例如,要查找点为100米(1000 1000)的所有对象,可以使用以下查询: SELECT * FROM geotable WHERE ST_DWithin(geocolumn, 'POINT(1000 1000)', 100.0); | ||||
9.15. | 如何将坐标重新投影作为查询的一部分? | |||
要执行重投影,必须在SPATIAL_REF_SYS表中定义源和目标坐标系,并且要重投影的几何必须已经设置了SRID。一旦完成,重新投影就像引用所需的目的地SRID一样简单。下面是一个经度为NAD 83的几何图形。仅当geom的sRID不是-1(不是未定义的空间参考)时,以下选项才有效 SELECT ST_Transform(geom,4269) FROM geotable; | ||||
9.16. | 我在相当大的几何体上执行了ST_AsEWKT和ST_AsText,结果返回空白字段。什么给予? | |||
您可能正在使用PgAdmin或其他不能输出大文本的工具。如果您的几何体足够大,它将在这些工具中显示为空白。如果您确实需要在WKT中查看或输出它,请使用PSQL。 --To check number of geometries are really blank SELECT count(gid) FROM geotable WHERE geom IS NULL; | ||||
9.17. | 当我执行ST_Intersects时,当我知道两个几何图形不相交时,它会告诉我它们不相交。什么给予? | |||
这通常发生在两种常见的情况下。您的几何无效--检查 ST_IsValid 或者您假设它们是相交的,因为ST_AsText截断了数字,并且在它没有显示给您之后有很多小数。 | ||||
9.18. | 我正在发布使用PostGIS的软件,这是否意味着我的软件必须像PostGIS一样使用GPL进行许可?如果我使用PostGIS,我必须发布我所有的代码吗? | |||
几乎可以肯定的是,不会。例如,考虑在Linux上运行的Oracle数据库。Linux是GPL,Oracle不是:运行在Linux上的Oracle必须使用GPL分发吗?不是的。同样,您的软件可以随心所欲地使用PostgreSQL/PostGIS数据库,并且可以使用您喜欢的任何许可证。 唯一的例外是您对PostGIS源代码进行了更改,并且 已分发您更改的版本 对PostGIS的研究。在这种情况下,您必须共享更改后的PostGIS的代码(但不共享在其上运行的应用程序的代码)。即使在这种有限的情况下,您仍然只需要将源代码分发给您向其分发二进制文件的人。GPL并不要求您 出版 您的源代码,只是您将其与您提供二进制文件的人共享。 即使您将PostGIS与可选的启用CGAL的函数结合使用,上述情况仍然成立。CGAL的一部分是GPL,但所有的PostGIS都是GPL:使用CGAL并不会使PostGIS比开始时更具GPL。 | ||||
9.19. | 为什么叠加运算和空间谓词的结果有时会不一致? | |||
这通常是作为特定案例来表示的,例如
原因是,PostGIS表示几何图形并使用有限精度浮点数执行运算。这提供了使用实数进行计算的错觉--但这只是一种错觉。不可避免地会出现微小的误差,这会导致不同操作的结果略有不一致。 此外,PostGIS操作包含错误预防代码,该代码可能会对输入几何进行微小扰动,以防止出现健壮性错误。这些微小的改动也可能产生不完全一致的计算结果。 结果之间的差异应该总是非常小的。但在比较覆盖结果时,查询不应依赖于精确的一致性。相反,可以考虑在几何比较中使用基于面积或距离的公差。 |
PostGIS拓扑类型和功能用于管理面、边和节点等拓扑对象。
Sandro Santilli在PostGIS Day巴黎2011会议上的演讲很好地概述了PostGIS的拓扑结构及其发展方向 使用PostGIS 2.0幻灯片的拓扑 。
Vincent Picavet对什么是拓扑、如何使用以及支持它的各种FOSS4G工具提供了很好的概要和概述 PostGIS拓扑PGConf EU 2012 。
基于拓扑的GIS数据库的一个示例是 美国人口普查拓扑集成地理编码和参考系统(TIGER) 数据库。如果您想尝试使用PostGIS拓扑并需要一些数据,请查看 Topology_Load_Tiger 。
PostGIS拓扑模块存在于以前的PostGIS版本中,但从未出现在官方的PostGIS文档中。在PostGIS 2.0.0中,主要的清理工作是删除其中所有不推荐使用的函数,修复已知的可用性问题,更好地记录特性和函数,添加新函数,并进行增强以更符合SQL-MM标准。
有关该项目的详细信息,请访问 PostGIS拓扑维基
与此模块关联的所有函数和表都安装在一个名为 拓扑学
。
在SQL/MM标准中定义的函数以ST_为前缀,而特定于PostGIS的函数不带前缀。
默认情况下,从PostGIS 2.0开始构建拓扑支持,可以在构建时指定--不带-topology配置选项来禁用拓扑支持,如中所述 Chapter 2, PostGIS安装
ValidateTopology
。TopoGeometry — 表示拓扑定义的几何图形的复合类型。
复合类型,指特定拓扑层中的拓扑几何图形,具有特定类型和特定ID。拓扑几何图形的元素包括以下特性:topology_id、layer_id、id整数、类型整数。
topology_id
是一个整数:是指在topology中定义的拓扑。拓扑表定义了拓扑模式和sRID。
layer_id
是一个整数:拓扑几何图形所属的LAYERS表中的Layer_id。Topology_id和layer_id的组合在topology.layers表中提供了唯一的引用。
ID号
是一个整数:id是自动生成的序列号,它唯一地定义了相应拓扑层中的拓扑几何。
类型
1-4之间的整数,定义几何类型:1:[多]点,2:[多]线,3:[多]面,4:集合
validatetopology_returntype — 由错误消息以及指示错误位置的id1和id2组成的复合类型。这是的返回类型 ValidateTopology
。
由一个错误消息和两个整数组成的复合类型。这个 ValidateTopology 函数返回一组这些参数来表示验证错误,返回id1和id2来表示错误中涉及的拓扑对象的ID。
错误
Is varchar:表示错误类型。
当前错误描述符是:重合节点、边交叉节点、边不简单、边结束节点几何不匹配、边起始节点几何不匹配、面重叠、面内
Id1
为整数:表示出错的边/面/节点的标识符。
ID2
是一个整数:对于涉及2的错误,对象表示次边/或节点
TopoElement — 通常用于标识拓扑几何组件的两个整数的数组。
由两个整数组成的数组,用于表示简单或层次结构的一个组件 TopoGeometry 。
在简单拓扑几何图形的情况下,数组的第一个元素表示拓扑基本体的标识符,第二个元素表示其类型(1:节点、2:边、3:面)。对于层次拓扑几何,数组的第一个元素表示子拓扑几何的标识符,第二个元素表示其层标识符。
![]() | |
对于任何给定的层次拓扑几何图形,所有子拓扑几何图形元素都将来自相同的子图层,如要定义的拓扑几何图形所在层的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对象的数组。
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"
table_name
在架构中 schema_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)
;
每个拓扑几何对象都属于特定拓扑的特定层。在创建拓扑几何对象之前,需要创建其TopologyLayer。拓扑图层是要素表与拓扑的关联。它还包含类型和层次结构信息。我们使用AddTopoGeometryColumn()函数创建一个层:
该函数将请求的列添加到表中,并将包含所有给定信息的记录添加到topology.layer表中。
如果未指定[CHILD_LAYER](或将其设置为NULL),则此图层将包含基本拓扑几何(由基本体拓扑元素组成)。否则,该层将包含层次拓扑几何(由Child_layer中的拓扑几何组成)。
创建了图层(其id由AddTopoGeometryColumn函数返回)后,即可在其中构建Topo Geometry对象
有效 feature_type
有:点、线、面、集合
可用性: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');
DropTopology — 请谨慎使用:删除拓扑模式并从topology.topology表中删除其引用,并从GEOMETRY_COLUMNS表中删除对该模式中的表的引用。
integer DropTopology(
varchar topology_schema_name)
;
删除拓扑模式并从topology.topology表中删除其引用,并从geomy_Columns表中删除对该模式中的表的引用。此函数应谨慎使用,因为它可能会破坏您关心的数据。如果模式不存在,它只删除命名模式的引用条目。
可用性:1.1
DropTopoGeometryColumn — 从名为的表中删除地形几何列 table_name
在架构中 schema_name
并从topology.layer表中注销这些列。
text DropTopoGeometryColumn(
varchar schema_name, varchar table_name, varchar column_name)
;
Populate_Topology_Layer — 通过从topo表中读取元数据,将缺少的条目添加到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)
;
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_returtype对象,这些对象详细说明了拓扑问题。
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的MBR错误 | 具有错误MBR缓存的面部的标识符。 | 面的最小边界矩形与报告其侧面的面的边集合的最小边界框不匹配。 | |
不是广告上的脸上的洞 | 边的带符号的标识符,用于标识环。看见 GetRingEdges 。 | 在其外部报告一个面的一环边包含在不同的面中。 | |
非隔离节点具有不包含面 | 定义错误的节点的标识符。 | 报告为位于一条或多条边的边界上的节点表示包含面。 | |
隔离节点具有包含面 | 定义错误的节点的标识符。 | 没有报告为位于任何边的边界上的节点缺少包含面的指示。 | |
孤立节点具有错误的包含面 | 错误表示的节点的标识符。 | 未报告为位于任何边的边界上的节点表示包含面,而不是包含该节点的实际面。看见 GetFaceContainingPoint 。 | |
NEXT_RIGHT_EDGE无效 | 错误表示的边的标识符。 | 应指示为下一个右边缘的边的有符号ID。 | 指示为在某条边的右侧行走的下一条边遇到的边是错误的。 |
NEXT_LEFT_EDGE无效 | 错误表示的边的标识符。 | 应指示为下一个左边缘的边缘的有符号ID。 | 指示为在边的左侧行走的下一条边遇到的边是错误的。 |
环上的混合人脸标号 | 边的带符号的标识符,用于标识环。看见 GetRingEdges 。 | 环中的边表示行走侧的冲突面。这也被称为“边位冲突”。 | |
非闭合环 | 边的带符号的标识符,用于标识环。看见 GetRingEdges 。 | 通过跟随Next_Left_Edge/Next_Right_Edge属性形成的边环在不同的节点上开始和结束。 | |
脸有多个贝壳 | 争用的面的标识符。 | 边的带符号的标识符,用于标识环。看见 GetRingEdges 。 | 不止一环的边表示其内部的同一个面。 |
可用性:1.0.0
增强:2.0.0更高效的边缘交叉检测,并修复了以前版本中存在的假阳性。
已更改:已将id1和id2的2.2.0值交换为‘Edge cross node’,以与错误描述一致。
更改:3.2.0增加了可选的BBox参数,执行面标签和边缘链接检查。
ValidateTopologyRelation — 返回有关无效拓扑关系记录的信息
setof record ValidateTopologyRelation(
varchar toponame)
;
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)
;
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)
;
向拓扑中添加元素会触发许多数据库查询,以查找要拆分的现有边、添加节点并更新将使用新线条进行节点的边。因此,有关拓扑表中数据的统计数据是最新的,这一点很有用。
PostGIS拓扑填充和编辑功能不会自动更新统计数据,因为在拓扑中的每一次更改后更新统计数据都会被夸大,因此调用者有责任处理这一点。
![]() | |
在自动真空处理完成之前启动的事务将看不到由自动真空更新的统计信息,因此长期运行的事务将需要运行分析自身,以使用更新的统计信息。 |
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
由表组成( edge_data
, 脸
, 节点
, 关系
并在topology.拓扑表中注册此新拓扑。它返回拓扑表中的拓扑ID。SRID是在空间参考系统表中为该拓扑定义的空间参考。拓扑名称必须是唯一的。公差以空间参考系为单位进行测量。如果容差( PREC
)未指定,则默认为0。
这类似于SQL/MM ST_InitTopoGeo 但更实用一些。 哈兹
如果未指定,则默认为FALSE。
可用性:1.1
增强:2.0添加了接受Hasz的签名
CopyTopology — 复制拓扑结构(节点、边、面、层和拓扑几何)。
integer CopyTopology(
varchar existing_topology_name, varchar new_name)
;
ST_InitTopoGeo — 创建新的拓扑方案,并将此新方案注册到topology。拓扑表和过程的详细信息摘要中。
text ST_InitTopoGeo(
varchar topology_schema_name)
;
这是相当于CreateTopology的SQL-MM,但缺少CreateTopology的空间参考和容差选项,并输出创建的文本描述,而不是拓扑id。
可用性:1.1
This method implements the SQL/MM specification. SQL-MM 3 Topo-Geo和Topo-Net 3:例程详细信息:X.3.17
ST_CreateTopoGeo — 将几何图形集合添加到给定的空拓扑中,并返回一条详细说明成功的消息。
text ST_CreateTopoGeo(
varchar atopology, geometry acollection)
;
将几何图形集合添加到给定的空拓扑中,并返回一条详细说明成功的消息。
对于填充空拓扑很有用。
可用性:2.0
This method implements the SQL/MM specification. 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)
;
TopoGeo_AddLineString — 使用公差并可能拆分现有边/面将线串添加到现有拓扑。返回边标识符。
SETOF integer TopoGeo_AddLineString(
varchar atopology, geometry aline, float8 tolerance)
;
将线串添加到现有拓扑并返回一组构成它的边标识符。给定线将捕捉到给定公差内的现有节点或边。现有边和面可能会被这条线分割。
![]() | |
有关通过此函数加载的拓扑的更新统计信息取决于调用方,请参见 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
线绳
连接两个现有隔离节点的拓扑 阳极
和 另一个节点
并返回新边的边ID。 尖点
几何体以抛出错误的节点的形式存在。返回Move的描述。ST_AddIsoNode — 将隔离节点添加到拓扑中的面,并返回新节点的节点ID。如果Faces为空,仍会创建该节点。
integer ST_AddIsoNode(
varchar atopology, integer aface, geometry apoint)
;
ST_AddIsoEdge — 添加由几何图形定义的隔离边 线绳
连接两个现有隔离节点的拓扑 阳极
和 另一个节点
并返回新边的边ID。
integer ST_AddIsoEdge(
varchar atopology, integer anode, integer anothernode, geometry alinestring)
;
ST_AddEdgeNewFaces — 添加新边,如果这样做会分割一个面,则删除原始面并用两个新面替换它。
integer ST_AddEdgeNewFaces(
varchar atopology, integer anode, integer anothernode, geometry acurve)
;
ST_AddEdgeModFace — 添加新边,如果这样做会拆分面,则修改原始面并添加新面。
integer ST_AddEdgeModFace(
varchar atopology, integer anode, integer anothernode, geometry acurve)
;
添加新边,如果这样做会拆分面,请修改原始面并添加新的面。
![]() | |
如果可能,新面将在新边的左侧创建。如果左侧的面需要是宇宙面(无边界),则不可能执行此操作。 |
返回新添加的边的ID。
相应地更新所有现有的连接边和关系。
如果任何参数为空,则给定节点是未知的(必须已存在于 节点
拓扑模式表), 曲线型
不是一个 LINESTRING
,即 阳极
和 另一个节点
并不是 曲线型
然后抛出一个错误。
如果空间参考系(SRID)的 曲线型
几何图形与引发异常的拓扑不同。
可用性:2.0
This method implements the SQL/MM specification. SQL-MM:Topo-Geo和Topo-Net 3:例程详细信息:X.3.13
ST_RemEdgeNewFace — 删除边,如果删除的边分隔两个面,则删除原始面并将其替换为新面。
integer ST_RemEdgeNewFace(
varchar atopology, integer anedge)
;
删除边,如果删除的边分隔两个面,则删除原始面并将其替换为新面。
返回新创建的面的ID,如果没有创建新面,则返回NULL。当移除的边悬挂或与宇宙面隔离或被限制时,不会创建新的面(可能会使宇宙涌入另一边的面)。
相应地更新所有现有的连接边和关系。
拒绝删除参与现有拓扑几何图形定义的边。如果任何拓扑几何体仅由其中一个(而不是另一个)定义,则拒绝修复两个面。
如果任何参数为空,则给定边是未知的(必须已存在于 边缘
拓扑模式表),则拓扑名称无效,则抛出错误。
可用性:2.0
This method implements the SQL/MM specification. SQL-MM:Topo-Geo和Topo-Net 3:例程详细信息:X.3.14
ST_RemEdgeModFace — 删除一条边,如果删除的边分隔了两个面,则删除其中一个面并修改另一个边以占据两个面的空间。
integer ST_RemEdgeModFace(
varchar atopology, integer anedge)
;
删除一条边,如果删除的边分隔了两个面,则删除其中一个面并修改另一个边以占据两个面的空间。优先将面保持在右侧,以与ST_AddEdgeMODFace保持对称。返回保留在已移除边的位置的面的ID。
相应地更新所有现有的连接边和关系。
拒绝删除在现有拓扑几何图形的定义中指定的边。如果任何拓扑几何体仅由其中一个(而不是另一个)定义,则拒绝修复两个面。
如果任何参数为空,则给定边是未知的(必须已存在于 边缘
拓扑模式表),则拓扑名称无效,则抛出错误。
可用性:2.0
This method implements the SQL/MM specification. SQL-MM:Topo-Geo和Topo-Net 3:例程详细信息:X.3.15
ST_ChangeEdgeGeom — 更改边的形状,而不影响拓扑结构。
integer ST_ChangeEdgeGeom(
varchar atopology, integer anedge, geometry acurve)
;
更改边的形状,而不影响拓扑结构。
如果任何参数为空,则给定边不存在于 边缘
拓扑架构表,即 曲线型
不是一个 LINESTRING
,即 阳极
和 另一个节点
并不是 曲线型
或者修改会改变底层拓扑,则抛出错误。
如果空间参考系(SRID)的 曲线型
几何图形与引发异常的拓扑不同。
如果新的 曲线型
并不简单,则会引发错误。
如果将边从旧位置移动到新位置会遇到障碍,则会抛出错误。
可用性:1.1.0
增强版:2.0.0增加了拓扑一致性强制
This method implements the SQL/MM specification. SQL-MM:Topo-Geo和Topo-Net 3:例程详细信息X.3.6
ST_ModEdgeSplit — 通过沿现有边创建新节点、修改原始边并添加新边来分割边。
integer ST_ModEdgeSplit(
varchar atopology, integer anedge, geometry apoint)
;
通过沿现有边创建新节点、修改原始边并添加新边来分割边。相应地更新所有现有的连接边和关系。返回新添加的节点的标识符。
可用性:1.1
已更改:2.0-在先前版本中,该名称被错误命名为ST_ModEdgesSplit
This method implements the SQL/MM specification. 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)
;
ST_NewEdgeHeal — 通过删除连接两条边的节点、删除两条边并将其替换为方向与提供的第一条边相同的边来修复两条边。
int ST_NewEdgeHeal(
varchar atopology, integer anedge, integer anotheredge)
;
ST_MoveIsoNode — 将拓扑中的隔离节点从一点移动到另一点。如果是新的 尖点
几何体以抛出错误的节点的形式存在。返回Move的描述。
text ST_MoveIsoNode(
varchar atopology, integer anedge, geometry apoint)
;
将拓扑中的隔离节点从一点移动到另一点。如果是新的 尖点
几何体以抛出错误的节点的形式存在。
如果任何参数为空,则 尖点
不是点,现有节点不是孤立的(是现有边的起点或终点),新节点位置与现有边相交(即使在终点),或者新位置位于不同的面(从3.2.0开始),则会引发异常。
如果点几何图形的空间参考系统(SRID)与拓扑不同,则会抛出异常。
可用性:2.0.0
增强:3.2.0确保点头不会移动到不同的面上
This method implements the SQL/MM specification. 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)
;
分割具有边ID的边 边
通过创建点位置的新节点 尖点
沿当前边,删除原始边并将其替换为两条新边。返回连接新边而创建的新节点的ID。相应地更新所有现有的连接边和关系。
如果点几何的空间参考系(SRID)与拓扑不同,则 尖点
不是点几何图形,点为空,点已经作为节点存在,边不对应于现有边,或者点不在边内,则抛出异常。
可用性:1.1
This method implements the SQL/MM specification. 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
This method implements the SQL/MM specification. SQL-MM:Topo-Geo和Topo-Net 3:例程详细信息:X+1.3.3
ST_RemoveIsoEdge — 删除隔离边并返回操作说明。如果边缘不是孤立的,则会引发异常。
text ST_RemoveIsoEdge(
varchar atopology, integer anedge)
;
删除隔离边并返回操作说明。如果边缘不是孤立的,则会引发异常。
可用性:1.1
This method implements the SQL/MM specification. SQL-MM:Topo-Geo和Topo-Net 3:例程详细信息:X+1.3.3
正面
。GetEdgeByPoint — 查找与给定点相交的边的边ID。
integer GetEdgeByPoint(
varchar atopology, geometry apoint, float8 tol1)
;
检索与点相交的边的ID。
在给定拓扑、点和公差的情况下,该函数返回整数(id-edge)。如果公差=0,则该点必须与边相交。
如果 尖点
不与边相交,返回0(零)。
如果使用公差 >0,并且该点附近有多条边,则会引发异常。
![]() | |
如果容差=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)
;
GetNodeByPoint — 查找位于点位置的节点的node-id。
integer GetNodeByPoint(
varchar atopology, geometry apoint, float8 tol1)
;
检索点位置处的节点的ID。
在给定拓扑、点和公差的情况下,该函数返回一个整数(id节点)。如果容差=0表示精确相交,否则从间隔中检索节点。
如果 尖点
不与节点相交,返回0(零)。
如果使用容差 >0,并且该点附近有多个节点,则会引发异常。
![]() | |
如果容差=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
获取拓扑ID — 在给定拓扑名的情况下,返回topology.topology表中拓扑的ID。
integer GetTopologyID(
varchar toponame)
;
获取拓扑SRID — 在给定拓扑名称的情况下,返回topology.topology表中的拓扑的SRID。
integer GetTopologyID(
varchar toponame)
;
ST_GetFaceEdges — 返回一组绑定的有序边 正面
。
getfaceedges_returntype ST_GetFaceEdges(
varchar atopology, integer aface)
;
返回一组绑定的有序边 正面
。每个输出由一个序列和edgeid组成。序列号以值1开头。
每个环形边的枚举从具有最小标识符的边开始。边的顺序遵循左侧规则(约束面位于每条有向边的左侧)。
可用性:2.0
This method implements the SQL/MM specification. 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
This method implements the SQL/MM specification. 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)
;
多角化 — 查找并注册由拓扑边定义的所有面。
text Polygonize(
varchar toponame)
;
AddNode — 将点节点添加到指定拓扑架构中的节点表,并返回新节点的节点ID。如果point已经作为节点存在,则返回现有的nodeid。
integer AddNode(
varchar toponame, geometry apoint, boolean allowEdgeSplitting=false, boolean computeContainingFace=false)
;
将点节点添加到指定拓扑模式中的节点表。这个 AddEdge 函数在调用时自动添加边的起点和终点,因此不必显式添加边的节点。
如果找到与节点交叉的任何边,则会引发异常或拆分该边,具体取决于 允许边分割
参数值。
如果 ComputeContainingFacebook
如果为真,则新添加的节点将计算正确的包含面。
![]() | |
如果 |
可用性:2.0.0
AddEdge — 使用指定的线串几何图形将线串边添加到边表中,并将关联的起点和终点添加到指定拓扑模式的点节点表中,并返回新(或现有)边的边ID。
integer AddEdge(
varchar toponame, geometry aline)
;
将边添加到边表,并将关联节点添加到指定的 拓扑名
架构,并返回新记录或现有记录的EdgeID。新添加的边缘在两侧都有“宇宙”面,并与自身相连。
![]() | |
如果 |
![]() | |
的几何学 |
由GEOS模块执行。
可用性: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字段中具有正确的值。面中包含的隔离节点也将更新为具有正确的CONTINING_FACE字段值。
![]() | |
此函数不使用也不设置边缘表的NEXT_LEFT_EDGE和NEXT_RIGHT_EDGE字段。 |
假设目标拓扑有效(不包含自交边)。如果存在以下情况,则会引发异常:多边形边界未完全由现有边定义,或者该多边形与现有面重叠。
如果 脱脂蛋白
几何体已作为面存在,则:如果 force_new
为FALSE(默认值),则返回现有面的面ID;如果为 force_new
如果是真的,将为新注册的人脸分配新的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
拓扑元素阵列
对于一组Element_id,输入ARRAYS(TopoElements)。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。
点状层由一组节点形成,线状层由一组边形成,面层由一组面形成,集合可以由节点、边和面的混合形成。
如果省略组件数组,则会生成一个空的TopGeometry对象。
可用性:1.1
在ri_topo方案中为第2层(我们的ri_Roads)创建一个topogeom,类型为(2)行,用于第一条边(我们在中加载 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;
ToTopGeom — 将简单几何图形转换为拓扑几何图形。
topogeometry toTopoGeom(
geometry geom, varchar toponame, integer layer_id, float8 tolerance)
;
topogeometry toTopoGeom(
geometry geom, topogeometry topogeom, float8 tolerance)
;
将简单几何图形转换为 TopoGeometry 。
表示输入几何所需的拓扑基元将被添加到基础拓扑中,可能会分割现有拓扑,并且它们将与中的输出拓扑几何相关联 关系
桌子。
现有拓扑几何对象(可能有例外 拓扑学
)将保持其形状。
什么时候 容忍度
则它将用于将输入几何图形捕捉到现有基本体。
在第一种形式中,将为给定层创建一个新的拓扑几何( layer_id
)指定的拓扑( 拓扑名
)。
在第二种形式中,转换产生的基元将被添加到先前存在的Topo几何图形( 拓扑学
),可能会为它的最终形状增加空间。要使新形状完全替换旧形状,请参阅 ClearTopGeom 。
可用性:2.0
增强:2.1.0添加了采用现有拓扑几何的版本。
这是一个完全独立的工作流
-- 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,输入ARRAYS(TopoElements)。
topoelementarray TopoElementArray_Agg(
topoelement set tefield)
;
ClearTopGeom — 清除地形几何图形的内容。
topogeometry clearTopoGeom(
topogeometry topogeom)
;
TopoGeom_addElement — 将元素添加到拓扑几何图形的定义。
topogeometry TopoGeom_addElement(
topogeometry tg, topoelement el)
;
TopoGeom_remElement — 从拓扑几何图形的定义中删除元素。
topogeometry TopoGeom_remElement(
topogeometry tg, topoelement el)
;
TopoGeom_addTopoGeom — 将一个拓扑几何图形的元素添加到另一个拓扑几何图形的定义中。
topogeometry TopoGeom_addTopoGeom(
topogeometry tgt, topogeometry src)
;
将元素添加到 TopoGeometry 如果需要保存源对象中的所有元素,则可能会将其缓存类型(类型属性)更改为集合。
这两个拓扑几何对象需要针对*相同*拓扑定义,并且如果按层次定义,则需要由相同子层的元素组成。
可用性:3.2
拓扑元素阵列
(拓扑元素数组),包含给定拓扑几何的拓扑元素和类型(基元元素)。 拓扑元素
包含给定拓扑几何的拓扑元素_id、元素类型的对象(基本元素)。GetTopoGeomElementArray — 返回一个 拓扑元素阵列
(拓扑元素数组),包含给定拓扑几何的拓扑元素和类型(基元元素)。
topoelementarray GetTopoGeomElementArray(
varchar toponame, integer layer_id, integer tg_id)
;
topoelementarray topoelement GetTopoGeomElementArray(
topogeometry tg)
;
返回一个 TopoElementArray 包含给定拓扑几何的拓扑元素和类型(基元元素)。这类似于GetTopoGeomElement,不同之处在于它将元素作为数组而不是数据集返回。
Tg_id是由表示的层中的拓扑中的拓扑几何对象的拓扑几何ID layer_id
在topology.layer表中。
可用性:1.1
GetTopoGeomElements — 返回一组 拓扑元素
包含给定拓扑几何的拓扑元素_id、元素类型的对象(基本元素)。
setof topoelement GetTopoGeomElements(
varchar toponame, integer layer_id, integer tg_id)
;
setof topoelement GetTopoGeomElements(
topogeometry tg)
;
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的底层调用。
这个 已访问的表
参数(如果给定)用于跟踪访问的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
参数(如果给定)将放在边缘和节点标签标识符前。
这个 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>
AsTopo JSON — 返回拓扑几何的TopOJSON表示。
text AsTopoJSON(
topogeometry tg, regclass edgeMapTable)
;
返回拓扑几何的TopOJSON表示。如果 边缘映射表
不为空,则它将用作边标识符到弧形索引的查找/存储映射。这将允许在最终文档中使用紧凑的“圆弧”数组。
如果给定该表,则应该有一个类型为“Serial”的“arcid”字段和一个类型为INTEGER的“edge_id”;代码将在该表中查询“edge_id”,因此建议在该字段上添加一个索引。
![]() | |
Topo JSON输出中的圆弧索引是从0开始的,但在“edgeMapTable”表中是从1开始的。 |
除了此函数返回的代码片段外,完整的TopOJSON文档还需要包含实际弧线和一些头文件。请参阅 Topo JSON规范 。
可用性:2.1.0
增强:2.2.1增加了对拼音输入的支持
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]] ]}
等于 — 如果两个拓扑几何由相同的拓扑基元组成,则返回True。
boolean Equals(
topogeometry tg1, topogeometry tg2)
;
对于大多数使用案例,您将通过使用打包的加载现有栅格文件来创建PostGIS栅格 栅格2pgsql
栅格加载器。
这个 栅格2pgsql
是一个栅格加载器可执行文件,用于将GDAL支持的栅格格式加载到适合加载到PostGIS栅格表的SQL中。它能够加载栅格文件的文件夹以及创建栅格概述。
由于raster2pgsql最常被编译为PostGIS的一部分(除非您编译自己的GDAL库),因此可执行文件支持的栅格类型将与GDAL依赖库中编译的栅格类型相同。要获取您的特定raster2pgsql支持的栅格类型列表,请使用 -G
换一下。这些内容应与此处记录的PostGIS安装提供的内容相同 ST_GDALDrivers 如果您对两者使用相同的GDAL库。
![]() | |
该工具的较早版本是一个python脚本。该可执行文件已取代了python脚本。如果您仍然需要Python脚本示例,可以在 GDAL PostGIS栅格驱动程序使用 。请注意,raster2pgsql python脚本可能不适用于未来版本的PostGIS栅格,因此不再受支持。 |
![]() | |
从一组已对齐的栅格创建特定因子的概视图时,概视图可能不对齐。参观 http://trac.osgeo.org/postgis/ticket/1764 例如,俯视图不对齐。 |
用法示例:
raster2pgsqlraster_options_go_here
raster_file
someschema
.sometable
> out.sql
显示帮助屏幕。如果您不传递任何参数,也会显示帮助。
打印支持的栅格格式。
创建新表格并用栅格填充它, 这是默认模式
将栅格追加到现有表中。
删除表,创建新表并使用栅格填充它
准备模式,只创建表格。
应用栅格约束--sRID、像素大小等以确保在中正确注册栅格 raster_columns
查看。
禁用设置最大范围约束。仅当还使用-C标志时才适用。
设置常规分块的约束(空间唯一和覆盖平铺)。仅当还使用-C标志时才适用。
为输出栅格分配指定的SRID。如果未提供或为零,则将检查栅格的元数据以确定适当的SRID。
要从栅格中提取的波段的索引(从1开始)。对于多个波段索引,请用逗号(,)分隔。如果未指定,则将提取栅格的所有波段。
将栅格剪切成要插入的平铺,每表行一个。 TILE_SIZE
表示为WIDTHxHEIGHT或设置为值“AUTO”,以允许加载程序使用第一个栅格计算适当的平铺大小并应用于所有栅格。
填充最右侧和最底部的瓷砖,以确保所有瓷砖的宽度和高度相同。
将栅格注册为文件系统(out-db)栅格。
只有栅格的元数据和栅格的路径位置存储在数据库中(而不是像素)。
-l
OVERVIEW_FACTOR
创建栅格的概览。对于多个因素,请用逗号(,)分隔。概览表名称遵循模式o_ 总览系数
_ 表格
,在哪里 总览系数
是数字总览系数的占位符,并且 表格
替换为基表名称。创建的概述存储在数据库中,不受-R的影响。请注意,您生成的SQL文件将同时包含主表和概览表。
NODATA
要在没有NODATA值的标注栏上使用的NODATA值。
指定目标栅格列的名称,默认为‘Rast’
使用文件名添加一列
指定文件名列的名称。隐含-F。
将PostgreSQL标识符括在引号中。
在栅格列上创建一个Gist索引。
对栅格表进行真空分析。
跳过每个栅格标注栏的NODATA值检查。
表空间
指定新表的表空间。请注意,索引(包括主键)仍将使用默认表空间,除非还使用-X标志。
表空间
指定表的新索引的表空间。如果使用-i标志,这适用于主键和空间索引。
使用COPY语句而不是INSERT语句。
单独执行每条语句,不要使用事务。
控制栅格生成的二进制输出的字节顺序;为XDR指定0,为NDR指定1(默认);现在仅支持NDR输出
版本
指定输出格式的版本。默认值为0。目前仅支持0。
一个使用加载器创建输入文件并将其分块上传到100x100块的示例会话可能如下所示:
![]() | |
您可以省略架构名称,例如 |
raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 public.demelevation > elev.sql psql -d gisdb -f elev.sql
转换和上载可以使用UNIX管道在一个步骤中完成:
Raster2pgsql-s 4326-i-C-M*.tif-F-t 100x100 Public.demElevation|psql-d gisdb
将栅格马萨诸塞州平面米航拍切片加载到名为 天线
并创建一个完整的视图,2级和4级概览表,使用复制模式进行插入(没有直接到数据库的中间文件),以及-e不强制事务中的所有内容(如果您希望在不等待的情况下立即看到表中的数据,这是很好的)。将栅格分解为128x128像素的平铺并应用栅格约束。使用复制模式而不是表插入。(-F)包括一个名为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-p5432
--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 JAXA PALSAR Product Reader (Level 1.1/1.5) Ground-based SAR Applications Testbed File Format (.gff) ELAS Arc/Info Binary Grid Arc/Info ASCII Grid GRASS ASCII Grid SDTS Raster DTED Elevation Raster Portable Network Graphics JPEG JFIF In Memory Raster Japanese DEM (.mem) Graphics Interchange Format (.gif) Graphics Interchange Format (.gif) Envisat Image Format Maptech BSB Nautical Charts X11 PixMap Format MS Windows Device Independent Bitmap SPOT DIMAP AirSAR Polarimetric Image RadarSat 2 XML Product PCIDSK Database File PCRaster Raster File ILWIS Raster Map SGI Image File Format 1.0 SRTMHGT File Format Leveller heightfield Terragen heightfield USGS Astrogeology ISIS cube (Version 3) USGS Astrogeology ISIS cube (Version 2) NASA Planetary Data System EarthWatch .TIL ERMapper .ers Labelled NOAA Polar Orbiter Level 1b Data Set FIT Image GRIdded Binary (.grb) Raster Matrix Format EUMETSAT Archive native (.nat) Idrisi Raster A.1 Intergraph Raster Golden Software ASCII Grid (.grd) Golden Software Binary Grid (.grd) Golden Software 7 Binary Grid (.grd) COSAR Annotated Binary Matrix (TerraSAR-X) TerraSAR-X Product DRDC COASP SAR Processor Raster R Object Data Store Portable Pixmap Format (netpbm) USGS DOQ (Old Style) USGS DOQ (New Style) ENVI .hdr Labelled ESRI .hdr Labelled Generic Binary (.hdr Labelled) PCI .aux Labelled Vexcel MFF Raster Vexcel MFF2 (HKV) Raster Fuji BAS Scanner Image GSC Geogrid EOSAT FAST Format VTP .bt (Binary Terrain) 1.3 Format Erdas .LAN/.GIS Convair PolGASP Image Data and Analysis NLAPS Data Format Erdas Imagine Raw DIPEx FARSITE v.4 Landscape File (.lcp) NOAA Vertical Datum .GTX NADCON .los/.las Datum Grid Shift NTv2 Datum Grid Shift ACE2 Snow Data Assimilation System Swedish Grid RIK (.rik) USGS Optional ASCII DEM (and CDED) GeoSoft Grid Exchange Format Northwood Numeric Grid Format .grd/.tab Northwood Classified Grid Format .grc/.tab ARC Digitized Raster Graphics Standard Raster Product (ASRP/USRP) Magellan topo (.blx) SAGA GIS Binary Grid (.sdat) Kml Super Overlay ASCII Gridded XYZ HF2/HFZ heightfield raster OziExplorer Image File USGS LULC Composite Theme Grid Arc/Info Export E00 GRID ZMap Plus Grid NOAA NGS Geoid Height Grids
在许多情况下,您会希望在数据库中直接创建栅格和栅格表。有太多的函数可以做到这一点。要遵循的一般步骤。
创建包含栅格列的表以保存新的栅格记录,这可以通过以下方式完成:
创建表myraster(RID序列主键、RAST栅格);
有许多功能可以帮助实现这一目标。如果您要创建的栅格不是其他栅格的派生栅格,则需要从以下内容开始: ST_MakeEmptyRaster ,然后是 ST_AddBand
也可以从几何图形创建栅格。要实现这一点,您需要使用 ST_AsRaster 或许还伴随着其他功能,如 ST_Union 或 ST_MapAlgebraFct 或其他地图代数函数族中的任何一个。
甚至还有更多选项可用于从现有表创建新的栅格表。例如,您可以使用在不同于现有投影的投影中创建栅格表 ST_Transform
最初填充表后,您需要在栅格列上创建一个空间索引,如下所示:
使用GIST(ST_ConvexHull(Rast))在myraster上创建索引myraster_rast_st_vvexhull_idx;
请注意 ST_ConvexHull 因为大多数栅格运算符都是基于栅格的凸壳的。
![]() | |
2.0之前版本的PostGIS栅格是基于封套而不是凸壳的。为了使空间索引正常工作,您需要删除这些索引,并替换为基于凸壳的索引。 |
使用以下内容应用栅格约束 AddRasterConstraints
这个 栅格2pgsql
该工具使用GDAL来访问栅格数据,并且可以利用GDAL的一项关键功能:能够读取符合以下条件的栅格 远程存储 在云“对象存储”中(例如,AWS S3、谷歌云存储)。
要有效使用云存储的栅格,需要使用“云优化”格式。最广为人知和使用最广泛的是“ 云优化GeoTIFF 使用非云格式,如JPEG或非平铺的TIFF将导致非常差的性能,因为系统每次需要访问子集时都必须下载整个栅格。
首先,将您的栅格加载到您选择的云存储中。加载后,您将有一个URI来访问它,可以是“http”URI,有时也可以是特定于服务的URI。(例如,“s3://存储桶/对象”)。要访问非公共存储桶,您需要提供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';
对于非公共栅格,您可能需要提供访问密钥才能从云栅格中读取。您用来编写 栅格2pgsql
调用可以设置为在数据库内部使用,使用 postgis.gdal_config_options 配置。注意,可以通过空格分隔设置多个选项 键=值
成对的。
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
CATALOG注册有关您的栅格平铺的常见信息。
r_table_catalog
表所在的数据库。这将始终读取当前数据库。
r_table_schema
栅格表所属的数据库模式。
r_table_name
栅格表
r_raster_column
中的列 r_table_name
栅格类型的表。在PostGIS中,没有什么可以阻止您在每个表中拥有多个栅格列,因此可以多次列出一个栅格表,每个栅格表都有一个不同的栅格列。
格栅
栅格的空间参考标识符。中的条目。 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
一个布尔值,如果所有栅格平铺都具有相同的对齐方式,则为真。参考 ST_SameAlignment 了解更多详细信息。
regular_blocking
如果栅格列具有空间唯一和覆盖范围平铺约束,则值为TRUE。否则,它将是错误的。
num_bands
栅格集的每个平铺中的波段数。这与由提供的信息相同 ST_NumBands
pixel_types
定义每个波段的像素类型的数组。此数组中的元素数量与波段数量相同。Pixel_Types是中定义的以下类型之一 ST_BandPixelType 。
nodata_values
一个双精度数字数组,表示 nodata_value
每个乐队都有。此数组中的元素数量与波段数量相同。这些数字定义了在大多数操作中应忽略的每个波段的像素值。这是由提供的类似信息 ST_BandNoDataValue 。
out_db
指示是否在数据库外部维护栅格标注栏数据的布尔标志数组。此数组中的元素数量与波段数量相同。
程度
这是栅格集中所有栅格行的范围。如果您计划加载更多将更改集合范围的数据,则需要运行 DropRasterConstraints 函数,然后使用 AddRasterConstraints 装货后。
spatial_index
一个布尔值,如果栅格列具有空间索引,则为真。
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 IS将使每个瓷砖代表原始瓷砖的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,view_factor)像素的原始)。
PostGIS栅格为您提供了以已知图像格式渲染栅格的SQL函数,这一事实为您提供了许多渲染选项。例如,您可以使用OpenOffice/LibreOffice进行渲染,如中所示 使用LibreOffice基本报表渲染PostGIS栅格图形 。此外,您还可以使用本节中演示的多种语言。
在本节中,我们将演示如何使用PHP PostgreSQL驱动程序和 ST_AsGDALRaster 将栅格的波段1、2、3输出到PHP请求流的函数系列,然后可以嵌入到img src html标记中。
示例查询演示了如何将一整组栅格函数组合在一起,以获取与特定WGS 84边界框相交的所有切片,然后与 ST_Union 相交的切片一起返回所有波段,使用转换为用户指定的投影 ST_Transform ,然后使用PNG将结果输出为PNG ST_AsPNG 。
您可以使用以下命令调用以下代码
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.NETbin文件夹,就可以了。
示例查询演示了如何将一整组栅格函数组合在一起,以获取与特定WGS 84边界框相交的所有切片,然后与 ST_Union 相交的切片一起返回所有波段,使用转换为用户指定的投影 ST_Transform ,然后使用PNG将结果输出为PNG ST_AsPNG 。
这与下面的示例相同 Section 11.3.1, “结合使用ST_AsPNG和其他栅格函数的PHP输出示例” 除了用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控制台应用程序,它接受一个查询,返回一个图像并输出到指定的文件。
您可以从下载最新的PostgreSQL JDBC驱动程序 http://jdbc.postgresql.org/download.html
您可以使用类似以下命令的命令编译以下代码:
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对遗留大对象的支持。要使用它,首先启动连接到数据库的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栅格的用户可能需要的,并且目前在PostGIS栅格中可用。还有其他功能是对一般用户不使用的栅格对象所需的支持功能。
栅格
是一种新的PostGIS类型,用于存储和分析栅格数据。
有关从栅格文件加载栅格的信息,请参阅 Section 11.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);
Geomval — 具有两个字段的空间数据类型-geom(保存几何图形对象)和val(保存来自栅格标注栏的双精度像素值)。
添加带宽参数 — 用作ST_AddBand函数的输入的复合类型,用于定义新标注栏的属性和初始值。
用作ST_AddBand函数的输入的复合类型,用于定义新标注栏的属性和初始值。
index
integer 从1开始的值,指示将在栅格的波段中添加新波段的位置。如果为空,则新的波段将添加到栅格波段的末尾。
pixeltype
text 新带区的像素类型。定义的像素类型之一,如中所述 ST_BandPixelType 。
initialvalue
double precision 新波段的所有像素将被设置为的初始值。
nodataval
double precision 新标注栏的NODATA值。如果为空,则不会为新标注栏分配NODATA值。
栅格 — 栅格空间数据类型。
栅格是一种空间数据类型,用于表示从JPEG、TIFF、PNG、数字高程模型导入的栅格数据。每个栅格都有一个或多个波段,每个波段都有一组像素值。可以对栅格进行地理参考。
![]() | |
需要使用GDAL支持编译PostGIS。当前,栅格可以隐式转换为几何类型,但转换会返回 ST_ConvexHull 在栅格上。这种自动铸造可能会在不久的将来被移除,所以不要依赖它。 |
重新分类 — 用作ST_Reclass函数的输入的复合类型,用于定义重分类行为。
用作ST_Reclass函数的输入的复合类型,用于定义重分类行为。
N带
整数 要重新分类的波段编号。
重分类表达式
文本 由逗号分隔的范围组成的范围表达式: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)相同)
像素类型
文本 定义的像素类型之一,如中所述 ST_BandPixelType
节点值
双精度 要视为无数据的值。对于支持透明度的图像输出,这些选项将为空白。
摘要统计信息 — ST_SummaryStats和ST_SummaryStatsAgg函数返回的复合类型。
方法返回的复合类型。 ST_SummaryStats 和 ST_SummaryStatsAgg 功能。
count
integer 为汇总统计信息计数的像素数。
sum
double precision 所有计数的像素值的总和。
mean
double precision 所有计数的像素值的算术平均值。
stddev
double precision 所有计数的像素值的标准差。
min
double precision 计数的像素值的最小值。
max
double precision 计数的像素值的最大值。
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
栅格目录。这个 栅格模式
表所在的表架构的名称。这个 格栅
必须是对SPATIAL_REF_SYS表中条目的整数值引用。
栅格2pgsql
加载器使用此函数注册栅格表
要传入的有效约束名称:请参阅 Section 11.2.1, “栅格列目录” 了解更多详细信息。
块大小
同时设置X和Y块大小
blocksize_x
设置X平铺(每个平铺的宽度以像素为单位)
blocksize_y
设置Y平铺(每个平铺的高度以像素为单位)
程度
计算整个表的范围并应用约束所有栅格必须在该范围内
num_bands
频带数目
pixel_types
读取每个波段的像素类型数组,确保所有波段n具有相同的像素类型
regular_blocking
设置空间唯一(两个栅格在空间上不能相同)和Coverage切片(栅格与Coverage对齐)约束
same_alignment
确保它们都具有相同的对齐方式,这意味着您比较的任何两个瓷砖都将返回TRUE。参考 ST_SameAlignment 。
格栅
确保所有服务器都具有相同的sRID
更多--作为上述函数的输入列出的任何
![]() | |
此函数从表中已有的数据推断约束。因此,必须先创建栅格列,然后再将数据加载到栅格列,才能使其工作。 |
![]() | |
如果在应用约束之后需要在表中加载更多数据,则在数据范围发生更改的情况下可能需要运行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)
;
删除引用由添加的栅格表列的PostGIS栅格约束 AddRasterConstraints 。在需要加载更多数据或更新栅格列数据时非常有用。如果要删除栅格表或栅格列,则不需要执行此操作。
要删除栅格表,请使用标准
删除表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
栅格目录。
这个 卵泡因子
参数表示总览列中的比例乘数:总览系数越高,分辨率越低。
当 排卵模式
和 Ref架构
参数,则第一个找到的表将扫描 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)
;
PostGIS_GDAL_Version — 报告PostGIS正在使用的GDAL库的版本。
text PostGIS_GDAL_Version(
)
;
PostGIS_Raster_Lib_Build_Date — 报告完整的栅格库构建日期。
text PostGIS_Raster_Lib_Build_Date(
)
;
PostGIS_Raster_Lib_Version — 报告完整的栅格版本和构建配置信息。
text PostGIS_Raster_Lib_Version(
)
;
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支持的每种格式的栅格格式SHORT_NAME、LONG_NAME和CREATOR选项的列表。使用Short_Name作为 格式化
的参数 ST_AsGDALRaster 。根据libgdal编译时使用的驱动程序的不同,选项会有所不同。 create_options
返回由名称和可选选项组成的一组XML格式的CreationOptionList/选项 类型
, 描述
和一套 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, double precision level_interval, double precision level_base, double precision[] fixed_levels, boolean polygonize)
;
从提供的栅格波段生成一组矢量等高线,使用 GDAL等高线算法 。
当 fixed_levels
参数是非空数组,则 level_interval
和 level_base
参数将被忽略。
这个 多角化
参数当前不起作用。使用 ST_Polygonize 函数将等高线转换为多边形。
返回值是一组具有以下属性的记录:
等高线的几何图形。
由GDAL赋予等高线的唯一标识符。
线条表示的栅格值。对于高程DEM输入,这将是输出等高线的高程。
可用性:3.2.0
ST_InterpolateRaster — 基于三维点的输入集对栅格曲面进行内插,使用X和Y值来定位栅格上的点,并使用点的Z值作为曲面高程。
raster ST_InterpolateRaster(
geometry input_points, text algorithm_options, raster template, integer template_band_num=1)
;
基于三维点的输入集对栅格曲面进行内插,使用X和Y值来定位栅格上的点,并使用点的Z值作为曲面高程。有五种可用的内插算法:反距离、反距离最近邻、移动平均、最近邻和线性内插。请参阅 Gdal_GRID文档 有关算法及其参数的更多详细信息。有关如何计算内插的更多信息,请参阅 GDAL栅格教程 。
输入参数为:
驱动插补的点。任何带有Z值的几何体都是可接受的,输入中的所有点都将被使用。
定义算法和算法选项的字符串,格式为 gdal_grid 。例如,对于平滑为2的反比距离插值法,您可以使用“invdist:Smoting=2.0”。
用于驱动输出栅格几何图形的栅格模板。宽度、高度、像素大小、空间范围和像素类型将从此模板中读取。
默认情况下,模板栅格中的第一个标注栏用于驱动输出栅格,但可以使用此参数进行调整。
可用性:3.2.0
更新栅格SRID — 更改用户指定的列和表中所有栅格的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)
;
ST_CreateOverview — 创建给定栅格覆盖的降低分辨率版本。
regclass ST_CreateOverview(
regclass tab, name col, int factor, text algo='NearestNeighbor')
;
使用来自源表的重新采样的平铺创建概览表。输出切片将具有与输入切片相同的大小,并以较低的分辨率覆盖相同的空间范围(像素大小将为1/ 因素
在两个方向上的原件)。
概览表将在 raster_overviews
目录,并将强制实施栅格约束。
算法选项有:‘NearestNeighbor’、‘Billinine’、‘Cubic’、‘Cubi Spline’和‘Lanczos’。请参阅: GDAL扭曲重采样方法 了解更多详细信息。
可用性:2.2.0
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值添加了新波段的栅格。如果未指定索引,则将带区添加到末尾。如果没有 来自波段
如果指定,则假定为带1。中指定的一种像素类型的字符串表示形式 ST_BandPixelType 。如果指定了现有索引,则所有后续频段
>=该索引都将递增1。如果指定的初始值大于像素类型的最大值,则将初始值设置为像素类型允许的最高值。
对于接受数组 添加带宽参数 (变体1),特定Addband arg的索引值相对于该addband arg所描述的波段被添加到栅格时的栅格。请参见下面的多个新标注栏示例。
对于接受栅格数组的变量(变量5),如果 托拉斯特
为空,则 来自波段
将阵列中每个栅格的频带累加到新的栅格中。
对于那些需要 输出数据库文件
(变体6和7),则该值必须包括栅格文件的完整路径。Postgres服务器进程还必须可以访问该文件。
增强:增加了2.1.0对addband arg的支持。
增强:增加了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
, 鳞片
, 网格
和 格里迪
)、像素类型和nodata值作为提供的参考栅格。通常通过连接包含几何图形的表和包含参考栅格的表来传递此参考栅格。
The second group, composed of four variants, let you set the dimensions of the raster by providing the parameters of a pixel size (scalex
& scaley
and skewx
& skewy
). The width
& height
of the resulting raster will be adjusted to fit the extent of the geometry. In most cases, you must cast integer scalex
& scaley
arguments to double precision so that PostgreSQL choose the right variant.
The third group, composed of four variants, let you fix the dimensions of the raster by providing the dimensions of the raster (width
& height
). The parameters of the pixel size (scalex
& scaley
and skewx
& skewy
) of the resulting raster will be adjusted to fit the extent of the geometry.
The two first variants of each of those two last groups let you specify the alignment with an arbitrary corner of the alignment grid (gridx
& gridy
) and the two last variants takes the upper left corner (upperleftx
& upperlefty
).
每组变体允许产生一个单波段或多个波段的栅格。要生成多波段栅格,必须提供像素类型数组( 像素类型[]
)、初始值的数组( 价值
)和nodata值的数组( 节点值
)。如果未提供,则像素型默认设置为8BUI,值设置为1,nodataval设置为0。
输出栅格将与源几何图形位于相同的空间参考中。唯一的例外是带有参考栅格的变体。在这种情况下,生成的栅格将获得与参考栅格相同的SRID。
可选的 碰触
参数默认为FALSE并映射到GDAL ALL_TOTHED栅格化选项,该选项确定是否将烧录线或多边形接触的像素。不只是线渲染路径上的那些,或者中心点在多边形内的那些。
当与结合使用时,这对于直接从数据库渲染几何的jpeg和png特别有用 ST_AsPNG 以及其他 ST_AsGDALRaster 函数族。
可用性:2.0.0-需要GDAL > =1.6.0。
![]() | |
尚不能渲染复杂的几何体类型,如曲线、三角网和多面体曲面,但一旦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=,)
;
将现有栅格的一个或多个波段作为新栅格返回。用于从现有栅格构建新栅格、仅导出选定的栅格波段或重新排列栅格中的波段顺序。如果未指定标注栏或栅格中不存在任何指定标注栏,则将返回所有标注栏。在各种功能中用作辅助函数,例如用于删除波段。
![]() | |
For the |
可用性: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;
![]() 原始(Column Rast) | ![]() dupe_band | ![]() sing_band |
--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)
;
Create a set of raster tiles with ST_MakeEmptyRaster. Grid dimension is width
& height
. Tile dimension is tilewidth
& tileheight
. The covered georeferenced area is from upper left corner (upperleftx
, upperlefty
) to lower right corner (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(左上角)、左上角Y(左上角)、像素大小和旋转(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_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)
;
根据输出栅格的所需尺寸,返回通过拆分输入栅格产生的一组栅格。
如果 无数据的焊盘
=FALSE,则栅格右侧和底部的边缘平铺可能与其余平铺具有不同的尺寸。如果 无数据的焊盘
=True,则所有瓷砖将具有相同的尺寸,并可能使用NODATA值填充边缘瓷砖。如果栅格波段未指定NODATA值,则可通过设置来指定一个值 节点值
。
![]() | |
如果输入栅格的指定波段超出了db,则输出栅格中的相应波段也将是超出db的。 |
可用性: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
, 这是
)和覆盖指定范围( 分机
)和来自指定栅格Coverage的数据( 选项卡
, COL
)。
算法选项有:‘NearestNeighbor’、‘Billinine’、‘Cubic’、‘Cubi Spline’和‘Lanczos’。请参阅: GDAL扭曲重采样方法 了解更多详细信息。
可用性:2.2.0
ST_FromGDALRaster — 从支持的GDAL栅格文件返回栅格。
raster ST_FromGDALRaster(
bytea gdaldata, integer srid=NULL)
;
从支持的GDAL栅格文件返回栅格。 Gdaldata
类型为BYTEA,应为GDAL栅格文件的内容。
如果 格栅
为空,则该函数将尝试从GDAL栅格自动分配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)
;
ST_IsEmpty — 如果栅格为空(宽度=0,高度=0),则返回TRUE。否则,返回FALSE。
boolean ST_IsEmpty(
raster rast)
;
ST_MemSize — 返回栅格占用的空间量(以字节为单位)。
integer ST_MemSize(
raster rast)
;
返回栅格占用的空间量(以字节为单位)。
这是对PostgreSQL内置函数PG_COLUMN_SIZE、PG_SIZE_PRETY、PG_RELATION_SIZE、PG_TOTAL_RELATION_SIZE的一个很好的补充。
![]() | |
给出表的字节大小的PG_Relationship_SIZE可能返回小于ST_MemSize的字节大小。这是因为PG_Relationship_SIZE不添加烤面包表贡献,并且大几何图形存储在烤面包表中。PG_COLUMN_SIZE可能返回较低的值,因为它返回压缩大小。 PG_TOTAL_RELATION_SIZE-包括、表、烤面包表和索引。 |
可用性:2.2.0
ST_MetaData — 返回有关栅格对象的基本元数据,如像素大小、旋转(倾斜)、左上角、左下角等。
record ST_MetaData(
raster rast)
;
返回有关栅格对象的基本元数据,如像素大小、旋转(倾斜)、左上角、左下角等。返回的列:upperleftx|upperlefty|idth|Height|scalex|scaley|skewx|skewy|sRID|Numband
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)
;
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)
;
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)
;
ST_ScaleY — 以坐标参考系为单位返回像素高度的Y分量。
float8 ST_ScaleY(
raster rast)
;
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)
;
ST_SkewX — 返回地理参考X倾斜(或旋转参数)。
float8 ST_SkewX(
raster rast)
;
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)
;
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_Summary — 返回栅格内容的文本摘要。
text ST_Summary(
raster rast)
;
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)
;
ST_UpperLeftY — 返回投影空间参考中栅格的左上角Y坐标。
float8 ST_UpperLeftY(
raster rast)
;
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)
;
返回有关栅格标注栏的基本元数据。返回的列:象素类型、nodatavalue、isoutdb、路径、outdbband num、文件大小、文件时间戳。
![]() | |
如果栅格不包含波段,则会引发错误。 |
![]() | |
如果BAND没有NODATA值,则nodatavue为空。 |
![]() | |
如果isoutdb为FALSE,则路径、outDBband num、文件大小和文件时间戳为空。如果禁用outdb访问,则文件大小和文件时间戳也将为空。 |
增强版:2.5.0以包括 输出数据库带宽 , 文件大小 和 文件时间戳 用于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)
;
ST_BandIsNoData — 如果带区仅填充无数据值,则返回TRUE。
boolean ST_BandIsNoData(
raster rast, integer band, boolean forceChecking=true)
;
boolean ST_BandIsNoData(
raster rast, boolean forceChecking=true)
;
如果带区仅填充无数据值,则返回TRUE。如果未指定,则假定为带1。如果最后一个参数为真,则逐个像素检查整个波段。否则,该函数只返回频带的isnodata标志的值。如果未指定,则此参数的默认值为FALSE。
可用性:2.0.0
![]() | |
如果标志是脏的(即,使用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)
;
ST_BandFileTimestamp — 返回存储在文件系统中的带的文件时间戳。如果未指定带宽,则假定为1。
bigint ST_BandFileTimestamp(
raster rast, integer bandnum=1)
;
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位浮点
ST_MinPossibleValue — 返回此像素类型可以存储的最小值。
integer ST_MinPossibleValue(
text pixeltype)
;
ST_HasNoBand — 如果不存在具有给定波段编号的波段,则返回TRUE。如果未指定波段编号,则假定波段编号为1。
boolean ST_HasNoBand(
raster rast, integer bandnum=1)
;
exclude_nodata_value
设置为False,则所有像素都包括 无数据
像素被视为相交并返回值。如果 exclude_nodata_value
不传入,然后从栅格元数据中读取它。 NODATA
由Columnx和Rowy或在与栅格相同的空间参考坐标系中表示的几何点指定的给定波段的像素值。 NODATA
由ColumnX和Rowy指定的给定波段像素周围的值,或在与栅格相同的空间参考坐标系中表示的几何点。 ST_PixelAsPolygon — 返回限定特定行和列的像素的多边形几何图形。
geometry ST_PixelAsPolygon(
raster rast, integer columnx, integer rowy)
;
-- 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栅格坐标(整数)。
Return record format: geom
几何体 , val
double precision, x
integer, y
integers.
![]() | |
什么时候 |
![]() | |
ST_PixelAsPolygons为每个像素返回一个多边形几何体。这与ST_DumpAsPolygons不同,在ST_DumpAsPolygons中,每个几何体表示一个或多个具有相同像素值的像素。 |
可用性:2.0.0
增强:2.1.0添加了可选参数EXCLUDE_NODATA_VALUE。
已更改:2.1.1更改了EXCLUDE_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)
;
ST_PixelAsPoints — 返回栅格波段的每个像素的点几何图形以及每个像素的值、X和Y栅格坐标。点几何图形的坐标位于像素的左上角。
setof record ST_PixelAsPoints(
raster rast, integer band=1, boolean exclude_nodata_value=TRUE)
;
返回栅格波段的每个像素的点几何图形以及每个像素的值、X和Y栅格坐标。点几何图形的坐标位于像素的左上角。
Return record format: geom
几何体 , val
double precision, x
integer, y
integers.
![]() | |
什么时候 |
可用性:2.1.0
已更改:2.1.1更改了EXCLUDE_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)
;
ST_PixelAsCentroids — 返回栅格标注栏的每个像素的质心(点几何图形)以及每个像素的值、X和Y栅格坐标。点几何图形是由像素表示的区域的质心。
setof record ST_PixelAsCentroids(
raster rast, integer band=1, boolean exclude_nodata_value=TRUE)
;
返回栅格标注栏的每个像素的质心(点几何图形)以及每个像素的值、X和Y栅格坐标。点几何图形是由像素表示的区域的质心。
Return record format: geom
几何体 , val
double precision, x
integer, y
integers.
![]() | |
什么时候 |
增强:现在在C语言中实现的速度提高了3.2.0。
已更改:2.1.1更改了EXCLUDE_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、行像素或特定几何点处的给定带区的值。波段编号从1开始,如果未指定,则假定为1。如果 exclude_nodata_value
设置为False,则所有像素都包括 无数据
像素被视为相交并返回值。如果 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、行像素或给定几何点处的给定波段的值。波段编号从1开始,如果未指定,则假定波段为1。
如果 exclude_nodata_value
设置为True,则仅为None 无数据
像素被考虑在内。如果 exclude_nodata_value
设置为False,则考虑所有像素。
属性的允许值 重采样
参数是“NEAREST”,它执行默认的最近邻重采样,而“BILLINE”则执行 双线性插值法 估计像素中心之间的值。
增强:添加了3.2.0重采样可选参数。
增强:2.0.0添加了EXCLUDE_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 — 返回最接近的非 NODATA
由Columnx和Rowy或在与栅格相同的空间参考坐标系中表示的几何点指定的给定波段的像素值。
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)
;
返回最接近的非 NODATA
给定列X、行像素或特定几何点处的给定带值。如果列x、行像素或指定几何点处的像素为 NODATA
,则该函数将查找与其值不是的列x、行像素或几何点最近的像素 NODATA
。
频段编号从1开始,并且 频带
如果未指定,则假定为1。如果 exclude_nodata_value
设置为False,则所有像素都包括 无数据
像素被视为相交并返回值。如果 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维度。
这个 重采样
参数可设置为“最接近”以复制每个折点所在像元的值,或设置为“双线性”以使用 双线性插值法 以计算也考虑相邻单元格的值。
可用性: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坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到Z维度。
geometry ST_SetM(
raster rast, geometry geom, text resample=nearest, integer band=1)
;
返回与输入几何图形具有相同X/Y坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到Z维度。
这个 重采样
参数可设置为“最接近”以复制每个折点所在像元的值,或设置为“双线性”以使用 双线性插值法 以计算也考虑相邻单元格的值。
可用性: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
由ColumnX和Rowy指定的给定波段像素周围的值,或在与栅格相同的空间参考坐标系中表示的几何点。这个 距离X
和 距离Y
参数定义X和Y轴上指定像素周围的像素数,例如,我希望X轴上的所有值都在3像素距离内,Y轴上的值在感兴趣的像素周围2像素距离内。二维数组的中心值将是由ColumnX和Rowy或几何点指定的像素处的值。
频段编号从1开始,并且 频带
如果未指定,则假定为1。如果 exclude_nodata_value
设置为False,则所有像素都包括 无数据
像素被视为相交并返回值。如果 exclude_nodata_value
不传入,然后从栅格元数据中读取它。
![]() | |
沿返回的2-D数组的每个轴的元素数为2*( |
![]() | |
可以将2-D数组输出传递给任何栅格处理内置函数,例如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、行像素或与特定几何图形相交的像素中的给定波段的值而修改的栅格。波段编号从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。
增强:ST_SetValue()的2.1.0几何体变体现在支持任何几何体类型,而不仅仅是点。几何变量是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)
;
返回由于将指定的像素设置为指定波段的新值而修改的栅格。 列x
和 罗伊
是1索引的。
如果 保持数据
为真,则值为NODATA的那些像素不会在 新值集
。
对于变体1,要设置的特定像素由 列x
, 罗伊
的像素坐标和尺寸 新值集
数组。 NOSET
可以用来防止值出现在 新值集
从设置(由于PostgreSQL不允许粗糙/交错数组)。请参见示例变体1。
变体2类似于变体1,但具有简单的双精度 NosetValue
而不是布尔值 NOSET
数组。中的元素 新值集
使用 NosetValue
要跳过的值。请参见示例变体2。
对于变体3,要设置的特定像素由 列x
, 罗伊
像素坐标, 宽度
和 高度
。请参见示例变体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)
下图显示阵列中较晚的地理位置可以覆盖之前的地理位置
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 — 以二维数组的形式获取指定波段的值。
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 )
;
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 — 获取其值等于搜索值的像素的Columnx,Rowy坐标。
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 )
;
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 — 在单个调用中设置地理参考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)
;
一次调用设置地理参考6个地理参考参数。接受‘GDAL’或‘ESRI’格式的输入。默认为GDAL。如果未提供6个坐标,则返回NULL。
格式表示法之间的差异如下:
GDAL
:
鳞片状倾斜鳞片状上左上角
ESRI
:
Scalex skewy skewx scaleyupperleftx+scalex*0.5上方+scaley*0.5
![]() | |
如果栅格具有Out-db波段,则更改地理参考可能会导致不正确地访问波段的外部存储数据。 |
增强版:2.1.0新增ST_SetGeoReference(栅格,双精度,...)变异
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_RESERSCALE会导致计算出的栅格具有不同的宽度和高度,以适应输入栅格的地理范围。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)
;
-- 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)
;
ST_SetUpperLeft — 将栅格像素左上角的值设置为投影的X和Y坐标。
raster ST_SetUpperLeft(
raster rast, double precision x, double precision y)
;
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)
;
使用指定的重采样算法、新维度(宽度)重采样栅格 & 高度)、网格角(GRIDX & Gridy)和一组栅格地理配准属性(scalex、scaleY、skewx & Skewy)定义的或从另一个栅格借用的。如果使用参考栅格,则这两个栅格必须具有相同的SRID。
使用NearestNeighbor(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认为NearestNeighbor,它是最快的,但生成的插补最差。
如果没有,则使用最大错误百分比0.125 最大错误
是指定的。
![]() | |
请参阅: GDAL扭曲重采样方法 了解更多详细信息。 |
可用性:2.0.0需要GDAL 1.6.1+
已更改:已删除2.1.0参数sRID。具有参考栅格的变体不再应用参考栅格的SRID。使用ST_Transform()重新投影栅格。适用于没有SRID的栅格。
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(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认为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(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认值为NearestNeighbor,它是最快的,但结果是最差的插值。
Scalex
和 鳞片
定义新的像素大小。若要获得定向良好的栅格,scaleY通常必须为负数。
如果新的scalex或scaleY不是栅格宽度或高度的除数,则生成的栅格的范围将扩展为包含所提供的栅格的范围。如果要确保保留准确的输入范围,请参见 ST_Resize
最大错误
是重采样算法的变换近似阈值(以像素为单位)。如果没有,则使用缺省值0.125 最大错误
与GDAL gdalwarp实用程序中使用的值相同。如果设置为零,则不会发生近似。
![]() | |
请参阅: GDAL扭曲重采样方法 了解更多详细信息。 |
![]() | |
ST_RESale不同于 ST_SetScale 在ST_SetScale中,不要重新采样栅格以匹配栅格范围。ST_SetScale仅更改栅格的元数据(或地理参考)以更正最初错误指定的比例。ST_RESERSCALE会导致计算出的栅格具有不同的宽度和高度,以适应输入栅格的地理范围。ST_SetScale不修改栅格的宽度或高度。 |
可用性:2.0.0需要GDAL 1.6.1+
已更改: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(英式或美式拼写)、双线性、立方、立方样条线或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(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认值为NearestNeighbor,它是最快的,但结果是最差的插值。
弯曲度
和 歪斜的
定义新的倾斜。
新栅格的范围将包含提供的栅格的范围。
如果否,则最大错误百分比为0.125 最大错误
是指定的。
![]() | |
请参阅: GDAL扭曲重采样方法 了解更多详细信息。 |
![]() | |
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(英式或美式拼写)、双线性、立方、立方样条线或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 & Scale Ey)。使用NearestNeighbor(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认值为NearestNeighbor,它是最快的,但结果是最差的插值。
网格
和 格里迪
定义新网格的任意像素角。这不一定是新栅格的左上角,也不一定在新栅格范围的内部或边缘。
您可以选择使用定义新格网的像素大小 Scalex
和 鳞片
。
新栅格的范围将包含提供的栅格的范围。
如果否,则最大错误百分比为0.125 最大错误
是指定的。
![]() | |
请参阅: GDAL扭曲重采样方法 了解更多详细信息。 |
![]() | |
使用 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(英式或美式拼写)、双线性、立方、立方样条线或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、双线性、立方、三次样条、默认为NearestNeighbor的Lanczos。
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。
算法选项有:‘NearestNeighbor’、‘Billinine’、‘Cubic’、‘Cubi Spline’和‘Lanczos’。请参阅: GDAL扭曲重采样方法 了解更多详细信息。
ST_Transform经常与ST_SetSRID()混淆。ST_Transform实际上将栅格的坐标从一个空间参考系更改为另一个空间参考系(并对像素值进行重采样),而ST_SetSRID()只是更改了栅格的SRID标识符。
与其他变体不同,变体3需要参考栅格作为 对齐
。变换后的栅格将被变换到参考栅格的空间参考系(SRID),并与参考栅格对齐(ST_SameAlign=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 Long Late(WGS_84)后 | ![]() 使用双线性算法而不是NN默认(WGS_84_BILIN)转换为WGS 84 Long Long之后 |
下面显示了使用ST_Transform(栅格、SRID)和ST_Transform(栅格、对齐)之间的区别
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
![]() not_aligned
| ![]() 对齐
|
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)
;
-- 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 — 更新数据库外波段的外部路径和波段编号
raster ST_SetBandPath(
raster rast, integer band, text outdbpath, integer outdbindex, boolean force=false)
;
更新外部数据库波段的外部栅格文件路径和外部波段编号。
![]() | |
如果 |
![]() | |
在内部,此方法将在索引处替换PostGIS栅格的波段 |
可用性: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 — 更新数据库外波段的外部波段编号
raster ST_SetBandIndex(
raster rast, integer band, integer outdbindex, boolean force=false)
;
更新外db频段的外部频段编号。这不会触及与Out-db波段关联的外部栅格文件
![]() | |
如果 |
![]() | |
在内部,此方法将在索引处替换PostGIS栅格的波段 |
可用性: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 — 返回栅格或栅格覆盖的给定波段中的像素数。如果未指定波段,则默认为波段1。如果EXCLUDE_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)
;
返回栅格或栅格覆盖的给定波段中的像素数。如果未指定波段 N带
默认为1。
![]() | |
如果 |
已更改:3.1.0-ST_COUNT(栅格表、栅格列...)删除了变种。使用 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 — 聚合。返回一组栅格的给定波段中的像素数。如果未指定波段,则默认为波段1。如果EXCLUDE_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)
;
返回一组栅格中给定波段的像素数。如果未指定波段 N带
默认为1。
如果 exclude_nodata_value
设置为True时,将只计算其值不等于 NODATA
栅格的值。集 exclude_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)
;
返回由每个面元的给定栅格波段的最小、最大、计数、百分比组成的一组记录。如果未指定波段 N带
默认为1。
![]() | |
默认情况下只考虑像素值不等于 |
宽度
双精度[] Width:一个数组,表示每个类别/bin的宽度。如果垃圾桶的数量大于宽度的数量,则重复宽度。
示例:9个条柱,宽度为[a,b,c],输出为[a,b,c,a,b,c,a,b,c]
垃圾箱
整数 突破数--如果指定,这是您将从函数中返回的记录数。如果未指定,则自动计算分段点数。
正确的
布尔值 从右侧而不是从左侧计算直方图(默认)。这将值x的求值标准从[a,b)更改为(a,b)
已更改:3.1.0删除了ST_Columgraph(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 — 返回由栅格或栅格Coverage的给定栅格波段的COUNT、SUM、Mean、STDDEV、MIN、MAX组成的摘要统计信息。假定带区1未指定带区。
summarystats ST_SummaryStats(
raster rast, boolean exclude_nodata_value)
;
summarystats ST_SummaryStats(
raster rast, integer nband, boolean exclude_nodata_value)
;
退货 摘要统计信息 由一个或多个栅格覆盖的给定栅格波段的COUNT、SUM、Mean、STDDEV、MIN、MAX组成。如果未指定波段 N带
默认为1。
![]() | |
默认情况下只考虑像素值不等于 |
![]() | |
默认情况下,将对所有像素进行采样。要获得更快的响应,请设置 |
更改:3.1.0 ST_SummaryStats(栅格表、栅格列...)变种被移除。使用 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 Windows上使用所有波士顿建筑物和航拍切片(每个切片各150x150像素~13.4万个切片)耗时574毫秒,约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 — 聚合。返回由一组栅格的给定栅格波段的COUNT、SUM、Mean、STDDEV、MIN、MAX组成的摘要统计信息。假定带区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)
;
退货 摘要统计信息 由一个或多个栅格覆盖的给定栅格波段的COUNT、SUM、Mean、STDDEV、MIN、MAX组成。如果未指定波段 N带
默认为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。默认情况下,不计算nodata值像素。并且输出像素中的所有其他值,并且将像素带值四舍五入为最接近的整数。
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)
;
Returns a set of records with columns value
count
which contain the pixel band value and count of pixels in the raster tile or raster coverage of selected band.
如果未指定波段 N带
默认为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)
;
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)
;
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)
;
返回栅格的二进制表示形式。如果 外包
为真,则外db频段被视为in-db。有关表示的详细信息,请参考PostGIS源文件夹中的raster/doc/rfc2-WellKnownBinaryFormat。
这在二进制游标中很有用,可以将数据从数据库中拉出,而无需将其转换为字符串表示形式。
![]() | |
默认情况下,WKB输出包含数据库外频段的外部文件路径。如果客户端无权访问作为数据库外波段基础的栅格文件,请设置 |
增强版:2.1.0新增 外包
增强版: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)
;
返回栅格的十六进制表示形式的二进制表示形式。如果 外包
为真,则外db频段被视为in-db。有关表示的详细信息,请参考PostGIS源文件夹中的raster/doc/rfc2-WellKnownBinaryFormat。
![]() | |
默认情况下,十六进制WKB输出包含数据库外频段的外部文件路径。如果客户端无权访问作为数据库外波段基础的栅格文件,请设置 |
可用性: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)
;
返回指定格式的栅格平铺。以下分项列出了这些论点:
格式化
要输出的格式。这取决于您的libgdal库中编译的驱动程序。通常可用的有‘JPEG’、‘GTIff’、‘PNG’。使用 ST_GDALDrivers 若要获取库支持的格式列表,请执行以下操作。
选项
GDAL选项的文本数组。有效选项取决于格式。参考 GDAL栅格格式选项 了解更多详细信息。
SRS
要嵌入到图像中的proj4text或srtext(来自space_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大对象导出函数 。我们将重复前面的示例,但也会导出。注意:为此,您需要拥有对db的超级用户访问权限,因为它使用服务器端lo函数。它还将导出到服务器网络上的路径。如果需要在本地导出,请使用等同于psql的lo_functions,它们会导出到本地文件系统,而不是服务器文件系统。
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;
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个波段。该函数有许多变体,具有许多选项。现将这些建议逐项列出:
N带
是针对单波段出口的。
N带区
是要导出的带区数组(请注意,对于JPEG,最大值为3),带区的顺序为RGB。例如,数组[3,2,1]表示将波段3映射为红色,将波段2映射为绿色,将波段1映射为蓝色
品质
0到100之间的数字。数字越大,图像越清晰。
选项
为JPEG定义的GDAL选项的文本数组(请参阅JPEG的Create_Options ST_GDALDrivers )。对于JPEG,有效值为 PROGRESSIVE
开或关,然后 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。现将这些建议逐项列出:
N带
是针对单波段出口的。
N带区
是要导出的波段数组(请注意,对于PNG,最大值为4),并且波段的顺序为RGBA。例如,数组[3,2,1]表示将波段3映射为红色,将波段2映射为绿色,将波段1映射为蓝色
压缩
从1到9的数字。数字越大,压缩越大。
选项
为PNG定义的GDAL选项的文本数组(查看PNG的CREATE_OPTIONS,共 ST_GDALDrivers )。对于PNG,有效的值仅为ZLEVEL(用于压缩的时间量--默认为6),例如数组[‘ZLEVEL=9’]。不允许使用WORLDFILE,因为该函数必须输出两个输出。参考 GDAL栅格格式选项 了解更多详细信息。
可用性:2.0.0-需要GDAL > =1.6.0。
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文字,则使用栅格的空间参考。现将这些建议逐项列出:
N带区
是要导出的频段数组(请注意,对于PNG,最大值为3),频段的顺序为RGB。例如,数组[3,2,1]表示将波段3映射为红色,将波段2映射为绿色,将波段1映射为蓝色
压缩
压缩表达式--JPEG90(或其他百分比)、LZW、JPEG、DEFLATE9。
选项
为GTiff定义的GDAL创建选项的文本数组(请参阅GTiff的CREATE_OPTIONS ST_GDALDrivers )。或参阅 GDAL栅格格式选项 了解更多详细信息。
格栅
删除栅格的space_ref_sys。这用于填充地理配准信息
可用性:2.0.0-需要GDAL > =1.6.0。
裁剪
未指定或为TRUE,则将裁剪输出栅格。ST_Clip — 返回由输入几何图形剪裁的栅格。如果未指定波段编号,则处理所有波段。如果 裁剪
未指定或为TRUE,则将裁剪输出栅格。
raster ST_Clip(
raster rast, integer[] nband, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE)
;
raster ST_Clip(
raster rast, integer nband, geometry geom, double precision nodataval, boolean crop=TRUE)
;
raster ST_Clip(
raster rast, integer nband, geometry geom, boolean crop)
;
raster ST_Clip(
raster rast, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE)
;
raster ST_Clip(
raster rast, geometry geom, double precision nodataval, boolean crop=TRUE)
;
raster ST_Clip(
raster rast, geometry geom, boolean crop)
;
返回由输入几何裁剪的栅格 几何图形
。如果未指定波段索引,则处理所有波段。
由ST_CLIP生成的栅格必须为被剪裁的区域指定一个nodata值,每个标注栏一个。如果未提供任何值,并且输入栅格未定义nodata值,则结果栅格的nodata值将设置为ST_MinPossibleValue(ST_BandPixelType(Rast,Band))。当数组中的nodata值的数量小于频带数时,数组中的最后一个用于剩余的频段。如果无数据值的数量大于频带的数量,则忽略额外的无数据值。接受nodata值数组的所有变体也接受将分配给每个波段的单个值。
如果 裁剪
如果未指定,则假定为True,这意味着输出栅格将被裁剪到 几何图形
和 RAST
范围。如果 裁剪
设置为FALSE,则新栅格的范围与 RAST
。
可用性:2.0.0
增强版:2.1.0用C重写
此处的示例使用MassGIS站点上提供的马萨诸塞州航测数据 MassGIS航空正射影像 。坐标以马萨诸塞州平面米为单位。
-- 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;
![]() 裁剪前的完整栅格平铺
|
![]() 剪裁后--超现实主义
|
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)
;
应用于 色彩映射图
向乐队致敬 N带
的 RAST
从而产生最多由四个8BUI波段组成的新栅格。新栅格中的8BUI波段数由中定义的颜色分量数确定 色彩映射图
。
如果 N带
未指定,则假定为带1。
色彩映射图
可以是预定义色彩映射表的关键字,也可以是定义值和颜色分量的一组线。
有效的预定义 色彩映射图
关键词:
灰度级
或 灰阶
对于一个灰度级的8BUI波段栅格。
假彩色
对于颜色从蓝色到绿色再到红色的四个8BUI(RGBA)波段的栅格。
火
对于颜色从黑色到红色再到淡黄色的四个8BUI(RGBA)波段的栅格。
怒气冲冲
对于颜色从蓝色到淡白色再到红色的四个8BUI(RGBA)波段的栅格。
用户可以将一组条目(每行一个)传递给 色彩映射图
若要指定自定义色彩映射表,请执行以下操作。每个条目通常由五个值组成:像素值和相应的红、绿、蓝、Alpha分量(介于0和255之间的颜色分量)。可以使用百分比值代替像素值,其中0%和100%是在栅格波段中找到的最小值和最大值。值可以用逗号(‘,’)、制表符、冒号(‘:’)和/或空格分隔。像素值可以设置为 NV , 空 或 无数据 作为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
的语法 色彩映射图
类似于GDAL的色彩浮雕模式 Gdaldem 。
的有效关键字 方法
:
INTERPOLATE
使用线性插值法在给定的像素值之间平滑地混合颜色
EXACT
以仅严格匹配在色彩映射表中找到的像素值。值与色彩映射表条目不匹配的像素将设置为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 — 根据源栅格和表示红色、绿色和蓝色的指定波段创建新的One-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 使用 |
可用性: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 )转换为一组几何图形行,然后使用 ST_Intersection (几何体、几何体)PostGIS函数。仅与栅格的无数据值区域相交的几何图形将返回空几何图形。的正确使用通常将它们从结果中排除。 ST_Intersects 在WHERE子句中。
您可以访问Geomval结果集的几何图形和值部分,方法是用圆括号将它们括起来,并在表达式末尾添加‘.geom’或‘.val’。例如(ST_Interval(Rast,geom)).geom
其他变量返回一个栅格,在栅格空间中工作。他们使用ST_MapAlgebraExpr的两个栅格版本来执行交集。
生成的栅格范围对应于两个栅格范围的几何交点。生成的栅格包括‘BAND1’、‘BAND2’或‘BAND2’波段,后面是作为 返回频带
参数。任何波段中存在的无数据值区都会导致结果的每个波段中都没有数据值区。换句话说,任何与无数据值像素相交的像素都将成为结果中的无数据值像素。
必须为不相交的区域指定由ST_Interval生成的栅格的nodata值。可以通过为任何结果波段提供 Nodataval[]
一个或两个无数据值的数组,具体取决于您请求的是‘BAND1’、‘BAND2’还是‘Both’。数组中的第一值替换第一带中的nodata值,第二值替换第二带中的nodata值。如果一个输入波段没有定义nodata值,并且没有以数组形式提供,则使用ST_MinPossibleValue函数选择一个。接受NODATA值数组的所有变体也可以接受将被分配给每个请求频带的单个值。
在所有变型中,如果未指定波段编号,则假定为波段1。如果需要栅格和返回栅格的几何之间的交集,请参阅 ST_Clip 。
![]() | |
要更好地控制结果范围或遇到nodata值时返回的内容,请使用的两个栅格版本 ST_MapAlgebraExpr 。 |
![]() | |
要计算栅格空间中的栅格波段与几何的交集,请使用 ST_Clip 。ST_CLIP适用于多个标注栏栅格,不返回与栅格化几何图形对应的标注栏。 |
![]() | |
ST_INTERSION应与配合使用 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(回调函数版本) — 回调函数版本-返回给定一个或多个输入栅格、波段索引和一个用户指定的回调函数的单波段栅格。
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)
;
返回给定一个或多个输入栅格、波段索引和一个用户指定的回调函数的单波段栅格。
对地图代数过程进行评估的栅格。
栅格栏
允许对多个栅格和/或多个波段使用地图代数运算。请参见示例变体1。
要评估的栅格的波段编号。Nband可以是表示波段的整数或整数[]。对于2个栅格/2个波段的情况,nband 1是rast1上的波段,nband 2是rast2上的波段。
The callbackfunc
parameter must be the name and signature of an SQL or PL/pgSQL function, cast to a regprocedure. An example PL/pgSQL function example is:
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;
The callbackfunc
must have three arguments: a 3-dimension double precision array, a 2-dimension integer array and a variadic 1-dimension text array. The first argument value
is the set of values (as double precision) from all input rasters. The three dimensions (where indexes are 1-based) are: raster #, row y, column x. The second argument position
is the set of pixel positions from the output raster and input rasters. The outer dimension (where indexes are 0-based) is the raster #. The position at outer dimension index 0 is the output raster's pixel position. For each outer dimension, there are two elements in the inner dimension for X and Y. The third argument userargs
is for passing through any user-specified arguments.
Passing a regprocedure argument to a SQL function requires the full function signature to be passed, then cast to a regprocedure type. To pass the above example PL/pgSQL function as an argument, the SQL for the argument is:
'sample_callbackfunc(double precision[], integer[], text[])'::regprocedure
Note that the argument contains the name of the function, the types of the function arguments, quotes around the name and argument types, and a cast to a regprocedure.
数字的n维数组(矩阵),用于筛选传递给映射代数回调函数的单元格。0表示邻居小区值应被视为无数据,1表示值应被视为数据。如果权重设置为True,则这些值将用作乘数,以乘以邻近位置中该值的像素值。
布尔值(TRUE/FALSE),表示遮罩值是否应该加权(乘以原始值)(仅适用于接受遮罩的原件)。
如果 像素类型
传入后,新栅格的一个波段将属于该像素类型。如果将Pixeltype传递为空或忽略,则新的栅格标注栏将具有与第一个栅格的指定标注栏(对于范围类型:交集、并集、第一个、自定义)或相应栅格的指定标注栏(对于范围类型:第二个、最后一个)相同的像素类型。如果有疑问,请始终指定 像素类型
。
输出栅格的结果像素类型必须是中列出的像素类型 ST_BandPixelType 或被省略或设置为空。
可能的值包括交集(默认)、并集、第一个(一个栅格变体的默认)、第二个、最后一个、自定义。
如果 区段类型
是自定义的,则必须提供栅格 自定义范围
。见备选案文1的示例4。
X方向上与参考单元格的距离(以像素为单位)。因此,生成的矩阵的宽度为 2*Distancex+1
。如果未指定,则仅考虑参考单元格(0的邻域)。
Y方向上与参考单元格之间的距离,以像素为单位。生成的矩阵的高度将为 2*距离+1
。如果未指定,则仅考虑参考单元格(0的邻域)。
的第三个参数 回调函数
是一种 多变文本 数组。所有尾随文本参数都传递给指定的 回调函数
,并包含在 用户参数
论点。
![]() | |
有关VARIADIC关键字的详细信息,请参阅的PostgreSQL文档和的“参数数目可变的SQL函数”一节 查询语言(SQL)函数 。 |
![]() | |
这个 文本[] 参数设置为 |
变体1接受一个数组 粗制滥造
从而允许在许多栅格和/或许多波段上使用地图代数运算。请参见示例变体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
带有邻域的Coverage瓷砖的完整示例。此查询仅适用于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
与前面的例子类似,用于包含邻域的Coverage的瓷砖,但适用于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(表达式版本) — 表达式版本-返回给定一个或两个输入栅格、波段索引以及一个或多个用户指定的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)
;
通过应用由定义的有效PostgreSQL代数运算创建新的单波段栅格 表达式
在输入栅格上( RAST
)。如果 N带
未提供,则假定为带1。新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果 像素类型
则新栅格将具有该像素类型的带。如果将像素类型传递为空,则新栅格波段将具有与输入相同的像素类型 RAST
乐队。
允许的关键字 表达式
[RAST]
-感兴趣像素的像素值
[rast.val]
-感兴趣像素的像素值
[rast.x]
感兴趣的像素的基于1的像素列
[rast.y]
感兴趣像素的以1为基础的像素行
通过对由定义的两个波段应用有效的PostgreSQL代数运算来创建新的单波段栅格 表达式
关于两个输入栅格波段 栅格1
、( 栅格2
)。如果没有 频带1
, 频带2
是指定的,则假定为带1。生成的栅格将在第一个栅格定义的栅格上对齐(缩放、倾斜和像素角)。生成的栅格将具有由 区段类型
参数。
涉及两个栅格的PostgreSQL代数表达式和PostgreSQL定义的函数/运算符,它们将在像素相交时定义像素值。例如([rast1]+[rast2])/2.0)::整数
输出栅格的结果像素类型。必须是中列出的 ST_BandPixelType 、省略或设置为空。如果未传入或设置为空,则默认为第一个栅格的像素类型。
控制生成的栅格的范围
INTERSECTION
-新栅格的范围是两个栅格的交点。这是默认设置。
UNION
-新栅格的范围是两个栅格的并集。
FIRST
-新栅格的范围与第一个栅格的范围相同。
SECOND
-新栅格的范围与第二个栅格的范围相同。
一种仅涉及 栅格2
或一个常量,该常量定义当像素的 栅格1
是无数据值,并且空间上对应的rast2像素具有值。
一种仅涉及 栅格1
或一个常量,该常量定义当像素的 栅格2
是无数据值,并且空间上对应的rast1像素具有值。
当空间上对应的rast1和rast2像素都为无数据值时返回的数值常量。
中允许的关键字 表达式
, Nodata1expr
和 Nodata2expr
[rast1]
-感兴趣的像素的像素值来自 栅格1
[rast1.val]
-感兴趣的像素的像素值来自 栅格1
[rast1.x]
感兴趣的像素的-1\f25 Pixel-1列 栅格1
[rast1.y]
感兴趣的像素的-1像素行 栅格1
[RAST2]
-感兴趣的像素的像素值来自 栅格2
[rast2.val]
-感兴趣的像素的像素值来自 栅格2
[rast2.x]
感兴趣的像素的-1\f25 Pixel-1列 栅格2
[rast2.y]
感兴趣的像素的-1像素行 栅格2
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(表达式版本) 取而代之的是。 |
通过应用由定义的有效PostgreSQL代数运算创建新的单波段栅格 表达式
在输入栅格上( RAST
)。如果没有 频带
是指定的,则假定为带1。新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果 像素类型
则新栅格将具有该像素类型的带。如果将像素类型传递为空,则新栅格波段将具有与输入相同的像素类型 RAST
乐队。
在表达式中,您可以使用术语 [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”的值可以是:交集、并集、第一个、第二个。
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(表达式版本) 取而代之的是。 |
通过对由定义的两个波段应用有效的PostgreSQL代数运算来创建新的单波段栅格 表达式
关于两个输入栅格波段 栅格1
、( 栅格2
)。如果没有 频带1
, 频带2
是指定的,则假定为带1。生成的栅格将在第一个栅格定义的栅格上对齐(缩放、倾斜和像素角)。生成的栅格将具有由 区段类型
参数。
涉及两个栅格的PostgreSQL代数表达式和PostgreSQL定义的函数/运算符,它们将在像素相交时定义像素值。例如([rast1]+[rast2])/2.0)::整数
输出栅格的结果像素类型。必须是中列出的 ST_BandPixelType 、省略或设置为空。如果未传入或设置为空,则默认为第一个栅格的像素类型。
控制生成的栅格的范围
INTERSECTION
-新栅格的范围是两个栅格的交点。这是默认设置。
UNION
-新栅格的范围是两个栅格的并集。
FIRST
-新栅格的范围与第一个栅格的范围相同。
SECOND
-新栅格的范围与第二个栅格的范围相同。
一种仅涉及 栅格2
或一个常量,该常量定义当像素的 栅格1
是无数据值,并且空间上对应的rast2像素具有值。
一种仅涉及 栅格1
或一个常量,该常量定义当像素的 栅格2
是无数据值,并且空间上对应的rast1像素具有值。
当空间上对应的rast1和rast2像素都为无数据值时返回的数值常量。
如果 像素类型
则新栅格将具有该像素类型的带。如果传递的像素类型为空或未指定像素类型,则新栅格波段将具有与输入相同的像素类型 栅格1
乐队。
Use the term [rast1.val]
[rast2.val]
to refer to the pixel value of the original raster bands and [rast1.x]
, [rast1.y]
etc. to refer to the column / row positions of the pixels.
可用性: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;
![]() 栅格1
|
![]() 栅格2
|
![]() 栅格3
|
![]() 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 — 单波段版本-通过在输入栅格波段上应用有效的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(回调函数版本) 取而代之的是。 |
通过应用由指定的有效PostgreSQL函数创建新的单波段栅格 OnerasterUserFunction
在输入栅格上( RAST
)。如果没有 频带
如果指定,则假定为带1。新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果 像素类型
则新栅格将具有该像素类型的带。如果将像素类型传递为空,则新栅格波段将具有与输入相同的像素类型 RAST
乐队。
The onerasteruserfunc
parameter must be the name and signature of a SQL or PL/pgSQL function, cast to a regprocedure. A very simple and quite useless PL/pgSQL function example is:
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[]) RETURNS FLOAT AS $$ BEGIN RETURN 0.0; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
The userfunction
may accept two or three arguments: a float value, an optional integer array, and a variadic text array. The first argument is the value of an individual raster cell (regardless of the raster datatype). The second argument is the position of the current processing cell in the form '{x,y}'. The third argument indicates that all remaining parameters to ST_MapAlgebraFct shall be passed through to the userfunction
.
传递一个 重新生产 参数传递给SQL函数需要传递完整的函数签名,然后强制转换为 注册表程序 键入。要将上述示例PL/pgSQL函数作为参数传递,参数的SQL为:
‘Simple_Function(Float,Integer[],Text[])’::regprocess
请注意,参数包含函数的名称、函数参数的类型、名称两边的引号和参数类型,以及转换为 注册表程序 。
的第三个参数 用户函数
是一种 多变文本 数组。的所有尾随文本参数 ST_MapAlgebraFct 调用被传递到指定的 用户函数
,并包含在 参数
论点。
![]() | |
有关VARIADIC关键字的详细信息,请参阅的PostgreSQL文档和的“参数数目可变的SQL函数”一节 查询语言(SQL)函数 。 |
![]() | |
这个 文本[] 参数设置为 |
可用性: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_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。如果未指定范围类型,则默认为相交。
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(回调函数版本) 取而代之的是。 |
通过应用由指定的有效PostgreSQL函数创建新的单波段栅格 TworastUserFunction
在输入栅格上 栅格1
, 栅格2
。如果没有 频带1
或 频带2
如果指定,则假定为带1。新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果 像素类型
则新栅格将具有该像素类型的带。如果将像素类型传递为空或忽略,则新栅格波段将具有与输入相同的像素类型 栅格1
乐队。
The tworastuserfunc
parameter must be the name and signature of an SQL or PL/pgSQL function, cast to a regprocedure. An example PL/pgSQL function example is:
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;
The tworastuserfunc
may accept three or four arguments: a double precision value, a double precision value, an optional integer array, and a variadic text array. The first argument is the value of an individual raster cell in rast1
(regardless of the raster datatype). The second argument is an individual raster cell value in rast2
. The third argument is the position of the current processing cell in the form '{x,y}'. The fourth argument indicates that all remaining parameters to ST_MapAlgebraFct shall be passed through to the tworastuserfunc
.
传递一个 重新生产 参数传递给SQL函数需要传递完整的函数签名,然后强制转换为 注册表程序 键入。要将上述示例PL/pgSQL函数作为参数传递,参数的SQL为:
‘Simple_Function(双精度,双精度,INTEGER[],TEXT[])’::regprocess
请注意,参数包含函数的名称、函数参数的类型、名称两边的引号和参数类型,以及转换为 注册表程序 。
的第四个参数 TworastUserFunction
是一种 多变文本 数组。的所有尾随文本参数 ST_MapAlgebraFct 调用被传递到指定的 TworastUserFunction
,并包含在 用户参数
论点。
![]() | |
有关VARIADIC关键字的详细信息,请参阅的PostgreSQL文档和的“参数数目可变的SQL函数”一节 查询语言(SQL)函数 。 |
![]() | |
这个 文本[] 参数设置为 |
可用性: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(回调函数版本) 取而代之的是。 |
(一个栅格版本)返回一个栅格,该栅格的值是PLPGSQL用户函数的结果,该用户函数涉及输入栅格标注栏中的值的邻域。User函数将像素值的邻域作为数字数组,对于每个像素,返回User函数的结果,将当前检查的像素的像素值替换为函数结果。
对其计算用户函数的栅格。
要评估的栅格的波段编号。默认为1。
输出栅格的结果像素类型。必须是中列出的 ST_BandPixelType 或被省略或设置为空。如果未传入或设置为空,则默认为 RAST
。如果结果大于允许的像素值类型,则结果将被截断。
邻居的宽度,以单元格为单位。
社区的高度,单位为单元格。
PLPGSQL/psql用户函数,用于应用于栅格的单个波段的邻近像素。第一个元素是表示矩形像素邻域的二维数组
定义为nodata或空的邻域像素要传递给函数的值
‘Ignore’:在邻域中遇到的任何NODATA值都会被计算忽略--此标志必须发送给User回调函数,User函数决定如何忽略它。
‘NULL’:邻域中遇到的任何NODATA值都将导致结果像素为空--在这种情况下将跳过用户回调函数。
‘Value’:在邻域中遇到的任何NODATA值都将被参考像素(位于邻域中心的像素)替换。请注意,如果此值为NODATA,则行为与‘NULL’相同(对于受影响的邻域)
要传递给User函数的参数。
可用性:2.0.0
示例将Katrina栅格作为单个切片加载,如中所述 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)
;
通过应用由定义的有效PostgreSQL代数运算创建新栅格 重分类表达式
在输入栅格上( RAST
)。如果没有 频带
是指定的,则假定为带1。新栅格将具有与原始栅格相同的地理参考、宽度和高度。未指定的乐队将原封不动地返回。参考 重新分类 用于描述有效的重分类表达式。
新栅格的波段将具有像素类型 像素类型
。如果 重定义集
则每个重分类定义所生成的每个波段的行为。
可用性: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并重新分类。请注意,这使用了变量 重新分类
可以接受无限数量的重分类参数作为输入的参数(理论上与您拥有的波段数相同)
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
它是以下之一:最后(默认)、第一、最小、最大、计数、总和、平均值、范围。
![]() | |
为了联合栅格,它们必须都具有相同的对齐方式。使用 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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案1,因为 ST_MapAlgebraFctNgb 自2.1.0起已被弃用。 |
可用性:2.0.0
增强版:2.1.0增加了变体2
ST_InvDistWeight4ma — 从像素点的邻域内插像素值的栅格处理功能。
double precision ST_InvDistWeight4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
使用反距离加权方法计算像素的插值值。
可以传递两个可选参数 用户参数
。第一个参数是在反距离加权方程中使用的介于0和1之间的功率因数(下式中的变量k)。如果未指定,则默认为1。第二个参数是仅当感兴趣的像素值包含在邻域内插值中时才应用的权重百分比。如果未指定,并且感兴趣的像素具有值,则返回该值。
基本的反距离权重公式为:
K=功率因数,介于0和1之间的实数
![]() | |
此函数是专门的回调函数,用作 ST_MapAlgebra(回调函数版本) 。 |
可用性:2.1.0
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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案1,因为 ST_MapAlgebraFctNgb 自2.1.0起已被弃用。 |
可用性:2.0.0
增强版:2.1.0增加了变体2
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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案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)
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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案1,因为 ST_MapAlgebraFctNgb 自2.1.0起已被弃用。 |
可用性:2.0.0
增强版:2.1.0增加了变体2
ST_MinDist4ma — 栅格处理函数,返回感兴趣的像素与相邻像素之间的最小距离(以像素数表示)。
double precision ST_MinDist4ma(
double precision[][][] value, integer[][] pos, text[] VARIADIC userargs)
;
返回感兴趣的像素和邻域中具有值的最近像素之间的最短距离(以像素数表示)。
![]() | |
此函数的目的是提供信息性数据点,以帮助推断感兴趣像素的插值值的有用性 ST_InvDistWeight4ma 。当邻近区域人口稀少时,此功能特别有用。 |
![]() | |
此函数是专门的回调函数,用作 ST_MapAlgebra(回调函数版本) 。 |
可用性:2.1.0
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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案1,因为 ST_MapAlgebraFctNgb 自2.1.0起已被弃用。 |
可用性:2.0.0
增强版:2.1.0增加了变体2
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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案1,因为 ST_MapAlgebraFctNgb 自2.1.0起已被弃用。 |
可用性:2.0.0
增强版:2.1.0增加了变体2
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(回调函数版本) 。 |
![]() | |
不鼓励使用备选方案1,因为 ST_MapAlgebraFctNgb 自2.1.0起已被弃用。 |
可用性:2.0.0
增强版:2.1.0增加了变体2
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)
;
返回高程栅格标注栏的纵横比(默认情况下以度为单位)。利用地图代数并将纵横比方程应用于相邻像素。
单位
指示纵横比的单位。可能的值为:弧度、度数(默认)。
什么时候 单位
=弧度,值介于0和2*圆周率弧度之间,从北向顺时针测量。
什么时候 单位
=度,值在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)
Coverage平铺的完整示例。此查询仅适用于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之间。
方位角
是从北向顺时针测量的介于0度和360度之间的值。
海拔高度
是介于0到90度之间的值,其中0度位于地平线上,90度位于正上方。
max_bright
是介于0和255之间的值,0表示没有亮度,255表示最大亮度。
比例尺
是垂直单位与水平单位的比率。对于英尺:拉特隆使用比例=370400,对于米:拉特龙使用比例=111120。
如果 interpolate_nodata
为真,则输入栅格中的NODATA像素值将使用 ST_InvDistWeight4ma 在计算山体阴影照度之前。
![]() | |
有关山体阴影的更多信息,请参阅 山体阴影的工作原理 。 |
可用性: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)
Coverage平铺的完整示例。此查询仅适用于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 )
;
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)
;
返回高程栅格标注栏的坡度(默认情况下以度为单位)。利用地图代数并将斜率方程应用于相邻像素。
单位
指示坡度的单位。可能的值有:弧度、度(默认)、百分比。
比例尺
是垂直单位与水平单位的比率。对于英尺:拉特隆使用比例=370400,对于米:拉特龙使用比例=111120。
如果 interpolate_nodata
为真,则输入栅格中的NODATA像素值将使用 ST_InvDistWeight4ma 在计算表面坡度之前。
![]() | |
有关坡度、坡向和山体阴影的更多信息,请参阅 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_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)
Coverage平铺的完整示例。此查询仅适用于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 — 返回具有计算出的地形位置索引的栅格。
raster ST_TPI(
raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE )
;
Box3D — 返回栅格的封闭框的框3D表示。
box3d Box3D(
raster rast)
;
返回表示栅格范围的框。
多边形由边界框的角点定义(( MINX
, MINY
)、( MAXX
, MAXY
))
更改:2.0.0在2.0之前的版本中,原来是box2d而不是box3d。由于box2d是不推荐使用的类型,因此已更改为box3d。
ST_ConvexHull — 返回栅格的凸壳几何图形,包括等于BandNoDataValue的像素值。对于形状规则且无倾斜的栅格,这将提供与ST_Entaine相同的结果,因此仅适用于形状不规则或倾斜的栅格。
geometry ST_ConvexHull(
raster rast)
;
返回包含NoDataBandValue波段像素的栅格凸壳几何图形。对于形状规则且无倾斜的栅格,这会产生与ST_Entaine大致相同的结果,因此仅适用于形状不规则或倾斜的栅格。
![]() | |
ST_Entaine填充坐标,因此在栅格周围添加一些缓冲区,因此答案与ST_ConvexHull略有不同,ST_ConvexHull不填充。 |
请参阅 PostGIS栅格规范 以获得这方面的图表。
-- 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相反,因为它创建新行。例如,它可用于将单个栅格展开为多个多边形/MULTIPOLYGONS。
更改了3.3.0,禁用了验证和修复以提高性能。可能会产生无效的几何图形。
可用性:需要GDAL 1.7或更高版本。
![]() | |
如果没有为波段设置数据值,则不会返回具有该值的像素,除非EXCLUDE_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定义的空间坐标单位返回栅格范围的多边形表示。它是一个表示为多边形的浮动最小边界框。
多边形由边界框的角点定义(( 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)
;
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)))
& & — 退货 TRUE
如果A的边界框与B的边界框相交。
boolean &&(
raster A , raster B )
;
boolean &&(
raster A , geometry B )
;
boolean &&(
geometry B , raster A )
;
& < — 退货 TRUE
如果A的边界框在B的左侧。
boolean &<(
raster A , raster B )
;
& > — 退货 TRUE
如果A的边界框在B的右侧。
boolean &>(
raster A , raster B )
;
= — 退货 TRUE
如果A的边界框与B的边界框相同。使用双精度边界框。
boolean =(
raster A , raster B )
;
这个 =
运算符返回 TRUE
如果栅格A的边框与栅格B的边框相同,PostgreSQL使用=, < ,以及 > 为栅格定义的运算符,用于执行栅格的内部排序和比较(即在GROUP BY或ORDER BY子句中)。
![]() | |
此操作数不会使用栅格上可能可用的任何索引。使用 ~= 取而代之的是。该运算符主要存在,因此可以按栅格列进行分组。 |
可用性:2.1.0
@ — 退货 TRUE
如果A的边界框包含在B的边界框中。则使用双精度边界框。
boolean @(
raster A , raster B )
;
boolean @(
geometry A , raster B )
;
boolean @(
raster B , geometry A )
;
~= — 退货 TRUE
如果A的边界框与B的边界框相同。
boolean ~=(
raster A , raster B )
;
ST_Contains — 如果栅格栅格B的点没有位于栅格RASTA的外部,并且栅格B的内部至少有一个点位于RASTA的内部,则返回TRUE。
boolean ST_Contains(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Contains(
raster rastA , raster rastB )
;
Raster Rasta包含rastB当且仅当rastB的点没有位于rastA的外部并且rastB的内部至少有一个点位于rastA的内部。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数将使用栅格上可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请对栅格使用ST_Polygon,例如ST_CONTAINS(ST_Polygon(RASTER),GEOMETRY)或ST_CONTAINS(GEOMETRY,ST_POLYGON(RASTER))。 |
![]() | |
ST_CONTAINS()与ST_WINDOWS()相反。因此,ST_CONTAINS(RASTA,rastB)隐含ST_WINDOWS(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的边界或外部相交,则raster Rasta包含正确的rastB。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
RASTER RASTA未正确包含其自身,但确实包含其自身。
![]() | |
此函数将使用栅格上可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_ContainsProperly(ST_Polygon(Raster),geomy)或ST_ContainsProperly(geomety,ST_Polygon(Raster))。 |
可用性:2.1.0
ST_Covers — 如果栅格栅格B的点没有位于栅格RASTA之外,则返回TRUE。
boolean ST_Covers(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Covers(
raster rastA , raster rastB )
;
RASTA覆盖RASTB当且仅当RASTA的外部没有RASTA的点。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数将使用栅格上可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_Coverers(ST_Polygon(Raster),geomety)或ST_overers(geomety,ST_Polygon(Raster))。 |
可用性:2.1.0
ST_CoveredBy — 如果没有栅格RASTA的点位于栅格栅格B之外,则返回TRUE。
boolean ST_CoveredBy(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_CoveredBy(
raster rastA , raster rastB )
;
RASTER RASTA被rastB覆盖当且仅当rastB的外部没有RASTA的点。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数将使用栅格上可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请对栅格使用ST_Polygon,例如ST_CoveredBy(ST_Polygon(RASTER),GEOMETRY)或ST_COVEREDBY(GEOMETRY,ST_POLYGON(RASTER))。 |
可用性:2.1.0
ST_Disjoint — 如果栅格RASTA在空间上不与rastB相交,则返回TRUE。
boolean ST_Disjoint(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Disjoint(
raster rastA , raster rastB )
;
如果栅格RASTA和栅格B不共享任何空间,则它们是不相交的。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数不使用任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_DISCOCT(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与栅格栅格B在空间上相交,则返回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 )
;
如果raster RastA在空间上与raster rastB相交,则返回TRUE。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数将使用栅格上可用的任何索引。 |
增强:引入了2.0.0对栅格/栅格相交的支持。
![]() | |
已更改:2.1.0更改了ST_Intersects(栅格、几何图形)变量的行为,以匹配ST_Intersects(几何图形、栅格)的行为。 |
ST_Overlaps — 如果栅格RastA和rastB相交,但其中一个没有完全包含另一个,则返回TRUE。
boolean ST_Overlaps(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Overlaps(
raster rastA , raster rastB )
;
如果raster RastA在空间上与raster rastB重叠,则返回TRUE。这意味着RastA和RastB相交,但其中一个并不完全包含另一个。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数将使用栅格上可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_Overlaps(ST_Polygon(RASTER),GEOMETRY)。 |
可用性:2.1.0
ST_Touches — 如果栅格RastA和rastB至少有一个共同点,但其内部不相交,则返回TRUE。
boolean ST_Touches(
raster rastA , integer nbandA , raster rastB , integer nbandB )
;
boolean ST_Touches(
raster rastA , raster rastB )
;
如果raster RastA在空间上接触raster rastB,则返回TRUE。这意味着Rasta和rastB至少有一个共同点,但它们的内部并不相交。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此函数将使用栅格上可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_Touches(ST_Polygon(RASTER),GEOMETRY)。 |
可用性:2.1.0
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):如果两个栅格(直接提供或使用UPERLUT、SCALE、SKEW和SRID的值生成)具有相同的比例、倾斜、SRID,并且一个栅格的任何像素的四个角中的至少一个落在另一个栅格的栅格的任意角上,则返回TRUE。如果不是,则返回FALSE,并返回详细说明对齐问题的通知。
Aggregate Version(Variant 3):从一组栅格中,如果集合中的所有栅格都对齐,则返回TRUE。在PostgreSQL的术语中,ST_SameAlign()函数是一个“聚合”函数。这意味着它对数据行进行操作,与sum()和avg()函数操作的方式相同。
可用性:2.0.0
增强:2.1.0添加Aggegate变体
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)
;
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 )
;
RASTER RASTA是rastB的当且仅当没有RASTA的点位于rastB的外部,并且RASTA的内部至少有一个点位于rastB的内部。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
![]() | |
此操作数将使用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_Wising(ST_Polygon(RASTER),GEOMETRY)或ST_WITHING(GEOMETRY,ST_POLYGON(RASTER))。 |
![]() | |
ST_WINDOWS()是ST_CONTAINS()的反函数。因此,ST_WITHING(RASTA,rastB)隐含ST_CONTAINS(rastB,RASTA)。 |
可用性:2.1.0
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。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
距离以由栅格的空间参考系定义的单位指定。为了使此函数有意义,源栅格必须具有相同的坐标投影,并且具有相同的SRID。
![]() | |
此操作数将使用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_DWiThin(ST_Polygon(Raster),geometry.)。 |
可用性:2.1.0
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。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。
距离以由栅格的空间参考系定义的单位指定。为了使此函数有意义,源栅格必须具有相同的坐标投影,并且具有相同的SRID。
![]() | |
此操作数将使用栅格上可能可用的任何索引。 |
![]() | |
要测试栅格和几何图形的空间关系,请在栅格上使用ST_Polygon,例如ST_DFullyWiThin(ST_Polygon(Raster),geomy)。 |
可用性:2.1.0
当GDAL打开一个文件时,GDAL会急切地扫描该文件的目录,以构建其他文件的目录。如果该目录包含许多文件(例如数千个、数百万个),则打开该文件将变得极其缓慢(特别是如果该文件恰好位于网络驱动器上,如NFS)。
为了控制此行为,GDAL提供了以下环境变量: GDAL_DISABLE_READDIR_ON_OPEN 。设置 GDAL_DISABLE_READDIR_ON_OPEN
至 TRUE
禁用目录扫描。
在Ubuntu中(假设您使用的是用于Ubuntu的PostgreSQL包), GDAL_DISABLE_READDIR_ON_OPEN
可以设置为 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment (其中,PostgreSQL_Version是PostgreSQL的版本,例如9.6,CLUSTER_NAME是集群的名称,例如maindb)。您还可以在此处设置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 Raster,单个有效的查询很容易超过这一限制(例如,一个包含10年栅格的数据集,其中每一天都有一个包含最低和最高温度的栅格,我们想知道该数据集中一个像素的绝对最小值和最大值)。
最容易进行的更改是以下PostgreSQL设置: max_files_per_process 。默认设置为1000,这对于Out-DB Raster来说太低了。安全的起始值可能是65536,但这实际上取决于您的数据集以及针对这些数据集运行的查询。此设置只能在服务器启动时进行,而且可能只能在PostgreSQL配置文件中进行(例如 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/postgresql.conf 在Ubuntu环境中)。
...
# - 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 (System D)。
让我们首先讨论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)
...
现在来谈一谈system d Ubuntu案例。我们将添加 LimitNoFile=131072 致每一位 /lib/systemd/system/postgresql*.service 文件中的 [服务] 部分。
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
进行必要的系统ID更改后,请确保重新装载守护进程
系统ctl后台进程-重新加载
13.1. | 我在哪里可以找到有关PostGIS栅格项目的更多信息? | |||
请参阅 PostGIS栅格主页 。 | ||||
13.2. | 有没有什么书或教程能让我开始了解这项奇妙的发明? | |||
有一个完整的初学者教程 使用PostGIS栅格与栅格覆盖率较大的矢量缓冲区相交 。Jorge有一系列关于PostGIS Raster的博客文章,这些文章演示了如何加载栅格数据以及如何与Oracle GeoRaster中的相同任务进行交叉比较。查看: 豪尔赫的PostGIS栅格/Oracle GeoRaster系列 。有一整章(超过35页的内容)专门介绍PostGIS栅格,可从以下网址免费下载代码和数据 邮政地理信息系统在行动-栅格章节。在第二版中也有报道。 。你可以的 购买实际中的PostGIS 现在,来自曼宁的书有硬拷贝(批量购买有很大折扣)或只有电子书格式。你也可以从亚马逊和其他各种图书分销商那里购买。所有纸质书都有一张免费优惠券,可以下载电子书版本。 以下是一位PostGIS栅格用户的评论 PostGIS栅格在城市林业土地分类中的应用 | ||||
13.3. | 如何在我的PostGIS数据库中安装栅格支持? | |||
PostGIS Raster是PostGIS代码库的一部分,通常可用于大多数PostGIS二进制发行版。从PostGIS 3.0开始,PostGIS栅格现在是一个单独的扩展,需要: `CREATE EXTENSION postgis_raster;` 在您的数据库中启用它。如果您正在编译您自己的PostGIS,则需要使用GDAL进行编译,否则将不会构建postgis_raster扩展。 请参阅 下载PostGIS二进制文件 适用于包含栅格支持的流行的PostGIS发行版。 | ||||
13.4. | 如何将栅格数据加载到PostGIS中? | |||
最新版本的PostGIS附带了一个 | ||||
13.5. | 我可以将哪种类型的栅格文件格式加载到数据库中? | |||
您的GDAL库支持的任何内容。记录了GDAL支持的格式 GDAL文件格式 。 您的特定GDAL安装可能不支持所有格式。要验证特定GDAL安装支持的GDAL,您可以使用 Raster2pgsql-G | ||||
13.6. | 我可以将我的PostGIS栅格数据导出为其他栅格格式吗? | |||
是 PostGIS栅格具有以下功能 ST_AsGDALRaster 这将允许您使用SQL导出到您的GDAL支持的任何栅格格式。您可以使用以下命令获取这些列表 ST_GDALDrivers SQL函数。 您也可以使用GDAL命令行工具将PostGIS栅格导出为其他格式。GDAL有一个PostGIS栅格驱动程序,但只有在您选择使用PostgreSQL支持进行编译时才会进行编译。 该驱动程序目前不支持不规则分块的栅格,尽管您可以将不规则分块的栅格存储为PostGIS栅格数据类型。 如果从源代码进行编译,则需要在配置中包含 --WITH-PG=路径/至/PG_CONFIG 以启用驱动程序。参考 GDAL构建提示 获取有关在各种操作系统平台上构建GDAL的提示。 如果您的GDAL版本是使用PostGIS栅格驱动程序编译的,则在执行此操作时应在列表中看到PostGIS栅格 Gdalinfo--格式 要通过GDAL获取有关栅格的摘要,请使用gdalinfo: Gdalinfo“pg:host=localhost port=5432数据库名称=‘mygisdb’user=‘postgres’password=‘Whatwhere’SCHEMA=‘SOMESCHEMA’TABLE=sometable”
要将数据导出为其他栅格格式,请使用Gdal_Translate下面将以10%的大小将表中的所有数据导出到PNG文件。 根据像素带类型的不同,如果导出格式不支持该像素类型,则某些转换可能不起作用。例如,浮点带类型和32位无符号整数不能很容易地转换为JPG或其他类型。 下面是一个简单的翻译例子 Gdal_Translate-of PNG-OutSize 10%10%“pg:host=localhost port=5432数据库名称=‘mygisdb’user=‘postgres’password=‘any’SCHEMA=‘SOMESSCHEMA’TABLE=sometable”C:\Somefile.png 还可以使用WHERE=...在导出中使用SQL WHERE子句在您的驱动程序连接字符串中。下面是一些使用WHERE子句的代码 Gdal_Translate-of PNG-OutSize 10%10%“PG:host=Localhost port=5432数据库名称=‘mygisdb’user=‘postgres’password=‘any’SCHEMA=‘SOMESSCHEMA’TABLE=sometable where=‘filename=\’abcd.sid\‘’”“C:\Somefile.png Gdal_Translate-of PNG-OutSize 10%10%“PG:host=Localhost port=5432数据库名称=‘mygisdb’user=‘postgres’password=‘Whatwhere’SCHEMA=‘SOMESSCHEMA’TABLE=sometable where=‘ST_Intersects(RAST,ST_SetSRID(ST_Point(-71.032,42.3793),4326))’”C:\intersectregion.png 要查看更多示例和语法,请参阅 读取PostGIS栅格区的栅格数据 | ||||
13.7. | 他们的GDAL二进制文件是否已使用PostGIS Raster支持进行编译? | |||
是。查看页面 GDAL二进制文件 佩奇。任何支持PostgreSQL的编译工具都应该包含PostGIS栅格。GDAL工具通常也包含在 QGIS 。 如果您想获得Windows的最新夜间构建--那么请查看使用Visual Studio构建的Tamas Szekeres夜间构建,其中包含GDAL主干、Python绑定、MapServer可执行文件和内置的PostGIS栅格驱动程序。只需点击SDK BAT并从那里运行您的命令。 http://www.gisinternals.com 。VS项目文件也是可用的。 | ||||
13.8. | 我可以使用哪些工具来查看PostGIS栅格数据? | |||
您可以使用 MapServer 使用GDAL编译以查看栅格数据。如果安装了PostGIS栅格驱动程序,则QGIS支持查看PostGIS栅格。 理论上,任何使用GDAL渲染数据的工具都可以支持PostGIS栅格数据,或者只需很少的工作就可以支持它。同样适用于Windows,Tamas的二进制文件(包括MapServer) http://www.gisinternals.com 对于Windows用户来说是一个很好的选择,如果你不想麻烦的话必须安装编译自己的。 | ||||
13.9. | 如何将PostGIS栅格图层添加到我的MapServer地图? | |||
首先,您需要使用PostGIS栅格支持编译的GDAL 1.7或更高版本。GDAL 3或更高版本是首选,因为在1.8版本中修复了许多问题,并且在主干版本中修复了更多的PostGIS栅格问题。 您可以像处理任何其他栅格一样。参考 地图服务器栅格处理选项 有关可用于MapServer栅格图层的各种处理函数的列表,请参见。 使PostGIS栅格数据特别有趣的是,由于每个切片可以具有各种标准数据库列,因此您可以在数据源中对其进行分段 以下是如何在MapServer中定义PostGIS栅格图层的示例。
-- displaying raster with standard raster options LAYER NAME coolwktraster TYPE raster STATUS ON DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever' schema='someschema' table='cooltable' mode='2'" PROCESSING "NODATA=0" PROCESSING "SCALE=AUTO" #... other standard raster processing functions here #... classes are optional but useful for 1 band data CLASS NAME "boring" EXPRESSION ([pixel] < 20) COLOR 250 250 250 END CLASS NAME "mildly interesting" EXPRESSION ([pixel] > 20 AND [pixel] < 1000) COLOR 255 0 0 END CLASS NAME "very interesting" EXPRESSION ([pixel] >= 1000) COLOR 0 255 0 END END -- displaying raster with standard raster options and a where clause LAYER NAME soil_survey2009 TYPE raster STATUS ON DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever' schema='someschema' table='cooltable' where='survey_year=2009' mode='2'" PROCESSING "NODATA=0" #... other standard raster processing functions here #... classes are optional but useful for 1 band data END | ||||
13.10. | 我当前可以对我的栅格数据使用哪些函数? | |||
请参阅以下列表 Chapter 12, 栅格参考 。还有更多,但这仍是一项正在进行的工作。 请参阅 PostGIS栅格路线图页面 以了解未来可期待的详细情况。 | ||||
13.11. | 我收到错误:函数st_intersects(raster,未知)不唯一或st_Union(几何图形,文本)不唯一。我该怎么修? | |||
如果您的其中一个参数是几何体的文本表示,而不是几何体,则会发生函数不唯一错误。在这些情况下,PostgreSQL将文本表示标记为未知类型,这意味着它可能落入st_intersects(栅格、几何)或st_intersects(栅格、栅格),从而导致不唯一的情况,因为这两个函数在理论上都可以支持您的请求。要避免这种情况,需要将几何体的文本表示形式强制转换为几何体。 例如,如果您的代码如下所示: SELECT rast FROM my_raster WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)'); 通过将代码更改为以下代码,将文本几何图形表示转换为几何图形: SELECT rast FROM my_raster WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)'::geometry); | ||||
13.12. | PostGIS Raster与Oracle GeoRaster(SDO_GEORASTER)和SDO_RASTER类型有何不同? | |||
有关这个主题的更广泛的讨论,请查看Jorge Aévalo Oracle GeoRaster和PostGIS栅格:第一印象 与逐层地理配准相比,逐栅格地理配准的主要优势在于: *覆盖范围不一定是矩形的(栅格覆盖范围大时通常是这种情况。请参阅文档中可能的栅格排列) *栅格到重叠(这是实现无损矢量到栅格转换所必需的) 这些安排在Oracle中也是可能的,但它们意味着存储链接到尽可能多的SDO_RASTER表的多个SDO_GEORASTER对象。复杂的覆盖可能会导致数据库中有数百个表。使用PostGIS Raster,您可以将类似的栅格排列存储到唯一的表格中。 这有点像如果PostGIS强制您只存储没有间隙或重叠的完全矩形矢量覆盖(完美的矩形拓扑层)。这在一些应用中是非常实用的,但实践表明,对于大多数地理覆盖来说,这是不现实或不可取的。矢量结构需要灵活地存储不连续和非矩形的覆盖率。我们认为,栅格结构也应该受益,这是一个很大的优势。 | ||||
13.13. | 大文件的raster2pgsql加载失败,N字节的字符串对于编码转换来说是否太长? | |||
在生成要加载的文件时,raster2pgsql不会与数据库建立任何连接。如果数据库设置了与数据库编码不同的显式客户端编码,则在加载大型栅格文件(大小超过30 MB)时,可能会遇到 例如,如果您的数据库使用UTF8,但为了支持Windows应用程序,您将客户端编码设置为 要解决此问题,请确保客户端编码与加载期间的数据库编码相同。您可以通过在加载脚本中显式设置编码来实现这一点。例如,如果您使用的是Windows: 设置PGCLIENTENCODING=UTF8 如果您在Unix/Linux上 EXPORT PGCLIENTENCODING=UTF8 这个问题的血淋淋的细节在 http://trac.osgeo.org/postgis/ticket/2209 | ||||
13.14. | 我收到了错误消息 | |||
从PostGIS 2.1.3和2.0.5开始,对安全性进行了更改,默认禁用所有GDAL驱动程序和数据库栅格。发行说明位于 PostGIS 2.0.6、2.1.3安全版本 。要重新启用特定驱动程序或所有驱动程序并重新启用数据库外支持,请参阅 Section 2.1, “简略版” 。 |
本章介绍了在PostGIS源代码tarball和源代码存储库的Extras文件夹中找到的功能。这些脚本并不总是与PostGIS二进制版本打包在一起,但通常是基于PL/pgSQL或可以按原样运行的标准外壳脚本。
这是一把叉子 PAGC标准器 (这部分的原始代码是 PAGC PostgreSQL地址标准器 )。
地址标准化器是一个单行地址解析器,它接受输入地址,并根据表和助手lex和gaz表中存储的一组规则对其进行规范化。
该代码内置于一个名为 address_standardizer
它可以与一起安装 创建扩展地址_标准化器;
。除了ADDRESS_STANDIZER扩展名之外,还有一个名为 address_standardizer_data_us
构建了扩展,其中包含用于美国数据的GAZ、LEX和RULES表。可以通过以下方式安装此扩展: 创建扩展地址_标准化器_数据_我们;
此扩展模块的代码可在PostGIS中找到 extensions/address_standardizer
目前是自给自足的。
有关安装说明,请参阅: Section 2.3, “安装和使用地址标准化程序” 。
解析器从右到左工作,首先查看邮政编码、州/省、城市的宏元素,然后查看微观元素,以确定我们正在处理的是门牌号、街道、十字路口还是地标。它目前不寻找国家代码或名称,但这可能会在未来引入。
假定为美国或CA,基于:邮政编码为美国或加拿大的州/省为美国或加拿大其他美国
可以使用与Perl兼容的正则表达式来识别它们。这些正则表达式当前位于parseAddress-api.c中,如果需要,可以相对简单地进行更改。
可以使用与Perl兼容的正则表达式来识别它们。这些正则表达式当前位于parseAddress-api.c中,但将来可能会移到Include中以便于维护。
standardize_address
功能。标准地址 — 由地址元素组成的复合类型。这是的返回类型 standardize_address
功能。
由地址元素组成的复合类型。这是的返回类型 standardize_address 功能。元素的某些描述借用自 PAGC邮政属性 。
令牌号表示中的输出参考号 规则表 。
This method needs address_standardizer extension.
为文本(令牌号 0
):指建筑物编号或名称。未解析的建筑标识符和类型。对于大多数地址,通常为空。
是文本(令牌号 1
这是街道上的街道号码。示例 75 在……里面 道富银行75号
。
为文本(令牌号 2
):街道名称前方向,如北、南、东、西等。
为文本(令牌号 3
):街道名称前修饰符示例 OLD 在……里面 3715老99号公路
。
为文本(令牌号 4
):街道前缀类型
为文本(令牌号 5
):街道名称
为文本(令牌号 6
):街柱类型,如ST、Ave、Cir。跟在根街道名称后面的街道类型。示例 STREET 在……里面 道富银行75号
。
为文本(令牌号 7
:Street Post-Directed街道名称后面的方向修饰符。示例 WEST 在……里面 第十大道西3715号
。
为文本(令牌号 8
):农村路线。示例 7 在……里面 RR 7
。
是文本:额外信息,如楼层编号。
为文本(令牌号 10
):例如波士顿。
为文本(令牌号 11
):示例 MASSACHUSETTS
为文本(令牌号 12
):示例 USA
是文本邮政编码(邮政编码)(令牌号 13
):示例 02109
是文本邮箱号码(令牌号 14和15
):示例 02109
是文本公寓号还是套房号(令牌号 17
):示例 3B 在……里面 APT 3B
。
规则表 — 规则表包含一组将地址输入序列令牌映射到标准化输出序列的规则。规则定义为一组输入令牌,后跟-1(终止符),后跟一组输出令牌,后跟-1,后跟表示规则类型的数字,然后是规则排名。
规则表必须至少包含以下列,但允许您添加更多列以供自己使用。
表的主键
表示规则的文本字段。详细信息请访问 PAGC地址标准器规则记录 。
规则由一组表示输入令牌的非负整数组成,以-1结尾,后跟相同数量的表示邮政属性的非负整数,以-1结尾,然后是表示规则类型的整数,最后是表示规则等级的整数。规则的排名从0(最低)到17(最高)。
举个例子,规则是 2 0 2 22 3-1 5 5 6 7 3-1 2 6
映射到输出令牌序列 类型编号类型直接限定 到输出序列 Street Street SuFTYP SuFDIR资格 。该规则是一个排名为6的ARC_C规则。
中列出了相应输出令牌的编号 标准地址 。
每条规则都以一组输入令牌开始,后跟一个终止符 -1
。摘录自的有效输入令牌 PAGC输入令牌 具体如下:
基于表单的输入令牌
(13)。与符号( & )经常用来缩写单词“and”。
(9)。标点符号。
(21)。两个字母的序列。通常用作标识符。
(25)。分数有时用在公民编号或单位编号中。
(23)。同时包含字母和数字的字母数字字符串。用于标识符。
(0)。一串数字。
(15)。诸如First或First等表示法。常用于街道名称中。
(18)。一封信。
(1)。单词是一串任意长度的字母。一个字母既可以是一个单词,也可以是一个单词。
基于函数的输入令牌
(14)。用来表示邮局信箱的词。例如 盒 或 邮政信箱 。
(19)。前缀用来表示建筑物或建筑群的词,通常作为前缀例如: 塔楼 在……里面 7A塔 。
(24)。用于表示建筑物或建筑群的单词和缩略语,通常作为后缀。例如: 购物中心 。
(22)。用来表示方向的词,例如 北 。
(20)。用于表示里程碑式地址的单词。
(6)。用来表示公路和公路的词语和缩略语。例如: 州际公路 在……里面 5号州际公路
(8)。用于表示乡村路线的单词和缩略语。 RR 。
(2)。用来表示街头风格的词语和缩略语。例如: ST 或 AVE 。
(16)。用于表示内部子地址的单词和缩写。例如, APT 或 UNIT 。
邮政类型输入令牌
(28)。一个5位数的数字。标识邮政编码
(二十九)。一个四位数的数字。标识ZIP4。
(27)。字母数字字母的3个字符序列。标识FSA,即加拿大邮政编码的前3个字符。
(26)。由3个字符组成的数字字母数字序列。标识LDU,即加拿大邮政编码的最后3个字符。
停顿字
STOPWORDS与单词相结合。在规则中,由多个单词和STOPWORD组成的字符串将由单个单词令牌表示。
(7)。词法意义较低的词,在分析时可以省略。例如: THE 。
在第一个-1(终止符)之后,跟随输出内标识及其顺序,后跟终止符 -1
。中列出了相应输出令牌的编号 标准地址 。允许什么取决于一种规则。中列出了对每种规则类型有效的输出令牌 the section called “规则类型和等级” 。
规则的最后部分是规则类型,它由以下内容之一表示,后跟规则等级。规则的排名从0(最低)到17(最高)。
MACRO_C
(令牌号=“ 0 “)。用于分析宏子句的规则类,如 地点州邮政编码
宏_C输出令牌 (节选自 Http://www.pagcgeo.org/docs/html/pagc-12.html#--r-typ-- 。
(令牌号“10”)。示例“奥尔巴尼”
(令牌号“11”)。示例“NY”
(代币号码“12”)。大多数引用文件中不使用该属性。示例“USA”
(代币编号“13”)。(SADS要素“邮政编码”、“加4”)。此属性用于美国邮政编码和加拿大邮政编码。
MICRO_C
(令牌号=“ 1 “)。用于解析完整微子句的规则类(如House、Street、sufdir、predir、preyp、suftype、qualif)(即ARC_C+Citic_C)。这些规则不在构建阶段使用。
Micro_C输出令牌 (节选自 Http://www.pagcgeo.org/docs/html/pagc-12.html#--r-typ-- 。
是文本(令牌号 1
这是街道上的街道号码。示例 75 在……里面 道富银行75号
。
为文本(令牌号 2
):街道名称前方向,如北、南、东、西等。
为文本(令牌号 3
):街道名称前修饰符示例 OLD 在……里面 3715老99号公路
。
为文本(令牌号 4
):街道前缀类型
为文本(令牌号 5
):街道名称
为文本(令牌号 6
):街柱类型,如ST、Ave、Cir。跟在根街道名称后面的街道类型。示例 STREET 在……里面 道富银行75号
。
为文本(令牌号 7
:Street Post-Directed街道名称后面的方向修饰符。示例 WEST 在……里面 第十大道西3715号
。
ARC_C
(令牌号=“ 2 “)。用于分析微子句的规则类,不包括House属性。因此,使用与MICRO_C减去House标记相同的一组输出标记。
CIVIC_C
(令牌号=“ 3 “)。用于解析House属性的规则类。
EXTRA_C
(令牌号=“ 4 “)。用于解析额外属性的规则类-从地理编码中排除的属性。这些规则不在构建阶段使用。
Extra_C输出令牌 (节选自 Http://www.pagcgeo.org/docs/html/pagc-12.html#--r-typ-- 。
(令牌号 0
):未解析的建筑物标识符和类型。
(令牌号 14
): BOX 在……里面 方框3B
(令牌号 15
): 3B 在……里面 方框3B
(令牌号 8
): RR 在……里面 RR 7
(令牌号 16
): APT 在……里面 APT 3B
(令牌号 17
): 3B 在……里面 APT 3B
(令牌号 9
):其他方面的非机密产出。
Lex表 — Lex表用于对字母数字输入进行分类,并将该输入与(A)输入令牌相关联(请参见 the section called “输入令牌” )和(B)标准化表述。
Lex(词典的缩写)表用于对字母数字输入进行分类,并将该输入与 the section called “输入令牌” 和(B)标准化陈述。您将在这些表中找到以下内容 ONE
映射到标准字: 1
。
在表中,Lex至少有以下列。您可以添加
表的主键
INTEGER:定义编号?
文本:输入的单词
正文:标准化的替代词
INTEGER:它是哪种词。只有在这种情况下使用它,才会被取代。参考 PAGC令牌 。
GAZ表 — GAZ表用于标准化地名并将该输入与(A)输入令牌相关联(请参见 the section called “输入令牌” )和(B)标准化表述。
GAZ(地名词典的缩写)表用于标准化地名并将该输入与 the section called “输入令牌” 和(B)标准化陈述。例如,如果您在美国,则可以使用州名称和相关缩写来加载这些名称。
GAZ表在表中至少有以下列。您可以根据自己的需要添加更多的栏。
表的主键
整数:定义编号?-用于单词实例的标识符
文本:输入的单词
正文:标准化的替代词
INTEGER:它是哪种词。只有在这种情况下使用它,才会被取代。参考 PAGC令牌 。
parse_address — 获取一行地址并将其分成几个部分
record parse_address(
text address)
;
返回以地址作为输入,并返回由字段组成的记录输出 num , 街道 , 街道2 , 地址1 , 城市 , 状态 , 拉链 , Zipplus , 国家/地区 。
可用性:2.2.0
This method needs address_standardizer extension.
单地址
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表 表名、 GAZ表 ,以及 规则表 表名和地址。
变体1:将地址作为单行。
变体2:将地址分为两部分。一个 微观
由标准的第一行邮政地址组成,例如 House_Num街
,以及由地址的标准邮政第二行组成的宏,例如 城市、州和国家/地区邮政编码
。
可用性:2.2.0
This method needs address_standardizer extension.
使用ADDRESS_STANDIZER_DATA_US扩展
创建扩展地址_STANDIZER_DATA_US;--只需创建一次
变体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扩展创建扩展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_data
还创建了加载程序从人口普查站点下载并加载到数据库中的每个州的所有人口普查数据。在当前模型中,每组状态表都带有州代码前缀,例如 ma_addr
, ma_edges
具有仅强制实施该状态数据的约束。这些表中的每一个都继承自这些表 adr
, 脸孔
, 边
,等位于 TIGER模式
。
所有地理编码函数仅引用基表,因此不要求调用数据方案 tiger_data
或者,该数据不能进一步分区到其他架构中--例如,每个州的不同架构,只要所有的表都继承自 老虎
架构。
有关如何在数据库中启用扩展模块以及如何使用它加载数据的说明,请参阅 Section 2.4.1, “启用PostGIS数据库的Tiger地理编码器:使用扩展模块” 。
![]() | |
如果您使用的是Tiger地理编码器(Tiger_2010),则可以使用Extras/Tiger中附带的Upgrade_Geocoder.bat/.sh脚本来升级脚本。一个主要的变化是 |
![]() | |
PostGIS 2.2.0版本中的新功能是对Tiger 2015数据的支持,并将地址标准化作为PostGIS的一部分。 PostGIS2.1.0版本中的新功能是,如果您运行的是PostgreSQL 9.1+,则可以安装带有PostgreSQL扩展模型的Tiger地理编码器。参考 Section 2.4.1, “启用PostGIS数据库的Tiger地理编码器:使用扩展模块” 有关详细信息,请参阅。 |
这个 Pagc_Normalize_Address 作为内置产品的替代产品 Normalize_Address 。请参阅 Section 2.3, “安装和使用地址标准化程序” 以获取编译和安装说明。
设计:
该项目的目标是建立一个功能齐全的地理编码器,它可以处理任意的美国地址字符串,并使用归一化的老虎普查数据,产生反映给定地址的位置和该位置的可能性的点几何和评级。评级数字越高,结果就越糟糕。
这个 reverse_geocode
在PostGIS2.0.0中引入的函数可用于获取GPS位置的街道地址和十字街。
对于任何熟悉PostGIS的人来说,地理编码器的安装和使用都应该很简单,并且应该很容易安装,并且可以在PostGIS支持的所有平台上使用。
它应该足够强大,即使有格式和拼写错误也能正常运行。
它应该具有足够的可扩展性,以便用于未来的数据更新,或只需最少的代码更改即可用于替代数据源。
![]() | |
这个 |
tiger_data
如果未指定架构,则返回。 county_all
, state_all
或州代码,后跟 县
或 状态
。 tiger_data
如果未指定架构,则返回。 normalized_address
(Addy)每个位置,以及评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。可以选择性地传入最大结果,默认为10。使用Tiger数据(边、面、地址)、PostgreSQL模糊字符串匹配(Soundex、levenshtein)。 tiger_data
架构。每个状态脚本都作为单独的记录返回。 tiger_data
架构。每个状态脚本都作为单独的记录返回。最新版本支持Tiger 2010结构变化,还加载人口普查区域、区块组和区块表。 norm_addy
具有道路后缀、前缀和标准化类型、街道、街道名称等的类型划分为单独的字段。该函数将只处理用Tiger_Geocode打包的查找数据(不需要Tiger人口普查数据)。 norm_addy
具有道路后缀、前缀和标准化类型、街道、街道名称等的类型划分为单独的字段。该函数将只处理用Tiger_Geocode打包的查找数据(不需要Tiger人口普查数据)。需要ADDRESS_STANDIZER扩展名。 norm_addy
复合类型对象,返回它的漂亮打印表示形式。通常与Normize_Address一起使用。与Tiger不同,PostGIS还有其他几个开源地理编码器,它们具有支持多个国家/地区的地理编码的优势
无名氏 使用OpenStreetMap地名词典格式的数据。它需要osm2pgsql来加载数据,PostgreSQL 8.4+和PostGIS1.5+才能运行。它被打包为Web服务接口,似乎被设计为作为Web服务进行调用。就像Tiger地理编码器一样,它同时有一个地理编码器和一个反向地理编码器组件。从文档中,不清楚它是否有一个像Tiger地理编码器一样的纯SQL接口,或者是否有大量的逻辑在Web接口中实现。
地理信息系统地理信息系统 还利用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
或州代码,后跟 县
或 状态
。
text Drop_Nation_Tables_Generate_Script(
text param_schema=tiger_data)
;
生成一个脚本,该脚本删除指定架构中以 county_all
, state_all
或州代码,后跟 县
或 状态
。如果要从升级,则需要执行此操作 tiger_2010
至 tiger_2011
数据。
可用性:2.1.0
Drop_State_Tables_Generate_Script — 生成一个脚本,该脚本删除指定架构中以状态缩写为前缀的所有表。默认模式为 tiger_data
如果未指定架构,则返回。
text Drop_State_Tables_Generate_Script(
text param_state, text param_schema=tiger_data)
;
生成一个脚本,该脚本删除指定架构中以状态缩写为前缀的所有表。默认模式为 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;
地理编码 — 接受作为字符串(或其他标准化地址)的地址,并输出一组可能的位置,其中包括NAD 83 Long Long中的点几何图形、每个点的标准化地址以及评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。可以有选择地传入最大结果,默认为10,RESTORY_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 Long Long中的点几何、 normalized_address
(艾迪)每个人,以及评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。使用Tiger数据(边、面、地址)、PostgreSQL模糊字符串匹配(Soundex、levenshtein)和PostGIS线条内插函数来沿Tiger边内插地址。评级越高,地理编码越不可能是正确的。默认情况下,地理编码点从街道地址所在的中心线向一侧(L/R)偏移10米。
增强:2.0.0支持Tiger 2010结构化数据,并修改了一些逻辑,以提高地理编码的速度和精度,并将点从中心线偏移到街道地址所在的一侧。新参数 max_results
用于指定最佳结果的数量或仅返回最佳结果。
以下示例计时是在3.0 GHz单处理器Windows 7计算机上进行的,其中2 GB RAM运行PostgreSQL 9.1rc1/PostGIS 2.0,并加载了所有MA、MN、CA、RI状态TIGER数据。
精确匹配的计算速度更快(61ms)
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条街道和州、市、邮政编码,并输出位于交叉点处的第一条交叉街道上的一组可能位置,还包括作为NAD 83 Long Late中的点位置的Geomout,a normalized_address
(Addy)每个位置,以及评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。可以选择性地传入最大结果,默认为10。使用Tiger数据(边、面、地址)、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)
;
在相交的2条街道和州、城市、邮政编码中,输出位于交叉点处的第一条交叉街道上的一组可能的位置,还包括NAD 83 Long Late中的点几何图形、每个位置的标准化地址和评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。可以选择传入最大结果,默认为10。返回 normalized_address
(Addy)对于每个,Geomout作为NAD 83 Long Lat中的点位置,以及额定值。评级越低,匹配的可能性就越大。结果首先按最低评级排序。使用Tiger数据(边、面、地址)、PostgreSQL模糊字符串匹配(Soundex、levenshtein)
可用性:2.0.0
下面的示例计时是在3.0 GHz单处理器Windows 7计算机上进行的,其中2 GB RAM运行PostgreSQL 9.0/PostGIS 1.5,并加载了所有MA状态Tiger数据。当前有点慢(3000毫秒)
在加载了PostGIS 2.0 PostgreSQL 64位Tiger 2011数据的Windows 2003 64位8 GB上进行测试--(41毫秒)
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也可以猜测(在Windows7盒子上花费了大约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_Setting_Default的表中。使用自定义设置位于Geocode_Setting中,并且仅包含已由用户设置的设置。
可用性:2.1.0
Get_Tract — 从几何图形所在的轨迹表返回普查区域或字段。默认返回区域的短名称。
text get_tract(
geometry loc_geom, text output_field=name)
;
给定的几何图形将返回该几何图形的人口普查区域位置。如果未指定空间参考系统,则假定为NAD 83 Long。
![]() | |
此函数使用人口普查 如果您尚未加载状态数据并希望加载这些附加表,请执行以下操作 UPDATE tiger.loader_lookupables set LOAD=TRUE WHERE LOAD=FALSE AND LOOKUP_NAME IN(‘TRACE’,‘BG’,‘TABBLOCK’); 然后,它们将被包括在 Loader_Generate_Script 。 |
可用性:2.0.0
Install_Missing_Indexes — 查找具有地理编码器联接中使用的键列的所有表,并筛选缺少这些列上使用的索引的条件,然后将它们添加到表中。
boolean Install_Missing_Indexes(
)
;
查找中的所有表 老虎
和 tiger_data
在地理编码器连接和过滤器中使用的具有键列的模式缺少这些列上的索引,并将输出SQL DDL来定义这些表的索引,然后执行生成的脚本。这是一个帮助器函数,用于添加使查询速度更快所需的新索引,这些索引在加载过程中可能已丢失。此函数是与 Missing_Indexes_Generate_Script 除了生成CREATE INDEX脚本之外,还执行它。它被调用为 update_geocode.sql
升级脚本。
可用性:2.0.0
Loader_Generate_Census_Script — 为指定州的指定平台生成外壳脚本,该脚本将下载老虎人口普查州区域、BG和选项卡块数据表、暂存并加载到 tiger_data
架构。每个状态脚本都作为单独的记录返回。
setof text loader_generate_census_script(
text[] param_states, text os)
;
为将下载TIGER数据人口普查州的指定州的指定平台生成外壳脚本 道
、数据块组 BG
,以及 选项卡块
数据表,暂存并加载到 tiger_data
架构。每个状态脚本都作为单独的记录返回。
它在Linux上使用unzip(在Windows上默认使用7-Zip),并使用wget进行下载。它用 Section 4.7.2, “使用Shapefile加载器” 以加载数据。注意,它所做的最小单位是一个完整的状态。它将仅处理临时文件夹和临时文件夹中的文件。
它使用以下控制表来控制进程和不同的操作系统外壳语法变化。
loader_variables
跟踪各种变量,如普查地点、年份、数据和分段方案
loader_platform
各种平台的配置文件以及各种可执行文件所在的位置。自带Windows和Linux。还可以添加更多内容。
loader_lookuptables
每条记录定义一种表(州、县),是否处理其中的记录以及如何加载它们。定义导入数据、暂存数据、添加和删除每个列、索引和约束的步骤。每个表都带有STATE前缀,并且继承自Tiger模式中的一个表。例如,创建 tiger_data.ma_faces
它继承自 tiger.faces
可用性:2.0.0
![]() | |
Loader_Generate_Script 包括这一逻辑,但如果您在PostGIS2.0.0alpha5之前安装了Tiger地理编码器,则需要在已经完成的州上运行此命令,才能获得这些附加表。 |
生成脚本,以Windows外壳脚本格式加载选定州的数据。
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 — 为指定状态的指定平台生成外壳脚本,该脚本将下载Tiger数据、暂存并加载到 tiger_data
架构。每个状态脚本都作为单独的记录返回。最新版本支持Tiger 2010结构变化,还加载人口普查区域、区块组和区块表。
setof text loader_generate_script(
text[] param_states, text os)
;
为指定状态的指定平台生成外壳脚本,该脚本将下载Tiger数据、暂存并加载到 tiger_data
架构。每个状态脚本都作为单独的记录返回。
它在Linux上使用unzip(在Windows上默认使用7-Zip),并使用wget进行下载。它用 Section 4.7.2, “使用Shapefile加载器” 以加载数据。注意,它所做的最小单位是整个状态,但您可以通过自己下载文件来覆盖它。它将仅处理临时文件夹和临时文件夹中的文件。
它使用以下控制表来控制进程和不同的操作系统外壳语法变化。
loader_variables
跟踪各种变量,如普查地点、年份、数据和分段方案
loader_platform
各种平台的配置文件以及各种可执行文件所在的位置。自带Windows和Linux。还可以添加更多内容。
loader_lookuptables
每条记录定义一种表(州、县),是否处理其中的记录以及如何加载它们。定义导入数据、暂存数据、添加和删除每个列、索引和约束的步骤。每个表都带有STATE前缀,并且继承自Tiger模式中的一个表。例如,创建 tiger_data.ma_faces
它继承自 tiger.faces
可用性:2.0.0以支持Tiger 2010结构化数据并加载人口普查区域(TRAIL)、块组(BG)和块(选项卡块)表。
![]() | |
如果您使用的是pgAdmin 3,请注意,默认情况下,pgAdmin 3会截断长文本。要修复,就得改变 文件- > 选项- > 查询工具- > 查询编辑器- > 麦克斯。每列字符数 超过50000个字符。 |
使用psql,其中gistest是您的数据库, /gisdata/data_load.sh
是使用要运行的外壳命令创建的文件。
psql -U postgres -h localhost -d gistest -A -t \ -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'gistest')" > /gisdata/data_load.sh;
生成脚本,以Windows外壳脚本格式加载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 — 为加载县和州查找表的指定平台生成外壳脚本。
text loader_generate_nation_script(
text os)
;
为指定的平台生成外壳脚本,该脚本加载到 county_all
, county_all_lookup
, state_all
将表转换为 tiger_data
架构。它们分别继承自 县
, county_lookup
, 状态
中的表格 老虎
架构。
它在Linux上使用unzip(在Windows上默认使用7-Zip),并使用wget进行下载。它用 Section 4.7.2, “使用Shapefile加载器” 以加载数据。
它使用以下控制表 tiger.loader_platform
, tiger.loader_variables
,以及 tiger.loader_lookuptables
以控制进程和不同操作系统外壳的语法变化。
loader_variables
跟踪各种变量,如普查地点、年份、数据和分段方案
loader_platform
各种平台的配置文件以及各种可执行文件所在的位置。附带Windows和Linux/Unix。还可以添加更多内容。
loader_lookuptables
每条记录定义一种表(州、县),是否处理其中的记录以及如何加载它们。定义导入数据、暂存数据、添加和删除每个列、索引和约束的步骤。每个表都带有STATE前缀,并且继承自Tiger模式中的一个表。例如,创建 tiger_data.ma_faces
它继承自 tiger.faces
增强:2.4.1修复了邮政编码5制表区域(Zcta5)加载步骤,启用后,zcta5数据将作为国家脚本加载的一部分作为名为zcta5_all的单个表进行加载。
可用性:2.1.0
![]() | |
如果您希望将邮政编码5表格区域(Zcta5)包括在您的国家/地区脚本加载中,请执行以下操作: UPDATE tiger.loader_lookupables set Load=true where table_name=‘zcta510’; |
![]() | |
如果你在跑步 |
Missing_Indexes_Generate_Script — 查找地理编码器联接中使用的具有键列的所有表,这些表缺少这些列的索引,并将输出SQL DDL以定义这些表的索引。
text Missing_Indexes_Generate_Script(
)
;
查找中的所有表 老虎
和 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_Geocode打包的查找数据(不需要Tiger人口普查数据)。
norm_addy normalize_address(
varchar in_address)
;
在给定文本街道地址的情况下,返回一个复合 norm_addy
具有道路后缀、前缀和标准化类型、街道、街道名称等的类型划分为单独的字段。这是将所有地址转换为标准化邮政格式的地理编码过程的第一步。除了与地理编码器一起打包的数据外,不需要其他数据。
此函数仅使用随Tiger_Geocoder预加载的各种方向/州/后缀查找表,这些查找表位于 老虎
模式,因此您不需要下载老虎普查数据或任何其他附加数据即可使用它。您可能会发现需要向中的各种查找表添加更多缩写或替代名称 老虎
架构。
它使用位于以下位置的各种控件查找表 老虎
用于标准化输入地址的架构。
中的字段 norm_addy
TYPE OBJECT由该函数按以下顺序返回,其中()表示地理编码器需要的字段,[]表示可选字段:
(地址)[predirAbbrev](街道名称)[streetTypeAbbrev][postdirabbrev][内部][位置][stateAbbrev][压缩][已解析][ZIP4][地址_字母数字]
增强:2.4.0 Norm_Addy对象包括附加字段ZIP4和Address_AlphanNumeric。
地址
是一个整数:街道编号
前缀缩略语
是varchar:道路的方向前缀,如N、S、E、W等。这些是使用 direction_lookup
桌子。
街道名称
Varchar
StreetTypeAbbrev
街道类型的varchar缩写版本:例如ST、Ave、Cir。这些都是使用 street_type_lookup
桌子。
后迪尔缩略语
道路N、S、E、W等的缩写方向。这些都是使用 direction_lookup
桌子。
内部
Varchar内部地址,如公寓或套房编号。
位置
瓦尔察尔通常是一个城市或管理省份。
状态缩略语
Varchar两个字符的美国州。例如密歇根州纽约州马萨诸塞州。这些属性由 state_lookup
桌子。
拉链
Varchar 5位数字邮政编码。例如02109。
已解析
Boolean-表示addess是否由规格化过程形成。NORMALIZE_ADDRESS函数在返回地址之前将其设置为真。
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_Geocode打包的查找数据(不需要Tiger人口普查数据)。需要ADDRESS_STANDIZER扩展名。
norm_addy pagc_normalize_address(
varchar in_address)
;
在给定文本街道地址的情况下,返回一个复合 norm_addy
具有道路后缀、前缀和标准化类型、街道、街道名称等的类型划分为单独的字段。这是将所有地址转换为标准化邮政格式的地理编码过程的第一步。除了与地理编码器一起打包的数据外,不需要其他数据。
此函数仅使用随Tiger_Geocoder预加载的各种Pagc_*查找表,这些查找表位于 老虎
模式,因此您不需要下载老虎普查数据或任何其他附加数据即可使用它。您可能会发现需要向中的各种查找表添加更多缩写或替代名称 老虎
架构。
它使用位于以下位置的各种控件查找表 老虎
用于标准化输入地址的架构。
中的字段 norm_addy
TYPE OBJECT由该函数按以下顺序返回,其中()表示地理编码器需要的字段,[]表示可选字段:
的大小写和格式略有不同。 Normalize_Address 。
可用性:2.1.0
This method needs address_standardizer extension.
(地址)[predirAbbrev](街道名称)[streetTypeAbbrev][postdirAbbrev][内部][位置][stateAbbrev][压缩]
现在,ADDRESS_STANDIZER扩展的原生标准地址比NORM_ADDY要丰富一些,因为它旨在支持国际地址(包括国家/地区)。标准地址等效字段为:
House_num,predir,名称,suftype,sufdir,单位,城市,州,邮政编码
增强:2.4.0 Norm_Addy对象包括附加字段ZIP4和Address_AlphanNumeric。
地址
是一个整数:街道编号
前缀缩略语
是varchar:道路的方向前缀,如N、S、E、W等。这些是使用 direction_lookup
桌子。
街道名称
Varchar
StreetTypeAbbrev
街道类型的varchar缩写版本:例如ST、Ave、Cir。这些都是使用 street_type_lookup
桌子。
后迪尔缩略语
道路N、S、E、W等的缩写方向。这些都是使用 direction_lookup
桌子。
内部
Varchar内部地址,如公寓或套房编号。
位置
瓦尔察尔通常是一个城市或管理省份。
状态缩略语
Varchar两个字符的美国州。例如密歇根州纽约州马萨诸塞州。这些属性由 state_lookup
桌子。
拉链
Varchar 5位数字邮政编码。例如02109。
已解析
Boolean-表示addess是否由规格化过程形成。NORMALIZE_ADDRESS函数在返回地址之前将其设置为真。
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_STANDIZER STANDIZE_ADDRESS函数,如下所示,该练习与我们在中所做的类似 Normalize_Address 使用在中创建的数据 地理编码 。
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
复合类型对象,返回它的漂亮打印表示形式。通常与Normize_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)
;
获取已知空间REF中的几何点,并返回包含理论上可能的地址数组和交叉街道数组的记录。如果Include_strnum_range=TRUE,则将街道范围包括在交叉街道中。如果没有传入,Include_strnum_range默认为FALSE。地址是根据一个点离哪条路最近来排序的,所以第一个地址很可能是正确的。
为什么我们说理论地址而不是实际地址。Tiger的数据没有真实的地址,只有街道范围。因此,理论地址是基于街道范围的内插地址。例如,插入我的一个地址会返回26号法院街和26号法院面积,尽管没有26号法院面积这样的地方。这是因为一个点可能位于两条街道的拐角处,因此逻辑沿这两条街道进行内插。逻辑还假设地址沿街道均匀分布,这当然是错误的,因为你可以让一座市政建筑占据街道范围的很大一部分,而其余建筑聚集在街道的尽头。
注:嗯,此功能依赖于TIGER数据。如果您还没有加载覆盖该点区域的数据,那么嗯,您将得到一条空值填充的记录。
返回的记录元素如下:
插图
是一组点:这些点是街道上最接近输入点的中心点。有多少地址,就有多少点。
艾迪
是Norm_Addy(标准化地址)的数组:这些是适合输入点的可能地址的数组。数组中的第一个最有可能。通常应该只有一个,除了当一个点在2条或3条街道的拐角处,或者该点在道路上的某个地方而不是在一边的情况下。
街道
一组varchar:这些是交叉街道(或街道)(相交的街道或投影点所在的街道)。
增强:2.4.1如果加载了可选的zcta5数据集,即使没有加载特定的州数据,Reverse_Geocode函数也可以解析为STATE和ZIP。参考 Loader_Generate_Nation_Script 有关加载zcta5数据的详细信息。
可用性:2.0.0
位于两条街道的拐角处,但最接近一条街道的点。这是麻省理工学院的大致位置: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
在这里,我们选择不包括十字路口的地址范围,并选择了一个非常接近2条街道的拐角的位置,因此可以通过两个不同的地址来知道。
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
对于这个例子,我们重用了我们的地理编码示例 地理编码 而且我们只想要主要地址和最多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 — 将定义的老虎数据区域加载到PostGIS拓扑中,并将老虎数据转换为拓扑的空间参考,并捕捉到拓扑的精度公差。
text Topology_Load_Tiger(
varchar topo_name, varchar region_type, varchar region_id)
;
将定义的Tiger数据区域加载到PostGIS拓扑中。将面、节点和边变换到目标拓扑的空间参考系,并将点捕捉到目标拓扑的公差。创建的面、节点、边保持与原始TIGER数据面、节点、边相同的ID,以便将来的数据集可以更容易地与TIGER数据进行协调。返回有关进程的摘要详细信息。
例如,这对于重新划分数据非常有用,在这些数据中,您需要新形成的多边形沿街道中心线移动,并且生成的多边形不重叠。
![]() | |
该功能依赖于Tiger数据以及PostGIS拓扑模块的安装。有关详细信息,请参阅 Chapter 10, 拓扑学 和 Section 2.2.3, “生成配置” 。如果尚未加载覆盖感兴趣区域的数据,则不会创建任何拓扑记录。如果您尚未使用拓扑功能创建拓扑,则此功能也将失败。 |
![]() | |
大多数拓扑验证错误都是公差问题的结果,在公差问题中,转换后的边点不完全对齐或重叠。为了解决这种情况,如果拓扑验证失败,您可能需要提高或降低精度。 |
必需的参数:
topo_name
要将数据加载到的现有PostGIS拓扑的名称。
region_type
边界区域的类型。目前仅限 地点
和 县
是受支持的。计划是再增加几个。这是要查看的表,以定义区域边界。E.g tiger.place
, tiger.county
region_id
这就是老虎所说的大地水准面。它是表中区域的唯一标识符。对于地方来说,它是 PLCIDFP
中的列 tiger.place
。对于县城来说,这是 Cntyidfp
中的列 tiger.county
可用性:2.0.0
为马萨诸塞州波士顿创建一个拓扑,位于马萨诸塞州的马萨诸塞州平面英尺(2249),公差为0.25英尺,然后加载波士顿城市虎面、边、节点。
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 -------------------+----------+-----------
在质量州平面米(26986)中创建马萨诸塞州萨福克市的拓扑,公差为0.25米,然后加载到萨福克县的虎面、边、节点。
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
如果你跑 地理编码 当此功能为真时,通知日志将输出计时和查询。
SELECT set_geocode_setting('debug_geocode_address', 'true') As result; result --------- true
The functions given below are spatial aggregate functions provided with PostGIS that can be used just like any other sql aggregate function such as sum, average.
The functions given below are spatial window functions provided with PostGIS that can be used just like any other sql window function such as row_numer(), lead(), lag(). All these require an SQL OVER() clause.
The functions given below are PostGIS functions that conform to the SQL/MM 3 standard
![]() | |
SQL-MM defines the default SRID of all geometry constructors as 0. PostGIS uses a default SRID of -1. |
The functions and operators given below are PostGIS functions/operators that take as input or return as output a geography data type object.
![]() | |
Functions with a (T) are not native geodetic functions, and use a ST_Transform call to and from geometry to do the operation. As a result, they may not behave as expected when going over dateline, poles, and for large geometries or geometry pairs that cover more than one UTM zone. Basic transform - (favoring UTM, Lambert Azimuthal (North/South), and falling back on mercator in worst case scenario) |
The functions and operators given below are PostGIS functions/operators that take as input or return as output a 栅格 data type object. Listed in alphabetical order.
The functions given below are PostGIS functions that take as input or return as output a set of or single geometry_dump or geomval data type object.
The functions given below are PostGIS functions that take as input or return as output the box* family of PostGIS spatial types. The box family of types consists of box2d, and box3d
The functions given below are PostGIS functions that do not throw away the Z-Index.
The functions given below are PostGIS functions that can use CIRCULARSTRING, CURVEPOLYGON, and other curved geometry types
The functions given below are PostGIS functions that can use POLYHEDRALSURFACE, POLYHEDRALSURFACEM geometries
Below is an alphabetical listing of spatial specific functions in PostGIS and the kinds of spatial types they work with or OGC/SQL compliance they try to conform to.
The functions given below are PostGIS functions that were added or enhanced.
Functions changed in PostGIS 3.3
The functions given below are PostGIS functions that were added or enhanced.
Functions changed in PostGIS 3.2
The functions given below are PostGIS functions that were added or enhanced.
Functions changed in PostGIS 3.1
The functions given below are PostGIS functions that were added or enhanced.
Functions changed in PostGIS 3.0
The functions given below are PostGIS functions that were added or enhanced.
Functions changed in PostGIS 2.5
The functions given below are PostGIS functions that were added or enhanced.
Functions changed in PostGIS 2.4
All PostGIS aggregates now marked as parallel safe. This will force a drop and recreate of aggregates during upgrade which may fail if any user views or sql functions rely on PostGIS aggregates.
The functions given below are PostGIS functions that were added or enhanced.
![]() | |
PostGIS 2.3.0: PostgreSQL 9.6+ support for parallel queries. |
![]() | |
PostGIS 2.3.0: PostGIS extension, all functions schema qualified to reduce issues in database restore. |
![]() | |
PostGIS 2.3.0: PostgreSQL 9.4+ support for BRIN indexes. Refer to Section 4.9.2, “Brin指数”. |
![]() | |
PostGIS 2.3.0: Tiger Geocoder upgraded to work with TIGER 2016 data. |
The functions given below are PostGIS functions that were added or enhanced.
![]() | |
postgis_sfcgal now can be installed as an extension using CREATE EXTENSION postgis_sfcgal; |
![]() | |
PostGIS 2.2.0: Tiger Geocoder upgraded to work with TIGER 2015 data. |
![]() | |
address_standardizer, address_standardizer_data_us extensions for standardizing address data refer to Section 14.1, “地址标准器” for details. |
![]() | |
Many functions in topology rewritten as C functions for increased performance. |
The functions given below are PostGIS functions that were added or enhanced.
![]() | |
More Topology performance Improvements. Please refer to Chapter 10, 拓扑学 for more details. |
![]() | |
Bug fixes (particularly with handling of out-of-band rasters), many new functions (often shortening code you have to write to accomplish a common task) and massive speed improvements to raster functionality. Refer to Chapter 12, 栅格参考 for more details. |
![]() | |
PostGIS 2.1.0: Tiger Geocoder upgraded to work with TIGER 2012 census data. |
The functions given below are PostGIS functions that were added, enhanced, or have Section 15.12.11, “PostGIS Functions changed behavior in 2.0” breaking changes in 2.0 releases.
New geometry types: TIN and Polyhedral surfaces was introduced in 2.0
![]() | |
Greatly improved support for Topology. Please refer to Chapter 10, 拓扑学 for more details. |
![]() | |
In PostGIS 2.0, raster type and raster functionality has been integrated. There are way too many new raster functions to list here and all are new so
please refer to Chapter 12, 栅格参考 for more details of the raster functions available. Earlier pre-2.0 versions had raster_columns/raster_overviews as real tables. These were changed to views before release. Functions such as |
![]() | |
Tiger Geocoder upgraded to work with TIGER 2010 census data and now included in the core PostGIS documentation. A reverse geocoder function was also added. Please refer to Section 14.2, “TIGER地理编码器” for more details. |
The functions given below are PostGIS functions that have changed behavior in PostGIS 2.0 and may require application changes.
![]() | |
Most deprecated functions have been removed. These are functions that haven't been documented since 1.2 or some internal functions that were never documented. If you are using a function that you don't see documented, it's probably deprecated, about to be deprecated, or internal and should be avoided. If you have applications or tools that rely on deprecated functions, please refer to Q: 9.2 for more details. |
![]() | |
Bounding boxes of geometries have been changed from float4 to double precision (float8). This has an impact on answers you get using bounding box operators and casting of bounding boxes to geometries. E.g ST_SetSRID(abbox) will often return a different more accurate answer in PostGIS 2.0+ than it did in prior versions which may very well slightly change answers to view port queries. |
![]() | |
The arguments hasnodata was replaced with exclude_nodata_value which has the same meaning as the older hasnodata but clearer in purpose. |
The functions given below are PostGIS functions that were introduced or enhanced in the 1.4 release.
有效的错误报告是帮助PostGIS开发的根本途径。最有效的错误报告是使PostGIS开发人员能够重现它,因此理想情况下,它将包含触发它的脚本以及有关检测到它的环境的所有信息。足够好的信息可以在运行时提取 选择Postgis_Full_Version()
[适用于PostGIS]和 选择版本()
[适用于PostgreSQL]。
如果您使用的不是最新版本,那么值得一看它的 版本更改日志 首先,找出您的错误是否已经修复。
使用 PostGIS错误跟踪器 将确保您的报告不会被丢弃,并将随时向您通报其处理过程。在报告新的错误之前,请查询数据库以确定它是否是已知的错误,如果是,请添加有关它的任何新信息。
你可能想读一下西蒙·塔瑟姆的论文 如何有效地报告漏洞 在提交新的报告之前。
文档应准确反映软件的功能和行为。如果没有,可能是因为软件错误,或者因为文档有错误或有缺陷。
文档问题也可以报告给 PostGIS错误跟踪器 。
如果您的修订是琐碎的,只需在新的错误跟踪器问题中描述它,并在文档中详细说明它的位置。
如果您的更改范围更广,补丁肯定是首选。在Unix上,这是一个四个步骤的过程(假设您已经 吉特 已安装):
克隆PostGIS的git存储库。在Unix上,键入:
Git克隆https://git.osgeo.org/gitea/postgis/postgis.git
该文件将存储在postgis目录中
使用您最喜欢的文本编辑器对文档进行更改。在Unix上,键入(例如):
Vim文档/postgis.xml
请注意,文档是用DocBook XML而不是HTML编写的,因此如果您不熟悉它,请按照文档其余部分的示例进行操作。
制作包含与文档主副本不同的补丁文件。在Unix上,键入:
Git diff文档/postgis.xml > doc.patch
将补丁附加到Bug Tracker中的新问题上。
2021/12/18
如果您运行的是GEOS 3.9+(以及ST_MakeValid 3.10+增强)、Proj 6.1+和PostgreSQL 14+,则此版本需要PostgreSQL 9.6或更高版本、GEOS 3.6或更高版本以及Proj 4.9+。
由于新的PG14快速索引版本的一些查询性能下降,我们决定在得到更多关于真实查询的真实影响的用户测试之前,在默认情况下禁用该功能。如果您运行的是PG14+,则可以通过执行以下操作重新启用它:
ALTER OPERATOR FAMILY gist_geometry_ops_2d USING gist ADD FUNCTION 11 (geometry) geometry_gist_sortsupport_2d (internal);
要恢复更改,请执行以下操作:
ALTER OPERATOR FAMILY gist_geometry_ops_2d using gist DROP FUNCTION 11 (geometry);
然后为您的基本索引重新编制索引
5008,ST_DWiThin(Sandro Santilli)未报告空几何图形在无限距离内
4824,已删除 --无和酒
构建选项。现在,在支持MVT的情况下构建时必须使用Wagyu。
4933,topology.GetFaceByPoint将不适用于具有无效边链接的拓扑。
4981,ST_Startpoint支持任何几何图形。对于非行字符串不再返回NULL。
4149,ST_AsMVTGeom现在可以在接近目标范围的比例下保留更多原始几何体的细节。如果需要先前的简化行为,可以提前ST_SIMPLIZE几何图形。(Darafei Praliaskouski)
-需要项目4.9或更高版本
5000,关闭ST_AsMVT Aggregate中的窗口支持,因为它没有实际的用例,并且它在随机输入时崩溃(Paul Ramsey)
4997,FlatGeobuf格式输入/输出(Björn Harrtell)
4575,将拓扑元数据表的SELECT权限授予PUBLIC(Sandro Santilli)
2592,不允许CreateTopology使用SRID定义拓扑 < 0(桑德罗·桑蒂利)
3232,防止将孤立节点移动到不同的面(Sandro Santilli)
-在编辑基本拓扑体时考虑集合Topo Geometries。(桑德罗·桑蒂利)
3248,防止在拓扑几何图形中使用时删除孤立边(Sandro Santilli)
3231,防止在拓扑几何体中使用隔离节点(Sandro Santilli)
3239,如果在拓扑几何的定义中使用连接节点,则防止标题拓扑边(Sandro Santilli)
4950,加速检查ValiateTopology中节点的CONTAING_FACE(Sandro Santilli)
4945,验证拓扑中的多壳面检查(Sandro Santilli)
4944,验证拓扑中的侧位置冲突检查(Sandro Santilli)
3042,边链接的有效拓扑检查(Sandro Santilli)
3276,Face的MBR验证拓扑检查(Sandro Santilli)
4936,边界框受限验证拓扑(Sandro Santilli)
4933,在存在大面的情况下加快拓扑构建(桑德罗·桑蒂利)
3233,节点的Containing_Face的有效拓扑检查(Sandro Santilli)
4830,边侧面包容的验证拓扑检查(Sandro Santilli)
4827,允许在WKT输入中使用NaN坐标(Paul Ramsey)
-ST_Value()接受重采样参数以添加双线性选项(Paul Ramsey)
3778,#4401,ST_边界现在适用于三角网,并且不会线性化曲线(Aliaksandr Kalenik)
4881,#4884,将线性拓扑几何的edge_id的符号存储在关系表中以保持方向(Sandro Santilli)
4628,添加选项以禁用加载Shapefile时的分析(Stefan Corneliu Petrea)
4924,大型多点上更快的ST_RemoveRepeatedPoints,O(NlogN)而不是O(N^2)(Aliakandr Kalenik,Darafei Praliaskouski)
4925,修复ST_DumpPoints以不忽略点(Aliaksandr Kalenik)
-ST_SRID(拓扑几何)替代,以加速查找(Sandro Santilli)
2175,避免在将相同的闭合线添加到拓扑时创建额外的节点(Sandro Santilli)
4974,ADDRESS_STANDIZER_DATA_US的升级路径(Aiven,Regina OBE的Jan Katins)
4975,PostGIS升级更改为不使用临时表(Aiven的Jan Katins)
4981,ST_Startpoint支持任何几何体(Aliaksandr Kalenik)
4799,将SRS包含在GeoJSON中,而SRS存在于space_ref_sys中。
4986,现在使用希尔伯特排序方法可以更快地创建Postgres 14上的GIST索引。(韩王,AliakSandr Kalenik,Darafei Praliaskouski,Giuseppe Broccolo)
4949,使用PROJ_NORAMIZE_FOR_VISUIZATION来做出“轴心交换”决定(保罗·拉姆齐)
-GH647,ST_PixelAsCentroid,ST_PixelAsCentroid在C函数上重新实现(Sergei Shoulbakov)
-GH648,ST_AsMVTGeom现在使用更快的裁剪(AliakSandr Kalenik)
5018,pgsql2shp基本支持WITH CTE子句(Regina OBE)
5019,地址_标准:添加对pcre2的支持(Paul Ramsey)
4923,Topology.ValiateTopologyRelation(Sandro Santilli)
4933,topology.GetFaceContainingPoint(Sandro Santilli)
2175,ST_Scroll(Sandro Santilli)
4841,快速获取拓扑记录的FindTopology(Sandro Santilli)
4869,FindLayer以快速获取层记录(Sandro Santilli)
4851,TopGeom_addTopGeom函数(Sandro Santilli)
ST_MakeValid(几何体,选项)允许使用GEOS 3.10替代有效性构建算法(Paul Ramsey)
ST_InterpolateRaster()使用GDAL(Paul Ramsey)中的算法填充采样点之间的栅格像元(加权距离倒数、平均值等)
ST_Conour()使用GDAL的算法从栅格值生成等高线(Paul Ramsey)
ST_Setz()/ST_SetM()使用从栅格读取的数据填充几何图形的z/m坐标(Paul Ramsey)
新的postgis.gdal_vsi_Options GUC允许使用身份验证密钥等访问VSI网络服务上的Out-DB栅格(Paul Ramsey)
ST_DumpSegments返回一组输入几何的线段(Aliaksandr Kalenik)
4859,ST_Point,ST_Pointz,ST_PointM,ST_PointZM,带SRID参数的构造函数(Paul Ramsey)
4808,ST_ClusterKMeans现在支持max_Radius参数。当您不确定集群的数量,但您知道集群的大小应该是多少时,可以使用它。(Darafei Praliaskouski)
2021/12/04
如果您运行的是GEOS 3.9+(以及ST_MakeValid 3.10+增强)、Proj 6.1+和PostgreSQL 14+,则此版本需要PostgreSQL 9.6或更高版本、GEOS 3.6或更高版本以及Proj 4.9+。
由于新的PG14快速索引版本的一些查询性能下降,我们决定在得到更多关于真实查询的真实影响的用户测试之前,在默认情况下禁用该功能。如果您运行的是PG14+,则可以通过执行以下操作重新启用它:
ALTER OPERATOR FAMILY gist_geometry_ops_2d USING gist ADD FUNCTION 11 (geometry) geometry_gist_sortsupport_2d (internal);
要恢复更改,请执行以下操作:
ALTER OPERATOR FAMILY gist_geometry_ops_2d using gist DROP FUNCTION 11 (geometry);
然后为您的基本索引重新编制索引
自PostGIS 3.2.0beta2版本以来的更改:
发布日期:2021/11/26
如果您运行的是GEOS 3.9+(以及ST_MakeValid 3.10+增强)、Proj 6.1+和PostgreSQL 14+,则此版本需要PostgreSQL 9.6或更高版本、GEOS 3.6或更高版本以及Proj 4.9+。自PostGIS 3.2.0beta1版本以来的更改:
5016,加载器(Shp2pgsq):尊重LDFLAGS(Greg Troxel)
5005,当几何列不是第一列时,ST_AsFlatGeoBuf在表上崩溃(Björn Harrtell)
5017,topology.Validate拓扑错误关系“SHELL_CHECK”已存在(Sandro Santilli)
上映日期:2021/10/23
如果您运行的是GEOS 3.9+(以及ST_MakeValid 3.10+增强)、Proj 6.1+和PostgreSQL 14+,则此版本需要PostgreSQL 9.6或更高版本、GEOS 3.6或更高版本以及Proj 4.9+。
5012,相对于发布的GEOS 3.10.0的干净回归(Regina OBE,Paul Ramsey)
5000,关闭ST_AsMVT Aggregate中的窗口支持,因为它没有实际的用例,并且它在随机输入时崩溃(Paul Ramsey)
4994,shp2pgsql有时缺少INSERT语句(Sandro Santilli)
4990,i386上的getfacecontainingpoint失败(Sandro Santilli)
5008,使带有空操作数的ST_DWiThin始终返回FALSE(Sandro Santilli)
默认情况下,liblwgeom应使用警告标志进行构建(Sandro Santilli)
发布日期:2021/09/10
此版本需要PostgreSQL 9.6或更高版本,GEOS 3.6或更高版本,以及Proj 4.9或更高版本,如果您运行的是GEOS 3.9+(更多是GEOS 3.10+)、Proj 6.1+或PostgreSQL 14+,则需要启用其他功能。
#4824,已删除 `--without-wagyu` 构建选项。现在,在支持MVT的情况下构建时必须使用Wagyu。
#4933,topology.GetFaceByPoint将不适用于具有无效边链接的拓扑。
#4981,ST_Startpoint支持任何几何体。对于非行字符串不再返回NULL。
#4149,ST_AsMVTGeom现在可以在接近目标范围的比例下保留更多原始几何体的细节。如果需要先前的简化行为,可以提前ST_SIMPLIZE几何图形。(Darafei Praliaskouski)
需要项目4.9或更高版本。
#2592,不允许CreateTopology使用SRID定义拓扑 > 0(桑德罗·桑蒂利)
#3232,防止将孤立节点移动到不同的面(Sandro Santilli)
在编辑拓扑基本体时,请考虑集合Topo Geometries。(桑德罗·桑蒂利)
#3248,在拓扑几何体中使用时防止删除孤立边(Sandro Santilli)
#3231,在拓扑几何中使用时防止删除孤立节点(Sandro Santilli)
#3239,如果在拓扑几何的定义中使用连接节点,则防止标题拓扑边(Sandro Santilli)
#4950,加速检查ValiateTopology中的节点CONTAING_FACE(Sandro Santilli)
#4945,验证拓扑中的多壳面检查(Sandro Santilli)
#4944,验证拓扑中的侧位置冲突检查(Sandro Santilli)
#3042,边链接的验证拓扑检查(Sandro Santilli)
#3276,Face的MBR验证拓扑检查(Sandro Santilli)
#4936,边界框受限验证拓扑(Sandro Santilli)
#4933,在有大面孔的情况下加速拓扑构建(桑德罗·桑蒂利)
#3233,节点的Containing_Face的有效拓扑检查(Sandro Santilli)
#4830,边侧面包容的验证拓扑检查(Sandro Santilli)
#4827,允许在WKT输入中使用NaN坐标(Paul Ramsey)
ST_Value()接受重采样参数以添加双线性选项(Paul Ramsey)
#3778,#4401,ST_边界现在适用于TIN,并且不会线性化曲线(AliakSandr Kalenik)
#4881,#4884,将线性拓扑几何的edge_id的符号存储在关系表中以保持方向(Sandro Santilli)
#4628,添加加载shapefile时禁用分析的选项(Stefan Corneliu Petrea)
#4924,大型多点上更快的ST_RemoveRepeatedPoints,O(NlogN)而不是O(N^2)(AliakSandr Kalenik,Darafei Praliaskouski)
#4925,修复ST_DumpPoints以不忽略点(AliakSandr Kalenik)
ST_SRID(拓扑几何)替代,以加速查找(Sandro Santilli)
#2175,在将相同的闭合线添加到拓扑时避免创建额外的节点(Sandro Santilli)
#4974,ADDRESS_STANDIZER_DATA_US的升级路径(Aiven,Regina OBE的Jan Katins)
#4975,PostGIS升级更改为不使用临时表(Aiven的Jan Katins)
#4981,ST_Startpoint支持任何几何体(Aliaksandr Kalenik)
#4799,将SRS包括在GeoJSON中,其中它存在于space_ref_sys中。
#4986,现在使用希尔伯特排序方法可以更快地创建Postgres 14上的GIST索引。(韩王,AliakSandr Kalenik,Darafei Praliaskouski,Giuseppe Broccolo)
#4949,使用PROJ_NORAMIZE_FOR_VISUIZATION来做出“轴心交换”决定(保罗·拉姆齐)
#4923,topology.ValiateTopologyRelation(Sandro Santilli)
#4933,topology.GetFaceContainingPoint(Sandro Santilli)
#2175,ST_Scroll(Sandro Santilli)
#4841,快速获取拓扑记录的FindTopology(Sandro Santilli)
#4869,FindLayer快速获取层记录(Sandro Santilli)
#4851,TopGeom_addTopoGeom函数(Sandro Santilli)
ST_MakeValid(几何体,选项)允许使用GEOS 3.10替代有效性构建算法(Paul Ramsey)
ST_InterpolateRaster()使用GDAL(Paul Ramsey)中的算法填充采样点之间的栅格像元(加权距离倒数、平均值等)
ST_Conour()使用GDAL的算法从栅格值生成等高线(Paul Ramsey)
ST_Setz()/ST_SetM()使用从栅格读取的数据填充几何图形的z/m坐标(Paul Ramsey)
新的postgis.gdal_vsi_Options GUC允许使用身份验证密钥等访问VSI网络服务上的Out-DB栅格(Paul Ramsey)
ST_DumpSegments返回一组输入几何的线段(Aliaksandr Kalenik)
#4859,ST_Point,ST_Pointz,ST_PointM,ST_PointZM,带SRID参数的构造函数(Paul Ramsey)
#4808,ST_ClusterKMeans现在支持max_Radius参数。当您不确定集群的数量,但您知道集群的大小应该是多少时,可以使用它。(Darafei Praliaskouski)
上映日期:2020/12/09
仅列出自3.1.0alpha2以来的更改。如果您运行的是Proj6+、PostgreSQL 12+和GEOS 3.9.0dev,则此版本需要启用PostgreSQL 9.6-13和GEOS >=3.6+的附加功能和增强功能
4214,不推荐使用ST_Count(表名,...)、ST_ApproxCount(表名,...)ST_SummaryStats(表名,..)、ST_Columgraph(表名,...)、ST_Approx历史图(表名,...)、ST_Quantile(表名,...)、ST_ApproxQuantile(表名,...)已删除。(Darafei Praliaskouski)
4801,ST_ClusterK Means支持点[Z]M几何图形中的权重(Darafei Praliaskouski)
4804,ST_ReducePrecision(GEOS 3.9+)允许有效的精度降低(Paul Ramsey)
4805,_ST_SorableHash暴露为解决Postgres中的并行排序性能问题的方法。如果表很大,请使用ORDER BY_ST_SorableHash(Geom)而不是ORDER BY geom来提高并行排序速度(Darafei Praliaskouski)
4625,现在计算了相关统计数据。运行Analyze以启动Brin索引。(Darafei Praliaskouski)
修复ST_GeomFromGML()(Even Roualt)中的urn:ogc:def:crs:epsg的轴顺序问题
上映日期:2020/11/19
仅列出自3.1.0alpah2以来的更改。如果您运行的是Proj6+、PostgreSQL 12+和GEOS 3.9.0dev,则此版本需要启用PostgreSQL 9.6-13和GEOS >=3.6+的附加功能和增强功能
4737,将最低协议buf-c要求增加到1.1.0(Raúl Marín)如果该要求未得到满足或显式禁用(--不带-协议buf),配置步骤现在将失败
4258,将postgis_sfcga从postgis解开到其自己的lib文件中(Regina OBE)
4698,向ST_AsEWKT(Raúl Marín)添加精度参数
向ST_UNION、ST_UnaryUnion、ST_Difference、ST_SymDifference、ST_SubDivide添加GridSize可选参数需要GEOS 3.9(Sandro Santilli)
4789,加快具有多个孔的面拓扑几何的TopOJSON输出(Sandro Santilli)
4758,提高拓扑节点健壮性(Sandro Santilli)
使ST_SUBDIVE可中断(Sandro Santilli)
4660,双/坐标打印中的更改(Raúl Marín)-使用最短的表示法(足以保证往返)。-对小于1e-8的绝对数使用科学记数法。之前的行为是,对于小于1e-12的绝对值,输出0,对于大于1e-12的绝对值,输出固定记数法。-对大于1e+15的绝对数使用科学记数法(相同的行为)。-精度参数现在也影响科学计数法(在其固定之前[5-8])。-所有输出函数现在都尊重所请求的精度(没有任何限制)。-默认精度相同(GeoJSON为9,其他均为15)。
4729,WKT/KML:直接将双面打印到字符串缓冲区(Raúl Marín)
4533,使用标准坐标打印系统打印方框类型(Raúl Marín)
4686,避免在几何体完全位于BBox内部或外部时影响Analyze、_ST_PointOutside、Postgis_Geobbox、ST_CombineBbox(box2D,几何)、ST_ClipByBox2D(Raúl Marín)(Raúl Marín)。
4741,不要使用ST_PointInside Circle如果需要索引,请使用ST_DWiThin。文件调整(Darafei Praliaskouski)
4737,在ST_AsMVT中提高性能并减少内存使用,特别是在涉及并行性的查询中(Raúl Marín)
4746,对序列化过程的微观优化(Raúl Marín)
4719,当SRID不匹配ST_交集(几何、栅格)以及函数中的模式限定调用时,快速失败。(Regina OBE)
4784,添加具有提取最高坐标维度的分量的默认行为的ST_CollectionExtract(几何图形)。(保罗·拉姆齐)
4691,修复带有空几何图形的GIST索引创建过程中的段错误(Raúl Marín)
修复错误的WKB输入(Oracle类型)的处理和格式错误的WKB的单元测试。删除格式错误的WKB案例中的内存泄漏。(保罗·拉姆齐)
4740,地理距离树中的舍入值,就像我们在地理距离上所做的那样(Raúl Marín,Paul Ramsey,Regina OBE)
4739,确保使用postgis_id的所有函数初始化内部缓存(Raúl Marín)
4767、#4768、#4771、#4772,修复解析无效WKB时的段错误(Raúl Marín)
4769,修复st_addband(Raúl Marín)中的段错误
4790,修复具有相同顶点的ST_3相交计算(Nicklas Avén)
4742,Tiger地理编码器在Tiger升级时恢复到2018版本(Regina OBE)
3372,拓扑元素数组不能为空-更改域约束(Regina OBE)
上映日期:2020/07/18
仅列出自3.1.0alpah1以来的更改。如果您运行的是Proj6+、PostgreSQL 12+和GEOS 3.9.0dev,则此版本需要启用PostgreSQL 9.6-13和GEOS >=3.6+的附加功能和增强功能
4656,为隐式GeoJSON接收强制转换Geojson_Text::Geomety(Raúl Marín)
4687,Exposed GEOS MaximumIncribedCircle(Paul Ramsey)
4710,ST_ClusterK Means现在处理3D几何图形(Darafei Praliaskouski)
4675,topology.GetRingEdges现在用C实现(Sandro Santilli)
4681,ST_GetFaceGeometry:打印损坏信息(Sandro Santilli)
4651,ST_SIMPLIZE:如果未删除任何内容,则不复制(Raúl Marín)
尽可能避免敬酒(保罗拉姆齐)
4490,调整功能成本(Raúl Marín)
4672,缓存getSRSbySRID和getSRIDbySRS(Raúl Marín)
4676,避免将烘焙几何解压为只读标题(Raúl Marín)优化转换为PostgreSQL点类型(Raúl Marín)
4620,将内部wagyu更新为0.5.0(Raúl Marín)
4623,优化varlena返回函数(Raúl Marín)
4677,在不同的缓存类型之间共享串行化对象(Raúl Marín)
使用MSVC编译器修复编译/标准化Shebangs(Lo Aic Bartoletti)
发布日期:2020/02/01
如果您运行的是Proj6+、PostgreSQL 12+和GEOS 3.8.0,则此版本需要启用PostgreSQL 9.6+-13和GEOS >=3.6+的附加功能和增强功能
版本输出中的svn编号被git散列替换(Sandro Santilli,Raúl Marín)
4577,放弃对PostgreSQL 9.5的支持(Raúl Marín)
4579,丢弃postgis_proc_set_earch_path.pl(Raúl Marín)
4601,ST_TileEntaine签名已更改。
3057、ST_Force3D、ST_Force3DZ、ST_Force3 DM和ST_Force4D签名已更改。
4601,添加ST_瓷砖信封页边距参数(Yuri Astrakhan)
2972,将静音模式(-q)添加到pgsql2shp(Kristian Thy)
4617,添加配置开关 `--without-phony-revision` (劳尔·马林)
3057,Force3D*、Force4D函数的可选值PARAMS(Kristian Thy)
4624、ST_六角网格和ST_SquareGrid设置返回函数以生成平面的平铺(Paul Ramsey)
4539,统一libm包括(Raúl Marín)
4569,允许将未知的SRID几何图形插入到类型的SRID列(Paul Ramsey)
4149,ST_SIMPLICE(geom,0)现在是O(N)。ST_Affine(ST_Translate、ST_TransScale、ST_Rotate)已优化。ST_SnapToGrid已优化。(Darafei Praliaskouski)
4574,启用链接时间优化(Darafei Praliaskouski)
4578,将并行化和成本性质添加到布林函数(Raúl Marín)
4473,沉默Yacc警告(Raúl Marín)
4589,在不使用“--Enable-DEBUG”(Raúl Marín)的情况下构建时禁用C断言
4543,介绍Ryu印刷双面(Raúl Marín)
4626,支持libxml2的pkg-config(Bas Couwenberg)
4615,加快Geojson输出(Raúl Marín)
上映日期:2019/10/20
如果您运行的是Proj6+、PostgreSQL 12和GEOS 3.8.0,则此版本需要启用PostgreSQL 9.5+-12和GEOS >=3.6+的附加功能和增强功能
2902,postgis_geos_noop(Sandro Santilli)
4128,ST_AsMVT对功能ID的支持(StepanKuzmin)
4230,SP-GIST和对ND盒操作员的GIST支持重叠,包含在相等的范围内(来自自由布卢克塞尔大学的Esteban Zimányi和Arthur Lesuisse,Darafei Praliaskouski)
4171,ST_3DLineInterpolatePoint(Julien Cabieces,文森特·莫拉)
4311,引入和余来验证MVT多边形。此选项需要C++11编译器,并将使用CXXFLAGS(而不是CFLAGS)。增列 `--without-wagyu` 禁用此选项并保持2.5版的行为(Raúl Marín)
1833,ST_AsGeoJSON(ROW)生成完整的GeoJSON要素(Joe Conway)
3687,为隐式GeoJSON生成强制转换json(几何图形)和jsonb(几何图形)(Paul Ramsey)
4198,新增ST_ConstrainedDelaunay Triangles SFCGAL函数(Darafei Praliaskouski)
4267,将GEOS的最低版本提高到3.6(Regina OBE,Darafei Praliaskouski)
3888,栅格支持现已作为单独的扩展模块提供(Sandro Santilli)
3807,扩展库文件不再包含次要版本。如果您需要旧的行为,请使用新的配置开关--带有库次要版本(Regina OBE)
4230,ND框运算符(重叠、包含、范围、等于)现在不会查看两个操作对象中都不存在的维度。请在升级后重新索引您的ND索引。(Darafei Praliaskouski)
4229,不再支持PostgreSQL < 9.5.(Darafei Praliaskouski)
4260,不再安装liblwgeom标头。如果您的项目依赖于它们的可用性,请改用Librttopo。(Darafei Praliaskouski)
4258,删除SFCGAL对ST_Area、ST_Distance、ST_Interval、ST_Difference、ST_Union、ST_Intersects、ST_3DIntersects、ST_3DDistance和postgis.Backend Switch(Darafei Praliaskouski)的支持
4267,启用项目6过时的API(Darafei Praliaskouski、Raúl Marín)
4268,将SFCGAL的最低版本升级到1.3.1(Darafei Praliaskouski)
4331,ST_3DMakeBox现在返回错误而不是小方框(Regina OBE)
4342,删除了ST_AsGeoJSON和ST_AsKML的“版本化”变体(Paul Ramsey)
4356,ST_ACCUM已删除。改用ARRAY_AGG。(Darafei Praliaskouski)
4414,将版本号包含在地址标准化程序库(Raúl Marín)中
4334,修复与重命名函数参数相关的升级问题(Raúl Marín)
4442,raster2pgsql现在跳过NODATA平铺。如果您出于某种原因仍希望它们留在数据库中,请使用-k选项。(Darafei Praliaskouski)
4433,32位散列修复(需要重新索引散列(几何)索引)(Raúl Marín)
3383,现在使用希尔伯特曲线和Postgres缩写比较进行排序。如果您有btree索引,则需要对其重新编制索引。(Darafei Praliaskouski)
4341,在ST_Intersects等提供索引支持的机制下,使用PgSQL 12+中的支持函数API代替SQL内联作为提供索引支持的机制
4330,当输出通过管道传输到中间进程时,postgis_Restore OOM(Hugh Ranalli)
4322,支持Proj 6+API,带来更准确的基准面转换并支持WKT投影
4153,ST_Segentize现在按比例分割分段(Darafei Praliaskouski)。
4162,ST_DW表中存储几何图形和半径的文档示例(Darafei Praliaskouski,GitHub用户Boscope)。
4161和#4294,ST_AsMVTGeom:小于分辨率的快捷几何图形(Raúl Marín)
4176,ST_Intersects支持GEOMETRYCOLLECTION(Darafei Praliaskouski)
4181,ST_AsMVTGeom:避免因验证而更改类型(Raúl Marín)
4183,ST_AsMVTGeom:简化后删除无效几何图形(Raúl Marín)
4196,将postgis_扩展_升级()打包为未打包的扩展(Sandro Santilli)
4215,在ST_DumpAsPolygons中使用浮点比较(Darafei Praliaskouski)
4155,支持ST_LocateBeting和ST_LocateBetweenElevations中的几何坐标、多边形、三角网、三角形(Darafei Praliaskouski)
2767,AddRasterConstraint可选参数的文档(Sunveer Singh)
4244,避免BOX2D_OUT中的未对齐内存访问(Raúl Marín)
4139,正确建立混合维度ND索引构建树(Darafei Praliaskouski,Arthur Lesuisse,Andrew Gierth,Raúl Marín)
4262,文档ST_LineToCurve的多曲面兼容性(Steven Otten)
4276,ST_AsGeoJSON文档刷新(Darafei Praliaskouski)
4292,ST_AsMVT:以双精度小数形式解析JSON数值(Raúl Marín)
4300,ST_AsMVTGeom:始终返回最简单的几何图形(Raúl Marín)
4301,ST_SUBDIVE:在接近边界重合的坐标上修复无限循环(Darafei Praliaskouski)
4289,ST_AsMVTGeom:剪裁前变换坐标空间(Raúl Marín)
4272,改进无法计算统计数据时的通知消息(Raúl Marín)
4313,#4307,PostgreSQL 12兼容性(Laurenz Albe,Raúl Marín)
4299,#4304,ST_GeneratePoints现在是易失性的。添加了种子参数的不可变版本。(迈克·塔夫斯)
4278、ST_3DDistance和ST_3D Intersects现在支持实体三角网和实体多面体曲面(Darafei Praliaskouski)
4348,ST_AsMVTGeom(GEOS):始终执行验证(Raúl Marín)
4295,允许在ST_Overlaps、ST_Containers、ST_ContainsProperly、ST_Coverers、ST_CoveredBy、ST_Crosses、ST_Touches、ST_Disjo、ST_Relate、ST_Equals(Esteban Zimányi)中进行几何测量收集
4340,ST_UNION Aggregate现在可以处理超过1 GB的几何图形(Darafei Praliaskouski)
4378,允许将TIN作为输入传递到GEOS支持的函数(Darafei Praliaskouski)
4368,重新排序LWGEOM结构成员以最大限度地减少额外的填充(Raúl Marín)
4141,使用uint64处理拓扑扩展中的行数(Raúl Marín)
4412,支持使用NODATA=NaN(Darafei Praliaskouski)插入栅格
4413,栅格2pgsql-t AUTO(Darafei Praliaskouski)上的栅格平铺大小遵循GeoTIFF块大小
4422,更新Python2代码,为Python3做好准备(克里斯蒂安·克劳斯)
4352,为PG12+使用CREATE或REPLACE Aggregate(Raúl Marín)
4394,允许几何相等运算符上的完全外连接(Darafei Praliaskouski)
4441,使主罚对多列索引友好,并更快地构建单列索引。(Darafei Praliaskouski)
4403,支持使用复制模式(-D)(Regina OBE)重项目的shp2pgsql能力
4410,有关SRID不匹配的更多描述性错误消息(Darafei Praliaskouski)
在所有输出函数中支持4399、TIN和三角形输出(Darafei Praliaskouski)
3719,在线性化过程中规定每条弧线段的最小数量(Dan Baston/City of Helsinki,Raúl Marín)
4277,ST_GeomFromGeoJSON现在默认将SRID标记为4326根据RFC7946,ST_AsGeoJSON在JSON输出中设置SRID(如果与4326不同)。(Darafei Praliaskouski)
3979,postgis_sfcga_noop()往返函数(Lucas C.Villa Real)
4328,二维三角网的ST_3D相交。(Darafei Praliaskouski)
4509,更新Tiger 2019地理编码器(Regina OBE)
上映日期:2019/10/13
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6。如果运行Proj6+和/或PostgreSQL 12,则启用其他功能。如果运行GEOS 3.8+,则性能增强
上映日期:2019/10/08
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6。如果运行Proj6+和/或PostgreSQL 12,则启用其他功能。如果运行GEOS 3.8+,则性能增强
发布日期:2019/09/28
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6。如果运行Proj6+和/或PostgreSQL 12,则启用其他功能。如果运行GEOS 3.8+,则性能增强
4492,修复ST_SIMPLIZE忽略第三个参数的值(Raúl Marín)
4494,修复具有过时BBox的ST_SIMPLIZE输出(Raúl Marín)
4493,修复具有过时BBox的ST_RemoveRepeatedPoints输出(Raúl Marín)
4495,修复具有过时BBox的ST_SnapToGrid输出(Raúl Marín)
4496,请求时折叠ST_SIMPLIZE(三角形)(Raúl Marín)
4501,允许非超级用户安装postgis_Tiger_Geocoder(Regina OBE)
4503,加速笛卡尔BBox的计算(Raúl Marín)
4504,shp2pgsql-D不适用于架构限定表(Regina OBE)
4505,加快几何图形与GEOS之间的转换(Dan Baston)
4507,将GEOSMakeValid和GEOSBuildArea用于GEOS 3.8+(Dan Baston)
4491,加速ST_RemoveRepeatedPoints(Raúl Marín)
4509,更新Tiger 2019地理编码器(Regina OBE)
4338,人口普查块级数据(选项卡块表)未加载(Regina OBE)
发布日期:2019/08/11
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6。如果运行Proj6+和/或PostgreSQL 12,则启用其他功能
4433,32位散列修复(需要重新索引散列(几何)索引)(Raúl Marín)
4445,修复GEOMETRY_LE中的错误(Raúl Marín)
4451,修复GSerialized_max_Header_Size的计算(Raúl Marín)
4450,加速ST_GeometryType(Raúl Marín)
4452,添加ST_TileEntaine()(Paul Ramsey)
4403,支持使用复制模式(-D)(Regina OBE)重项目的shp2pgsql能力
4417,使用新条目更新space_ref_sys(Paul Ramsey)
4449,加速ST_X、ST_Y、ST_Z和ST_M(Raúl Marín)
4454,加速_ST_OrderingEquals(Raúl Marín)
4453,加速ST_IsEmpty(Raúl Marín)
在PG_UPDATE(Raúl Marín)之后,4271,postgis_扩展_升级()也会更新
4466,修复_postgis_gSerialized_stats中的未定义行为(Raúl Marín)
4209,处理pgsql2shp中的空几何值(Paul Ramsey)
4419,使用协议Buf版本启用/禁用MVT/Geobuf(Paul Ramsey)
4437,形状装载机/翻车机中的手柄点空(保罗·拉姆齐)
4456,添加Rasberg PI 32位Jenkins机器人进行测试(Bruce Rindahl,Regina OBE)
4420,ADDRESS_STANDIZER扩展(Regina OBE)不存在更新路径
发布日期:2019/07/01
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6
4414,将版本号包含在地址标准化程序库(Raúl Marín)中
4352,为PG12+使用CREATE或REPLACE Aggregate(Raúl Marín)
4334,修复与重命名参数相关的升级问题(Raúl Marín)
4388,AddRasterConstraints:生成约束时忽略空值(Raúl Marín)
4327,避免忽略getenv的结果(Raúl Marín)
4406,解码Geohash时抛出无效字符(Raúl Marín)
4429,使用PROJ6避免资源泄漏(Raúl Marín)
4372,PROJ6:速度提升(Raúl Marín)
3437,使用点加速ST_Intersects(Raúl Marín)
4438,更新序列化以支持扩展标志区域(Paul Ramsey)
4443,Fix wagyu配置丢弃CPPFLAGS(Raúl Marín)
4440,FDW中的类型查找失败(Paul Ramsey)
4442,raster2pgsql现在跳过NODATA平铺。如果您出于某种原因仍希望它们留在数据库中,请使用-k选项。(Darafei Praliaskouski)
4441,使主罚对多列索引友好,并更快地构建单列索引。(Darafei Praliaskouski)
发布日期:2019/06/02
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6
发布日期:2019/05/26
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.5-PostgreSQL 12 GEOS > =3.6
发布日期:2018/09/23
如果使用PostgreSQL+JIT进行编译,则需要LLVM >=6
此版本支持的PostgreSQL版本为:PostgreSQL 9.4-PostgreSQL 12(开发中)GEOS > =3.5
#1847,SPGIST 2D和3D对PG 11+的支持(来自布鲁克塞尔自由大学(UniversityéLibre de Bruxelle,Darafei Praliaskouski)的Esteban Zimányi和Arthur Lesuisse)
#4056,ST_FilterByM(尼克拉斯大道)
#4050,ST_Chaikin平滑(Nicklas Avén)
#3989,ST_BUFFER单面选项(Stephen Knox)
#3876,ST_Angel函数(Rémi Cura)
#3564,ST_LineInterpolatePoints(Dan Baston)
#3896,PostGIS_Expanses_Upgrade()(Regina OBE)
#3913,从未打包的扩展创建扩展时升级(Sandro Santilli)
#2256,_POSTGIS_INDEX_EXTEND(),表示从索引开始的范围(Paul Ramsey)
#3176,添加ST_OrientedEntaine(Dan Baston)
#4029,添加ST_Quantize坐标(Dan Baston)
#4063,ST_Scale的可选假原点(Paul Ramsey)
#4082,添加ST_BandFileSize和ST_BandFileTimestamp,扩展ST_BandMetadata(偶数Rouault)
#2597,添加ST_GrayScale(Bborie Park)
#4007,新增ST_SetBandPath(Bborie Park)
#4008,新增ST_SetBandIndex(Bborie Park)
来自多个旧版本的升级脚本现在都是指向单个升级脚本的符号链接(Sandro Santilli)
#3944,更新至EPSG寄存器V9.2(偶数Rouault)
#3927,ST_AsMVT的并行实现
#3925,在生成MVT之前使用贴图网格像元大小简化几何图形
#3899,BTree排序顺序现在定义在空几何图形和相同前缀几何图形的集合上(Darafei Praliaskouski)
#3864,点几何排序的性能改进(Darafei Praliaskouski)
#3900,GCC警告已修复,Make-j现在正在工作(Darafei Praliaskouski)-Topo Geo_addLinestring健壮性改进(Sandro Santilli)#1855,#1946,#3718,#3838
#3234,不接受空点作为拓扑节点(Sandro Santilli)
#1014,可散列几何,允许在CTE签名中直接使用(保罗·拉姆齐)
#3097,真的允许在ST_Split()中安装多个刀片(Paul Ramsey)
#3942,Geojson:不包含json-c的私有标头 > =0.13(比约恩·埃塞尔)
#3954,ST_GeometricMedian现在支持点权重(Darafei Praliaskouski)
#3965、#3971、#3977、#4071 ST_ClusterK重写:更好的初始化、更快的收敛、更快的K=2(Darafei Praliaskouski)
#3982,ST_AsEncodedPolyline支持LINESTRING空和多点空(Darafei Praliaskouski)
#3986,ST_AsText现在有第二个参数来限制小数位数(Marc Ducobu,Darafei Praliaskouski)
#4020,从box3d投射到几何体现在返回正确连接的多面体曲面(Matthias Bay)
#2508,ST_OffsetCurve现在可以处理集合(Darafei Praliaskouski)
#4006,ST_GeomFromGeoJSON支持json和jsonb作为输入(Paul Ramsey,Regina OBE)
#4038,ST_SubDivide现在为重复使用输入顶点的几何体分割选择枢轴。(Darafei Praliaskouski)
#4025、#4032修复了ST_ClosestPointOfApproach、ST_DistanceCPA和ST_CPAWiThin(Paul Ramsey、Darafei Praliaskouski)中的精度问题
#4076,减少在拓扑实施中使用GEOS(比约恩·哈特尔)
#4080,将外部栅格波段索引添加到ST_BandMetaData-将栅格提示部分添加到文档中,以了解有关栅格行为的信息(例如,Out-DB性能、最大打开文件数)
#4084:修复错误代码-关于BOX3D(Matthias Bay)正面/背面的注释
#4060、#4094,PostgreSQL JIT支持(Raúl Marín、Laurenz Albe)
#3960,ST_Centroid现在使用lwgeom_centroid(Darafei Praliaskouski)
#4027,删除lwgeom_geos中的重复代码(Darafei Praliaskouski,Daniel Baston)
#4115,修复了在并行计划(Raúl Marín)下创建具有错误属性值的MVT的错误。
#4120,ST_AsMVTGeom:使用平铺坐标(Raúl Marín)进行剪辑。
#4132,栅格上的ST_交集现在不会抛出TopologyException(Vinícius A.B.Schmidt,Darafei Praliaskouski)
#4177、#4180支持PostgreSQL 12开发分支(Laurenz Albe、Raúl Marín)
#4156,ST_Chaikin平滑:默认情况下也平滑多边形的起点/终点(Darafei Praliaskouski)
发布日期:2018/09/12
这是一个错误修复和性能改进版本。
#4031,传递给ST_CurveToLine(Sandro Santilli)的MaxError容差很大
#4058,修复大半径小圆弧线性化中的无限循环(Sandro Santilli)
#4071,ST_ClusterKMeans在Null/Empty上崩溃已修复(Darafei Praliaskouski)
#4079,确保ST_AsMVTGeom输出CW方向的多边形(Paul Ramsey)
#4070,对GEOS中断使用标准中断错误代码(Paul Ramsey)
#3980,延迟释放输入直到处理完成(Lucasvr)
#4090,PG 11支持(保罗·拉姆齐,劳尔·马林)
#4077,特定空几何图形情况的序列化失败(保罗·拉姆齐)
#3997,修复lwgeom_Medium中的错误并避免被零除(Raúl Marín)
#4093,qort回调(Yugr)结果不一致
#4081,某些情况下的地理数据()问题(保罗·拉姆齐)
#4105,Tarball的并行构建(Bas Couwenberg)
#4163,MVT:修复第一个几何体为空时的资源泄漏(Raúl Marín)
发布日期:2018/04/08
这是一个错误修复和性能改进版本。
#3055,[RASTER]ST_CLIP()在没有波段的栅格上使服务器崩溃(Regina OBE)
#3942,Geojson:不包含json-c >=0.13的私有头部(Björn Esser)
#3952,ST_Transform在并行模式下失败(Paul Ramsey)
#3978,修复从2.1或更早版本升级时的KNN(Sandro Santilli)
#4003,lwpoli_Construction_Circle:避免被零除(Raúl Marín Rodríguez)
#4004,构建btree索引时避免内存耗尽(Edmund Horner)
#4016,项目5.0.0支持(Raúl Marín Rodríguez)
#4017,lwgeom lexer内存损坏(Peter E)
#4020,从box3d投射到几何体现在返回正确连接的多面体曲面(Matthias Bay)
#4025,#4032关于时间上“几乎重叠”范围的错误答案(Paul Ramsey,Darafei Praliaskouski)
#4052,模式限定地理中的几个函数(Regina OBE)
#4055,ST_ClusterIntersecting丢弃SRID(Daniel Baston)
发布日期:2018/01/17
这是一个错误修复和性能改进版本。
#3713,支持恰好输出‘\’字符的编码
#3827,将配置默认设置为不进行中断测试,导致许多人的假阴性。(Regina OBE)在#3988中修订为符合标准(Greg Troxel)
#3930,32位平台上的最小边界圆问题
#3965,ST_ClusterK表示在初始化时会丢失一些集群(Darafei Praliaskouski)
#3956,Brin opClass对象未正确升级(Sandro Santilli)
#3982,ST_AsEncodedPolyline支持LINESTRING空和多点空(Darafei Praliaskouski)
#3975,ST_Transform在没有架构限定的情况下对SPATIAL_REF_SYS运行查询。导致了恢复问题。(保罗·拉姆齐)
上映日期:2017/11/15
这是一个错误修复和性能改进版本。
上映日期:2017/10/18
这是一个错误修复和性能改进版本。
#3864,修复BTREE运算符中的内存泄漏
#3869,使用“Gold”链接器修复版本
#3845,优雅地处理短尺问题
#3871,几何体CMP函数的性能调整
#3879,在某些弧形情况下被零除
#3878,标头中Signum的单一定义
#3880,TYPMOD_GET_SRID中的未定义行为
#3875,修复换班操作中的未定义行为
#3864,b树几何排序的性能改进
#3874,lw_Dist2d_pt_arc零除
#3882,具有负输入的Z字形中的未定义行为
#3891,POINTARRAY_TO_ENCODED_POLYINE中的未定义行为
#3895,格式错误的WKB输入引发错误
#3886,修复几何体细分中罕见的缺失长方体
#3907,为所有可能的Gbox字符串输出分配足够的空间(Raúl Marín Rodríguez)
发布日期:2017/09/30
#3822,让postgis_Full_Version()还显示并检查构建脚本时所依据的PostgreSQL版本(Sandro Santilli)
#2411,ST_Reverse中的曲线支持(Sandro Santilli)
#2951,ST_Centroid for Geology(丹尼·格特)
#3788,允许postgis_Restore.pl处理目录式(-fd)转储(Roger Crew)
#3772,方向不可知ST_CurveToLine输出(Sandro Santilli/KKGeo)
#2464,支持MaxError容错的ST_CurveToLine(Sandro Santilli/KKGeo)
#3599,通过ST_AsGeobuf支持Geobuf输出(比约恩·哈特尔)
#3661,通过ST_AsMVT(Björn Harrtell/CartoDB)支持Mapbox矢量瓷砖输出
#3689,添加方位检查和强制功能(Dan Baston)
#3753,2D和ND点的Gist点球速度改进(Darafei Praliaskouski,Andrey Borodin)
#3677,ST_FrechetDistance(杉山新一)
大多数聚合(栅格和几何)以及标记为平行安全的所有稳定/不可变(栅格和几何)
#2249,ST_MakeEmptyCoverage for RASTER(David Zwarg,Anoomieli)
#3709,允许ST_Project的签名距离(Darafei Praliaskouski)
#524,涵盖了对多边形、线上线、线上点的地理支持(丹尼·格特)
对文档的许多更正和几个翻译几乎完成。安德烈亚斯·斯柴尔德,他对核心文件提供了许多更正。邮政地理信息系统日语翻译团队率先完成翻译工作。
支持PostgreSQL 10
对PostgreSQL 11的初步支持
#3645,避免从shapefile加载逻辑删除的记录
#3747,将ZIP4和ADDRESS_ALPANNUMERIC作为属性添加到Norm_Addy Tiger_Geocoder类型。
#3748,ADDRESS_STANDIZER查找表更新,因此PAGIC_NORAMIZE_ADDRESS更好地标准化缩写
#3647,使用GEOSNode更好地处理ST_Node中的节点(WoutGeraedts)
#3684,更新到EPSG寄存器v9(偶数路由)
#3830,修复不兼容类型的初始化( >=9.6)ADDRESS_STANDIZER
#3662,通过将DEBUG发送到stderr使shp2pgsql在调试模式下工作
#3405,修复了lwgeom_to_point中的内存泄漏
#3832,支持shp2pgsql中的宽整数字段为int8
#3841,btree地理中对空几何图形的确定性排序支持
#3844, Make = operator a strict equality test, and < > to rough "spatial sorting"
#3855,ST_AsTWKB内存和速度提升
已放弃对PostgreSQL 9.2的支持。
#3810、GEOS 3.4.0或更高版本的最低编译要求
大多数聚集体现在被标记为平行安全,这意味着大多数AGG必须被删除/重新创建。如果您的视图使用了PostGIS AGG,则需要在升级前删除并在升级后重新创建
#3578,ST_NumInteriorRings(Polygon Empty)现在返回0而不是NULL
当ST_DumpPoints在C++中重新实现时,在PostGIS 2.1.0之后不再需要_ST_DumpPoints
B-Tree index operators < = > changed to provide better spatial locality on sorting and have expected behavior on GROUP BY. If you have btree index for geometry or geography, you need to REINDEX it, or review if it was created by accident and needs to be replaced with GiST index. If your code relies on old left-to-right box compare ordering, update it to use << >> operators.
发布日期:2017/07/01
这是一个错误修复和性能改进版本。
#3777,按异常分组,几何图形为空
#3711,将2.5D边添加到拓扑时出现方位角错误
#3726,dblatex的PDF手册为节目清单提供了花哨的引语(Mike Toews)
#3738,RASTER:在raster2pgsql中使用-s而不使用-Y转换栅格数据,而不是设置sRID
#3744,ST_SUBDIVE丢失倒置几何体的子部分(Darafei Praliaskouski Komzpa)
#3750,@and~运算符并不总是在几何和栅格函数中限定架构。导致恢复问题。(Axiom数据科学公司的Shane StClair)
#3682,pgsql2shp结果中布尔值的奇怪字段长度
#3701,避免pgsql2shp中的双引号问题
#3704,ST_AsX3D在空几何图形上崩溃
#3730,当ST_CLIP无法计算波段时,将ST_CLIP从错误更改为通知
发布日期:2017/01/31
这是一个错误修复和性能改进版本。
上映日期:2016/11/28
这是一个错误修复和性能改进版本。
#1973,st_conavehull()从gde返回有时为空的几何集合Fix
#3501,添加栅格约束最大范围超过大型表的数组大小限制
#3643,PostGIS不基于最新的OSX XCode
#3644,中断时死锁
#3650、标记ST_Extent、ST_3DExtent和ST_Mem*agg的功能为并行安全,因此它们可以并行化
#3652,收集时崩溃(MultiCurve())
#3656,修复从2.2或更低版本的聚合升级
#3659,使用错误的内存上下文创建扩展后定义的栅格GUC导致崩溃。(马内姆)
#3665,来自Julien Rouhaud(Dalibo)的Brin索引补丁中的索引损坏和内存泄漏
#3667,来自Hugo Mercier(奥斯兰迪亚)的地理ST_Segentize错误补丁
发布日期:2016/09/26
这是一个新的功能版本,有新的功能,改进的性能,所有相关的错误修复,从PostGIS2.2.3,和其他好东西。
#3466,从方框3D投射到几何体现在返回3D几何体(Dalibo的Julien Rouhaud)
#3396,ST_EstimatedExtent,抛出警告而不是错误(Regina OBE)
在postgis_Restore.pl(Christoph Motch-Tegeder)中添加对定制TOC的支持
在ST_PointN和ST_SetPoint(Rémi Cura)中添加对负索引的支持
添加地理ST_BUFFER的参数(Thomas Bonfort)
TopGeom_addElement、TopGeom_em Element(Sandro Santilli)
填充_拓扑_层(桑德罗·桑蒂利)
#454,ST_WRapX和lwgeom_wrapx(Sandro Santilli)
#1758,ST_Normize(Sandro Santilli)
#2236,shp2pgsql-d现在发出“DROP TABLE IF EXISTS”
#2259,ST_VoronoiPolygons和ST_VoronoiLines(Dan Baston)
#2841和#2996,使用Welzl算法(Dan Baston)的新的ST_MinimumBordingRadius和新的ST_MinimumBordingCircle实现(Dan Baston)
#2991,启用ST_Transform以使用PROJ.4文本(Mike Toews)
#3059,允许在ST_Expand(Dan Baston)中传递每个维度的参数
#3339,ST_GeneratePoints(Paul Ramsey)
#3362,ST_ClusterDBSCAN(Dan Baston)
#3364,ST_GeometricMedian(Dan Baston)
#3391,在ST_EstimatedExtent(Alessandro Pasotti)中增加表继承支持
#3424,ST_MinimumClearance(Dan Baston)
#3428,ST_Points(Dan Baston)
#3465,ST_ClusterKMeans(保罗·拉姆齐)
#3469,ST_MakeLine With MULTIPOINT(保罗·诺曼)
#3549,尽量支持PgSQL 9.6并行查询模式(Paul Ramsey,Regina OBE)
#3557,基于查询统计数据的几何函数成本(Paul Norman)
#3591,添加对Brin索引的支持。需要PostgreSQL 9.4以上版本。(第二象限的Giuseppe Broccolo,Dalibo的Julien Rouhaud和Ronan Dunklau)
#3496,使postgis不可重定位以安装扩展,函数中的架构限定调用(Regina OBE)应一次性解决扩展#3494、#3486、#3076
#3547,更新Tiger Geocode以支持Tiger 2016并同时支持http和ftp。
#3613,使用等长分段对地理进行分段(奥斯兰迪亚的雨果·梅西尔)
PostGIS 2.2.3中的所有相关错误修复
#2841,ST_最小边界圆不包括原始
#3604,pgCommon/Makefile.in订单CFLAGS错误导致错误的liblwgeom.h(Greg Troxel)
发布日期:2016/03/22
这是一个错误修复和性能改进版本。
#3463,修复面折叠边更改时的崩溃
#3422,提高标准精度双系统(arm64、ppc64el、s390c、PowerPC等)上的ST_Split健壮性
#3427,将space_ref_sys更新到EPSG 8.8版
#3433,ST_ClusterIntersecting对于多点不正确
#3435,ST_AsX3D修复凹面几何图形的渲染
#3436,ptarray_CLONE_Depth中的内存处理错误
#3437,多点的ST_Intersects不正确
#3461,当有内边界和没有外边界时,ST_GeomFromKML崩溃Postgres
#3429,在某些平台上升级到2.3或从2.1可能会导致循环/挂起
升级后出现#3460,ST_ClusterWithing‘Tear Not Defined’(未定义容差)错误
#3490,栅格数据还原问题,实例化视图。脚本postgis_proc_set_earch_path.sql,rtpostgis_proc_set_search_path.sql请参阅http://postgis.net/docs/manual-2.2/RT_FAQ.html#faq_raster_data_not_restore
#3426,有趣架构上的失败点空测试
发布日期:2016/01/06
这是一个错误修复和性能改进版本。
#2232,避免SVG舍入累积误差
#3321,修复拓扑加载中的性能回归
#3329,修复Topo_addPoint中的健壮性回归
#3349,修复postgis_topology脚本安装路径
#3351,在ST_RemoveIsoEdge(和LWT_RemIsoEdge)上设置端节点隔离
#3355,地理ST_Segentize具有几何边界框
#3359,修复拓扑几何定义中低id基元的丢失
#3360,_RASTER_CONSTRAINT_INFO_SCALE无效输入语法
#3375,重复移除采集点时崩溃(点)
#3378,修复了在存在多个拓扑的情况下层次拓扑几何的处理
#3380、#3402,在拓扑负载上抽取线路
#3388、#3410,修复ST_RemovePoints中缺少的端点
#3389,lwgeom_to_Geojson中的缓冲区溢出
#3390,编译postgis和postgis_topology扩展时,在阿尔卑斯Linux 3.2下编译时出现错误
#3393,ST_AREA NAN用于某些面
#3401,提高32位系统上的ST_Split健壮性
#3404,ST_ClusterWiThin后端崩溃
#3407,修复拆分面或边定义多个拓扑几何对象时发生的崩溃
#3411,不使用空间索引的集群函数
#3412,提高Topo Geo_addLinestring中捕捉步骤的健壮性
#3415,修复pkgsrc下的OSX 10.9版本
修复LWT_ChangeEdgeGeom[liblwgeom]中的内存泄漏
上映日期:2015/10/07
这是一个新的功能版本,具有新的功能、改进的性能和其他好处。
Liblwgeom中的拓扑API(Sandro Santilli/Regione Toscana-Sita)
Liblwgeom中新的lwgeom_unaryUnion方法
Liblwgeom中新的lwgeom_linEmerge方法
Liblwgeom中新的lwgeom_is_Simple方法
#3169 ,添加SFCGAL 1.1支持:添加ST_3DDifference、ST_3DUnion、ST_Volume、ST_MakeSolid、ST_IsSolid(文森特·莫拉/奥斯兰迪亚)
#3169 ,ST_ApposateMeial Axis(Sandro Santilli)
ST_CPAWiThin(桑德罗·桑蒂利/无边界)
添加|=|运算符,支持CPA语义和PgSQL 9.5+的KNN(Sandro Santilli/无边界)
#3131 ,KNN对地理类型的支持(Paul Ramsey/CartoDB)
#3023 ,ST_ClusterIntersecting/ST_ClusterWiThin(Dan Baston)
#2703 ,所有几何体类型的精确KNN结果,也称为“KNN重新检查”(Paul Ramsey/CartoDB)
#1137 ,允许ST_RemoveRepeatedPoints中的容差值(Paul Ramsey/CartoDB)
#3062 ,允许将M因子传递给ST_Scale(Sandro Santilli/无边界)
#3139 ,ST_BORKING对角线(桑德罗·桑蒂利/无边界)
#3129 ,ST_IsValidTrajecary(Sandro Santilli/无边界)
#3128 ,ST_ClosestPointOfApproach(Sandro Santilli/无边界)
#3152 ,ST_DistanceCPA(桑德罗·桑蒂利/无边界)
索引键类型的规范输出
ST_SWAPCOMPANATES(桑德罗·桑蒂利/无边界)
#2918 ,使用测地学的Gegraph Lib函数(Mike Toews)
#3074 ,ST_SUBDIVE以分解大型几何体(Paul Ramsey/CartoDB)
#3040 ,基于KNN主旨指数的质心( < < - > > )n-D距离运算符(Sandro Santilli/无界)
Liblwgeom中断性接口(Sandro Santilli/CartoDB)
#2939 ,ST_ClipByBox2D(Sandro Santilli/CartoDB)
#2247 、ST_retile和ST_CreateSurvey:创建数据库中的栅格总览(Sandro Santilli/Vizzuality)
#899 ,-m shp2pgsql属性名称映射-m开关(Regina OBE/Sandro Santilli)
#1678 ,添加了GUC postgis.gdal_datapath以指定GDAL配置变量GDAL_DATA
#2843 ,支持栅格导入的重新投影(Sandro Santilli/Vizzuality)
#2349 ,支持Encode_Polyline输入/输出(Kashif Rasul)
#2159 ,从postgis_Full_Version()报告libjson版本
#2770 ,ST_MemSize(栅格)
添加postgis_noop(栅格)
添加了缺少的ST_TPI()、ST_tri()和ST_Rough()变体
添加了GUC postgis.gdal_ENABLED_DRIVERS以指定GDAL配置变量GDAL_SKIP
添加了GUC postgis.able_outdb_raster以启用对具有数据库外波段的栅格的访问
#2387 ,ADDRESS_STANDIZER EXTENSION作为PostGIS的一部分(Stephen Woodbridge/imaptools.com、Walter Sclair、Regina OBE)
#2816 ,ADDRESS_STANDUIZER_DATA_US扩展提供了ADDRESS_STANDIZER的参考Lex、GAZ和规则(Stephen Woodbridge/imaptools.com、Walter Sclair、Regina OBE)
#2341 ,ST_MapAlgebra的新掩码参数
#2397 ,在shapefile加载器中自动读取编码信息
#2430 ,ST_ForceCurve
#2565 、ST_SummaryStatsAgg()
#2567 、ST_CountAgg()
#2632 ,ST_AsGML()支持曲线要素
#2652 ,将--升级路径开关添加到run_test.pl
#2754 ,sfcga包装为扩展名
#2227 ,Visvalingam-Whyatt算法简化ST_SimplifyVW,ST_SetEffectiveArea(Nicklas Avén)
编码和解码TWKB ST_AsTWKB、ST_GeomFromTWKB(Paul Ramsey/Nicklas Avén/CartoDB)的函数
#3223 ,将MemcMP短路添加到ST_EQUALS(Daniel Baston)
#3227 ,Tiger Geocode升级为支持Tiger 2015人口普查
#2278 ,使liblwgeom在次要版本之间兼容
#897 ,ST_AsX3D支持地理坐标和系统“GD”“WE”翻转x/y轴的能力(使用选项=2,3)
ST_Split:允许按多线、多点和(多)面边界拆分线
#3070 ,简化几何图形类型约束
#2839 ,实现了函数索引的选择性估计器,加快了对栅格表的空间查询。(Sandro Santilli/Vizzuality)
#2361 ,向RASTER_COLUMNS视图添加了SPATIAL_INDEX列
#2390 ,pgsql2shp的测试套件
#2527 ,向raster2pgsql添加了-k标志以跳过检查波段是否为NODATA
#2616 ,减少拓扑构建和导出过程中的文本投射
#2717 ,支持复合曲线的起点、终点、点数、点数
#2747 ,添加对GDAL 2.0的支持
#2754 ,SFCGAL现在可以使用CREATE扩展名(Vincent Mora@Oslandia)安装
#2828 ,将ST_Entaine(栅格)从SQL转换为C
#2829 ,如果几何完全包含栅格且未指定NODATA,则为快捷方式ST_CLIP(栅格
#2906 ,更新Tiger地理编码器以处理Tiger 2014数据
#3048 ,加快几何简化(J.Santana@CartoDB)
#3092 ,具有多个表的GEOMETRY_COLUMNS的性能较慢
上映日期:2015-07-07
这是一个关键的错误修复版本。
发布日期:2015-03-30
这是一个关键的错误修复版本。
上映日期:2015-03-20
这是一个错误修复和性能改进版本。
#2941,允许SRID不是4326的地理列
#3069,小物件在箱子里不适当地起毛了
#3068,让postgis_tymod_dims为不受约束的dims返回NULL
#3061、JSON、GML、GML ST_GeomFrom*函数中允许重复点
#3058,修复ND-Gist拾取拆分方法以在最佳平面上拆分
#3052,Make运算符 < - > 和 < # > 适用于PostgreSQL < 9.1
#3045,修复中的维度混淆 & & & 操作员
#3016,允许注销损坏的拓扑层
#3015,避免Topology中的异常汇总
#3020,ST_AddBand out-db错误,其中高度使用宽度值
#3031,允许恢复转储为空的几何(点)表
上映日期:2014-09-10
这是一个错误修复和性能改进版本。
#2745 ,加速针对点的ST_SIMPLIZE调用
#2747 ,支持GDAL 2.0
#2749 ,使rtpostgis_upgrade_20_21.sql酸
#2811 ,在加载shapefile/栅格时不要指定索引名称
#2829 ,如果几何完全包含栅格且未指定NODATA,则为快捷方式ST_CLIP(栅格
#2895 ,将ST_ConvexHull(栅格)的成本提高到300以获得更好的查询方案
#2605 ,Armel:_ST_Covers()为孔中的点返回TRUE
#2911 ,修复比例为1/-1和偏移为0/0的栅格的ST_RESALE/ST_RESAMPLE/ST_RESIZE上的输出比例。
修复ST_UNION(栅格)中的故障
#2704 ,ST_GeomFromGML()不能与gml:pos(Even Roualt)数组一起正常工作
#2708 如果未指定架构,则更新几何图形不会更新sRID检查。马克·詹森的补丁
#2720 ,lwpolAdd_ring应在重新锁定后更新最大环
#2759 ,修复了postgis_Restore.pl对嵌入SQL注释的多行对象注释的处理
#2774 ,修复ptarray_Calculate_Gbox_Geodetic中的未定义行为
修复ST_MakeValid中的潜在内存故障
#2784 ,修复了对--with-sfcga伪参数的处理
#2772 ,raster_getBandPath(ST_BandPath)中的提前内存释放
#2755 ,修复针对所有版本的SFCGAL的回归测试
#2775 ,lwline_from_lwmpoint泄漏内存
#2802 ,ST_MapAlgebra检查有效的回调函数返回值
#2803 ,ST_MapAlgebra不处理任何用户参数和严格的回调函数
#2834 、ST_ESTIMATED_EXTEND和MIXEDCASE表名(回归错误)
#2845 ,从ST_AddPoint创建的错误几何
#2870 ,BINARY INSERT INSERT到GEOGORY列结果插入几何
#2872 ,制作安装版本文档(Greg Troxell)
#2819 ,在Centos5/Solaris上查找isfined或替换
#2899 ,地理编码限制%1未返回最佳答案(Tiger地理编码器)
#2903 ,无法在FreeBSD上编译
#2927 REVERSE_Geocode未填充方向前缀(Tiger Geocoder)删除已弃用的ST_Line_Locate_Point
上映日期:2014/05/13
这是一个错误修复和安全版本。
从该版本开始,默认情况下禁用脱机栅格访问和使用GDAL驱动程序。
引入了一个环境变量来启用特定的GDAL驱动程序:POSTGIS_GDAL_ENABLED_DRIVERS。默认情况下,所有GDAL驱动程序都处于禁用状态
引入环境变量以允许启用数据库外栅格波段:POSTGIS_ENABLE_OUTDB_RASTERS。默认情况下,禁用Out-db栅格波段
必须为PostgreSQL进程设置环境变量,并决定整个集群的行为。
发布日期:2014/03/31
这是一个错误修复版本,解决了自2.1.1版本以来一直存在的问题。
#2666 ,如果找不到任何SQL预处理器,则在配置时出错
#2534 ,st_Distance为大型地理区域返回不正确的结果
#2539 ,在json/json.h之前检查json-c/json.h的存在/可用性
#2543 ,来自简单查询的无效连接选择性错误
#2546 ,带有字符串坐标的GeoJSON解析不正确
#2547 ,修复分层拓扑学的ST_SIMPLIZE(拓扑几何)
#2552 ,修复ST_AsPNG、ST_AsTIFF和ST_AsJPEG中的空栅格处理
#2555 ,修复了ST_Reclass的范围参数的解析问题
#2556 ,地理ST_Intersects结果取决于插入顺序
#2580 ,不允许在同一数据库中安装两次postgis。
#2589 ,删除不必要的空指针的使用
#2607 ,不能在一个进程中打开超过1024个out-db文件
#2610 ,确保人脸分割算法使用边缘索引
#2615 ,EstimatedExtent(因此,基础统计信息)收集了错误的BBox
#2619 ,GeoJSON面中的空环数组导致崩溃
#2634 ,球体距离编码中的回归
#2638 ,M个几何上的地理距离有时是错误的
#2648 , #2653 ,修复了当“topology”不在搜索路径中时的拓扑功能
#2654 ,从拓扑中丢弃不推荐使用的呼叫
#2655 ,让没有拓扑权限的用户调用postgis_Full_Version()
#2674 ,修复栅格上缺少运算符=和hash_raster_ops opclass的问题
发布日期:2013/11/06
这是一个错误修复版本,解决了自2.1.0版本以来一直存在的问题。
#2514 ,将栅格许可从GPL v3+更改为v2+,允许将PostGIS扩展作为GPLv2进行分发。
#2396 ,使回归测试更加不受字符顺序限制
#2434 ,修复极少数情况下的ST_交集(geog,geog)回归
#2454 ,修复ST_PixelAsXXX函数关于EXCLUDE_NODATA_VALUE参数的行为
#2489 ,修复了从2.0升级后留下的过时函数签名
#2525 ,修复嵌套集合中SRID的处理
#2449 ,修复索引构建中的潜在无限循环
#2493 ,修复传递空栅格时ST_DumpValues的行为
#2502 ,修复postgis_topology_脚本_Installed()安装方案
#2504 ,修复虚假pgsql2shp调用上的段错误
#2512 ,在RASTER_COLUMNS和RASTER_OVERVIEWS中支持外部表和实例化视图
发布日期:2013/08/17
这是一个次要版本,解决了错误修复以及自2.0.3版本以来解决问题的性能和功能增强。如果您要从2.0+升级,则只需要软升级。如果您要从1.5或更早版本升级,则需要进行硬升级。
#1653 ,从ST_ResSample(栅格)中删除了sRID参数,并且带有参考栅格的变体不再应用参考栅格的SRID。
#1962 ST_Segentize-由于引入了地理支持,结构: SELECT ST_Segentize(‘LINESTRING(1 2,3 4)’,0.5);
将导致二义性函数错误
#2026 ,ST_UNION(栅格)现在合并所有栅格的所有波段
#2089 ,liblwgeom:lwgeom_set_handters取代了lwgeom_init_allocator。
#2150 ,Regular_BLOCKING不再是一种约束。现在,RASTER_COLUMNS中的同名列将检查是否存在SPISALLY_UNIQUE和COVERAGE_TILE约束
ST_Intersects(栅格、几何图形)的行为方式与ST_Intersects(几何图形、栅格)相同。
ST_SetValue(栅格)的点变量以前不检查输入几何图形和栅格的SRID。
ST_Hillshade参数的方位角和高度现在以度为单位,而不是弧度。
ST_Slope和ST_Aspect以度为单位返回像素值,而不是以弧度为单位。
#2104 ST_World2RasterCoord、ST_World2RasterCoordX和ST_World2RasterCoordY重命名为ST_WorldToRasterCoord、ST_WorldToRasterCoordX和ST_WorldToRasterCoordY。ST_Raster2WorldCoord、ST_Raster2WorldCoordX和ST_Raster2WorldCoordY重命名为ST_RasterToWorldCoord、ST_RasterToWorldCoordX和ST_RasterToWorldCoordY
ST_Estimated_Extent已重命名为ST_EstimatedExtent
ST_Line_Interpolate_Point重命名为ST_LineInterpolatePoint
ST_Line_子字符串已重命名为ST_LineSubstring
ST_Line_Locate_Point重命名为ST_LineLocatePoint
ST_Force_XXX重命名为ST_ForceXXX
ST_MapAlgebraFctNgb和ST_MapAlgebraFct的1和2栅格变体。改用ST_MapAlgebra
ST_MapAlgebraExpr的1和2个栅格变体。改用ST_MapAlgebra的表达式变体
-有关新功能的完整列表,请参阅http://postgis.net/docs/manual-2.1/PostGIS_Special_Functions_Index.html#NewFunctions_2_1
#310 ,ST_DumpPoints转换为C函数(Nathan Wagner),速度更快
#739 ,UpdateRasterSRID()
#945 、改进的连接选择性、N-D选择性计算、用户可访问的选择性和用于测试的统计读取器功能(Paul Ramsey/OpenGeo)
带有拓扑几何体的ToTopGeom(Sandro Santilli/Vizzuality)
ClearTopoGeom(Sandro Santilli/Vizzuality)
ST_Segentize(地理)(Paul Ramsey/OpenGeo)
ST_Delaunay三角形(Sandro Santilli/Vizzuality)
ST_NearestValue,ST_Neighborhood(Bborie Park/加州大学戴维斯分校)
ST_PixelAsPoint,ST_PixelAsPoints(Bborie Park/UC Davis)
ST_PixelAsCentroid,ST_PixelAsCentroid(Bborie Park/UC Davis)
ST_Raster2WorldCoord,ST_World2RasterCoord(Bborie Park/UC Davis)
其他栅格/栅格空间关系函数(ST_CONTAINS、ST_ContainsProperly、ST_Coverers、ST_CoveredBy、ST_Disjotic、ST_Overlaps、ST_Touches、ST_Withing、ST_DWiThin、ST_DFullyWiThin)(Bborie Park/UC Davis)
添加了ST_SetValues()的数组变体,以在一次调用中设置一个波段的多个像素值(Bborie Park/UC Davis)
#1293 ,ST_RESIZE(栅格)以根据宽度/高度调整栅格大小
#1627 ,将Tiger_Geocoder打包为PostgreSQL扩展
#1643 , #2076 ,升级Tiger地理编码器以支持加载由Hunter Systems Group资助的Tiger 2011和2012(Regina OBE/Paragon Corporation)
对ST_MakeValid的地理测量收集支持(Sandro Santilli/Vizzuality)
#1709 ,ST_NotSameAlignmentReason(栅格,栅格)
#1818 ,ST_GeomFromGeoHash and Friends(Jason Smith(暗熊猫))
#1856 ,首选编号公路名称的反向地理编码器评级设置
ST_PixelOfValue(Bborie Park/UC Davis)
向/从PostgreSQL地理类型(点/路径/多边形)进行转换。
添加了ST_SetValues()的geomval数组变量,以在一次调用中使用一组几何图形和相应的值设置波段的多个像素值(Bborie Park/UC Davis)
ST_Tile(栅格)将栅格分解为平铺(Bborie Park/UC Davis)
#1895 ,新的r-树节点分裂算法(Alex Korotkov)
#2011 ,ST_DumpValues将栅格输出为数组(Bborie Park/UC Davis)
#2018 ,ST_Distance支持CircularString、CurvePolygon、MultiCurve、MultiSurface、CompoundCurve
#2030 ,n栅格(和n波段)ST_MapAlgebra(Bborie Park/UC Davis)
#2193 ,使用PAGC解析器作为老虎规格化器的替代(Steve Woodbridge,Regina OBE)
#2210 ,ST_MinConvexHull(栅格)
Liblwgeom中的lwgeom_from_Geojson(Sandro Santilli/Vizzuality)
#1687 ,ST_SIMPLIZY FOR TOPO几何体(Sandro Santilli/Vizzuality)
#2228 ,Topo几何图形的Topo JSON输出(Sandro Santilli/Vizzuality)
#2123 ,ST_FromGDALRaster
#613 ,ST_SetGeoReference使用数值参数而不是文本
#2276 ,ST_AddBand(栅格)变体,用于数据库外波段
#2280 ,ST_摘要(栅格)
#2163 ,ST_TPI用于栅格(纳撒尼尔·克莱)
#2164 ,ST_tri表示栅格(纳撒尼尔·克莱)
#2302 ,栅格的ST_粗糙度(纳撒尼尔·克莱)
#2290 ,ST_ColorMap(栅格)以生成RGBA波段
#2254 ,添加SFCGAL后端支持。(通过Postgis.Backend var进行后端选择)通过GEOS或SFCGAL提供的功能:ST_Intersects、ST_3DIntersects、ST_Intersects、ST_Area、ST_Distance、ST_3DDistance仅在SFCGAL后端提供的新功能:ST_3DIntersects、ST_Tesselate、ST_3DArea、ST_Extrude、ST_ForceLHR ST_Orientation、ST_Minkowski、ST_StraightSkeleon postgis_sfcals_Version PostGIS中提供的新功能:ST_ForceSFS(Olivier Courtin和Hugo Mercier/Oslandia)
有关新增功能和功能改进的详细信息,请参阅 Section 15.12.9, “PostGIS Functions new or enhanced in 2.1” 。
更快的栅格ST_UNION、ST_CLIP和更多函数添加操作
对于几何/地理,更好的规划器选择性和更多的功能。
#823 ,Tiger地理编码器:减少对LOADER_GENERATE_SCRIPT下载部分的贪婪
#826 ,raster2pgsql不再默认为填充平铺。FLAG-P可用于填充瓷砖
#1363 ,ST_AddBand(栅格,...)用C重写的数组版本
#1364 ,ST_UNION(栅格,...)用C++重写的聚合函数
#1655 ,ST_Slope参数的其他缺省值
#1661 ,添加ST_SameAlign的聚合变量
#1719 ,添加对Point和GeometryCollection ST_MakeValid输入的支持
#1780 ,支持地理上的ST_GeoHash
#1796 ,地理距离计算的性能大幅提升
#1802 ,改进了功能中断性。
#1823 ,在ST_AsGML中添加参数以将id列用于GML 3输出(从GML 3.2.1起成为必填项)
#1856 ,Tiger地理编码器:首选编号公路名称的反向地理编码器评级设置
#1938 ,重构基本ST_AddBand,在一次调用中添加多个新频段
#1978 ,计算闭合圆弧(圆)的长度时回答错误
#1989 ,将输入几何处理为仅与要裁剪的栅格相交
#2021 ,向ST_UNION(栅格,...)添加了多波段支持聚合函数
#2006 ,更好地支持极点和日期线上的ST_Area(地理)
#2065 ,ST_Clip(栅格,...)现在是一个C函数
#2069 ,将参数添加到ST_Tile(栅格)以控制切片的填充
#2078 ,ST_Slope、ST_Aspect和ST_HillShade的新变体提供了在Coverage中处理切片的解决方案
#2097 ,为ST_UNION(栅格)添加了范围统一类型选项
#2105 ,添加了用于将输出与参考栅格对齐的ST_Transform(栅格)变量
#2119 、传递给ST_ResSample()、ST_Resample()、ST_Reskew()和ST_SnapToGrid()的栅格不再需要SRID
#2141 ,当约束无法添加到栅格列时,输出更加冗长
#2143 ,更改了栅格的块大小约束以允许多个值
#2148 ,为栅格添加了Coverage_Tile约束
#2149 ,为栅格添加了SPACE_UNIQUE约束
Topology摘要输出现在包括未注册的层以及从其自然层中丢失的Topo Geometry对象的计数。
ST_HillShade()、ST_Aspect()和ST_Slope()有一个新的可选参数,用于在运行操作之前对NODATA像素进行内插。
ST_SetValue(栅格)的点变量现在是ST_SetValues(Rast)的geomval变量的包装。
在核心API和加载器中正确支持栅格波段的isnodata标志。
ST_Aspect和ST_HillShade参数的其他缺省值
#2178 ,ST_摘要现在使用[S]标志通告已知SR_ID的存在
#2202 ,将libjson-c设置为可选(--不带-json配置开关)
#2213 ,添加支持libjson-c 0.10+
#2231 ,raster2pgsql支持使用-n对文件名列进行用户命名
#2200 ,ST_UNION(栅格,uniontype)合并所有栅格的所有波段
#2264 ,postgis_Restore.pl支持在自定义模式中使用postgis恢复到数据库
#2244 ,如果栅格具有超出数据库的波段,则在更改栅格的地理配准时发出警告
#2222 ,添加参数OutAsIn以标记ST_AsBinary是否应将Out-db波段作为In-db波段返回
#1839 ,在raster2pgsql中处理GeoTIFF中的子数据集。
#1840 ,修复了何时计算raster2pgsql中的瓦片数量的逻辑。
#1870 ,将文档与栅格的ST_Intersects的实际行为对齐
#1872 ,修复ST_ApproxSummarystats以防止被零除
#1875 ,ST_SummaryStats在count为零时为除count以外的所有参数返回NULL
#1932 ,修复索引表空间的语法的raster2pgsql
#1936 ,CurvePolygon上的ST_GeomFromGML导致服务器崩溃
#1939 ,删除自定义数据类型:摘要统计信息、直方图、分位数、值计数
#1951 ,删除零长度行字符串上的崩溃
#1957 ,ST_Distance到单点线串返回NULL
#1976 ,地理点环码经过全面检查,可靠性更高
#1981 ,清理导致GCC 4.6+警告的未使用变量
#1996 ,支持点在GeoJSON输出中为空
#2062 ,提高距离计算的性能
#2057 ,修复了raster2psql到libpq的链接问题
#2077 ,修复了从ST_Hillshade()返回的错误值
#2019 ,ST_FlipOrganates不更新BBox
#2100 ,ST_AsRaster可能不会返回指定像素类型的栅格
#2126 ,更好地处理ST_ConvexHull()中的空栅格
#2165 ,ST_NumPoints使用CircularString进行回归失败
#2168 ,ST_Distance并不总是可交换的
#2182 ,修复了没有SRID和ST_RESIZE的outdb栅格的问题
#2188 ,修复了从GDAL数据集中复制数据时导致问题的函数参数值溢出
#2198 ,修复了在ST_Tile()中生成数据库外栅格的波段时使用的错误尺寸
#2201 ,ST_GeoHash边界错误
#2203 ,更改了将具有未知SRID和默认地理变换的栅格传递到GDAL Warp API时的处理方式
#2215 ,修复了隐式索引名称冲突的栅格排除约束
#2251 ,修复了使用默认地理变换矩阵重新缩放栅格时的错误维度
#2133 ,修复ST_MapAlgebra表达式变量中的性能回归
#2257 ,Gbox变量在使用空几何进行测试时未初始化
#2271 ,防止平行制作栅格
#2282 ,修复调试模式下对未定义函数nd_stats_to_grid()的调用
#2307 ,ST_MakeValid输出的几何无效
#2309 ,在尝试获取SRS信息时删除令人困惑的信息消息
#2336 ,FIPS 20(KS)导致通配符扩展wget所有文件
#2348 ,提供从2.0到2.1的栅格升级路径
#2351 ,地理位置之间的距离错误
#2359 ,修复了添加概览约束时对架构名称的处理
#2371 ,支持1位以上微码的GEOS版本
#2383 ,从栅格警告消息中删除\‘的不安全使用
#2384 ,ST_Neighborhood的变量数据类型不正确
#2111 、栅格波段只能引用Out-db栅格的前256个波段
发布日期:2014/03/31
这是一个错误修复版本,解决了自2.0.4版本以来一直存在的问题。如果您使用的是PostGIS 2.0+,则需要进行软升级。对于PostGIS 1.5或更低版本的用户,需要进行硬升级。
#2494 ,避免GIST索引中的MemcPy
#2502 ,修复postgis_topology_脚本_Installed()安装方案
#2504 ,修复虚假pgsql2shp调用上的段错误
#2528 ,修复ST_Split/lwline_Split_by_line中的内存泄漏
#2532 ,添加缺少的栅格/几何交换符
#2533 ,删除重复的签名
#2552 ,修复ST_AsPNG、ST_AsTIFF和ST_AsJPEG中的空栅格处理
#2555 ,修复了ST_Reclass的范围参数的解析问题
#2589 ,删除不必要的空指针的使用
#2607 ,无法打开超过1024个正在处理的out-db文件
#2610 ,确保人脸分割算法使用边缘索引
#2619 ,GeoJSON多边形中的空环形数组导致崩溃
#2638 ,M个几何上的地理距离有时是错误的
# #2514 ,将栅格许可从GPL v3+更改为v2+,允许将PostGIS扩展作为GPLv2进行分发。
发布日期:2013/09/06
这是一个错误修复版本,解决了自2.0.3版本以来一直存在的问题。如果您使用的是PostGIS 2.0+,则需要进行软升级。对于PostGIS 1.5或更低版本的用户,需要进行硬升级。
#2110 ,空和原点上的点之间的相等运算符
允许使用Topo Geo_addPoint以精确距离添加点
#1968 ,修复toTopGeom返回中缺少的边
#2165 ,ST_NumPoints使用CircularString进行回归失败
#2168 ,ST_Distance并不总是可交换的
#2186 ,gui进度条更新太频繁
#2201 ,ST_GeoHash边界错误
#2257 ,Gbox变量在使用空几何进行测试时未初始化
#2271 ,防止平行制作栅格
#2267 ,分析表中的服务器崩溃
#2277 ,潜在的分段故障已删除
#2307 ,ST_MakeValid输出的几何无效
#2351 ,地理位置之间的距离错误
#2359 ,不正确地处理概述约束的架构
#2371 ,支持1位以上微码的GEOS版本
#2372 ,无法解析空格填充的KML坐标
修复安装了系统范围的liblwgeom的版本
#2383 ,修复警告消息中\‘的不安全使用
#2410 ,确定共线曲线的分段
#2412 ,ST_LineToCurve支持折点少于4的线
#2415 ,ST_MULTI支持组合曲线和曲线多点
#2420 ,ST_LineToCurve:至少需要8条边才能定义完整的圆
#2423 ,ST_LineToCurve:要求所有弧边形成相同的角度
#2424 ,ST_CurveToLine:在MULTICURVE中添加对COMPOUNDCURVE的支持
#2427 ,确保保留ST_CurveToLine上的曲线的第一个点
#2269 ,避免在分析时无用地去除完整几何图形
#2111 、栅格波段只能引用Out-db栅格的前256个波段
发布日期:2013/03/01
这是一个错误修复版本,解决了自2.0.2版本以来一直存在的问题。如果您使用的是PostGIS 2.0+,则需要进行软升级。对于PostGIS 1.5或更低版本的用户,需要进行硬升级。
#2126 ,更好地处理ST_ConvexHull()中的空栅格
#2134 ,确保在将SRS传递给GDAL函数之前对其进行处理
修复liblwgeom中的各种内存泄漏
#2173 ,修复了拆分具有自己的顶点的直线时也会影响拓扑构建的稳健性问题( #2172 )
#2174 ,修复错误函数lwpoly_free()的用法
#2176 ,修复ST_ChangeEdgeGeom的健壮性问题
#2184 ,正确复制具有Z值的拓扑
Postgis_Restore.pl支持转储中的混合大小写几何列名
#2188 ,修复了从GDAL数据集中复制数据时导致问题的函数参数值溢出
#2216 ,在多面GeoJSON解析中出现更多内存错误(带洞)
修复GeoJSON解析器中的内存泄漏
发布日期:2012/12/03
这是一个错误修复版本,解决了自2.0.1版本以来一直存在的问题。
#1287 ,在这些情况下,丢弃“gist_geometryops”中断了几个客户机包Legacy_gist.sql
#1391 ,从1.5升级期间出错
#1828 ,对ST_D的选择性估计较差
#1838 ,导入老虎/行数据时出错
#1869 ,ST_AsBinary不是唯一添加到Legacy_Minor/Legacy.sql脚本的
#1885 ,TERGER2010中的选项卡块表中缺少字段
#1891 ,在构建liblwgeom时使用LDFLAGS环境
#1900 ,为大端系统修复pgsql2shp
#1932 ,修复了设置索引表空间的无效语法的raster2pgsql
#1936 ,CurvePolygon上的ST_GeomFromGML导致服务器崩溃
#1955 、ST_ModEdgeHeal和ST_NewEdgeHeal用于双连通边
#1957 ,ST_Distance到单点线串返回NULL
#1976 ,地理点环码经过全面检查,可靠性更高
#1978 ,计算闭合圆弧(圆)长度的错误答案
#1981 ,删除未使用但设置的变量,如GCC 4.6+所示
#1987 ,恢复ST_SIMPLIZE的1.5.x行为
#1989 ,将输入几何处理为仅与要裁剪的栅格相交
#1991 ,在PostgreSQL 9.2上进行地理编码非常慢
#1996 ,支持点在GeoJSON输出中为空
#1998, Fix ST_{Mod,New}EdgeHeal joining edges sharing both endpoints
#2001 如果几何实际上不包含弧,则ST_CurveToLine不起作用
#2015 ,ST_IsEmpty(‘Polygon(Empty)’)返回FALSE
#2019 ,ST_FlipOrganates不更新BBox
#2025 ,修复Topo Geo_AddLineString处的侧位置冲突
#2026 ,提高距离计算的性能
#2033 ,修复将拆分点添加到2.5D拓扑中
#2051 ,修复ST_AsGeoJSON输出中的超出精度
#2052 ,修复lwgeom_to_Geojson中的缓冲区溢出
#2056 ,修复了ST_SetValue()中缺少栅格和几何的SRID检查的问题
#2057 ,修复了raster2psql到libpq的链接问题
#2060 ,修复GetTopoGeomElement数组的“Dimension”检查违规
#2072 ,删除了阻止ST_Intersects(栅格)处理数据库外波段的过时检查
#2077 ,修复了ST_Hillshade(栅格)中的错误答案
#2092 ,ST_GeomFromKML的命名空间问题,libxml 2.8+的ST_GeomFromGML
#2099 ,修复ST_OffsetCurve中异常的双重释放
#2100 ,ST_AsRaster()可能不会返回指定像素类型的栅格
#2108 ,确保ST_Line_Interpolate_Point始终返回点
#2109 ,确保ST_Centroid始终返回点
#2117 ,确保ST_PointOnSurface始终返回点
#2129 ,修复带有集合输入的ST_HORMINIZE输出中的SRID
#2130 ,修复多面GeoJson解析中的内存错误
更新Maven JAR的URL
发布日期:2012/06/22
这是一个错误修复版本,解决了自2.0.0版本以来一直存在的问题。
#1264 ,修复st_din(geog,geog,0)。
#1468 Shp2pgsql-gui表列模式被移位
#1694 ,用叮当声修缮建筑。(文斯)
#1708 ,改进PostGIS 2.0之前备份的恢复。
#1714 ,更强健地处理高拓扑容错。
#1755 ,ST_Gegraph_FromText支持更高的维度。
#1759 ,在启用了栅格的数据库中加载转换后的shapefile。
#1761 ,在raster2pgsql中处理NetCDF、HDF4和HDF5中的子数据集。
#1763 ,topology.toTopoGeom与自定义Search_PATH一起使用。
#1766 ,不要让ST_RemEdge*破坏外围拓扑几何对象。
#1774 ,在将边几何图形设置为无效边几何图形时出现更明显的错误。
#1775 、ST_ChangeEdgeGeom与2顶点目标的碰撞检测。
#1776 ,修复ST_SymDifference(Empty,geom)以返回geom。
#1779 ,安装SQL注释文件。
#1782 ,修复了栅格中的空间参考字符串处理。
#1789 ,修正了ValiateTopology中错误的边节点交叉报告。
#1790 ,修复为TopoGeom对重复基本体的处理。
#1791 ,使用非常接近但不同的点修复ST_Azimuth。
#1797 ,FIX(ValiateTopology(Xxx)).*语法调用。
#1805 ,将900913 SRID条目放回。
#1813 ,仅显示元数据表中的可读关系。
#1819 ,修复了ST_World2RasterCoord和ST_Raster2WorldCoord变量的浮点问题。
#1820 在9.2beta1上编译。
#1822 ,PostgreSQL 9.2beta1上的拓扑负载。
#1825 ,修复准备好的几何缓存查找
#1829 ,修复GeoJSON解析器中未初始化的读取
#1834 ,将Postgis扩展修改为仅备份用户指定的space_ref_sys
#1839 ,在raster2pgsql中处理GeoTIFF中的子数据集。
#1840 ,修复了何时计算raster2pgsql中的瓦片数量的逻辑。
#1851 ,修复EPSG的SPIAL_REF_SYSTEM参数:3844
#1857 ,修复在ST_AddEdge*Face*中检测到端点不匹配的故障
#1865 ,当数据行具有前导破折号时,postgis_Restore.pl中的数据丢失。
#1867 ,捕获传递给topogeo_add*的无效拓扑名
#1872 ,修复ST_ApproxSummarystats以防止被零除
#1873 ,修复ptarray_LOCATE_POINT以返回在线情况下的插补Z/M值
#1875 ,ST_SummaryStats在count为零时为除count以外的所有参数返回NULL
#1881 ,shp2pgsql-gui--编辑字段有时会触发删除行
#1883 ,地理编码器安装尝试运行CREATE_COUNTION_BASE_TABLES()失败(Brian Panulla)
发布日期:2012/04/03
这是一个重要的版本。需要进行硬升级。是的,这意味着完全转储、重新加载和一些特殊准备,如果您使用的是过时的函数。参考 Section 3.4.2, “硬升级” 以了解有关升级的详细信息。参考 Section 15.12.10, “PostGIS Functions new, behavior changed, or enhanced in 2.0” 有关更多详细信息和更改/新增的功能。
我们最感谢的是PostGIS社区中的众多成员,他们勇敢地测试了这个版本中的新功能。没有这些人,任何重大发行都不可能成功。
下面是那些最勇敢的人,他们提供了非常详细和彻底的错误报告和详细的分析。
Andrea Peri-对拓扑进行了大量测试,检查正确性 |
Andreas forřTollefsen-栅格测试 |
Chris English-拓扑压力测试加载器函数 |
塞尔瓦托·拉罗萨-拓扑稳健性测试 |
布莱恩·哈姆林-标杆(在被折叠成核心之前也是实验性的实验分支),对包括Tiger和Topology在内的各种部件进行一般测试。在各种服务器虚拟机上进行测试 |
Mike Pease-Tiger地理编码器测试-非常详细的问题报告 |
Tom van Tilburg-栅格测试 |
#722 , #302 ,删除了最不推荐使用的函数(超过250个函数)(Regina OBE,Paul Ramsey)
未知SRID从-1更改为0。(保罗·拉姆齐)
-- (most deprecated in 1.2) removed non-ST variants buffer, length, intersects (and internal functions renamed) etc.
-- If you have been using deprecated functions CHANGE your apps or suffer the consequences. If you don't see a function documented -- it ain't supported or it is an internal function. Some constraints in older tables were built with deprecated functions. If you restore you may need to rebuild table constraints with populate_geometry_columns(). If you have applications or tools that rely on deprecated functions, please refer to Q: 9.2 for more details.
#944 对于创建的表,GEOMETRY_COLUMNS现在是一个视图而不是表(Paul Ramsey,Regina OBE),旧方法读取(sRID,TYPE,DIMS)使用类型修饰符创建的几何列的约束读取只读列定义
#1081 , #1082 , #1084 , #1088 -管理函数支持tymod几何列创建函数,现在默认为tymod创建(Regina OBE)
#1083 PROBE_GEOMETRY_COLUMNS()、RENAME_GEOMETRY_TABLE_CONSTRAINTS()、FIX_GEOMETRY_COLUMNS();已删除-现在与GEOMETRY_COLUMN视图过时(Regina OBE)
#817 将旧的3D函数重命名为约定ST_3D(Nicklas Avén)
#548 (Sorta),ST_NumGeometries,ST_GeometryN现在返回1(或几何图形),而不是单个几何图形的NULL(Sandro Santilli,Maxime van Noppen.)
基于KNN Gist指数的质心( < - > )和方框( < # > )距离运营商(Paul Ramsey/由Vizzuality提供资金)
支持TIN和PolyHedralSurface,并增强了许多功能以支持3D(Olivier Courtin/Oslandia)
集成和记录的栅格支持 (皮埃尔·拉辛、豪尔赫·阿雷瓦洛、Mateusz Loskot、Sandro Santilli、David Zwarg、Regina OBE、Bborie Park)(公司开发商和资金:University Laval、Deimos Space、CADCORP、密歇根理工学院、Azavea、Paragon Corporation、加州大学戴维斯分校媒介传播疾病中心)
制作3D空间索引-正在进行中(Paul Ramsey,Mark Cave-Aland)
改进了拓扑支持(更多功能)、记录、测试(Sandro Santilli/Faunalia for RT-SIGTA)、Andrea Peri、Regina OBE、Jose Carlos Martinez Llari
3D关系和测量支持功能(Nicklas Avén)
ST_3DDistance、ST_3DClosestPoint、ST_3DIntersects、ST_3DShorestLine等...
N维空间索引(Paul Ramsey/OpenGeo)
ST_Split(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_IsValidDetail(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_MakeValid(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_RemoveRepeatedPoints(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_GeometryN和ST_NumGeometries支持非集合(Sandro Santilli)
ST_IsCollection(桑德罗·桑蒂利,马克西姆·范·诺彭)
ST_SharedPath(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_Snap(Sandro Santilli)
ST_RelateMatch(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_CavaveHull(Regina OBE和Leo Hsu/Paragon Corporation)
ST_UnaryUnion(用于RT-SIGTA的Sandro Santilli/Faunalia)
ST_AsX3D(Regina OBE/到货3D资金)
ST_OffsetCurve(Sandro Santilli,Rafal Magda)
ST_GeomFromGeoJSON(Kashif Rasul,Paul Ramsey/Vizzuality Funding)
使Shape文件加载器允许在某些免费的全球Shapefile中找到截断的多字节值(Sandro Santilli)
对shp2pgsql的大量错误修复和增强增强了对加载器的回归测试,在导入期间重新投影对几何和地理的支持(Jeff Adams/Azavea,Mark Cave-Aland)
Pgsql2shp从预定义列表转换(Loic Dachary/Mark Cave-Aland)
SHP-pgsql图形用户界面加载器-支持一次加载多个文件。(马克·莱斯利)
额外升级的Tiger_Geocode从使用旧的Tiger格式到使用新的Tiger shp和文件结构格式(Stephen Frost)
额外的-修改了Tiger_Geocode以处理Tiger Coping 2010数据,添加了反向Geocode功能,各种错误修复,精度增强,限制最大结果返回,速度改进,加载例程。(Regina OBE,Leo Hsu/Paragon Corporation/由Hunter Systems Group提供资金)
文件的整体校对和更正。(卡西夫·拉苏尔)
清理PostGIS JDBC类,修改为使用Maven Build。(玛丽亚·阿里亚斯·德·雷纳,桑德罗·桑蒂利)
#1335 ST_AddPoint在Linux(甚至Rouault)上返回错误结果
我们感谢 美国国务院人类信息部(HIU) 和 振奋性 以获得普遍的货币支持,以使PostGIS2.0走出大门。
发布日期:2012/05/07
这是一个错误修复版本,解决了自1.5.3版本以来提交的问题。
#547 ,ST_包含内存问题(Sandro Santilli)
#621 ,寻找与地理交叉的问题(保罗拉姆齐)
#627 ,PostGIS/PostgreSQL进程死于无效的几何图形(Paul Ramsey)
#810 ,提高面积计算的精确度(保罗拉姆齐)
#852 ,提高空间谓词的稳健性(Sandro Santilli,Nicklas Avén)
#877 ,ST_ESTIMATED_EXTEND在空表上返回NULL(Sandro Santilli)
#1028 ,ST_AsSVG在故障时终止整个Postgres服务器(Paul Ramsey)
#1056 ,修复弧线和圆圈划代码的方框(保罗拉姆齐)
#1121 ,使用不推荐使用的函数填充_GEOMETRY_COLUMNS(Regin OBE,Paul Ramsey)
#1135 ,提高测试套件的可预测性(Andreas‘Ads’Scherbaum)
#1146 ,图像生成器崩溃(Bronaugh)
#1170 ,北极交叉口失败(保罗·拉姆齐)
#1179 ,ST_AsText崩溃,值错误(KJurka)
#1184 ,在文档制作文件中表彰DESTDIR(Bryce L Nordgren)
#1227 ,服务器在无效的GML上崩溃
#1252 ,SRID出现在WKT(保罗·拉姆齐)
#1264 ,st_din(g,g,0)不工作(保罗·拉姆齐)
#1344 ,允许导出具有无效几何图形的表(Sandro Santilli)
#1389 ,SRID 31300和31370的项目4文本错误(保罗·拉姆齐)
#1406 ,shp2pgsql在加载到地理位置时崩溃(Sandro Santilli)
#1595 ,修复了ST_Line_SubString(Sandro Santilli)中的SRID冗余
#1596 ,在UpdateGeometrySRID中检查SRID(Mike Toews,Sandro Santilli)
#1602 ,修复ST_Polygonize以保留Z(Sandro Santilli)
#1697 ,修复了GIST索引中空条目的崩溃(保罗·拉姆齐)
#1772 ,使用折叠输入修复ST_Line_Locate_Point(Sandro Santilli)
#1799 ,保护ST_Segentize不受max_long=0的影响(Sandro Santilli)
更改900913中的参数顺序(保罗·拉姆齐)
支持使用“gmake”(Greg Troxel)构建
发布日期:2011/06/25
这是一个错误修复版本,解决了自1.5.2版本以来提交的问题。如果您运行的是PostGIS1.3+,则软升级就足够了,否则建议进行硬升级。
#1056 ,为圆弧几何图形生成正确的边界框,修复索引错误(保罗拉姆齐)
#1007 ,ST_IsValid崩溃修复需要GEOS 3.3.0+或3.2.3+(Sandro Santilli,Birgit Laggner报道)
#940 ,支持PostgreSQL 9.1测试版1(Regina OBE,Paul Ramsey,stl提交的补丁)
#845 ,ST_Intersects精度错误(Sandro Santilli,Nicklas Avén)由cdestigter报告
#884 ,ST_WITHING、ST_INTERSETS的结果不稳定(Chris Hodgson)
#779 ,shp2pgsql-S选项似乎在点上失败(杰夫·亚当斯)
#666 ,ST_DumpPoints不为空安全(Regina OBE)
#631 ,更新新西兰投影以支持网格变换(Jpalmer)
#630 ,David Bitner在ST_Collect(Chris Hodgson)中报告的数组中的特殊Null处理
#624 ,ST_GeogFromText中的内存泄漏(RYang,Paul Ramsey)
#609 ,手册第5.2节中的错误源代码Java客户端(SIMOC、Regina OBE)
#604 ,shp2pgsql使用修饰(Mike Toews,Paul Ramsey)
#573 ST_UNION在一组线串上失败而不是PostGIS错误,已在GEOS 3.3.0中修复
#457 ST_CollectionExtract返回非请求类型(Nicklas Avén,Paul Ramsey)
#441 几何集合错误的ST_AsGeoJson Bbox(Olivier Courtin)
#411 能够备份区域Toscana报告的无效几何图形(Sando Santilli)
#409 ST_AsSVG-Sdikiy报告的降级(Olivier Courtin)
#373 由psvensso报告的硬升级中的文档语法错误(Paul Ramsey)
发布日期:2010/09/27
这是一个错误修复版本,解决了自1.5.1版本以来一直存在的问题。如果您运行的是PostGIS1.3+,则软升级就足够了,否则建议进行硬升级。
加载器:修复了对shapefile中空(0-顶点)几何图形的处理。(桑德罗·桑蒂利)
#536 、地理ST_Intersects、ST_Coverers、ST_Coveredby和几何ST_Equals不使用空间索引(Regina OBE、Nicklas Aven)
#573 ,对ST_CONTAINS地理位置的改进(保罗·拉姆齐)
加载器:在Mac GTK版本中添加对命令-Q关闭的支持(Paul Ramsey)
#393 ,Loader:为大型DBF文件添加临时补丁(Maxime Guillaud,Paul Ramsey)
#507 ,修复GeoJSON和GML输出中的错误OGC URN(Olivier Courtin)
Space_ref_sys.sql为投影SRID 3021添加基准面转换(Paul Ramsey)
地理位置-当所有地理位置都不在估计范围内时,删除崩溃(保罗·拉姆齐)
#469 ,修复ARRAY_AGGATION错误(Greg Stark、Paul Ramsey)
#532 ,临时地理表出现在其他用户会话中(Paul Ramsey)
#562 ,大型地理位置的ST_DWING错误(保罗·拉姆齐)
#513 ,图形加载图形用户界面在加载仅DBF模式时尝试创建空间索引(Paul Ramsey)
#527 ,形状加载图形用户界面应始终附加日志消息(Mark Cave-Aland)
#504 ,shp2pgsql应重命名xmin/xmax字段(Sandro Santilli)
#458 ,postgis_Comments安装在Contrrib而不是Version文件夹中(Mark Cave-Aland)
#474 ,分析具有地理列崩溃服务器的表(保罗·拉姆齐)
#581 ,LWGEOM-Expand产生不一致的结果(Mark Cave-Aland)
#513 ,将DBF过滤器添加到shp2pgsql-gui并仅允许上传DBF(Paul Ramsey)
修复针对PostgreSQL 9.0(Mark Cave-Aland)的进一步构建问题
#572 ,Shape文件的密码空格(Mark Cave-Aland)
#603 ,shp2pgsql:“-w”为多个*对象生成无效的wkt。(马克·凯夫-艾兰德)
发布日期:2010/03/11
这是一个错误修复版本,解决了自1.4.1版本以来一直存在的问题。如果您运行的是PostGIS1.3+,则软升级就足够了,否则建议进行硬升级。
#410 ,在将ST_SetPoint、ST_AddPoint ST_RemovePoint应用于线串时更新嵌入的BBox(Paul Ramsey)
#411 ,允许转储具有无效几何图形的表(Sandro Santilli,适用于Regione Toscana-SIGTA)
#414 ,在运行升级脚本时包含GEOGRAPHY_COLUMNS视图(Paul Ramsey)
#419 ,允许在ST_Line_Substring中支持多线串(Paul Ramsey,针对Lidwala咨询工程师)
#421 ,修复ST_AsGML()(Olivier Courtin)中计算的字符串长度
#441 ,使用异类集合修复GML生成(Olivier Courtin)
#443 ,GML 3生成中的不正确坐标反转(Olivier Courtin)
#450 , #451 ,跨越日期线的地理特征的面积计算错误(保罗拉姆齐)
确保支持即将发布的9.0 PgSQL版本(Paul Ramsey)
发布日期:2010/02/04
此版本通过新的地理类型提供对地理坐标(经度/经度)的支持。还有性能增强、新的输入格式支持(GML、KML)和通用维护。
现在,GEOS、Proj4和LibXML2是强制依赖项
以下库版本是PostGIS 1.5的最低要求
所有平台上的PostgreSQL 8.3和更高版本
仅限GEOS 3.1及更高版本(GEOS 3.2+可利用所有功能)
LibXML2 2.5+与新的ST_GeomFromGML/KML功能相关
仅项目4 4.5和更高版本
Section 15.12.12, “PostGIS Functions new, behavior changed, or enhanced in 1.5”
添加了Hausdorff距离计算( #209 (文森特·皮卡韦)
向ST_BUFFER操作添加了参数参数,以支持单边缓冲和其他缓冲样式(Sandro Santilli)
添加其他与距离相关的可视化和分析功能(Nicklas Aven)
ST_ClosestPoint
ST_DFullyWithin
ST_LongestLine
ST_MaxDistance
ST_ShortestLine
ST_DumpPoints(马克西姆·范·诺本)
通过ST_GeomFromGML和ST_GeomFromKML(Olivier Courtin)输入的KML、GML
使用ST_CollectionExtract提取同类集合(Paul Ramsey)
使用ST_AddMeasure将度量值添加到现有线串(Paul Ramsey)
使用Utils实现历史表(George Silva)
地理类型和支持功能
球形算法(Dave Skea)
对象/索引实现(Paul Ramsey)
选择性实施(马克洞穴-艾兰德)
KML、GML和JSON的序列化(Olivier Courtin)
ST_Area、ST_Distance、ST_DWiThin、ST_GeogFromText、ST_GeogFromWKB、ST_Intersects、ST_Covers、ST_Buffer(Paul Ramsey)
ST_Distance的性能改进(Nicklas Aven)
文档更新和改进(Regina OBE,Kevin Neufeld)
测试和质量控制(Regina OBE)
PostGIS 1.5支持PostgreSQL 8.5干线(Guillaume Lelarge)
Win32对核心shp2pgsql-gui(Mark Cave-Aland)的支持和改进
适当的‘检查’支持(保罗·拉姆齐)
发布日期:2009/07/24
此版本提供了性能增强、改进的内部结构和测试、新功能以及升级的文档。如果您运行的是PostGIS 1.1+,则软升级就足够了,否则建议进行硬升级。
在针对GEOS 3.1+(Paul Ramsey)进行编译时,ST_Union()使用高速级联联合
ST_ContainsProperly()需要GEOS 3.1+
ST_Intersects()、ST_CONTAINS()、ST_WINDOWS()针对GEOS 3.1+使用高速缓存的准备好的几何图形(Paul Ramsey/由Zonar Systems资助)
大大改进了文档和参考手册(Regina OBE & Kevin Neufeld)
参考手册中的图表和图例(凯文·纽菲尔德)
ST_IsValidReason()返回有效性失败的可读解释(Paul Ramsey)
ST_GeoHash()返回几何图形的Geohash.org签名(Paul Ramsey)
用于加载形状文件的GTK+多平台图形用户界面(Paul Ramsey)
ST_LineCrossingDirection()返回交叉方向(Paul Ramsey)
ST_LocateBetweenElevations()返回基于Z坐标的子字符串。(保罗·拉姆齐)
几何解析器返回有关语法错误位置的显式错误消息(Mark Cave-Aland)
ST_AsGeoJSON()返回JSON格式的几何图形(Olivier Courtin)
PUPATE_GEOMETRY_COLUMNS()--自动将记录添加到表和视图的GEOMETRY_COLUMNS(Kevin Neufeld)
ST_最小边界圆()--返回可以包含几何体的最小圆多边形(Bruce Rindahl)
核心几何系统搬进了独立库liblwgeom。(马克·凯夫-艾兰德)
新的构建系统使用PostgreSQL“pgxs”构建引导程序。(马克·凯夫-艾兰德)
调试框架形式化、简单化。(马克·凯夫-艾兰德)
所有Build-Time#定义在配置时生成,并放置在标题中以便于跨平台支持(Mark Cave-Aland)
正式和简化的日志记录框架(Mark Cave-Aland)
扩展和更稳定地支持CIRCULARSTRING、COMPOUNDCURVE和CURVEPOLYGON,更好的解析,更广泛的函数支持(Mark Leslie & 马克·凯夫-艾兰德)
改进了对OpenSolaris构建的支持(Paul Ramsey)
改进了对MSVC版本的支持(Mateusz Loskot)
更新的KML支持(Olivier Courtin)
Liblwgeom的单元测试框架(Paul Ramsey)
全面行使邮政地理信息系统各项功能的新测试框架(Regine OBE)
所有几何聚合函数的性能改进(Paul Ramsey)
支持即将推出的PostgreSQL 8.4(Mark Cave-Aland、Talha Bin Rizwan)
Shp2pgsql和pgsql2shp重新工作,以依赖于liblwgeom(Mark Cave-Aland)中的公共解析/未解析代码
使用PDF DbLatex构建PDF文档和初步构建说明(Jean David Techer)
自动生成用户文档(PDF和HTML)和开发人员DOOXO文档(Kevin Neufeld)
使用ImageMagick从WKT几何文本文件自动构建文档图像(Kevin Neufeld)
更吸引人的用于HTML文档的CSS(Dane Springmeyer)
发布日期:2009/05/04
如果您运行的是PostGIS 1.1+,则软升级就足够了,否则建议进行硬升级。此版本增加了对PostgreSQL8.4的支持,从数据库中导出带有形状数据的prj文件,修复了shp2pgsql的一些崩溃修复,并修复了在处理“曲线”类型时的几个小错误,仅导入DBF文件的逻辑错误,改进了AddGeometryColumns的错误处理。
发布日期:2008/12/15
如果您运行的是PostGIS 1.1+,则软升级就足够了,否则建议进行硬升级。此版本是一个错误修复版本,旨在解决ST_Force_Collection和相关函数中的一个故障,该故障严重影响将MapServer与LINE Layer一起使用。
发布日期:2008/11/24
此版本增加了对使用PostgreSQL 8.4构建的GeoJSON输出的支持,提高了文档质量和输出美感,添加了函数级SQL文档,并提高了一些空间谓词(点在多边形中的测试)的性能。
错误修复包括删除了在处理许多函数的循环字符串时的崩溃,删除了一些内存泄漏,对顶点上的测量的线性引用失败,等等。有关详细信息,请参阅新闻文件。
发布日期:2008/04/12
此版本修复了错误shp2pgsql,添加了对SVG和KML支持的增强,添加了ST_SimplifyPpresveTopology函数,使构建对GEOS版本更加敏感,并修复了少数严重但罕见的失败案例。
发布日期:2007/12/01
此版本修复了ST_Endpoint()和ST_Entaine中的错误,改进了对JDBC构建和OS/X的支持,并通过ST_AsGML()增加了对GML输出的更好支持,包括GML3输出。
发布日期:2007/08/09
此版本增强了关系函数的性能,添加了新的关系函数,并开始使用空间类型(SP)前缀将我们的函数名迁移到SQL-MM约定。
JDBC:增加了休眠方言(感谢诺曼·巴克)
新增ST_COVERS和ST_COVEREDBY关系函数。有关这些功能的说明和理由,请参阅 http://lin-ear-th-inking.blogspot.com/2007/06/subtleties-of-ogc-covers-spatial.html
在关系函数中添加了ST_DWide。
发布日期:2007/01/11
此版本修复了PostgreSQL8.2支持中的错误,并对性能进行了一些小的改进。
发布日期:2006/12/08
此版本提供了类型定义以及针对SQL-MM定义的曲线几何的序列化/反序列化功能,以及性能增强。
发布日期:2006/11/02
这是一个错误修复版本,特别是修复了64位系统中GEOS接口的一个严重错误。包括SRS参数的更新和重新预测的改进(考虑到Z)。升级是 鼓励 。
发布日期:2006/10/13
这是一个错误修复版本,包括Win32上的一个严重段错误。升级是 鼓励 。
如果您要从1.0.3版或更高版本升级,请遵循 软升级 程序。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
修复了为PostgreSQL 8.2编译时导致pgsql2shp在Win32上分段错误的MingW链接错误
修复了Java中Geometry.equals()方法中的空指针异常
添加了EJB3Spatial.odt以满足GPL发布“首选修改形式”的要求
已从JDBC JTS代码中删除过时的同步。
通过将shp2pgsql/pgsql2shp与手册页合并,更新了严重过时的自述文件。
修复了JDBC代码中在“1.1.4”版本中仍为“1.1.3”的版本标记。
发布日期:2006/09/27
这是一个错误修复版本,其中包括对Java接口的一些改进。升级是 鼓励 。
如果您要从1.0.3版或更高版本升级,请遵循 软升级 程序。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
修复了对PostgreSQL 8.2的支持
修复了Collect()函数丢弃输入的SRID的错误
在MakeBox2d和MakeBox3d中添加了SRID匹配检查
修复了使用GEOS-3.0.0通过的回归测试
改进了pgsql2shp运行并发性。
发布日期:2006/06/30
这是一个错误修复版本,还包括一些新功能(最引人注目的是长事务支持)和可移植性增强。升级是 鼓励 。
如果您要从1.0.3版或更高版本升级,请遵循 软升级 程序。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
修正了距离(多边形、多边形)产生错误结果的错误。
修复了pgsql2shp成功返回代码中的错误。
修复了shp2pgsql处理多行wkt的错误。
无法更新边界框的仿射()中的错误修复。
WKT解析器:禁止构造包含空元素的多几何图形(仍支持GEOMETRYCOLLECTION)。
发布日期:2006/03/30
这是一个错误修复版本,包括一些新功能和可移植性增强。升级是 鼓励 。
如果您要从1.0.3版或更高版本升级,请遵循 软升级 程序。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
回归测试现在可以在安装Postgis之前运行
新的仿射()矩阵变换函数
新的旋转{,X,Y,Z}()函数
旧的平移和缩放函数现在内部使用仿射()
针对pgsql的构建嵌入了Estimated_Extent()中的访问控制 > =8.0.0
发布日期:2006/01/23
这是一个重要的错误修复版本,升级是 强烈推荐 。以前的版本在postgis_Restore.pl中包含错误,阻止 硬升级 要完成的过程以及GEOS-2.2+连接器中阻止在拓扑操作中使用GeometryCollection对象的错误。
如果您要从1.0.3版或更高版本升级,请遵循 软升级 程序。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
修复了postgis_Restore.pl中的提前退出
GEOS-CAPI连接器的几何集合处理中的错误修复
Solaris 2.7和MingW支持改进
行_位置_点()中的错误修复
修复了对PostgreSQL路径的处理
修正line_substring()中的错误
在回归测试器中添加了对本地化集群的支持
发布日期:2005/12/21
这是一个较小的版本,包含许多改进和新内容。最值得注意的是:构建过程大大简化;Transform()性能显著提高;更稳定的GEOS连接(CAPI支持);大量新功能;草案拓扑支持。
它是 强烈推荐 在安装PostGIS之前升级到GEOS-2.2.x,这将确保未来的GEOS升级不需要重新构建PostGIS库。
此版本包括Mark Cave Aland提供的用于缓存proj4对象的代码。Markus Schaber在他的JDBC2代码中添加了许多改进。Alex Bodnaru帮助缓解了PostgreSQL对源代码的依赖,并提供了Debian规范文件。迈克尔·福尔在Solaris Arch上测试了一些新东西。David Techer和Gerald Fenoy帮助测试了GEOS C-API连接器。Hartmut Tschauner提供了azimuth()函数的代码。Devrim Gunduz提供了RPM规格文件。卡尔·安德森帮助完成了新区域的建筑功能。请参阅 学分 部分可以找到更多的名字。
如果您要从1.0.3版或更高版本升级, 请勿 需要转储/重新加载。只需在所有现有数据库中查找新的lwpostgis_upgrade.sql脚本就可以了。请参阅 软升级 章节以了解更多信息。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
翻译()的配套方法Scale()和TransScale()
行_子字符串()
Line_Locate_Point()
M(点)
线条合并(几何图形)
Shift_经度(几何体)
方位角(几何体)
LOCATE_ALOW_MEASURE(几何体,浮动8)
LOCATE_BETWEEN_MEASURES(几何,浮动8,浮动8)
按点偏移捕捉到栅格(最多支持4d)
BuildArea(ANY_GEOMETRY)
OGC BdPolyFromText(LINESTRING_WKT,SRID)
OGC BdMPolyFromText(LINESTRING_WKT,SRID)
RemovePoint(线串,偏移)
替换点(线串、偏移、点)
修复了Polygonize()中的内存泄漏问题
修复了lwgeom_as_anytype强制转换函数中的错误
修复了postgis_version()输出的USE_GEOS、USE_PROJ和USE_STATS元素,以始终反映库状态。
转换()函数的速度要快得多,缓存proj4对象
删除了AddGeometryColumns()和UPDATE_GEOMETRY_STATS()中对FIX_GEOMETRY_COLUMNS()的自动调用
Makefile改进
JTS支持改进
改进的回归测试系统
几何集合的基本一致性检查方法
支持(十六进制)(E)WKB
用于HexWKB/EWKT切换的自动探测驱动程序包装器
修复了早期JDK发行版的ValueSetter中的编译问题。
修复EWKT构造函数以接受SRID=4711;表示
添加了对java2d几何图形的初步只读支持
完全基于Autoconf的配置,可解除对PostgreSQL源代码的依赖
GEOS C-API支持(2.2.0及更高版本)
对拓扑建模的初始支持
Debian和RPM规范文件
新的lwpostgis_upgrade.sql脚本
发布日期:2005/12/06
包含一些错误修复和改进。
如果您要从1.0.3版或更高版本升级, 请勿 需要转储/重新加载。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
修复了集合反序列化程序中的palloc(0)调用(仅在--Enable-Cassert中出现问题)
修复了BBox缓存处理错误
修复geom_accum(NULL,NULL)段错误
修复了addPoint()中的段错误
修复了lwCollection_clone()中的短分配问题
修复了Segentize()中的错误
SnapToGrid输出的固定BBox计算
发布日期:2005/11/25
包含库中的内存对齐修复、加载器处理UTF8属性时的段错误修复以及一些改进和清理。
![]() | |
Shp2pgsql的返回代码从以前的版本更改为符合Unix标准(成功时返回0)。 |
如果您要从1.0.3版或更高版本升级, 请勿 需要转储/重新加载。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
修复了内存对齐问题
分析仪中空值分数的固定计算
修复了getPoint4d_p()低级函数中的一个小错误
串行化程序函数的加速
修复了force_3dm()、force_3dz()和force_4d()中的错误
发布日期:2005/09/09
包含重要的错误修复和一些改进。特别是,它修复了阻止成功构建大型空间表的GIST索引的内存泄漏。
如果您要从1.0.3版升级, 请勿 需要转储/重新加载。
如果您要从发行版升级 在1.0.0RC6和1.0.2之间 (含)并且真的想要实时升级阅读 升级部分 1.0.3发行说明章节的。
从1.0.0RC6之前的任何版本升级需要 硬升级 。
在主旨索引中插入内存泄漏
修复了处理proj4错误的Transform()中的段错误
修复了space_ref_sys中的一些proj4文本(缺少+proj)
加载器:修复了字符串函数的用法,修改了空对象检查,修复了MULTILINESTRING输入上的段错误。
修复了MakeLine尺寸处理中的错误
修复了Translate()损坏输出边界框中的错误
发布日期:2005/08/08
包含一些错误修复- 包括影响存储几何的正确性的严重问题 -以及一些改进。
由于边界框计算例程中存在错误,升级过程需要特别注意,因为缓存在数据库中的边界框可能不正确。
一个 硬升级 程序(转储/重新加载)将强制重新计算所有边界框(不包括在转储中)。这是 必填项 如果从1.0.0RC6之前的版本升级。
如果要从1.0.0RC6或更高版本升级,此版本包括Perl脚本(utils/rebuild_bbox_caches.pl),以强制重新计算几何体的边界框,并调用传播其中的最终更改所需的所有操作(几何体统计信息更新、重建索引)。在Make Install之后调用该脚本(运行时不使用参数获取语法帮助)。或者,运行utils/postgis_proc_upgrade.pl以刷新postgis过程和函数签名(请参见 软升级 )。
Lwgeom二维包围盒计算中的严重错误修复
加载器中wkt(-w)点处理中的错误修复
修复64位计算机上转储程序中的错误
用户定义查询的转储处理中的错误修复
修复了create_unde.pl脚本中的错误
发布日期:2005/07/04
包含一些错误修复和改进。
发布日期:2005/05/24
包含一些错误修复和一些改进。
发布日期:2005/04/19
最终的1.0.0版本。包含一些错误修复、加载器中的一些改进(最明显的是对较旧的postgis版本的支持)和更多文档。
发布日期:2005/03/25
1.0.0的第五个候选版本。包含一些错误修复和改进。
发布日期:2005/03/18
1.0.0的第四个候选版本。包含错误修复和一些改进。
您需要转储/重新加载才能从以前的版本升级。请参阅 升级换代 章节,了解更多信息。
Geom_accum()中的错误修复(段故障)。
修复了64位架构支持中的错误。
修复了带有集合的box3d计算函数中的错误。
选择性估计器中的新子选择支持。
FORCE_COLLECTION提前返回。
SnapToGrid()中的一致性检查修复。
Box2d输出更改回15位有效数字。
发布日期:2005/02/24
1.0.0的第三个候选版本。包含许多错误修复和改进。
您需要转储/重新加载才能从以前的版本升级。请参阅 升级换代 章节,了解更多信息。
修复了Transform()中的错误:缺少SRID,错误处理更好。
内存对齐处理中的错误修复
FORCE_COLLECTION()中的错误修复导致简单(单一)几何体类型上的映射服务器连接器故障。
添加BBox缓存时缺少GeometryFromText()中的错误修复。
降低了box2D输出的精度。
在调试宏前面加上前缀pgis_,以避免与pgsql宏冲突
堵住了GEOS2POSTGIS转换器的泄漏
通过提前释放查询上下文分配的查询来减少内存使用。
修复了72个索引绑定中的错误。
修复了PROBE_GEOMETRY_COLUMNS()中的错误,以使用PG72并支持单个表中的多个几何列
新bool::文本强制转换
为了提高性能,一些函数从稳定变为不可变。
Jdbc2:小补丁、盒2D/3D测试、修订的文档和许可证。
Jdbc2:pgjdbc 8.0类型自动注册中的错误修复和测试用例
Jdbc2:删除了仅使用jdk1.4功能,以支持使用较旧的JDK版本进行构建。
Jdbc2:添加了对pg72jdbc2.jar构建的支持
Jdbc2:已更新和清理生成文件
Jdbc2:添加了对jts几何图形类的测试版支持
Jdbc2:跳过针对较旧的PostGIS服务器的已知失败测试。
Jdbc2:修复了对EWKT中测量的几何图形的处理。
发布日期:2005/01/26
1.0.0的第二个候选版本,包含错误修复和一些改进。
您需要转储/重新加载才能从以前的版本升级。请参阅 升级换代 章节,了解更多信息。
修复点阵射线盒3d计算中的错误
距离球体定义中的错误修复
更新BBox缓存时缺少转换()中的错误修复
新的JDBC驱动程序(Jdbc2)
支持向后兼容的GEOMETRYCOLLECTION(空)语法
更快的二进制输出
更严格的OGC WKB/WKT构造函数
发布日期:2005/01/13
这是主要的postgis版本的第一个候选版本,Postgis类型的内部存储重新设计为在索引查询上更小、更快。
您需要转储/重新加载才能从以前的版本升级。请参阅 升级换代 章节,了解更多信息。