PostGIS — це розширення для об'єктно-реляційної системи баз даних PostgreSQL, яке дозволяє зберігати об'єкти ГІС (географічних інформаційних систем) у базі даних. PostGIS підтримує просторові індекси R-Tree на основі GiST, а також функції для аналізу та обробки об'єктів ГІС.
Це інструкція для версії 3.7.0beta1
Ця робота ліцензована за ліцензією Creative Commons Attribution-Share Alike 3.0 License. Ви можете використовувати цей матеріал будь-яким чином, але просимо вас вказати посилання на проект PostGIS та, по можливості, на https://postgis.net.
PostGIS extends PostgreSQL so that geospatial data can be stored, indexed, queried, and processed in the database. It keeps location data beside ordinary relational data, so a spatial query can use the same SQL, transactions, constraints, access controls, backup tools, and application connections as the rest of a PostgreSQL database.
The main postgis extension adds:
geometry for planar coordinate systems and geography for geodetic coordinates on the earth.
Spatial indexes that let the PostgreSQL planner avoid scanning every row when objects can be filtered by location.
Functions for measurement, relationships, overlays, geometry construction and editing, coordinate transformation, clustering, and spatial data exchange.
Support for common geospatial encodings and formats, including WKT, WKB, GeoJSON, GML, KML, FlatGeobuf, Geobuf, and Mapbox Vector Tiles.
This makes PostgreSQL a spatial database: applications can ask both ordinary questions and location-aware questions without moving data to a separate GIS processing system. Desktop GIS, map servers, ETL tools, and application frameworks can connect through normal PostgreSQL interfaces.
This manual documents the main PostGIS source distribution. Depending on how PostGIS was built and packaged, it can provide several PostgreSQL extensions and command-line tools:
postgisThe core geometry and geography types, spatial indexes, and most spatial functions.
postgis_rasterRaster storage, analysis, loading, and export. Raster support uses GDAL and can be omitted from a build.
postgis_topologySQL/MM topology types and functions for models based on shared nodes, edges, and faces.
postgis_sfcgalAdditional 2D and 3D processing functions backed by the optional SFCGAL library.
shp2pgsql, pgsql2shp, and raster2pgsql move data between common file formats and PostGIS. Other utilities support upgrades, profiling, and development.
The source tree also contains internal libraries such as liblwgeom and libpgcommon. They are implementation layers shared by PostGIS components, not separately released PostgreSQL extensions. Most users start by enabling the core extension with CREATE EXTENSION postgis; see Розділ 2, Встановлення PostGIS for available components and build options.
This manual covers the main postgis/postgis distribution. The official PostGIS source organization also hosts or mirrors complementary projects. These projects have their own release cycles, installation instructions, and documentation; installing the core extension does not install them.
Address Standardizer parses and normalizes postal addresses. It moved from the main PostGIS source tree to a separate repository for the PostGIS 3.7 development cycle.
PostGIS TIGER Geocoder provides United States address geocoding and reverse geocoding using Census TIGER data. It is also maintained separately from the main distribution.
H3-pg provides PostgreSQL bindings for the H3 hierarchical hexagonal indexing system and interoperates with PostGIS.
PostGIS Java provides Java bindings for PostGIS types.
Introduction to PostGIS is the hands-on workshop maintained by the PostGIS project.
Other PostgreSQL spatial extensions can complement PostGIS while remaining independent projects. For example, pgRouting adds routing and graph analysis. Use each project's own manual for its functions and support policy.
The manual is both a guide to the PostGIS data model and the complete reference for the SQL interface. Choose a starting point based on what you are trying to do:
Start with the Introduction to PostGIS workshop for a tutorial, then use Розділ 4, Data Management to understand spatial types, coordinate systems, validity, loading, and indexes.
Read Розділ 2, Встановлення PostGIS and Розділ 3, Адміністрування PostGIS. Package-specific instructions and supported release information are maintained on the PostGIS website.
Read Розділ 5, Spatial Queries for spatial relationships and index-aware query patterns, and Розділ 6, Поради щодо продуктивності for common performance problems.
Use Розділ 7, Довідка PostGIS or Розділ 13, Спеціальні функції PostGIS Вказівник. Function pages state accepted types, dimensional support, standards conformance, dependency requirements, and version availability.
See Розділ 9, Топологія, Розділ 10, Raster Data Management, Queries, and Applications, Розділ 11, Растрова довідка, or Розділ 8, Довідник функцій SFCGAL.
Collect the versions reported by PostGIS_Full_Version and follow Розділ 14, Reporting Problems. Check Додаток A, Release Notes when behavior differs between release lines.
This manual marks individual functions as compliant with spatial standards so users can tell which behavior is portable and which behavior is a PostGIS extension. PostGIS implements the OGC Simple Features for SQL model, including the geometry type, Well-Known Text (WKT), Well-Known Binary (WKB), and the common spatial accessors, constructors, predicates, and processing functions. PostGIS also implements many SQL/MM Spatial types and functions.
PostGIS supports geometry families defined by later standards, including SQL/MM curved geometry and OGC Simple Features Access 1.2 PolyhedralSurface, Triangle, and TIN. Support for these geometry families is function-specific, and each function page documents the supported input types and conformance level.
PostGIS also includes widely used extensions and integrations. Examples of PostGIS extensions include Extended WKT (EWKT), Extended WKB (EWKB), SRID metadata in those extended formats, geography, and raster. PostGIS also supports input and output exchange formats defined by other standards, such as GeoJSON, GML, and KML. These features are documented individually and should not be read as OGC Simple Features or SQL/MM requirements unless the specific function or format says so.
When the implementation intentionally differs from a standard, or when a standard leaves behavior ambiguous, the relevant function page describes the PostGIS behavior. Розділ 13, Спеціальні функції PostGIS Вказівник summarizes SQL/MM compliance and geometry-type support across functions.
PostGIS began in 2001 as a spatial database research project at Refractions Research. It is now an OSGeo project developed by contributors and organizations around the world. The Project Steering Committee coordinates releases, project policy, and the general direction of development. The complete contributor and sponsor record is in Розділ 15, Credits and Acknowledgments at the end of this manual.
The manual is the authoritative reference for the released SQL interface. The project website and source tree provide the surrounding material:
Documentation routes readers to getting-started instructions, versioned manuals, tips, training material, and the FAQ.
Community lists mailing lists, chat, events, videos, and other support channels.
Developer documentation covers development environments, testing, coding style, internals, maintenance, governance, releases, and website work.
У цьому розділі детально описано кроки, необхідні для встановлення PostGIS.
Щоб скомпілювати, припускаючи, що у вашому шляху пошуку є всі залежності:
tar -xvzf postgis-3.7.0beta1.tar.gz cd postgis-3.7.0beta1 ./configure make make install
Після встановлення PostGIS його потрібно ввімкнути (Розділ 3.3, «Створення просторових баз даних») або оновити (Розділ 3.4, «Оновлення просторових баз даних») в кожній окремій базі даних, в якій ви хочете його використовувати.
![]() | |
Багато операційних систем зараз містять готові пакети для PostgreSQL/PostGIS. У більшості випадків компіляція необхідна лише якщо ви хочете отримати найновіші версії або ви є розробником пакету. Цей розділ містить загальні інструкції з компіляції. Якщо ви компілюєте для Windows тощо або іншої ОС, додаткову детальну допомогу можна знайти за посиланням Посібники з компіляції, надані користувачами PostGIS та PostGIS Dev Wiki. Готові пакети для різних операційних систем перелічені в Готові пакети PostGIS Якщо ви користуєтеся Windows, ви можете отримати стабільні збірки через Stackbuilder або сайт завантаження PostGIS для Windows. Ми також маємо дуже новітні експериментальні збірки для Windows, які зазвичай створюються один-два рази на тиждень або коли трапляється щось цікаве. Ви можете використовувати їх для експериментів з поточними версіями PostGIS |
Модуль PostGIS є розширенням серверного бекенду PostgreSQL. Як такий, PostGIS 3.7.0beta1 вимагає повного доступу до заголовків сервера PostgreSQL для компіляції. Його можна скомпілювати для версій PostgreSQL 14 - 18. Раніші версії PostgreSQL не підтримуються.
Якщо ви ще не встановили PostgreSQL, зверніться до інструкцій з інсталяції PostgreSQL. https://www.postgresql.org .
![]() | |
Для роботи GEOS, під час встановлення PostgreSQL може знадобитися явно пов'язати PostgreSQL зі стандартною бібліотекою C++: |
LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE]
Це обхідний шлях для вирішення проблеми взаємодії помилкових винятків C++ зі старими інструментами розробки. Якщо ви зіткнулися з дивними проблемами (несподіване закриття бекенду або подібні речі), спробуйте цей трюк. Звичайно, для цього потрібно буде перекомпілювати PostgreSQL з нуля.
Наступні кроки описують конфігурацію та компіляцію вихідного коду PostGIS. Вони написані для користувачів Linux і не працюватимуть на Windows або Mac.
Завантажте архів PostGIS з веб-сайту завантажень https://download.osgeo.org/postgis/source/postgis-3.7.0beta1.tar.gz
wget https://download.osgeo.org/postgis/source/postgis-3.7.0beta1.tar.gz tar -xvzf postgis-3.7.0beta1.tar.gz cd postgis-3.7.0beta1
Це створить каталог з назвою postgis-3.7.0beta1 у поточному робочому каталозі.
Або перегляньте джерело з репозиторію git https://git.osgeo.org/gitea/postgis/postgis/ .
git clone https://git.osgeo.org/gitea/postgis/postgis.git postgis
cd postgis
sh autogen.sh
Перейдіть до новоствореного каталогу postgis, щоб продовжити встановлення.
./configure
PostGIS має наступні вимоги до побудови та використання:
Необхідно
PostgreSQL 14 - 18. Потрібна повна інсталяція PostgreSQL (включно з заголовками сервера). PostgreSQL доступний за адресою https://www.postgresql.org 18 .
For current release-line support and end-of-life policy, see https://postgis.net/development/versions_eol/
Компілятор GNU C (gcc). Для компіляції PostGIS можна використовувати й інші компілятори ANSI C, але при компіляції за допомогою gcc ми зустрічаємо набагато менше проблем.
GNU Make (gmake або make). Для багатьох систем GNU make є стандартною версією make. Перевірте версію, викликавши make -v. Інші версії make можуть не обробляти PostGIS Makefile належним чином.
Бібліотека перепроекції Proj. Потрібна версія Proj 6.1 або вище. Бібліотека Proj використовується для забезпечення підтримки перепроекції координат у PostGIS. Proj можна завантажити за адресою https://proj.org/ .
Бібліотека геометрії GEOS, версія 3.8.0 або вище, але для повного використання всіх нових функцій і можливостей необхідна версія GEOS 3.14+. GEOS можна завантажити за адресою https://libgeos.org .
LibXML2, версія 2.5.x або вище. LibXML2 наразі використовується в деяких функціях імпорту (ST_GeomFromGML та ST_GeomFromKML). LibXML2 можна завантажити за адресою https://gitlab.gnome.org/GNOME/libxml2/-/releases.
JSON-C, версія 0.9 або вище. JSON-C наразі використовується для імпорту GeoJSON за допомогою функції ST_GeomFromGeoJson. JSON-C можна завантажити за посиланням https://github.com/json-c/json-c/releases/.
The GNU Multiple Precision Arithmetic Library (libgmp). Used to control precision of math operations in PostGIS Topology. GMP is available for download from https://gmplib.org/.
GDAL, версія 3+ є кращою. Це необхідно для підтримки растрових даних. https://gdal.org/download.html.
При компіляції з PostgreSQL+JIT необхідна версія LLVM >=6 https://trac.osgeo.org/postgis/ticket/4125.
Додатково
GDAL (псевдоопціональний) тільки якщо ви не хочете растрові дані, ви можете залишити його поза увагою. Також переконайтеся, що ви ввімкнули драйвери, які ви хочете використовувати, як описано в Розділ 3.2, «Налаштування підтримки растрів».
GTK (потрібно GTK+2.0, 2.8+) для компіляції завантажувача файлів shp2pgsql-gui. http://www.gtk.org/ .
SFCGAL, 1.4.1 or higher is required, 2.3+ is needed to be able to use all functionality. SFCGAL can be used to provide additional 2D and 3D advanced analysis functions to PostGIS cf Розділ 8, Довідник функцій SFCGAL. https://sfcgal.gitlab.io/sfcgal/.
Щоб увімкнути ST_AsMVT, потрібна бібліотека protobuf-c 1.1.0 або вище (для використання) та компілятор protoc-c (для побудови). Також для перевірки мінімальної версії protobuf-c необхідний pkg-config. Див. protobuf-c. За замовчуванням Postgis використовує Wagyu для швидшої перевірки полігонів MVT, що вимагає компілятора c++11. Він використовуватиме CXXFLAGS і той самий компілятор, що й інсталяція PostgreSQL. Щоб вимкнути це і замість цього використовувати GEOS, під час конфігурації вкажіть --without-wagyu.
CUnit (CUnit). Це потрібно для регресійного тестування. http://cunit.sourceforge.net/
Для створення документації необхідний DocBook (xsltproc). Docbook доступний за адресою http://www.docbook.org/ .
DBLatex (dblatex) необхідний для створення документації у форматі PDF. DBLatex доступний за адресою http://dblatex.sourceforge.net/ .
PDF documentation needs an SVG rasterizer for its high-resolution figure fallbacks. The build prefers rsvg-convert, and can also use GraphicsMagick (gm convert) or ImageMagick (magick or convert).
Як і в більшості випадків встановлення Linux, першим кроком є створення файлу Makefile, який буде використовуватися для компіляції вихідного коду. Це робиться за допомогою виконання скрипта оболонки
./configure
Без додаткових параметрів ця команда спробує автоматично знайти необхідні компоненти та бібліотеки, потрібні для компіляції вихідного коду PostGIS у вашій системі. Хоча це найпоширеніший спосіб використання ./configure, скрипт приймає кілька параметрів для тих, хто має необхідні бібліотеки та програми в нестандартних місцях.
У наведеному нижче списку вказані лише найчастіше використовувані параметри. Повний список можна отримати за допомогою параметрів --help або --help=short.
--with-library-minor-versionПочинаючи з PostGIS 3.0, файли бібліотеки, що генеруються за замовчуванням, більше не матимуть незначну версію як частину імені файлу. Це означає, що всі бібліотеки PostGIS 3 будуть закінчуватися на postgis-3. Це було зроблено для спрощення pg_upgrade, але має той недолік, що ви можете встановити на сервер лише одну версію PostGIS 3. Щоб повернути стару поведінку файлів із включенням другорядної версії, наприклад postgis-3.0, додайте цей перемикач до вашої конфігураційної команди.
--prefix=PREFIXThis is the installation prefix for PostGIS command-line utilities. By default, utilities are installed in the executable directory reported by the detected PostgreSQL installation.
![]() | |
PostgreSQL extension files are installed in the directories reported by pg_config, so the server can load them. This includes the PostGIS shared library and SQL extension files. Use |
--with-pgconfig=FILEPostgreSQL надає утиліту під назвою pg_config для увімкнення розширень, таких як PostGIS, для пошуку каталогу інсталяції PostgreSQL. Використовуйте цей параметр (--with-pgconfig=/path/to/pg_config), щоб вручну вказати конкретну інсталяцію PostgreSQL, на основі якої буде побудовано PostGIS.
--with-gdalconfig=FILEGDAL, необхідна бібліотека, надає функціональність, необхідну для підтримки растрових даних gdal-config, щоб програмне забезпечення могло знайти каталог інсталяції GDAL. Використовуйте цей параметр (--with-gdalconfig=/path/to/gdal-config), щоб вручну вказати конкретну інсталяцію GDAL, на основі якої буде побудовано PostGIS.
--with-geosconfig=FILEGEOS, необхідна бібліотека геометрії, надає утиліту під назвою geos-config для того, щоб програмне забезпечення могло знайти каталог інсталяції GEOS. Використовуйте цей параметр (--with-geosconfig=/path/to/geos-config), щоб вручну вказати конкретну інсталяцію GEOS, на основі якої буде побудовано PostGIS.
--with-xml2config=FILELibXML — це бібліотека, необхідна для виконання процесів GeomFromKML/GML. Зазвичай вона знаходиться, якщо у вас встановлено libxml, але якщо її немає або ви хочете використовувати конкретну версію, вам потрібно вказати PostGIS на конкретний файл конфігурації xml2-config, щоб програмне забезпечення могло знайти каталог установки LibXML. Використовуйте цей параметр (>--with-xml2config=/path/to/xml2-config), щоб вручну вказати конкретну інсталяцію LibXML, на основі якої буде побудовано PostGIS.
--with-projdir=DIRProj — це бібліотека перепроекції, необхідна для PostGIS. Використовуйте цей параметр (--with-projdir=/path/to/projdir), щоб вручну вказати конкретний каталог інсталяції Proj, на основі якого буде побудовано PostGIS.
--with-libiconv=DIRКаталог, в якому встановлено iconv.
--with-jsondir=DIRJSON-C — це бібліотека JSON з ліцензією MIT, необхідна для підтримки PostGIS ST_GeomFromJSON. Використовуйте цей параметр (--with-jsondir=/path/to/jsondir), щоб вручну вказати конкретний каталог інсталяції JSON-C, на основі якого буде побудовано PostGIS.
--with-guiСкомпілюйте графічний інтерфейс імпорту даних (потрібен GTK+2.0). Це створить графічний інтерфейс shp2pgsql-gui для shp2pgsql.
--without-rasterСкомпілюйте без підтримки растрових зображень.
--without-topologyКомпілювати без підтримки топології.
--with-gettext=noЗа замовчуванням PostGIS спробує виявити підтримку gettext і скомпілювати з нею, однак якщо ви зіткнетеся з проблемами несумісності, які спричиняють порушення роботи завантажувача, ви можете повністю вимкнути її за допомогою цієї команди. Дивіться квиток http://trac.osgeo.org/postgis/ticket/748 для прикладу проблеми, вирішеної за допомогою цієї конфігурації. ПРИМІТКА: ви нічого не втратите, вимкнувши цю опцію. Вона використовується для підтримки міжнародної довідки/міток для завантажувача GUI, яка ще не задокументована і все ще є експериментальною.
--with-sfcgal=PATHЗа замовчуванням PostGIS не встановлюється з підтримкою sfcgal без цього параметра. PATH — це необов'язковий аргумент, який дозволяє вказати альтернативний шлях до sfcgal-config.
--without-phony-revisionВимкнути оновлення postgis_revision.h, щоб відповідати поточній версії HEAD репозиторію git.
![]() | |
Якщо ви отримали PostGIS з репозиторію коду , першим кроком є запуск скрипта |
./autogen.sh
Цей скрипт створить скрипт configure, який, у свою чергу, використовується для налаштування встановлення PostGIS.
Якщо ви отримали PostGIS у вигляді архіву tar, запускати ./autogen.sh не потрібно, оскільки configure вже було згенеровано.
Після створення Makefile, збірка PostGIS зводиться до виконання команди
make
[last line of output] PostGIS was built successfully. Ready to install.
Усі функції мають коментарі, згенеровані з документації. Якщо ви бажаєте пізніше встановити ці коментарі у свої просторові бази даних, виконайте команду, яка вимагає docbook. Файли postgis_comments.sql та інші файли коментарів пакета також упаковані у дистрибутив tar.gz у папці doc, тому немає потреби створювати коментарі, якщо ви встановлюєте з tar-архіву. Коментарі також включені як частина інсталяції CREATE EXTENSION.
make comments
The make cheatsheets target generates html cheat sheets suitable for quick reference or for student handouts. This requires xsltproc to build and will generate 4 files in doc folder topology_cheatsheet.html, raster_cheatsheet.html, postgis_cheatsheet.html
Ви можете завантажити готові приклади у форматі html та pdf з Посібників з PostGIS / PostgreSQL
make cheatsheets
Розширення PostGIS створюються та встановлюються автоматично, якщо доступна підтримка розширень PostgreSQL.
Якщо ви компілюєте з репозиторію вихідного коду, спочатку потрібно скомпілювати описи функцій. Вони компілюються, якщо у вас встановлено docbook. Ви також можете скомпілювати їх вручну за допомогою команди:
make comments
Створювати коментарі не потрібно, якщо ви створюєте з архіву tar, оскільки вони вже попередньо вбудовані в архів tar.
Розширення повинні автоматично створюватися в рамках процесу make install. При необхідності ви можете створити їх з папок розширень або скопіювати файли, якщо вони потрібні вам на іншому сервері.
Set PGUSER if you need to override the psql connection user, then test before installing. After installation, run the extension regression tests.
cd extensions cd postgis make clean make export PGUSER=postgres make check make install make check RUNTESTFLAGS=--extension
![]() | |
|
Файли розширення завжди будуть однаковими для однієї версії PostGIS і PostgreSQL незалежно від ОС, тому можна копіювати файли розширення з однієї ОС на іншу, якщо на ваших серверах вже встановлено бінарні файли PostGIS.
Якщо ви хочете встановити розширення вручну на окремому сервері, відмінному від вашого сервера розробки, вам потрібно скопіювати наступні файли з папки розширень у папку PostgreSQL / share / extension вашої інсталяції PostgreSQL, а також необхідні бінарні файли для звичайного PostGIS, якщо вони ще не встановлені на сервері.
Це контрольні файли, які містять таку інформацію, як версія розширення, яке потрібно встановити, якщо вона не вказана. postgis.control, postgis_topology.control.
Усі файли в папці /sql кожного розширення. Зверніть увагу, що їх потрібно скопіювати в корінь папки PostgreSQL share/extension 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%' ORDER BY name;
┌──────────────────┬─────────────────┬───────────────────┐ │ name │ default_version │ installed_version │ ├──────────────────┼─────────────────┼───────────────────┤ │ postgis │ 3.7.0beta1 │ 3.7.0beta1 │ │ postgis_raster │ 3.7.0beta1 │ 3.7.0beta1 │ │ postgis_sfcgal │ 3.7.0beta1 │ │ │ postgis_topology │ 3.7.0beta1 │ │ └──────────────────┴─────────────────┴───────────────────┘
Якщо розширення встановлено в базі даних, яку ви запитуєте, ви побачите згадку в стовпці installed_version. Якщо ви не отримали жодних записів, це означає, що на сервері взагалі не встановлено розширень postgis. PgAdmin III 1.14+ також надасть цю інформацію в розділі extensions дерева браузера бази даних і навіть дозволить оновити або видалити розширення, клацнувши правою кнопкою миші.
Якщо у вас доступні розширення, ви можете встановити розширення postgis у вибраній базі даних за допомогою інтерфейсу розширення pgAdmin або виконавши такі команди sql:
CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; CREATE EXTENSION postgis_sfcgal; CREATE EXTENSION postgis_topology;
У psql ви можете переглянути, які версії ви встановили, а також, в якій схемі вони встановлені.
\connect mygisdb \x \dx postgis*
List of installed extensions ┌─[ RECORD 1 ]────────────────────────────────────────────────┐ │ Name │ postgis │ │ Version │ 3.7.0beta1 │ │ Schema │ public │ │ Description │ PostGIS geometry, geography, and raster… │ ├─[ RECORD 2 ]────────────────────────────────────────────────┤ │ Name │ postgis_raster │ │ Version │ 3.7.0beta1 │ │ Schema │ public │ │ Description │ PostGIS raster types and functions │ ├─[ RECORD 3 ]────────────────────────────────────────────────┤ │ Name │ postgis_topology │ │ Version │ 3.7.0beta1 │ │ Schema │ topology │ │ Description │ PostGIS topology spatial types and functions │ └─────────────────────────────────────────────────────────────┘
![]() | |
Розширені таблиці |
Якщо ви встановили 3.7.0beta1 без використання нашої чудової системи розширень, ви можете змінити його на розширення, виконавши наведені нижче команди, щоб упакувати функції у відповідні розширення. Встановлення за допомогою `unpackaged` було видалено в PostgreSQL 13, тому перед оновленням до PostgreSQL 13 рекомендується перейти на збірку розширення.
CREATE EXTENSION postgis FROM unpackaged; CREATE EXTENSION postgis_raster FROM unpackaged; CREATE EXTENSION postgis_topology FROM unpackaged;
Якщо ви бажаєте протестувати збірку PostGIS, запустіть
make check
Вищезазначена команда виконає різні перевірки та регресійні тести, використовуючи створену бібліотеку та реальну базу даних PostgreSQL.
![]() | |
Якщо ви налаштували PostGIS, використовуючи нестандартні розташування PostgreSQL, GEOS або Proj, можливо, вам доведеться додати розташування їхніх бібліотек до змінної середовища |
![]() | |
Наразі команда make check під час виконання перевірок використовує змінні середовища |
![]() | |
Сандбоксні облікові записи, які не є суперкористувачами PostgreSQL, можуть делегувати права власності на базу даних під час циклу регресії, експортуючи Ці змінні дозволяють автоматизованим середовищам виконувати повні шляхи оновлення та встановлення розширень без підвищення облікового запису, що викликає, до суперкористувача, за умови, що цільовий екземпляр PostgreSQL дозволяє встановлення розширень цими делегованими ролями. |
Якщо все пройде успішно, команда 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результат повинен виглядати так:
============== dropping database "contrib_regression" ============== DROP DATABASE ============== creating database "contrib_regression" ============== CREATE DATABASE ALTER DATABASE ============== installing fuzzystrmatch ============== CREATE EXTENSION ============== installing postgis ============== CREATE EXTENSION ============== running regression test queries ============== test test-normalize_address ... ok ===================== All 2 tests passed. =====================
Щоб встановити PostGIS, введіть
make install
Це скопіює файли інсталяції PostGIS у відповідний підкаталог, вказаний параметром конфігурації --prefix. Зокрема:
Бінарні файли завантажувача та вивантажувача встановлюються в [prefix]/bin.
Файли SQL, такі як postgis.sql, встановлюються в [prefix]/share/contrib.
Бібліотеки PostGIS встановлюються в [prefix]/lib.
Якщо ви раніше запустили команду make comments для створення файлів postgis_comments.sql та raster_comments.sql, встановіть файл sql, виконавши команду
make comments-install
![]() | |
|
Якщо установка або оновлення не відбуваються так, як ви очікували, слід перевірити кілька речей.
PostgreSQL version mismatch.
Переконайтеся, що ви встановили PostgreSQL 14 або новішу версію, і що ви компілюєте з тією ж версією вихідного коду PostgreSQL, що і версія PostgreSQL, яка працює. Плутанина може виникнути, якщо у вашому дистрибутиві (Linux) вже встановлено PostgreSQL або ви раніше встановлювали PostgreSQL і забули про це. PostGIS працюватиме лише з PostgreSQL 14 або новішою версією, а використання старішої версії призведе до появи дивних, несподіваних повідомлень про помилки. Щоб перевірити версію PostgreSQL, що працює, під’єднайтеся до бази даних за допомогою psql і виконайте цей запит:
SELECT version();
If you are running an RPM based distribution, you can check for the existence of pre-installed packages using the rpm command as follows:
rpm -qa | grep postgresql
Restoring an upgrade into a database without PostGIS.
Якщо оновлення не вдалося, переконайтеся, що ви відновлюєте дані в базу, в якій вже встановлено PostGIS.
SELECT PostGIS_Full_Version();
Також перевірте, чи конфігуратор правильно визначив розташування та версію PostgreSQL, бібліотеки Proj та бібліотеки GEOS.
Вихідні дані команди configure використовуються для створення файлу postgis_config.h. Перевірте, чи правильно встановлено змінні POSTGIS_PGSQL_VERSION, POSTGIS_PROJ_VERSION та POSTGIS_GEOS_VERSION.
Налаштування продуктивності PostGIS дуже схоже на налаштування будь-якого робочого навантаження PostgreSQL. Єдиним додатковим моментом, який слід врахувати, є те, що геометрії та растри зазвичай мають великий розмір, тому оптимізації, пов'язані з пам'яттю, зазвичай мають більший вплив на PostGIS, ніж на інші типи запитів PostgreSQL.
Загальні відомості про оптимізацію PostgreSQL див. у розділі Налаштування сервера PostgreSQL.
Конфігурацію PostgreSQL можна налаштувати на рівні сервера, не торкаючись файлів postgresql.conf або postgresql.auto.conf, за допомогою команди ALTER SYSTEM.
Set work_mem, reload the configuration so new connections use the change, and display the current value. Use SHOW ALL to list all settings.
ALTER SYSTEM SET work_mem = '256MB'; SELECT pg_reload_conf(); SHOW work_mem;
Окрім налаштувань Postgres, PostGIS має деякі власні налаштування, які перелічені в Розділ 7.22, «Великі уніфіковані змінні (GUC)».
Ці налаштування конфігуруються в postgresql.conf:
За замовчуванням: partition
Зазвичай використовується для розділення таблиць. За замовчуванням "partition" змушує планувальник аналізувати таблиці на предмет обмежень тільки в тому випадку, якщо вони знаходяться в успадкованій ієрархії, і дозволяє уникнути штрафних санкцій планувальника в інших випадках.
За замовчуванням: ~128 МБ
Встановіть приблизно 25% до 40% доступної оперативної пам'яті. У Windows ви не зможете встановити таке високе значення.
max_worker_processes контролює максимальну кількість фонових процесів, доступних для сервера, і, отже, також обмежує кількість працівників, які можуть брати участь у паралельних запитах.
За замовчуванням: 8
Встановлює максимальну кількість фонових процесів, які може підтримувати система. Цей параметр можна встановити тільки під час запуску сервера.
work_mem - встановлює розмір пам'яті, що використовується для операцій сортування та складних запитів
За замовчуванням: 1-4 МБ
Налаштуйте для великих баз даних, складних запитів, великого обсягу оперативної пам'яті
Зменште налаштування для великої кількості одночасних користувачів або малої оперативної пам'яті.
Якщо у вас багато оперативної пам'яті і мало розробників:
SET work_mem TO '256MB';
maintenance_work_mem - розмір пам'яті, що використовується для VACUUM, CREATE INDEX тощо.
За замовчуванням: 16-64 МБ
Зазвичай занадто низький - блокує введення-виведення, блокує об'єкти під час обміну пам'яттю
Рекомендуємо від 32 МБ до 1 ГБ на виробничих серверах з великим об'ємом оперативної пам'яті, але це залежить від кількості одночасних користувачів. Якщо у вас багато оперативної пам'яті і мало розробників:
SET maintenance_work_mem TO '1GB';
max_parallel_workers_per_gather
Підтримка паралельних запитів у сучасних PostgreSQL та PostGIS використовує це налаштування для визначення кількості робочих процесів, які може вимагати план. Якщо значення встановлено вище 0, то деякі запити, наприклад ті, що містять функції відношення, такі як ST_Intersects, можуть використовувати кілька процесів і при цьому працювати удвічі швидше. Якщо у вас є багато вільних процесорів, вам слід змінити значення цього параметра на кількість процесорів, які у вас є. Також переконайтеся, що значення max_worker_processes збільшено принаймні до цього числа.
За замовчуванням: 0
Встановлює максимальну кількість воркерів, які може запустити один вузол Gather. Паралельні воркери беруться з пулу процесів, створеного параметром max_worker_processes. Зауважте, що запитувана кількість воркерів може бути недоступною під час виконання. Якщо це станеться, план виконання буде працювати з меншою кількістю воркерів, ніж очікувалося, що може призвести до неефективності. Встановлення цього значення в 0, що є значенням за замовчуванням, вимикає виконання паралельних запитів.
Якщо ви увімкнули підтримку растрів, ви можете прочитати нижче, як правильно її налаштувати.
Растери поза базою даних та всі драйвери растерів за замовчуванням вимкнені. Щоб знову ввімкнути їх, потрібно встановити такі змінні середовища POSTGIS_GDAL_ENABLED_DRIVERS та POSTGIS_ENABLE_OUTDB_RASTERS у середовищі сервера. Ви також можете використовувати більш міжплатформний підхід, встановивши відповідний Розділ 7.22, «Великі уніфіковані змінні (GUC)».
Якщо ви хочете увімкнути офлайн-растр:
POSTGIS_ENABLE_OUTDB_RASTERS=1
Будь-який інший параметр або відсутність параметра взагалі вимкне растри з db.
Щоб увімкнути всі драйвери GDAL, доступні у вашому встановленні GDAL, встановіть цю змінну оточення наступним чином
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
Якщо ви хочете увімкнути лише певні драйвери, налаштуйте змінну оточення наступним чином:
POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
![]() | |
Якщо ви використовуєте Windows не беріть перелік драйверів в лапки |
Налаштування змінних середовища залежить від операційної системи. Для PostgreSQL, встановленого на Ubuntu або Debian за допомогою apt-postgresql, найкращим способом є редагування файлу /etc/postgresql/, де замінні символи позначають основну версію PostgreSQL та ім'я кластера.MAJOR/CLUSTER/environment
У Windows, якщо ви запускаєте службу, ви можете встановити системні змінні, до яких у Windows 7 можна потрапити, клацнувши правою кнопкою миші на Компʼютер - Властивості - Додаткові параметри системи або в провіднику перейшовши до Панель керування\Всі елементи панелі керування\Система. Потім натисніть Додаткові системні налаштування ->Додаткові ->Змінні середовища і додайте нові системні змінні.
Після того, як ви встановите змінні оточення, вам потрібно буде перезапустити службу PostgreSQL, щоб зміни набули чинності.
Якщо ви скомпілювали та встановили модулі extensions/postgis, ви можете перетворити базу даних на просторову за допомогою механізму EXTENSION.
Основне розширення PostGIS включає геометрію, географію, spatial_ref_sys та всі функції і коментарі. Растр і топологія упаковані як окреме розширення.
Виконайте наступний фрагмент SQL-коду в базі даних, яку ви хочете активувати просторове розширення:
CREATE EXTENSION IF NOT EXISTS plpgsql; CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; -- OPTIONAL CREATE EXTENSION postgis_topology; -- OPTIONAL
![]() | |
Зазвичай це потрібно лише в тому випадку, якщо ви не можете або не хочете встановлювати PostGIS у каталозі розширень PostgreSQL (наприклад, під час тестування, розробки або в обмеженому середовищі). |
Додавання об'єктів PostGIS та визначень функцій до вашої бази даних здійснюється шляхом завантаження різних файлів sql, розташованих у [prefix]/share/contrib, як зазначено під час фази побудови.
Основні об'єкти PostGIS (типи геометрії та географії, а також функції їх підтримки) містяться у скрипті postgis.sql. Растрові об'єкти містяться у скрипті rtpostgis.sql. Топологічні об'єкти містяться у скрипті topology.sql.
Для отримання повного набору ідентифікаторів визначення системи координат EPSG ви також можете завантажити файл визначень spatial_ref_sys.sql і заповнити таблицю spatial_ref_sys. Це дозволить вам виконувати операції ST_Transform() над геометріями.
Якщо ви бажаєте додати коментарі до функцій PostGIS, ви можете знайти їх у скрипті postgis_comments.sql. Коментарі можна переглянути, просто ввівши \dd [function_name] у вікні терміналу psql.
Виконайте наступні команди Shell у терміналі:
DB=[yourdatabase]
SCRIPTSDIR=`pg_config --sharedir`/contrib/postgis-3.6/
# 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 надає процедуру SOFT UPGRADE для незначних випусків або випусків з виправленням помилок, а також процедуру HARD UPGRADE для основних випусків.
Перед тим, як спробувати оновити PostGIS, завжди варто зробити резервну копію ваших даних. Якщо ви використовуєте прапор -Fc для pg_dump, ви завжди зможете відновити дамп за допомогою HARD UPGRADE.
Якщо ви встановили базу даних за допомогою розширень, вам також потрібно буде оновити її за допомогою моделі розширень. Якщо ви встановили базу даних за допомогою старого скрипту sql, рекомендуємо перейти на розширення, оскільки скрипт більше не підтримується.
Якщо ви спочатку встановили PostGIS з розширеннями, то вам потрібно також оновити розширення. Незначне оновлення з розширеннями є досить простим.
Використовуйте функцію PostGIS_Extensions_Upgrade для оновлення до останньої версії, яку ви встановили.
SELECT postgis_extensions_upgrade();
Якщо ви оновлюєте базу даних, яка все ще працює на PostGIS 2.5, виконайте команду ALTER EXTENSION, а потім postgis_extensions_upgrade(), щоб переконатися, що застарілі об'єкти postgis_raster повернуті в основне розширення.
ALTER EXTENSION postgis UPDATE; SELECT postgis_extensions_upgrade();
This second call is needed to rebundle the postgis_raster extension.
SELECT postgis_extensions_upgrade();
Якщо у вас встановлено кілька версій PostGIS і ви не хочете оновлювати їх до останньої версії, ви можете явно вказати версію наступним чином:
ALTER EXTENSION postgis UPDATE TO "3.7.0beta1"; ALTER EXTENSION postgis_topology UPDATE TO "3.7.0beta1";
Якщо ви отримаєте повідомлення про помилку, схоже на таке:
No migration path defined for … to 3.7.0beta1
Потім вам потрібно буде створити резервну копію вашої бази даних, створити нову, як описано в Розділ 3.3.1, «Активувати просторове розширення в базі данних за допомогою EXTENSION», а потім відновити резервну копію на цій новій базі даних.
Якщо ви отримаєте таке повідомлення:
Version "3.7.0beta1" of extension "postgis" is already installed
Тоді все вже оновлено і ви можете сміливо ігнорувати це. ЗА ВИНЯТКОМ випадків, коли ви намагаєтеся оновити версію з розробницької до наступної (яка не отримує нового номера версії); в цьому випадку ви можете додати "next" до рядка версії, а наступного разу вам потрібно буде знову видалити суфікс "next":
ALTER EXTENSION postgis UPDATE TO "3.7.0beta1next";
ALTER EXTENSION postgis_topology UPDATE TO "3.7.0beta1next";![]() | |
Якщо ви спочатку встановили PostGIS без вказання версії, то часто можна пропустити перевстановлення розширення postgis перед відновленням, оскільки резервна копія містить лише |
![]() | |
If you are upgrading PostGIS extension from a version prior to 3.0.0, you will have a new extension postgis_raster which you can safely drop, if you don't need raster support. |
DROP EXTENSION postgis_raster;
Розширення є підтримуваним методом інсталяції для багатьох версій. Якщо ви все ще використовуєте інсталяцію без пакетів, виконайте ЖОРСТКЕ ОНОВЛЕННЯ у базу даних, створену за допомогою розширень, і перенесіть туди свої дані.
Під HARD UPGRADE ми маємо на увазі повне скидання/перезавантаження баз даних з підтримкою PostGIS. HARD UPGRADE необхідний, коли змінюється внутрішнє зберігання об'єктів PostGIS або коли SOFT UPGRADE неможливий. У додатку Release Notes для кожної версії вказано, чи потрібно для оновлення виконувати скидання/перезавантаження (HARD UPGRADE).
The dump/reload process is assisted by the postgis_restore script which takes care of skipping from the dump all definitions which belong to PostGIS (including old ones), allowing you to restore your schemas and data into a database with PostGIS installed without getting duplicate symbol errors or bringing forward deprecated objects.
Додаткові інструкції для користувачів Windows доступні за посиланням Windows Hard upgrade.
Процедура виглядає наступним чином:
Створіть дамп бази даних, яку ви хочете оновити, у "власному форматі" (назвемо його olddb), включіть бінарні блоки (-b) та детальний вивід (-v). Користувач може бути власником бази даних, не обов'язково мати супер-акаунт postgres.
pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
Виконайте нову інсталяцію PostGIS у новій базі даних — ми будемо називати цю базу даних newdb. Інструкції щодо виконання цієї операції див. у розділах Розділ 3.3.2, «Активувати просторове розширення бази даних без використання EXTENSION (не рекомендується)» та Розділ 3.3.1, «Активувати просторове розширення в базі данних за допомогою EXTENSION».
Записи spatial_ref_sys, знайдені у вашому дампі, будуть відновлені, але вони не замінять існуючі записи в spatial_ref_sys. Це зроблено для того, щоб виправлення в офіційному наборі були правильно передані до відновлених баз даних. Якщо з якоїсь причини ви дійсно хочете замінити стандартні записи своїми власними, просто не завантажуйте файл spatial_ref_sys.sql під час створення нової бази даних.
Якщо ваша база даних дуже стара або ви знаєте, що використовуєте давно застарілі функції у своїх представлень та функціях, можливо, вам доведеться завантажити legacy.sql, щоб усі ваші функції, представлень тощо знову працювали належним чином. Робіть це лише у разі _реальної_ необхідності. Якщо можливо, замість цього розгляньте можливість оновлення своїх представлень та функцій перед вивантаженням. Застарілі функції можна пізніше видалити, завантаживши uninstall_legacy.sql.
Відновіть резервну копію у новій базі даних newdb за допомогою postgis_restore. Несподівані помилки, якщо такі будуть, будуть виведені psql у стандартний потік помилок. Зберігайте їх у журналі.
postgis_restore "/somepath/olddb.backup" | psql -h localhost -p 5432 -U postgres newdb 2> errors.txt
Помилки можуть виникати в таких випадках:
Деякі з ваших представлень або функцій використовують застарілі об'єкти PostGIS. Щоб виправити це, ви можете спробувати завантажити скрипт legacy.sql перед відновленням або вам доведеться відновити версію PostGIS, яка все ще містить ці об'єкти, і спробувати міграцію знову після перенесення вашого коду. Якщо спосіб legacy.sql працює для вас, не забудьте виправити свій код, щоб припинити використання застарілих функцій, і видалити їх, завантаживши uninstall_legacy.sql.
Деякі користувацькі записи spatial_ref_sys у файлі дампа мають недійсне значення SRID. Дійсні значення SRID більші за 0 і менші за 999000. Значення в діапазоні 999000.999999 зарезервовані для внутрішнього використання, а значення > 999999 не можуть використовуватися взагалі. Усі ваші користувацькі записи з недійсними SRID будуть збережені, а ті, що > 999999, будуть переміщені в зарезервований діапазон, але таблиця spatial_ref_sys втратить обмеження перевірки, що захищає цю інваріантність, а також, можливо, і свій первинний ключ (коли кілька недійсних SRID перетворюються на одне й те саме зарезервоване значення SRID).
Щоб виправити цю ситуацію, слід скопіювати власний SRS до SRID із дійсним значенням (можливо, в діапазоні 910000..910999), перетворити всі таблиці на новий srid (див. UpdateGeometrySRID), видалити недійсний запис із spatial_ref_sys і повторно створити перевірку (перевірки) за допомогою:
ALTER TABLE spatial_ref_sys ADD CONSTRAINT spatial_ref_sys_srid_check check (srid > 0 AND srid < 999000 );
ALTER TABLE spatial_ref_sys ADD PRIMARY KEY(srid));
Якщо ви оновлюєте стару базу даних, що містить французьку IGN картографію, у вас, ймовірно, будуть SRID поза діапазоном, і під час імпортування бази даних ви побачите такі проблеми:
WARNING: SRID 310642222 converted to 999175 (in reserved zone)
У цьому випадку ви можете спробувати виконати наступні кроки: спочатку повністю видаліть IGN із sql, що є результатом postgis_restore. Отже, після виконання:
postgis_restore "/somepath/olddb.backup" > olddb.sql
виконайте цю команду:
grep -v IGNF olddb.sql > olddb-without-IGN.sql
Create your newdb, activate the required PostGIS extensions, and insert the French IGN spatial reference definitions using this script. After these operations, import your data:
psql -h localhost -p 5432 -U postgres -d newdb -f olddb-without-IGN.sql 2> errors.txt
The Open Geospatial Consortium (OGC) developed the Simple Features Access standard (SFA) to provide a model for geospatial data. It defines the fundamental spatial type of Geometry, along with operations which manipulate and transform geometry values to perform spatial analysis tasks. PostGIS implements the OGC Geometry model as the PostgreSQL data types geometry and geography.
Geometry is an abstract type. Geometry values belong to one of its concrete subtypes which represent various kinds and dimensions of geometric shapes. These include the atomic types Point, LineString, LinearRing and Polygon, and the collection types MultiPoint, MultiLineString, MultiPolygon and GeometryCollection. The Simple Features Access - Part 1: Common architecture v1.2.1 adds subtypes for the structures PolyhedralSurface, Triangle and TIN.
Geometry models shapes in the 2-dimensional Cartesian plane. The PolyhedralSurface, Triangle, and TIN types can also represent shapes in 3-dimensional space. The size and location of shapes are specified by their coordinates. Each coordinate has a X and Y ordinate value determining its location in the plane. Shapes are constructed from points or line segments, with points specified by a single coordinate, and line segments by two coordinates.
Coordinates may contain optional Z and M ordinate values. The Z ordinate is often used to represent elevation. The M ordinate contains a measure value, which may represent time or distance. If Z or M values are present in a geometry value, they must be defined for each point in the geometry. If a geometry has Z or M ordinates the coordinate dimension is 3D; if it has both Z and M the coordinate dimension is 4D. The coordinate dimension is at least 2, because every geometry has at least X and Y coordinates.
Geometry values are associated with a spatial reference system indicating the coordinate system in which it is embedded. The spatial reference system is identified by the geometry SRID number. The units of the X and Y axes are determined by the spatial reference system. In planar reference systems the X and Y coordinates typically represent easting and northing, while in geodetic systems they represent longitude and latitude. SRID 0 represents an infinite Cartesian plane with no units assigned to its axes. See Розділ 4.5, «Spatial Reference Systems».
The geometry dimension is a property of geometry types. Point types have dimension 0, linear types have dimension 1, polygonal types have dimension 2, and solid types have dimension 3. Collections have the dimension of the maximum element dimension.
A geometry value may be empty. Empty values contain no vertices (for atomic geometry types) or no elements (for collections).
An important property of geometry values is their spatial extent or bounding box, which the OGC model calls envelope. This is the 2 or 3-dimensional box which encloses the coordinates of a geometry. It is an efficient way to represent a geometry's extent in coordinate space and to check whether two geometries interact.
The geometry model allows evaluating topological spatial relationships as described in Розділ 5.1.1, «Dimensionally Extended 9-Intersection Model». To support this the concepts of interior, boundary and exterior are defined for each geometry type. Geometries are topologically closed, so they always contain their boundary. The boundary is a geometry of dimension one less than that of the geometry itself. For example, the boundary of a Polygon is its rings (LineStrings), the boundary of a LineString is its endpoints (Points), and the boundary of a Point is empty.
The OGC geometry model defines validity rules for each geometry type. These rules ensure that geometry values represents realistic situations (e.g. it is possible to specify a polygon with a hole lying outside its shell, but this makes no sense geometrically and is thus invalid). PostGIS also allows storing and manipulating invalid geometry values. This allows detecting and fixing them if needed. See Розділ 4.4, «Перевірка геометрії»
A Point is a 0-dimensional geometry that represents a single location in coordinate space.
POINT (1 2) POINT Z (1 2 3) POINT ZM (1 2 3 4)
A LineString is a 1-dimensional line formed by a contiguous sequence of line segments. Each line segment is defined by two points, with the end point of one segment forming the start point of the next segment. An OGC-valid LineString has either zero or two or more points, but PostGIS also allows single-point LineStrings. LineStrings may cross themselves (self-intersect). A LineString is closed if the start and end points are the same. A LineString is simple if it does not self-intersect.
LINESTRING (1 2, 3 4, 5 6)
A LinearRing is a LineString which is both closed and simple. The first and last points must be equal, and the line must not self-intersect.
LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
A Polygon is a 2-dimensional planar region, delimited by an exterior boundary (the shell) and zero or more interior boundaries (holes). Each boundary is a LinearRing.
POLYGON ((0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0), (1 1 0, 2 1 0, 2 2 0, 1 2 0, 1 1 0))
A MultiPoint is a collection of Points.
MULTIPOINT ( (0 0), (1 2) )
A MultiLineString is a collection of LineStrings. A MultiLineString is closed if each of its elements is closed.
MULTILINESTRING ( (0 0, 1 1, 1 2), (2 3, 3 2, 5 4) )
A MultiPolygon is a collection of non-overlapping, non-adjacent Polygons. Polygons in the collection may touch only at a finite number of points. (Two polygons are adjacent if they share an edge. They touch if they share only points or edges on their boundaries). For more details on MultiPolygon validity, see Розділ 4.4, «Перевірка геометрії».
MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5)))
A GeometryCollection is a heterogeneous (mixed) collection of geometries.
GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4))
A PolyhedralSurface is a contiguous collection of patches or facets which share some edges. Each patch is a planar Polygon. If the Polygon coordinates have Z ordinates then the surface is 3-dimensional.
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)) )
A Triangle is a polygon defined by three distinct non-collinear vertices. Because a Triangle is a polygon it is specified by four coordinates, with the first and fourth being equal.
TRIANGLE ((0 0, 0 9, 9 0, 0 0))
A TIN is a collection of non-overlapping Triangles representing a Triangulated Irregular Network.
TIN Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
The ISO/IEC 13249-3 SQL Multimedia - Spatial standard (SQL/MM) extends the OGC SFA to define Geometry subtypes containing curves with circular arcs. The SQL/MM types support 3DM, 3DZ and 4D coordinates.
![]() | |
All floating point comparisons within the SQL-MM implementation are performed to a specified tolerance, currently 1E-8. |
CircularString is the basic curve type, similar to a LineString in the linear world. A single arc segment is specified by three points: the start and end points (first and third) and some other point on the arc. To specify a closed circle the start and end points are the same and the middle point is the opposite point on the circle diameter (which is the center of the arc). In a sequence of arcs the end point of the previous arc is the start point of the next arc, just like the segments of a LineString. This means that a CircularString must have an odd number of points greater than 1.
CIRCULARSTRING(0 0, 1 1, 1 0) CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
A CompoundCurve is a single continuous curve that may contain both circular arc segments and linear segments. That means that in addition to having well-formed components, the end point of every component (except the last) must be coincident with the start point of the following component.
COMPOUNDCURVE( CIRCULARSTRING(0 0, 1 1, 1 0), (1 0, 0 1))
A CurvePolygon is like a polygon, with an outer ring and zero or more inner rings. The difference is that a ring can be a CircularString or CompoundCurve as well as a LineString.
As of PostGIS 1.4 PostGIS supports compound curves in a curve polygon.
CURVEPOLYGON( CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1) )
Example: A CurvePolygon with the shell defined by a CompoundCurve containing a CircularString and a LineString, and a hole defined by a 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) )A MultiCurve is a collection of curves which can include LineStrings, CircularStrings or CompoundCurves.
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4))
A MultiSurface is a collection of surfaces, which can be (linear) Polygons or CurvePolygons.
MULTISURFACE( CURVEPOLYGON( CIRCULARSTRING( 0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1)), ((10 10, 14 12, 11 10, 10 10), (11 11, 11.5 11, 11 11.5, 11 11)))
The OGC SFA specification defines two formats for representing geometry values for external use: Well-Known Text (WKT) and Well-Known Binary (WKB). Both WKT and WKB include information about the type of the object and the coordinates which define it.
Well-Known Text (WKT) provides a standard textual representation of spatial data. Examples of WKT representations of spatial objects are:
POINT(0 0)
POINT Z (0 0 0)
POINT ZM (0 0 0 0)
POINT EMPTY
LINESTRING(0 0,1 1,1 2)
LINESTRING EMPTY
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT((0 0),(1 2))
MULTIPOINT Z ((0 0 0),(1 2 3))
MULTIPOINT EMPTY
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3), LINESTRING(2 3,3 4))
GEOMETRYCOLLECTION EMPTY
Input and output of WKT is provided by the functions ST_AsText and ST_GeomFromText:
text WKT = geometry; geometry = ST_GeomFromText(text WKT, SRID);
For example, a statement to create and insert a spatial object from WKT with SRID 312 is:
INSERT INTO geotable ( geom, name )
VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');Well-Known Binary (WKB) provides a portable, full-precision representation of spatial data as binary data (arrays of bytes). Examples of the WKB representations of spatial objects are:
WKT: POINT(1 1)
WKB: 0101000000000000000000F03F000000000000F03
WKT: LINESTRING (2 2, 9 9)
WKB: 0102000000020000000000000000000040000000000000004000000000000022400000000000002240
Input and output of WKB is provided by the functions ST_AsBinary and ST_GeomFromWKB:
bytea WKB = ST_AsBinary(geometry); geometry = ST_GeomFromWKB(bytea WKB, SRID);
For example, a statement to create and insert a spatial object from WKB is:
INSERT INTO geotable ( geom, name )
VALUES ( ST_GeomFromWKB('\x0101000000000000000000f03f000000000000f03f', 312), 'A Place');PostGIS implements the OGC Simple Features model by defining a PostgreSQL data type called geometry. It represents all of the geometry subtypes by using an internal type code (see GeometryType and ST_GeometryType). This allows modelling spatial features as rows of tables defined with a column of type geometry.
The geometry data type is opaque, which means that all access is done via invoking functions on geometry values. Functions allow creating geometry objects, accessing or updating all internal fields, and computing new geometry values. PostGIS supports all the functions specified in the OGC Simple feature access - Part 2: SQL option (SFS) specification, as well many others. See Розділ 7, Довідка PostGIS for the full list of functions.
![]() | |
PostGIS follows the SFA standard by prefixing spatial functions with "ST_". This was intended to stand for "Spatial and Temporal", but the temporal part of the standard was never developed. Instead it can be interpreted as "Spatial Type". |
The SFA standard specifies that spatial objects include a Spatial Reference System identifier (SRID). The SRID is required when creating spatial objects for insertion into the database (it may be defaulted to 0). See ST_SRID and Розділ 4.5, «Spatial Reference Systems»
To make querying geometry efficient PostGIS defines various kinds of spatial indexes, and spatial operators to use them. See Розділ 4.9, «Spatial Indexes» and Розділ 5.2, «Using Spatial Indexes» for details.
OGC SFA specifications initially supported only 2D geometries, and the geometry SRID is not included in the input/output representations. The OGC SFA specification 1.2.1 (which aligns with the ISO 19125 standard) adds support for 3D (ZYZ) and measured (XYM and XYZM) coordinates, but still does not include the SRID value.
Because of these limitations PostGIS defined extended EWKB and EWKT formats. They provide 3D (XYZ and XYM) and 4D (XYZM) coordinate support and include SRID information. Including all geometry information allows PostGIS to use EWKB as the format of record (e.g. in DUMP files).
EWKB and EWKT are used for the "canonical forms" of PostGIS data objects. For input, the canonical form for binary data is EWKB, and for text data either EWKB or EWKT is accepted. This allows geometry values to be created by casting a text value in either HEXEWKB or EWKT to a geometry value using ::geometry. For output, the canonical form for binary is EWKB, and for text it is HEXEWKB (hex-encoded EWKB).
For example this statement creates a geometry by casting from an EWKT text value, and outputs it using the canonical form of HEXEWKB:
SELECT 'SRID=4;POINT(0 0)'::geometry;
geometry ---------------------------------------------------- 01010000200400000000000000000000000000000000000000
PostGIS EWKT output has a few differences to OGC WKT:
For 3DZ geometries the Z qualifier is omitted:
OGC: POINT Z (1 2 3)
EWKT: POINT (1 2 3)
For 3DM geometries the M qualifier is included:
OGC: POINT M (1 2 3)
EWKT: POINTM (1 2 3)
For 4D geometries the ZM qualifier is omitted:
OGC: POINT ZM (1 2 3 4)
EWKT: POINT (1 2 3 4)
EWKT avoids over-specifying dimensionality and the inconsistencies that can occur with the OGC/ISO format, such as:
POINT ZM (1 1)
POINT ZM (1 1 1)
POINT (1 1 1 1)
![]() | |
PostGIS extended formats are currently a superset of the OGC ones, so that every valid OGC WKB/WKT is also valid EWKB/EWKT. However, this might vary in the future, if the OGC extends a format in a way that conflicts with the PosGIS definition. Thus you SHOULD NOT rely on this compatibility! |
Examples of the EWKT text representation of spatial objects are:
POINT(0 0 0) -- XYZ
SRID=32632;POINT(0 0) -- XY with SRID
POINTM(0 0 0) -- XYM
POINT(0 0 0 0) -- XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID
MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))
GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
TRIANGLE ((0 0, 0 10, 10 0, 0 0))
TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
Input and output using these formats is available using the following functions:
bytea EWKB = ST_AsEWKB(geometry); text EWKT = geometry; geometry = ST_GeomFromEWKB(bytea EWKB); geometry = ST_GeomFromEWKT(text EWKT);
For example, a statement to create and insert a PostGIS spatial object using EWKT is:
INSERT INTO geotable ( geom, name )
VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )The PostGIS geography data type provides native support for spatial features represented on "geographic" coordinates (sometimes called "geodetic" coordinates, or "lat/lon", or "lon/lat"). Geographic coordinates are spherical coordinates expressed in angular units (degrees).
The basis for the PostGIS geometry data type is a plane. The shortest path between two points on the plane is a straight line. That means functions on geometries (areas, distances, lengths, intersections, etc) are calculated using straight line vectors and cartesian mathematics. This makes them simpler to implement and faster to execute, but also makes them inaccurate for data on the spheroidal surface of the earth.
The PostGIS geography data type is based on a spherical model. The shortest path between two points on the sphere is a great circle arc. Functions on geographies (areas, distances, lengths, intersections, etc) are calculated using arcs on the sphere. By taking the spheroidal shape of the world into account, the functions provide more accurate results.
Because the underlying mathematics is more complicated, there are fewer functions defined for the geography type than for the geometry type. Over time, as new algorithms are added the capabilities of the geography type will expand. As a workaround one can convert back and forth between geometry and geography types.
Like the geometry data type, geography data is associated with a spatial reference system via a spatial reference system identifier (SRID). Any geodetic (long/lat based) spatial reference system defined in the spatial_ref_sys table can be used. You can add your own custom geodetic spatial reference system as described in Розділ 4.5.2, «User-Defined Spatial Reference Systems».
For all spatial reference systems the units returned by measurement functions (e.g. ST_Distance, ST_Length, ST_Perimeter, ST_Area) and for the distance argument of ST_DWithin are in meters.
You can create a table to store geography data using the CREATE TABLE SQL statement with a column of type geography. The following example creates a table with a geography column storing 2D LineStrings in the WGS84 geodetic coordinate system (SRID 4326):
CREATE TABLE global_points ( id SERIAL PRIMARY KEY, name VARCHAR(64), location geography(POINT, 4326) );
The geography type supports two optional type modifiers:
the spatial type modifier restricts the kind of shapes and dimensions allowed in the column. Values allowed for the spatial type are: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION. The geography type does not support curves, TINS, or POLYHEDRALSURFACEs. The modifier supports coordinate dimensionality restrictions by adding suffixes: Z, M and ZM. For example, a modifier of 'LINESTRINGM' only allows linestrings with three dimensions, and treats the third dimension as a measure. Similarly, 'POINTZM' requires four dimensional (XYZM) data.
the SRID modifier restricts the spatial reference system SRID to a particular number. If omitted, the SRID defaults to 4326 (WGS84 geodetic), and all calculations are performed using WGS84.
Examples of creating tables with geography columns:
Create a table with 2D POINT geography with the default SRID 4326 (WGS84 long/lat):
CREATE TABLE ptgeogwgs(gid serial PRIMARY KEY, geog geography(POINT));
Create a table with 2D POINT geography in NAD83 longlat:
CREATE TABLE ptgeognad83(gid serial PRIMARY KEY, geog geography(POINT, 4269));
Create a table with 3D (XYZ) POINTs and an explicit SRID of 4326:
CREATE TABLE ptzgeogwgs84(gid serial PRIMARY KEY, geog geography(POINTZ, 4326));
Create a table with 2D LINESTRING geography with the default SRID 4326:
CREATE TABLE lgeog(gid serial PRIMARY KEY, geog geography(LINESTRING));
Create a table with 2D POLYGON geography with the SRID 4267 (NAD 1927 long lat):
CREATE TABLE lgeognad27(gid serial PRIMARY KEY, geog geography(POLYGON, 4267));
Geography fields are registered in the geography_columns system view. You can query the geography_columns view and see that the table is listed:
SELECT * FROM geography_columns;
Creating a spatial index works the same as for geometry columns. PostGIS will note that the column type is GEOGRAPHY and create an appropriate sphere-based index instead of the usual planar index used for GEOMETRY.
CREATE INDEX global_points_gix ON global_points USING GIST ( location );
You can insert data into geography tables in the same way as geometry. Geometry data will autocast to the geography type if it has SRID 4326. The EWKT and EWKB formats can also be used to specify geography values.
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)');
Any geodetic (long/lat) spatial reference system listed in spatial_ref_sys table may be specified as a geography SRID. Non-geodetic coordinate systems raise an error if used.
A NAD83 longitude/latitude geography value:
SELECT 'SRID=4269;POINT(-123 34)'::geography;
geography ---------------------------------------------------- 0101000020AD1000000000000000C05EC00000000000004140
A NAD27 longitude/latitude geography value:
SELECT 'SRID=4267;POINT(-123 34)'::geography;
geography ---------------------------------------------------- 0101000020AB1000000000000000C05EC00000000000004140
NAD83 UTM zone meters fails because it is a meter-based planar projection.
SELECT 'SRID=26910;POINT(-123 34)'::geography;
ERROR: Only lon/lat coordinate systems are supported in geography.
Query and measurement functions use units of meters. So distance parameters should be expressed in meters, and return values should be expected in meters (or square meters for areas).
This query finds rows within a 1000 km tolerance:
SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);
You can see the power of geography in action by calculating how close a plane flying a great circle route from Seattle to London (LINESTRING(-122.33 47.606, 0.0 51.5)) comes to Reykjavik (POINT(-21.96 64.15)) (map the route).
The geography type calculates the true shortest distance of 122.235 km over the sphere between Reykjavik and the great circle flight path between Seattle and London.
SELECT ST_Distance('LINESTRING(-122.33 47.606,0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography);st_distance ----------------- 122235.23815667
The geometry type calculates a meaningless cartesian distance between Reykjavik and the straight line path from Seattle to London plotted on a flat map of the world. The nominal units of the result is "degrees", but the result doesn't correspond to any true angular difference between the points, so even calling them "degrees" is inaccurate.
SELECT ST_Distance('LINESTRING(-122.33 47.606,0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry);st_distance -------------------- 13.342271221453624
The geography data type allows you to store data in longitude/latitude coordinates, but at a cost: there are fewer functions defined on GEOGRAPHY than there are on GEOMETRY; those functions that are defined take more CPU time to execute.
The data type you choose should be determined by the expected working area of the application you are building. Will your data span the globe or a large continental area, or is it local to a state, county or municipality?
If your data is contained in a small area, you might find that choosing an appropriate projection and using GEOMETRY is the best solution, in terms of performance and functionality available.
If your data is global or covers a continental region, you may find that GEOGRAPHY allows you to build a system without having to worry about projection details. You store your data in longitude/latitude, and use the functions that have been defined on GEOGRAPHY.
If you don't understand projections, and you don't want to learn about them, and you're prepared to accept the limitations in functionality available in GEOGRAPHY, then it might be easier for you to use GEOGRAPHY than GEOMETRY. Simply load your data up as longitude/latitude and go from there.
Refer to Розділ 13.11, «Матриця підтримки функцій PostGIS» for compare between what is supported for Geography vs. Geometry. For a brief listing and description of Geography functions, refer to Розділ 13.4, «Функції підтримки географії PostGIS»
4.3.4.1. | Do you calculate on the sphere or the spheroid? |
By default, all distance and area calculations are done on the spheroid. You should find that the results of calculations in local areas match up well with local planar results in good local projections. Over larger areas, the spheroidal calculations will be more accurate than any calculation done on a projected plane. The difference is that the spheroid takes into account the curvature and non-spherical shape of the Earth, whereas planar calculations assume a flat surface. All the geography functions have the option of using a sphere calculation, by setting a final boolean parameter to 'FALSE'. This will somewhat speed up calculations, particularly for cases where the geometries are very simple. | |
4.3.4.2. | What about the date-line and the poles? |
All the calculations have no conception of date-line or poles, the coordinates are spherical (longitude/latitude) so a shape that crosses the dateline is, from a calculation point of view, no different from any other shape. | |
4.3.4.3. | What is the longest arc you can process? |
We use great circle arcs as the "interpolation line" between two points. That means any two points are actually joined up two ways, depending on which direction you travel along the great circle. All our code assumes that the points are joined by the *shorter* of the two paths along the great circle. As a consequence, shapes that have arcs of more than 180 degrees will not be correctly modelled. | |
4.3.4.4. | Why is it so slow to calculate the area of Europe / Russia / insert big geographic region here ? |
Because the polygon is so darned huge! Big areas are bad for two reasons: their bounds are huge, so the index tends to pull the feature no matter what query you run; the number of vertices is huge, and tests (distance, containment) have to traverse the vertex list at least once and sometimes N times (with N being the number of vertices in the other candidate feature). As with GEOMETRY, we recommend that when you have very large polygons, but are doing queries in small areas, you "denormalize" your geometric data into smaller chunks so that the index can effectively subquery parts of the object and so queries don't have to pull out the whole object every time. Please consult ST_Subdivide function documentation. Just because you *can* store all of Europe in one polygon doesn't mean you *should*. |
PostGIS is compliant with the Open Geospatial Consortium’s (OGC) Simple Features specification. That standard defines the concepts of geometry being simple and valid. These definitions allow the Simple Features geometry model to represent spatial objects in a consistent and unambiguous way that supports efficient computation. (Note: the OGC SF and SQL/MM have the same definitions for simple and valid.)
A simple geometry is one that has no anomalous geometric points, such as self intersection or self tangency.
A POINT is inherently simple as a 0-dimensional geometry object.
MULTIPOINTs are simple if no two coordinates (POINTs) are equal (have identical coordinate values).
A LINESTRING is simple if it does not pass through the same point twice, except for the endpoints. If the endpoints of a simple LineString are identical it is called closed and referred to as a Linear Ring.
Use ST_IsSimple to classify linear geometries. Each labeled result below is returned only when the function agrees with the stated classification; example (c) also verifies that the simple LineString is closed.
WITH cases(label, geom) AS (VALUES
('a', 'LINESTRING (10 190, 140 130, 70 80, 190 10)'::geometry),
('b', 'LINESTRING (10 190, 130 40, 170 160, 10 10)'::geometry),
('c', 'LINESTRING (90 190, 120 190, 130 140, 190 50, 70 10, 10 70, 10 150, 90 190)'::geometry),
('d', 'LINESTRING (90 190, 120 190, 50 60, 130 10, 190 50, 160 90, 10 150, 90 190)'::geometry)
)
SELECT
(SELECT geom FROM cases WHERE label = 'a' AND ST_IsSimple(geom))
AS "input_(a) simple",
(SELECT geom FROM cases WHERE label = 'b' AND NOT ST_IsSimple(geom))
AS "input_(b) not simple",
(SELECT geom FROM cases
WHERE label = 'c' AND ST_IsSimple(geom) AND ST_IsClosed(geom))
AS "input_(c) simple, closed",
(SELECT geom FROM cases WHERE label = 'd' AND NOT ST_IsSimple(geom))
AS "input_(d) not simple";A MULTILINESTRING is simple only if all of its elements are simple and the only intersection between any two elements occurs at points that are on the boundaries of both elements.
The next example applies the same classification to the three MultiLineStrings. In (f) the component lines meet only at a shared endpoint, while in (g) they cross in their interiors.
WITH cases(label, geom) AS (VALUES
('e', 'MULTILINESTRING ((30 190, 60 60, 170 10), (100 190, 180 150, 160 70))'::geometry),
('f', 'MULTILINESTRING ((30 190, 60 60, 170 10), (30 190, 180 150, 160 70))'::geometry),
('g', 'MULTILINESTRING ((30 190, 60 60, 170 10), (100 190, 180 150, 80 10))'::geometry)
)
SELECT
(SELECT geom FROM cases WHERE label = 'e' AND ST_IsSimple(geom))
AS "input_(e) simple",
(SELECT geom FROM cases WHERE label = 'f' AND ST_IsSimple(geom))
AS "input_(f) simple",
(SELECT geom FROM cases WHERE label = 'g' AND NOT ST_IsSimple(geom))
AS "input_(g) not simple";POLYGONs are formed from linear rings, so valid polygonal geometry is always simple.
Generally, PostGIS functions do not require geometric arguments to be simple. Simplicity is primarily used as a basis for defining geometric validity. It is also a requirement for some kinds of spatial data models (for example, linear networks often disallow lines that cross). Multipoint and linear geometry can be made simple using ST_UnaryUnion.
Geometry validity primarily applies to 2-dimensional geometries (POLYGONs and MULTIPOLYGONs) . Validity is defined by rules that allow polygonal geometry to model planar areas unambiguously.
A POLYGON is valid if:
the polygon boundary rings (the exterior shell ring and interior hole rings) are simple (do not cross or self-touch). Because of this a polygon cannot have cut lines, spikes or loops. This implies that polygon holes must be represented as interior rings, rather than by the exterior ring self-touching (a so-called "inverted hole").
boundary rings do not cross
boundary rings may touch at points but only as a tangent (i.e. not in a line)
interior rings are contained in the exterior ring
the polygon interior is simply connected (i.e. the rings must not touch in a way that splits the polygon into more than one part)
Consecutive repeated points in a polygon boundary ring do not make the ring non-simple. Under the SFS curve model, a curve is interpreted by a continuous parameterization; consecutive equal coordinates are topologically indistinguishable from a single vertex. PostGIS therefore treats them as redundant vertices, so they do not make an otherwise valid polygon invalid.
The following examples use ST_IsValid to check the validity rules. Each labeled geometry is returned only if its computed validity agrees with the label.
WITH cases(label, geom) AS (VALUES
('h', 'POLYGON ((10 140, 90 190, 130 170, 190 60, 160 10, 50 20, 10 140),
(50 100, 70 80, 110 100, 110 140, 50 100))'::geometry),
('i', 'POLYGON ((10 140, 90 190, 130 170, 190 60, 160 10, 50 20, 10 140),
(190 60, 140 40, 110 60, 120 90, 190 60))'::geometry)
)
SELECT
(SELECT geom FROM cases WHERE label = 'h' AND ST_IsValid(geom))
AS "input_(h) valid",
(SELECT geom FROM cases WHERE label = 'i' AND ST_IsValid(geom))
AS "input_(i) valid, tangent hole";Examples (j-m) are invalid. They show, respectively, a disconnected interior, crossing rings, a cut line, and a hole outside the shell. The invalidity reason is checked with ST_IsValidReason. The disconnected interior in (j) can instead be represented as a valid MULTIPOLYGON.
WITH cases(label, geom, reason_pattern) AS (VALUES
('(j) disconnected interior',
'POLYGON ((10 140, 90 190, 130 170, 190 60, 160 10, 50 20, 10 140),
(130 170, 10 140, 50 120, 110 110, 130 170))'::geometry,
'Interior is disconnected%'),
('(k) crossing rings',
'POLYGON ((10 140, 90 190, 130 170, 190 60, 160 10, 50 20, 10 140),
(90 189, 10 139, 80 110, 110 130, 90 189))'::geometry,
'Self-intersection%'),
('(l) cut line',
'POLYGON ((10 100, 60 140, 60 190, 60 140, 130 170,
190 60, 160 10, 50 20, 10 100))'::geometry,
'Ring Self-intersection%'),
('(m) hole outside shell',
'POLYGON ((10 40, 10 100, 130 130, 190 80, 140 20, 50 10, 10 40),
(81 143, 103 143, 112 162, 107 175, 89 183, 71 169, 81 143))'::geometry,
'Hole lies outside shell%')
)
SELECT label, geom
FROM cases
WHERE NOT ST_IsValid(geom)
AND ST_IsValidReason(geom) LIKE reason_pattern
ORDER BY label;label | geom -------------------------+---------------------------------------------------------------------------------------------------------------------------------------- (j) disconnected interior | POLYGON((10 140,90 190,130 170,190 60,160 10,50 20,10 140),(130 170,10 140,50 120,110 110,130 170)) (k) crossing rings | POLYGON((10 140,90 190,130 170,190 60,160 10,50 20,10 140),(90 189,10 139,80 110,110 130,90 189)) (l) cut line | POLYGON((10 100,60 140,60 190,60 140,130 170,190 60,160 10,50 20,10 100)) (m) hole outside shell | POLYGON((10 40,10 100,130 130,190 80,140 20,50 10,10 40),(81 143,103 143,112 162,107 175,89 183,71 169,81 143))
A MULTIPOLYGON is valid if:
its element POLYGONs are valid
elements do not overlap (i.e. their interiors must not intersect)
elements touch only at points (i.e. not along a line)
The next example checks the MultiPolygon rules. In (n) the polygons touch at only one point. In (o) they share an edge, and in (p) their interiors overlap.
WITH cases(label, geom, valid, reason_pattern) AS (VALUES
('(n) point touch',
'MULTIPOLYGON (((10 40, 29 118, 100 75, 180 88, 140 30, 70 10, 10 40)),
((50 170, 100 190, 160 180, 180 140, 180 90, 120 120,
30 120, 50 170)))'::geometry,
true, NULL),
('(o) shared edge',
'MULTIPOLYGON (((10 40, 30 120, 120 120, 180 88, 140 30, 70 10, 10 40)),
((50 170, 100 190, 160 180, 180 140, 180 90, 120 120,
30 120, 50 170)))'::geometry,
false, 'Self-intersection%'),
('(p) overlap',
'MULTIPOLYGON (((10 40, 42 93, 130 150, 180 86, 140 30, 70 10, 10 40)),
((50 170, 100 190, 138 182, 149 156, 146 137, 100 100,
58 140, 50 170)))'::geometry,
false, 'Self-intersection%')
)
SELECT label, geom
FROM cases
WHERE ST_IsValid(geom) = valid
AND (valid OR ST_IsValidReason(geom) LIKE reason_pattern)
ORDER BY label;label | geom ------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------- (n) point touch | MULTIPOLYGON(((10 40,29 118,100 75,180 88,140 30,70 10,10 40)),((50 170,100 190,160 180,180 140,180 90,120 120,30 120,50 170))) (o) shared edge | MULTIPOLYGON(((10 40,30 120,120 120,180 88,140 30,70 10,10 40)),((50 170,100 190,160 180,180 140,180 90,120 120,30 120,50 170))) (p) overlap | MULTIPOLYGON(((10 40,42 93,130 150,180 86,140 30,70 10,10 40)),((50 170,100 190,138 182,149 156,146 137,100 100,58 140,50 170)))
These rules mean that valid polygonal geometry is also simple.
For linear geometry the only validity rule is that LINESTRINGs must have at least two points and have non-zero length (or equivalently, have at least two distinct points.) Note that non-simple (self-intersecting) lines are valid.
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 and MULTIPOINT geometries have no validity rules.
PostGIS allows creating and storing both valid and invalid Geometry. This allows invalid geometry to be detected and flagged or fixed. There are also situations where the OGC validity rules are stricter than desired (examples of this are zero-length linestrings and polygons with inverted holes.)
Many of the functions provided by PostGIS rely on the assumption that geometry arguments are valid. For example, it does not make sense to calculate the area of a polygon that has a hole defined outside of the polygon, or to construct a polygon from a non-simple boundary line. Assuming valid geometric inputs allows functions to operate more efficiently, since they do not need to check for topological correctness. (Notable exceptions are that zero-length lines and polygons with inversions are generally handled correctly.) Also, most PostGIS functions produce valid geometry output if the inputs are valid. This allows PostGIS functions to be chained together safely.
If you encounter unexpected error messages when calling PostGIS functions (such as "GEOS Intersection() threw an error!"), you should first confirm that the function arguments are valid. If they are not, then consider using one of the techniques below to ensure the data you are processing is valid.
![]() | |
If a function reports an error with valid inputs, then you may have found an error in either PostGIS or one of the libraries it uses, and you should report this to the PostGIS project. The same is true if a PostGIS function returns an invalid geometry for valid input. |
To test if a geometry is valid use the ST_IsValid function:
SELECT ST_IsValid('POLYGON ((20 180,180 180,180 20,20 20,20 180))');t
Information about the nature and location of an geometry invalidity are provided by the ST_IsValidDetail function:
SELECT valid, reason,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.56976744186048)
In some situations it is desirable to correct invalid geometry automatically. Use the ST_MakeValid function to do this. (ST_MakeValid is a case of a spatial function that does allow invalid input!)
By default, PostGIS does not check for validity when loading geometry, because validity testing can take a lot of CPU time for complex geometries. If you do not trust your data sources, you can enforce a validity check on your tables by adding a check constraint:
ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));
A Spatial Reference System (SRS) (also called a Coordinate Reference System (CRS)) defines how geometry is referenced to locations on the Earth's surface. There are three types of SRS:
A geodetic SRS uses angular coordinates (longitude and latitude) which map directly to the surface of the earth.
A projected SRS uses a mathematical projection transformation to "flatten" the surface of the spheroidal earth onto a plane. It assigns location coordinates in a way that allows direct measurement of quantities such as distance, area, and angle. The coordinate system is Cartesian, which means it has a defined origin point and two perpendicular axes (usually oriented North and East). Each projected SRS uses a stated length unit (usually metres or feet). A projected SRS may be limited in its area of applicability to avoid distortion and fit within the defined coordinate bounds.
A local SRS is a Cartesian coordinate system which is not referenced to the earth's surface. In PostGIS this is specified by a SRID value of 0.
There are many different spatial reference systems in use. Common SRSes are standardized in the European Petroleum Survey Group EPSG database. For convenience PostGIS (and many other spatial systems) refers to SRS definitions using an integer identifier called a SRID.
A geometry is associated with a Spatial Reference System by its SRID value, which is accessed by ST_SRID. The SRID for a geometry can be assigned using ST_SetSRID. Some geometry constructor functions allow supplying a SRID (such as ST_Point and ST_MakeEnvelope). The EWKT format supports SRIDs with the SRID=n; prefix.
Spatial functions processing pairs of geometries (such as overlay and relationship functions) require that the input geometries are in the same spatial reference system (have the same SRID). Geometry data can be transformed into a different spatial reference system using ST_Transform and ST_TransformPipeline. Geometry returned from functions has the same SRS as the input geometries.
The SPATIAL_REF_SYS table used by PostGIS is an OGC-compliant database table that defines the available spatial reference systems. It holds the numeric SRIDs and textual descriptions of the coordinate systems.
The spatial_ref_sys table definition is:
CREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256), auth_srid INTEGER, srtext VARCHAR(2048), proj4text VARCHAR(2048) )
The columns are:
sridAn integer code that uniquely identifies the Spatial Reference System (SRS) within the database.
auth_nameThe name of the standard or standards body that is being cited for this reference system. For example, "EPSG" is a valid auth_name.
auth_sridThe ID of the Spatial Reference System as defined by the Authority cited in the auth_name. In the case of EPSG, this is the EPSG code.
srtextThe Well-Known Text representation of the Spatial Reference System. An example of a WKT SRS representation is:
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]
]For a discussion of SRS WKT, see the OGC standard Well-known text representation of coordinate reference systems.
proj4textPostGIS uses the PROJ library to provide coordinate transformation capabilities. The proj4text column contains the PROJ coordinate definition string for a particular SRID. For example:
+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m
For more information see the PROJ web site. The spatial_ref_sys.sql file contains both srtext and proj4text definitions for all EPSG projections.
When retrieving spatial reference system definitions for use in transformations, PostGIS uses fhe following strategy:
If auth_name and auth_srid are present (non-NULL) use the PROJ SRS based on those entries (if one exists).
If srtext is present create a SRS using it, if possible.
If proj4text is present create a SRS using it, if possible.
The PostGIS spatial_ref_sys table contains over 3000 of the most common spatial reference system definitions that are handled by the PROJ projection library. But there are many coordinate systems that it does not contain. You can add SRS definitions to the table if you have the required information about the spatial reference system. Or, you can define your own custom spatial reference system if you are familiar with PROJ constructs. Keep in mind that most spatial reference systems are regional and have no meaning when used outside of the bounds they were intended for.
A resource for finding spatial reference systems not defined in the core set is http://spatialreference.org/
Some commonly used spatial reference systems are: 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 - WGS 84 World Mercator, 2163 - US National Atlas Equal Area, and the 60 WGS84 UTM zones. UTM zones are one of the most ideal for measurement, but only cover 6-degree regions. For WGS84 longitude/latitude data, the UTM zone is least(floor((longitude + 180) / 6) + 1, 60); the EPSG code is 32600 + zone in the northern hemisphere or 32700 + zone in the southern hemisphere.
US states use State Plane spatial reference systems (meter or feet based) - usually one or 2 exists per state. Most of the meter-based ones are in the core set, but many of the feet-based ones or ESRI-created ones will need to be copied from spatialreference.org.
You can even define non-Earth-based coordinate systems, such as Mars 2000 This Mars coordinate system is non-planar (it's in degrees spheroidal), but you can use it with the geography type to obtain length and proximity measurements in meters instead of degrees.
Here is an example of loading a custom coordinate system using an unassigned SRID and the PROJ definition for a US-centric Lambert Conformal projection:
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' );
You can create a table to store geometry data using the CREATE TABLE SQL statement with a column of type geometry. The following example creates a table with a geometry column storing 2D (XY) LineStrings in the BC-Albers coordinate system (SRID 3005):
CREATE TABLE roads ( id SERIAL PRIMARY KEY, name VARCHAR(64), geom geometry(LINESTRING, 3005) );
The geometry type supports two optional type modifiers:
the spatial type modifier restricts the kind of shapes and dimensions allowed in the column. The value can be any of the supported geometry subtypes (e.g. POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, etc). The modifier supports coordinate dimensionality restrictions by adding suffixes: Z, M and ZM. For example, a modifier of 'LINESTRINGM' allows only linestrings with three dimensions, and treats the third dimension as a measure. Similarly, 'POINTZM' requires four dimensional (XYZM) data.
the SRID modifier restricts the spatial reference system SRID to a particular number. If omitted, the SRID defaults to 0.
Examples of creating tables with geometry columns:
Create a table holding any kind of geometry with the default SRID:
CREATE TABLE geoms(gid serial PRIMARY KEY, geom geometry);
Create a table with 2D POINT geometry with the default SRID:
CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINT));
Create a table with 3D (XYZ) POINTs and an explicit SRID of 3005:
CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINTZ, 3005));
Create a table with 4D (XYZM) LINESTRING geometry with the default SRID:
CREATE TABLE lines(gid serial PRIMARY KEY, geom geometry(LINESTRINGZM));
Create a table with 2D POLYGON geometry with the SRID 4267 (NAD 1927 long lat):
CREATE TABLE polys(gid serial PRIMARY KEY, geom geometry(POLYGON, 4267));
It is possible to have more than one geometry column in a table. This can be specified when the table is created, or a column can be added using the ALTER TABLE SQL statement. This example adds a column that can hold 3D LineStrings:
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ, 4326);
The OGC Simple Features Specification for SQL defines the GEOMETRY_COLUMNS metadata table to describe geometry table structure. In PostGIS geometry_columns is a view reading from database system catalog tables. This ensures that the spatial metadata information is always consistent with the currently defined tables and views. The view structure is:
\d geometry_columns
View "public.geometry_columns"
Column | Type | Modifiers
-------------------+------------------------+-----------
f_table_catalog | character varying(256) |
f_table_schema | character varying(256) |
f_table_name | character varying(256) |
f_geometry_column | character varying(256) |
coord_dimension | integer |
srid | integer |
type | character varying(30) |The columns are:
f_table_catalog, f_table_schema, f_table_nameThe fully qualified name of the feature table containing the geometry column. There is no PostgreSQL analogue of "catalog" so that column is left blank. For "schema" the PostgreSQL schema name is used (public is the default).
f_geometry_columnThe name of the geometry column in the feature table.
coord_dimensionThe coordinate dimension (2, 3 or 4) of the column. The coordinate dimension is at least 2, representing X and Y coordinates.
sridThe ID of the spatial reference system used for the coordinate geometry in this table. It is a foreign key reference to the spatial_ref_sys table (see Розділ 4.5.1, «SPATIAL_REF_SYS Table»).
typeThe type of the spatial object. To restrict the spatial column to a single type, use one of: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION or corresponding XYM versions POINTM, LINESTRINGM, POLYGONM, MULTIPOINTM, MULTILINESTRINGM, MULTIPOLYGONM, GEOMETRYCOLLECTIONM. For heterogeneous (mixed-type) collections, you can use "GEOMETRY" as the type.
Two of the cases where you may need this are the case of SQL Views and bulk inserts. For bulk insert case, you can correct the registration in the geometry_columns table by constraining the column or doing an alter table. For views, you could expose using a CAST operation. Note, if your column is typmod based, the creation process would register it correctly, so no need to do anything. Also views that have no spatial function applied to the geometry will register the same as the underlying table geometry column.
For example, suppose 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;
To register the geometry column correctly, cast the transformed 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 the geometry type is known to be a 2D Polygon, specify it in the cast.
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;For a derivative table created by a bulk insert, create the table first.
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 a 2D spatial index on the new table.
CREATE INDEX idx_myschema_myspecialpois_geom_gist ON myschema.my_special_pois USING gist(geom);
If the points are 3D or measured, an n-D index may be more appropriate.
CREATE INDEX my_special_pois_geom_gist_nd ON my_special_pois USING gist(geom gist_geometry_ops_nd);
Manually register the new table's geometry column in geometry_columns. This also changes the underlying table structure to make the column typmod-based.
SELECT Populate_Geometry_Columns('myschema.my_special_pois'::regclass);To retain constraint-based definition behavior, such as for inherited tables where all children do not have the same type and SRID, set the optional use_typmod argument to false.
SELECT Populate_Geometry_Columns('myschema.my_special_pois'::regclass, false);Although the old constraint-based method is still supported, direct pass-through view columns register correctly in geometry_columns for both typmod-based and constraint-based source columns. In this example we define a column using typmod and another using constraints.
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);If we run \d pois_ny in psql, we observe they are defined differently -- one is typmod, one is constraint.
\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)In geometry_columns, they both register correctly
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
However -- if we were to create a view like this
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';Both the typmod based geom view column and the direct constraint based view column register correctly.
f_table_name | f_geometry_column | srid | type ------------------+-------------------+------+---------- vw_pois_ny_parks | geom | 4326 | POINT vw_pois_ny_parks | geom_2160 | 2160 | POINT
If the view applies a spatial function to the geometry, such as ST_Transform, you still need to cast the transformed column explicitly so the view can expose the correct type and SRID:
DROP VIEW vw_pois_ny_parks;
CREATE VIEW vw_pois_ny_parks AS
SELECT gid, poi_name, cat,
geom,
ST_Transform(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
Once you have created a spatial table, you are ready to upload spatial data to the database. There are two built-in ways to get spatial data into a PostGIS/PostgreSQL database: using formatted SQL statements or using the Shapefile loader.
If spatial data can be converted to a text representation (as either WKT or WKB), then using SQL might be the easiest way to get data into PostGIS. Data can be bulk-loaded into PostGIS/PostgreSQL by loading a text file of SQL INSERT statements using the psql SQL utility.
A SQL load file (roads.sql for example) might look like this:
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;
The SQL file can be loaded into PostgreSQL using psql:
psql -d [database] -f roads.sql
The shp2pgsql data loader converts Shapefiles into SQL suitable for insertion into a PostGIS/PostgreSQL database either in geometry or geography format. The loader has several operating modes selected by command line flags.
The input must be an unpacked shapefile path. The loader does not read .zip archives directly; unpack the .shp, .shx, and .dbf files before loading.
There is also a shp2pgsql-gui graphical interface with most of the options as the command-line loader. This may be easier to use for one-off non-scripted loading or if you are new to PostGIS. It can also be configured as a plugin to PgAdminIII.
-cCreates a new table and populates it from the Shapefile. This is the default mode.
-aAppends data from the Shapefile into the database table. Note that to use this option to load multiple files, the files must have the same attributes and same data types.
-dDrops the database table before creating a new table with the data in the Shapefile.
-pOnly produces the table creation SQL code, without adding any actual data. This can be used if you need to completely separate the table creation and data loading steps.
-?Display help screen.
-DUse the PostgreSQL "dump" format for the output data. This can be combined with -a, -c and -d. It is much faster to load than the default "insert" SQL format. Use this for very large data sets.
-f <fid_column>, --feature-id-column <fid_column>Specify the name of the feature id column. The default is gid. The value must be a simple PostgreSQL identifier and cannot use a PostgreSQL system column name.
-s [<FROM_SRID>:]<SRID>Creates and populates the geometry tables with the specified SRID. Optionally specifies that the input shapefile uses the given FROM_SRID, in which case the geometries will be reprojected to the target SRID.
-kKeep identifiers' case (column, schema and attributes). Note that attributes in Shapefile are all UPPERCASE.
-iCoerce all integers to standard 32-bit integers, do not create 64-bit bigints, even if the DBF header signature appears to warrant it.
-ICreate a GiST index on the geometry column.
-uCreate the target table as UNLOGGED. This can speed up loading transient staging data, but PostgreSQL does not preserve unlogged table contents after a crash or unclean shutdown.
-mSpecify a file containing a set of mappings of (long) column names to 10 character DBF column names. The content of the file is one or more lines of two names separated by white space and no trailing or leading space. For example:
COLUMNNAME DBFFIELD1
AVERYLONGCOLUMNNAME DBFFIELD2
-SGenerate simple geometries instead of MULTI geometries. Will only succeed if all the geometries are actually single (I.E. a MULTIPOLYGON with a single shell, or or a MULTIPOINT with a single vertex).
-t <dimensionality>Force the output geometry to have the specified dimensionality. Use the following strings to indicate the dimensionality: 2D, 3DZ, 3DM, 4D.
If the input has fewer dimensions that specified, the output will have those dimensions filled in with zeroes. If the input has more dimensions that specified, the unwanted dimensions will be stripped.
-wOutput WKT format, instead of WKB. Note that this can introduce coordinate drifts due to loss of precision.
-eExecute each statement on its own, without using a transaction. This allows loading of the majority of good data when there are some bad geometries that generate errors. Note that this cannot be used with the -D flag as the "dump" format always uses a transaction.
-W <encoding>Specify encoding of the input data (dbf file). When used, all attributes of the dbf are converted from the specified encoding to UTF8. The resulting SQL output will contain a SET CLIENT_ENCODING to UTF8 command, so that the backend will be able to reconvert from UTF8 to whatever encoding the database is configured to use internally.
-N <policy>NULL geometries handling policy (insert*,skip,abort)
-n-n Only import DBF file. If your data has no corresponding shapefile, it will automatically switch to this mode and load just the dbf. So setting this flag is only needed if you have a full shapefile set, and you only want the attribute data and no geometry.
-GUse geography type instead of geometry (requires lon/lat data) in WGS84 long lat (SRID=4326)
-T <tablespace>Specify the tablespace for the new table. Indexes will still use the default tablespace unless the -X parameter is also used. The PostgreSQL documentation has a good description on when to use custom tablespaces.
-X <tablespace>Specify the tablespace for the new table's indexes. This applies to the primary key index, and the GIST spatial index if -I is also used.
-ZWhen used, this flag will prevent the generation of ANALYZE statements. Without the -Z flag (default behavior), the ANALYZE statements will be generated.
An example session using the loader to create an input file and loading it might look like this:
shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql psql -d roadsdb -f roads.sql
A conversion and load can be done in one step using UNIX pipes:
shp2pgsql shaperoads.shp myschema.roadstable | psql -d roadsdb
To load a directory of Shapefiles, run the loader once per file and derive the table name from the file name. On Windows cmd.exe, use a single percent sign interactively and double percent signs in a batch file:
REM In a .bat file, use %%F. At an interactive cmd.exe prompt, use %F.
for %%F in ("C:\data\shapefiles\*.shp") do (
shp2pgsql -d -D -s 4269 -I -W UTF-8 "%%~fF" "myschema.%%~nF" | psql -d roadsdb
)If every Shapefile has the same attributes and data types and should be appended into one table, create the table from the first file and use -a for the remaining files.
Spatial data can be extracted from the database using either SQL or the Shapefile dumper. The section on SQL presents some of the functions available to do comparisons and queries on spatial tables.
The most straightforward way of extracting spatial data out of the database is to use a SQL SELECT query to define the data set to be extracted and dump the resulting columns into a parsable text file:
SELECT road_id,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)There will be times when some kind of restriction is necessary to cut down the number of records returned. In the case of attribute-based restrictions, use the same SQL syntax as used with a non-spatial table. In the case of spatial restrictions, the following functions are useful:
ST_IntersectsThis function tells whether two geometries share any space.
=This tests whether two geometries are geometrically identical. For example, if 'POLYGON((0 0,1 1,1 0,0 0))' is the same as 'POLYGON((0 0,1 1,1 0,0 0))' (it is).
Next, you can use these operators in queries. Note that when specifying geometries and boxes on the SQL command line, you must explicitly turn the string representations into geometries function. The 312 is a fictitious spatial reference system that matches our data. So, for example:
SELECT road_id, road_name FROM roads WHERE roads_geom='SRID=312;LINESTRING(191232 243118,191108 243242)'::geometry;
The above query would return the single record from the "ROADS_GEOM" table in which the geometry was equal to that value.
To check whether some of the roads passes in the area defined by a polygon:
SELECT road_id, road_name FROM roads WHERE ST_Intersects(roads_geom, 'SRID=312;POLYGON((...))');
The most common spatial query will probably be a "frame-based" query, used by client software, like data browsers and web mappers, to grab a "map frame" worth of data for display.
When using the "&&" operator, you can specify either a BOX3D as the comparison feature or a GEOMETRY. When you specify a GEOMETRY, however, its bounding box will be used for the comparison.
Using a "BOX3D" object for the frame, such a query looks like this:
SELECT roads_geom AS geom FROM roads WHERE roads_geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312);
Note the use of the SRID 312, to specify the projection of the envelope.
The pgsql2shp table dumper connects to the database and converts a table (possibly defined by a query) into a shape file. The basic syntax is:
pgsql2shp [<options >] <database > [<schema >.]<table>
pgsql2shp [<options >] <database > <query>
The commandline options are:
-f <filename>Write the output to a particular filename.
-h <host>The database host to connect to.
-p <port>The port to connect to on the database host.
-P <password>The password to use when connecting to the database.
-u <user>The username to use when connecting to the database.
-g <geometry column>In the case of tables with multiple geometry columns, the geometry column to use when writing the shape file.
-bUse a binary cursor. This will make the operation faster, but will not work if any NON-geometry attribute in the table lacks a cast to text.
-rRaw mode. Do not drop the gid field, or escape column names.
-m filenameRemap identifiers to ten character names. The content of the file is lines of two symbols separated by a single white space and no trailing or leading space: VERYLONGSYMBOL SHORTONE ANOTHERVERYLONGSYMBOL SHORTER etc.
Spatial indexes make using a spatial database for large data sets possible. Without indexing, a search for features requires a sequential scan of every record in the database. Indexing speeds up searching by organizing the data into a structure which can be quickly traversed to find matching records.
The B-tree index method commonly used for attribute data is not very useful for spatial data, since it only supports storing and querying data in a single dimension. Data such as geometry (which has 2 or more dimensions) requires an index method that supports range query across all the data dimensions. One of the key advantages of PostgreSQL for spatial data handling is that it offers several kinds of index methods which work well for multi-dimensional data: GiST, BRIN and SP-GiST indexes.
GiST (Generalized Search Tree) indexes break up data into "things to one side", "things which overlap", "things which are inside" and can be used on a wide range of data-types, including GIS data. PostGIS uses an R-Tree index implemented on top of GiST to index spatial data. GiST is the most commonly-used and versatile spatial index method, and offers very good query performance.
BRIN (Block Range Index) indexes operate by summarizing the spatial extent of ranges of table records. Search is done via a scan of the ranges. BRIN is only appropriate for use for some kinds of data (spatially sorted, with infrequent or no update). But it provides much faster index create time, and much smaller index size.
SP-GiST (Space-Partitioned Generalized Search Tree) is a generic index method that supports partitioned search trees such as quad-trees, k-d trees, and radix trees (tries).
Spatial indexes store only the bounding box of geometries. Spatial queries use the index as a primary filter to quickly determine a set of geometries potentially matching the query condition. Most spatial queries require a secondary filter that uses a spatial predicate function to test a more specific spatial condition. For more information on queying with spatial predicates see Розділ 5.2, «Using Spatial Indexes».
See also the PostGIS Workshop section on spatial indexes, and the PostgreSQL manual.
GiST stands for "Generalized Search Tree" and is a generic form of indexing for multi-dimensional data. PostGIS uses an R-Tree index implemented on top of GiST to index spatial data. GiST is the most commonly-used and versatile spatial index method, and offers very good query performance. Other implementations of GiST are used to speed up searches on all kinds of irregular data structures (integer arrays, spectral data, etc) which are not amenable to normal B-Tree indexing. For more information see the PostgreSQL manual.
Once a spatial data table exceeds a few thousand rows, you will want to build an index to speed up spatial searches of the data (unless all your searches are based on attributes, in which case you'll want to build a normal index on the attribute fields).
The syntax for building a GiST index on a "geometry" column is as follows:
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield]);
The above syntax will always build a 2D-index. To get the an n-dimensional index for the geometry type, you can create one using this syntax:
CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);
Building a spatial index is a computationally intensive exercise. It also blocks write access to your table for the time it creates, so on a production system you may want to do in in a slower CONCURRENTLY-aware way:
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING GIST ( [geometryfield]);
After building an index, it is sometimes helpful to force PostgreSQL to collect table statistics, which are used to optimize query plans:
VACUUM ANALYZE [table_name] [(column_name)];
BRIN stands for "Block Range Index". It is a general-purpose index method provided by PostgreSQL. BRIN is a lossy index method, meaning that a secondary check is required to confirm that a record matches a given search condition (which is the case for all provided spatial indexes). It provides much faster index creation and much smaller index size, with reasonable read performance. Its primary purpose is to support indexing very large tables on columns which have a correlation with their physical location within the table. In addition to spatial indexing, BRIN can speed up searches on various kinds of attribute data structures (integer, arrays etc). For more information see the PostgreSQL manual.
Once a spatial table exceeds a few thousand rows, you will want to build an index to speed up spatial searches of the data. GiST indexes are very performant as long as their size doesn't exceed the amount of RAM available for the database, and as long as you can afford the index storage size, and the cost of index update on write. Otherwise, for very large tables BRIN index can be considered as an alternative.
A BRIN index stores the bounding box enclosing all the geometries contained in the rows in a contiguous set of table blocks, called a block range. When executing a query using the index the block ranges are scanned to find the ones that intersect the query extent. This is efficient only if the data is physically ordered so that the bounding boxes for block ranges have minimal overlap (and ideally are mutually exclusive). The resulting index is very small in size, but is typically less performant for read than a GiST index over the same data.
Building a BRIN index is much less CPU-intensive than building a GiST index. It's common to find that a BRIN index is ten times faster to build than a GiST index over the same data. And because a BRIN index stores only one bounding box for each range of table blocks, it's common to use up to a thousand times less disk space than a GiST index.
You can choose the number of blocks to summarize in a range. If you decrease this number, the index will be bigger but will probably provide better performance.
For BRIN to be effective, the table data should be stored in a physical order which minimizes the amount of block extent overlap. It may be that the data is already sorted appropriately (for instance, if it is loaded from another dataset that is already sorted in spatial order). Otherwise, this can be accomplished by sorting the data by a one-dimensional spatial key. One way to do this is to create a new table sorted by the geometry values (which in recent PostGIS versions uses an efficient Hilbert curve ordering):
CREATE TABLE table_sorted AS SELECT * FROM table ORDER BY geom;
Alternatively, data can be sorted in-place by using a GeoHash as a (temporary) index, and clustering on that index:
CREATE INDEX idx_temp_geohash ON table
USING btree (ST_GeoHash(ST_Transform(geom, 4326 ), 20));
CLUSTER table USING idx_temp_geohash;
The syntax for building a BRIN index on a geometry column is:
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col]);
The above syntax builds a 2D index. To build a 3D-dimensional index, use this syntax:
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geome_col] brin_geometry_inclusion_ops_3d);
You can also get a 4D-dimensional index using the 4D operator class:
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geome_col] brin_geometry_inclusion_ops_4d);
The above commands use the default number of blocks in a range, which is 128. To specify the number of blocks to summarise in a range, use this syntax
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col] ) WITH (pages_per_range = [number]);
Keep in mind that a BRIN index only stores one index entry for a large number of rows. If your table stores geometries with a mixed number of dimensions, it's likely that the resulting index will have poor performance. You can avoid this performance penalty by choosing the operator class with the least number of dimensions of the stored geometries
The geography datatype is supported for BRIN indexing. The syntax for building a BRIN index on a geography column is:
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geog_col]);
The above syntax builds a 2D-index for geospatial objects on the spheroid.
Currently, only "inclusion support" is provided, meaning that just the &&, ~ and @ operators can be used for the 2D cases (for both geometry and geography), and just the &&& operator for 3D geometries. There is currently no support for kNN searches.
An important difference between BRIN and other index types is that the database does not maintain the index dynamically. Changes to spatial data in the table are simply appended to the end of the index. This will cause index search performance to degrade over time. The index can be updated by performing a VACUUM, or by using a special function brin_summarize_new_values(regclass). For this reason BRIN may be most appropriate for use with data that is read-only, or only rarely changing. For more information refer to the manual.
To summarize using BRIN for spatial data:
Index build time is very fast, and index size is very small.
Index query time is slower than GiST, but can still be very acceptable.
Requires table data to be sorted in a spatial ordering.
Requires manual index maintenance.
Most appropriate for very large tables, with low or no overlap (e.g. points), which are static or change infrequently.
More effective for queries which return relatively large numbers of data records.
SP-GiST stands for "Space-Partitioned Generalized Search Tree" and is a generic form of indexing for multi-dimensional data types that supports partitioned search trees, such as quad-trees, k-d trees, and radix trees (tries). The common feature of these data structures is that they repeatedly divide the search space into partitions that need not be of equal size. In addition to spatial indexing, SP-GiST is used to speed up searches on many kinds of data, such as phone routing, ip routing, substring search, etc. For more information see the PostgreSQL manual.
As it is the case for GiST indexes, SP-GiST indexes are lossy, in the sense that they store the bounding box enclosing spatial objects. SP-GiST indexes can be considered as an alternative to GiST indexes.
Once a GIS data table exceeds a few thousand rows, an SP-GiST index may be used to speed up spatial searches of the data. The syntax for building an SP-GiST index on a "geometry" column is as follows:
CREATE INDEX [indexname] ON [tablename] USING SPGIST ( [geometryfield]);
The above syntax will build a 2-dimensional index. A 3-dimensional index for the geometry type can be created using the 3D operator class:
CREATE INDEX [indexname] ON [tablename] USING SPGIST ([geometryfield] spgist_geometry_ops_3d);
Building a spatial index is a computationally intensive operation. It also blocks write access to your table for the time it creates, so on a production system you may want to do in in a slower CONCURRENTLY-aware way:
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING SPGIST ( [geometryfield]);
After building an index, it is sometimes helpful to force PostgreSQL to collect table statistics, which are used to optimize query plans:
VACUUM ANALYZE [table_name] [(column_name)];
An SP-GiST index can accelerate queries involving the following operators:
<<, &<, &>, >>, <<|, &<|, |&>, |>>, &&, @>, <@, and ~=, for 2-dimensional indexes,
&/&, ~==, @>>, and <<@, for 3-dimensional indexes.
There is no support for kNN searches at the moment.
Ordinarily, indexes invisibly speed up data access: once an index is built, the PostgreSQL query planner automatically decides when to use it to improve query performance. But there are some situations where the planner does not choose to use existing indexes, so queries end up using slow sequential scans instead of a spatial index.
If you find your spatial indexes are not being used, there are a few things you can do:
Examine the query plan and check your query actually computes the thing you need. An erroneous JOIN, either forgotten or to the wrong table, can unexpectedly retrieve table records multiple times. To get the query plan, execute with EXPLAIN in front of the query.
Make sure statistics are gathered about the number and distributions of values in a table, to provide the query planner with better information to make decisions around index usage. VACUUM ANALYZE will compute both.
You should regularly vacuum your databases anyways. Many PostgreSQL DBAs run VACUUM as an off-peak cron job on a regular basis.
If vacuuming does not help, you can temporarily force the planner to use the index information by using the command SET ENABLE_SEQSCAN TO OFF;. This way you can check whether the planner is at all able to generate an index-accelerated query plan for your query. You should only use this command for debugging; generally speaking, the planner knows better than you do about when to use indexes. Once you have run your query, do not forget to run SET ENABLE_SEQSCAN TO ON; so that the planner will operate normally for other queries.
If SET ENABLE_SEQSCAN TO OFF; helps your query to run faster, your Postgres is likely not tuned for your hardware. If you find the planner wrong about the cost of sequential versus index scans try reducing the value of RANDOM_PAGE_COST in postgresql.conf, or use SET RANDOM_PAGE_COST TO 1.1;. The default value for RANDOM_PAGE_COST is 4.0. Try setting it to 1.1 (for SSD) or 2.0 (for fast magnetic disks). Decreasing the value makes the planner more likely to use index scans.
If SET ENABLE_SEQSCAN TO OFF; does not help your query, the query may be using a SQL construct that the Postgres planner is not yet able to optimize. It may be possible to rewrite the query in a way that the planner is able to handle. For example, a subquery with an inline SELECT may not produce an efficient plan, but could possibly be rewritten using a LATERAL JOIN.
For more information see the Postgres manual section on Query Planning.
The raison d'etre of spatial databases is to perform queries inside the database which would ordinarily require desktop GIS functionality. Using PostGIS effectively requires knowing what spatial functions are available, how to use them in queries, and ensuring that appropriate indexes are in place to provide good performance.
Spatial relationships indicate how two geometries interact with one another. They are a fundamental capability for querying geometry.
According to the OpenGIS Simple Features Implementation Specification for SQL, "the basic approach to comparing two geometries is to make pair-wise tests of the intersections between the Interiors, Boundaries and Exteriors of the two geometries and to classify the relationship between the two geometries based on the entries in the resulting 'intersection' matrix."
In the theory of point-set topology, the points in a geometry embedded in 2-dimensional space are categorized into three sets:
The boundary of a geometry is the set of geometries of the next lower dimension. For POINTs, which have a dimension of 0, the boundary is the empty set. The boundary of a LINESTRING is the two endpoints. For POLYGONs, the boundary is the linework of the exterior and interior rings.
The interior of a geometry are those points of a geometry that are not in the boundary. For POINTs, the interior is the point itself. The interior of a LINESTRING is the set of points between the endpoints. For POLYGONs, the interior is the areal surface inside the polygon.
The exterior of a geometry is the rest of the space in which the geometry is embedded; in other words, all points not in the interior or on the boundary of the geometry. It is a 2-dimensional non-closed surface.
The Dimensionally Extended 9-Intersection Model (DE-9IM) describes the spatial relationship between two geometries by specifying the dimensions of the 9 intersections between the above sets for each geometry. The intersection dimensions can be formally represented in a 3x3 intersection matrix.
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 => point
1 => line
2 => area
F => empty set
Using this notation, the intersection matrix for two geometries a and b is:
| Interior | Boundary | Exterior | |
|---|---|---|---|
| Interior | dim( I(a) ∩ I(b) ) | dim( I(a) ∩ B(b) ) | dim( I(a) ∩ E(b) ) |
| Boundary | dim( B(a) ∩ I(b) ) | dim( B(a) ∩ B(b) ) | dim( B(a) ∩ E(b) ) |
| Exterior | dim( E(a) ∩ I(b) ) | dim( E(a) ∩ B(b) ) | dim( E(a) ∩ E(b) ) |
The following overlapping polygons provide a concrete example. ST_Relate computes the matrix 212101212; it matches the overlap pattern T*T***T** used by ST_Overlaps.
WITH example AS (
SELECT
'POLYGON ((140 140,140 122,135 105,126 100,118 99,110 94,100 86,97 73,102 59,98 49,87 38,70 30,55 29,40 30,28 38,20 50,14 66,10 84,6 100,4 119,4 143,6 166,10 180,18 191,28 195,40 190,55 189,67 186,86 179,112 165,124 158,133 148,140 140),(48 177,40 177,30 174,24 166,22 159,25 155,30 153,40 154,45 157,52 162,53 169,51 174,48 177))'::geometry AS a,
'POLYGON ((75 63,79 50,87 38,95 31,108 25,124 22,140 18,154 11,166 6,176 10,184 21,188 35,190 58,190 82,193 104,190 121,185 139,178 154,166 163,154 171,139 172,124 171,112 165,96 152,92 142,92 126,86 116,79 110,75 104,72 94,73 86,75 76,75 63))'::geometry AS b
), relation AS (
SELECT a, b, ST_Relate(a, b) AS matrix
FROM example
)
SELECT matrix,
ST_RelateMatch(matrix, 'T*T***T**') AS matches_overlap_pattern,
ST_Overlaps(a, b) AS overlaps
FROM relation;matrix | matches_overlap_pattern | overlaps -----------+-------------------------+---------- 212101212 | t | t (1 row)
The executable query and generated overlay above are the visual source for the relation. The query below renders the nine cells of the same kind of matrix as a 3-by-3 set of examples. The final exterior/exterior cell is clipped to a finite viewport, since the true exterior/exterior intersection is unbounded.
WITH example AS (
SELECT
ST_MakeEnvelope(0, 0, 6, 4) AS a,
ST_MakeEnvelope(3, -1, 8, 3) AS b,
ST_MakeEnvelope(-1, -2, 9, 5) AS viewport
), parts AS (
SELECT
a,
b,
ST_Boundary(a) AS ba,
ST_Boundary(b) AS bb,
viewport
FROM example
)
SELECT
ST_Relate(a, b) AS matrix,
ST_AsText(ST_Normalize(a)) AS input_a,
ST_AsText(ST_Normalize(b)) AS input_b,
ST_AsText(ST_Normalize(ST_Intersection(a, b))) AS "2 I(a) ∩ I(b)",
ST_AsText(ST_Normalize(ST_Intersection(a, bb))) AS "1 I(a) ∩ B(b)",
ST_AsText(ST_Normalize(ST_Difference(a, b))) AS "2 I(a) ∩ E(b)",
ST_AsText(ST_Normalize(ST_Intersection(ba, b))) AS "1 B(a) ∩ I(b)",
ST_AsText(ST_Normalize(ST_Intersection(ba, bb))) AS "0 B(a) ∩ B(b)",
ST_AsText(ST_Normalize(ST_Collect(
'LINESTRING(0 0,0 4,6 4,6 3)'::geometry,
'LINESTRING(0 0,3 0)'::geometry
))) AS "1 B(a) ∩ E(b)",
ST_AsText(ST_Normalize(ST_Difference(b, a))) AS "2 E(a) ∩ I(b)",
ST_AsText(ST_Normalize(ST_Collect(
'LINESTRING(3 -1,8 -1,8 3,6 3)'::geometry,
'LINESTRING(3 -1,3 0)'::geometry
))) AS "1 E(a) ∩ B(b)",
ST_AsText(ST_Normalize(ST_Difference(viewport, ST_Union(a, b))))
AS "2 E(a) ∩ E(b) clipped"
FROM parts;Reading from left to right and top to bottom, the intersection matrix is represented as the text string '212101212'.
For more information, refer to:
To make it easy to determine common spatial relationships, the OGC SFS defines a set of named spatial relationship predicates. PostGIS provides these as the functions ST_Contains, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within. It also defines the non-standard relationship predicates ST_Covers, ST_CoveredBy, and ST_ContainsProperly.
Spatial predicates are usually used as conditions in SQL WHERE or JOIN clauses. The named spatial predicates automatically use a spatial index if one is available, so there is no need to use the bounding box operator && as well. For example:
SELECT city.name, state.name, city.geom FROM city JOIN state ON ST_Intersects(city.geom, state.geom);
For more details and illustrations, see the PostGIS Workshop.
In some cases the named spatial relationships are insufficient to provide a desired spatial filter condition. These requirements can be expressed by computing the full DE-9IM intersection matrix with ST_Relate.
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}
* => don't care
Using intersection matrix patterns, specific spatial relationships can be evaluated succinctly. The ST_Relate and ST_RelateMatch functions can both test these patterns.
These road segments share a line segment. ST_Crosses does not find this relationship for linear features, because it only returns true when their interiors intersect at a point. The pattern 1*1***1** tests for a one-dimensional intersection instead.
WITH roads AS (
SELECT
'LINESTRING(10 10,40 90,70 110,140 110,170 130,190 190)'::geometry AS "road A",
'LINESTRING(10 190,50 130,90 110,130 110,160 70,180 10)'::geometry AS "road B"
), relation AS (
SELECT "road A", "road B", ST_Relate("road A", "road B") AS matrix
FROM roads
)
SELECT
ST_Intersection("road A", "road B") AS overlap,
matrix,
ST_Crosses("road A", "road B") AS "ST_Crosses",
ST_RelateMatch(matrix, '1*1***1**') AS "matches 1*1***1**"
FROM relation;overlap | matrix | ST_Crosses | matches 1*1***1** ----------------------------+-----------+------------+------------------- LINESTRING(90 110,130 110) | 1F1FF0102 | f | t (1 row)
The next example finds a wharf which runs from the lake interior onto its shoreline, with one endpoint on the shoreline. The other wharves provide nearby counterexamples in the figure. The pattern 102101FF2 expresses the complete required relationship in one test.
WITH data AS (
SELECT
'POLYGON((-20 10,30 30,80 70,110 80,145 85,190 110,300 220,230 220,-20 220,-20 10))'::geometry AS lake,
'MULTILINESTRING((120 180,145 85,110 80),(10 130,30 70),(90 140,110 80,94.81118881118876 75.83496503496498),(150 160,180 80))'::geometry AS wharves
), wharf AS (
SELECT lake, (item).path[1] AS id, (item).geom
FROM data CROSS JOIN LATERAL ST_Dump(wharves) AS item
), relation AS (
SELECT id, geom, ST_Relate(lake, geom) AS matrix
FROM wharf
)
SELECT
id AS wharf,
geom AS "matching wharf",
matrix
FROM relation
WHERE ST_RelateMatch(matrix, '102101FF2')
ORDER BY id;wharf | matching wharf | matrix
-------+-----------------------------------+-----------
1 | LINESTRING(120 180,145 85,110 80) | 102101FF2
(1 row)When constructing queries using spatial conditions, for best performance it is important to ensure that a spatial index is used, if one exists (see Розділ 4.9, «Spatial Indexes»). To do this, a spatial operator or index-aware function must be used in a WHERE or ON clause of the query.
Spatial operators include the bounding box operators (of which the most commonly used is &&; see Розділ 7.10.1, «Оператори обмежувальної рамки» for the full list) and the distance operators used in nearest-neighbor queries (the most common being <->; see Розділ 7.10.2, «Оператори відстані» for the full list.)
Index-aware functions automatically add a bounding box operator to the spatial condition. Index-aware functions include the named spatial relationship predicates ST_Contains, ST_ContainsProperly, ST_CoveredBy, ST_Covers, ST_Crosses, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within, ST_Within, and ST_3DIntersects, and the distance predicates ST_DWithin, ST_DFullyWithin, ST_3DDFullyWithin, and ST_3DDWithin .)
Functions such as ST_Distance do not use indexes to optimize their operation. For example, the following query would be quite slow on a large table:
SELECT geom FROM geom_table WHERE ST_Distance(geom, 'SRID=312;POINT(100000 200000)') < 100
This query selects all the geometries in geom_table which are within 100 units of the point (100000, 200000). It will be slow because it is calculating the distance between each point in the table and the specified point, ie. one ST_Distance() calculation is computed for every row in the table.
The number of rows processed can be reduced substantially by using the index-aware function ST_DWithin:
SELECT geom FROM geom_table WHERE ST_DWithin(geom, 'SRID=312;POINT(100000 200000)', 100)
This query selects the same geometries, but it does it in a more efficient way. This is enabled by ST_DWithin() using the && operator internally on an expanded bounding box of the query geometry. If there is a spatial index on geom, the query planner will recognize that it can use the index to reduce the number of rows scanned before calculating the distance. The spatial index allows retrieving only records with geometries whose bounding boxes overlap the expanded extent and hence which might be within the required distance. The actual distance is then computed to confirm whether to include the record in the result set.
For more information and examples see the PostGIS Workshop.
The examples in this section make use of a table of linear roads, and a table of polygonal municipality boundaries. The definition of the bc_roads table is:
Column | Type | Description ----------+-------------------+------------------- gid | integer | Unique ID name | character varying | Road Name geom | geometry | Location Geometry (Linestring)
The definition of the bc_municipality table is:
Column | Type | Description ---------+-------------------+------------------- gid | integer | Unique ID code | integer | Unique ID name | character varying | City / Town Name geom | geometry | Location Geometry (Polygon)
5.3.1. | What is the total length of all roads, expressed in kilometers? |
You can answer this question with a very simple piece of SQL: Code SELECT sum(ST_Length(geom))/1000 AS km_roads FROM bc_roads; Вивід растрових зображень km_roads ------------------ 70842.1243039643 | |
5.3.2. | How large is the city of Prince George, in hectares? |
This query combines an attribute condition (on the municipality name) with a spatial calculation (of the polygon area): Code SELECT ST_Area(geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE'; Вивід растрових зображень hectares ------------------ 32657.9103824927 | |
5.3.3. | What is the largest municipality in the province, by area? |
This query uses a spatial measurement as an ordering value. There are several ways of approaching this problem, but the most efficient is below: Code SELECT name, ST_Area(geom)/10000 AS hectares FROM bc_municipality ORDER BY hectares DESC LIMIT 1; Вивід растрових зображень name | hectares ---------------+----------------- TUMBLER RIDGE | 155020.02556131 Note that in order to answer this query we have to calculate the area of every polygon. If we were doing this a lot it would make sense to add an area column to the table that could be indexed for performance. By ordering the results in a descending direction, and them using the PostgreSQL "LIMIT" command we can easily select just the largest value without using an aggregate function like MAX(). | |
5.3.4. | What is the length of roads fully contained within each municipality? |
This is an example of a "spatial join", which brings together data from two tables (with a join) using a spatial interaction ("contained") as the join condition (rather than the usual relational approach of joining on a common key): Code SELECT m.name, sum(ST_Length(r.geom))/1000 as roads_km FROM bc_roads AS r JOIN bc_municipality AS m ON ST_Contains(m.geom, r.geom) GROUP BY m.name ORDER BY roads_km; Вивід растрових зображень name | roads_km ----------------------------+---------- SURREY | 1539.476 VANCOUVER | 1450.331 LANGLEY DISTRICT | 833.793 BURNABY | 773.769 PRINCE GEORGE | 694.376 ... This query takes a while, because every road in the table is summarized into the final result (about 250K roads for the example table). For smaller datasets (several thousand records on several hundred) the response can be very fast. | |
5.3.5. | Create a new table with all the roads within the city of Prince George. |
This is an example of an "overlay", which takes in two tables and outputs a new table that consists of spatially clipped or cut resultants. Unlike the "spatial join" demonstrated above, this query creates new geometries. An overlay is like a turbo-charged spatial join, and is useful for more exact analysis work: Code CREATE TABLE pg_roads as SELECT ST_Intersection(r.geom, m.geom) AS intersection_geom, ST_Length(r.geom) AS rd_orig_length, r.* FROM bc_roads AS r JOIN bc_municipality AS m ON ST_Intersects(r.geom, m.geom) WHERE m.name = 'PRINCE GEORGE'; | |
5.3.6. | What is the length in kilometers of "Douglas St" in Victoria? |
Code SELECT sum(ST_Length(r.geom))/1000 AS kilometers FROM bc_roads r JOIN bc_municipality m ON ST_Intersects(m.geom, r.geom WHERE r.name = 'Douglas St' AND m.name = 'VICTORIA'; Вивід растрових зображень kilometers ------------------ 4.89151904172838 | |
5.3.7. | What is the largest municipality polygon that has a hole? |
Code SELECT gid, name, ST_Area(geom) AS area FROM bc_municipality WHERE ST_NRings(geom) > 1 ORDER BY area DESC LIMIT 1; Вивід растрових зображень gid | name | area -----+--------------+------------------ 12 | SPALLUMCHEEN | 257374619.430216 |
Поточні версії PostgreSQL мають слабкість оптимізатора запитів щодо таблиць TOAST. Таблиці TOAST — це свого роду «додатковий простір», що використовується для зберігання великих (у сенсі розміру даних) значень, які не вміщуються у звичайні сторінки даних (наприклад, довгі тексти, зображення або складні геометрії з великою кількістю вершин). Див. документацію PostgreSQL щодо TOAST для отримання додаткової інформації).
Проблема виникає, якщо у вас є таблиця з досить великими геометріями, але не надто великою кількістю рядків (наприклад, таблиця, що містить межі всіх європейських країн у високій роздільній здатності). Тоді сама таблиця є невеликою, але використовує багато простору TOAST. У нашому прикладі таблиця мала близько 80 рядків і використовувала лише 3 сторінки даних, але таблиця TOAST використовувала 8225 сторінок.
Тепер виконайте запит, в якому використовується оператор геометрії && для пошуку обмежувального прямокутника, який відповідає лише деяким із цих рядків. Тепер оптимізатор запитів бачить, що таблиця має лише 3 сторінки та 80 рядків. Він оцінює, що послідовне сканування такої невеликої таблиці буде набагато швидшим, ніж використання індексу. Тому він вирішує проігнорувати індекс GIST. Зазвичай така оцінка є правильною. Але в нашому випадку оператор && повинен витягнути кожну геометрію з диска, щоб порівняти обмежувальні прямокутники, тим самим прочитавши також усі сторінки TOAST.
Щоб перевірити, чи є у вас ця проблема, скористайтеся командою postgresql "EXPLAIN ANALYZE". Більш детальну інформацію та технічні подробиці можна знайти у темі на форумі PostgreSQL performance mailing list: http://archives.postgresql.org/pgsql-performance/2005-02/msg00030.php
та новіша тема на PostGIS https://lists.osgeo.org/pipermail/postgis-devel/2017-June/026209.html
Розробники PostgreSQL намагаються вирішити цю проблему, зробивши оцінку запиту TOAST-сумісною. Наразі існують два обхідні шляхи:
Перший спосіб вирішення проблеми полягає в тому, щоб змусити планувальник запитів використовувати індекс. Перед відправкою запиту надішліть на сервер команду "SET enable_seqscan TO off;". Це змусить планувальник запитів уникати послідовного сканування, коли це можливо. Таким чином, він буде використовувати індекс GIST, як зазвичай. Але цей прапор потрібно встановлювати для кожного з'єднання, і це призводить до неправильних оцінок планувальника запитів в інших випадках, тому після запиту слід виконати команду "SET enable_seqscan TO on;".
Другий спосіб вирішення проблеми полягає в тому, щоб зробити послідовне сканування таким же швидким, як вважає планувальник запитів. Це можна досягти, створивши додатковий стовпець, який "кешує" bbox, і зіставляючи його з цим стовпцем. У нашому прикладі команди виглядають так:
SELECT AddGeometryColumn('myschema', 'mytable', 'bbox', '4326', 'GEOMETRY', '2');
UPDATE mytable SET bbox = ST_Envelope(ST_Force2D(geom));Тепер змініть запит, щоб використовувати оператор && для bbox замість geom_column, наприклад:
SELECT geom_column
FROM mytable
WHERE bbox && ST_SetSRID('BOX3D(0 0,1 1)'::box3d,4326);
Звичайно, якщо ви змінюєте або додаєте рядки до таблиці mytable, ви повинні синхронізувати bbox. Найпростіший спосіб зробити це — використовувати тригери, але ви також можете змінити свою програму, щоб стовпець bbox завжди був актуальним, або виконувати запит UPDATE після кожної зміни.
The PostgreSQL CLUSTER command physically reorders table rows according to an index. For a mostly read-only table whose queries frequently use the same spatial index, this can reduce I/O and improve cache locality.
PostgreSQL supports clustering on GiST indices, including indices on nullable geometry columns. To cluster a table using a geometry index:
CLUSTER my_table USING my_geom_index;
CLUSTER
Іноді в таблиці трапляються дані 3D або 4D, але доступ до них завжди здійснюється за допомогою функцій ST_AsText() або ST_AsBinary(), сумісних з OpenGIS, які виводять тільки 2D-геометрії. Вони роблять це шляхом внутрішнього виклику функції ST_Force2D(), що створює значне навантаження для великих геометрій. Щоб уникнути цього навантаження, можна попередньо видалити ці додаткові виміри один раз і назавжди:
UPDATE mytable SET geom = ST_Force2D(geom); VACUUM FULL ANALYZE mytable;
Зверніть увагу, що якщо ви додали стовпець геометрії за допомогою AddGeometryColumn(), буде обмеження на розмір геометрії. Щоб обійти це обмеження, вам потрібно буде видалити обмеження. Не забудьте оновити запис у таблиці geometry_columns і потім знову створити обмеження.
У разі великих таблиць може бути доцільним розділити це оновлення на менші частини, обмеживши оновлення частиною таблиці за допомогою оператора WHERE та вашого первинного ключа або іншого можливого критерію, а також виконавши просту команду "VACUUM;" між оновленнями. Це значно зменшує потребу в тимчасовому дисковому просторі. Крім того, якщо ви маєте змішані геометрії розмірів, обмеження UPDATE за допомогою "WHERE dimension(geom)>2" пропускає перезапис геометрій, які вже є у 2D.
Нижче наведено функції, які можуть знадобитися користувачеві PostGIS. Існують також інші функції, які є необхідними допоміжними функціями для об'єктів PostGIS, але не використовуються звичайними користувачами.
![]() | |
PostGIS розпочав перехід від існуючої конвенції іменування до конвенції, орієнтованої на SQL-MM. В результаті, більшість функцій, які ви знаєте і любите, були перейменовані з використанням стандартного префікса просторового типу (ST). Попередні функції все ще доступні, хоча вони не вказані в цьому документі, де наведено оновлені функції, які є еквівалентними. Функції, що не вказані в цій документації, є застарілими і будуть видалені в майбутніх версіях, тому ПРИПИНІТЬ ЇХ ВИКОРИСТОВУВАТИ. |
У цьому розділі перелічено власні типи даних PostgreSQL, встановлені PostGIS для представлення просторових даних.
Кожен тип даних описує свою поведінку при перетворенні типів. Перетворення типів перетворює значення одного типу даних в інший тип. PostgreSQL дозволяє визначати поведінку перетворення для власних типів, а також функції, що використовуються для перетворення значень типів. Перетворення можуть мати автоматичну поведінку, що дозволяє автоматично перетворювати аргумент функції на тип, який підтримується функцією.
Деякі приведення мають явну поведінку, що означає, що приведення повинно бути вказано за допомогою синтаксису CAST(myval As sometype) або myval::sometype. Явне приведення типів дозволяє уникнути проблеми неоднозначних приведень, яка може виникнути при використанні перевантаженої функції, що не підтримує певний тип. Наприклад, функція може приймати box2d або box3d, але не geometry. Оскільки geometry має автоматичне приведення до обох типів box, це призводить до помилки «неоднозначна функція». Щоб запобігти помилці, використовуйте явне приведення до бажаного типу box.
Всі типи даних можуть бути перетворені в text, тому це не потрібно вказувати явно.
box2d — Тип, що представляє двовимірну обмежувальну рамку.
box2d — це тип просторових даних, що використовується для представлення двовимірної обмежувальної рамки, яка охоплює геометрію або сукупність геометрій. Наприклад, агрегатна функція ST_Extent повертає об'єкт box2d.
Представлення містить значення xmin, ymin, xmax, ymax. Це мінімальні та максимальні значення розмірів X та Y.
Об'єкти box2d мають текстове представлення, яке виглядає як BOX(1 2,5 6).
У цій таблиці наведено автоматичні та явні перетворення, дозволені для цього типу даних:
| Приведення типів в | Поведінка |
|---|---|
| box3d | автоматичне |
| geometry | автоматичне |
box3d — Тип, що представляє тривимірну обмежувальну рамку.
box3d — це тип просторових даних PostGIS, який використовується для представлення тривимірної обмежувальної рамки, що охоплює геометрію або сукупність геометрій. Наприклад, агрегатна функція ST_3DExtent повертає об'єкт box3d.
Представлення містить значення xmin, ymin, zmin, xmax, ymax, zmax. Це мінімальні та максимальні значення розмірів X, Y та Z.
Об'єкти box3d мають текстове представлення, яке виглядає як BOX3D(1 2 3,5 6 5).
У цій таблиці наведено автоматичні та явні перетворення, дозволені для цього типу даних:
| Приведення типів в | Поведінка |
|---|---|
| box | автоматичне |
| box2d | автоматичне |
| geometry | автоматичне |
geometry — Тип, що представляє просторові об'єкти з плоскими системами координат.
geometry — це основний тип просторових даних PostGIS, який використовується для представлення об'єкта в планарних (евклідових) системах координат.
Усі просторові операції над геометрією використовують одиниці виміру просторової системи координат, в якій знаходиться геометрія.
У цій таблиці наведено автоматичні та явні перетворення, дозволені для цього типу даних:
| Приведення типів в | Поведінка |
|---|---|
| box | автоматичне |
| box2d | автоматичне |
| box3d | автоматичне |
| bytea | автоматичне |
| geography | автоматичне |
| text | автоматичне |
geometry_dump — Композитний тип, що використовується для опису частин складної геометрії.
geometry_dump — це складний тип даних, що містить такі поля:
geom — геометрія, що представляє компонент скинутої геометрії. Тип геометрії залежить від вихідної функції.
path[] — масив цілих чисел, що визначає шлях навігації в межах скинутої геометрії до компонента geom. Масив шляхів базується на 1 (тобто path[1] є першим елементом)
Він використовується сімейством функцій ST_Dump* як тип виводу для розбиття складної геометрії на складові частини.
geography — Тип, що представляє просторові об'єкти з геодезичними (еліпсоїдальними) системами координат.
geography — це тип просторових даних, що використовується для представлення об'єкта в геодезичних системах координат. Геодезичні системи координат моделюють Землю за допомогою еліпсоїда.
Просторові операції з типом географії забезпечують більш точні результати завдяки врахуванню еліпсоїдальної моделі.
У цій таблиці наведено автоматичні та явні перетворення, дозволені для цього типу даних:
| Приведення типів в | Поведінка |
|---|---|
| geometry | explicit |
Ці функції допомагають визначати таблиці, що містять стовпці геометрії.
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 — це ім'я схеми таблиці. srid має бути цілочисельним значенням, що посилається на запис у таблиці SPATIAL_REF_SYS. type повинен бути рядком, що відповідає типу геометрії, наприклад, 'POLYGON' або 'MULTILINESTRING' . Якщо schema_name не існує (або не видно в поточному search_path) або вказаний SRID, тип геометрії або розмір є недійсними, виникає помилка.
Змінено: 2.0.0 Ця функція більше не оновлює geometry_columns, оскільки geometry_columns є поданням, яке зчитує дані з системних каталогів. За замовчуванням вона також не створює обмежень, а замість цього використовує вбудовану поведінку модифікатора типу PostgreSQL. Наприклад, створення стовпця wgs84 POINT за допомогою цієї функції тепер еквівалентно: ALTER TABLE some_table ADD COLUMN geom geometry(Point,4326);
Змінено: 2.0.0 Якщо вам потрібна стара поведінка обмежень, використовуйте стандартне значення use_typmod, але встановіть його на false.
Змінено: 2.0.0 Види більше не можна реєструвати вручну в geometry_columns, однак види, побудовані на основі геометрій таблиць типу typmod і використовувані без функцій-обгортки, реєструватимуться правильно, оскільки вони успадковують поведінку типу typmod стовпця батьківської таблиці. Види, які використовують функції геометрії, що виводять інші геометрії, потрібно буде перетворити на геометрії типу typmod, щоб ці стовпці геометрії виду були зареєстровані правильно в geometry_columns. Див. Розділ 4.6.3, «Manually Registering Geometry Columns».
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. За замовчуванням створюється стовпець геометрії typmod замість стовпця на основі обмежень.
This example creates a schema to hold data.
CREATE SCHEMA my_schema;
Create a simple PostgreSQL table in the schema.
CREATE TABLE my_schema.my_spatial_table (id serial);
Describing the table shows a single id column.
\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 column using the old constraint-based behavior.
SELECT AddGeometryColumn('my_schema', 'my_spatial_table', 'geom_c', 4326, 'POINT', 2, false);Add a CurvePolygon column using the old constraint-based behavior.
SELECT AddGeometryColumn('my_schema', 'my_spatial_table', 'geomcp_c', 4326, 'CURVEPOLYGON', 2, false);my_schema.my_spatial_table.geomcp_c SRID:4326 TYPE:CURVEPOLYGON DIMS:2
Describe the table again to see the new geometry columns.
\d my_schema.my_spatial_table
Table "my_schema.my_spatial_table"
Columns:
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)The 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 повинен відповідати полю f_table_schema рядка таблиці в таблиці geometry_columns.
![]() | |
|
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.
Changed: 2.0.0. Retained for backward compatibility after geometry_columns became a view of the system catalogs.
Use standard SQL to drop the geometry column. The geometry_columns view updates automatically.
ALTER TABLE my_schema.my_spatial_table DROP COLUMN geom;
The legacy compatibility function performs the equivalent operation.
SELECT DropGeometryColumn ('my_schema', 'my_spatial_table', 'geom');my_schema.my_spatial_table.geom effectively removed.
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. Примітка: використовує current_schema() в установках pgsql, що підтримують схеми, якщо схема не вказана.
![]() | |
|
Changed: 2.0.0. Retained for backward compatibility after geometry_columns became a view of the system catalogs.
Use standard SQL to drop a table containing geometry columns. The geometry_columns view updates automatically.
DROP TABLE my_schema.my_spatial_table;
The legacy compatibility function performs the equivalent operation.
SELECT DropGeometryTable ('my_schema', 'my_spatial_table');my_schema.my_spatial_table dropped.
Find_SRID — Повертає SRID, визначений для стовпця геометрії.
integer Find_SRID(varchar a_schema_name, varchar a_table_name, varchar a_geomfield_name);
Повертає ціле значення SRID вказаного стовпця геометрії, шукаючи його в таблиці GEOMETRY_COLUMNS. Якщо стовпець геометрії не був доданий належним чином (наприклад, за допомогою функції AddGeometryColumn), ця функція не працюватиме.
SELECT Find_SRID('public', 'tiger_us_state_2007', 'geom_4269');4269
Populate_Geometry_Columns — Забезпечує, щоб стовпці геометрії були визначені з модифікаторами типу або мали відповідні просторові обмеження.
text Populate_Geometry_Columns(boolean use_typmod=true);
int Populate_Geometry_Columns(oid relation_oid, boolean use_typmod=true);
Забезпечує, щоб стовпці геометрії мали відповідні модифікатори типу або просторові обмеження, щоб гарантувати їх правильну реєстрацію в перегляді geometry_columns. За замовчуванням перетворює всі стовпці геометрії без модифікатора типу на стовпці з модифікаторами типу.
Для забезпечення зворотної сумісності та для просторових потреб, таких як успадкування таблиць, де кожна дочірня таблиця може мати різний тип геометрії, все ще підтримується старе поведінка перевірки обмежень. Якщо вам потрібна стара поведінка, потрібно передати новий необов'язковий аргумент як false use_typmod=false. Після цього стовпці геометрії будуть створені без модифікаторів типу, але з 3 визначеними обмеженнями. Зокрема, це означає, що кожен стовпець геометрії, що належить до таблиці, має принаймні три обмеження:
enforce_dims_geom - гарантує, що всі геометричні об'єкти мають однакові розміри (див. ST_NDims)
enforce_geotype_geom - гарантує, що всі геометричні об'єкти мають однаковий тип (див. GeometryType)
enforce_srid_geom - гарантує, що всі геометричні об'єкти мають однакову проекцію (див. ST_SRID)
Якщо вказано таблицю oid, ця функція намагається визначити srid, розмірність та тип геометрії всіх стовпців геометрії в таблиці, додаючи обмеження за необхідності. У разі успіху відповідний рядок вставляється в таблицю geometry_columns, інакше виникає виняток і з'являється повідомлення про помилку з описом проблеми.
Якщо вказано oid перегляду, як і в разі табличного oid, ця функція намагається визначити srid, розмірність і тип усіх геометрій у перегляді, вставляючи відповідні записи в таблицю geometry_columns, але не виконує жодних дій для забезпечення обмежень.
Варіант без параметрів є простим обгорткою для параметризованого варіанту, який спочатку обрізає і заповнює таблицю geometry_columns для кожної просторової таблиці і перегляду в базі даних, додаючи просторові обмеження до таблиць, де це доречно. Він повертає підсумок кількості стовпців геометрії, виявлених в базі даних, і кількості, які були вставлені в таблицю geometry_columns. Параметризована версія просто повертає кількість рядків, вставлених у таблицю geometry_columns.
Доступність: 1.4.0
Змінено: 2.0.0 За замовчуванням тепер для обмеження типів геометрії використовуються модифікатори типів замість обмежень перевірки. Ви все ще можете використовувати поведінку обмежень перевірки, використовуючи новий параметр use_typmod і встановивши його значення false.
Покращено: 2.0.0 use_typmod додано опціональний аргумент, який дозволяє контролювати, чи створюються стовпці з типовими модифікаторами або з перевірками обмежень.
This example populates geometry column metadata using typmod behavior. For this to work, there must be existing data.
CREATE TABLE public.myspatial_table(gid serial, geom geometry);
INSERT INTO myspatial_table(geom) VALUES(ST_GeomFromText('LINESTRING(1 2,3 4)', 4326) );
SELECT Populate_Geometry_Columns('public.myspatial_table'::regclass);1
Describe the table to see the typmod-based geometry column.
\d myspatial_table
Table "public.myspatial_table"
Columns:
gid integer not null default nextval('myspatial_table_gid_seq'::regclass)
geom geometry(LineString,4326)This example changes the geometry columns to use constraints if they are not typmod or already constrained. For this to work, there must be existing 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);1
Describe the table to see the constraint-based geometry column.
\d myspatial_table_cs
Table "public.myspatial_table_cs"
Column | Type | Modifiers
--------+----------+------------------------------------------------------------------
gid | integer | not null default nextval('myspatial_table_cs_gid_seq'::regclass)
geom | geometry |
Check constraints:
"enforce_dims_geom" CHECK (st_ndims(geom) = 2)
"enforce_geotype_geom" CHECK (geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL)
"enforce_srid_geom" CHECK (st_srid(geom) = 4326)UpdateGeometrySRID — Оновлює SRID всіх об'єктів у стовпці геометрії та метадані таблиці.
text UpdateGeometrySRID(varchar table_name, varchar column_name, integer srid);
text UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid);
text UpdateGeometrySRID(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid);
Оновлює SRID всіх об'єктів у стовпці геометрії, оновлюючи обмеження та посилання в geometry_columns. Якщо стовпець був застосований за допомогою визначення типу, визначення типу буде змінено. Примітка: використовує current_schema() в установках pgsql, що підтримують схеми, якщо схема не вказана.
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 таблиці доріг на 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);
Збирає геометрії в колекцію геометрій. Результатом є або Multi*, або GeometryCollection, залежно від того, чи мають вхідні геометрії однаковий або різний тип (однорідні або неоднорідні). Вхідні геометрії залишаються незмінними в колекції.
Варіант 1: приймає дві вхідні геометрії
Варіант 2: приймає масив геометрій
Варіант 3: агрегатна функція, що приймає набір рядків геометрій.
![]() | |
|
If any input geometry is a collection (Multi* or GeometryCollection), ST_Collect returns a GeometryCollection, since that is the only type which can contain nested collections. To prevent this, use ST_Dump in a subquery to expand input collections to their atomic elements (see example below).
Доступність: 1.4.0 — додано ST_Collect(geomarray). ST_Collect було вдосконалено для швидшої обробки більшої кількості геометрій.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
Two-input variant.
Збір 2D точок.
SELECT ST_Collect(
'POINT(1 2)',
'POINT(-2 3)' );MULTIPOINT((1 2),(-2 3))
Збір 3D-точок.
SELECT ST_Collect(
'POINT(1 2 3)',
'POINT(1 2 4)' );MULTIPOINT(1 2 3,1 2 4)
Збір кривих.
SELECT ST_Collect(
'CIRCULARSTRING(220268 150415,220227 150505,220227 150406)',
'CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)');MULTICURVE(CIRCULARSTRING(220268 150415,220227 150505,220227 150406), CIRCULARSTRING(220227 150406,2220227 150407,220227 150406))
Array variant.
Використання конструктора масиву для підзапиту.
SELECT ST_Collect(ARRAY(SELECT geom FROM sometable));
Використання конструктора масиву для значень.
SELECT ST_Collect(
ARRAY[ 'LINESTRING(1 2,3 4)'::geometry,
'LINESTRING(3 4,4 5)'::geometry ] ) As wktcollect;MULTILINESTRING((1 2,3 4),(3 4,4 5))
Aggregate variant.
Створення декількох колекцій шляхом групування геометрій у таблиці.
SELECT stusps, ST_Collect(geom) AS geom FROM ( SELECT stusps, (ST_Dump(geom)).geom AS geom FROM somestatetable ) AS f GROUP BY stusps;
ST_LineFromMultiPoint — Створює LineString з геометрії MultiPoint.
geometry ST_LineFromMultiPoint(geometry aMultiPoint);
Створює LineString з геометрії MultiPoint.
Використовуйте ST_MakeLine для створення ліній з вхідних даних Point або LineString.
This function supports 3d and will not drop the z-index.
Створити 3D лінію з 3D MultiPoint
SELECT ST_LineFromMultiPoint('MULTIPOINT(1 2 3,4 5 6,7 8 9)');LINESTRING(1 2 3,4 5 6,7 8 9)
ST_MakeEnvelope — Створює прямокутний полігон з мінімальних і максимальних координат.
geometry ST_MakeEnvelope(float xmin, float ymin, float xmax, float ymax, integer srid=unknown);
Створює прямокутний полігон з мінімальних і максимальних значень для X і Y. Вхідні значення повинні бути в просторовій системі координат, визначеній SRID. Якщо SRID не вказано, використовується невідома просторова система координат (SRID 0).
Доступність: 1.5
Покращено: 2.0: Додано можливість вказати конверт без вказання SRID.
Building a bounding box polygon.
SELECT ST_MakeEnvelope(10, 10, 11, 11, 4326);
POLYGON((10 10, 10 11, 11 11, 11 10, 10 10))
ST_MakeLine — Створює LineString з геометрій Point, MultiPoint або LineString.
geometry ST_MakeLine(geometry geom1, geometry geom2);
geometry ST_MakeLine(geometry[] geoms_array);
geometry ST_MakeLine(geometry set geoms);
Створює об'єкт LineString, що містить точки геометрій Point, MultiPoint або LineString. Інші типи геометрії спричиняють помилку.
Варіант 1: приймає дві вхідні геометрії
Варіант 2: приймає масив геометрій
Варіант 3: агрегатна функція, що приймає набір рядків геометрій. Щоб забезпечити порядок вхідних геометрій, використовуйте ORDER BY у виклику функції або підзапит із розділом ORDER BY.
Повторювані вузли на початку вхідних LineStrings зводиться до однієї точки. Повторювані точки у вхідних Point і MultiPoint не зводяться. Компоненти MultiLineString обробляються в порядку їх появи в колекції. ST_RemoveRepeatedPointsможе використовуватися для зведення повторюваних точок з вихідного LineString.
This function supports 3d and will not drop the z-index.
Доступність: 3.7.0 — додано підтримку елементів введення MultiLineString
Доступність: 2.3.0 — додано підтримку елементів введення MultiPoint
Доступність: 2.0.0 - Додано підтримку елементів введення LineString
Доступність: 1.4.0 — додано ST_MakeLine(geomarray). Агрегатні функції ST_MakeLine було вдосконалено для швидшої обробки більшої кількості точок.
Two-input variant.
Створити лінію, що складається з двох точок.
SELECT ST_MakeLine(ST_Point(1, 2), ST_Point(3, 4));
LINESTRING(1 2,3 4)
Створити 3D лінію з двох 3D точок.
SELECT ST_MakeLine(ST_MakePoint(1, 2, 3), ST_MakePoint(3, 4, 5));
LINESTRING(1 2 3,3 4 5)
Створити лінію з двох роз'єднаних LineStrings.
SELECT ST_MakeLine('LINESTRING(0 0,1 1)', 'LINESTRING(2 2,3 3)');LINESTRING(0 0,1 1,2 2,3 3)
Array variant.
Створити лінію з масиву, сформованого підзапитом із сортуванням.
SELECT ST_MakeLine(ARRAY(SELECT ST_Centroid(geom) FROM visit_locations ORDER BY visit_time));
Створити 3D лінію з масиву 3D точок
SELECT ST_MakeLine(ARRAY[ST_MakePoint(1, 2, 3), ST_MakePoint(3, 4, 5), ST_MakePoint(6, 6, 6)]);
LINESTRING(1 2 3,3 4 5,6 6 6)
Aggregate variant.
У цьому прикладі запитуються послідовності точок GPS за часом із набору треків і створюється один запис для кожного треку. Результатом є геометрії LineStrings, що складаються з точок треку GPS у порядку руху.
Використання агрегату ORDER BY забезпечує правильний порядок LineString.
SELECT gps.track_id, ST_MakeLine(gps.geom ORDER BY gps_time) AS geom FROM gps_points AS gps GROUP BY gps.track_id;
Якщо сортування в межах агрегату неможливе, можна скористатися сортуванням у підзапиті. Однак іноді план запиту може не враховувати порядок підзапиту.
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 gps.track_id;
ST_RemoveRepeatedPoints, ST_AsEWKT, ST_AsText, ST_GeomFromText, ST_MakePoint, ST_Point
ST_MakePoint — Створює 2D, 3DZ або 4D точку.
geometry ST_MakePoint(float x, float y);
geometry ST_MakePoint(float x, float y, float z);
geometry ST_MakePoint(float x, float y, float z, float m);
Створює геометрію точки 2D XY, 3D XYZ або 4D XYZM. Використовуйте ST_MakePointM, щоб створити точки з координатами XYM.
Використовуйте ST_SetSRID, щоб вказати SRID для створеної точки.
Хоча ST_MakePoint не відповідає стандарту OGC, він працює швидше, ніж ST_GeomFromText та ST_PointFromText. Він також простіший у використанні для числових значень координат.
![]() | |
Для геодезичних координат |
![]() | |
Функції ST_Point, ST_PointZ, ST_PointM та ST_PointZM можна використовувати для створення точок із заданим SRID. |
This function supports 3d and will not drop the z-index.
This example creates a point with an unknown SRID.
SELECT ST_MakePoint(-71.1043443253471, 42.3150676015829);
This example creates a point in the WGS 84 geodetic CRS.
SELECT ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829), 4326);
This example creates a 3D point with altitude.
SELECT ST_MakePoint(1, 2, 1.5);
This example returns the Z coordinate of a point.
SELECT ST_Z(ST_MakePoint(1, 2, 1.5));
1.5
ST_GeomFromText, ST_PointFromText, ST_SetSRID, ST_MakePointM, ST_Point, ST_PointZ, ST_PointM, ST_PointZM
ST_MakePointM — Створює точку з значень X, Y та M.
geometry ST_MakePointM(float x, float y, float m);
Створює точку з координатами X, Y та M (вимірювання). Використовуйте ST_MakePoint, щоб створити точки з координатами XY, XYZ або XYZM.
Використовуйте ST_SetSRID, щоб вказати SRID для створеної точки.
![]() | |
Для геодезичних координат |
![]() | |
Функції ST_PointM та ST_PointZM можна використовувати для створення точок із значенням M та заданим SRID. |
Створити точку з невідомим SRID.
SELECT ST_MakePointM(-71.1043443253471, 42.3150676015829, 10);
POINTM(-71.1043443253471 42.3150676015829 10)
Створити точку з виміром у геодезичній системі координат WGS 84.
SELECT ST_SetSRID(ST_MakePointM(-71.104, 42.315, 10), 4326);
SRID=4326;POINTM(-71.104 42.315 10)
Отримати розмір створеної точки.
SELECT ST_M(ST_MakePointM(-71.104, 42.315, 10));
10
ST_MakePolygon — Creates a Polygon or CurvePolygon from a shell and optional list of holes.
geometry ST_MakePolygon(geometry linestring);
geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);
Creates a Polygon or CurvePolygon formed by the given shell and optional array of holes. Input geometries must be closed LineStrings, CircularStrings, CompoundCurves, or NURBSCurves (rings). If any input ring is curved, the result is a CurvePolygon.
Variant 1: Accepts one shell ring.
Variant 2: Accepts a shell ring and an array of inner (hole) rings. A geometry array can be constructed using the PostgreSQL array_agg(), ARRAY[] or ARRAY() constructs.
![]() | |
Ця функція не приймає MultiLineStrings. Використовуйте ST_LineMergeдля створення LineString або ST_Dumpдля вилучення LineStrings. |
This function supports 3d and will not drop the z-index.
Enhanced: 3.7.0 - Support for curved input rings was introduced.
Single input variant.
Створити полігон з 2D LineString.
SELECT ST_MakePolygon('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 'LINESTRING(75 29,77 29,77 29,75 29)'::geometry As open_line) As foo;
Створіть полігон із 3D-лінії
SELECT ST_MakePolygon('LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1)');POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
Створює полігон з лінії з вимірами
SELECT ST_MakePolygon('LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)');POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
Create a CurvePolygon from a CircularString shell.
SELECT ST_MakePolygon('CIRCULARSTRING(0 0,1 1,2 0,1 -1,0 0)');CURVEPOLYGON(CIRCULARSTRING(0 0,1 1,2 0,1 -1,0 0))
Outer shell with inner holes variant.
Створити полігон у формі пончика з додатковим отвором
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. (Однак, зверніть увагу, що якщо провінція має більше одного регіону або має острови, це призведе до створення недійсного полігону.) Використання LEFT JOIN гарантує, що всі провінції будуть включені, навіть якщо вони не мають озер.
![]() | |
Конструкція CASE використовується, оскільки передача нульового масиву в ST_MakePolygon призводить до повернення значення NULL. |
SELECT p.gid, p.province_name,
CASE
WHEN array_agg(w.geom) IS NULL THEN p.geom
ELSE ST_MakePolygon(
ST_LineMerge(ST_Boundary(p.geom)),
array_agg(w.geom)
)
END AS geom
FROM provinces p
LEFT JOIN waterlines w
ON ST_Within(w.geom, p.geom)
AND ST_IsClosed(w.geom)
GROUP BY p.gid, p.province_name, p.geom;
Інший метод полягає у використанні корельованого підзапиту та конструктора ARRAY(), який перетворює набір рядків у масив.
SELECT p.gid, p.province_name,
CASE
WHEN EXISTS (
SELECT w.geom
FROM waterlines w
WHERE ST_Within(w.geom, p.geom)
AND ST_IsClosed(w.geom)
)
THEN ST_MakePolygon(
ST_LineMerge(ST_Boundary(p.geom)),
ARRAY(
SELECT w.geom
FROM waterlines w
WHERE ST_Within(w.geom, p.geom)
AND ST_IsClosed(w.geom)
)
)
ELSE p.geom
END AS geom
FROM provinces p;
ST_Point — Створює точку із значеннями X, Y та SRID.
geometry ST_Point(float x, float y);
geometry ST_Point(float x, float y, integer srid=unknown);
Повертає точку з заданими значеннями координат X та Y. Це еквівалент 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
Geometry.
SELECT ST_Point(-71.104, 42.315);
Створення точки із зазначеним SRID:
SELECT ST_Point(-71.104, 42.315, 4326);
Альтернативний спосіб вказати SRID:
SELECT ST_SetSRID(ST_Point(-71.104, 42.315), 4326);
Створіть точки географії за допомогою синтаксису перетворення :::
SELECT ST_Point(-71.104, 42.315, 4326)::geography;
Код до PostGIS 3.2, що використовує CAST:
SELECT CAST(ST_SetSRID(ST_Point(-71.104, 42.315), 4326) AS geography);
Якщо координати точки не знаходяться в геодезичній системі координат (такій як WGS84), то перед перенесенням в географічну систему їх необхідно перепроектувати. У цьому прикладі точка в системі координат Pennsylvania State Plane feet (SRID 2273) перепроектована в систему WGS84 (SRID 4326).
SELECT ST_Transform(ST_Point(3637510, 3014852, 2273), 4326)::geography;
ST_MakePoint, ST_PointZ, ST_PointM, ST_PointZM, ST_SetSRID, ST_Transform
ST_PointZ — Створює точку з координатами X, Y, Z та значенням SRID.
geometry ST_PointZ(float x, float y, float z, integer srid=unknown);
Повертає точку з заданими значеннями координат X, Y і Z, а також, за бажанням, номер SRID.
Покращено: 3.2.0 Додано srid як додатковий опціональний аргумент. Старіші версії вимагають поєднання з ST_SetSRID для позначення srid на геометрії.
SELECT ST_PointZ(-71.104, 42.315, 3.4, 4326)
SELECT ST_PointZ(-71.104, 42.315, 3.4, srid => 4326)
SELECT ST_PointZ(-71.104, 42.315, 3.4)
ST_PointM — Створює точку з значеннями X, Y, M та SRID.
geometry ST_PointM(float x, float y, float m, integer srid=unknown);
Повертає точку з заданими значеннями координат X, Y і M, а також, за бажанням, номер SRID.
Покращено: 3.2.0 Додано srid як додатковий опціональний аргумент. Старіші версії вимагають поєднання з ST_SetSRID для позначення srid на геометрії.
SELECT ST_PointM(-71.104, 42.315, 3.4, 4326)
SELECT ST_PointM(-71.104, 42.315, 3.4, srid => 4326)
SELECT ST_PointM(-71.104, 42.315, 3.4)
ST_PointZM — Створює точку з значеннями X, Y, Z, M та SRID.
geometry ST_PointZM(float x, float y, float z, float m, integer srid=unknown);
Повертає точку з заданими значеннями координат X, Y, Z і M, а також, за бажанням, номер SRID.
Покращено: 3.2.0 Додано srid як додатковий опціональний аргумент. Старіші версії вимагають поєднання з ST_SetSRID для позначення srid на геометрії.
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5, 4326)
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5, srid => 4326)
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5)
ST_Polygon — Створює полігон з LineString із заданим SRID.
geometry ST_Polygon(geometry lineString, integer srid);
Повертає полігон, побудований з заданого LineString, і встановлює систему просторових координат з srid.
ST_Polygon схожий на ST_MakePolygonВаріант 1 з додаванням налаштування SRID.
Для створення полігонів з отворами використовуйте ST_MakePolygonВаріант 2, а потім ST_SetSRID.
![]() | |
Ця функція не приймає MultiLineStrings. Використовуйте ST_LineMergeдля створення LineString або ST_Dumpдля вилучення LineStrings. |
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.
Створити 2D полігон.
SELECT ST_Polygon('LINESTRING(75 29,77 29,77 31,75 31,75 29)'::geometry, 4326);POLYGON((75 29,77 29,77 31,75 31,75 29))
Створити 3D полігон.
SELECT ST_Polygon('LINESTRING(75 29 1,77 29 2,77 31 2,75 31 1,75 29 1)'::geometry, 4326);SRID=4326;POLYGON((75 29 1,77 29 2,77 31 2,75 31 1,75 29 1))
ST_AsEWKT, ST_AsText, ST_GeomFromEWKT, ST_GeomFromText, ST_LineMerge, ST_MakePolygon
ST_TileEnvelope — Створює прямокутний полігон у Web Mercator (SRID:3857) за допомогою системи тайлів XYZ.
geometry ST_TileEnvelope(integer tileZoom, integer tileX, integer tileY, geometry bounds=SRID=3857;LINESTRING(-20037508.342789 -20037508.342789,20037508.342789 20037508.342789), float margin=0.0);
Створює прямокутний полігон, що визначає розмір плитки в системі плиток XYZ. Плитка визначається рівнем масштабування Z та індексом XY плитки в сітці на цьому рівні. Може використовуватися для визначення меж плитки, необхідних для ST_AsMVTGeom для перетворення геометрії в координатну систему плиток MVT.
За замовчуванням контур плитки знаходиться в системі координат Web Mercator (SRID:3857) з використанням стандартного діапазону системи Web Mercator (-20037508.342789, 20037508.342789). Це найпоширеніша система координат, що використовується для плиток MVT. Додатковий параметр bounds можна використовувати для створення плиток у будь-якій системі координат. Це геометрія, що має SRID і розмір квадрата "Рівень масштабування нуль", в якому вписана система плиток XYZ.
Додатковий параметр margin можна використовувати для розширення плитки на заданий відсоток. Наприклад, margin=0.125 розширює плитку на 12,5%, що еквівалентно buffer=512, коли розмір плитки становить 4096, як використовується в ST_AsMVTGeom. Це корисно для створення буфера плиток, щоб включити дані, які лежать за межами видимої області плитки, але наявність яких впливає на візуалізацію плитки. Наприклад, назва міста (точка) може бути поблизу краю плитки, тому її мітка повинна бути візуалізована на двох плитках, навіть якщо точка розташована у видимій області лише однієї плитки. Використання розширених плиток у запиті дозволить включити точку міста в обидві плитки. Для зменшення плитки використовуйте від'ємне значення. Значення менше -0.5 заборонені, оскільки це призведе до повного видалення плитки. Не вказуйте поле при використанні з ST_AsMVTGeom. Дивіться приклад для ST_AsMVT.
Покращено: 3.1.0 Додано параметр поля.
Доступність: 3.0.0
Show tile (2, 1, 1) within the root tile (0, 0, 0).
SELECT ST_TileEnvelope(0, 0, 0) AS input_z0_x0_y0, ST_TileEnvelope(2, 1, 1) AS z2_x1_y1;
input_z0_x0_y0 | z2_x1_y1 ----------------+----------- POLYGON((-20037508.342789244 -20037508.342789244,-20037508.342789244 20037508.342789244,20037508.342789244 20037508.342789244,20037508.342789244 -20037508.342789244,-20037508.342789244 -20037508.342789244)) | POLYGON((-10018754.171394622 0,-10018754.171394622 10018754.171394622,0 10018754.171394622,0 0,-10018754.171394622 0))
SELECT ST_TileEnvelope(3, 1, 1, ST_MakeEnvelope(-180, -90, 180, 90, 4326));
POLYGON((-135 45,-135 67.5,-90 67.5,-90 45,-135 45))
ST_HexagonGrid — Повертає набір шестикутників та індексів комірок, які повністю покривають межі аргументу геометрії.
setof record ST_HexagonGrid(float8 size, geometry bounds);
Starts with the concept of a hexagon tiling of the plane. (Not a hexagon tiling of the globe; for H3 use the h3-pg extension.) For a given planar SRS, and a given edge size, starting at the origin of the SRS, there is one unique hexagonal tiling of the plane, Tiling(SRS, Size). This function answers the question: what hexagons in a given Tiling(SRS, Size) overlap with a given bounds.

SRS для вихідних шестикутників — це SRS, що надається геометрією меж.
Подвоєння або потроєння розміру ребра шестикутника створює нову батьківську мозаїку, яка відповідає вихідній мозаїці. На жаль, неможливо створити батьківську мозаїку з шестикутників, в яку ідеально вписуються дочірні плитки.
Доступність: 3.1.0
Unit hexagons covering rectangular bounds.
WITH bounds AS (
SELECT ST_MakeEnvelope(2, 1, 4, 3, 3857) AS geom
), grid AS (
SELECT hex.*
FROM bounds
CROSS JOIN LATERAL ST_HexagonGrid(1, geom) AS hex
)
SELECT (SELECT geom FROM bounds) AS input_bounds,
ST_Collect(geom ORDER BY i, j) AS grid
FROM grid;POLYGON((2 1,2 3,4 3,4 1,2 1)) | MULTIPOLYGON(((0.5 0.866,1 0,2 0,2.5 0.866,2 1.732,1 1.732,0.5 0.866)),((0.5 2.598,1 1.732,2 1.732,2.5 2.598,2 3.464,1 3.464,0.5 2.598)),((2 1.732,2.5 0.866,3.5 0.866,4 1.732,3.5 2.598,2.5 2.598,2 1.732)),((2 3.464,2.5 2.598,3.5 2.598,4 3.464,3.5 4.33,2.5 4.33,2 3.464)),((3.5 0.866,4 0,5 0,5.5 0.866,5 1.732,4 1.732,3.5 0.866)),((3.5 2.598,4 1.732,5 1.732,5.5 2.598,5 3.464,4 3.464,3.5 2.598)))
Child tiles that intersect a doubled-size parent hexagon share the tiling origin, but do not nest perfectly inside the parent.
WITH parent AS (
SELECT ST_Hexagon(2, 0, 0) AS geom
), children AS (
SELECT child.*
FROM parent
CROSS JOIN LATERAL ST_HexagonGrid(1, geom) AS child
WHERE ST_Area(ST_Intersection(child.geom, parent.geom)) > 0
)
SELECT ST_Collect(geom ORDER BY i, j) AS children,
(SELECT geom FROM parent) AS parent
FROM children;MULTIPOLYGON(((-2.5 -0.866,-2 -1.732,-1 -1.732,-0.5 -0.866,-1 0,-2 0,-2.5 -0.866)),((-2.5 0.866,-2 0,-1 0,-0.5 0.866,-1 1.732,-2 1.732,-2.5 0.866)),((-1 -1.732,-0.5 -2.598,0.5 -2.598,1 -1.732,0.5 -0.866,-0.5 -0.866,-1 -1.732)),((-1 0,-0.5 -0.866,0.5 -0.866,1 0,0.5 0.866,-0.5 0.866,-1 0)),((-1 1.732,-0.5 0.866,0.5 0.866,1 1.732,0.5 2.598,-0.5 2.598,-1 1.732)),((0.5 -0.866,1 -1.732,2 -1.732,2.5 -0.866,2 0,1 0,0.5 -0.866)),((0.5 0.866,1 0,2 0,2.5 0.866,2 1.732,1 1.732,0.5 0.866))) | POLYGON((-2 0,-1 -1.732,1 -1.732,2 0,1 1.732,-1 1.732,-2 0))
Counting points in hexagons.
Щоб зробити підсумок точок на шестикутній мозаїці, створіть шестикутну сітку, використовуючи межі точок як обмеження, а потім просторово з'єднайте її з цією сіткою.
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;Generating hex coverage of polygons.
If a grid is generated for each polygon boundary and filtered to intersecting cells, adjacent regions receive overlapping hexagons along their shared border. The build-time figure below uses two simple regions in place of an external administrative-boundary table, so the example is self-contained.

WITH admin1(gid, geom) AS (
VALUES
(1, ST_MakeEnvelope(0, 0, 3, 3, 3857)),
(2, ST_MakeEnvelope(3, 0, 6, 3, 3857))
), coverage AS (
SELECT hex.i, hex.j, hex.geom
FROM admin1
CROSS JOIN LATERAL ST_HexagonGrid(1.5, admin1.geom) AS hex
WHERE ST_Intersects(admin1.geom, hex.geom)
GROUP BY hex.i, hex.j, hex.geom
), layers AS (
SELECT 'region' AS kind, gid AS position, geom
FROM admin1
UNION ALL
SELECT
'hexagon',
1000 + row_number() OVER (ORDER BY i, j),
geom
FROM coverage
)
SELECT
CASE kind WHEN 'region' THEN geom END AS input_region,
CASE kind WHEN 'hexagon' THEN geom END AS hexagon
FROM layers
ORDER BY position;POLYGON((0 0,0 3,3 3,3 0,0 0)) | null POLYGON((3 0,3 3,6 3,6 0,3 0)) | null null | POLYGON((-1.5 0,-0.75 -1.3,0.75 -1.3,1.5 0,0.75 1.3,-0.75 1.3,-1.5 0)) null | POLYGON((-1.5 2.6,-0.75 1.3,0.75 1.3,1.5 2.6,0.75 3.9,-0.75 3.9,-1.5 2.6)) null | POLYGON((0.75 1.3,1.5 0,3 0,3.75 1.3,3 2.6,1.5 2.6,0.75 1.3)) null | POLYGON((0.75 3.9,1.5 2.6,3 2.6,3.75 3.9,3 5.2,1.5 5.2,0.75 3.9)) null | POLYGON((3 0,3.75 -1.3,5.25 -1.3,6 0,5.25 1.3,3.75 1.3,3 0)) null | POLYGON((3 2.6,3.75 1.3,5.25 1.3,6 2.6,5.25 3.9,3.75 3.9,3 2.6)) null | POLYGON((5.25 1.3,6 0,7.5 0,8.25 1.3,7.5 2.6,6 2.6,5.25 1.3)) null | POLYGON((5.25 3.9,6 2.6,7.5 2.6,8.25 3.9,7.5 5.2,6 5.2,5.25 3.9))
The same pattern applies to a real administrative-boundary table:
![]() | |
Ключове слово LATERAL є імпліцитним для функцій, що повертають набір, коли вони посилаються на попередню таблицю в списку FROM. Тому CROSS JOIN LATERAL, 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_EstimatedExtent, ST_SetSRID, ST_SquareGrid, ST_TileEnvelope
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
Creating a hexagon at the origin.
SELECT ST_SetSRID(ST_Hexagon(1.0, 0, 0), 3857);
POLYGON((-1 0,-0.5 -0.8660254037844387,0.5 -0.8660254037844387,1 0,0.5 0.8660254037844387,-0.5 0.8660254037844387,-1 0))
ST_SquareGrid — Повертає набір квадратів сітки та індексів комірок, які повністю покривають межі аргументу геометрії.
setof record ST_SquareGrid(float8 size, geometry bounds);
Починається з концепції квадратного покриття площини. Для заданої плоскої SRS і заданого розміру ребра, починаючи від початку SRS, існує одне унікальне квадратне покриття площини, Tiling(SRS, Size). Ця функція відповідає на питання: які сітки в заданому Tiling(SRS, Size) перекриваються з заданими межами.
SRS для вихідних квадратів — це SRS, що надається геометрією меж.
Подвоєння або розмір краю квадрата створює нову батьківську мозаїку, яка ідеально підходить до оригінальної мозаїки. Стандартні веб-карти в проекції Меркатора — це просто квадратні сітки, що є степенями числа два в площині Меркатора.
Доступність: 3.1.0
Generating a 1 degree grid for a country.
Сітка заповнить всю територію країни, тому якщо вам потрібні лише квадрати, що торкаються країни, вам доведеться потім відфільтрувати їх за допомогою ST_Intersects.
WITH grid AS ( SELECT (ST_SquareGrid(1, ST_Transform(geom, 4326))).* FROM admin0 WHERE name = 'Canada' ) SELEcT geom FROM grid
Counting points in squares (using single chopped 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;Counting points in squares using set of grid per point.
Це дає той самий результат, що й у першому прикладі, але буде повільніше для великої кількості точок
SELECT COUNT(*), squares.geom FROM pointtable AS pts INNER JOIN ST_SquareGrid( 1000, pts.geom ) AS squares ON ST_Intersects(pts.geom, squares.geom) GROUP BY squares.geom;
ST_TileEnvelope, ST_HexagonGrid , ST_EstimatedExtent , ST_SetSRID
ST_Square — Повертає один квадрат, використовуючи заданий розмір сторони та координати комірки в просторі квадратної сітки.
geometry ST_Square(float8 size, integer cell_i, integer cell_j, geometry origin='POINT(0 0)');
Використовує ту саму концепцію квадратної мозаїки, що й ST_SquareGrid, але створює лише один квадрат у бажаних координатах комірки. За бажанням можна налаштувати координати початку мозаїки, за замовчуванням початок знаходиться в точці 0,0.
Квадрати генеруються з SRID заданого початку координат. Використовуйте ST_SetSRID, щоб встановити SRID, якщо заданий початок координат має невідомий SRID (як це відбувається за замовчуванням).
Доступність: 3.1.0
Creating a square at the origin.
SELECT ST_SetSRID(ST_Square(1.0, 0, 0), 3857);
st_astext ------------------------------------- POLYGON((0 0,0 1,1 1,1 0,0 0)) (1 row)
ST_Letters — Повертає введені літери, відтворені як геометрія, з початковою позицією за замовчуванням в початку координат і висотою тексту за замовчуванням 100.
geometry ST_Letters(text letters, json font);
Використовує вбудований шрифт для відображення рядка як мультиполігональної геометрії. За замовчуванням висота тексту становить 100,0, відстань від нижньої частини нижнього виступу до верхньої частини великої літери. За замовчуванням початкова позиція розміщує початок базової лінії в точці початку координат. Для заміни шрифту потрібно передати карту json, де ключем є символ, а TWKB, закодований у base64, — форма шрифту, висота шрифтів становить 1000 одиниць від нижньої частини нижнього виступу до верхньої частини великої літери.
Текст за замовчуванням генерується в точці початку координат, тому щоб змінити його положення та розмір, спочатку застосуйте функцію ST_Scale, а потім функцію ST_Translate.
Доступність: 3.3.0
Generating the word 'Yo'.
SELECT ST_Letters('Yo');MULTIPOLYGON(((34.5 73.8,54 73.8,53.1 72.9,35.1 28.7,35.1 0.9,36 0,18 0,19 0.9,19 28.7,0.9 72.9,0 73.8,19.5 73.8,18.6 72.9,23 61.6,27 47.4,31.1 61.9,35.4 72.9,34.5 73.8)),((68.87 58,69.97 58,71.07 57.9,72.17 57.8,73.17 57.7,74.27 57.5,75.27 57.3,76.17 57.1,77.17 56.8,78.07 56.5,78.97 56.1,79.87 55.7,80.67 55.3,81.47 54.8,82.27 54.3,82.97 53.7,83.67 53.1,84.37 52.5,84.97 51.8,85.57 51.1,86.07 50.3,86.57 49.5,87.07 48.7,87.57 47.9,87.97 47,88.37 46.1,88.67 45.1,88.97 44.1,89.17 43.1,89.37 42.1,89.47 41,89.57 39.9,89.57 38.7,89.57 18.9,89.57 17.7,89.47 16.6,89.37 15.5,89.17 14.5,88.97 13.5,88.77 12.5,88.47 11.5,88.07 10.6,87.67 9.7,87.27 8.9,86.77 8.1,86.27 7.3,85.67 6.6,85.07 5.9,84.47 5.2,83.77 4.6,83.07 4,82.27 3.5,81.57 2.9,80.77 2.5,79.87 2,79.07 1.6,78.17 1.2,77.27 0.8,76.37 0.5,75.37 0.2,74.37 0,73.37 -0.2,72.27 -0.4,71.17 -0.5,70.07 -0.5,68.97 -0.5,67.87 -0.5,66.77 -0.4,65.67 -0.3,64.57 -0.2,63.57 0,62.57 0.2,61.57 0.5,60.57 0.8,59.67 1.1,58.77 1.5,57.87 1.9,57.07 2.4,56.27 2.9,55.47 3.4,54.77 3.9,54.07 4.5,53.37 5.1,52.77 5.8,52.17 6.5,51.67 7.2,51.17 8,50.67 8.8,50.17 9.7,49.77 10.6,49.37 11.5,49.07 12.5,48.77 13.5,48.57 14.5,48.37 15.6,48.27 16.7,48.17 17.8,48.17 18.9,48.17 38.7,48.17 39.9,48.27 41,48.37 42.1,48.57 43.1,48.77 44.1,48.97 45.1,49.27 46.1,49.67 47,50.07 47.9,50.47 48.7,50.97 49.5,51.47 50.3,52.07 51,52.67 51.7,53.27 52.4,53.97 53,54.67 53.6,55.47 54.1,56.17 54.6,57.07 55.1,57.87 55.6,58.77 56,59.67 56.4,60.57 56.7,61.57 57,62.47 57.3,63.47 57.5,64.57 57.7,65.57 57.8,66.67 57.9,67.77 58,68.87 58),(73.77 38.9,72.27 41.6,68.97 42.6,65.57 41.7,64.07 38.9,64.07 18.9,65.47 16.2,68.77 15.2,72.07 16.1,73.77 18.9,73.77 38.9)))
Generating the word 'PostGIS'.
SELECT ST_Letters('PostGIS') AS letters;MULTIPOLYGON(((43 39,43 38,42 37,42 36,42 35,42 34,42 33,42 32,41 31,41 30,40 29,40 28,39 28,39 27,38 26,38 26,37 25,36 24,36 24,35 24,34 23,33 23,33 22,32 22,31 22,30 21,29 21,28 21,27 21,26 20,25 20,24 20,23 20,17 20,17 1,18 0,0 0,1 1,1 73,0 74,23 74,24 74,25 74,26 74,27 74,28 73,29 73,30 73,31 73,32 72,33 72,33 72,34 72,35 71,36 70,36 70,37 69,38 69,38 68,39 67,39 67,40 66,40 65,41 64,41 64,42 63,42 62,42 61,42 60,42 58,42 57,43 56,43 55,43 39),(26 56,26 58,23 59,17 59,17 35,23 35,26 36,26 38,26 56)),((69 58,70 58,71 58,72 58,73 58,74 58,75 57,76 57,77 57,78 56,79 56,80 56,81 55,82 55,82 54,83 54,84 53,85 52,85 52,86 51,86 50,87 50,87 49,88 48,88 47,89 46,89 45,89 44,89 43,90 42,90 41,90 40,90 39,90 19,90 18,90 17,90 16,89 14,89 14,89 12,89 12,88 11,88 10,87 9,87 8,86 7,86 7,85 6,85 5,84 5,83 4,82 4,82 3,81 2,80 2,79 2,78 1,77 1,77 0,76 0,75 0,74 0,72 0,71 0,70 0,69 0,68 0,67 0,66 0,65 0,64 0,63 0,62 0,61 1,60 1,59 2,58 2,57 2,56 3,56 3,55 4,54 4,54 5,53 6,52 6,52 7,51 8,51 9,50 10,50 11,50 12,49 12,49 14,49 14,49 16,48 17,48 18,48 19,48 39,48 40,48 41,49 42,49 43,49 44,49 45,49 46,50 47,50 48,51 49,51 50,52 50,52 51,53 52,53 52,54 53,55 54,56 54,56 55,57 55,58 56,59 56,60 56,61 57,62 57,63 57,64 58,65 58,66 58,67 58,68 58,69 58),(74 39,72 42,69 43,66 42,64 39,64 19,66 16,69 15,72 16,74 19,74 39)),((111 38,112 37,112 37,113 37,113 37,114 36,115 36,116 36,116 36,117 35,118 35,119 34,120 34,121 33,121 33,122 32,123 32,124 31,125 30,126 30,126 29,127 28,128 27,128 27,129 26,129 25,130 24,130 23,131 22,131 21,131 20,131 18,131 17,131 16,131 15,131 14,130 12,130 11,130 10,129 9,129 8,128 8,128 7,127 6,127 5,126 5,126 4,125 3,124 3,124 2,123 2,122 1,121 1,120 1,120 0,119 0,118 0,117 0,116 0,115 0,114 0,113 0,112 0,111 0,110 0,110 0,109 0,108 0,107 0,106 0,105 0,104 0,103 0,102 1,101 1,100 1,99 2,97 2,96 3,95 3,94 4,99 19,99 19,100 18,100 18,100 18,101 18,101 18,102 18,102 18,103 17,103 17,104 17,104 17,105 17,105 17,106 16,106 16,107 16,107 16,108 16,108 16,109 16,110 16,110 16,111 16,111 16,112 15,112 15,113 15,113 15,113 15,114 15,114 15,115 16,115 16,115 17,115 17,115 18,115 18,115 19,115 19,115 20,114 20,114 20,113 20,113 20,113 20,112 20,112 21,111 21,111 21,110 21,109 22,109 22,108 22,108 22,107 23,107 23,106 24,106 24,105 24,104 24,104 25,103 25,103 26,102 26,102 26,101 27,101 28,100 28,100 28,99 29,99 30,98 30,98 31,98 31,97 32,97 33,97 33,96 34,96 35,96 35,96 36,96 37,96 38,96 38,95 39,95 40,95 41,96 42,96 43,96 43,96 44,96 45,96 45,96 46,97 47,97 47,97 48,97 48,97 49,98 49,98 50,98 50,99 51,99 51,99 52,100 52,100 52,100 53,101 53,101 53,101 54,101 54,102 54,102 54,102 55,103 55,103 55,103 55,104 56,105 56,106 56,106 57,107 57,108 57,109 58,110 58,111 58,112 58,113 58,114 58,115 58,116 58,117 58,118 58,118 58,119 58,120 58,121 57,122 57,123 57,123 57,124 56,125 56,126 56,126 56,127 56,127 55,128 55,128 55,129 55,129 55,123 40,123 40,122 40,122 40,122 40,122 40,121 40,121 40,121 41,120 41,120 41,119 41,119 41,119 41,118 41,118 41,118 41,117 41,117 41,117 42,116 42,116 42,115 42,115 42,115 42,114 42,114 42,114 42,113 42,113 42,113 42,112 42,112 42,112 42,112 42,112 42,112 42,112 42,112 42,112 42,111 42,111 42,111 41,111 41,111 41,111 41,111 41,111 40,111 40,111 40,111 40,111 40,111 40,111 39,111 39,111 39,111 39,111 39,111 38,111 38,111 38,111 38,111 38,111 38,111 38)),((161 15,166 15,167 16,167 -1,166 0,160 0,160 0,159 0,158 0,157 0,157 0,156 0,155 0,155 0,154 0,153 0,153 1,152 1,151 1,151 1,150 2,149 2,149 2,148 3,147 3,147 4,146 4,146 5,145 5,145 6,144 6,144 7,143 8,143 9,142 10,142 10,141 11,141 12,141 43,136 43,135 42,135 59,136 58,141 58,141 74,140 75,158 75,157 74,157 58,165 58,166 59,166 42,165 43,157 43,157 18,157 17,157 17,157 17,158 17,158 16,158 16,158 16,159 16,159 16,159 16,160 16,160 15,160 15,161 15,161 15,161 15)),((214 13,214 12,213 12,213 11,213 10,212 10,212 9,212 8,211 8,211 7,210 6,210 6,209 5,209 5,208 4,208 4,207 3,206 3,206 2,205 2,204 2,203 1,203 1,202 0,201 0,200 0,199 0,199 0,198 0,197 0,196 -1,195 -1,194 -1,193 -1,192 -1,190 0,189 0,188 0,187 0,186 0,185 1,184 1,183 1,182 2,182 2,181 3,180 3,179 4,178 4,178 5,177 6,176 6,176 7,175 8,175 9,175 10,174 10,174 11,174 12,173 13,173 14,173 15,173 16,173 18,173 19,173 54,173 56,173 56,173 57,173 58,173 59,173 60,173 61,174 62,174 63,174 64,174 64,175 65,175 66,176 67,176 68,177 68,177 69,178 70,179 70,179 71,180 71,181 72,182 72,183 72,184 73,185 73,186 73,187 74,188 74,189 74,190 74,192 74,210 74,210 58,192 58,191 58,191 58,191 58,190 58,190 58,190 58,190 57,189 57,189 57,189 56,189 56,189 56,189 56,189 55,189 55,189 54,189 19,189 19,189 18,189 18,189 18,189 17,189 17,189 17,190 17,190 16,190 16,191 16,191 16,191 16,192 15,192 15,193 15,193 15,193 15,194 15,194 15,195 15,195 15,196 15,196 15,196 15,197 15,197 15,198 16,198 16,198 16,199 16,199 16,199 32,193 32,193 46,214 46,214 13)),((236 73,236 1,237 0,219 0,220 1,220 73,219 74,237 74,236 73)),((264 45,265 45,266 44,266 44,267 44,268 43,269 43,270 42,271 42,272 42,273 41,274 40,274 40,275 39,276 39,277 38,277 38,278 37,279 36,279 35,280 35,280 34,281 33,281 32,282 31,282 30,283 29,283 28,283 27,283 26,284 25,284 24,284 22,283 21,283 20,283 20,283 19,283 18,283 17,283 16,283 15,282 15,282 14,282 13,282 13,281 12,281 11,281 11,280 10,280 10,280 9,279 9,279 8,279 8,278 7,278 7,278 6,277 6,277 6,276 5,276 5,276 5,275 4,275 4,275 4,274 3,273 3,272 2,271 2,270 1,269 1,268 1,267 0,266 0,264 0,263 0,262 0,261 0,260 0,259 0,258 0,257 0,256 0,255 0,253 0,252 0,251 1,250 1,249 2,248 2,247 2,246 3,245 3,244 4,243 4,242 4,242 5,246 21,247 20,248 20,248 20,249 20,250 19,251 19,251 19,252 18,253 18,254 18,255 18,255 17,256 17,257 17,258 17,259 17,259 16,260 16,261 16,262 16,262 17,263 17,264 17,264 17,265 17,265 18,266 18,266 19,267 19,267 20,267 21,267 22,267 22,267 23,267 23,267 24,267 24,267 24,267 25,266 25,266 26,265 26,265 26,264 27,264 27,263 28,262 28,261 28,261 29,260 29,259 30,258 30,258 30,257 31,256 31,255 32,254 32,253 33,253 33,252 34,251 34,250 35,249 36,248 36,248 37,247 38,246 39,246 39,245 40,244 41,244 42,244 43,243 44,243 45,243 46,242 47,242 49,242 50,242 51,242 53,242 55,242 56,242 58,243 60,243 61,244 62,245 64,246 65,247 66,248 67,249 68,250 69,251 70,252 71,253 72,255 72,256 73,258 73,259 74,261 74,262 74,264 74,265 74,267 74,269 74,270 74,272 73,274 73,275 73,277 72,279 72,280 71,275 56,275 57,274 57,274 57,273 57,273 57,272 57,271 58,271 58,270 58,269 58,269 58,268 58,267 58,267 58,266 58,265 58,265 58,264 58,263 58,263 58,262 58,262 58,261 57,260 57,260 56,260 56,259 56,259 55,258 54,258 54,258 53,258 52,258 52,258 51,258 51,258 50,258 50,259 49,259 48,259 48,260 48,260 47,261 47,262 46,262 46,263 46,263 45,264 45)))
Scaling and moving words.
WITH letters AS (
SELECT ST_Letters('Yo') AS geom
)
SELECT geom AS input_letters,
ST_Translate(ST_Scale(geom, 2, 2), 120, 0)
AS scaled_letters
FROM letters;MULTIPOLYGON(((34 74,54 74,53 73,35 29,35 1,36 0,18 0,19 1,19 29,1 73,0 74,20 74,19 73,23 62,27 47,31 62,35 73,34 74)),((69 58,70 58,71 58,72 58,73 58,74 58,75 57,76 57,77 57,78 56,79 56,80 56,81 55,81 55,82 54,83 54,84 53,84 52,85 52,86 51,86 50,87 50,87 49,88 48,88 47,88 46,89 45,89 44,89 43,89 42,89 41,90 40,90 39,90 19,90 18,89 17,89 16,89 14,89 14,89 12,88 12,88 11,88 10,87 9,87 8,86 7,86 7,85 6,84 5,84 5,83 4,82 4,82 3,81 2,80 2,79 2,78 1,77 1,76 0,75 0,74 0,73 0,72 0,71 0,70 0,69 0,68 0,67 0,66 0,65 0,64 0,63 0,62 0,61 1,60 1,59 2,58 2,57 2,56 3,55 3,55 4,54 4,53 5,53 6,52 6,52 7,51 8,51 9,50 10,50 11,49 12,49 12,49 14,49 14,48 16,48 17,48 18,48 19,48 39,48 40,48 41,48 42,49 43,49 44,49 45,49 46,50 47,50 48,50 49,51 50,51 50,52 51,53 52,53 52,54 53,55 54,55 54,56 55,57 55,58 56,59 56,60 56,61 57,62 57,62 57,63 58,65 58,66 58,67 58,68 58,69 58),(74 39,72 42,69 43,66 42,64 39,64 19,65 16,69 15,72 16,74 19,74 39))) | MULTIPOLYGON(((189 148,228 148,226 146,190 57,190 2,192 0,156 0,158 2,158 57,122 146,120 148,159 148,157 146,166 123,174 95,182 124,191 146,189 148)),((258 116,260 116,262 116,264 116,266 115,269 115,271 115,272 114,274 114,276 113,278 112,280 111,281 111,283 110,285 109,286 107,287 106,289 105,290 104,291 102,292 101,293 99,294 97,295 96,296 94,297 92,297 90,298 88,298 86,299 84,299 82,299 80,299 77,299 38,299 35,299 33,299 31,298 29,298 27,298 25,297 23,296 21,295 19,295 18,294 16,293 15,291 13,290 12,289 10,288 9,286 8,285 7,283 6,282 5,280 4,278 3,276 2,275 2,273 1,271 0,269 0,267 0,265 -1,262 -1,260 -1,258 -1,256 -1,254 -1,251 -1,249 0,247 0,245 0,243 1,241 2,239 2,238 3,236 4,234 5,233 6,231 7,230 8,228 9,227 10,226 12,224 13,223 14,222 16,221 18,220 19,220 21,219 23,218 25,218 27,217 29,217 31,217 33,216 36,216 38,216 77,216 80,217 82,217 84,217 86,218 88,218 90,219 92,219 94,220 96,221 97,222 99,223 101,224 102,225 103,227 105,228 106,229 107,231 108,232 109,234 110,236 111,238 112,239 113,241 113,243 114,245 115,247 115,249 115,251 116,253 116,256 116,258 116),(268 78,265 83,258 85,251 83,248 78,248 38,251 32,258 30,264 32,268 38,268 78)))
ST_MakeNurbsCurve — Creates a NURBS (Non-Uniform Rational B-Spline) curve from control points, optional weights, and optional knot vector.
geometry ST_MakeNurbsCurve(integer degree, geometry control_points, float8[] weights, float8[] knots);
Creates a NURBS (Non-Uniform Rational B-Spline) curve geometry from the specified parameters. NURBS curves are smooth parametric curves that provide precise control over curve shape through control points, weights, and knot values.
The degree parameter specifies the polynomial degree of the curve (must be between 1 and 10). Higher degrees produce smoother curves.
The control_points must be a LINESTRING geometry defining the control polygon. The number of control points must be at least degree + 1.
The optional weights array assigns a weight to each control point. All weights must be positive. If NULL or omitted, uniform weights (1.0) are used, resulting in a non-rational B-spline.
The optional knots array defines the parameter space. If NULL or omitted, a uniform clamped knot vector is automatically generated. If provided, the knot vector must have exactly (npoints + degree + 1) elements and must be non-decreasing.
Availability: 3.7.0
This example creates a degree-2 NURBS curve with uniform weights.
SELECT ST_MakeNurbsCurve(
2,
'LINESTRING(0 0,5 10,10 0)'::geometry
);NURBSCURVE(DEGREE 2, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(1,3)))
This example creates a rational NURBS curve with custom weights.
SELECT ST_MakeNurbsCurve(
2,
'LINESTRING(0 0,5 10,10 0)'::geometry,
ARRAY[1.0, 2.0, 1.0]
);NURBSCURVE(DEGREE 2, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10),WEIGHT 2), NURBSPOINT(WEIGHTEDPOINT(10 0),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(1,3)))
This example creates a NURBS curve with a non-uniform knot vector.
SELECT ST_MakeNurbsCurve(
2,
'LINESTRING(0 0,3 10,7 10,10 0)'::geometry,
ARRAY[1.0, 1.0, 1.0, 1.0],
ARRAY[0.0, 0.0, 0.0, 0.3, 1.0, 1.0, 1.0]
);NURBSCURVE(DEGREE 2, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(3 10),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(7 10),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(0.3,1), KNOT(1,3)))
Ці функції розкривають структурну інформацію про існуючу геометрію, не змінюючи її. Вони надають доступ до метаданих, таких як тип геометрії, розмірність або координатні компоненти, щоб просторові вирази могли контролювати запити до складних об'єктів.
geometry_dump для компонентів геометрії.geometry_dump для координат у геометрії.geometry_dump для сегментів у геометрії.geometry_dump для зовнішнього та внутрішнього кілець полігону.GeometryType — Повертає тип геометрії у вигляді тексту.
text GeometryType(geometry geomA);
Повертає тип геометрії у вигляді рядка. Наприклад: 'LINESTRING', 'POLYGON', 'MULTIPOINT' тощо.
OGC SPEC s2.1.1.1 - Повертає ім'я підтипу Geometry, який можна інстанціювати, до якого належить цей екземпляр Geometry. Ім'я підтипу Geometry, який можна інстанціювати, повертається у вигляді рядка.
![]() | |
Ця функція також вказує, чи вимірюється геометрія, повертаючи рядок у вигляді 'POINTM'. |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
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('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'::geometry);LINESTRING
SELECT ST_GeometryType('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)) )');
POLYHEDRALSURFACE
SELECT GeometryType(geom) as result
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;TIN
ST_Boundary — Повертає межі геометрії.
geometry ST_Boundary(geometry geomA);
Повертає закриття комбінаторної межі цієї геометрії. Комбінаторна межа визначається, як описано в розділі 3.12.3.2 специфікації OGC. Оскільки результат цієї функції є закриттям, а отже, топологічно замкнутим, отриману межу можна представити за допомогою примітивних елементів геометрії, як описано в розділі 3.12.2 специфікації OGC.
Виконано модулем GEOS
![]() | |
До версії 2.0.0 ця функція викликає виняток, якщо використовується з |
This method implements the OGC Simple Features Implementation Specification for SQL 1.1. OGC SPEC s2.1.1.1
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1.17
This function supports 3d and will not drop the z-index.
Покращено: 2.1.0 додано підтримку Triangle
Змінено: 3.2.0 підтримка TIN, не використовує geos, не лінеаризує криві
LineString with boundary points overlaid.
SELECT ST_Boundary(geom)
FROM (SELECT 'LINESTRING(100 150,50 60,70 80,160 170)'::geometry As geom) As f;
MULTIPOINT((100 150),(160 170))
Polygon holes with the boundary MultiLineString overlaid.
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;
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_Boundary('LINESTRING(1 1,0 0,-1 1)');MULTIPOINT((1 1),(-1 1))
SELECT ST_Boundary('POLYGON((1 1,0 0,-1 1,1 1))');LINESTRING(1 1,0 0,-1 1,1 1)
This example uses a 3D polygon.
SELECT ST_Boundary('POLYGON((1 1 1,0 0 1,-1 1 1,1 1 1))');LINESTRING(1 1 1,0 0 1,-1 1 1,1 1 1)
This example uses a 3D MultiLineString.
SELECT ST_Boundary('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) )');MULTIPOINT(1 1 1,-1 1 1)
ST_BoundingDiagonal — Повертає діагональ обмежувального прямокутника геометрії.
geometry ST_BoundingDiagonal(geometry geom, boolean fits=false);
Повертає діагональ обмежувальної рамки наданої геометрії у вигляді LineString. Діагональ — це 2-точковий LineString із мінімальними значеннями кожного виміру в початковій точці та максимальними значеннями в кінцевій точці. Якщо вхідна геометрія порожня, діагональна лінія є LINESTRING EMPTY.
Додатковий параметр fits визначає, чи потрібно знайти найкраще співпадіння. Якщо значення false, можна прийняти діагональ дещо більшої обмежувальної рамки (що швидше обчислюється для геометрій з великою кількістю вершин). У будь-якому випадку обмежувальна рамка поверненої діагональної лінії завжди охоплює вхідну геометрію.
Повернена геометрія зберігає SRID та розмірність (наявність Z та M) вхідної геометрії.
![]() | |
У виняткових випадках (тобто, якщо у вхідних даних є лише одна вершина) повернутий ланцюжок ліній буде формально недійсним (не має внутрішньої частини). Результат все одно залишається топологічно правильним. |
Доступність: 2.2.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
This example shows a polygon together with the diagonal of its bounding box.
WITH input AS (
SELECT 'POLYGON((10 20,30 60,70 40,90 10,50 -10,10 20))'::geometry AS geom
)
SELECT geom AS input_polygon,
ST_BoundingDiagonal(geom) AS diagonal
FROM input;POLYGON((10 20,30 60,70 40,90 10,50 -10,10 20)) | LINESTRING(10 -10,90 60)
This example returns the minimum X coordinate of a buffer around a point.
SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( ST_Buffer(ST_Point(0, 0), 10) )));
-10
ST_StartPoint, ST_EndPoint, ST_X, ST_Y, ST_Z, ST_M, ST_Envelope
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).
SELECT ST_CoordDim('CIRCULARSTRING(1 2 3,1 3 4,5 6 7,8 9 10,11 12 13)');3
SELECT ST_CoordDim(ST_Point(1, 2));
2
ST_Dimension — Повертає топологічну розмірність геометрії.
integer ST_Dimension(geometry g);
Повертає топологічну розмірність цього об'єкта Geometry, яка повинна бути меншою або дорівнювати розмірності координат. OGC SPEC 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
![]() | |
A |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь і TIN. Більше не виникає виняток, якщо задано порожню геометрію.
![]() | |
До версії 2.0.0 ця функція викликає виняток, якщо використовується з порожньою геометрією. |
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT ST_Dimension('GEOMETRYCOLLECTION(LINESTRING(1 1,0 0), POINT(0 0))');1
SELECT ST_Dimension('TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))');2
ST_Dump — Повертає набір рядків geometry_dump для компонентів геометрії.
geometry_dump[] ST_Dump(geometry g1);
Функція повернення набору (SRF), яка витягує компоненти геометрії. Вона повертає набір geometry_dumpрядків, кожен з яких містить геометрію (поле geom) та масив цілих чисел (поле path).
Для типу атомарної геометрії (POINT, LINESTRING, POLYGON) повертається один запис з порожнім масивом path і вхідною геометрією як geom. Для колекції або мультигеометрії повертається запис для кожного компонента колекції, а path позначає положення компонента всередині колекції.
ST_Dump корисний для розширення геометрій. Він є оберненим до ST_Collect/ GROUP BY, оскільки створює нові рядки. Наприклад, його можна використовувати для розширення MULTIPOLYGONS в POLYGONS.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Доступність: 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.
Dump the components of geometries stored in a table.
SELECT sometable.field1,
(ST_Dump(sometable.geom)).geom AS geom
FROM sometable;Break a CompoundCurve into its constituent LineStrings and CircularStrings.
SELECT a.geom, ST_HasArc(a.geom)
FROM ( SELECT (ST_Dump(p_geom)).geom AS geom
FROM (SELECT 'COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1))'::geometry 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)
This example breaks a PolyhedralSurface into its faces.
SELECT (a.p_geom).path[1] As path,(a.p_geom).geom As geom_ewkt
FROM (SELECT ST_Dump('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))This example uses a TIN geometry.
SELECT (g.gdump).path,(g.gdump).geom as wkt
FROM
(SELECT
ST_Dump('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;path | wkt
------+-------------------------------------
{1} | TRIANGLE((0 0 0,0 0 1,0 1 0,0 0 0))
{2} | TRIANGLE((0 0 0,0 1 0,1 1 0,0 0 0))
ST_DumpPoints — Повертає набір рядків geometry_dump для координат у геометрії.
geometry_dump[] ST_DumpPoints(geometry geom);
Функція повернення набору (SRF), яка витягує координати (вершини) геометрії. Вона повертає набір geometry_dumpрядків, кожен з яких містить геометрію (поле geom) та масив цілих чисел (поле path).
поле geom POINTs представляє координати наданої геометрії.
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 Вища швидкість. Перероблено як native-C.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Доступність: 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.
Explode a table of LineStrings into their vertices.
SELECT edge_id, (dp).path[1] As index,(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)Dump every vertex from a mixed GeometryCollection.
SELECT path,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)Collect the dumped vertices to visualize them over the source geometry.
WITH source(geom) AS (VALUES (
'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
))
SELECT ST_Collect((dp).geom ORDER BY (dp).path) AS vertices
FROM source
CROSS JOIN LATERAL ST_DumpPoints(source.geom) AS dp;MULTIPOINT((0 1),(0 3),(3 4),(2 0),(2 3),(0 2),(2 0),(3 0),(3 3),(6 3),(6 0),(3 0),(5 1),(4 2),(5 2),(5 1),(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))
This example uses a cube represented as a PolyhedralSurface.
SELECT (g.gdump).path,(g.gdump).geom as wkt
FROM
(SELECT
ST_DumpPoints('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;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)This example uses a Triangle geometry.
SELECT (g.gdump).path,(g.gdump).geom as wkt
FROM
(SELECT
ST_DumpPoints('TRIANGLE ((
0 0,
0 9,
9 0,
0 0
))' ) AS gdump
) AS g;path | wkt
------+------------
{1,1} | POINT(0 0)
{1,2} | POINT(0 9)
{1,3} | POINT(9 0)
{1,4} | POINT(0 0)This example uses a TIN geometry.
SELECT (g.gdump).path,(g.gdump).geom as wkt
FROM
(SELECT
ST_DumpPoints('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;path | wkt
---------+--------------
{1,1,1} | POINT(0 0 0)
{1,1,2} | POINT(0 0 1)
{1,1,3} | POINT(0 1 0)
{1,1,4} | POINT(0 0 0)
{2,1,1} | POINT(0 0 0)
{2,1,2} | POINT(0 1 0)
{2,1,3} | POINT(1 1 0)
{2,1,4} | POINT(0 0 0)
(8 rows)ST_DumpSegments — Повертає набір рядків geometry_dump для сегментів у геометрії.
geometry_dump[] ST_DumpSegments(geometry geom);
Функція повернення набору (SRF), яка витягує сегменти геометрії. Вона повертає набір geometry_dumpрядків, кожен з яких містить геометрію (поле geom) та масив цілих чисел (поле path).
поле geom LINESTRINGs представляє лінійні сегменти наданої геометрії, а CIRCULARSTRINGs представляє сегменти дуги.
поле path (тип integer[]) є індексом, що перелічує позиції початкових точок сегментів в елементах наданої геометрії. Індекси починаються з 1. Наприклад, для LINESTRING шляхи є {i}, де i є n-тою початковою точкою сегмента в LINESTRING. Для POLYGON шляхи мають вигляд {i,j}, де i — номер кільця (1 — зовнішнє, внутрішні кільця йдуть за ним), а j — позиція початку сегмента в кільці.
Доступність: 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,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)This example uses a Triangle geometry.
SELECT path,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)This example uses a TIN geometry.
SELECT path,geom
FROM (
SELECT (ST_DumpSegments(g.geom)).*
FROM (SELECT 'TIN(((
0 0 0,
0 0 1,
0 1 0,
0 0 0
)),((
0 0 0,
0 1 0,
1 1 0,
0 0 0
))
)'::geometry AS geom
) AS g
) j;path │ st_asewkt
---------------------------------
{1,1,1} │ LINESTRING(0 0 0,0 0 1)
{1,1,2} │ LINESTRING(0 0 1,0 1 0)
{1,1,3} │ LINESTRING(0 1 0,0 0 0)
{2,1,1} │ LINESTRING(0 0 0,0 1 0)
{2,1,2} │ LINESTRING(0 1 0,1 1 0)
{2,1,3} │ LINESTRING(1 1 0,0 0 0)
(6 rows)ST_DumpRings — Повертає набір рядків geometry_dump для зовнішнього та внутрішнього кілець полігону.
geometry_dump[] ST_DumpRings(geometry a_polygon);
Функція повернення набору (SRF), яка витягує кільця полігону. Вона повертає набір geometry_dumpрядків, кожен з яких містить геометрію (поле geom) та масив цілих чисел (поле path).
Поле geom містить кожне кільце як POLYGON. Поле path є цілочисельним масивом довжиною 1, що містить індекс кільця полігону. Зовнішнє кільце (оболонка) має індекс 0. Внутрішні кільця (отвори) мають індекси 1 і вище.
![]() | |
This only works for POLYGON geometries, not MULTIPOLYGONs. Use ST_Dump to extract polygon elements from polygonal geometries: |
Доступність: 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,geom As geom
FROM ST_DumpRings('POLYGON ((1 9,9 9,9 1,1 1,1 9),(2 2,2 3,3 3,3 2,2 2),(4 2,4 4,6 4,6 2,4 2))');path | geom
------+--------------------------------
{0} | POLYGON((1 9,9 9,9 1,1 1,1 9))
{1} | POLYGON((2 2,2 3,3 3,3 2,2 2))
{2} | POLYGON((4 2,4 4,6 4,6 2,4 2))Finding interior rings which lie close to the exterior ring.
WITH poly AS (
SELECT 'POLYGON ((
0 0, 10 0, 10 10, 0 10, 0 0
), (
1 1, 1 2, 2 2, 2 1, 1 1
), (
8.5 1, 8.5 2, 9.5 2, 9.5 1, 8.5 1
))'::geometry AS geom
),
rings AS (
SELECT d.path[1] AS ring_no,
ST_Boundary(d.geom) AS ring_geom
FROM poly
CROSS JOIN LATERAL ST_DumpRings(poly.geom) AS d
),
shell AS (
SELECT ring_geom
FROM rings
WHERE ring_no = 0
),
holes AS (
SELECT ring_no, ring_geom
FROM rings
WHERE ring_no > 0
)
SELECT h.ring_no,
ST_Normalize(ST_Multi(ST_LineMerge(
ST_Intersection(ST_Buffer(s.ring_geom, 1.0), h.ring_geom)
))) AS close_part
FROM shell AS s
JOIN holes AS h
ON ST_DWithin(s.ring_geom, h.ring_geom, 1.0);
ring_no | close_part
---------+-------------------------------------------------
1 | MULTILINESTRING((1 2,1 1,2 1))
2 | MULTILINESTRING((8.5 1,9 1,9.5 1,9.5 2,9 2))
ST_EndPoint — Returns the last point of a LineString, CircularLineString, or NURBSCurve.
geometry ST_EndPoint(geometry g);
Returns the last point of a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE geometry as a POINT. Returns NULL if the input is not a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE.
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 більше не працює з одномірними MultiLineStrings. У старих версіях PostGIS одномірний MultiLineString працював з цією функцією і повертав кінцеву точку. У 2.0.0 він повертає NULL, як і будь-який інший MultiLineString. Стара поведінка була недокументованою функцією, але користувачі, які вважали, що їхні дані зберігаються як LINESTRING, можуть зіткнутися з поверненням NULL у 2.0.0.
End point of a LineString
SELECT ST_EndPoint('LINESTRING(1 1,2 2,3 3)'::geometry);POINT(3 3)
Кінцева точка нелінійного об'єкта LineString має значення NULL
SELECT ST_EndPoint('POINT(1 1)'::geometry) IS NULL AS is_null;t
Кінцева точка 3D-лінії
3D endpoint.
SELECT ST_EndPoint('LINESTRING(1 1 2,1 2 3,0 0 5)');POINT(0 0 5)
Кінцева точка CircularString
SELECT ST_EndPoint('CIRCULARSTRING(5 2,-3 2,-2 1,-4 2,6 3)'::geometry);POINT(6 3)
End point of a NURBSCurve
SELECT ST_EndPoint('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry);POINT(2 0)
ST_Envelope — Повертає геометрію, що представляє обмежувальну рамку геометрії.
geometry ST_Envelope(geometry g1);
Повертає мінімальну обмежувальну коробку подвійної точності (float8) для заданої геометрії у вигляді геометрії. Полігон визначається кутовими точками обмежувальної рамки ((MINX, MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY), (MINX, MINY)). (PostGIS також додасть координати ZMIN/ZMAX).
У виняткових випадках (вертикальні лінії, точки) буде повернено геометрію з розмірністю, меншою за POLYGON, тобто POINT або LINESTRING.
Доступність: 1.5.0 поведінка змінена на виведення подвійної точності замість float4
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.19
SELECT ST_Envelope('POINT(1 3)'::geometry);POINT(1 3)
SELECT ST_Envelope('LINESTRING(0 0,1 3)'::geometry);POLYGON((0 0,0 3,1 3,1 0,0 0))
SELECT ST_Envelope('POLYGON((0 0,0 1,1.0000001 1,1.0000001 0,0 0))'::geometry);POLYGON((0 0,0 1,1.0000001 1,1.0000001 0,0 0))
SELECT ST_Envelope('POLYGON((0 0,0 1,1.0000000001 1,1.0000000001 0,0 0))'::geometry);POLYGON((0 0,0 1,1.0000000001 1,1.0000000001 0,0 0))
SELECT Box3D(geom), Box2D(geom), 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;
Envelope of a point and LineString.
SELECT ST_Envelope(ST_Collect(
'LINESTRING(55 75,125 150)',
ST_Point(20, 80)
)) As wktenv;POLYGON((20 75,20 150,125 150,125 75,20 75))
ST_ExteriorRing — Повертає LineString, що представляє зовнішнє кільце полігону
geometry ST_ExteriorRing(geometry a_polygon);
Повертає LineString, що представляє зовнішнє кільце полігону.
![]() | |
Ця функція не підтримує 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.
Extract the exterior ring from a Polygon with a hole.
WITH input(geom) AS (VALUES (
'POLYGON((0 0,2 9,9 11,14 6,12 0,0 0),(4 3,9 3,10 7,5 8,4 3))'::geometry
))
SELECT geom AS input_polygon,
ST_ExteriorRing(geom) AS exterior_ring
FROM input;POLYGON((0 0,2 9,9 11,14 6,12 0,0 0),(4 3,9 3,10 7,5 8,4 3)) | LINESTRING(0 0,2 9,9 11,14 6,12 0,0 0)
For a MultiPolygon, dump the component Polygons before extracting their exterior rings. Both component Polygons in this example have holes.
WITH input(geom) AS (VALUES (
'MULTIPOLYGON(
((0 0,2 9,9 11,14 6,12 0,0 0),(4 3,9 3,10 7,5 8,4 3)),
((18 1,18 10,29 10,31 4,25 0,18 1),(21 3,25 2,28 5,25 8,21 7,21 3))
)'::geometry
))
SELECT part.geom AS input_polygon,
ST_ExteriorRing(part.geom) AS exterior_ring
FROM input
CROSS JOIN LATERAL ST_Dump(geom) AS part
ORDER BY part.path;POLYGON((0 0,2 9,9 11,14 6,12 0,0 0),(4 3,9 3,10 7,5 8,4 3)) | LINESTRING(0 0,2 9,9 11,14 6,12 0,0 0) POLYGON((18 1,18 10,29 10,31 4,25 0,18 1),(21 3,25 2,28 5,25 8,21 7,21 3)) | LINESTRING(18 1,18 10,29 10,31 4,25 0,18 1)
Extract exterior rings from a table of Polygons.
SELECT gid, ST_ExteriorRing(geom) AS ering FROM sometable;
For a table of MultiPolygons, dump the component Polygons and collect their exterior rings into a MultiLineString.
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;
This example returns the 3D exterior ring of a Polygon.
SELECT ST_ExteriorRing(
'POLYGON Z ((0 0 5,4 0 5,4 3 5,0 3 5,0 0 5))'
);LINESTRING(0 0 5,4 0 5,4 3 5,0 3 5,0 0 5)
ST_GeometryN — Повернути елемент колекції геометрії.
geometry ST_GeometryN(geometry geomA, integer n);
Returns the 1-based Nth element of a GEOMETRYCOLLECTION, MULTIPOINT, MULTILINESTRING, MULTICURVE, or MULTIPOLYGON. For a unitary geometry, including a TIN or PolyhedralSurface, an index of 1 returns the input geometry and any other index returns NULL. Use ST_PatchN and ST_NumPatches to access and count the faces of a TIN or PolyhedralSurface.
![]() | |
Індекс базується на 1, як і в специфікаціях OGC, починаючи з версії 0.8.0. У попередніх версіях це реалізовано на основі 0. |
![]() | |
Щоб витягти всі елементи геометрії, ST_Dumpє більш ефективним і працює для атомних геометрій. |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Змінено: 2.0.0 Попередні версії повертали NULL для геометрій в однині. Це було змінено, щоб повертати геометрію для випадку ST_GeometryN(..,1).
Changed: 3.6.0 TIN and PolyhedralSurface are treated as unitary geometries and are not decomposed into patches; use ST_PatchN to access faces.
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_GeometryN(geom, n) As geomewkt
FROM (
VALUES
(1, 'MULTIPOINT((1 2 7), (3 4 7), (5 6 7), (8 9 10))'::geometry ),
(2, 'MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))'::geometry )
) As foo(id, geom)
CROSS JOIN generate_series(1,100) n
WHERE n <= ST_NumGeometries(geom)
ORDER BY id, n;
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);
A PolyhedralSurface or TIN is treated as a single geometry, not as a collection of faces. ST_GeometryN does not decompose the surface into patches, so an index greater than 1 returns NULL. Use ST_PatchN and ST_NumPatches to access individual faces.
This example requests the third element of a PolyhedralSurface.
SELECT ST_GeometryN(p_geom, 3) As geom_ewkt 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 p_geom ) AS a;
NULL
This example requests the second element of a TIN.
SELECT ST_GeometryN(geom, 2) as wkt
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;NULL
ST_GeometryType — Повертає тип SQL-MM геометрії у вигляді тексту.
text ST_GeometryType(geometry g1);
Повертає тип геометрії у вигляді рядка. Наприклад: 'ST_LineString', 'ST_Polygon','ST_MultiPolygon' тощо. Ця функція відрізняється від GeometryType(geometry) тим, що повертає строку і 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('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'::geometry);ST_LineString
SELECT ST_GeometryType('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);ST_PolyhedralSurface
SELECT ST_GeometryType(geom) AS result
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;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.
SELECT ST_HasArc(ST_Collect('LINESTRING(1 2,3 4,5 6)', 'CIRCULARSTRING(1 1,2 3,4 5,6 7,5 6)'));t
ST_InteriorRingN — Повертає N-те внутрішнє кільце (отвір) полігону.
geometry ST_InteriorRingN(geometry a_polygon, integer n);
Повертає N-те внутрішнє кільце (отвір) геометрії POLYGON як 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.
WITH data AS (
SELECT ST_BuildArea(ST_Collect(
ST_Buffer(ST_Point(1, 2), 20, 3),
ST_Buffer(ST_Point(1, 2), 10, 3)
)) AS geom
)
SELECT geom AS input_polygon,
ST_InteriorRingN(geom, 1) AS ring
FROM data;POLYGON((21 2,18.320508075688775 -7.999999999999998,11.000000000000002 -15.320508075688771,1 -18,-8.999999999999996 -15.320508075688775,-16.32050807568877 -8.000000000000007,-19 2,-16.320508075688778 11.999999999999995,-9.000000000000009 19.320508075688767,1 22,10.999999999999986 19.32050807568878,18.320508075688767 12.000000000000009,21 2),(11 2,9.660254037844384 7.000000000000004,5.999999999999993 10.66025403784439,1 12,-4.000000000000004 10.660254037844384,-7.660254037844389 6.999999999999997,-9 2,-7.660254037844386 -3.000000000000004,-3.999999999999998 -6.660254037844387,1 -8,6.000000000000001 -6.660254037844386,9.660254037844387 -2.999999999999999,11 2)) | LINESTRING(11 2,9.660254037844384 7.000000000000004,5.999999999999993 10.66025403784439,1 12,-4.000000000000004 10.660254037844384,-7.660254037844389 6.999999999999997,-9 2,-7.660254037844386 -3.000000000000004,-3.999999999999998 -6.660254037844387,1 -8,6.000000000000001 -6.660254037844386,9.660254037844387 -2.999999999999999,11 2)
ST_NumCurves — Повернути кількість кривих компонентів у CompoundCurve.
integer ST_NumCurves(geometry a_compoundcurve);
Повертає кількість компонентних кривих у CompoundCurve, нуль для порожнього CompoundCurve або NULL для вхідних даних, що не є CompoundCurve.
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.
This CompoundCurve contains three component curves.
SELECT ST_NumCurves('COMPOUNDCURVE(
(2 2,2.5 2.5),
CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5),
(3.5 3.5,2.5 4.5,3 5,2 2)
)');3
An empty CompoundCurve has no component curves.
SELECT ST_NumCurves('COMPOUNDCURVE EMPTY');0
ST_CurveN, ST_Dump, ST_ExteriorRing, ST_NumInteriorRings, ST_NumGeometries
ST_CurveN — Повертає геометрію N-го компонента кривої CompoundCurve.
geometry ST_CurveN(geometry a_compoundcurve, integer index);
Повертає геометрію N-го компонента кривої CompoundCurve. Індекс починається з 1. Повертає NULL, якщо геометрія не є CompoundCurve або індекс знаходиться поза діапазоном.
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.
This example extracts the second component curve, a CircularString, from a CompoundCurve.
SELECT ST_CurveN(
'COMPOUNDCURVE(
(0 0,2 0),
CIRCULARSTRING(2 0,3 1,4 0),
(4 0,6 1)
)',
2) AS curve;CIRCULARSTRING(2 0,3 1,4 0)
ST_NumCurves, ST_Dump, ST_ExteriorRing, ST_NumInteriorRings, ST_NumGeometries
ST_IsClosed — Перевіряє, чи збігаються початкова та кінцева точки LineStrings. Для PolyhedralSurface перевіряє, чи є вона закритою (об'ємною).
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.
SELECT ST_IsClosed('LINESTRING(0 0,1 1)'::geometry);f
SELECT ST_IsClosed('LINESTRING(0 0,0 1,1 1,0 0)'::geometry);t
SELECT ST_IsClosed('MULTILINESTRING((0 0,0 1,1 1,0 0),(0 0,1 1))'::geometry);f
SELECT ST_IsClosed('POINT(0 0)'::geometry);t
SELECT ST_IsClosed('MULTIPOINT((0 0),(1 1))'::geometry);t
This example uses a cube.
SELECT ST_IsClosed('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)) )');t
This example uses the same cube with one side missing.
SELECT ST_IsClosed('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)) )');f
ST_IsCollection — Перевіряє, чи є геометрія типом колекції геометрії.
boolean ST_IsCollection(geometry g);
Повертає TRUE, якщо тип геометрії аргументу є типом колекції геометрії. Типи колекцій є такими:
GEOMETRYCOLLECTION
MULTI{POINT,POLYGON,LINESTRING,CURVE,SURFACE}
COMPOUNDCURVE
![]() | |
Ця функція аналізує тип геометрії. Це означає, що вона поверне |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
SELECT ST_IsCollection('LINESTRING(0 0,1 1)'::geometry);f
SELECT ST_IsCollection('MULTIPOINT EMPTY'::geometry);t
SELECT ST_IsCollection('MULTIPOINT((0 0))'::geometry);t
SELECT ST_IsCollection('MULTIPOINT((0 0),(42 42))'::geometry);t
SELECT ST_IsCollection('GEOMETRYCOLLECTION(POINT(0 0))'::geometry);t
ST_IsEmpty — Перевіряє, чи геометрія порожня.
boolean ST_IsEmpty(geometry geomA);
Повертає true, якщо ця геометрія є порожньою. Якщо 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.
Змінено: 2.0.0 У попередніх версіях PostGIS ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') було дозволено. Тепер це є незаконним у PostGIS 2.0.0 для кращої відповідності стандартам SQL/MM
SELECT ST_IsEmpty('GEOMETRYCOLLECTION EMPTY'::geometry);t
SELECT ST_IsEmpty('POLYGON EMPTY'::geometry);t
SELECT ST_IsEmpty('POLYGON((1 2,3 4,5 6,1 2))'::geometry);f
SELECT ST_IsEmpty('POLYGON((1 2,3 4,5 6,1 2))'::geometry) = false;t (1 row)
SELECT ST_IsEmpty('CIRCULARSTRING EMPTY'::geometry);t
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 — Перевіряє, чи лінія LineString є замкнутою та простою.
boolean ST_IsRing(geometry g);
Returns TRUE if this LINESTRING is both ST_IsClosed (ST_StartPoint(g) ~= ST_EndPoint(g)) and ST_IsSimple (does not self intersect).
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.
SELECT ST_IsSimple('POLYGON((1 2,3 4,5 6,1 2))');f
SELECT ST_IsSimple('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)');f
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.
SELECT ST_M('POINT(1 2 3 4)');4
ST_MemSize — Повертає обсяг пам'яті, який займає геометрія.
integer ST_MemSize(geometry geomA);
Повертає обсяг пам'яті (у байтах), який займає геометрія.
Це доповнює вбудовані в PostgreSQL функції об'єктів бази даних pg_column_size, pg_size_pretty, pg_relation_size, pg_total_relation_size.
![]() | |
pg_relation_size, що повертає розмір таблиці в байтах, може повернути розмір, менший за ST_MemSize. Це відбувається тому, що pg_relation_size не додає розмір тостованих таблиць, а великі геометрії зберігаються в таблицях TOAST. 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 відповідно до правил іменування.
Compare the memory used by all geometries in a Massachusetts town dataset with the subset for Boston.
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) * 100.0
/ sum(ST_MemSize(geom)) AS numeric(10, 2)
) AS perbos
FROM towns;totgeomsum | bossum | perbos ------------+--------+-------- 1522 kB | 30 kB | 1.99 (1 row)
Return the memory size of a CircularString in bytes.
SELECT ST_MemSize('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'::geometry);st_memsize
------------
80
(1 row)Calculate the percentage of a table's total size used by geometry data.
SELECT pg_total_relation_size('public.neighborhoods') AS fulltable_size,
sum(ST_MemSize(geom)) AS geomsize,
sum(ST_MemSize(geom)) * 100.0
/ pg_total_relation_size('public.neighborhoods') AS pergeom
FROM neighborhoods;fulltable_size | geomsize | pergeom
----------------+----------+--------------------------
262144 | 96238 | 36.71188354492187500000
(1 row)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.
SELECT ST_NDims('POINT(1 1)') As d2point,
ST_NDims('POINT(1 1 2)') As d3point,
ST_NDims('POINTM(1 1 0.5)') As d2pointm;d2point | d3point | d2pointm
---------+---------+----------
2 | 3 | 3ST_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.
Count the points in a 2D LineString.
SELECT ST_NPoints('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)');st_npoints
------------
4
(1 row)Count the points in a 3D LineString.
SELECT ST_NPoints('LINESTRING(77.29 29.07 1,77.42 29.26 0,77.27 29.31 -1,77.29 29.07 3)');st_npoints
------------
4
(1 row)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.
SELECT ST_NRings(geom) As Nrings, ST_NumInteriorRings(geom) As ninterrings FROM (SELECT 'POLYGON((1 2,3 4,5 6,1 2))'::geometry As geom) As foo;
nrings | ninterrings
--------+-------------
1 | 0
(1 row)ST_NumGeometries — Повертає кількість елементів у колекції геометрії.
integer ST_NumGeometries(geometry geom);
Повертає кількість елементів у колекції геометрій (GEOMETRYCOLLECTION або MULTI*). Для не порожніх атомарних геометрій повертає 1. Для порожніх геометрій повертає 0.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Змінено: 2.0.0 У попередніх версіях це повертало NULL, якщо геометрія не була типом колекції/MULTI. 2.0.0+ тепер повертає 1 для одиночних геометрій, наприклад POLYGON, LINESTRING, POINT.
Changed: 3.6.0 TIN and PolyhedralSurface are treated as unitary geometries and return 1; use ST_NumPatches to count faces.
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).
This example returns 1; prior versions would have returned NULL.
SELECT ST_NumGeometries('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)');st_numgeometries
------------------
1
(1 row)A MultiPoint counts as one geometry within a GeometryCollection.
SELECT ST_NumGeometries('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)))');st_numgeometries
------------------
3
(1 row)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, повертаючи кількість внутрішніх кілець першого POLYGON.
Count the interior rings of a Polygon.
SELECT gid, field1, field2, ST_NumInteriorRings(geom) AS numholes FROM sometable;
For a MultiPolygon, dump its component Polygons and sum their interior ring counts.
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 — Returns the number of interior rings (holes) of a Polygon. Alias for ST_NumInteriorRings.
integer ST_NumInteriorRing(geometry a_polygon);
ST_NumPatches — Returns the number of faces in a PolyhedralSurface or TIN.
integer ST_NumPatches(geometry g1);
Returns the number of faces in a PolyhedralSurface or TIN. Returns NULL for other geometries. Unlike ST_NumGeometries, this function counts individual faces.
Доступність: 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 ISO/IEC 13249-3: 8.5
This function supports Polyhedral surfaces.
SELECT ST_NumPatches('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_numpatches
---------------
6
(1 row)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
SELECT ST_NumPoints('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)');st_numpoints
--------------
4
(1 row)ST_PatchN — Returns the Nth face of a PolyhedralSurface or TIN.
geometry ST_PatchN(geometry geomA, integer n);
Returns the 1-based Nth face of a PolyhedralSurface or TIN. Returns NULL for other geometries or an out-of-range index. Use this function to access faces, because ST_GeometryN treats PolyhedralSurface and TIN as unitary geometries.
![]() | |
Індекс починається з 1. |
![]() | |
Якщо ви хочете витягти всі елементи геометрії, ST_Dumpє більш ефективним. |
Доступність: 2.0.0
This method implements the SQL/MM specification. SQL-MM ISO/IEC 13249-3: 8.5
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).
Extract the 2nd face of the polyhedral surface.
SELECT ST_PatchN(geom, 2) As geomewkt
FROM (
VALUES ('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 foo(geom);POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0))
ST_AsEWKT, ST_GeomFromEWKT, ST_Dump, ST_GeometryN, ST_NumGeometries, ST_NumPatches
ST_PointN — Повертає N-ту точку в першому LineString або круговому LineString в геометрії.
geometry ST_PointN(geometry a_linestring, integer n);
Повертає N-ту точку в одній лінійній або круговій лінійній геометрії. Негативні значення відраховуються назад від кінця LineString, так що -1 є останньою точкою. Повертає NULL, якщо в геометрії немає лінійної геометрії.
![]() | |
Index is 1-based as for OGC specs since version 0.8.0. Backward indexing (negative index) is not in OGC. Previous versions implemented this as 0-based instead. |
![]() | |
Якщо ви хочете отримати N-ту точку кожного LineString у MultiLineString, використовуйте разом із 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 — останній пункт)
This example extracts all POINT geometries from a LineString.
SELECT ST_PointN(
column1,
generate_series(1, ST_NPoints(column1))
)
FROM ( VALUES ('LINESTRING(0 0,1 1,2 2)'::geometry) ) AS foo;POINT(0 0) POINT(1 1) POINT(2 2) (3 rows)
This example uses a CircularString.
SELECT ST_PointN('CIRCULARSTRING(1 2,3 2,1 2)', 2);POINT(3 2)
The index is 1-based. A negative index counts backward from the end of the LineString.
SELECT f
FROM ST_GeomFromText('LINESTRING(0 0 0,1 1 1,2 2 2)') AS g
CROSS JOIN ST_PointN(g, -2) AS f;POINT Z (1 1 1)
ST_Points — Повертає об'єкт MultiPoint, що містить координати геометрії.
geometry ST_Points( geometry geom );
Повертає MultiPoint, що містить усі координати геометрії. Дублікати точок зберігаються, включаючи початкову та кінцеву точки кільцевих геометрій. (За бажанням дублікати точок можна видалити, викликавши 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
SELECT ST_Points('POLYGON Z ((30 10 4,10 30 5,40 40 6,30 10 4))');MULTIPOINT Z ((30 10 4),(10 30 5),(40 40 6),(30 10 4))
ST_StartPoint — Returns the first point of a LineString, CircularLineString, or NURBSCurve.
geometry ST_StartPoint(geometry geomA);
Returns the first point of a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE geometry as a POINT. For other geometries, returns the first point in coordinate order.
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 повертає точку для всіх геометрій. Попередня поведінка повертала NULL, якщо вхідні дані не були LineString.
Змінено: 2.0.0 більше не працює з одномірними геометричними об'єктами MultiLineStrings. У старих версіях PostGIS одномірний MultiLineString працював з цією функцією без проблем і повертав початкову точку. У 2.0.0 він просто повертає NULL, як і будь-який інший MultiLineString. Стара поведінка була недокументованою функцією, але користувачі, які вважали, що їхні дані зберігаються як LINESTRING, можуть зіткнутися з поверненням NULL у 2.0.0.
Початкова точка лінії
SELECT ST_StartPoint('LINESTRING(0 1,0 2)'::geometry);POINT(0 1)
Start point of a Point is the Point itself
SELECT ST_StartPoint('POINT(0 1)'::geometry);POINT(0 1)
Початкова точка 3D-лінії
SELECT ST_StartPoint('LINESTRING(0 1 1,0 2 2)'::geometry);POINT(0 1 1)
Початкова точка CircularString
SELECT ST_StartPoint('CIRCULARSTRING(5 2,-3 2,-2 1,-4 2,6 3)'::geometry);POINT(5 2)
Start point of a NURBSCurve
SELECT ST_StartPoint('NURBSCURVE(2, (0 0, 1 1, 2 0))'::geometry);POINT(0 0)
Build edge node references from the start and end points of a LineString table. The example uses exact endpoint equality, so linework with nearly coincident endpoints should be snapped or otherwise cleaned first.
WITH roads(road_id, geom) AS (
VALUES
(1, 'LINESTRING(0 0, 1 0)'::geometry),
(2, 'LINESTRING(1 0, 1 1)'::geometry),
(3, 'LINESTRING(1 0, 2 0)'::geometry)
),
endpoints AS (
SELECT road_id, 'from' AS end_name, ST_StartPoint(geom) AS geom,
ST_AsEWKB(ST_StartPoint(geom)) AS endpoint_key
FROM roads
UNION ALL
SELECT road_id, 'to' AS end_name, ST_EndPoint(geom) AS geom,
ST_AsEWKB(ST_EndPoint(geom)) AS endpoint_key
FROM roads
),
nodes AS (
SELECT dense_rank() OVER (ORDER BY ST_X(geom), ST_Y(geom), endpoint_key) AS node_id,
endpoint_key
FROM (
SELECT DISTINCT ON (endpoint_key) endpoint_key, geom
FROM endpoints
ORDER BY endpoint_key
) AS distinct_endpoints
)
SELECT e.road_id,
max(n.node_id) FILTER (WHERE e.end_name = 'from') AS from_node,
max(n.node_id) FILTER (WHERE e.end_name = 'to') AS to_node
FROM endpoints AS e
JOIN nodes AS n USING (endpoint_key)
GROUP BY e.road_id
ORDER BY e.road_id;road_id | from_node | to_node
---------+-----------+---------
1 | 1 | 2
2 | 2 | 3
3 | 2 | 4ST_StartM — Returns the M coordinate of the first point of a LineString, CircularLineString, or NURBSCurve.
float8 ST_StartM(geometry geom);
Returns the M coordinate of the first point of a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE geometry. Returns NULL if the input geometry does not have an M dimension or is not a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE.
This method supports Circular Strings and Curves.
Start M value of a LineString
SELECT ST_StartM('LINESTRING M(0 0 10,1 1 20,2 0 30)'::geometry);10
Start M value of a CircularString
SELECT ST_StartM('CIRCULARSTRING M(0 0 5,1 1 10,2 0 15)'::geometry);5
Start M value of a NURBSCurve
SELECT ST_StartM('NURBSCURVE M(2, (0 0 100, 1 1 200, 2 0 300))'::geometry);100
Geometry without M dimension returns NULL
SELECT ST_StartM('LINESTRING(0 0,1 1)'::geometry) IS NULL AS is_null;t
ST_EndM — Returns the M coordinate of the last point of a LineString, CircularLineString, or NURBSCurve.
float8 ST_EndM(geometry geom);
Returns the M coordinate of the last point of a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE geometry. Returns NULL if the input geometry does not have an M dimension or is not a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE.
This method supports Circular Strings and Curves.
End M value of a LineString
SELECT ST_EndM('LINESTRING M(0 0 10,1 1 20,2 0 30)'::geometry);30
End M value of a CircularString
SELECT ST_EndM('CIRCULARSTRING M(0 0 5,1 1 10,2 0 15)'::geometry);15
End M value of a NURBSCurve
SELECT ST_EndM('NURBSCURVE M(2, (0 0 100, 1 1 200, 2 0 300))'::geometry);300
Geometry without M dimension returns NULL
SELECT ST_EndM('LINESTRING(0 0,1 1)'::geometry) IS NULL AS is_null;t
ST_SetStartM — Sets the M coordinate of the first point of a LineString, CircularLineString, or NURBSCurve.
geometry ST_SetStartM(geometry geom, float8 m);
Returns a copy of the input LINESTRING, CIRCULARLINESTRING, or NURBSCURVE geometry with the M coordinate of the first point set to the specified value. If the input geometry does not have an M dimension, it will be added. Returns NULL if the input is not a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE.
This method supports Circular Strings and Curves.
Set start M value of a LineString
SELECT ST_SetStartM('LINESTRING M(0 0 10,1 1 20,2 0 30)'::geometry, 100);LINESTRING M (0 0 100,1 1 20,2 0 30)
Add M dimension and set start M value
SELECT ST_SetStartM('LINESTRING(0 0,1 1,2 0)'::geometry, 50);LINESTRING M (0 0 50,1 1 0,2 0 0)
Set start M value of a CircularString
SELECT ST_SetStartM('CIRCULARSTRING M(0 0 5,1 1 10,2 0 15)'::geometry, 99);CIRCULARSTRING M (0 0 99,1 1 10,2 0 15)
Set start M value of a NURBSCurve
SELECT ST_SetStartM('NURBSCURVE M(2, (0 0 100, 1 1 200, 2 0 300))'::geometry, 500);NURBSCURVE M (DEGREE 2,CONTROLPOINTS M (NURBSPOINT(WEIGHTEDPOINT M (0 0 500),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT M (1 1 200),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT M (2 0 300),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(1,3)))
ST_SetEndM — Sets the M coordinate of the last point of a LineString, CircularLineString, or NURBSCurve.
geometry ST_SetEndM(geometry geom, float8 m);
Returns a copy of the input LINESTRING, CIRCULARLINESTRING, or NURBSCURVE geometry with the M coordinate of the last point set to the specified value. If the input geometry does not have an M dimension, it will be added. Returns NULL if the input is not a LINESTRING, CIRCULARLINESTRING, or NURBSCURVE.
This method supports Circular Strings and Curves.
Set end M value of a LineString
SELECT ST_SetEndM('LINESTRING M(0 0 10,1 1 20,2 0 30)'::geometry, 999);LINESTRING M (0 0 10,1 1 20,2 0 999)
Add M dimension and set end M value
SELECT ST_SetEndM('LINESTRING(0 0,1 1,2 0)'::geometry, 75);LINESTRING M (0 0 0,1 1 0,2 0 75)
Set end M value of a CircularString
SELECT ST_SetEndM('CIRCULARSTRING M(0 0 5,1 1 10,2 0 15)'::geometry, 88);CIRCULARSTRING M (0 0 5,1 1 10,2 0 88)
Set end M value of a NURBSCurve
SELECT ST_SetEndM('NURBSCURVE M(2, (0 0 100, 1 1 200, 2 0 300))'::geometry, 999);NURBSCURVE M (DEGREE 2,CONTROLPOINTS M (NURBSPOINT(WEIGHTEDPOINT M (0 0 100),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT M (1 1 200),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT M (2 0 999),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(1,3)))
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 Додано підтримку TIN і кривих
SELECT ST_Summary('LINESTRING(0 0,1 1)'::geometry) as geom,
ST_Summary('POLYGON((0 0,1 1,1 2,1 1,0 0))'::geography) geog;geom | geog
-----------------------------+--------------------------
LineString[B] with 2 points | Polygon[BGS] with 1 rings
| ring 0 has 5 points
:
(1 row)SELECT ST_Summary('LINESTRING(0 0 1,1 1 1)'::geography) As geog_line,
ST_Summary('SRID=4326;POLYGON((0 0 1,1 1 2,1 2 3,1 1 1,0 0 1))'::geometry) As geom_poly;geog_line | geom_poly
-------------------------------- +--------------------------
LineString[ZBGS] with 2 points | Polygon[ZBS] with 1 rings
: ring 0 has 5 points
:
(1 row)ST_X — Повертає координату X точки.
float ST_X(geometry a_point);
Повертає координату X точки або NULL, якщо вона недоступна. Вхідні дані повинні бути точкою.
![]() | |
Щоб отримати мінімальне та максимальне значення X координат геометрії, використовуйте функції ST_XMin та ST_XMax. |
This method implements the SQL/MM specification. SQL-MM 3: 6.1.3
This function supports 3d and will not drop the z-index.
SELECT ST_X('POINT(1 2 3 4)');1
SELECT ST_Y(ST_Centroid('LINESTRING(1 2 3 4,1 1 1 1)'::geometry));1.5
ST_Centroid, ST_GeomFromEWKT, ST_M, ST_XMax, ST_XMin, ST_Y, ST_Z
ST_Y — Повертає координату Y точки.
float ST_Y(geometry a_point);
Повертає координату Y точки або NULL, якщо вона недоступна. Вхідні дані повинні бути точкою.
![]() | |
Щоб отримати мінімальне та максимальне значення Y координат геометрії, використовуйте функції ST_YMin та ST_YMax. |
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.
SELECT ST_Y('POINT(1 2 3 4)');2
SELECT ST_Y(ST_Centroid('LINESTRING(1 2 3 4,1 1 1 1)'::geometry));1.5
ST_Centroid, ST_GeomFromEWKT, ST_M, ST_X, ST_YMax, ST_YMin, ST_Z
ST_Z — Повертає координату Z точки.
float ST_Z(geometry a_point);
Повертає координату Z точки або NULL, якщо вона недоступна. Вхідні дані повинні бути точкою.
![]() | |
Щоб отримати мінімальне та максимальне значення Z координат геометрії, використовуйте функції ST_ZMin та ST_ZMax. |
This method implements the SQL/MM specification.
This function supports 3d and will not drop the z-index.
SELECT ST_Z('POINT(1 2 3 4)');3
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('LINESTRING(1 2,3 4)');0
SELECT ST_ZMFlag('LINESTRINGM(1 2 3, 3 4 3)');1
SELECT ST_ZMFlag('CIRCULARSTRING(1 2 3,3 4 3,5 6 3)');2
SELECT ST_ZMFlag('POINT(1 2 3 4)');3
ST_HasZ — Перевіряє, чи має геометрія розмір Z.
boolean ST_HasZ(geometry geom);
Перевіряє, чи має вхідна геометрія розмір Z, і повертає логічне значення. Якщо геометрія має розмір Z, повертає true; інакше повертає false.
Геометричні об'єкти з розміром Z зазвичай представляють тривимірні (3D) геометрії, тоді як об'єкти без цього розміру є двовимірними (2D) геометріями.
Ця функція корисна для визначення, чи має геометрія інформацію про висоту.
Доступність: 3.5.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
SELECT ST_HasZ('POINT(1 2 3)');t
SELECT ST_HasZ('LINESTRING(0 0,1 1)');f
ST_HasM — Перевіряє, чи має геометрія розмір M (вимір).
boolean ST_HasM(geometry geom);
Перевіряє, чи має вхідна геометрія розмір M (вимір), і повертає булеве значення. Якщо геометрія має розмір M, повертає true; інакше повертає false.
Геометричні об'єкти з розмірністю M зазвичай представляють вимірювання або додаткові дані, пов'язані з просторовими характеристиками.
Ця функція корисна для визначення, чи містить геометрія інформацію про виміри.
Доступність: 3.5.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
SELECT ST_HasM('POINTM(1 2 3)');t
SELECT ST_HasM('LINESTRING(0 0,1 1)');f
ST_ControlPoints — Returns the control points of a NURBS curve as a MULTIPOINT geometry.
geometry ST_ControlPoints(geometry nurbscurve);
Extracts the control points from a NURBS curve and returns them as a MULTIPOINT geometry. Control points define the control polygon that influences the shape of the NURBS curve.
The function raises an error if the input is not a NURBS curve. Returns NULL if the input is NULL.
Availability: 3.7.0
This example extracts control points from a NURBS curve.
SELECT ST_ControlPoints('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);MULTIPOINT((0 0),(5 10),(10 0))
This example counts the control points.
SELECT ST_NPoints(ST_ControlPoints('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry));3
ST_Degree — Returns the polynomial degree of a NURBS curve.
integer ST_Degree(geometry nurbscurve);
Returns the polynomial degree of a NURBS curve as an integer. The degree determines the curve's smoothness and flexibility. Higher degrees produce smoother curves but require more control points.
The function raises an error if the input is not a NURBS curve. Returns NULL if the input is NULL.
Availability: 3.7.0
This example returns the degree of a NURBS curve.
SELECT ST_Degree('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);2
This example checks whether a NURBS curve is cubic.
SELECT ST_Degree('NURBSCURVE(3, (0 0, 2 5, 5 8, 10 0))'::geometry) = 3;t
ST_Weights — Returns the weight array of a rational NURBS curve.
float8[] ST_Weights(geometry nurbscurve);
Returns the weight values of a rational NURBS curve as an array of double precision values. Weights control the influence of each control point on the curve shape. Higher weights pull the curve closer to the corresponding control point.
Returns NULL if the curve has no weights (non-rational B-spline) or if the input is NULL. Raises an error if the input is not a NURBS curve.
Availability: 3.7.0
This example returns weights from a rational NURBS curve.
SELECT ST_Weights(ST_MakeNurbsCurve(2, 'LINESTRING(0 0,5 10,10 0)'::geometry, ARRAY[1.0, 2.0, 1.0]));
{1,2,1}This example checks the weights of a non-rational curve.
SELECT ST_Weights('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);null
ST_MakeNurbsCurve, ST_NurbsCurveIsRational, ST_ControlPoints
ST_Knots — Returns the knot vector of a NURBS curve.
float8[] ST_Knots(geometry nurbscurve);
Returns the knot vector of a NURBS curve as an array of double precision values. The knot vector defines the parameter space and controls where and how the control points affect the curve. It must be a non-decreasing sequence with length equal to (number of control points + degree + 1).
Returns NULL if the curve uses the default uniform clamped knot vector or if the input is NULL. Raises an error if the input is not a NURBS curve.
Availability: 3.7.0
This example returns knots from a NURBS curve with a custom knot vector.
SELECT ST_Knots(ST_MakeNurbsCurve(
2,
'LINESTRING(0 0,5 10,10 0)'::geometry,
ARRAY[1.0, 2.0, 1.0],
ARRAY[0, 0, 0, 1, 1, 1]));{0,0,0,1,1,1}This example checks the knots of a curve using the default knot vector.
SELECT ST_Knots('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);null
ST_NumControlPoints — Returns the number of control points in a NURBS curve.
integer ST_NumControlPoints(geometry nurbscurve);
Returns the number of control points in a NURBS curve. The number of control points must be at least (degree + 1) for a valid NURBS curve.
Raises an error if the input is not a NURBS curve. Returns NULL if the input is NULL.
Availability: 3.7.0
This example returns the number of control points.
SELECT ST_NumControlPoints('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);3
This example verifies that a curve has enough control points for its degree.
SELECT ST_NumControlPoints(curve) >= ST_Degree(curve) + 1 AS valid FROM (SELECT 'NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry AS curve) AS t;
t
ST_NurbsCurveIsRational — Checks if a NURBS curve is rational (has weights).
boolean ST_NurbsCurveIsRational(geometry nurbscurve);
Returns TRUE if the NURBS curve has weights assigned to its control points (rational NURBS), FALSE if it uses uniform weights (non-rational B-spline).
Rational NURBS curves provide more flexibility in curve shape control through variable weights. Non-rational B-splines use uniform weights and are a special case of NURBS curves.
Raises an error if the input is not a NURBS curve. Returns NULL if the input is NULL.
Availability: 3.7.0
This example checks whether a curve is rational.
SELECT ST_NurbsCurveIsRational(ST_MakeNurbsCurve(
2,
'LINESTRING(0 0,5 10,10 0)'::geometry,
ARRAY[1.0, 2.0, 1.0]));t
This example checks a non-rational curve.
SELECT ST_NurbsCurveIsRational('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);f
ST_IsNurbsCurve — Checks if a geometry is a NURBS curve.
boolean ST_IsNurbsCurve(geometry geom);
Returns TRUE if the geometry is a NURBS curve, FALSE otherwise. This function can be used to test geometry types before applying NURBS-specific functions.
Returns NULL if the input is NULL.
Availability: 3.7.0
This example checks whether a geometry is a NURBS curve.
SELECT ST_IsNurbsCurve('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);t
This example tests a regular LineString.
SELECT ST_IsNurbsCurve('LINESTRING(0 0,10 10)'::geometry);f
ST_Evaluate — Evaluates a NURBS curve at a specific parameter value and returns the resulting point.
geometry ST_Evaluate(geometry nurbscurve, float8 parameter);
Evaluates a NURBS curve at the specified parameter value and returns a POINT geometry representing the position on the curve. The parameter typically ranges from 0.0 (start of curve) to 1.0 (end of curve), though the actual range depends on the knot vector.
Raises an error if the input is not a NURBS curve or if evaluation fails. Returns NULL if either input is NULL.
Availability: 3.7.0
This example returns the midpoint of a NURBS curve.
SELECT ST_Evaluate('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry, 0.5);This example samples multiple points along a curve.
SELECT t, ST_Evaluate(curve, t) AS point
FROM (SELECT 'NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry AS curve) AS c,
generate_series(0, 1, 0.25) AS t;ST_NurbsToLineString — Converts a NURBS curve to a LINESTRING by uniform sampling.
geometry ST_NurbsToLineString(geometry nurbscurve, integer num_segments=32);
Converts a NURBS curve to a LINESTRING geometry by creating a piecewise linear approximation. The curve is sampled at uniformly distributed parameter values and the resulting points are connected with straight line segments.
The optional num_segments parameter specifies the number of line segments in the output (default: 32, range: 2-10000). Higher values produce smoother approximations but increase geometry complexity.
Raises an error if the input is not a NURBS curve. Returns NULL if the input is NULL.
Availability: 3.7.0
This example converts a NURBS curve to a LineString using the default quality.
SELECT ST_NurbsToLineString('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);LINESTRING(0 0,0.3125 0.60546875,0.625 1.171875,0.9375 1.69921875,1.25 2.1875,1.5625 2.63671875,1.875 3.046875,2.1875 3.41796875,2.5 3.75,2.8125 4.04296875,3.125 4.296875,3.4375 4.51171875,3.75 4.6875,4.0625 4.82421875,4.375 4.921875,4.6875 4.98046875,5 5,5.3125 4.98046875,5.625 4.921875,5.9375 4.82421875,6.25 4.6875,6.5625 4.51171875,6.875 4.296875,7.1875 4.04296875,7.5 3.75,7.8125 3.41796875,8.125 3.046875,8.4375 2.63671875,8.75 2.1875,9.0625 1.69921875,9.375 1.171875,9.6875 0.60546875,10 0)
This example creates a high-quality approximation with 64 segments.
SELECT ST_NurbsToLineString('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry, 64);LINESTRING(0 0,0.15625 0.3076171875,0.3125 0.60546875,0.46875 0.8935546875,0.625 1.171875,0.78125 1.4404296875,0.9375 1.69921875,1.09375 1.9482421875,1.25 2.1875,1.40625 2.4169921875,1.5625 2.63671875,1.71875 2.8466796875,1.875 3.046875,2.03125 3.2373046875,2.1875 3.41796875,2.34375 3.5888671875,2.5 3.75,2.65625 3.9013671875,2.8125 4.04296875,2.96875 4.1748046875,3.125 4.296875,3.28125 4.4091796875,3.4375 4.51171875,3.59375 4.6044921875,3.75 4.6875,3.90625 4.7607421875,4.0625 4.82421875,4.21875 4.8779296875,4.375 4.921875,4.53125 4.9560546875,4.6875 4.98046875,4.84375 4.9951171875,5 5,5.15625 4.9951171875,5.3125 4.98046875,5.46875 4.9560546875,5.625 4.921875,5.78125 4.8779296875,5.9375 4.82421875,6.09375 4.7607421875,6.25 4.6875,6.40625 4.6044921875,6.5625 4.51171875,6.71875 4.4091796875,6.875 4.296875,7.03125 4.1748046875,7.1875 4.04296875,7.34375 3.9013671875,7.5 3.75,7.65625 3.5888671875,7.8125 3.41796875,7.96875 3.2373046875,8.125 3.046875,8.28125 2.8466796875,8.4375 2.63671875,8.59375 2.4169921875,8.75 2.1875,8.90625 1.9482421875,9.0625 1.69921875,9.21875 1.4404296875,9.375 1.171875,9.53125 0.8935546875,9.6875 0.60546875,9.84375 0.3076171875,10 0)
This example creates a lower-quality, faster approximation with 16 segments.
SELECT ST_NurbsToLineString('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry, 16);LINESTRING(0 0,0.625 1.171875,1.25 2.1875,1.875 3.046875,2.5 3.75,3.125 4.296875,3.75 4.6875,4.375 4.921875,5 5,5.625 4.921875,6.25 4.6875,6.875 4.296875,7.5 3.75,8.125 3.046875,8.75 2.1875,9.375 1.171875,10 0)
Ці функції створюють модифіковані геометрії шляхом зміни типу, структури або вершин.
ST_AddPoint — Додати точку до LineString.
geometry ST_AddPoint(geometry linestring, geometry point);
geometry ST_AddPoint(geometry linestring, geometry point, integer position = -1);
Додає точку до LineString перед індексом position (використовуючи індекс, що починається з 0). Якщо параметр position пропущено або дорівнює -1, точка додається в кінець LineString.
Доступність: 1.1.0
This function supports 3d and will not drop the z-index.
Додати точку в кінець 3D лінії
SELECT ST_AddPoint('LINESTRING(0 0 1,1 1 1)', ST_MakePoint(1, 2, 3));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);
За заданою колекцією геометрій повертає однорідну мультигеометрію.
Якщо type не вказано, повертає мультигеометрію, що містить тільки геометрії найвищого виміру. Тому полігони мають пріоритет над лініями, які мають пріоритет над точками.
Якщо вказано type, повертає мультигеометрію, що містить тільки цей тип. Якщо немає підгеометрій потрібного типу, повертається геометрія EMPTY. Підтримуються тільки точки, лінії та полігони. Номери типів:
1 == POINT
2 == LINESTRING
3 == POLYGON
Для вхідних даних атомарної геометрії геометрія повертається без змін, якщо тип вхідних даних відповідає запитуваному типу. В іншому випадку результатом є геометрія EMPTY заданого типу. За необхідності їх можна перетворити на мультигеометрії за допомогою ST_Multi.
![]() | |
Результати MultiPolygon не перевіряються на валідність. Якщо компоненти полігону є суміжними або перекриваються, результат буде недійсним. (Наприклад, це може статися при застосуванні цієї функції до результату ST_Split.) Цю ситуацію можна перевірити за допомогою ST_IsValid і виправити за допомогою ST_MakeValid. |
Доступність: 1.5.0
![]() | |
До версії 1.5.3 ця функція повертала атомарні вхідні дані без змін, незалежно від типу. У версії 1.5.3 невідповідні одиничні геометрії повертали результат NULL. У версії 2.0.0 невідповідні одиничні геометрії повертають результат EMPTY запитуваного типу. |
Витяг типу найвищого виміру:
SELECT ST_CollectionExtract('GEOMETRYCOLLECTION( POINT(0 0), LINESTRING(1 1,2 2) )');MULTILINESTRING((1 1, 2 2))
Витягнути точки (тип 1 == POINT):
SELECT ST_CollectionExtract('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))',
1);MULTIPOINT((0 0))
Витягнути лінії (тип 2 == LINESTRING):
SELECT ST_CollectionExtract('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(LINESTRING(0 0,1 1)), LINESTRING(2 2,3 3))',
2);MULTILINESTRING((0 0, 1 1), (2 2, 3 3))
ST_CollectionHomogenize — Повертає найпростіше представлення колекції геометрії.
geometry ST_CollectionHomogenize(geometry collection);
За заданою колекцією геометрії повертає "найпростіше" представлення вмісту.
Однорідні (однотипні) колекції повертаються як відповідна мультигеометрія.
Гетерогенні (змішані) колекції об'єднуються в одну колекцію GeometryCollection.
Колекції, що містять один атомарний елемент, повертаються як цей елемент.
Атомарні геометрії повертаються без змін. При необхідності їх можна перетворити на мультигеометрії за допомогою ST_Multi.
![]() | |
Ця функція не гарантує, що результат є дійсним. Зокрема, колекція, що містить сусідні або перекриваються полігони, створить недійсний MultiPolygon. Цю ситуацію можна перевірити за допомогою ST_IsValid і виправити за допомогою ST_MakeValid. |
Доступність: 2.0.0
Одноелементна колекція, перетворена в атомарну геометрію
SELECT ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0))');POINT(0 0)
Вкладена колекція з одним елементом, перетворена в атомарну геометрію:
SELECT ST_CollectionHomogenize('GEOMETRYCOLLECTION(MULTIPOINT((0 0)))');POINT(0 0)
Колекція перетворена на багатогеометрію:
SELECT ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0), POINT(1 1))');MULTIPOINT((0 0),(1 1))
Вкладені неоднорідні колекції, сплощені до GeometryCollection:
SELECT ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0), GEOMETRYCOLLECTION( LINESTRING(1 1,2 2)))');GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(1 1,2 2))
Колекція полігонів, перетворених у (недійсний) MultiPolygon:
SELECT 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)))');MULTIPOLYGON(((10 50,50 50,50 10,10 10,10 50)),((90 50,90 10,50 10,50 50,90 50)))
ST_CurveToLine — Перетворює геометрію, що містить криві, на лінійну геометрію.
geometry ST_CurveToLine(geometry curveGeom, float tolerance, integer tolerance_type, integer flags);
Перетворює CIRCULAR STRING у звичайний LINESTRING або CURVEPOLYGON у POLYGON або MULTISURFACE у MULTIPOLYGON. Корисно для виведення на пристрої, які не підтримують типи геометрії CIRCULARSTRING
Перетворює задану геометрію в лінійну геометрію. Кожна крива геометрія або сегмент перетворюється в лінійне наближення з використанням заданого `допуску` та опцій (32 сегменти на квадрант і жодних опцій за замовчуванням).
Аргумент "tolerance_type" визначає інтерпретацію аргументу "tolerance". Він може приймати наступні значення:
0 (за замовчуванням): Допустиме відхилення — максимальна кількість сегментів на квадрант.
1: Допуск — це максимальне відхилення лінії від кривої в одиницях джерела.
2: Допуск — це максимальний кут, виражений в радіанах, між радіусами, що утворюють.
Аргумент "flags" є бітовим полем. За замовчуванням має значення 0. Підтримуються такі біти:
1: Симетричний (незалежний від орієнтації) вихід.
2: Зберігає кут, запобігає зменшенню кутів (довжини сегментів) під час створення симетричного виводу. Не діє, якщо прапор Symmetric вимкнено.
Доступність: 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_CurveToLine('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)');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)
This example uses 3D input.
SELECT ST_CurveToLine('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)');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_CurveToLine('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)', 2);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 the approximated line is no more than 20 units away from the original curve, and make the result direction-neutral.
SELECT ST_CurveToLine(
'CIRCULARSTRING(0 0,100 -100,200 0)'::geometry,
20,
1,
1
);LINESTRING(0 0,49.99999999999996 -86.60254037844383,149.99999999999994 -86.6025403784439,200 0)
ST_Scroll — Змінити початкову точку замкнутої лінії LineString.
geometry ST_Scroll(geometry linestring, geometry point);
Змінює початкову/кінцеву точку замкнутої лінії LineString на задану вершину point.
Доступність: 3.2.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
Make a closed line start at its 3rd vertex.
SELECT ST_Scroll('SRID=4326;LINESTRING(0 0 0 1,10 0 2 0,5 5 4 2,0 0 0 1)', 'POINT(5 5 4 2)');SRID=4326;LINESTRING(5 5 4 2,0 0 0 1,10 0 2 0,5 5 4 2)
ST_FlipCoordinates — Повертає версію геометрії з перевернутими осями X та Y.
geometry ST_FlipCoordinates(geometry geom);
Повертає версію заданої геометрії з перевернутими осями X та Y. Корисно для виправлення геометрій, які містять координати, виражені у вигляді широти/довготи (Y, X).
Доступність: 2.0.0
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).
SELECT ST_FlipCoordinates(GeomFromEWKT('POINT(1 2)'));POINT(2 1)
ST_Force2D — Примусово переведіть геометрії в "2-вимірний режим".
geometry ST_Force2D(geometry geomA);
Примусово переводить геометрії в "двовимірний режим", щоб усі вихідні представлення мали тільки координати X і Y. Це корисно для виведення даних, сумісних із OGC (оскільки OGC визначає тільки двовимірні геометрії).
Покращено: 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_Force2D('CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)');CIRCULARSTRING(1 1,2 3,4 5,6 7,5 6)
SELECT 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))');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 Zvalue.
Покращено: 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_Force3D('CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)');CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)
SELECT ST_Force3D('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))');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 Zvalue.
Покращено: 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_Force3DZ('CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)');CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)
SELECT ST_Force3DZ('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))');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_3DM.
Змінено: 3.1.0. Додано підтримку для надання значення M, відмінного від нуля.
This method supports Circular Strings and Curves.
Nothing happens to an already 3D geometry.
SELECT ST_Force3DM('CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)');CIRCULARSTRINGM(1 1 0,2 3 0,4 5 0,6 7 0,5 6 0)
SELECT 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))');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_AsEWKT, ST_Force2D, ST_Force3DM, ST_Force3D, ST_GeomFromEWKT
ST_Force4D — Примусово перевести геометрії в режим XYZM.
geometry ST_Force4D(geometry geomA, float Zvalue = 0.0, float Mvalue = 0.0);
Примусово переводить геометрії в режим XYZM. Zvalue та 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_Force4D('CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)');CIRCULARSTRING(1 1 2 0,2 3 2 0,4 5 2 0,6 7 2 0,5 6 2 0)
SELECT 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))');MULTILINESTRING((0 0 0 1,0 5 0 2,5 0 0 3,0 0 0 4),(1 1 0 1,3 1 0 1,1 3 0 1,1 1 0 1))
ST_ForceCollection — Перетворити геометрію в GEOMETRYCOLLECTION.
geometry ST_ForceCollection(geometry geomA);
Перетворює геометрію в GEOMETRYCOLLECTION. Це корисно для спрощення представлення WKB.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь.
Доступність: 1.2.2, до версії 1.3.4 ця функція буде виходити з ладу з кривими. Ця проблема вирішена в версії 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_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))');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_ForceCollection('CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)');GEOMETRYCOLLECTION(CIRCULARSTRING(220227 150406,2220227 150407,220227 150406))
This example uses a PolyhedralSurface.
SELECT 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)))');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_AsEWKT, ST_Force2D, ST_Force3DM, ST_Force3D, ST_GeomFromEWKT
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.
SELECT ST_ForceCurve('POLYGON((0 0 2,5 0 2,0 5 2,0 0 2),(1 1 2,1 3 2,3 1 2,1 1 2))'::geometry
);CURVEPOLYGON Z ((0 0 2,5 0 2,0 5 2,0 0 2),(1 1 2,1 3 2,3 1 2,1 1 2))
ST_ForcePolygonCCW — Всі зовнішні кільця орієнтуйте проти годинникової стрілки, а всі внутрішні кільця — за годинниковою стрілкою.
geometry ST_ForcePolygonCCW(geometry geom);
Змушує (Мульти)Полігони) використовувати орієнтацію проти годинникової стрілки для зовнішнього кільця та орієнтацію за годинниковою стрілкою для внутрішніх кілець. Неполігональні геометрії повертаються без змін.
Доступність: 2.4.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
Force a polygon and its hole to use counter-clockwise exterior rings and clockwise interior rings.
WITH data AS (
SELECT 'POLYGON((0 0,0 4,4 4,4 0,0 0),
(1 1,3 1,3 3,1 3,1 1))'::geometry AS geom
)
SELECT geom AS input_polygon,
ST_ForcePolygonCCW(geom) AS ccw_polygon
FROM data;POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1)) | POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1,1 3,3 3,3 1,1 1))
ST_ForcePolygonCW — Всі зовнішні кільця орієнтуйте за годинниковою стрілкою, а всі внутрішні кільця — проти годинникової стрілки.
geometry ST_ForcePolygonCW(geometry geom);
Змушує (Мульти)Полігони) використовувати орієнтацію за годинниковою стрілкою для зовнішнього кільця та проти годинникової стрілки для внутрішніх кілець. Неполігональні геометрії повертаються без змін.
Доступність: 2.4.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
Force a polygon and its hole to use clockwise exterior rings and counter-clockwise interior rings.
WITH data AS (
SELECT 'POLYGON((0 0,4 0,4 4,0 4,0 0),
(1 1,1 3,3 3,3 1,1 1))'::geometry AS geom
)
SELECT geom AS input_polygon,
ST_ForcePolygonCW(geom) AS cw_polygon
FROM data;POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1,1 3,3 3,3 1,1 1)) | POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1))
ST_ForceSFS — Force geometries to use SFS 1.1 or 1.2 geometry types.
geometry ST_ForceSFS(geometry geomA);
geometry ST_ForceSFS(geometry geomA, text version);
Forces a geometry to use the geometry types defined by the requested version of the OGC Simple Features Specification. The default is SFS 1.1. Curved geometries are converted to linear representations, TRIANGLE is converted to POLYGON, and TIN and POLYHEDRALSURFACE are converted to GEOMETRYCOLLECTION values containing POLYGON elements.
If version begins with 1.2, curved geometries are still converted to linear representations, but TRIANGLE, TIN, and POLYHEDRALSURFACE are preserved. Other version values use the default SFS 1.1 behavior. Geometry collections are processed recursively, and the SRID and Z/M coordinates are preserved.
Доступність: 2.1.0
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This method supports Circular Strings and Curves.
This function supports 3d and will not drop the z-index.
Compare the geometry types produced for SFS 1.1 (the default) and SFS 1.2. Read each row from the input type in the direction of the result columns.
WITH inputs(geom) AS (VALUES
('CIRCULARSTRING(0 0, 1 1, 2 0)'::geometry),
('TRIANGLE((0 0, 0 2, 2 0, 0 0))'::geometry),
('TIN(((0 0, 0 2, 2 0, 0 0)))'::geometry),
('POLYHEDRALSURFACE(((0 0, 0 2, 2 0, 0 0)))'::geometry)
)
SELECT ST_GeometryType(geom) || ' →' AS input,
ST_GeometryType(ST_ForceSFS(geom)) AS "SFS 1.1 (default)",
ST_GeometryType(ST_ForceSFS(geom, '1.2')) AS "SFS 1.2"
FROM inputs;input | SFS 1.1 (default) | SFS 1.2 ------------------------+-----------------------+---------------------- ST_CircularString → | ST_LineString | ST_LineString ST_Triangle → | ST_Polygon | ST_Triangle ST_Tin → | ST_GeometryCollection | ST_Tin ST_PolyhedralSurface → | ST_GeometryCollection | ST_PolyhedralSurface (4 rows)
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.
SELECT ST_ForceRHR('POLYGON((0 0 2,5 0 2,0 5 2,0 0 2),(1 1 2,1 3 2,3 1 2,1 1 2))'
);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_LineExtend — Повертає лінію, розширений вперед і назад на вказані відстані.
geometry ST_LineExtend(geometry line, float distance_forward, float distance_backward=0.0);
Повертає лінію, продовжену вперед і назад шляхом додавання нових початкових (і кінцевих) точок на заданій відстані (відстанях). Відстань, рівна нулю, не додає точку. Допускаються тільки невід'ємні відстані. Напрямок доданих точок визначається першими (і останніми) двома відмінними точками лінії. Повторювані точки ігноруються.
Доступність: 3.4.0
SELECT ST_LineExtend('LINESTRING(0 0,0 10)'::geometry, 5, 6);LINESTRING(0 -6,0 0,0 10,0 15)
ST_LineToCurve — Перетворює лінійну геометрію на криву геометрію.
geometry ST_LineToCurve(geometry geomANoncircular);
Перетворює прості LINESTRING/POLYGON в CIRCULAR STRINGs і вигнуті полігони. Зверніть увагу, що для опису вигнутого еквівалента потрібно набагато менше точок.
![]() | |
Якщо вхідні дані LINESTRING/POLYGON недостатньо вигнуті, щоб чітко відобразити криву, функція поверне ту саму вхідну геометрію. |
Доступність: 1.3.0
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
This example converts a linear Polygon approximating a circle to a CurvePolygon.
WITH data AS (
SELECT ST_Buffer('POINT(1 3)'::geometry, 3) AS geom
)
SELECT geom AS "input_Linear polygon",
ST_LineToCurve(geom) AS "Curved polygon"
FROM data;This example converts a 3D linear ring to a CircularString while preserving Z.
WITH data AS (
SELECT ST_Translate(
ST_Force3D(ST_Boundary(ST_Buffer(ST_Point(1, 3), 2, 2))),
0, 0, 3
) AS geom
)
SELECT geom AS "input_Linear ring at Z=3",
ST_LineToCurve(geom) AS "Circular string at Z=3"
FROM data;ST_Multi — Повернути геометрію як геометрію MULTI*.
geometry ST_Multi(geometry geom);
Повертає геометрію як колекцію геометрії MULTI*. Якщо геометрія вже є колекцією, вона повертається без змін.
A Polygon is converted to a single-element MultiPolygon. The coordinates are unchanged.
SELECT ST_Multi('POLYGON ((10 30,30 30,30 10,10 10,10 30))');MULTIPOLYGON(((10 30,30 30,30 10,10 10,10 30)))
ST_Normalize — Повернути геометрію в канонічній формі.
geometry ST_Normalize(geometry geom);
Повертає геометрію в нормалізованому/канонічному вигляді. Може змінювати порядок вершин у кільцях полігонів, кільцях у полігоні, елементах у багатогеометричному комплексі.
В основному корисний тільки для тестування (порівняння очікуваних і отриманих результатів).
Доступність: 2.3.0
SELECT ST_Normalize('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)
)
)');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))
ST_Project — Повертає точку, спроектовану від початкової точки на відстань і азимут.
geometry ST_Project(geometry g1, float distance, float azimuth);
geometry ST_Project(geometry g1, geometry g2, float distance);
geography ST_Project(geography g1, float distance, float azimuth);
geography ST_Project(geography g1, geography g2, float distance);
Повертає точку, спроектовану з точки вздовж геодезичної лінії з використанням заданої відстані та азимута (пеленга). Це відоме як пряма геодезична задача.
Двоточкова версія використовує шлях від першої до другої точки для неявного визначення азимута і використовує відстань, як і раніше.
Відстань вказана в метрах. Підтримуються від'ємні значення.
Азимут (також відомий як курс або пеленг) вимірюється в радіанах. Він вимірюється за годинниковою стрілкою від справжнього півночі.
Північ — це азимут нуль (0 градусів)
Схід — азимут π/2 (90 градусів)
Південь — азимут π (180 градусів)
Захід знаходиться на азимуті 3π/2 (270 градусів)
Підтримуються від'ємні значення азимута та значення, більші за 2π (360 градусів).
Доступність: 2.0.0
Покращено: 2.4.0 Дозволено негативну відстань і ненормалізований азимут.
Покращено: 3.4.0 Дозволено аргументи геометрії та двоточкову форму з пропуском азимута.
SELECT ST_Project('POINT(0 0)'::geography, 100000, radians(45.0));POINT(0.635231029125537 0.639472334729198)
ST_QuantizeCoordinates — Встановлює найменш значущі біти координат у нуль
geometry ST_QuantizeCoordinates(geometry g, int prec_x, int prec_y = NULL, int prec_z = NULL, int prec_m = NULL);
ST_QuantizeCoordinates визначає кількість бітів (N), необхідних для представлення значення координати з заданою кількістю цифр після десяткової крапки, а потім встановлює всі біти, крім N найстарших, в нуль. Отримане значення координати все одно буде округлено до початкового значення, але його стисливість буде покращено. Це може призвести до значного зменшення використання дискового простору за умови, що стовпець геометрії використовує стисливий тип зберігання. Функція дозволяє вказати різну кількість цифр після десяткової крапки в кожному вимірі; невизначені виміри вважаються такими, що мають точність виміру x. Негативні цифри інтерпретуються як цифри ліворуч від десяткової крапки (тобто prec_x=-2 збереже значення координат з точністю до 100.
Координати, отримані за допомогою ST_QuantizeCoordinates, не залежать від геометрії, що містить ці координати, та відносного положення цих координат у геометрії. Як результат, використання цієї функції не впливає на існуючі топологічні відносини між геометріями. Функція може створити недійсну геометрію, якщо її викликати з кількістю цифр, меншою за внутрішню точність геометрії.
Доступність: 2.5.0
PostGIS зберігає всі значення координат у вигляді цілих чисел з подвійною точністю, які можуть надійно представляти 15 значущих цифр. Однак PostGIS може використовуватися для управління даними, які за своєю суттю мають менше 15 значущих цифр. Прикладом є дані TIGER, які надаються у вигляді географічних координат з точністю до шести цифр після десяткової крапки (отже, потрібно лише дев'ять значущих цифр довготи та вісім значущих цифр широти)
Коли доступно 15 значущих цифр, існує багато можливих представлень числа з 9 значущими цифрами. Число з подвійною точністю з плаваючою комою використовує 52 явних біти для представлення значущої частини (мантиси) координати. Для представлення мантиси з 9 значущими цифрами потрібно лише 30 бітів, що залишає 22 не значущих біти; ми можемо встановити їх значення на будь-яке, яке нам подобається, і все одно отримаємо число, яке округлюється до вхідного значення. Наприклад, значення 100,123456 можна представити числами з плаваючою комою, найближчими до 100,123456000000, 100,123456000001 та 100,123456432199. Усі вони є однаково дійсними, оскільки ST_AsText(geom, 6) поверне однаковий результат для будь-якого з цих вхідних значень. Оскільки ми можемо встановити ці біти на будь-яке значення, ST_QuantizeCoordinates встановлює 22 незначущі біти на нуль. Для довгої послідовності координат це створює шаблон блоків послідовних нулів, який PostgreSQL стискає більш ефективно.
![]() | |
На розмір геометрії на диску потенційно впливає лише |
SELECT ST_QuantizeCoordinates('POINT (100.123456 0)'::geometry, 4);POINT(100.12344360351562 0)
WITH test AS (SELECT 'POINT (123.456789123456 123.456789123456)'::geometry AS geom) SELECT digits, encode(ST_QuantizeCoordinates(geom, digits), 'hex'), 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 | 01010000005e9a72083cdd5e405e9a72083cdd5e40 | POINT(123.45678912345599 123.45678912345599)
12 | 0101000000409a72083cdd5e40409a72083cdd5e40 | POINT(123.45678912345556 123.45678912345556)
11 | 0101000000009a72083cdd5e40009a72083cdd5e40 | POINT(123.45678912345466 123.45678912345466)
10 | 0101000000009872083cdd5e40009872083cdd5e40 | POINT(123.45678912344738 123.45678912344738)
9 | 0101000000008072083cdd5e40008072083cdd5e40 | POINT(123.45678912336007 123.45678912336007)
8 | 0101000000000070083cdd5e40000070083cdd5e40 | POINT(123.45678912103176 123.45678912103176)
7 | 0101000000000060083cdd5e40000060083cdd5e40 | POINT(123.4567891061306 123.4567891061306)
6 | 0101000000000000083cdd5e40000000083cdd5e40 | POINT(123.45678901672363 123.45678901672363)
5 | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375)
4 | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375)
3 | 01010000000000000038dd5e400000000038dd5e40 | POINT(123.45654296875 123.45654296875)
2 | 01010000000000000000dd5e400000000000dd5e40 | POINT(123.453125 123.453125)
1 | 01010000000000000000dc5e400000000000dc5e40 | POINT(123.4375 123.4375)
0 | 01010000000000000000c05e400000000000c05e40 | POINT(123 123)
-1 | 01010000000000000000005e400000000000005e40 | POINT(120 120)
-2 | 010100000000000000000058400000000000005840 | POINT(96 96)
-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)
(31 rows)ST_RemovePoint — Видалити точку з лінії.
geometry ST_RemovePoint(geometry linestring, integer offset);
Видаляє точку з LineString, задавши її індекс (починаючи з 0). Корисно для перетворення замкнутої лінії (кільця) у відкриту лінію.
Покращено: 3.2.0
Доступність: 1.1.0
This function supports 3d and will not drop the z-index.
Гарантує, що лінії не будуть закриті, видаляючи кінцеву точку закритих ліній (кільця). Припускає, що геометрична фігура має тип LINESTRING
UPDATE sometable
SET geom = ST_RemovePoint(geom, ST_NPoints(geom) - 1)
FROM sometable
WHERE ST_IsClosed(geom);
ST_RemoveRepeatedPoints — Повертає версію геометрії з видаленими дублікатами точок.
geometry ST_RemoveRepeatedPoints(geometry geom, float8 tolerance = 0.0);
Повертає версію заданої геометрії з видаленими дублюючими послідовними точками. Функція обробляє тільки (Multi)LineStrings, (Multi)Polygons і MultiPoints, але її можна викликати з будь-яким типом геометрії. Елементи GeometryCollections обробляються індивідуально. Кінцеві точки LineStrings зберігаються.
Якщо вказано ненульовий параметр tolerance, вершини, що знаходяться на відстані, яка не перевищує допуск, вважаються дублікатами. Відстань обчислюється у 2D (площина XY).
Покращено: 3.2.0
Доступність: 2.2.0
This function supports Polyhedral surfaces.
This function supports 3d and will not drop the z-index.
SELECT ST_RemoveRepeatedPoints('MULTIPOINT ((1 1),(2 2),(3 3),(2 2))');MULTIPOINT((1 1),(2 2),(3 3))
SELECT 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_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_RemoveRepeatedPoints('LINESTRING (0 0,0 0,1 1,5 5,1 1,2 2)', 2);LINESTRING(0 0,5 5,2 2)
ST_RemoveIrrelevantPointsForView — Видаляє точки, які не мають значення для візуалізації певного прямокутного виду геометрії.
geometry ST_RemoveIrrelevantPointsForView(geometry geom, box2d bounds, boolean cartesian_hint = false);
Повертає geometryбез точок, що не мають значення для візуалізації геометрії в заданому прямокутному вікні.
Ця функція може бути використана для швидкої попередньої обробки геометрій, які повинні бути відтворені тільки в певних межах.
Оцінюються тільки геометрії типу (MULTI)POLYGON і (MULTI)LINESTRING. Інші геометрії залишаються без змін.
На відміну від ST_ClipByBox2D(), ця функція
сортує точки без обчислення нових точок перетину, що дозволяє уникнути помилок округлення і, як правило, підвищує продуктивність,
повертає геометрію з однаковою або схожою кількістю точок,
призводить до однакового результату візуалізації в межах заданого виду, і
може призвести до самоперетину, що зробить отриману геометрію недійсною (див. приклад нижче).
Якщо cartesian_hint встановлено на true, алгоритм застосовує додаткові оптимізації, що включають декартову математику, для подальшого зменшення кількості отриманих точок. Зверніть увагу, що використання цієї опції може призвести до появи артефактів рендерингу, якщо отримані координати перед рендерингом проектуються в іншу (не декартову) систему координат.
![]() | |
Для полігонів ця функція наразі не гарантує, що результат є дійсним. Цю ситуацію можна перевірити за допомогою ST_IsValid та виправити за допомогою ST_MakeValid. |
Доступність: 3.5.0
The input polygon has 55 points. The result retains 15 points, while rendering the same shape inside the view envelope.
WITH data(geom, view) AS (VALUES (
'POLYGON((3.2 14.2,6.8 14.2,7.6 11.9,7.2 9.8,7.8 7.2,10.3 7.2,11.5 7.5,13.8 7.2,14.6 5.9,14.2 4.8,14.8 3.2,14.6 0.9,13.2 -1.2,12.8 -3.8,12 -4.1,11 -4,9.8 -4.2,8.8 -4.8,8.3 -2.5,6.5 0.2,5.8 2.2,5.3 0.2,3.5 -1.5,2.8 -3.8,1.6 -4.5,-0.3 -5.2,-2.2 -5.8,-0.9 -4.8,-1.5 -4.4,-1.8 -2.8,-1.2 -1.8,0.5 -1.8,1.8 -1.8,2.3 -0.1,1.5 1.8,1.8 3.2,0 3.5,-3.2 4.2,-5.2 4.2,-4.4 4.9,-4.9 5.5,-4.3 5.9,-3.8 6.4,-3 6.9,-3.2 7.8,-2.2 8.2,-1.7 8.9,-2.7 9.4,-2.2 9.9,-1.4 10.9,-1.8 11.8,-1.2 12.2,-2.3 12.8,-2.9 13.2,0.6 13.5,3.2 14.2))'::geometry,
ST_MakeEnvelope(0.1, 0, 10, 10)
))
SELECT geom AS input_geom,
view AS input_view,
ST_RemoveIrrelevantPointsForView(geom, view, true) AS result,
view AS view
FROM data;Only linework affecting the view is retained; existing vertices are reused.
WITH data(geom, view) AS (VALUES (
'MULTILINESTRING((0 0,10 0,20 0,30 0),(0 15,5 15,10 15,15 15,20 15,25 15,30 15,40 15),(13 13,15 15,17 17))'::geometry,
ST_MakeEnvelope(12, 12, 18, 18)
))
SELECT geom AS input_geom,
view AS input_view,
ST_RemoveIrrelevantPointsForView(geom, view, true) AS result,
view AS view
FROM data;A line with no segment relevant to the view becomes empty.
SELECT ST_RemoveIrrelevantPointsForView('LINESTRING(0 0,10 0,20 0,30 0)',
ST_MakeEnvelope(12, 12, 18, 18), true);LINESTRING EMPTY
Removing vertices without computing intersections can introduce self-intersections in the result.
WITH data(geom, view) AS (VALUES (
'POLYGON((0 10,0 0,10 -10,30 0,25 20,10 -5,0 10))'::geometry,
ST_MakeEnvelope(-5, 1, 20, 12)
))
SELECT geom AS input_geom,
view AS input_view,
ST_RemoveIrrelevantPointsForView(geom, view, true) AS result,
view AS view
FROM data;With the default cartesian_hint, the function removes only points known to be irrelevant to the view.
WITH data(geom, view) AS (VALUES (
'POLYGON((0 30,15 30,30 30,30 0,0 0,0 30))'::geometry,
ST_MakeEnvelope(12, 12, 18, 18)
))
SELECT geom AS input_geom,
view AS input_view,
ST_RemoveIrrelevantPointsForView(geom, view) AS result,
view AS view
FROM data;ST_RemoveSmallParts — Видаляє невеликі частини (кільця полігону або лінії) геометрії.
geometry ST_RemoveSmallParts(geometry geom, double precision minSizeX, double precision minSizeY);
Повертає geometry без дрібних частин (зовнішніх або внутрішніх кілець полігону або лінійних елементів).
Ця функція може бути використана як попередній етап обробки для створення спрощених карт, наприклад, для видалення невеликих островів або отворів.
Він оцінює тільки геометрії типу (MULTI)POLYGON і (MULTI)LINESTRING. Інші геометрії залишаються без змін.
Якщо minSizeX більше 0, частини сортуються, якщо їх ширина менше minSizeX.
Якщо minSizeY більше 0, деталі сортуються, якщо їх висота менше minSizeY.
Обидва параметри minSizeX та minSizeY вимірюються в одиницях системи координат геометрії.
Для типів полігонів оцінка проводиться окремо для кожного кільця, що може призвести до одного з наступних результатів:
оригінальна геометрія,
POLYGON з усіма кільцями з меншою кількістю вершин,
POLYGON зі зменшеною кількістю внутрішніх кілець (можливо, з меншою кількістю вершин),
POLYGON EMPTY, або
MULTIPOLYGON зі зменшеною кількістю полігонів (можливо, з меншою кількістю внутрішніх кілець або вершин), або
MULTIPOLYGON EMPTY.
Для типів лінійних рядків оцінка виконується для кожної лінії, що може призвести до одного з таких результатів:
оригінальна геометрія,
LINESTRING зі зменшеною кількістю вершин,
LINESTRING EMPTY,
MULTILINESTRING зі зменшеною кількістю лінійних ланцюгів (які можуть мати менше вершин), або
MULTILINESTRING EMPTY.
Доступність: 3.5.0
SELECT ST_RemoveSmallParts('MULTIPOLYGON(
((60 160,120 160,120 220,60 220,60 160),(70 170,70 210,110 210,110 170,70 170)),
((85 75,155 75,155 145,85 145,85 75)),
((50 110,70 110,70 130,50 130,50 110)))',
50, 50);MULTIPOLYGON(((60 160,120 160,120 220,60 220,60 160)),((85 75,155 75,155 145,85 145,85 75)))
SELECT ST_RemoveSmallParts('LINESTRING(10 10,20 20)',
50, 50);LINESTRING EMPTY
ST_Reverse — Повернути геометрію з оберненим порядком вершин.
geometry ST_Reverse(geometry g1);
Може використовуватися для будь-якої геометрії та змінює порядок вершин.
Покращено: 2.4.0 додано підтримку кривих.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
WITH data(geom) AS (VALUES (
ST_MakeLine(ST_Point(1, 2), ST_Point(1, 10))
))
SELECT geom AS input_line,
ST_Reverse(geom) AS reversed_line
FROM data;input_line | reversed_line ----------------------+---------------------- LINESTRING(1 2,1 10) | LINESTRING(1 10,1 2) (1 row)
ST_Segmentize — Повертає змінену геометрію/географію, в якій немає сегментів, довжина яких перевищує задану відстань.
geometry ST_Segmentize(geometry geom, float max_segment_length);
geography ST_Segmentize(geography geog, float max_segment_length);
Повертає змінену геометрію/географію, в якій немає сегментів довжиною більше max_segment_length. Довжина обчислюється у 2D. Сегменти завжди розділяються на підсегменти однакової довжини.
Для геометрії максимальна довжина вимірюється в одиницях просторової системи відліку.
Для географії максимальна довжина вимірюється в метрах. Відстані обчислюються на сфері. Додані вершини створюються вздовж дуг сферичного великого кола, визначених кінцевими точками відрізків.
![]() | |
Це тільки скорочує довгі сегменти. Сегменти, довжина яких не перевищує максимальну, не подовжуються. |
![]() | |
Для вхідних даних, що містять довгі сегменти, вказання відносно короткого |
Доступність: 1.2.2
Покращено: 3.0.0 Сегментація геометрії тепер створює підсегменти однакової довжини
Покращено: 2.3.0 Сегментація географії тепер створює підсегменти однакової довжини
Покращено: 2.1.0 додано підтримку географії.
Змінено: 2.1.0 В результаті впровадження підтримки географії використання ST_Segmentize('LINESTRING(1 2, 3 4)', 0.5) спричиняє помилку неоднозначної функції. Вхідні дані потрібно правильно вказати як геометрію або географію. Використовуйте ST_GeomFromText, ST_GeogFromText або перетворення до необхідного типу (наприклад, ST_Segmentize('LINESTRING(1 2, 3 4)'::geometry, 0.5) )
Сегментація лінії. Довгі сегменти розділяються рівномірно, а короткі сегменти не розділяються.
SELECT ST_Segmentize('MULTILINESTRING((0 0,0 1,0 9),(1 10,1 18))'::geometry,
5);MULTILINESTRING((0 0,0 1,0 5,0 9),(1 10,1 14,1 18))
Сегментація полігону:
SELECT ST_Segmentize('POLYGON((0 0,0 8,30 0,0 0))'::geometry,
10);POLYGON((0 0,0 8,7.5 6,15 4,22.5 2,30 0,20 0,10 0,0 0))
Сегментація географічної лінії з використанням максимальної довжини сегмента 2000 кілометрів. Вершини додаються вздовж дуги великого кола, що з'єднує кінцеві точки.
SELECT ST_Segmentize(('LINESTRING (0 0,60 60)'::geography), 2000000);LINESTRING(0 0,4.252632294621186 8.43596525986862,8.69579947419404 16.824093489701564,13.550465473227048 25.107950473646188,19.1066053508691 33.21091076089908,25.779290201459894 41.01711439406505,34.188839517966954 48.337222885886,45.238153936612264 54.84733442373889,60 60)
ST_SetPoint — Замінити точку лінійного об'єкта на задану точку.
geometry ST_SetPoint(geometry linestring, integer zerobasedposition, geometry point);
Замінити точку N лінійного елемента на задану точку. Індекс починається з 0. Негативні індекси рахуються назад, так що -1 є останньою точкою. Це особливо корисно в тригерах, коли потрібно зберегти зв'язки між суглобами при переміщенні однієї вершини.
Доступність: 1.1.0
Оновлено 2.3.0: негативна індексація
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_SetPoint('LINESTRING(-1 2,-1 3)', 0, 'POINT(-1 1)');LINESTRING(-1 1,-1 3)
Change last point in a line string (let's play with 3D linestring this time)
SELECT ST_SetPoint(foo.geom, ST_NumPoints(foo.geom) - 1, 'POINT(-1 1 3)') FROM (SELECT 'LINESTRING(-1 2 3,-1 3 4,5 6 7)'::geometry As geom) As foo;
LINESTRING(-1 2 3,-1 3 4,-1 1 3)
SELECT ST_SetPoint(g, -3, p)
FROM ST_GeomFromText('LINESTRING(0 0,1 1,2 2,3 3,4 4)') AS g
CROSS JOIN ST_PointN(g, 1) as p;LINESTRING(0 0,1 1,0 0,3 3,4 4)
ST_AddPoint, ST_NPoints, ST_NumPoints, ST_PointN, ST_RemovePoint
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 заважала цій функції працювати з MULTIPOINT. Версія 1.3.4+ також працює з MULTIPOINT. |
This function supports 3d and will not drop the z-index.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь та TIN.
ПРИМІТКА: ця функція була перейменована з "ST_Shift_Longitude" у версії 2.2.0
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
This example performs a forward longitude shift on a single point.
SELECT ST_ShiftLongitude('SRID=4326;POINT(270 0)'::geometry)POINT(-90 0)
This example performs a reverse longitude shift on a single point.
SELECT ST_ShiftLongitude('SRID=4326;POINT(-90 0)'::geometry)POINT(270 0)
This example shows that LineStrings are shifted only where coordinates require it.
SELECT ST_ShiftLongitude('SRID=4326;LINESTRING(174 12,182 13)'::geometry)LINESTRING(174 12,-178 13)
ST_WrapX — Оберніть геометрію навколо значення X.
geometry ST_WrapX(geometry geom, float8 wrap, float8 move);
Ця функція розділяє вхідні геометрії, а потім переміщує кожен отриманий компонент, що потрапляє праворуч (для від'ємного значення 'move') або ліворуч (для додатного значення 'move') від заданої лінії 'wrap' у напрямку, визначеному параметром 'move', і нарешті знову об'єднує частини разом.
![]() | |
Це корисно для "перецентрування" вхідних даних довготи та широти, щоб об'єкти, що представляють інтерес, не з'являлися з одного боку на інший. |
Доступність: 2.3.0 вимагає GEOS
This function supports 3d and will not drop the z-index.
Move all components whose bounding boxes fall completely to the left of x = 0 by +360.
SELECT ST_WrapX(geom, 0, 360);
Move all components whose bounding boxes fall completely to the left of x = -30 by +360.
SELECT ST_WrapX(geom, -30, 360);
ST_SnapToGrid — Прив'яжіть всі точки вхідної геометрії до регулярної сітки.
geometry ST_SnapToGrid(geometry geomA, float originX, float originY, float sizeX, float sizeY);
geometry ST_SnapToGrid(geometry geomA, float sizeX, float sizeY);
geometry ST_SnapToGrid(geometry geomA, float size);
geometry ST_SnapToGrid(geometry geomA, geometry pointOrigin, float sizeX, float sizeY, float sizeZ, float sizeM);
Варіант 1,2,3: Прив'язати всі точки вхідної геометрії до сітки, визначеної її початком і розміром комірки. Видалити послідовні точки, що потрапляють на одну комірку, і в кінцевому підсумку повернути NULL, якщо вихідних точок недостатньо для визначення геометрії заданого типу. Зібрані геометрії в колекції видаляються з неї. Корисно для зменшення точності.
Варіант 4: Введено в версії 1.1.0 — прив'язує всі точки вхідної геометрії до сітки, визначеної її початком (другий аргумент, повинен бути точкою) і розмірами комірок. Вкажіть 0 як розмір для будь-якого виміру, який не потрібно прив'язувати до сітки.
![]() | |
Повернена геометрія може втратити свою простоту (див. ST_IsSimple). |
![]() | |
До версії 1.1.0 ця функція завжди повертала 2D-геометрію. Починаючи з версії 1.1.0, повернена геометрія матиме ту саму розмірність, що й вхідна, а значення вищих розмірностей залишатимуться незмінними. Використовуйте версію, що приймає другий аргумент геометрії, щоб визначити всі розмірності сітки. |
Доступність: 1.0.0RC1
Доступність: 1.1.0 - підтримка Z і M
This function supports 3d and will not drop the z-index.
Snap a geometry column to a precision grid of 10^-3.
UPDATE mytable SET geom = ST_SnapToGrid(geom, 0.001);
Display how the same grid size rounds a LineString.
SELECT ST_SnapToGrid('LINESTRING(1.1115678 2.123,4.111111 3.2374897,4.11112 3.23748667)'::geometry,
0.001);LINESTRING(1.112 2.123,4.111 3.237)
This example snaps a 4D geometry.
SELECT ST_SnapToGrid('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)'::geometry,
'POINT(1.12 2.22 3.2 4.4444)',
0.1, 0.1, 0.1, 0.01);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_SnapToGrid('LINESTRING(-1.1115678 2.123 3 2.3456,
4.111111 3.2374897 3.1234 1.1111)'::geometry,
0.01);LINESTRING(-1.11 2.12 3 2.3456,4.11 3.24 3.1234 1.1111)
ST_Snap, ST_AsEWKT, ST_AsText, ST_GeomFromText, ST_GeomFromEWKT, ST_Simplify
ST_Snap — Прив'язати сегменти та вершини вхідної геометрії до вершин еталонної геометрії.
geometry ST_Snap(geometry input, geometry reference, float tolerance);
Прив'язує вершини та сегменти геометрії до вершин іншої геометрії. Для контролю місця прив'язки використовується допуск відстані прив'язки. Результатом є геометрія з прив'язаними вершинами. Якщо прив'язка не відбувається, геометрія залишається без змін.
З'єднання однієї геометрії з іншою може підвищити надійність операцій накладання, усуваючи майже збіжні краї (які спричиняють проблеми під час обчислення вузлів і перетинів).
Занадто часте прив'язування може призвести до створення некоректної топології, тому кількість і розташування прив'язаних вершин визначається за допомогою евристичних методів, які визначають, коли прив'язування є безпечним. Однак це може призвести до пропуску деяких потенційних прив'язок.
![]() | |
Повернена геометрія може втратити свою простоту (див. ST_IsSimple) та валідність (див. ST_IsValid). |
Виконується модулем GEOS.
Доступність: 2.0.0
A MultiPolygon snapped to a LineString at 1.01 times their distance.
SELECT 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;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)))
A MultiPolygon snapped to a LineString at 1.25 times their distance.
SELECT 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;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)))
The LineString snapped to the original MultiPolygon at 1.01 times their distance.
SELECT 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;LINESTRING(5 107,26 125,54 84,101 100)
The LineString snapped to the original MultiPolygon at 1.25 times their distance.
SELECT 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;LINESTRING(26 125,54 84,101 100)
ST_SwapOrdinates — Повертає версію заданої геометрії із заміненими значеннями ординат.
geometry ST_SwapOrdinates(geometry geom, cstring ords);
Повертає версію заданої геометрії із заміненими заданими координатами.
Параметр ords — це 2-символьний рядок, що позначає координати, які потрібно поміняти місцями. Допустимі імена: 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).
This example scales the M value by 2.
SELECT ST_SwapOrdinates(ST_Scale(ST_SwapOrdinates(g, 'xm'),
2, 1
),
'xm') FROM ( SELECT 'POINT ZM (0 0 0 2)'::geometry g ) foo;POINT ZM (0 0 0 4)
Ці функції перевіряють, чи геометрії є дійсними відповідно до стандарту OGC SFS. Вони також надають інформацію про характер і місце розташування недійсних елементів. Існує також функція для створення дійсної геометрії з недійсної.
valid_detail, в якому вказано, чи є геометрія дійсною, а якщо ні, то причина та місце розташування.ST_IsValid — Перевіряє, чи геометрія має правильну форму в 2D.
boolean ST_IsValid(geometry g);
boolean ST_IsValid(geometry g, integer flags);
Перевіряє, чи значення ST_Geometry є правильно сформованим і дійсним у 2D відповідно до правил OGC. Для геометрій з 3 і 4 вимірами дійсність все ще перевіряється тільки у 2 вимірах. Для геометрій, які є недійсними, видається повідомлення PostgreSQL NOTICE з детальною інформацією про причини недійсності.
Для версії з параметром flags підтримувані значення задокументовані в ST_IsValidDetailЦя версія не друкує ПОВІДОМЛЕННЯ, що пояснює недійсність.
Більш детальну інформацію про визначення геометричної валідності див. Розділ 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. |
SELECT ST_IsValid('LINESTRING(0 0,1 1)') As good_line,
ST_IsValid('POLYGON((0 0,1 1,1 2,1 1,0 0))') As bad_poly;NOTICE: Self-intersection at or near point 0 0 good_line | bad_poly -----------+---------- t | f
Find tables with invalid geometries in registered geometry columns.
CREATE TEMP TABLE invalid_geometry_columns (
table_name text,
column_name text,
invalid_count bigint
);
DO $$
DECLARE
rec record;
invalid_count bigint;
BEGIN
FOR rec IN
SELECT f_table_schema, f_table_name, f_geometry_column
FROM geometry_columns
ORDER BY f_table_schema, f_table_name, f_geometry_column
LOOP
EXECUTE format(
'SELECT count(*) FROM %I.%I WHERE NOT ST_IsValid(%I, 0)',
rec.f_table_schema,
rec.f_table_name,
rec.f_geometry_column
) INTO invalid_count;
IF invalid_count
> 0 THEN
INSERT INTO invalid_geometry_columns
VALUES (
format('%I.%I', rec.f_table_schema, rec.f_table_name),
rec.f_geometry_column,
invalid_count
);
END IF;
END LOOP;
END;
$$;
SELECT * FROM invalid_geometry_columns;
ST_IsValidDetail — Повертає рядок valid_detail, в якому вказано, чи є геометрія дійсною, а якщо ні, то причина та місце розташування.
valid_detail ST_IsValidDetail(geometry geom, integer flags);
Повертає рядок valid_detail, що містить логічне значення (valid), яке вказує, чи є геометрія дійсною, рядок varchar (reason), що вказує причину, чому вона є недійсною, та геометрію (location), що вказує, де вона є недійсною.
Корисно для поліпшення комбінації ST_IsValid та ST_IsValidReason для створення детального звіту про недійсні геометрії.
Опціональний параметр flags є бітовим полем. Він може мати такі значення:
0: Використовуйте звичайну семантику валідності OGC SFS.
1: Consider certain kinds of self-touching rings (inverted shells and exverted holes) as valid. This is also known as "the ESRI flag", since this is the validity model used by those tools. Note that this is invalid under the OGC model.
Виконується модулем GEOS.
Доступність: 2.0.0
This example returns the first three rejects from a successful quintuplet experiment.
SELECT gid, reason(ST_IsValidDetail(geom)), 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)
This example reports a valid LineString.
SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)');valid | reason | location -------+--------+---------- t | |
ST_IsValidReason — Returns text stating if a geometry is valid, or a reason for invalidity.
text ST_IsValidReason(geometry geomA);
text ST_IsValidReason(geometry geomA, integer flags);
Returns text stating if a geometry is valid, or if invalid a reason why.
Useful in combination with ST_IsValid to generate a detailed report of invalid geometries and reasons.
Allowed flags are documented in ST_IsValidDetail.
Виконується модулем GEOS.
Доступність: 1.4
Availability: 2.0 version taking flags.
This example uses an invalid bow-tie polygon.
SELECT ST_IsValidReason(
'POLYGON ((100 200,100 100,200 200,
200 100,100 200))'::geometry) as validity_info;Self-intersection[150 150]
This example returns the first three 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 — Attempts to make an invalid geometry valid without losing vertices.
geometry ST_MakeValid(geometry input);
geometry ST_MakeValid(geometry input, text params);
The function attempts to create a valid representation of a given invalid geometry without losing any of the input vertices. Valid geometries are returned unchanged.
Supported inputs are: POINTS, MULTIPOINTS, LINESTRINGS, MULTILINESTRINGS, POLYGONS, MULTIPOLYGONS and GEOMETRYCOLLECTIONS containing any mix of them.
In case of full or partial dimensional collapses, the output geometry may be a collection of lower-to-equal dimension geometries, or a geometry of lower dimension.
Single polygons may become multi-geometries in case of self-intersections.
The params argument can be used to supply an options string to select the method to use for building valid geometry. The options string is in the format "method=linework|structure keepcollapsed=true|false". If no "params" argument is provided, the "linework" algorithm will be used as the default.
The "method" key has two values.
"linework" is the default algorithm, and builds valid geometries by first extracting all lines, noding that linework together, then building a value output from the linework. The requirement that no vertices are lost can generate complex collections as outputs.
"structure" is an algorithm that distinguishes between interior and exterior rings, building new geometry by unioning exterior rings, and then differencing all interior rings. The results tend to be more intuitive, where collapsed lines are discarded in the output.
The "keepcollapsed" key is only valid for the "structure" algorithm, and takes a value of "true" or "false".
Keep collapsed of "false" is the default, and means that geometry components that collapse to a lower dimensionality, for example a one-point linestring will be dropped.
Keep collapsed of "true" means geometry components that collapse to a lower dimensionality will be retained.
Виконується модулем GEOS.
Доступність: 2.0.0
Enhanced: 2.0.1, speed improvements
Enhanced: 2.1.0, added support for GEOMETRYCOLLECTION and MULTIPOINT.
Enhanced: 3.1.0, added removal of Coordinates with NaN values.
Enhanced: 3.2.0, added algorithm options, 'linework' and 'structure' which requires GEOS >= 3.10.0.
This function supports 3d and will not drop the z-index.
Make valid a MultiPolygon of two overlapping polygons using the linework and structure methods.
SELECT ST_MakeValid(before_geom) AS linework, ST_MakeValid(before_geom, 'method=structure') AS 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 before_geom) AS f;
MULTIPOLYGON(((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,56.769 64.769,58 62,64 56,14 6,13 6,12 5,11 5)),((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,125.231 133.231,56.769 64.769,54 71)),((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,134 126,128 132,125.231 133.231,186 194)),((135 125,142 118,146 109,149 100,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,64 56,134 126,135 125))) | MULTIPOLYGON(((149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40,90 41,81 44,72 48,65 55,64 56,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,56.769 64.769,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,125.231 133.231,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,134 126,135 125,142 118,146 109,149 100,150 90,149 80)))
Make valid a MultiPolygon of six overlapping polygons using the linework and structure methods.
SELECT ST_MakeValid(before_geom) AS linework,
ST_MakeValid(before_geom, 'method=structure') AS 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 before_geom) AS c;MULTIPOLYGON(((51 110,68.5 117.5,61 100,68.5 82.5,51 90,23 78,21.714 75,11 100,21.714 125,23 122,51 110)),((51 190,76 179.286,73 178,61 150,68.5 132.5,51 140,23 128,21.714 125,11 150,23 178,51 190)),((141 150,130.286 125,129 128,101 140,83.5 132.5,91 150,79 178,76 179.286,101 190,129 178,141 150)),((129 78,101 90,83.5 82.5,91 100,83.5 117.5,101 110,129 122,130.286 125,141 100,130.286 75,129 78)),((101 10,76 20.714,79 22,91 50,83.5 67.5,101 60,129 72,130.286 75,141 50,129 22,101 10)),((11 50,21.714 75,23 72,51 60,68.5 67.5,61 50,73 22,76 20.714,51 10,23 22,11 50)),((83.5 82.5,80.286 75,79 78,76 79.286,83.5 82.5)),((83.5 67.5,76 70.714,79 72,80.286 75,83.5 67.5)),((68.5 67.5,71.714 75,73 72,76 70.714,68.5 67.5)),((68.5 82.5,76 79.286,73 78,71.714 75,68.5 82.5)),((83.5 132.5,80.286 125,79 128,76 129.286,83.5 132.5)),((83.5 117.5,76 120.714,79 122,80.286 125,83.5 117.5)),((68.5 117.5,71.714 125,73 122,76 120.714,68.5 117.5)),((68.5 132.5,76 129.286,73 128,71.714 125,68.5 132.5))) | MULTIPOLYGON(((23 22,11 50,21.714 75,11 100,21.714 125,11 150,23 178,51 190,76 179.286,101 190,129 178,141 150,130.286 125,141 100,130.286 75,141 50,129 22,101 10,76 20.714,51 10,23 22)))
SELECT ST_MakeValid( 'LINESTRING(0 0,0 0)', 'method=structure keepcollapsed=true' );
POINT(0 0)
SELECT ST_MakeValid( 'LINESTRING(0 0,0 0)', 'method=structure keepcollapsed=false' );
LINESTRING EMPTY
Ці функції працюють із системою просторових координат геометрій, визначеною в таблиці spatial_ref_sys.
ST_InverseTransformPipeline — Повернути нову геометрію з координатами, перетвореними в іншу систему просторових координат, використовуючи обернену функцію визначеного конвеєра перетворення координат.
geometry ST_InverseTransformPipeline(geometry geom, text pipeline, integer to_srid);
Повернути нову геометрію з координатами, перетвореними в іншу систему просторових координат за допомогою визначеного конвеєра перетворення координат, що працює в зворотному напрямку.
Детальні відомості про написання конвеєра перетворення див. у ST_TransformPipeline.
Доступність: 3.4.0
SRID вхідної геометрії ігнорується, а SRID вихідної геометрії буде встановлено на нуль, якщо значення не буде вказано за допомогою опціонального параметра to_srid. При використанні ST_TransformPipeline конвеєр виконується в прямому напрямку. При використанні `ST_InverseTransformPipeline()` конвеєр виконується в зворотному напрямку.
Перетворення за допомогою конвеєрів є спеціалізованою версією ST_Transform. У більшості випадків `ST_Transform` вибере правильні операції для перетворення між системами координат, і його слід вважати кращим варіантом.
Змінити WGS 84 long lat на UTM 31N за допомогою перетворення EPSG:16031
This example transforms in the inverse direction.
SELECT ST_InverseTransformPipeline(
'POINT(426857.9877165967 5427937.523342293)'::geometry,
'urn:ogc:def:coordinateOperation:EPSG::16031'
) AS wgs_geom;POINT(2 48.99999999999999)
Приклад GDA2020.
This example uses ST_Transform with automatic selection of a conversion pipeline.
SELECT ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844) AS gda2020_auto;POINT(143.00000635638918 -36.999986706128176)
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 longitude/latitude.
SELECT ST_SetSRID(ST_Point(-123.365556, 48.428611), 4326) AS wgs84long_lat;
SRID=4326;POINT(-123.365556 48.428611)
Mark a point as WGS 84 longitude/latitude and then transform it to Web Mercator.
SELECT ST_Transform(ST_SetSRID(ST_Point(-123.365556, 48.428611), 4326), 3785) AS sphere_merc;
SRID=3785;POINT(-13732990.8753491 6178458.96425423)
ST_SRID — Повертає ідентифікатор просторової прив'язки для геометрії.
integer ST_SRID(geometry g1);
Повертає ідентифікатор просторової прив'язки для ST_Geometry, як визначено в таблиці spatial_ref_sys. Розділ 4.5, «Spatial Reference Systems»
![]() | |
Таблиця spatial_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.
SELECT ST_SRID(ST_GeomFromText('POINT(-71.1043 42.315)', 4326));st_srid
---------
4326
(1 row)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). Як альтернатива, для to_proj та/або from_proj можна використовувати просторову систему координат, визначену як рядок PROJ.4, однак ці методи не є оптимізованими. Якщо просторова система координат призначення виражена рядком PROJ.4 замість SRID, SRID вихідної геометрії буде встановлено на нуль. За винятком функцій з from_proj, вхідні геометрії повинні мати визначений SRID.
ST_Transform часто плутають з ST_SetSRID. ST_Transform фактично змінює координати геометрії з однієї системи просторових координат на іншу, тоді як ST_SetSRID() просто змінює ідентифікатор SRID геометрії.
ST_Transform автоматично вибирає відповідний конвеєр перетворення, враховуючи вихідну та цільову просторові системи координат. Щоб використовувати конкретний метод перетворення, скористайтеся ST_TransformPipeline.
![]() | |
Вимагає компіляції PostGIS з підтримкою PROJ. Використовуйте PostGIS_Full_Version, щоб підтвердити, що підтримка PROJ скомпільована. |
![]() | |
Якщо використовується більше одного перетворення, корисно мати функціональний індекс для часто використовуваних перетворень, щоб скористатися перевагами використання індексу. |
![]() | |
До версії 1.3.4 ця функція виходила з ладу при використанні з геометріями, що містять КРИВІ. Ця проблема вирішена у версії 1.3.4+ |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь.
Покращено: 2.3.0 додано підтримку прямого тексту PROJ.4.
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.
Змінити геометрію площини штату Массачусетс з американських футів на WGS 84 довгота-широта
SELECT ST_Transform(
'SRID=2249;POLYGON((743238 2967416,743238 2967450,
743265 2967450,743265.625 2967416,743238 2967416))'::geometry,
4326) AS wgs_geom;
SRID=4326;POLYGON((-71.1776848522251 42.3902896512903,-71.17768437663261 42.390382947801015,-71.17758443054647 42.390382667791854,-71.17758259272304 42.390289364798825,-71.1776848522251 42.3902896512903))
3D Circular String example.
SELECT ST_Transform('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'::geometry,
4326);SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512903 1,-71.17768437663261 42.390382947801015 2,
-71.17758443054647 42.390382667791854 3,
-71.17758259272304 42.390289364798825 3,-71.1776848522251 42.3902896512903 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_Transform(ST_Intersection(ST_Transform(p1, gnom), ST_Transform(p2, gnom)),
gnom, 4326)
FROM data;POLYGON((-140.9999840290591 73.42768865981984,-141 68,-170 68,-170.0000026915361 74.05492179637055,-140.9999840290591 73.42768865981984))
Іноді перетворення координат із зміщенням сітки може завершитися невдачею, наприклад, якщо PROJ.4 не було створено з файлами зміщення сітки або координати не лежать у діапазоні, для якого визначено зміщення сітки. За замовчуванням PostGIS видасть помилку, якщо файл зміщення сітки відсутній, але цю поведінку можна налаштувати для кожного SRID окремо, або шляхом тестування різних значень to_proj тексту PROJ.4, або шляхом зміни значення proj4text в таблиці 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, які не лежать у правильному діапазоні, не викликали помилку ERROR, ви повинні використати наступне:
UPDATE spatial_ref_sys SET proj4text = '+proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null +no_defs' WHERE srid = 4267;
ST_TransformPipeline — Повернути нову геометрію з координатами, перетвореними в іншу систему просторових координат за допомогою визначеного конвеєра перетворення координат.
geometry ST_TransformPipeline(geometry g1, text pipeline, integer to_srid);
Повернути нову геометрію з координатами, перетвореними в іншу систему просторових координат за допомогою визначеного конвеєра перетворення координат.
Трубопроводи трансформації визначаються за допомогою будь-якого з наступних форматів рядків:
urn:ogc:def:coordinateOperation:AUTHORITY::CODE. Зверніть увагу, що простий рядок EPSG:CODE не ідентифікує координатну операцію однозначно: той самий код EPSG може використовуватися для визначення CRS.
Рядок конвеєра PROJ у форматі: +proj=pipeline .... Автоматична нормалізація осей не застосовуватиметься, і за необхідності викликаюча сторона повинна буде додати додатковий крок конвеєра або видалити кроки axisswap.
З'єднані операції у формі: urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618.
Доступність: 3.4.0
SRID вхідної геометрії ігнорується, а SRID вихідної геометрії буде встановлено на нуль, якщо значення не буде вказано за допомогою опціонального параметра to_srid. При використанні `ST_TransformPipeline()` конвеєр виконується в прямому напрямку. При використанні ST_InverseTransformPipeline конвеєр виконується в зворотному напрямку.
Перетворення за допомогою конвеєрів є спеціалізованою версією ST_Transform. У більшості випадків `ST_Transform` вибере правильні операції для перетворення між системами координат, і його слід вважати кращим варіантом.
Змінити WGS 84 long lat на UTM 31N за допомогою перетворення EPSG:16031
This example transforms in the forward direction.
SELECT
ST_SetSRID(ST_TransformPipeline(
'SRID=4326;POINT(2 49)'::geometry,
'urn:ogc:def:coordinateOperation:EPSG::16031'
), 32631) AS utm_geom;SRID=32631;POINT(426857.9877165967 5427937.523342293)
This example transforms in the inverse direction.
SELECT
ST_SetSRID(ST_InverseTransformPipeline(
'SRID=32631;POINT(426857.9877165967 5427937.523342293)'::geometry,
'urn:ogc:def:coordinateOperation:EPSG::16031'
), 4326) AS wgs_geom;SRID=4326;POINT(2 48.99999999999999)
Приклад GDA2020.
This example uses ST_Transform with automatic selection of a conversion pipeline.
SELECT ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844) AS gda2020_auto;POINT(143.00000635638918 -36.999986706128176)
Using a defined conversion (EPSG:8447)
SELECT
ST_TransformPipeline(
'SRID=4939;POINT(143.0 -37.0)'::geometry,
'urn:ogc:def:coordinateOperation:EPSG::8447'
) AS gda2020_code;POINT(143.0000063280214 -36.999986718287545)
This example uses a PROJ pipeline definition matching EPSG:8447, as returned from projinfo. Any axisswap steps must be removed.
SELECT
ST_TransformPipeline(
'SRID=4939;POINT(143.0 -37.0)'::geometry,
'+proj=pipeline
+step +proj=unitconvert +xy_in=deg +xy_out=rad
+step +proj=hgridshift +grids=au_icsm_GDA94_GDA2020_conformal_and_distortion.tif
+step +proj=unitconvert +xy_in=rad +xy_out=deg'
) AS gda2020_pipeline;POINT(143.0000063280214 -36.999986718287545)
postgis_srs_codes — Повернути список кодів SRS, пов'язаних із зазначеним органом.
setof text postgis_srs_codes(text auth_name);
Повертає набір усіх auth_srid для заданого auth_name.
Доступність: 3.4.0
Версія Proj 6+
Перелічіть перші десять кодів, пов'язаних з органом EPSG.
SELECT * FROM postgis_srs_codes('EPSG') ORDER BY 1 LIMIT 10;10156 10157 10158 10160 10162 10163 10164 10165 10166 10167
postgis_srs — Повернути запис метаданих для запитуваного органу та srid.
setof record postgis_srs(text auth_name, text auth_srid);
Повертає запис метаданих для запитуваного auth_srid для заданого auth_name. Запис буде містити auth_name, auth_srid, srname, srtext, proj4text та кути області використання, point_sw і point_ne.
Доступність: 3.4.0
Версія Proj 6+
Отримати метадані для EPSG:3005.
SELECT auth_name, auth_srid, srname,point_sw AS point_sw,point_ne AS point_ne
FROM postgis_srs('EPSG', '3005');postgis_srs_all — Повернути записи метаданих для кожної системи просторових координат у базовій базі даних Proj.
набір записів postgis_srs_all(void);
Повертає набір усіх записів метаданих у базовій базі даних Proj. Записи матимуть auth_name, auth_srid, srname, srtext, proj4text та кути області використання, point_sw і point_ne.
Доступність: 3.4.0
Версія Proj 6+
Отримайте перші 10 записів метаданих з бази даних Proj.
SELECT auth_name, auth_srid, srname FROM postgis_srs_all() ORDER BY auth_name, auth_srid LIMIT 10;
auth_name | auth_srid | srname -----------+-----------+---------------------------------------------------------------------- EPSG | 10156 | ETRS89 + MSL UK & Ireland VORF08 depth EPSG | 10157 | ETRS89 + CD UK & Ireland VORF08 depth EPSG | 10158 | S34J-IRF EPSG | 10160 | S34J reconstruction east-orientated EPSG | 10162 | JGD2011 / Japan Plane Rectangular CS I + JGD2011 (vertical) height EPSG | 10163 | JGD2011 / Japan Plane Rectangular CS II + JGD2011 (vertical) height EPSG | 10164 | JGD2011 / Japan Plane Rectangular CS III + JGD2011 (vertical) height EPSG | 10165 | JGD2011 / Japan Plane Rectangular CS IV + JGD2011 (vertical) height EPSG | 10166 | JGD2011 / Japan Plane Rectangular CS V + JGD2011 (vertical) height EPSG | 10167 | JGD2011 / Japan Plane Rectangular CS VI + JGD2011 (vertical) height
postgis_srs_search — Повернути записи метаданих для проектованих систем координат, області використання яких повністю містять параметр меж.
setof record postgis_srs_search(geometry bounds, text auth_name=EPSG);
Повертає набір записів метаданих для проекційних систем координат, області використання яких повністю містять параметр меж. Кожен запис матиме auth_name, auth_srid, srname, srtext, proj4text та кути області використання, point_sw і point_ne.
Пошук шукає тільки проекційні системи координат і призначений для того, щоб користувачі могли вивчити можливі системи, які підходять для обсягу їхніх даних.
Доступність: 3.4.0
Версія Proj 6+
Пошук проекційних систем координат у Луїзіані.
SELECT auth_name, auth_srid, srname,point_sw AS point_sw,point_ne AS point_ne
FROM postgis_srs_search('SRID=4326;LINESTRING(-90 30,-91 31)')
WHERE auth_srid IN ('2801', '3452', '3457')
ORDER BY auth_name, auth_srid::integer
Проскануйте таблицю для максимального охоплення та знайдіть відповідні системи координат.
WITH ext AS ( SELECT ST_Extent(geom) AS geom, Max(ST_SRID(geom)) AS srid FROM foo ) SELECT auth_name, auth_srid, srname, point_sw AS point_sw, point_ne AS point_ne FROM ext CROSS JOIN postgis_srs_search(ST_SetSRID(ext.geom, ext.srid)) LIMIT 3;
Ці функції створюють геометричні об'єкти з різних текстових або бінарних форматів.
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 — Побудувати мультиполігон на основі довільної сукупності замкнутих лінійних відрізків у вигляді текстового представлення MultiLineString. Загальновідоме текстове представлення.
geometry ST_BdMPolyFromText(text WKT, integer srid);
Побудувати полігон, заданий довільною сукупністю замкнутих ліній, полігонів, багатолінійних ліній у вигляді добре відомого текстового представлення.
![]() | |
Видає помилку, якщо WKT не є MULTILINESTRING. Примусово виводить MULTIPOLYGON, навіть якщо результат насправді складається лише з одного POLYGON; використовуйте ST_BdPolyFromText, якщо ви впевнені, що в результаті операції буде отримано один POLYGON, або дивіться 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_GeogFromText — Повернути вказане географічне значення з представлення Well-Known Text або розширеного (WKT).
geography ST_GeogFromText(text EWKT);
Повертає географічний об'єкт із відомого тексту або розширеного відомого представлення. Якщо не вказано, використовується SRID 4326. Це псевдонім для ST_GeographyFromText. Точки завжди виражаються у форматі довготи та широти.
Add a WGS 84 geography point column to a table.
ALTER TABLE sometable ADD COLUMN geog geography(POINT, 4326);
Populate the geography column from longitude and latitude columns.
UPDATE sometable
SET geog = ST_GeogFromText('SRID=4326;POINT(' || lon || ' ' || lat || ')');Specify a geography point using EPSG:4267, NAD27.
SELECT ST_GeogFromText('SRID=4267;POINT(-77.0092 38.889588)');SRID=4267;POINT(-77.0092 38.889588)
ST_GeographyFromText — Повернути вказане географічне значення з представлення Well-Known Text або розширеного (WKT).
geography ST_GeographyFromText(text EWKT);
Повертає географічний об'єкт із загальновідомого текстового представлення. Якщо не вказано, використовується SRID 4326.
ST_GeomCollFromText — Створює колекцію Geometry з колекції WKT із заданим SRID. Якщо SRID не задано, за замовчуванням використовується 0.
geometry ST_GeomCollFromText(text WKT, integer srid);
geometry ST_GeomCollFromText(text WKT);
Створює колекцію Geometry з представлення Well-Known-Text (WKT) із заданим SRID. Якщо SRID не вказано, за замовчуванням використовується 0.
OGC SPEC 3.2.6.2 — опція SRID взята з набору вимог відповідності
Повертає null, якщо WKT не є GEOMETRYCOLLECTION
![]() | |
Якщо ви абсолютно впевнені, що всі ваші геометрії 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.
SELECT ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(1 2), LINESTRING(1 2,3 4))');ST_GeomFromEWKT — Повернути вказане значення ST_Geometry з розширеного представлення добре відомого тексту (EWKT).
geometry ST_GeomFromEWKT(text EWKT);
Створює об'єкт PostGIS ST_Geometry з представлення OGC Extended Well-Known text (EWKT).
![]() | |
Формат EWKT не є стандартом OGC, а специфічним форматом PostGIS, що включає ідентифікатор просторової системи координат (SRID). |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь та TIN.
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).
Create a LineString with SRID 4269.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM ST_GeomFromEWKT('SRID=4269;LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)') AS geom;geometry_type | srid ---------------+------ ST_LineString | 4269 (1 row)
Create a MultiLineString with SRID 4269.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM ST_GeomFromEWKT('SRID=4269;MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))') AS geom;geometry_type | srid ---------------------+------ ST_MultiLineString | 4269 (1 row)
Create a Point with SRID 4269.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM ST_GeomFromEWKT('SRID=4269;POINT(-71.064544 42.28787)') AS geom;geometry_type | srid ---------------+------ ST_Point | 4269 (1 row)
Create a Polygon with SRID 4269.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM 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))') AS geom;geometry_type | srid ---------------+------ ST_Polygon | 4269 (1 row)
Create a MultiPolygon with SRID 4269.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM 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)))') AS geom;geometry_type | srid -------------------+------ ST_MultiPolygon | 4269 (1 row)
Create a 3D CircularString without an SRID.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)') AS geom;geometry_type | srid --------------------+------ ST_CircularString | 0 (1 row)
Create a PolyhedralSurface without an SRID.
SELECT ST_GeometryType(geom) AS geometry_type, ST_SRID(geom) AS srid
FROM 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 geom;geometry_type | srid --------------------------+------ ST_PolyhedralSurface | 0 (1 row)
ST_GeomFromMARC21 — Приймає географічні дані MARC21/XML як вхідні дані та повертає геометричний об'єкт PostGIS.
geometry ST_GeomFromMARC21 ( text marcxml );
Ця функція створює геометрію PostGIS з запису MARC21/XML, який може містити POINT або POLYGON. У разі наявності декількох географічних даних в одному записі MARC21/XML, буде повернуто MULTIPOINT або MULTIPOLYGON. Якщо запис містить змішані типи геометрії, буде повернуто GEOMETRYCOLLECTION. Повертає NULL, якщо запис MARC21/XML не містить географічних даних (поле даних: 034).
Підтримувані версії LOC MARC21/XML:
Доступність: 3.3.0, вимагає libxml2 2.6+
![]() | |
Кодовані картографічні математичні дані MARC21/XML наразі не надають жодних засобів для опису просторової системи координат закодованих координат, тому ця функція завжди повертатиме геометрію з |
![]() | |
Повернуті геометрії |
Перетворення географічних даних MARC21/XML, що містять один POINT, закодований як hddd.dddddd
SELECT ST_GeomFromMARC21(
'<record xmlns="http://www.loc.gov/MARC21/slim">
<leader
>00000nz a2200000nc 4500</leader>
<controlfield tag="001"
>040277569</controlfield>
<datafield tag="034" ind1=" " ind2=" ">
<subfield code="d"
>W004.500000</subfield>
<subfield code="e"
>W004.500000</subfield>
<subfield code="f"
>N054.250000</subfield>
<subfield code="g"
>N054.250000</subfield>
</datafield>
</record
>'
);
POINT(-4.5 54.25)
Перетворення географічних даних MARC21/XML, що містять один POLYGON, закодований як hdddmmss
SELECT ST_GeomFromMARC21(
'<record xmlns="http://www.loc.gov/MARC21/slim">
<leader
>01062cem a2200241 a 4500</leader>
<controlfield tag="001"
> 84696781 </controlfield>
<datafield tag="034" ind1="1" ind2=" ">
<subfield code="a"
>a</subfield>
<subfield code="b"
>50000</subfield>
<subfield code="d"
>E0130600</subfield>
<subfield code="e"
>E0133100</subfield>
<subfield code="f"
>N0523900</subfield>
<subfield code="g"
>N0522300</subfield>
</datafield>
</record
>'
);
POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65))
Перетворення географічних даних MARC21/XML, що містять POLYGON та POINT:
SELECT ST_GeomFromMARC21(
'<record xmlns="http://www.loc.gov/MARC21/slim">
<datafield tag="034" ind1="1" ind2=" ">
<subfield code="a"
>a</subfield>
<subfield code="b"
>50000</subfield>
<subfield code="d"
>E0130600</subfield>
<subfield code="e"
>E0133100</subfield>
<subfield code="f"
>N0523900</subfield>
<subfield code="g"
>N0522300</subfield>
</datafield>
<datafield tag="034" ind1=" " ind2=" ">
<subfield code="d"
>W004.500000</subfield>
<subfield code="e"
>W004.500000</subfield>
<subfield code="f"
>N054.250000</subfield>
<subfield code="g"
>N054.250000</subfield>
</datafield>
</record
>'
);
GEOMETRYCOLLECTION(POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)), POINT(-4.5 54.25))
ST_GeometryFromText — Returns a geometry from Well-Known Text (WKT). Alias for ST_GeomFromText.
geometry ST_GeometryFromText(text WKT);
geometry ST_GeometryFromText(text WKT, integer srid);
This function is an alias for ST_GeomFromText and provides the same signatures.
Доступність: 1.2.2
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.4
ST_GeomFromText — Повертає вказане значення ST_Geometry з представлення Well-Known Text (WKT).
geometry ST_GeomFromText(text WKT);
geometry ST_GeomFromText(text WKT, integer srid);
Створює об'єкт PostGIS ST_Geometry на основі текстового представлення OGC Well-Known.
![]() | |
Існує два варіанти функції 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.4
This method supports Circular Strings and Curves.
![]() | |
Хоча ST_MakePoint не відповідає стандарту OGC, він працює швидше, ніж ST_GeomFromText і ST_PointFromText. Він також простіший у використанні для числових значень координат. ST_Point — це інший варіант, схожий за швидкістю на ST_MakePoint і сумісний з OGC, але підтримує тільки 2D-точки. |
Змінено: 2.0.0 У попередніх версіях PostGIS ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') було дозволено. Тепер це є некоректним у PostGIS 2.0.0 для кращої відповідності стандартам SQL/MM. Тепер це слід писати як ST_GeomFromText('GEOMETRYCOLLECTION EMPTY')
Create a LineString with SRID 0.
SELECT ST_SRID(ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)'));0
Create the same LineString with SRID 4269.
SELECT ST_SRID(ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)', 4269));4269
Create a MultiLineString.
SELECT ST_GeometryType(ST_GeomFromText('MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))'));ST_MultiLineString
Create a Point.
SELECT ST_GeometryType(ST_GeomFromText('POINT(-71.064544 42.28787)'));ST_Point
Create a Polygon.
SELECT ST_GeometryType(ST_GeomFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'));ST_Polygon
Create a MultiPolygon with SRID 4326.
SELECT ST_GeometryType(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));ST_MultiPolygon
Create a CircularString.
SELECT ST_GeometryType(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'));ST_CircularString
ST_LineFromText — Створює геометрію з представлення WKT із заданим SRID. Якщо SRID не задано, за замовчуванням використовується 0.
geometry ST_LineFromText(text WKT);
geometry ST_LineFromText(text WKT, integer srid);
Створює геометрію з WKT із заданим SRID. Якщо SRID не вказано, за замовчуванням використовується 0. Якщо переданий WKT не є LINESTRING, повертається null.
![]() | |
OGC SPEC 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
SELECT ST_LineFromText('LINESTRING(1 2,3 4)') AS aline,
ST_LineFromText('POINT(1 2)') IS NULL AS null_return;aline | null_return
------------------------------------
LINESTRING(1 2,3 4) | t
ST_MLineFromText — Повернути вказане значення ST_MultiLineString з представлення WKT.
geometry ST_MLineFromText(text WKT, integer srid);
geometry ST_MLineFromText(text WKT);
Створює геометрію з добре відомого тексту (WKT) із заданим SRID. Якщо SRID не задано, за замовчуванням використовується 0.
OGC SPEC 3.2.6.2 — опція SRID взята з набору вимог відповідності
Повертає null, якщо WKT не є MULTILINESTRING
![]() | |
Якщо ви абсолютно впевнені, що всі ваші геометрії 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
SELECT ST_MLineFromText('MULTILINESTRING((1 2,3 4),(4 5,6 7))');ST_MPointFromText — Створює геометрію з WKT із заданим SRID. Якщо SRID не вказано, за замовчуванням використовується 0.
geometry ST_MPointFromText(text WKT, integer srid);
geometry ST_MPointFromText(text WKT);
Створює геометрію з WKT із заданим SRID. Якщо SRID не вказано, за замовчуванням використовується значення 0.
OGC SPEC 3.2.6.2 — опція SRID взята з набору вимог відповідності
Повертає null, якщо WKT не є MULTIPOINT
![]() | |
Якщо ви абсолютно впевнені, що всі ваші геометрії 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
SELECT ST_MPointFromText('MULTIPOINT((1 2),(3 4))');
SELECT ST_MPointFromText('MULTIPOINT((-70.9590 42.1180),(-70.9611 42.1223))', 4326);ST_MPolyFromText — Створює геометрію MultiPolygon з WKT із заданим SRID. Якщо SRID не задано, за замовчуванням використовується 0.
geometry ST_MPolyFromText(text WKT, integer srid);
geometry ST_MPolyFromText(text WKT);
Створює багатокутник з WKT із заданим SRID. Якщо SRID не задано, за замовчуванням використовується 0.
OGC SPEC 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
Create a 3D MultiPolygon with an interior ring and SRID 0.
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)))'
);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)))
Create a MultiPolygon with SRID 4326.
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
);SRID=4326;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)))
ST_PointFromText — Створює точку Геометрія з WKT із заданим SRID. Якщо SRID не вказано, за замовчуванням використовується невідомий.
geometry ST_PointFromText(text WKT);
geometry ST_PointFromText(text WKT, integer srid);
Створює об'єкт точки PostGIS ST_Geometry з текстового представлення OGC Well-Known. Якщо SRID не вказано, за замовчуванням використовується невідоме значення (наразі 0). Якщо геометрія не є представленням точки WKT, повертає null. Якщо WKT повністю недійсне, видає помилку.
![]() | |
Існує 2 варіанти функції ST_PointFromText, перший не приймає SRID і повертає геометрію без визначеної системи просторових координат. Другий приймає ідентифікатор просторової координатної системи як другий аргумент і повертає 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
Create a point with the default SRID 0.
SELECT ST_PointFromText('POINT(-71.064544 42.28787)');POINT(-71.064544 42.28787)
Create a point with SRID 4326.
SELECT ST_PointFromText('POINT(-71.064544 42.28787)', 4326);SRID=4326;POINT(-71.064544 42.28787)
ST_PolygonFromText — Створює геометрію з WKT із заданим SRID. Якщо SRID не вказано, за замовчуванням використовується 0.
geometry ST_PolygonFromText(text WKT);
geometry ST_PolygonFromText(text WKT, integer srid);
Створює геометрію з WKT із заданим SRID. Якщо SRID не задано, за замовчуванням використовується 0. Повертає null, якщо WKT не є полігоном.
OGC SPEC 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
The result is returned as a native geometry. The documentation test runner compares that value directly with the readable EWKT shown below and uses the same geometry for the generated figure.
SELECT ST_PolygonFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))');POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))
SELECT ST_PolygonFromText('POINT(1 2)') IS NULL AS point_is_notpoly;t
ST_WKTToSQL — Returns a geometry from Well-Known Text (WKT). SQL/MM alias for ST_GeomFromText.
geometry ST_WKTToSQL(text WKT);
This function is the SQL/MM alias for ST_GeomFromText with no SRID argument.
This method implements the SQL/MM specification. SQL-MM 3: 5.1.34
LINESTRING from a WKB representation, optionally using a given SRID.LINESTRING from a WKB representation, optionally using a given SRID.ST_GeogFromWKB — Створює географічний екземпляр на основі добре відомого двійкового геометричного представлення (WKB) або розширеного добре відомого двійкового представлення (EWKB).
geography ST_GeogFromWKB(bytea wkb);
Функція ST_GeogFromWKB бере добре відоме двійкове представлення (WKB) геометрії або PostGIS Extended WKB і створює екземпляр відповідного типу географії. Ця функція виконує роль Geometry Factory в 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_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@');
LINESTRING(-113.98 39.198,-113.981 39.195)
ST_GeomFromEWKB — Повернути вказане значення ST_Geometry з розширеного добре відомого двійкового представлення (EWKB).
geometry ST_GeomFromEWKB(bytea EWKB);
Constructs a PostGIS geometry from an Extended Well-Known Binary (EWKB) representation.
![]() | |
Формат EWKB не є стандартом OGC, а специфічним форматом PostGIS, що включає ідентифікатор просторової системи координат (SRID) |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь та TIN.
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).
This example constructs LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932) in NAD83 longitude/latitude (SRID 4269) from its EWKB representation.
PostgreSQL escape string syntax (E'...') always interprets backslash escapes. Each backslash therefore has to be doubled so that the bytea input parser receives the octal escapes.
SELECT ST_GeomFromEWKB((
E'\\001\\002\\000\\000\\040\\255\\020\\000\\000\\003\\000\\000\\000\\344\\112\\075' ||
E'\\013\\102\\312\\121\\300\\156\\303\\050\\010\\036\\041\\105\\100\\047\\277\\105' ||
E'\\047\\113\\312\\121\\300\\366\\173\\142\\235\\052\\041\\105\\100\\225\\174\\354' ||
E'\\056\\120\\312\\121\\300\\160\\231\\323\\145\\061\\041\\105\\100'
)::bytea);0102000020AD10000003000000E44A3D0B42CA51C06EC328081E21454027BF45274BCA51C0F67B629D2A214540957CEC2E50CA51C07099D36531214540
With standard_conforming_strings enabled (the default), ordinary string literals preserve backslashes. The same EWKB can therefore be written with a single backslash before each octal byte value.
SELECT ST_GeomFromEWKB((
'\001\002\000\000\040\255\020\000\000\003\000\000\000\344\112\075' ||
'\013\102\312\121\300\156\303\050\010\036\041\105\100\047\277\105' ||
'\047\113\312\121\300\366\173\142\235\052\041\105\100\225\174\354' ||
'\056\120\312\121\300\160\231\323\145\061\041\105\100'
)::bytea);0102000020AD10000003000000E44A3D0B42CA51C06EC328081E21454027BF45274BCA51C0F67B629D2A214540957CEC2E50CA51C07099D36531214540
ST_GeomFromWKB — Створює екземпляр геометрії з добре відомого двійкового представлення геометрії (WKB) та опціонального SRID.
geometry ST_GeomFromWKB(bytea geom);
geometry ST_GeomFromWKB(bytea geom, integer srid);
Функція ST_GeomFromWKB приймає добре відоме двійкове представлення геометрії та ідентифікатор просторової системи відліку (SRID) і створює екземпляр відповідного типу геометрії. Ця функція виконує роль Geometry Factory в 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_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);
SRID=4326;LINESTRING(-113.98 39.198,-113.981 39.195)
SELECT ST_GeomFromWKB(ST_AsEWKB('POINT(2 5)'::geometry)
);POINT(2 5)
ST_LineFromWKB — Creates a LINESTRING from a WKB representation, optionally using a given SRID.
geometry ST_LineFromWKB(bytea WKB);
geometry ST_LineFromWKB(bytea WKB, integer srid);
The ST_LineFromWKB function takes a Well-Known Binary (WKB) representation of a geometry and an optional Spatial Reference System ID (SRID), and creates a LINESTRING geometry. It is a type-specific geometry factory in SQL.
If an SRID is not specified, it defaults to 0. NULL is returned if the input bytea does not represent a LINESTRING geometry.
![]() | |
OGC SPEC 3.2.6.2 — необов'язковий SRID взято з набору вимог відповідності. |
![]() | |
If you know all your geometries are |
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
SELECT ST_LineFromWKB(
ST_AsBinary(ST_GeomFromText('LINESTRING(1 2,3 4)'))
) AS aline,
ST_LineFromWKB(
ST_AsBinary(ST_GeomFromText('POINT(1 2)'))
) IS NULL AS null_return;aline | null_return
------------------------------------
LINESTRING(1 2,3 4) | t
ST_LinestringFromWKB — Creates a LINESTRING from a WKB representation, optionally using a given SRID.
geometry ST_LinestringFromWKB(bytea WKB);
geometry ST_LinestringFromWKB(bytea WKB, integer srid);
The ST_LinestringFromWKB function takes a Well-Known Binary (WKB) representation of a geometry and an optional Spatial Reference System ID (SRID), and creates a LINESTRING geometry. It is an alias for ST_LineFromWKB.
If an SRID is not specified, it defaults to 0. NULL is returned if the input bytea does not represent a LINESTRING geometry.
![]() | |
OGC SPEC 3.2.6.2 — необов'язковий SRID взято з набору вимог відповідності. |
![]() | |
If you know all your geometries are |
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
SELECT ST_LinestringFromWKB(
ST_AsBinary(ST_GeomFromText('LINESTRING(1 2,3 4)'))
) AS aline,
ST_LinestringFromWKB(
ST_AsBinary(ST_GeomFromText('POINT(1 2)'))
) IS NULL AS null_return;aline | null_return ------------------------------------ LINESTRING(1 2,3 4) | t
ST_PointFromWKB — Створює геометрію з WKB із заданим SRID
geometry ST_GeomFromWKB(bytea geom);
geometry ST_GeomFromWKB(bytea geom, integer srid);
Функція ST_PointFromWKB приймає добре відоме двійкове представлення геометрії та ідентифікатор просторової системи відліку (SRID) і створює екземпляр відповідного типу геометрії — у цьому випадку геометрії POINT. Ця функція виконує роль Geometry Factory в SQL.
Якщо SRID не вказано, за замовчуванням використовується 0. Якщо вхідний параметр bytea не представляє геометрію POINT, повертається NULL.
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.
SELECT ST_PointFromWKB(ST_AsEWKB('POINT(2 5)'::geometry));POINT(2 5)
SELECT ST_PointFromWKB(ST_AsEWKB('LINESTRING(2 5,2 6)'::geometry));null
ST_WKBToSQL — Returns a geometry from Well-Known Binary (WKB). SQL/MM alias for ST_GeomFromWKB without an SRID argument.
geometry ST_WKBToSQL(bytea WKB);
This function is the SQL/MM alias for ST_GeomFromWKB with no SRID argument.
This method implements the SQL/MM specification. SQL-MM 3: 5.1.36
ST_Box2dFromGeoHash — Повернути BOX2D із рядка GeoHash.
box2d ST_Box2dFromGeoHash(text geohash, integer precision=full_precision_of_geohash);
Повернути BOX2D із рядка GeoHash.
Якщо не вказано precision, ST_Box2dFromGeoHash повертає BOX2D на основі повної точності вхідного рядка GeoHash.
Якщо вказано precision, ST_Box2dFromGeoHash використає стільки символів з GeoHash, щоб створити BOX2D. Менші значення точності дають більші BOX2D, а більші значення збільшують точність.
Доступність: 2.1.0
SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0');BOX(-115.172816 36.114646,-115.172816 36.114646)
SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 0);BOX(-180 -90,180 90)
SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10);BOX(-115.17282128334 36.1146408319473,-115.172810554504 36.1146461963654)
ST_GeomFromGeoHash — Повернути геометрію з рядка GeoHash.
geometry ST_GeomFromGeoHash(text geohash, integer precision=full_precision_of_geohash);
Повернути геометрію з рядка GeoHash. Геометрія буде полігоном, що представляє межі GeoHash.
Якщо не вказано precision, ST_GeomFromGeoHash повертає полігон на основі повної точності вхідного рядка GeoHash.
Якщо вказано precision, ST_GeomFromGeoHash використає стільки символів з GeoHash, щоб створити полігон.
Доступність: 2.1.0
The cells are returned together so their relative sizes remain visible in a shared coordinate frame.
SELECT ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4) AS "precision 4", ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 5) AS "precision 5", ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 6) AS "precision 6";ST_GeomFromGML — Приймає в якості вхідних даних GML-представлення геометрії та видає об'єкт геометрії PostGIS
geometry ST_GeomFromGML(text geomgml);
geometry ST_GeomFromGML(text geomgml, integer srid);
Створює об'єкт PostGIS ST_Geometry з представлення OGC GML.
ST_GeomFromGML працює тільки для фрагментів геометрії GML. При спробі використання на всьому документі GML видає помилку.
Підтримувані версії OGC GML:
GML 3.2.1 Namespace
GML 3.1.1 Simple Features profile SF-2 (з сумісністю з GML 3.1.0 та 3.0.0)
GML 2.1.2
Стандарти OGC GML, див.: http://www.opengeospatial.org/standards/gml:
Доступність: 1.5, вимагає libxml2 1.6+
Покращено: 2.0.0 додано підтримку багатогранних поверхонь та TIN.
Покращено: 2.0.0 додано опціональний параметр srid за замовчуванням.
Enhanced: 3.7.0 support for GML ArcString, curved Ring, and CurvePolygon geometries was introduced.
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 в одній MultiGeometry). Оскільки геометрії PostGIS цього не дозволяють, ST_GeomFromGML перетворює всю геометрію в 2D, якщо знаходить відсутній розмір Z.
GML підтримує змішані SRS всередині одного MultiGeometry. Оскільки геометрії PostGIS цього не роблять, ST_GeomFromGML у цьому випадку перепроектує всі підгеометрії до кореневого вузла SRS. Якщо для кореневого вузла GML недоступний атрибут srsName, функція видає помилку.
Функція ST_GeomFromGML не є педантичною щодо явного простору імен GML. Ви можете не згадувати його явно для загального використання. Але він необхідний, якщо ви хочете використовувати функцію XLink всередині GML.
A single geometry with srsName.
SELECT ST_AsEWKT(ST_GeomFromGML($$
<gml:LineString xmlns:gml="http://www.opengis.net/gml"
srsName="EPSG:4269">
<gml:coordinates>
-71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932
</gml:coordinates>
</gml:LineString>
$$));
SRID=4269;LINESTRING(-71.16028 42.258729,-71.160837 42.259112,-71.161143 42.25932)
XLink usage.
SELECT ST_AsEWKT(ST_GeomFromGML($$
<gml:LineString xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
srsName="EPSG:4269">
<gml:pointProperty>
<gml:Point gml:id="p1"
><gml:pos
>-71.16028 42.258729</gml:pos
></gml:Point>
</gml:pointProperty>
<gml:pos
>-71.160837 42.259112</gml:pos>
<gml:pos
>-71.161143 42.258729</gml:pos>
<gml:pointProperty>
<gml:Point xlink:type="simple" xlink:href="#p1"/>
</gml:pointProperty>
</gml:LineString>
$$));
SRID=4269;LINESTRING(-71.16028 42.258729,-71.160837 42.259112,-71.161143 42.258729,-71.16028 42.258729)
Polyhedral Surface.
SELECT ST_AsEWKT(ST_GeomFromGML('
<gml:PolyhedralSurface xmlns:gml="http://www.opengis.net/gml">
<gml:polygonPatches>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing
><gml:posList srsDimension="3"
>0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList
></gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing
><gml:posList srsDimension="3"
>0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList
></gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing
><gml:posList srsDimension="3"
>0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList
></gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing
><gml:posList srsDimension="3"
>1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList
></gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing
><gml:posList srsDimension="3"
>0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList
></gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing
><gml:posList srsDimension="3"
>0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList
></gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
</gml:polygonPatches>
</gml:PolyhedralSurface
>'));
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);
Створює об'єкт геометрії PostGIS з представлення GeoJSON.
ST_GeomFromGeoJSON працює тільки для фрагментів JSON Geometry. При спробі використання на всьому документі JSON видається помилка.
Покращено: 3.0.0, якщо не вказано інше, геометрія за замовчуванням аналізується як SRID=4326.
Покращено: версія 2.5.0 тепер підтримує json та jsonb як вхідні дані.
Доступність: 2.0.0 вимагає - JSON-C >= 0.9
![]() | |
Якщо JSON-C не ввімкнено, замість виводу ви отримаєте повідомлення про помилку. Щоб увімкнути JSON-C, запустіть configure --with-jsondir=/path/to/json-c. Детальніше див. Розділ 2.2.3, «Конфігурація збірки». |
This function supports 3d and will not drop the z-index.
SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}') AS wkt;POINT(-48.23456 20.12345)
This example creates a 3D LineString.
SELECT ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[1,2,3],[4,5,6],[7,8,9]]}') AS wkt;LINESTRING Z (1 2 3,4 5 6,7 8 9)
ST_AsText, ST_AsGeoJSON, Розділ 2.2.3, «Конфігурація збірки»
ST_GeomFromKML — Приймає в якості вхідних даних KML-представлення геометрії та видає об'єкт геометрії PostGIS
geometry ST_GeomFromKML(text geomkml);
Constructs a PostGIS geometry from an OGC KML representation.
ST_GeomFromKML працює тільки для фрагментів геометрії KML. При спробі використання на всьому документі KML видається помилка.
Підтримувані версії OGC KML:
Простір імен KML 2.2.0
Стандарти OGC KML, див.: http://www.opengeospatial.org/standards/kml:
Доступність: 1.5, вимагає libxml2 2.6+
This function supports 3d and will not drop the z-index.
![]() | |
ST_GeomFromKML does not support SQL/MM curve geometries. |
A single LineString geometry.
SELECT ST_AsEWKT(ST_GeomFromKML($$
<LineString>
<coordinates
>-71.1663, 42.2614
-71.1667, 42.2616</coordinates>
</LineString>
$$));
SRID=4326;LINESTRING(-71.1663 42.2614,-71.1667 42.2616)
ST_GeomFromTWKB — Створює екземпляр геометрії з представлення геометрії TWKB ("Tiny Well-Known Binary").
geometry ST_GeomFromTWKB(bytea twkb);
Функція ST_GeomFromTWKB приймає геометричне представлення TWKB ("Tiny Well-Known Binary") (WKB) і створює екземпляр відповідного типу геометрії.
SELECT ST_GeomFromTWKB(ST_AsTWKB('LINESTRING(126 34,127 35)'::geometry));LINESTRING(126 34, 127 35)
SELECT ST_GeomFromTWKB(E'\\x620002f7f40dbce4040105');
LINESTRING(-113.98 39.198,-113.981 39.195)
ST_GMLToSQL — Returns a geometry from GML. Alias for ST_GeomFromGML.
geometry ST_GMLToSQL(text geomgml);
geometry ST_GMLToSQL(text geomgml, integer srid);
This function is an alias for ST_GeomFromGML and provides the same signatures.
This method implements the SQL/MM specification. SQL-MM 3: 5.1.50.
Доступність: 1.5, вимагає libxml2 1.6+
Покращено: 2.0.0 додано підтримку багатогранних поверхонь та TIN.
Покращено: 2.0.0 додано опціональний параметр srid за замовчуванням.
Enhanced: 3.7.0 support for GML ArcString, curved Ring, and CurvePolygon geometries was introduced.
ST_LineFromEncodedPolyline — Створює LineString з закодованої полілінії.
geometry ST_LineFromEncodedPolyline(text polyline, integer precision=5);
Створює об'єкт LineString із кодованої полілінії.
Опціональний параметр precision визначає, скільки десяткових знаків буде збережено в кодованій полілінії. Значення повинно бути однаковим при кодуванні та декодуванні, інакше координати будуть неправильними.
Див. http://developers.google.com/maps/documentation/utilities/polylinealgorithm
Доступність: 2.2.0
This example creates a LineString from a polyline.
SELECT ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@');SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)
This example selects a different precision than the one used for polyline encoding.
SELECT ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@', 6);SRID=4326;LINESTRING(-12.02 3.85,-12.095 4.07,-12.6453 4.3252)
ST_PointFromGeoHash — Повернути точку з рядка GeoHash.
point ST_PointFromGeoHash(text geohash, integer precision=full_precision_of_geohash);
Повернути точку з рядка GeoHash. Точка представляє центральну точку GeoHash.
Якщо не вказано precision, ST_PointFromGeoHash повертає точку на основі повної точності вхідного рядка GeoHash.
Якщо вказано precision, ST_PointFromGeoHash використає стільки символів з GeoHash, скільки потрібно для створення точки.
Доступність: 2.1.0
SELECT ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0');POINT(-115.172816 36.114646)
SELECT ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4);POINT(-115.13671875 36.123046875)
SELECT ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10);POINT(-115.172815918922 36.1146435141563)
ST_FromFlatGeobufToTable — Створює таблицю на основі структури даних FlatGeobuf.
void ST_FromFlatGeobufToTable(text schemaname, text tablename, bytea FlatGeobuf input data);
Створює таблицю на основі структури даних FlatGeobuf. (http://flatgeobuf.org).
schema Ім'я схеми.
table Ім'я таблиці.
data Введіть дані FlatGeobuf.
Доступність: 3.2.0
ST_FromFlatGeobuf — Зчитує дані FlatGeobuf.
setof anyelement ST_FromFlatGeobuf(anyelement Table reference, bytea FlatGeobuf input data);
Читає дані FlatGeobuf (http://flatgeobuf.org). ПРИМІТКА: PostgreSQL bytea не може перевищувати 1 ГБ.
tabletype посилання на тип таблиці.
data вхідні дані FlatGeobuf.
Доступність: 3.2.0
Ці функції перетворюють геометричні об'єкти в різні текстові або двійкові формати.
ST_AsEWKT — Повернути представлення геометрії у вигляді добре відомого тексту (WKT) з метаданими SRID.
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. Опціональний аргумент maxdecimaldigits може використовуватися для зменшення максимальної кількості десяткових цифр після плаваючої коми, що використовуються у вихідних даних (за замовчуванням — 15).
Для виконання зворотного перетворення представлення EWKT у геометрію PostGIS використовуйте ST_GeomFromEWKT.
![]() | |
Використання параметра |
![]() | |
Специфікація WKT не включає SRID. Щоб отримати формат OGC WKT, використовуйте ST_AsText. |
![]() | |
Формат WKT не зберігає точність, тому щоб запобігти обрізанню плаваючої точки, для передачі використовуйте формат ST_AsBinaryабо ST_AsEWKB. |
Покращено: 3.1.0 підтримка опціонального параметра точності.
Покращено: 2.0.0 додано підтримку географії, багатогранних поверхонь, трикутників і TIN.
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('0103000020e61000000100000005000000000000000000000000000000000000000000000000000000000000000000f03f000000000000f03f000000000000f03f000000000000f03f000000000000000000000000000000000000000000000000'::geometry);SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0))
SELECT ST_AsEWKT('0108000080030000000000000060E30A4100000000785C0241000000000000F03F0000000018E20A4100000000485F024100000000000000400000000018E20A4100000000305C02410000000000000840');CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)
ST_AsText — Повернути представлення геометрії/географії у вигляді добре відомого тексту (WKT) без метаданих SRID.
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 Well-Known Text (WKT). Опціональний аргумент maxdecimaldigits може використовуватися для обмеження кількості цифр після десяткової крапки у вихідних координатах (за замовчуванням — 15).
Для виконання зворотного перетворення представлення WKT в геометрію PostGIS використовуйте ST_GeomFromText.
![]() | |
Стандартне представлення OGC WKT не включає SRID. Щоб включити SRID як частину вихідного представлення, використовуйте нестандартну функцію PostGIS ST_AsEWKT |
![]() | |
Текстове представлення чисел у WKT може не зберігати повну точність з плаваючою комою. Щоб забезпечити повну точність зберігання або передачі даних, найкраще використовувати формат Well-Known Binary (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('01030000000100000005000000000000000000000000000000000000000000000000000000000000000000f03f000000000000f03f000000000000f03f000000000000f03f000000000000000000000000000000000000000000000000');POLYGON((0 0,0 1,1 1,1 0,0 0))
Повна точність виводу є стандартною настройкою.
SELECT ST_AsText('POINT(111.1111111 1.1111111)'::geometry);POINT(111.1111111 1.1111111)
Аргумент maxdecimaldigits можна використовувати для обмеження точності виводу.
SELECT ST_AsText('POINT(111.1111111 1.1111111)'::geometry, 2);POINT(111.11 1.11)
ST_AsBinary — Повернути представлення геометрії/географії у форматі OGC/ISO Well-Known Binary (WKB) без метаданих SRID.
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 Well-Known Binary (WKB). Перший варіант функції за замовчуванням використовує кодування, що відповідає ендіану сервера. Другий варіант функції приймає текстовий аргумент, що визначає кодування ендіана: 'NDR' для little-endian або 'XDR' для big-endian. Введення невідомих аргументів призведе до виведення little-endian.
Формат WKB корисний для читання геометричних даних з бази даних та збереження повної числової точності. Це дозволяє уникнути округлення точності, яке може відбуватися у текстових форматах, таких як WKT.
Для виконання зворотного перетворення WKB в геометрію PostGIS використовуйте ST_GeomFromWKB.
![]() | |
Формат OGC/ISO WKB не включає SRID. Щоб отримати формат EWKB, який включає SRID, використовуйте ST_AsEWKB |
![]() | |
PostgreSQL за замовчуванням виводить значення |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Покращено: 2.0.0 додано підтримку вищих розмірностей координат.
Покращено: 2.0.0 додано підтримку вказання ендіанності для географічних даних.
Доступність: 1.5.0 додано підтримку географії.
Changed: 2.0.0 Inputs to this function can not be unknown -- must be geometry. Constructs such as ST_AsBinary('POINT(1 2)') are no longer valid and you will get an n ST_AsBinary(unknown) is not unique error. Code like that needs to be changed to ST_AsBinary('POINT(1 2)'::geometry);. If that is not possible, then install 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));\x01030000000100000005000000000000000000000000000000000000000000000000000000000000 000000f03f000000000000f03f000000000000f03f000000000000f03f0000000000000000000000 00000000000000000000000000
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326), 'XDR');\x000000000300000001000000050000000000000000000000000000000000000000000000003ff000 00000000003ff00000000000003ff00000000000003ff00000000000000000000000000000000000 00000000000000000000000000
ST_AsEWKB — Повернути розширене добре відоме двійкове (EWKB) представлення геометрії з метаданими SRID.
bytea ST_AsEWKB(geometry g1);
bytea ST_AsEWKB(geometry g1, text NDR_or_XDR);
Повертає представлення геометрії у форматі Extended Well-Known Binary (EWKB) з метаданими SRID. Перший варіант функції за замовчуванням використовує кодування, що відповідає порядку байтів на сервері. Другий варіант функції приймає текстовий аргумент, що визначає кодування ендіана: 'NDR' для little-endian або 'XDR' для big-endian. Введення невідомих аргументів призведе до виведення little-endian.
Формат WKB корисний для читання геометричних даних з бази даних та збереження повної числової точності. Це дозволяє уникнути округлення точності, яке може відбуватися у текстових форматах, таких як WKT.
Для виконання зворотного перетворення EWKB в геометрію PostGIS використовуйте ST_GeomFromEWKB.
![]() | |
Щоб отримати формат OGC/ISO WKB, використовуйте ST_AsBinary. Зверніть увагу, що формат OGC/ISO WKB не включає SRID. |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
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));\x0103000020e610000001000000050000000000000000000000000000000000000000000000000000 00000000000000f03f000000000000f03f000000000000f03f000000000000f03f00000000000000 0000000000000000000000000000000000
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326), 'XDR');\x0020000003000010e600000001000000050000000000000000000000000000000000000000000000 003ff00000000000003ff00000000000003ff00000000000003ff000000000000000000000000000 0000000000000000000000000000000000
ST_AsHEXEWKB — Повертає геометрію у форматі HEXEWKB (у вигляді тексту) з використанням кодування little-endian (NDR) або big-endian (XDR).
text ST_AsHEXEWKB(geometry g1, text NDRorXDR);
text ST_AsHEXEWKB(geometry g1);
Повертає геометрію у форматі HEXEWKB (у вигляді тексту) з використанням кодування little-endian (NDR) або big-endian (XDR). Якщо кодування не вказано, використовується 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));0103000020E6100000010000000500 00000000000000000000000000000000 00000000000000000000000000000000F03F 000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000
Which gives the same answer as:
SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326)::text;ST_AsEncodedPolyline — Повертає закодовану полілінію з геометрії LineString.
text ST_AsEncodedPolyline(geometry geom, integer precision=5);
Returns the geometry in the Encoded Polyline Algorithm Format. The format stores latitude and longitude deltas as integers after multiplying coordinates by 10 raised to the requested precision.
The informal names polyline5 and polyline6 refer to the same encoding with precision 5 and 6. The precision must match when encoding and decoding; otherwise the coordinates are scaled incorrectly.
The input geometry must use SRID 4326, with longitude as X and latitude as Y. Use ST_Transform to transform geometries in other coordinate systems before encoding.
The OSRM API returns precision 5 for geometries=polyline and precision 6 for geometries=polyline6. Decode the resulting route.geometry with ST_LineFromEncodedPolyline using the matching precision.
Доступність: 2.2.0
Encode the same WGS 84 LineString using precision 5 and 6.
WITH route AS (
SELECT ST_GeomFromEWKT(
'SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)'
) AS geom
)
SELECT ST_AsEncodedPolyline(geom, 5) AS polyline5,
ST_AsEncodedPolyline(geom, 6) AS polyline6
FROM route;
polyline5 | polyline6
-----------------------------+----------------------------------
_p~iF~ps|U_ulLnnqC_mqNvxq`@ | _izlhA~rlgdF_{geC~ywl@_kwzCn`{nIDecode an OSRM route.geometry returned with geometries=polyline6.
SELECT ST_AsEWKT(ST_LineFromEncodedPolyline(
'_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI',
6
)) AS route;
SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)
The Google Maps JavaScript Geometry library decodes precision-5 strings. This browser example assumes that map is an initialized Google map.
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"
></script>
<script>
const encodedPath = "_p~iF~ps|U_ulLnnqC_mqNvxq`@";
const flightPath = new google.maps.Polyline({
path: google.maps.geometry.encoding.decodePath(encodedPath),
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 bytea не може перевищувати 1 ГБ.
row дані рядка, що містять принаймні стовпець геометрії.
index вмикає/вимикає створення просторового індексу. За замовчуванням встановлено значення false.
geom_name — це назва стовпця геометрії в даних рядка. Якщо NULL, за замовчуванням буде використано перший знайдений стовпець геометрії.
Доступність: 3.2.0
ST_AsGeobuf — Повернути представлення Geobuf набору рядків.
bytea ST_AsGeobuf(anyelement set row);
bytea ST_AsGeobuf(anyelement row, text geom_name);
Повертає представлення Geobuf (https://github.com/mapbox/geobuf) набору рядків, що відповідають FeatureCollection. Кожна вхідна геометрія аналізується для визначення максимальної точності для оптимального зберігання. Зверніть увагу, що Geobuf у його поточній формі не може бути переданий потоком, тому повний вихід буде зібраний у пам'яті.
row дані рядка, що містять принаймні стовпець геометрії.
geom_name — це назва стовпця геометрії в даних рядка. Якщо NULL, за замовчуванням буде використано перший знайдений стовпець геометрії.
Доступність: 2.4.0
SELECT encode(ST_AsGeobuf(q, 'geom'), 'base64') FROM (SELECT 'POLYGON((0 0,0 1,1 1,1 0,0 0))'::geometry AS geom) AS q;
GAAiEAoOCgwIBBoIAAAAAgIAAAE=
ST_AsGeoJSON — Повернути геометрію або об'єкт у форматі GeoJSON.
text ST_AsGeoJSON(record feature, text geom_column="", integer maxdecimaldigits=9, boolean pretty_bool=false, text id_column='');
text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=9, integer options=8);
text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=9, integer options=0);
Повертає геометрію як об'єкт GeoJSON "geometry" або рядок як об'єкт GeoJSON "feature".
Отримані геометричні та об'єктні представлення GeoJSON відповідають специфікаціям GeoJSON RFC 7946, за винятком випадків, коли розібрані геометрії посилаються на CRS, відмінну від WGS84 довготи та широти (EPSG:4326, urn:ogc:def:crs:OGC::CRS84); у такому випадку до об'єкта геометрії GeoJSON за замовчуванням буде додано короткий ідентифікатор CRS SRID. Підтримуються як 2D, так і 3D геометрії. GeoJSON підтримує тільки типи геометрії SFS 1.1 (наприклад, не підтримуються криві).
Параметр geom_column використовується для розрізнення декількох стовпців геометрії. Якщо його опустити, буде визначено перший стовпець геометрії в записі. І навпаки, передача цього параметра збереже пошуки типів стовпців.
Аргумент maxdecimaldigits можна використовувати для зменшення максимальної кількості десяткових знаків, що використовуються у вихідних даних (за замовчуванням — 9). Якщо ви використовуєте EPSG:4326 і виводите геометрію тільки для відображення, для багатьох карт хорошим вибором може бути maxdecimaldigits=6.
![]() | |
Використання параметра |
Аргумент options можна використовувати для додавання BBOX або CRS у вихідні дані GeoJSON:
0: означає відсутність опції
1: GeoJSON BBOX
2: GeoJSON коротка CRS (наприклад, EPSG:4326)
4: GeoJSON Long CRS (наприклад, urn:ogc:def:crs:EPSG::4326)
8: GeoJSON Короткий CRS, якщо не EPSG:4326 (за замовчуванням)
Параметр id_column використовується для встановлення елемента "id" повернутих об'єктів GeoJSON. Відповідно до GeoJSON RFC, це ПОВИННО використовуватися, коли елемент має загальновживаний ідентифікатор, такий як первинний ключ. Якщо це не вказано, створені елементи не отримають елемент "id", а всі стовпці, крім геометрії, включаючи будь-які потенційні ключі, просто потраплять в елемент "properties" елемента.
Якщо вхідний запис містить дублікати імен стовпців, об'єкт «властивості» буде містити повторювані ключі. У цьому випадку функція ST_AsGeoJSON видає попередження, оскільки PostgreSQL jsonb зберігає тільки останнє значення для дублікатів ключів.
The GeoJSON specification states that polygons are oriented using the Right-Hand Rule, and some clients require this orientation. This can be ensured by using ST_ForcePolygonCCW. The specification also requires that geometry be in the WGS84 coordinate system (SRID = 4326). If necessary geometry can be projected into WGS84 using ST_Transform: ST_Transform(geom, 4326 ).
GeoJSON можна протестувати та переглянути онлайн за адресами geojson.io та geojsonlint.com. Він широко підтримується веб-картографічними фреймворками:
Доступність: 1.3.4
Доступність: 1.5.0 додано підтримку географії.
Змінено: 2.0.0 підтримка аргументів за замовчуванням та іменованих аргументів.
Змінено: 3.0.0 підтримка записів як вхідних даних
Змінено: 3.0.0 виведення SRID, якщо не EPSG:4326.
Змінено: 3.5.0 Дозволено вказувати стовпець, що містить feature id
Змінено: 3.7.0 додано попередження про дублювання ключів
This function supports 3d and will not drop the z-index.
Створити колекцію об'єктів:
SELECT json_build_object(
'type', 'FeatureCollection',
'features', json_agg(ST_AsGeoJSON(t.*, id_column =
> 'id')::json)
)
FROM ( VALUES (1, 'one', 'POINT(1 1)'::geometry),
(2, 'two', 'POINT(2 2)'),
(3, 'three', 'POINT(3 3)')
) as t(id, name, geom);{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[2,2]}, "id": 2, "properties": {"name": "two"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[3,3]}, "id": 3, "properties": {"name": "three"}}]}Створити Feature:
SELECT ST_AsGeoJSON(t.*, id_column = > 'id') FROM (VALUES (1, 'one', 'POINT(1 1)'::geometry)) AS t(id, name, geom);
{"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}Не забудьте перетворити дані в довготу WGS84, широту, щоб вони відповідали специфікації GeoJSON:
SELECT ST_AsGeoJSON(ST_Transform(geom, 4326)) FROM fe_edges LIMIT 1;
{"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000],
[-89.734955999999997,31.492237999999997]]]}
Підтримуються 3D-геометрії:
SELECT ST_AsGeoJSON('LINESTRING(1 2 3,4 5 6)');{"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}Аргумент Options можна використовувати для додавання BBOX і CRS у вихідні дані GeoJSON:
SELECT ST_AsGeoJSON(ST_SetSRID('POINT(1 1)'::geometry, 4326), 9, 4|1);{"type":"Point","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4326"}},"bbox":[1.000000000,1.000000000,1.000000000,1.000000000],"coordinates":[1,1]}
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. Аргумент maxdecimaldigits можна використовувати для зменшення максимальної кількості десяткових знаків, що використовуються у вихідних даних (за замовчуванням 15).
![]() | |
Використання параметра |
GML 2 відноситься до версії 2.1.2, GML 3 – до версії 3.1.1
Аргумент "options" є бітовим полем. Він може використовуватися для визначення типу виводу CRS у виводі GML та для оголошення даних як lat/lon:
0: Коротка CRS GML (наприклад, EPSG:4326), значення за замовчуванням
1: GML Long CRS (наприклад, urn:ogc:def:crs:EPSG::4326)
2: Тільки для GML 3, видаліть атрибут srsDimension з вихідних даних.
4: Тільки для GML 3 використовуйте тег <LineString> замість <Curve> для ліній.
16: Заявити, що дані є широтою/довготою (наприклад, srid=4326). За замовчуванням вважається, що дані є планарними. Ця опція корисна тільки для виводу GML 3.1.1, пов'язаного з порядком осей. Тому, якщо ви її встановите, координати будуть поміняні місцями, і порядок буде широта-довгота замість довгота-широта, як у базі даних.
32: Вивести прямокутник геометрії (контур).
Аргумент "namespace prefix" може використовуватися для вказання власного префікса простору імен або відсутності префікса (якщо поле порожнє). Якщо префікс "gml" нульовий або пропущений, використовується префікс "gml"
Доступність: 1.3.2
Доступність: 1.5.0 додано підтримку географії.
Покращено: додано підтримку префікса 2.0.0. Додано опцію 4 для GML3, що дозволяє використовувати тег LineString замість Curve для ліній. Додано підтримку GML3 для багатогранних поверхонь і TINS. Додано опцію 32 для виведення прямокутника.
Змінено: 2.0.0 використання аргументів із стандартними іменами
Покращено: 2.1.0 Додано підтримку ідентифікаторів для GML 3.
![]() | |
Тільки версія 3+ ST_AsGML підтримує багатогранні поверхні та TINS. |
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 17.2
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).
Version 2.
SELECT ST_AsGML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326));<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 >
Version 3.
Flip coordinates and output extended EPSG (16 | 1)
SELECT ST_AsGML(3, ST_GeomFromText('POINT(5.234234233242 6.34534534534)', 4326), 5, 17);<gml:Point srsName="urn:ogc:def:crs:EPSG::4326" ><gml:pos srsDimension="2" >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);<gml:Envelope srsName="EPSG:4326" srsDimension="2" ><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);<gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326" srsDimension="2" ><gml:lowerCorner >2 1</gml:lowerCorner ><gml:upperCorner >20 10</gml:upperCorner ></gml:Envelope >
This example uses a PolyhedralSurface.
SELECT ST_AsGML( 3, '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);
<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, простір імен за замовчуванням — без префікса.
![]() | |
Використання параметра |
Доступність: 1.2.2 — пізніші варіанти, що містять параметр версії, з'явилися в 1.3.2
Покращено: 2.0.0 - Додано префікс простору імен, використання аргументів за замовчуванням та іменованих аргументів
Змінено: 3.0.0 - Вилучено підпис варіанту "versioned"
![]() | |
Потрібно, щоб PostGIS було скомпільовано з підтримкою Proj. Використовуйте PostGIS_Full_Version, щоб підтвердити, що підтримка proj скомпільована. |
![]() | |
Вихідні дані 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));<Polygon ><outerBoundaryIs ><LinearRing ><coordinates >0,0 0,1 1,1 1,0 0,0</coordinates ></LinearRing ></outerBoundaryIs ></Polygon >
This example outputs a 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)'));2°19'29.928"S 3°14'3.243"W
Надання формату (такого самого, як за замовчуванням).
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"C'));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'));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"'));-2°19'29.928" -3°14'3.243"
Десятичні градуси.
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D.DDDD degrees C'));2.3250 degrees S 3.2342 degrees W
Надмірно великі значення нормалізуються.
SELECT (ST_AsLatLonText('POINT (-302.2342342 -792.32498)'));72°19'29.928"S 57°45'56.757"E
ST_AsMARC21 — Повертає геометрію у вигляді запису MARC21/XML із полем географічних даних (034).
text ST_AsMARC21 ( geometry geom , text format='hdddmmss' );
Ця функція повертає запис MARC21/XML з Кодованими картографічними математичними даними, що представляють обмежувальну рамку заданої геометрії. Параметр format дозволяє кодувати координати в підполях $d,$e,$f та $g у всіх форматах, що підтримуються стандартом MARC21/XML. Допустимі формати:
основний напрямок, градуси, хвилини та секунди (за замовчуванням): hdddmmss
десятиградусні градуси з основним напрямком: hddd.dddddd
десятиградусні градуси без вказівки сторони світу: ddd.dddddd
десятикратні хвилини з основним напрямком: hdddmm.mmmm
десятинні хвилини без вказівки напрямку: dddmm.mmmm
десятинні секунди з основним напрямком: hdddmmss.sss
Знак десяткового числа може бути також комою, наприклад hdddmm,mmmm.
Точність десяткових форматів може бути обмежена кількістю символів після десяткового знака, наприклад hdddmm.mm для десяткових хвилин з точністю до двох десяткових знаків.
Ця функція ігнорує розміри Z і M.
Підтримувані версії LOC MARC21/XML:
Доступність: 3.3.0
![]() | |
Ця функція не підтримує геометрії, що не є lon/lat, оскільки вони не підтримуються стандартом MARC21/XML (Coded Cartographic Mathematical Data). |
![]() | |
Стандарт MARC21/XML не передбачає жодних засобів для анотування просторової системи координат для кодованих картографічних математичних даних, що означає, що ця інформація буде втрачена після перетворення у формат MARC21/XML. |
Перетворення POINT у формат MARC21/XML у вигляді hdddmmss (за замовчуванням)
SELECT ST_AsMARC21('SRID=4326;POINT(-4.504289 54.253312)'::geometry);
st_asmarc21
-------------------------------------------------
<record xmlns="http://www.loc.gov/MARC21/slim">
<datafield tag="034" ind1="1" ind2=" ">
<subfield code="a"
>a</subfield>
<subfield code="d"
>W0043015</subfield>
<subfield code="e"
>W0043015</subfield>
<subfield code="f"
>N0541512</subfield>
<subfield code="g"
>N0541512</subfield>
</datafield>
</record>
Перетворення POLYGON у формат MARC21/XML з десятковими градусами
SELECT ST_AsMARC21('SRID=4326;POLYGON((-4.5792388916015625 54.18172660239091,-4.56756591796875 54.196993557130355,-4.546623229980469 54.18313300502024,-4.5792388916015625 54.18172660239091))'::geometry,'hddd.dddd');
<record xmlns="http://www.loc.gov/MARC21/slim">
<datafield tag="034" ind1="1" ind2=" ">
<subfield code="a"
>a</subfield>
<subfield code="d"
>W004.5792</subfield>
<subfield code="e"
>W004.5466</subfield>
<subfield code="f"
>N054.1970</subfield>
<subfield code="g"
>N054.1817</subfield>
</datafield>
</record>
Перетворення GEOMETRYCOLLECTION у формат MARC21/XML з десятковими хвилинами. Порядок геометрій у вихідних даних MARC21/XML відповідає їхньому порядку в колекції.
SELECT ST_AsMARC21('SRID=4326;GEOMETRYCOLLECTION(POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)),POINT(-4.5 54.25))'::geometry,'hdddmm.mmmm');
st_asmarc21
-------------------------------------------------
<record xmlns="http://www.loc.gov/MARC21/slim">
<datafield tag="034" ind1="1" ind2=" ">
<subfield code="a"
>a</subfield>
<subfield code="d"
>E01307.0000</subfield>
<subfield code="e"
>E01331.0000</subfield>
<subfield code="f"
>N05240.0000</subfield>
<subfield code="g"
>N05224.0000</subfield>
</datafield>
<datafield tag="034" ind1="1" ind2=" ">
<subfield code="a"
>a</subfield>
<subfield code="d"
>W00430.0000</subfield>
<subfield code="e"
>W00430.0000</subfield>
<subfield code="f"
>N05415.0000</subfield>
<subfield code="g"
>N05415.0000</subfield>
</datafield>
</record>
ST_AsMVTGeom — Перетворює геометрію в координатну систему плитки MVT.
geometry ST_AsMVTGeom(geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true);
Перетворює геометрію в координатну систему плитки MVT (Mapbox Vector Tile), обрізаючи її до меж плитки, якщо потрібно. Геометрія повинна бути в системі координат цільової карти (використовуючи ST_Transform, якщо потрібно). Зазвичай це Web Mercator (SRID:3857).
Функція намагається зберегти правильність геометрії та виправити її, якщо це необхідно. Це може призвести до скорочення геометрії результату до нижчого виміру.
The function performs geometry simplification appropriate to the integer tile coordinate space. After transforming to tile coordinates it snaps coordinates to the integer grid, removes repeated points, and removes points that lie on straight lines. It does not perform general-purpose, scale-dependent simplification such as ST_Simplify. To reduce detail before tile conversion, simplify the geometry in map coordinates before calling ST_AsMVTGeom.
Необхідно вказати прямокутні межі плитки в просторі координат цільової карти, щоб можна було трансформувати геометрію та обрізати її за необхідності. Межі можна створити за допомогою ST_TileEnvelope.
Ця функція використовується для перетворення геометрії в координатну систему плиток, необхідну для ST_AsMVT.
geom — геометрія, яку потрібно трансформувати в системі координат цільової карти.
bounds — прямокутні межі плитки в просторі координат карти, без буфера.
extent — розмір площі плитки в просторі координат плитки, як визначено в специфікації MVT. За замовчуванням — 4096.
buffer — розмір буфера в просторі координат плиток для обрізки геометрії. За замовчуванням — 256.
clip_geom — це логічне значення, яке визначає, чи геометрії обрізаються або кодуються без змін. За замовчуванням встановлено значення true.
Доступність: 2.4.0
![]() | |
Починаючи з версії 3.0, під час конфігурації можна вибрати Wagyu для обрізання та перевірки полігонів MVT. Ця бібліотека працює швидше та дає більш правильні результати, ніж стандартна GEOS, але може пропускати невеликі полігони. |
SELECT ST_AsMVTGeom('POLYGON ((0 0,10 0,10 5,0 -5,0 0))',
ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)),
4096, 0, false);MULTIPOLYGON(((5 4096,10 4091,10 4096,5 4096)),((5 4096,0 4101,0 4096,5 4096)))
Канонічний приклад для плитки Web Mercator з використанням обчислених меж плитки для запиту та обрізки геометрії. Припускається, що стовпець data.geom має srid 4326.
SELECT ST_AsMVTGeom(ST_Transform(geom, 3857 ),
ST_TileEnvelope(12, 513, 412),
extent =
> 4096,
buffer =
> 64) AS geom
FROM data
WHERE geom && ST_Transform(ST_TileEnvelope(12, 513, 412, margin =
> (64.0 / 4096)), 4326)
ST_AsMVT — Агрегатна функція, що повертає MVT-представлення набору рядків.
bytea ST_AsMVT(anyelement set row);
bytea ST_AsMVT(anyelement row, text name);
bytea ST_AsMVT(anyelement row, text name, integer extent);
bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name);
bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name, text feature_id_name);
Агрегатна функція, яка повертає двійкове Mapbox Vector Tile представлення набору рядків, що відповідають шару плиток. Рядки повинні містити стовпець геометрії, який буде закодований як геометрія об'єкта. Геометрія повинна бути в просторі координат плитки та відповідати специфікації MVT. ST_AsMVTGeom можна використовувати для перетворення геометрії в простір координат плитки. Інші стовпці рядків кодуються як атрибути об'єкта.
Формат Mapbox Vector Tile може зберігати об'єкти з різними наборами атрибутів. Щоб скористатися цією можливістю, надайте стовпець JSONB у даних рядка, що містить об'єкти Json одного рівня. Ключі та значення в значеннях JSONB будуть закодовані як атрибути об'єктів.
Плитки з декількома шарами можна створити, об'єднавши кілька викликів цієї функції за допомогою || або STRING_AGG.
![]() | |
Не викликайте з |
row дані рядка, що містять принаймні стовпець геометрії.
name — це назва шару. За замовчуванням використовується рядок "default".
extent — це розмір плитки в просторі екрана, як визначено в специфікації. За замовчуванням — 4096.
geom_name — це ім'я стовпця геометрії в даних рядка. За замовчуванням це перший стовпець геометрії. Зверніть увагу, що PostgreSQL за замовчуванням автоматично перетворює ідентифікатори без лапок у нижній регістр, що означає, що якщо стовпець геометрії не взято в лапки, наприклад "MyMVTGeom", цей параметр повинен бути вказаний малими літерами.
feature_id_name — це назва стовпця Feature ID у даних рядка. Якщо значення NULL або від’ємне, Feature ID не встановлюється. Перший стовпець, що відповідає назві та дійсному типу (smallint, integer, bigint), буде використано як Feature ID, а всі наступні стовпці будуть додано як властивості. Властивості JSON не підтримуються.
Покращено: 3.0 — додано підтримку ідентифікатора функції.
Покращено: 2.5.0 — додано підтримку паралельних запитів.
Доступність: 2.4.0
WITH mvtgeom AS
(
SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(12, 513, 412), extent =
> 4096, buffer =
> 64) AS geom, name, description
FROM points_of_interest
WHERE geom && ST_TileEnvelope(12, 513, 412, margin =
> (64.0 / 4096))
)
SELECT ST_AsMVT(mvtgeom.*)
FROM mvtgeom;
ST_AsSVG — Повертає дані SVG-шляху для геометрії.
text ST_AsSVG(geometry geom, integer rel=0, integer maxdecimaldigits=15);
text ST_AsSVG(geography geog, integer rel=0, integer maxdecimaldigits=15);
Повернути геометрію як дані шляху Scalar Vector Graphics (SVG). Використовуйте 1 як другий аргумент, щоб дані шляху були реалізовані у вигляді відносних переміщень, за замовчуванням (або 0) використовуються абсолютні переміщення. Третій аргумент може бути використаний для зменшення максимальної кількості десяткових цифр, що використовуються у вихідних даних (за замовчуванням 15). Точкові геометрії будуть відображатися як cx/cy, коли аргумент 'rel' дорівнює 0, x/y, коли 'rel' дорівнює 1. Багатоточкові геометрії розділяються комами (","), геометрії GeometryCollection розділяються крапками з комою (";").
Для роботи з графікою PostGIS SVG, ознайомтеся з бібліотекою pg_svg, яка надає функції plpgsql для роботи з результатами ST_AsSVG.
Покращено: 3.4.0 для підтримки всіх типів кривих
Змінено: 2.0.0 для використання аргументів за замовчуванням та підтримки іменованих аргументів
Доступність: 1.2.2. Доступність: 1.4.0 Змінено в PostGIS 1.4.0, щоб включити команду L в абсолютний шлях для відповідності http://www.w3.org/TR/SVG/paths.html#PathDataBNF
This method supports Circular Strings and Curves.
SELECT ST_AsSVG('POLYGON((0 0,0 1,1 1,1 0,0 0))'::geometry);M 0 0 L 0 -1 1 -1 1 0 Z
Circular string
SELECT ST_AsSVG('CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)'::geometry);M -2 0 A 2 2 0 0 1 2 0 A 2 2 0 0 1 2 -4
Multi-curve
SELECT ST_AsSVG('MULTICURVE((5 5,3 5,3 3,0 3),
CIRCULARSTRING(0 0,2 1,2 2))'::geometry, 0, 0);M 5 -5 L 3 -5 3 -3 0 -3 M 0 0 A 2 2 0 0 0 2 -2
Multi-surface
SELECT ST_AsSVG('MULTISURFACE(
CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),
(-1 0,0 0.5,1 0,0 1,-1 0)),
((7 8,10 10,6 14,4 11,7 8)))'::geometry, 0, 2);M -2 0 A 1 1 0 0 0 0 0 A 1 1 0 0 0 2 0 A 2 2 0 0 0 -2 0 Z M -1 0 L 0 -0.5 1 0 0 -1 -1 0 Z M 7 -8 L 10 -10 6 -14 4 -11 Z
ST_AsTWKB — Повертає геометрію у вигляді TWKB, також відомого як "Tiny Well-Known Binary" (маленький добре відомий двійковий файл)
bytea ST_AsTWKB(geometry geom, integer prec=0, integer prec_z=0, integer prec_m=0, boolean with_sizes=false, boolean with_boxes=false);
bytea ST_AsTWKB(geometry[] geom, bigint[] ids, integer prec=0, integer prec_z=0, integer prec_m=0, boolean with_sizes=false, boolean with_boxes=false);
Повертає геометрію у форматі TWKB (Tiny Well-Known Binary). 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);\x02000202020808
Щоб створити агрегований об'єкт TWKB, що містить ідентифікатори, спочатку агрегуйте потрібні геометрії та об'єкти за допомогою функції "array_agg()", а потім викличте відповідну функцію TWKB.
SELECT ST_AsTWKB(array_agg(geom), array_agg(gid)) FROM mytable;
\x040402020400000202
ST_GeomFromTWKB, ST_AsBinary, ST_AsEWKB, ST_AsEWKT, ST_GeomFromText
ST_AsX3D — Повертає геометрію у форматі елемента вузла X3D xml: ISO-IEC-19776-1.2-X3DEncodings-XML
text ST_AsX3D(geometry g1, integer maxdecimaldigits=15, integer options=0);
Повертає геометрію у вигляді елемента вузла у форматі X3D xml http://www.web3d.org/standards/number/19776-1. Якщо maxdecimaldigits (точність) не вказано, то за замовчуванням використовується значення 15.
![]() | |
Існують різні варіанти перетворення геометрії PostGIS у X3D, оскільки типи геометрії X3D не відповідають безпосередньо типам геометрії PostGIS, а деякі новіші типи X3D, які можуть бути кращими відповідниками, ми уникнули, оскільки більшість інструментів візуалізації наразі їх не підтримують. Ось відповідники, на яких ми зупинилися. Якщо у вас є думки щодо цієї ідеї або способів, як ми можемо дозволити користувачам вказувати свої бажані відповідники, будь ласка, повідомте нам про це. Нижче наведено, як ми наразі відображаємо типи PostGIS 2D/3D у типи X3D |
Аргумент «options» є бітовим полем, яке визначає, чи слід представляти координати за допомогою геопросторового вузла X3D GeoCoordinates і чи слід перевертати осі x/y. За замовчуванням ST_AsX3D виводить дані у формі бази даних (long,lat або X,Y), але за замовчуванням X3D може бути краще використовувати lat/lon, y/x.
0: X/Y у порядку бази даних (наприклад, long/lat = X,Y є стандартним порядком бази даних), значення за замовчуванням та непросторові координати (просто звичайний старий тег Coordinate).
1: Перевернути X і Y. Якщо використовується разом з опцією GeoCoordinate, то вихідні дані будуть за замовчуванням "latitude_first", а координати також будуть перевернуті.
2: Вивести координати в GeoSpatial GeoCoordinates. Ця опція видасть помилку, якщо геометрії не відповідають WGS 84 long lat (srid: 4326). Наразі це єдиний підтримуваний тип GeoCoordinate. Дивіться специфікації X3D, що визначають систему просторових координат.. Стандартним результатом буде GeoCoordinate geoSystem='"GD" "WE" "longitude_first"'. Якщо ви віддаєте перевагу стандартному для X3D GeoCoordinate geoSystem='"GD" 'WE' "latitude_first"', використовуйте (2 + 1) = 3.
| Тип PostGIS | 2D X3D Тип | Тип 3D X3D |
|---|---|---|
| LINESTRING | ще не реалізовано - буде PolyLine2D | LineSet |
| MULTILINESTRING | ще не реалізовано - буде PolyLine2D | IndexedLineSet |
| MULTIPOINT | Polypoint2D | PointSet |
| POINT | виводить координати, розділені пробілами | виводить координати, розділені пробілами |
| (MULTI) POLYGON, POLYHEDRALSURFACE | Недійсна розмітка X3D | IndexedFaceSet (внутрішні кільця наразі виводяться як інший набір облич) |
| TIN | TriangleSet2D (ще не реалізовано) | IndexedTriangleSet |
![]() | |
Підтримка 2D-геометрії ще не завершена. Внутрішні кільця наразі малюються як окремі полігони. Ми працюємо над цим. |
У 3D-просторі відбувається багато прогресивних змін, особливо в області інтеграції X3D з HTML5
Також є гарний відкритий X3D-переглядач, який можна використовувати для перегляду відтворених геометрій. Безкоштовні бінарні файли Free Wrl http://freewrl.sourceforge.net/ доступні для Mac, Linux та Windows. Для перегляду геометрій використовуйте пакет FreeWRL_Launcher.
Також зверніть увагу на мінімалістичний переглядач PostGIS X3D, який використовує цю функцію, та відкритий набір інструментів x3dDom html/js.
Доступність: 2.0.0: ISO-IEC-19776-1.2-X3DEncodings-XML
Покращено: 2.2.0: Підтримка геокоординат та перевертання осей (x/y, long/lat). Детальніше дивіться в налаштуваннях.
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).
Create a complete X3D document containing a cube that is viewable in FreeWRL and other X3D viewers.
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>
PostGIS buildings.
Скопіюйте та вставте результат цього запиту в x3d scene viewer і натисніть Show (Показати)
SELECT string_agg('<Shape
>' || ST_AsX3D(CG_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);
The following preview shows the extruded geometry generated from a simplified version of the same source lettering. It is a geometry preview, not X3D markup; use the preceding ST_AsX3D query output in an X3D viewer to inspect the native X3D scene.
SELECT
CG_Extrude(
ST_SimplifyPreserveTopology(ST_Letters('PostGIS'), 2),
0, 0, 10
) AS buildings;GEOMETRYCOLLECTION Z (POLYHEDRALSURFACE Z (((42.6 39.2 0,36.3 24.5 0,17 20.3 0,17.9 0 0,0 0 0,0 73.8 0,27.3 73.6 0,36.3 70 0,41.8 61.6 0,42.6 39.2 0),(26.5 55.7 0,17 58.8 0,17 35.3 0,25.6 36.2 0,26.5 55.7 0)),((42.6 39.2 10,41.8 61.6 10,36.3 70 10,27.3 73.6 10,0 73.8 10,0 0 10,17.9 0 10,17 20.3 10,36.3 24.5 10,42.6 39.2 10),(26.5 55.7 10,25.6 36.2 10,17 35.3 10,17 58.8 10,26.5 55.7 10)),((42.6 39.2 0,42.6 39.2 10,36.3 24.5 10,36.3 24.5 0,42.6 39.2 0)),((36.3 24.5 0,36.3 24.5 10,17 20.3 10,17 20.3 0,36.3 24.5 0)),((17 20.3 0,17 20.3 10,17.9 0 10,17.9 0 0,17 20.3 0)),((17.9 0 0,17.9 0 10,0 0 10,0 0 0,17.9 0 0)),((0 0 0,0 0 10,0 73.8 10,0 73.8 0,0 0 0)),((0 73.8 0,0 73.8 10,27.3 73.6 10,27.3 73.6 0,0 73.8 0)),((27.3 73.6 0,27.3 73.6 10,36.3 70 10,36.3 70 0,27.3 73.6 0)),((36.3 70 0,36.3 70 10,41.8 61.6 10,41.8 61.6 0,36.3 70 0)),((41.8 61.6 0,41.8 61.6 10,42.6 39.2 10,42.6 39.2 0,41.8 61.6 0)),((26.5 55.7 0,26.5 55.7 10,17 58.8 10,17 58.8 0,26.5 55.7 0)),((17 58.8 0,17 58.8 10,17 35.3 10,17 35.3 0,17 58.8 0)),((17 35.3 0,17 35.3 10,25.6 36.2 10,25.6 36.2 0,17 35.3 0)),((25.6 36.2 0,25.6 36.2 10,26.5 55.7 10,26.5 55.7 0,25.6 36.2 0))),POLYHEDRALSURFACE Z (((69.01 58 0,84.51 52.5 0,89.71 39.9 0,87.81 9.7 0,81.71 2.9 0,71.31 -0.5 0,54.91 3.9 0,48.31 17.8 0,50.61 48.7 0,58.01 55.6 0,69.01 58 0),(73.91 38.9 0,69.11 42.6 0,64.21 38.9 0,64.21 18.9 0,68.91 15.2 0,73.91 18.9 0,73.91 38.9 0)),((69.01 58 10,58.01 55.6 10,50.61 48.7 10,48.31 17.8 10,54.91 3.9 10,71.31 -0.5 10,81.71 2.9 10,87.81 9.7 10,89.71 39.9 10,84.51 52.5 10,69.01 58 10),(73.91 38.9 10,73.91 18.9 10,68.91 15.2 10,64.21 18.9 10,64.21 38.9 10,69.11 42.6 10,73.91 38.9 10)),((69.01 58 0,69.01 58 10,84.51 52.5 10,84.51 52.5 0,69.01 58 0)),((84.51 52.5 0,84.51 52.5 10,89.71 39.9 10,89.71 39.9 0,84.51 52.5 0)),((89.71 39.9 0,89.71 39.9 10,87.81 9.7 10,87.81 9.7 0,89.71 39.9 0)),((87.81 9.7 0,87.81 9.7 10,81.71 2.9 10,81.71 2.9 0,87.81 9.7 0)),((81.71 2.9 0,81.71 2.9 10,71.31 -0.5 10,71.31 -0.5 0,81.71 2.9 0)),((71.31 -0.5 0,71.31 -0.5 10,54.91 3.9 10,54.91 3.9 0,71.31 -0.5 0)),((54.91 3.9 0,54.91 3.9 10,48.31 17.8 10,48.31 17.8 0,54.91 3.9 0)),((48.31 17.8 0,48.31 17.8 10,50.61 48.7 10,50.61 48.7 0,48.31 17.8 0)),((50.61 48.7 0,50.61 48.7 10,58.01 55.6 10,58.01 55.6 0,50.61 48.7 0)),((58.01 55.6 0,58.01 55.6 10,69.01 58 10,69.01 58 0,58.01 55.6 0)),((73.91 38.9 0,73.91 38.9 10,69.11 42.6 10,69.11 42.6 0,73.91 38.9 0)),((69.11 42.6 0,69.11 42.6 10,64.21 38.9 10,64.21 38.9 0,69.11 42.6 0)),((64.21 38.9 0,64.21 38.9 10,64.21 18.9 10,64.21 18.9 0,64.21 38.9 0)),((64.21 18.9 0,64.21 18.9 10,68.91 15.2 10,68.91 15.2 0,64.21 18.9 0)),((68.91 15.2 0,68.91 15.2 10,73.91 18.9 10,73.91 18.9 0,68.91 15.2 0)),((73.91 18.9 0,73.91 18.9 10,73.91 38.9 10,73.91 38.9 0,73.91 18.9 0))),POLYHEDRALSURFACE Z (((111.02 37.6 0,123.92 31.1 0,130.72 20.8 0,126.82 5.3 0,116.02 -0.3 0,94.02 3.7 0,98.82 18.9 0,112.52 15.3 0,115.02 17.6 0,98.72 29.6 0,96.12 45.4 0,100.52 53 0,107.32 57.1 0,128.92 54.7 0,122.72 39.9 0,112.02 42.1 0,111.02 37.6 0)),((111.02 37.6 10,112.02 42.1 10,122.72 39.9 10,128.92 54.7 10,107.32 57.1 10,100.52 53 10,96.12 45.4 10,98.72 29.6 10,115.02 17.6 10,112.52 15.3 10,98.82 18.9 10,94.02 3.7 10,116.02 -0.3 10,126.82 5.3 10,130.72 20.8 10,123.92 31.1 10,111.02 37.6 10)),((111.02 37.6 0,111.02 37.6 10,123.92 31.1 10,123.92 31.1 0,111.02 37.6 0)),((123.92 31.1 0,123.92 31.1 10,130.72 20.8 10,130.72 20.8 0,123.92 31.1 0)),((130.72 20.8 0,130.72 20.8 10,126.82 5.3 10,126.82 5.3 0,130.72 20.8 0)),((126.82 5.3 0,126.82 5.3 10,116.02 -0.3 10,116.02 -0.3 0,126.82 5.3 0)),((116.02 -0.3 0,116.02 -0.3 10,94.02 3.7 10,94.02 3.7 0,116.02 -0.3 0)),((94.02 3.7 0,94.02 3.7 10,98.82 18.9 10,98.82 18.9 0,94.02 3.7 0)),((98.82 18.9 0,98.82 18.9 10,112.52 15.3 10,112.52 15.3 0,98.82 18.9 0)),((112.52 15.3 0,112.52 15.3 10,115.02 17.6 10,115.02 17.6 0,112.52 15.3 0)),((115.02 17.6 0,115.02 17.6 10,98.72 29.6 10,98.72 29.6 0,115.02 17.6 0)),((98.72 29.6 0,98.72 29.6 10,96.12 45.4 10,96.12 45.4 0,98.72 29.6 0)),((96.12 45.4 0,96.12 45.4 10,100.52 53 10,100.52 53 0,96.12 45.4 0)),((100.52 53 0,100.52 53 10,107.32 57.1 10,107.32 57.1 0,100.52 53 0)),((107.32 57.1 0,107.32 57.1 10,128.92 54.7 10,128.92 54.7 0,107.32 57.1 0)),((128.92 54.7 0,128.92 54.7 10,122.72 39.9 10,122.72 39.9 0,128.92 54.7 0)),((122.72 39.9 0,122.72 39.9 10,112.02 42.1 10,112.02 42.1 0,122.72 39.9 0)),((112.02 42.1 0,112.02 42.1 10,111.02 37.6 10,111.02 37.6 0,112.02 42.1 0))),POLYHEDRALSURFACE Z (((156.82 17.7 0,167.02 16 0,167.02 -0.9 0,149.22 2 0,141.42 11.3 0,141.12 42.7 0,134.62 41.8 0,134.62 58.9 0,141.12 57.9 0,140.02 75.4 0,157.92 75.4 0,156.82 57.9 0,166.02 58.9 0,166.02 41.8 0,156.82 42.7 0,156.82 17.7 0)),((156.82 17.7 10,156.82 42.7 10,166.02 41.8 10,166.02 58.9 10,156.82 57.9 10,157.92 75.4 10,140.02 75.4 10,141.12 57.9 10,134.62 58.9 10,134.62 41.8 10,141.12 42.7 10,141.42 11.3 10,149.22 2 10,167.02 -0.9 10,167.02 16 10,156.82 17.7 10)),((156.82 17.7 0,156.82 17.7 10,167.02 16 10,167.02 16 0,156.82 17.7 0)),((167.02 16 0,167.02 16 10,167.02 -0.9 10,167.02 -0.9 0,167.02 16 0)),((167.02 -0.9 0,167.02 -0.9 10,149.22 2 10,149.22 2 0,167.02 -0.9 0)),((149.22 2 0,149.22 2 10,141.42 11.3 10,141.42 11.3 0,149.22 2 0)),((141.42 11.3 0,141.42 11.3 10,141.12 42.7 10,141.12 42.7 0,141.42 11.3 0)),((141.12 42.7 0,141.12 42.7 10,134.62 41.8 10,134.62 41.8 0,141.12 42.7 0)),((134.62 41.8 0,134.62 41.8 10,134.62 58.9 10,134.62 58.9 0,134.62 41.8 0)),((134.62 58.9 0,134.62 58.9 10,141.12 57.9 10,141.12 57.9 0,134.62 58.9 0)),((141.12 57.9 0,141.12 57.9 10,140.02 75.4 10,140.02 75.4 0,141.12 57.9 0)),((140.02 75.4 0,140.02 75.4 10,157.92 75.4 10,157.92 75.4 0,140.02 75.4 0)),((157.92 75.4 0,157.92 75.4 10,156.82 57.9 10,156.82 57.9 0,157.92 75.4 0)),((156.82 57.9 0,156.82 57.9 10,166.02 58.9 10,166.02 58.9 0,156.82 57.9 0)),((166.02 58.9 0,166.02 58.9 10,166.02 41.8 10,166.02 41.8 0,166.02 58.9 0)),((166.02 41.8 0,166.02 41.8 10,156.82 42.7 10,156.82 42.7 0,166.02 41.8 0)),((156.82 42.7 0,156.82 42.7 10,156.82 17.7 10,156.82 17.7 0,156.82 42.7 0))),POLYHEDRALSURFACE Z (((213.81 13.2 0,208.11 4.2 0,198.51 -0.3 0,184.21 0.9 0,174.91 8.8 0,172.61 57.4 0,175.21 66.1 0,180.91 71.6 0,209.81 74 0,209.81 58.4 0,189.11 56.8 0,188.61 18.7 0,193.81 14.8 0,199.11 16.5 0,199.11 32.2 0,193.41 32.2 0,193.41 46.4 0,213.81 46.4 0,213.81 13.2 0)),((213.81 13.2 10,213.81 46.4 10,193.41 46.4 10,193.41 32.2 10,199.11 32.2 10,199.11 16.5 10,193.81 14.8 10,188.61 18.7 10,189.11 56.8 10,209.81 58.4 10,209.81 74 10,180.91 71.6 10,175.21 66.1 10,172.61 57.4 10,174.91 8.8 10,184.21 0.9 10,198.51 -0.3 10,208.11 4.2 10,213.81 13.2 10)),((213.81 13.2 0,213.81 13.2 10,208.11 4.2 10,208.11 4.2 0,213.81 13.2 0)),((208.11 4.2 0,208.11 4.2 10,198.51 -0.3 10,198.51 -0.3 0,208.11 4.2 0)),((198.51 -0.3 0,198.51 -0.3 10,184.21 0.9 10,184.21 0.9 0,198.51 -0.3 0)),((184.21 0.9 0,184.21 0.9 10,174.91 8.8 10,174.91 8.8 0,184.21 0.9 0)),((174.91 8.8 0,174.91 8.8 10,172.61 57.4 10,172.61 57.4 0,174.91 8.8 0)),((172.61 57.4 0,172.61 57.4 10,175.21 66.1 10,175.21 66.1 0,172.61 57.4 0)),((175.21 66.1 0,175.21 66.1 10,180.91 71.6 10,180.91 71.6 0,175.21 66.1 0)),((180.91 71.6 0,180.91 71.6 10,209.81 74 10,209.81 74 0,180.91 71.6 0)),((209.81 74 0,209.81 74 10,209.81 58.4 10,209.81 58.4 0,209.81 74 0)),((209.81 58.4 0,209.81 58.4 10,189.11 56.8 10,189.11 56.8 0,209.81 58.4 0)),((189.11 56.8 0,189.11 56.8 10,188.61 18.7 10,188.61 18.7 0,189.11 56.8 0)),((188.61 18.7 0,188.61 18.7 10,193.81 14.8 10,193.81 14.8 0,188.61 18.7 0)),((193.81 14.8 0,193.81 14.8 10,199.11 16.5 10,199.11 16.5 0,193.81 14.8 0)),((199.11 16.5 0,199.11 16.5 10,199.11 32.2 10,199.11 32.2 0,199.11 16.5 0)),((199.11 32.2 0,199.11 32.2 10,193.41 32.2 10,193.41 32.2 0,199.11 32.2 0)),((193.41 32.2 0,193.41 32.2 10,193.41 46.4 10,193.41 46.4 0,193.41 32.2 0)),((193.41 46.4 0,193.41 46.4 10,213.81 46.4 10,213.81 46.4 0,193.41 46.4 0)),((213.81 46.4 0,213.81 46.4 10,213.81 13.2 10,213.81 13.2 0,213.81 46.4 0))),POLYHEDRALSURFACE Z (((235.82 72.9 0,236.82 0 0,218.52 0 0,218.52 73.8 0,235.82 72.9 0)),((235.82 72.9 10,218.52 73.8 10,218.52 0 10,236.82 0 10,235.82 72.9 10)),((235.82 72.9 0,235.82 72.9 10,236.82 0 10,236.82 0 0,235.82 72.9 0)),((236.82 0 0,236.82 0 10,218.52 0 10,218.52 0 0,236.82 0 0)),((218.52 0 0,218.52 0 10,218.52 73.8 10,218.52 73.8 0,218.52 0 0)),((218.52 73.8 0,218.52 73.8 10,235.82 72.9 10,235.82 72.9 0,218.52 73.8 0))),POLYHEDRALSURFACE Z (((258.33 49.5 0,279.93 34.6 0,283.43 25.9 0,282.53 15.4 0,277.93 6.8 0,270.73 1.6 0,252.33 0.5 0,241.53 4.9 0,246.43 20.6 0,260.73 16.4 0,266.23 18.7 0,267.43 23.2 0,245.63 39.4 0,242.03 48.6 0,242.83 59.6 0,247.53 67.3 0,257.53 73.2 0,280.43 70.8 0,275.23 56.4 0,264.53 58.3 0,258.73 55.1 0,258.33 49.5 0)),((258.33 49.5 10,258.73 55.1 10,264.53 58.3 10,275.23 56.4 10,280.43 70.8 10,257.53 73.2 10,247.53 67.3 10,242.83 59.6 10,242.03 48.6 10,245.63 39.4 10,267.43 23.2 10,266.23 18.7 10,260.73 16.4 10,246.43 20.6 10,241.53 4.9 10,252.33 0.5 10,270.73 1.6 10,277.93 6.8 10,282.53 15.4 10,283.43 25.9 10,279.93 34.6 10,258.33 49.5 10)),((258.33 49.5 0,258.33 49.5 10,279.93 34.6 10,279.93 34.6 0,258.33 49.5 0)),((279.93 34.6 0,279.93 34.6 10,283.43 25.9 10,283.43 25.9 0,279.93 34.6 0)),((283.43 25.9 0,283.43 25.9 10,282.53 15.4 10,282.53 15.4 0,283.43 25.9 0)),((282.53 15.4 0,282.53 15.4 10,277.93 6.8 10,277.93 6.8 0,282.53 15.4 0)),((277.93 6.8 0,277.93 6.8 10,270.73 1.6 10,270.73 1.6 0,277.93 6.8 0)),((270.73 1.6 0,270.73 1.6 10,252.33 0.5 10,252.33 0.5 0,270.73 1.6 0)),((252.33 0.5 0,252.33 0.5 10,241.53 4.9 10,241.53 4.9 0,252.33 0.5 0)),((241.53 4.9 0,241.53 4.9 10,246.43 20.6 10,246.43 20.6 0,241.53 4.9 0)),((246.43 20.6 0,246.43 20.6 10,260.73 16.4 10,260.73 16.4 0,246.43 20.6 0)),((260.73 16.4 0,260.73 16.4 10,266.23 18.7 10,266.23 18.7 0,260.73 16.4 0)),((266.23 18.7 0,266.23 18.7 10,267.43 23.2 10,267.43 23.2 0,266.23 18.7 0)),((267.43 23.2 0,267.43 23.2 10,245.63 39.4 10,245.63 39.4 0,267.43 23.2 0)),((245.63 39.4 0,245.63 39.4 10,242.03 48.6 10,242.03 48.6 0,245.63 39.4 0)),((242.03 48.6 0,242.03 48.6 10,242.83 59.6 10,242.83 59.6 0,242.03 48.6 0)),((242.83 59.6 0,242.83 59.6 10,247.53 67.3 10,247.53 67.3 0,242.83 59.6 0)),((247.53 67.3 0,247.53 67.3 10,257.53 73.2 10,257.53 73.2 0,247.53 67.3 0)),((257.53 73.2 0,257.53 73.2 10,280.43 70.8 10,280.43 70.8 0,257.53 73.2 0)),((280.43 70.8 0,280.43 70.8 10,275.23 56.4 10,275.23 56.4 0,280.43 70.8 0)),((275.23 56.4 0,275.23 56.4 10,264.53 58.3 10,264.53 58.3 0,275.23 56.4 0)),((264.53 58.3 0,264.53 58.3 10,258.73 55.1 10,258.73 55.1 0,264.53 58.3 0)),((258.73 55.1 0,258.73 55.1 10,258.33 49.5 10,258.33 49.5 0,258.73 55.1 0))))
An Octagon elevated 3 Units and decimal precision of 6.
SELECT ST_AsX3D(ST_Translate(ST_Force3D(ST_Buffer(ST_Point(10,10),5, 'quad_segs=2')), 0,0,
3),
6) As x3dfrag;
x3dfrag -------- <IndexedFaceSet convex='false' 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>
TIN.
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>
Closed multilinestring (the boundary of a polygon with holes).
SELECT ST_AsX3D(ST_GeomFromEWKT('MULTILINESTRING((20 0 10,16 -12 10,0 -16 10,-12 -12 10,-20 0 10,-12 16 10,0 24 10,16 16 10,20 0 10),
(12 0 10,8 8 10,0 12 10,-8 8 10,-8 0 10,-8 -4 10,0 -8 10,8 -4 10,12 0 10))')
) As x3dfrag;
x3dfrag
--------
<IndexedLineSet coordIndex='0 1 2 3 4 5 6 7 0 -1 8 9 10 11 12 13 14 15 8'>
<Coordinate point='20 0 10 16 -12 10 0 -16 10 -12 -12 10 -20 0 10 -12 16 10 0 24 10 16 16 10 12 0 10 8 8 10 0 12 10 -8 8 10 -8 0 10 -8 -4 10 0 -8 10 8 -4 10 ' />
</IndexedLineSet>
ST_GeoHash — Повернути представлення геометрії у форматі GeoHash.
text ST_GeoHash(geometry geom, integer maxchars=full_precision_of_point);
Обчислює GeoHash представлення геометрії. GeoHash кодує географічну точку в текстову форму, яку можна сортувати та шукати за префіксом. Коротший GeoHash є менш точним представленням точки. Його можна уявити як прямокутник, що містить точку.
Значення геометрії, що не є точками, з ненульовим розміром також можна відобразити у кодах GeoHash. Точність коду залежить від географічного розміру геометрії.
Якщо maxchars не вказано, повертається код GeoHash для найменшої комірки, що містить вхідну геометрію. Точки повертають GeoHash з точністю 20 символів (це приблизно достатньо для повної подвійної точності вхідних даних). Інші геометричні типи можуть повертати GeoHash з меншою точністю, залежно від розміру геометрії. Більші геометрії представлені з меншою точністю, менші — з більшою. Коробка, визначена кодом GeoHash, завжди містить вхідний об'єкт.
Якщо вказано maxchars, то повернений код GeoHash має не більше цього значення символів. Він відображається на (можливо) менш точне представлення вхідної геометрії. Для не точкових об'єктів початковою точкою обчислення є центр обмежувальної рамки геометрії.
Доступність: 1.4.0
![]() | |
ST_GeoHash вимагає, щоб вхідні геометричні дані були в географічних координатах (довгота/широта). |
This method supports Circular Strings and Curves.
SELECT ST_GeoHash(ST_Point(-126, 48));
c0w3hf1s70w3hf1s70w3
SELECT ST_GeoHash(ST_Point(-126, 48), 5);
c0w3h
This example shows that the GeoHash for a line containing a point is a prefix of the point code.
SELECT ST_GeoHash('LINESTRING(-126 48,-126.1 48.1)'::geometry);c0w3
ST_GeomFromGeoHash, ST_PointFromGeoHash, ST_Box2dFromGeoHash
Ці записи документують просторові оператори, визначені PostGIS. Оператори доповнюють каталог функцій, надаючи стислі символічні предикати для взаємодій обмежувальних рамок та просторових відносин. Їх семантика відповідає тим самим геометричним правилам, що й відповідні функції, але оптимізована для використання в виразах SQL та фільтруванні з підтримкою індексу.
TRUE, якщо 2D обмежувальна рамка A перетинається з 2D обмежувальною рамкою B.TRUE, якщо (кешована) 2D обмежувальна рамка геометрії перетинає 2D обмежувальну рамку з плаваючою точністю (BOX2DF).TRUE, якщо 2D обмежувальна рамка з плаваючою точністю (BOX2DF) перетинає (кешовану) 2D обмежувальну рамку геометрії.TRUE, якщо дві обмежувальні рамки 2D з плаваючою точністю (BOX2DF) перетинаються між собою.TRUE, якщо n-D обмежувальна рамка A перетинається з n-D обмежувальною рамкою B.TRUE, якщо (кешована) n-вимірна обмежувальна рамка геометрії перетинає n-вимірну обмежувальну рамку з плаваючою точністю (GIDX).TRUE, якщо обмежувальна рамка з n-вимірною точністю (GIDX) перетинає (кешовану) n-вимірну обмежувальну рамку геометрії.TRUE, якщо дві n-вимірні обмежувальні рамки (GIDX) з плаваючою точністю перетинаються між собою.TRUE, якщо обмежувальна рамка A перекриває або знаходиться ліворуч від обмежувальної рамки 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.TRUE, якщо обмежувальна рамка A знаходиться строго над обмежувальною рамкою B.TRUE, якщо обмежувальна рамка A містить B.TRUE, якщо 2D обмежувальна рамка геометрії містить 2D обмежувальну рамку з плаваючою точністю (GIDX).TRUE, якщо обмежувальна рамка з плаваючою точністю 2D (BOX2DF) містить обмежувальну рамку 2D геометрії.TRUE, якщо обмежувальна рамка з точністю до 2D float (BOX2DF) містить іншу обмежувальну рамку з точністю до 2D float (BOX2DF).TRUE, якщо обмежувальна рамка A збігається з обмежувальною рамкою B.&& — Повертає TRUE, якщо 2D обмежувальна рамка A перетинається з 2D обмежувальною рамкою B.
boolean &&( geometry A , geometry B );
boolean &&( geography A , geography B );
Оператор && повертає TRUE, якщо 2D обмежувальна рамка геометрії A перетинає 2D обмежувальну рамку геометрії 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)&&(geometry,box2df) — Повертає TRUE, якщо (кешована) 2D обмежувальна рамка геометрії перетинає 2D обмежувальну рамку з плаваючою точністю (BOX2DF).
boolean &&( geometry A , box2df B );
Оператор && повертає TRUE, якщо кешована 2D обмежувальна рамка геометрії A перетинає 2D обмежувальну рамку B, використовуючи точність float. Це означає, що якщо B є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_Point(1,1) && ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) AS overlaps;
overlaps ---------- t (1 row)
&&(box2df,geometry) — Повертає TRUE, якщо 2D обмежувальна рамка з плаваючою точністю (BOX2DF) перетинає (кешовану) 2D обмежувальну рамку геометрії.
boolean &&( box2df A , geometry B );
Оператор && повертає TRUE, якщо 2D обмежувальна рамка A перетинає кешовану 2D обмежувальну рамку геометрії B, використовуючи точність float. Це означає, що якщо A є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_Point(1,1) AS overlaps;
overlaps ---------- t (1 row)
&&(box2df,box2df) — Повертає TRUE, якщо дві обмежувальні рамки 2D з плаваючою точністю (BOX2DF) перетинаються між собою.
boolean &&( box2df A , box2df B );
Оператор && повертає TRUE, якщо дві 2D обмежувальні рамки A і B перетинаються, використовуючи точність float. Це означає, що якщо A (або B) є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку (BOX2DF) з точністю float
![]() | |
Цей оператор призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_MakeBox2D(ST_Point(1,1), ST_Point(3,3)) AS overlaps;
overlaps ---------- t (1 row)
&&& — Повертає TRUE, якщо n-D обмежувальна рамка A перетинається з n-D обмежувальною рамкою B.
boolean &&&( geometry A , geometry B );
Оператор &&& повертає TRUE, якщо n-вимірна обмежувальна рамка геометрії A перетинає n-вимірну обмежувальну рамку геометрії B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні для геометрій. |
Доступність: 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.
3D LineStrings.
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
3M LineStrings.
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3zm,
tbl1.column2 && tbl2.column2 AS overlaps_2d
FROM ( VALUES
(1, 'LINESTRING M(0 0 1, 3 3 2)'::geometry),
(2, 'LINESTRING M(1 2 0, 0 5 -1)'::geometry)) AS tbl1,
( VALUES
(3, 'LINESTRING M(1 2 1, 4 6 1)'::geometry)) AS tbl2;
column1 | column1 | overlaps_3zm | overlaps_2d
---------+---------+-------------+-------------
1 | 3 | t | t
2 | 3 | f | t
&&&(geometry,gidx) — Повертає TRUE, якщо (кешована) n-вимірна обмежувальна рамка геометрії перетинає n-вимірну обмежувальну рамку з плаваючою точністю (GIDX).
boolean &&&( geometry A , gidx B );
Оператор &&& повертає TRUE, якщо кешована n-вимірна обмежувальна рамка геометрії A перетинає n-вимірну обмежувальну рамку B, використовуючи точність float. Це означає, що якщо B є (подвійної точності) box3d, вона буде внутрішньо перетворена в обмежувальну рамку 3D з точністю float (GIDX)
![]() | |
Цей оператор призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
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_MakePoint(1,1,1) &&& ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) AS overlaps;
overlaps ---------- t (1 row)
&&&(gidx,geometry) — Повертає TRUE, якщо обмежувальна рамка з n-вимірною точністю (GIDX) перетинає (кешовану) n-вимірну обмежувальну рамку геометрії.
boolean &&&( gidx A , geometry B );
Оператор &&& повертає TRUE, якщо n-вимірна обмежувальна рамка A перетинає кешовану n-вимірну обмежувальну рамку геометрії B, використовуючи точність float. Це означає, що якщо A є (подвійної точності) box3d, вона буде внутрішньо перетворена в 3D обмежувальну рамку (GIDX) з точністю float
![]() | |
Цей оператор призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
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_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_MakePoint(1,1,1) AS overlaps;
overlaps ---------- t (1 row)
&&&(gidx,gidx) — Повертає TRUE, якщо дві n-вимірні обмежувальні рамки (GIDX) з плаваючою точністю перетинаються між собою.
boolean &&&( gidx A , gidx B );
Оператор &&& повертає TRUE, якщо дві n-вимірні обмежувальні рамки A і B перетинаються, використовуючи точність float. Це означає, що якщо A (або B) є (подвійної точності) box3d, вона буде внутрішньо перетворена в обмежувальну рамку 3D з точністю float (GIDX)
![]() | |
Цей оператор призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
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_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_3DMakeBox(ST_MakePoint(1,1,1), ST_MakePoint(3,3,3)) AS overlaps;
overlaps ---------- t (1 row)
&< — Повертає TRUE, якщо обмежувальна рамка A перекриває або знаходиться ліворуч від обмежувальної рамки B.
boolean &<( geometry A , geometry B );
Оператор &< повертає TRUE, якщо обмежувальна рамка геометрії A перекриває або знаходиться ліворуч від обмежувальної рамки геометрії B, або, точніше, перекриває або НЕ знаходиться праворуч від обмежувальної рамки геометрії B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні для геометрій. |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &< tbl2.column2 AS overleft
FROM
( VALUES
(1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2;
column1 | column1 | overleft
---------+---------+----------
1 | 2 | f
1 | 3 | f
1 | 4 | t
(3 rows)
&<| — Повертає TRUE, якщо обмежувальна рамка A перекриває або знаходиться нижче обмежувальної рамки B.
boolean &<|( geometry A , geometry B );
Оператор &<| повертає TRUE, якщо обмежувальна рамка геометрії A перекриває або знаходиться нижче обмежувальної рамки геометрії 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 );
Оператор &> повертає TRUE, якщо обмежувальна рамка геометрії A перекриває або знаходиться праворуч від обмежувальної рамки геометрії B, або, точніше, перекриває або НЕ знаходиться ліворуч від обмежувальної рамки геометрії B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні для геометрій. |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &
> tbl2.column2 AS overright
FROM
( VALUES
(1, 'LINESTRING(1 2,4 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0,3 3)'::geometry),
(3, 'LINESTRING(0 1,0 5)'::geometry),
(4, 'LINESTRING(6 0,6 1)'::geometry)) AS tbl2;
column1 | column1 | overright
---------+---------+-----------
1 | 2 | t
1 | 3 | t
1 | 4 | f
(3 rows)
<< — Повертає TRUE, якщо обмежувальна рамка A знаходиться строго ліворуч від B.
boolean <<( geometry A , geometry B );
Оператор << повертає TRUE, якщо обмежувальна рамка геометрії A знаходиться строго ліворуч від обмежувальної рамки геометрії 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 );
Оператор <<| повертає TRUE, якщо обмежувальна рамка геометрії A знаходиться строго нижче обмежувальної рамки геометрії 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 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 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 'POINT(1707296.37 4820536.77)'::geometry = 'POINT(1707296.27 4820536.87)'::geometry As pt_intersect;
pt_intersect -------------- f (1 row)
>> — Повертає TRUE, якщо обмежувальна рамка A знаходиться строго праворуч від B.
boolean >>( geometry A , geometry B );
Оператор >> повертає TRUE, якщо обмежувальна рамка геометрії A знаходиться строго праворуч від обмежувальної рамки геометрії 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 );
Оператор @ повертає TRUE, якщо обмежувальна рамка геометрії A повністю міститься в обмежувальній рамці геометрії 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)
@(geometry,box2df) — Повертає TRUE, якщо 2D обмежувальна рамка геометрії міститься в 2D обмежувальній рамці з плаваючою точністю (BOX2DF).
boolean @( geometry A , box2df B );
Оператор @ повертає TRUE, якщо 2D обмежувальна рамка геометрії A міститься в 2D обмежувальній рамці B, використовуючи точність float. Це означає, що якщо B є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_Buffer('POINT(2 2)'::geometry, 1) @ ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) AS is_contained;t
@(box2df,geometry) — Повертає TRUE, якщо 2D обмежувальна рамка з плаваючою точністю (BOX2DF) міститься в 2D обмежувальній рамці геометрії.
boolean @( box2df A , geometry B );
Оператор @ повертає TRUE, якщо 2D обмежувальна рамка A міститься в 2D обмежувальній рамці геометрії B, використовуючи точність float. Це означає, що якщо B є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_MakeBox2D(ST_Point(2, 2), ST_Point(3, 3)) @ ST_Buffer('POINT(1 1)'::geometry, 10) AS is_contained;t
@(box2df,box2df) — Повертає TRUE, якщо 2D обмежувальна рамка з плаваючою точністю (BOX2DF) міститься в іншій 2D обмежувальній рамці з плаваючою точністю.
boolean @( box2df A , box2df B );
Оператор @ повертає TRUE, якщо 2D обмежувальна рамка A міститься в 2D обмежувальній рамці B, використовуючи точність float. Це означає, що якщо A (або B) є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_MakeBox2D(ST_Point(2, 2), ST_Point(3, 3)) @ ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) AS is_contained;
t
|&> — Повертає TRUE, якщо обмежувальна рамка A перекриває або знаходиться над обмежувальною рамкою B.
boolean |&>( geometry A , geometry B );
Оператор |&> повертає TRUE, якщо обмежувальна рамка геометрії A перекриває або знаходиться над обмежувальною рамкою геометрії B, або, точніше, перекриває або НЕ знаходиться нижче обмежувальної рамки геометрії B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні для геометрій. |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 |&
> tbl2.column2 AS overabove
FROM
( VALUES
(1, 'LINESTRING(6 0,6 4)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0,3 3)'::geometry),
(3, 'LINESTRING(0 1,0 5)'::geometry),
(4, 'LINESTRING(1 2,4 6)'::geometry)) AS tbl2;
column1 | column1 | overabove
---------+---------+-----------
1 | 2 | t
1 | 3 | f
1 | 4 | f
(3 rows)
|>> — Повертає TRUE, якщо обмежувальна рамка A знаходиться строго над обмежувальною рамкою B.
boolean |>>( geometry A , geometry B );
Оператор |>> повертає TRUE, якщо обмежувальна рамка геометрії A знаходиться строго над обмежувальною рамкою геометрії 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 );
Оператор ~ повертає TRUE, якщо обмежувальна рамка геометрії A повністю містить обмежувальну рамку геометрії 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)~(geometry,box2df) — Повертає TRUE, якщо 2D обмежувальна рамка геометрії містить 2D обмежувальну рамку з плаваючою точністю (GIDX).
boolean ~( geometry A , box2df B );
Оператор ~ повертає TRUE, якщо 2D обмежувальна рамка геометрії A містить 2D обмежувальну рамку B, використовуючи точність float. Це означає, що якщо B є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_Buffer('POINT(1 1)'::geometry, 10) ~ ST_MakeBox2D(ST_Point(0, 0), ST_Point(2, 2)) AS contains;t
~(box2df,geometry) — Повертає TRUE, якщо обмежувальна рамка з плаваючою точністю 2D (BOX2DF) містить обмежувальну рамку 2D геометрії.
boolean ~( box2df A , geometry B );
Оператор ~ повертає TRUE, якщо 2D обмежувальна рамка A містить обмежувальну рамку геометрії B, використовуючи точність float. Це означає, що якщо A є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) ~ ST_Buffer('POINT(2 2)'::geometry, 1) AS contains;t
~(box2df,box2df) — Повертає TRUE, якщо обмежувальна рамка з точністю до 2D float (BOX2DF) містить іншу обмежувальну рамку з точністю до 2D float (BOX2DF).
boolean ~( box2df A , box2df B );
Оператор ~ повертає TRUE, якщо 2D обмежувальна рамка A містить 2D обмежувальну рамку B, використовуючи точність float. Це означає, що якщо A є (подвійної точності) box2d, вона буде внутрішньо перетворена в 2D обмежувальну рамку з точністю float (BOX2DF)
![]() | |
Цей операнд призначений для внутрішнього використання індексами BRIN, а не користувачами. |
Доступність: 2.3.0 було впроваджено підтримку Block Range INdexes (BRIN).
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
SELECT ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) ~ ST_MakeBox2D(ST_Point(2, 2), ST_Point(3, 3)) AS contains;
t
~= — Повертає 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. |
SELECT 'LINESTRING(0 0,1 1)'::geometry ~= 'LINESTRING(0 1,1 0)'::geometry AS equality;
t
<-> — Повертає 2D відстань між A і B.
double precision <->( geometry A , geometry B );
double precision <->( geography A , geography B );
Оператор <-> повертає 2D-відстань між двома геометріями. Використовується в розділі «ORDER BY» для надання наборів результатів найближчих сусідів з індексом за допомогою пошуку справжньої відстані KNN для геометрій та відстані на сфері для географічних даних.
![]() | |
Цей операнд використовує 2D-індекси GiST, які можуть бути доступні для геометрій. Він відрізняється від інших операторів, що використовують просторові індекси, тим, що просторовий індекс використовується тільки тоді, коли оператор знаходиться в розділі ORDER BY. |
![]() | |
Індекс спрацьовує тільки в тому випадку, якщо одна з геометрій є константою (не знаходиться в підзапиті/cte). Наприклад, 'SRID=3005;POINT(1011102 450541)'::geometry замість a.geom |
Детальний приклад див. у семінарі PostGIS: Пошук найближчих сусідів.
Покращено: 2.2.0 — Поведінка True KNN («K найближчих сусідів») для геометрії та географії. Примітка: для географії KNN базується на сфері, а не на сфероїді.
Змінено: 2.2.0 — Старі обхідні шляхи з гібридною синтаксичною конструкцією можуть працювати повільніше після появи справжнього KNN. Дивіться приклади нижче.
Доступність: 2.0.0 — Слабкий KNN надає найближчих сусідів на основі геометричних відстаней до центроїдів, а не реальних відстаней. Точні результати для точок, неточні для всіх інших типів.
SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d, edabbr, vaabbr FROM va2005 ORDER BY d limit 10;
d | edabbr | vaabbr
------------------+--------+--------
0 | ALQ | 128
5541.57712511724 | ALQ | 129A
5579.67450712005 | ALQ | 001
6083.4207708641 | ALQ | 131
7691.2205404848 | ALQ | 003
7900.75451037313 | ALQ | 122
8694.20710669982 | ALQ | 129B
9564.24289057111 | ALQ | 130
12089.665931705 | ALQ | 127
18472.5531479404 | ALQ | 002
(10 rows)Потім необроблена відповідь KNN:
SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr FROM va2005 ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10;
d | edabbr | vaabbr
------------------+--------+--------
0 | ALQ | 128
5541.57712511724 | ALQ | 129A
5579.67450712005 | ALQ | 001
6083.4207708641 | ALQ | 131
7691.2205404848 | ALQ | 003
7900.75451037313 | ALQ | 122
8694.20710669982 | ALQ | 129B
9564.24289057111 | ALQ | 130
12089.665931705 | ALQ | 127
18472.5531479404 | ALQ | 002
(10 rows)
Якщо ви виконаєте "EXPLAIN ANALYZE" для двох запитів, ви побачите підвищення продуктивності для другого.
Коли план не може безпосередньо визначити точні відстані, використовуйте гібридний запит, щоб знайти справжніх найближчих сусідів. Спочатку виконайте запит CTE з використанням KNN з індексом, а потім точний запит, щоб отримати правильний порядок:
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-вимірного індексу.
![]() | |
Цей операнд використовує індекси ND GiST, які можуть бути доступні для геометрій. Він відрізняється від інших операторів, що використовують просторові індекси, тим, що просторовий індекс використовується тільки тоді, коли оператор знаходиться в розділі ORDER BY. |
![]() | |
Індекс спрацьовує тільки в тому випадку, якщо одна з геометрій є константою (не в підзапиті/cte). Наприклад, 'SRID=3005;LINESTRINGM(0 0 0,0 0 1)'::geometry замість a.geom. |
Доступність: 2.2.0.
This example orders stored trajectories by their distance from a literal query trajectory.
\set qt 'ST_AddMeasure(ST_MakeLine(ST_MakePointM(-350, 300, 0), ST_MakePointM(-410, 490, 0)), 10, 20)'
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)<#> — Повертає 2D відстань між обмежувальними рамками A і B.
double precision <#>( geometry A , geometry B );
Оператор <#> повертає відстань між двома обмежувальними прямокутниками з плаваючою комою, можливо зчитуючи їх із просторового індексу. Корисний для виконання наближеного упорядкування відстаней найближчих сусідів.
![]() | |
Цей операнд використовує всі індекси, які можуть бути доступні для геометрій. Він відрізняється від інших операторів, які використовують просторові індекси, тим, що просторовий індекс використовується тільки тоді, коли оператор знаходиться в розділі ORDER BY. |
![]() | |
Індекс спрацьовує тільки в тому випадку, якщо одна з геометрій є константою, наприклад ORDER BY (ST_GeomFromText('POINT(1 2)') <#> geom) замість g1.geom <#>. |
Доступність: 2.0.0.
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)
<<->> — Повертає n-вимірну відстань між геометріями A і B або обмежувальними рамками
double precision <<->>( geometry A , geometry B );
Оператор <<->> повертає n-вимірну (евклідову) відстань між центроїдами обмежувальних рамок двох геометрій. Корисний для наближеного упорядкування найближчих сусідів за відстанню.
![]() | |
Цей операнд використовує індекси n-D GiST, які можуть бути доступні для геометрій. Він відрізняється від інших операторів, що використовують просторові індекси, тим, що просторовий індекс використовується тільки тоді, коли оператор знаходиться в розділі ORDER BY. |
![]() | |
Індекс спрацьовує тільки в тому випадку, якщо одна з геометрій є константою (не знаходиться в підзапиті/cte). Наприклад, 'SRID=3005;POINT(1011102 450541)'::geometry замість a.geom |
Доступність: 2.2.0.
Ці функції визначають просторові відносини між геометріями.
ST_3DIntersects — Перевіряє, чи дві геометрії перетинаються в просторі 3D - тільки для точок, лінійних відрізків, полігонів, багатогранних поверхонь (площ)
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. |
![]() | |
Через помилки плаваючої стійкості геометрії не завжди перетинаються так, як ви очікуєте після геометричної обробки. Наприклад, найближча точка на лінії до геометрії може не лежати на лінії. Для таких випадків, коли відстань в один сантиметр ви хочете вважати перетином, використовуйте ST_3DDWithin. |
Змінено: 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 implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1
SELECT ST_3DIntersects(pt, line), ST_Intersects(pt, line) FROM (SELECT 'POINT(0 0 2)'::geometry As pt, 'LINESTRING (0 0 1,0 2 3)'::geometry As line) As foo;
st_3dintersects | st_intersects -----------------+--------------- f | t (1 row)
SELECT ST_3DIntersects('TIN(((0 0 0,1 0 0,0 1 0,0 0 0)))'::geometry, 'POINT(.1 .1 0)'::geometry);t
ST_Contains — Перевіряє, чи кожна точка B лежить в A, і чи мають їхні внутрішні частини спільну точку
boolean ST_Contains(geometry geomA, geometry geomB);
Повертає TRUE, якщо геометрія A містить геометрію B. A містить B тоді і тільки тоді, коли всі точки B лежать всередині (тобто у внутрішній частині або на межі) A (або, що еквівалентно, жодна точка B не лежить поза межами A), а внутрішні частини A і B мають принаймні одну спільну точку.
У математичних термінах: ST_Contains(A, B) ⇔ (A ⋂ B = B) ∧ (Int(A) ⋂ Int(B) ≠ ∅)
Відношення "містить" є рефлексивним: кожна геометрія містить саму себе. (На відміну від цього, у предикаті ST_ContainsProperly геометрія не містить саму себе належним чином). Відношення є антисиметричним: якщо ST_Contains(A,B) = true і ST_Contains(B,A) = true, то дві геометрії повинні бути топологічно рівними (ST_Equals(A,B) = true).
ST_Contains є оберненим до ST_Within. Отже, ST_Contains(A,B) = ST_Within(B,A).
![]() | |
Оскільки внутрішні частини повинні мати спільну точку, тонкість визначення полягає в тому, що полігони та лінії не містять лінії та точки, що повністю лежать у їхніх межах. Для отримання додаткової інформації див. Тонкощі OGC Covers, Contains, Within. Предикат ST_Covers забезпечує більш всеосяжне відношення. |
![]() | |
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 розширено для підтримки MultiPoints з невеликою кількістю точок. Попередні версії підтримували тільки точки в багатокутнику.
Покращено: 3.0.0 увімкнув підтримку для GEOMETRYCOLLECTION
![]() | |
Не використовуйте цю функцію з недійсними геометріями. Ви отримаєте несподівані результати. |
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число.
This method implements the OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3 - те саме, що і в (geometry B, geometry A)
This method implements the SQL/MM specification. SQL-MM 3: 5.1.31
ST_Contains повертає TRUE у таких випадках:
A LineString contains a MultiPoint whose points lie in its interior or boundary.
SELECT ST_Contains(a, b) FROM (SELECT 'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a, 'MULTIPOINT (60 80,190 10)'::geometry AS b ) AS example;
t
A Polygon contains a Point in its interior.
SELECT ST_Contains(a, b) FROM (SELECT 'POLYGON ((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130))'::geometry AS a, 'POINT (99 130)'::geometry AS b ) AS example;
t
A Polygon contains a LineString with interior points inside the Polygon.
SELECT ST_Contains(a, b) FROM (SELECT 'POLYGON ((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130))'::geometry AS a, 'LINESTRING (50 190,110 190,99 130)'::geometry AS b ) AS example;
t
A Polygon contains another Polygon in its interior.
SELECT ST_Contains(a, b) FROM (SELECT 'POLYGON ((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130))'::geometry AS a, 'POLYGON ((70 40,100 50,120 80,80 110,50 90,70 40))'::geometry AS b ) AS example;
t
ST_Contains повертає FALSE у таких ситуаціях:
A Polygon does not contain a MultiPoint when one point lies in a hole.
SELECT ST_Contains(a, b) 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 a, 'MULTIPOINT (99 130,87 70)'::geometry AS b ) AS example;
f
A Polygon does not contain a LineString extending outside it.
SELECT ST_Contains(a, b) FROM (SELECT 'POLYGON ((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130))'::geometry AS a, 'LINESTRING (99 130,170 131)'::geometry AS b ) AS example;
f
Через умову внутрішнього перетину ST_Contains повертає FALSE у таких ситуаціях (тоді як ST_Covers повертає TRUE):
A LineString does not contain a Point lying only on its boundary.
SELECT ST_Contains(a, b), ST_Covers(a, b) FROM (SELECT 'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a, 'POINT (190 10)'::geometry AS b ) AS example;
f | t
A Polygon does not contain a LineString lying entirely on its boundary.
SELECT ST_Contains(a, b), ST_Covers(a, b) FROM (SELECT 'POLYGON ((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130))'::geometry AS a, 'LINESTRING (80 190,110 190,140 150,150 80)'::geometry AS b ) AS example;
f | t
This example tests a circle within another circle.
WITH circles AS (
SELECT ST_Buffer(center, 10) AS smallc,
ST_Buffer(center, 20) AS bigc
FROM (SELECT 'POINT(1 2)'::geometry AS center) AS p
)
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 circles;
-[ RECORD 1 ]----- smallcontainsbig | f bigcontainssmall | t bigcontainsunion | t bigisunion | t bigcoversexterior | t bigcontainsexterior | f
This example demonstrates the difference between contains and contains-properly predicates.
SELECT
ST_GeometryType(geom_a) AS geomtype,
ST_Contains(geom_a, geom_a) AS acontainsa,
ST_ContainsProperly(geom_a, geom_a) AS acontainspropa,
ST_Contains(geom_a, ST_Boundary(geom_a)) AS acontainsba,
ST_ContainsProperly(geom_a, ST_Boundary(geom_a)) 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(geom_a);
geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba --------------+------------+----------------+-------------+----------------- ST_Polygon | t | f | f | f ST_LineString | t | f | f | f ST_Point | t | t | f | f
ST_Boundary, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Equals, ST_Within
ST_ContainsProperly — Перевіряє, чи кожна точка B лежить у внутрішній частині A
boolean ST_ContainsProperly(geometry geomA, geometry geomB);
Повертає true, якщо кожна точка B лежить у внутрішній частині A (або, що еквівалентно, жодна точка B не лежить на межі або зовні A).
У математичних термінах: ST_ContainsProperly(A, B) ⇔ Int(A) ⋂ B = B
A містить B належним чином, якщо матриця перетину DE-9IM для двох геометрій збігається [T**FF*FF*]
A не містить себе належним чином, але містить себе.
Цей предикат використовується для обчислення перетинів набору геометрій з великою полігональною геометрією. Оскільки перетин є досить повільною операцією, ефективніше використовувати 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 увімкнув підтримку для GEOMETRYCOLLECTION
![]() | |
Не використовуйте цю функцію з недійсними геометріями. Ви отримаєте несподівані результати. |
This example tests a circle within another circle.
WITH circles AS (
SELECT ST_Buffer(center, 10) AS smallc,
ST_Buffer(center, 20) AS bigc
FROM (SELECT 'POINT(1 2)'::geometry AS center) AS p
)
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 circles;-[ RECORD 1 ]----- smallcontainspropbig | f bigcontainspropsmall | t bigcontainspropunion | f bigisunion | t bigcoversexterior | t bigcontainsexterior | f
This example demonstrates the difference between contains and contains-properly predicates.
WITH input(geom) AS (VALUES
(ST_Buffer(ST_Point(1, 1), 5, 1)),
(ST_MakeLine(ST_Point(1, 1), ST_Point(-1, -1))),
(ST_Point(1, 1))
)
SELECT ST_GeometryType(geom) AS geomtype,
ST_Contains(geom, geom) AS acontainsa,
ST_ContainsProperly(geom, geom) AS acontainspropa,
ST_Contains(geom, ST_Boundary(geom)) AS acontainsba,
ST_ContainsProperly(geom, ST_Boundary(geom)) AS acontainspropba
FROM input;geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba --------------+------------+----------------+-------------+----------------- ST_Polygon | t | f | f | f ST_LineString | t | f | f | f ST_Point | t | t | f | f
ST_GeometryType, ST_Boundary, ST_Contains, ST_Covers, ST_CoveredBy, ST_Equals, ST_Relate, ST_Within
ST_CoveredBy — Перевіряє, чи кожна точка A лежить в B
boolean ST_CoveredBy(geometry geomA, geometry geomB);
boolean ST_CoveredBy(geography geogA, geography geogB);
Повертає true, якщо кожна точка в геометрії/географії A лежить всередині (тобто перетинає внутрішню частину або межу) геометрії/географії B. Еквівалентно, перевіряє, що жодна точка A не лежить поза (зовні) B.
У математичних термінах: ST_CoveredBy(A, B) ⇔ A ⋂ B = A
ST_CoveredBy є оберненим до ST_Covers. Отже, ST_CoveredBy(A,B) = ST_Covers(B,A).
Як правило, цю функцію слід використовувати замість ST_Within, оскільки вона має простіше визначення, яке не містить особливості, що "межі не знаходяться всередині їх геометрії".
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. Щоб уникнути використання індексу, використовуйте функцію |
Покращено: 3.0.0 увімкнув підтримку для GEOMETRYCOLLECTION
![]() | |
Не використовуйте цю функцію з недійсними геометріями. Ви отримаєте несподівані результати. |
Виконано модулем GEOS
Доступність: 1.2.2
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число.
Це не стандарт OGC, але Oracle теж його має.
This example tests a circle covered by another circle.
WITH circles AS (
SELECT ST_Buffer(center, 10) AS smallc,
ST_Buffer(center, 20) AS bigc
FROM (SELECT 'POINT(1 2)'::geometry AS center) AS p
)
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 exteriorwithinbig
FROM circles;smallinsmall | smallcoveredbybig | exteriorcoveredbybig | exteriorwithinbig --------------+-------------------+----------------------+------------------ t | t | t | f (1 row)
ST_Covers — Перевіряє, чи кожна точка B лежить в A
boolean ST_Covers(geometry geomA, geometry geomB);
boolean ST_Covers(geography geogpolyA, geography geogpointB);
Повертає true, якщо кожна точка в геометрії/географії B лежить всередині (тобто перетинає внутрішню частину або межу) геометрії/географії A. Еквівалентно, перевіряє, що жодна точка B не лежить поза (зовні) A.
У математичних термінах: ST_Covers(A, B) ⇔ A ⋂ B = B
ST_Covers є оберненим до ST_CoveredBy. Отже, ST_Covers(A,B) = ST_CoveredBy(B,A).
Як правило, цю функцію слід використовувати замість ST_Contains, оскільки вона має простіше визначення, яке не містить особливості, що "геометрії не містять своїх меж".
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. Щоб уникнути використання індексу, використовуйте функцію |
Покращено: 3.0.0 увімкнув підтримку для GEOMETRYCOLLECTION
![]() | |
Не використовуйте цю функцію з недійсними геометріями. Ви отримаєте несподівані результати. |
Виконано модулем GEOS
Покращено: 2.4.0 Додано підтримку полігону в полігоні та лінії в полігоні для типу географії
Покращено: 2.3.0 Покращення короткого замикання PIP для геометрії, розширене для підтримки MultiPoints з невеликою кількістю точок. Попередні версії підтримували тільки точки в багатокутниках.
Доступність: 1.5 — додано підтримку географії.
Доступність: 1.2.2
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число.
Це не стандарт OGC, але Oracle теж його має.
Приклад геометрії
This example tests a circle covering another circle.
WITH circles AS (
SELECT ST_Buffer(center, 10) AS smallc,
ST_Buffer(center, 20) AS bigc
FROM (SELECT 'POINT(1 2)'::geometry AS center) AS p
)
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 circles;smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior --------------+----------------+-------------------+--------------------- t | f | t | f (1 row)
Geography example
This example compares a point with a 300-meter buffer against a point and against a 10-meter buffer around that point.
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('SRID=4326;POINT(-99.327 31.4821)'::geography, 300) As geog_poly,
'SRID=4326;POINT(-99.33 31.483)'::geography As geog_pt ) As foo;poly_covers_pt | buff_10m_covers_cent ----------------+------------------ f | t
ST_Crosses — Перевіряє, чи дві геометрії мають деякі, але не всі внутрішні точки спільні
boolean ST_Crosses(geometry g1, geometry g2);
Порівнює два геометричні об'єкти і повертає true, якщо їх перетин "просторово перетинається", тобто геометрії мають деякі, але не всі внутрішні точки спільні. Перетин внутрішніх частин геометрій повинен бути не порожнім і мати розмірність, меншу за максимальну розмірність двох вхідних геометрій, а перетин двох геометрій не повинен дорівнювати жодній з геометрій. В іншому випадку повертається false. Відношення перетину є симетричним і нерефлексивним.
У математичних термінах: ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) <max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)
Геометрії перетинаються, якщо їх матриця перетину DE-9IM збігається:
T*T****** для ситуацій "точка/лінія", "точка/площа" та "лінія/площа"
T*****T** для ситуацій "лінія/точка", "площа/точка" та "площа/лінія"
0******** для ситуацій "лінія/лінія"
результатом є false для ситуацій "точка/точка" та "площа/площа"
![]() | |
Специфікація OpenGIS Simple Features визначає цей предикат тільки для ситуацій "Точка/Лінія", "Точка/Площа", "Лінія/Лінія" та "Лінія/Площа". 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 увімкнув підтримку для GEOMETRYCOLLECTION
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.
A LineString crosses a MultiPoint when some, but not all, points lie on the line.
SELECT ST_Crosses(a, b) FROM (SELECT 'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a, 'MULTIPOINT (80 170,120 13,130 120,181 142)'::geometry AS b ) AS example;
t
A Polygon crosses a MultiPoint when some, but not all, points lie in its interior.
SELECT ST_Crosses(a, b) FROM (SELECT 'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a, 'MULTIPOINT (56 60,120 13,130 119,181 142)'::geometry AS b ) AS example;
t
A LineString crosses a Polygon when part of the line lies inside and part outside.
SELECT ST_Crosses(a, b) FROM (SELECT 'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a, 'LINESTRING (30 40,70 50,120 150,190 190)'::geometry AS b ) AS example;
t
Two LineStrings cross when they share an interior point.
SELECT ST_Crosses(a, b) FROM (SELECT 'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a, 'LINESTRING (10 10,70 30,110 120,190 190)'::geometry AS b ) AS example;
t
Розглянемо ситуацію, коли користувач має дві таблиці: таблицю доріг і таблицю автомагістралей.
Code CREATE TABLE roads ( id serial NOT NULL, geom geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
Code CREATE TABLE highways ( id serial NOT NULL, the_gem geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
Щоб визначити список доріг, які перетинають шосе, використовуйте запит, подібний до:
SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.geom, highways.geom);
ST_Disjoint — Перевіряє, чи дві геометрії не мають спільних точок
boolean ST_Disjoint( geometry A , geometry B );
Повертає true, якщо дві геометрії не перетинаються. Геометрії не перетинаються, якщо вони не мають спільних точок.
Якщо для пари геометрій справедливе будь-яке інше просторове відношення, вони не є роз'єднаними. Роз'єднаність означає, що ST_Intersects є хибним.
У математичних термінах: ST_Disjoint(A, B) ⇔ A ⋂ B = ∅
Покращено: 3.0.0 увімкнув підтримку для GEOMETRYCOLLECTION
Виконано модулем GEOS
![]() | |
Цей виклик функції не використовує індекси. Негативний предикат ST_Intersectsможна використовувати як більш ефективну альтернативу, яка використовує індекси: |
![]() | |
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число. |
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
SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);t
SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);f
ST_Equals — Перевіряє, чи дві геометрії містять однаковий набір точок
boolean ST_Equals(geometry A, geometry B);
Повертає true, якщо задані геометрії є "топологічно рівними". Використовуйте це для отримання "кращої" відповіді, ніж "=". Топологічна рівність означає, що геометрії мають однаковий розмір, а їхні набори точок займають однаковий простір. Це означає, що порядок вершин може бути різним у топологічно рівних геометріях. Щоб перевірити, чи порядок точок є послідовним, використовуйте ST_OrderingEquals (слід зауважити, що ST_OrderingEquals є дещо суворішим, ніж проста перевірка того, чи порядок точок є однаковим).
У математичних термінах: ST_Equals(A, B) ⇔ A = B
Діє наступне співвідношення: ST_Equals(A, B) ⇔ ST_Within(A,B) ∧ ST_Within(B,A)
Покращено: 3.0.0 увімкнув підтримку для GEOMETRYCOLLECTION
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 навіть для недійсних геометрій, якщо вони є бінарними рівними
SELECT ST_Equals('LINESTRING(0 0,10 10)',
'LINESTRING(0 0,5 5,10 10)');t
SELECT ST_Equals(ST_Reverse('LINESTRING(0 0,10 10)'),
'LINESTRING(0 0,5 5,10 10)');t
ST_Intersects — Перевіряє, чи перетинаються дві геометрії (чи мають вони хоча б одну спільну точку)
boolean ST_Intersects( geometry geomA , geometry geomB );
boolean ST_Intersects( geography geogA , geography geogB );
Повертає true, якщо дві геометрії перетинаються. Геометрії перетинаються, якщо вони мають спільну точку.
Для географії використовується допуск відстані 0,00001 метра (тобто точки, які знаходяться дуже близько одна до одної, вважаються пересічними).
У математичних термінах: ST_Intersects(A, B) ⇔ A ⋂ B ≠ ∅
Геометрії перетинаються, якщо їх матриця перетину DE-9IM відповідає одній з наступних:
T********
*T*******
***T*****
****T****
Просторове перетин передбачається всіма іншими тестами просторових відносин, за винятком ST_Disjoint, який перевіряє, що геометрії НЕ перетинаються.
![]() | |
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 TINS.
Покращено: 2.5.0 Підтримує GEOMETRYCOLLECTION.
Покращено: 2.3.0 Покращення короткого замикання PIP розширено для підтримки MultiPoints з невеликою кількістю точок. Попередні версії підтримували тільки точки в багатокутнику.
Виконується модулем 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_Disjoint(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);f
SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);t
This example looks up rows in a table; for faster lookup, the geometry column should have a GiST index.
SELECT id, name FROM cities WHERE ST_Intersects(geom, 'SRID=4326;POLYGON((28 53,27.707 52.293,27 52,26.293 52.293,26 53,26.293 53.707,27 54,27.707 53.707,28 53))');
id | name ----+------- 2 | Minsk (1 row)
SELECT ST_Intersects('SRID=4326;LINESTRING(-43.23456 72.4567,-43.23456 72.4568)'::geography,
'SRID=4326;POINT(-43.23456 72.4567772)'::geography
);t
ST_LineCrossingDirection — Повертає число, що вказує на поведінку перетину двох LineStrings
integer ST_LineCrossingDirection(geometry linestringA, geometry linestringB);
Задано дві лінії, повертає ціле число від -3 до 3, що вказує на тип перетину між ними. 0 означає відсутність перетину. Підтримується тільки для LINESTRINGs.
Номер перетину має таке значення:
0: ЛІНІЯ БЕЗ ПЕРЕТИНУ
-1: ПЕРЕТИН ЛІНІЇ ЗЛІВА
1: ПЕРЕТИН ЛІНІЇ СПРАВА
-2: КІНЕЦЬ ЛІНІЇ МУЛЬТИКРОС ЛІВОРУЧ
2: ЛІНІЯ МУЛЬТИКРОС КІНЕЦЬ СПРАВА
-3: ЛІНІЯ МУЛЬТИКРОС КІНЕЦЬ ТОЙ Ж САМИЙ ПЕРШИЙ ЗЛІВА
3: ЛІНІЯ МУЛЬТИКРОС КІНЕЦЬ ТОЙ Ж САМИЙ ПЕРШИЙ ПРАВОРУЧ
Доступність: 1.4
Приклад: ЛІНІЯ ПЕРЕТИНАЄ ЛІВОРУЧ і ЛІНІЯ ПЕРЕТИНАЄ ПРАВОРУЧ
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
'LINESTRING(25 169,89 114,40 70,86 43)'::geometry As lineA,
'LINESTRING (20 140,71 74,161 53)'::geometry As lineB
) As foo;A_cross_B | B_cross_A
-----------+-----------
-1 | 1Приклад:
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
'LINESTRING(25 169,89 114,40 70,86 43)'::geometry As lineA,
'LINESTRING(171 154,20 140,71 74,161 53)'::geometry As lineB
) As foo;A_cross_B | B_cross_A
-----------+-----------
3 | -3Приклад: ЛІНІЯ МУЛЬТИКРОС КІНЕЦЬ ТОЙ САМИЙ ПЕРШИЙ ЛІВИЙ і ЛІНІЯ МУЛЬТИКРОС КІНЕЦЬ ТОЙ САМИЙ ПЕРШИЙ ПРАВИЙ
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
'LINESTRING(25 169,89 114,40 70,86 43)'::geometry As lineA,
'LINESTRING(5 90,71 74,20 140,171 154)'::geometry As lineB
) As foo;A_cross_B | B_cross_A
-----------+-----------
-2 | 2Приклад:Знаходить всі вулиці, які перетинаються
SELECT s1.gid, s2.gid, ST_LineCrossingDirection(s1.geom, s2.geom)
FROM streets s1 CROSS JOIN streets s2
ON (s1.gid != s2.gid AND s1.geom && s2.geom )
WHERE ST_LineCrossingDirection(s1.geom, s2.geom)
> 0;
ST_OrderingEquals — Перевіряє, чи дві геометрії представляють одну і ту ж геометрію і мають точки в одному і тому ж порядку напрямків
boolean ST_OrderingEquals(geometry A, geometry B);
ST_OrderingEquals порівнює дві геометрії і повертає t (TRUE), якщо геометрії рівні і координати мають однаковий порядок; в іншому випадку повертає f (FALSE).
![]() | |
Ця функція реалізована відповідно до специфікації ArcSDE SQL, а не SQL-MM. http://edndoc.esri.com/arcsde/9.1/sql_api/sqlapi3.htm#ST_OrderingEquals |
This method implements the SQL/MM specification. SQL-MM 3: 5.1.43
SELECT ST_OrderingEquals('LINESTRING(0 0,10 10)',
'LINESTRING(0 0,5 5,10 10)');f
SELECT ST_OrderingEquals('LINESTRING(0 0,10 10)',
'LINESTRING(0 0,10 10)');t
SELECT ST_OrderingEquals('POLYGON((0 0,0 1,1 1,1 0,0 0))',
'POLYGON((0 0,1 0,1 1,0 1,0 0))');f
ST_Overlaps — Перевіряє, чи дві геометрії мають однакові розміри і перетинаються, але кожна з них має принаймні одну точку, яка не належить до іншої
boolean ST_Overlaps(geometry A, geometry B);
Повертає TRUE, якщо геометрії A і B "просторово перекриваються". Дві геометрії перекриваються, якщо вони мають однаковий розмір, їх внутрішні частини перетинаються в цьому розмірі і кожна з них має принаймні одну точку всередині іншої (або, що еквівалентно, жодна з них не покриває іншу). Відношення перекриття є симетричним і нерефлексивним.
У математичних термінах: ST_Overlaps(A, B) ⇔ ( dim(A) = dim(B) = dim( Int(A) ⋂ Int(B) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)
![]() | |
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 увімкнув підтримку для GEOMETRYCOLLECTION
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число.
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 у таких ситуаціях:
Two MultiPoints overlap when they share some, but not all, points.
SELECT ST_Overlaps(a, b) FROM (SELECT 'MULTIPOINT ((20 20),(40 90),(80 130),(140 100),(110 40),(120 170),(150 70))'::geometry AS a, 'MULTIPOINT ((180 10),(40 90),(80 130),(160 150),(110 40),(50 50),(50 160))'::geometry AS b ) AS example;
t
Two LineStrings overlap along part of their paths.
SELECT ST_Overlaps(a, b) FROM (SELECT 'LINESTRING (10 10,40 90,70 110,140 110,170 130,190 190)'::geometry AS a, 'LINESTRING (10 190,50 130,90 110,130 110,160 70,180 10)'::geometry AS b ) AS example;
t
Two Polygons overlap where their interiors intersect and neither contains the other.
SELECT ST_Overlaps(a, b) FROM (SELECT 'POLYGON ((140 140,140 122,135 105,126 100,118 99,110 94,100 86,97 73,102 59,98 49,87 38,70 30,55 29,40 30,28 38,20 50,14 66,10 84,6 100,4 119,4 143,6 166,10 180,18 191,28 195,40 190,55 189,67 186,86 179,112 165,124 158,133 148,140 140),(48 177,40 177,30 174,24 166,22 159,25 155,30 153,40 154,45 157,52 162,53 169,51 174,48 177))'::geometry AS a, 'POLYGON ((75 63,79 50,87 38,95 31,108 25,124 22,140 18,154 11,166 6,176 10,184 21,188 35,190 58,190 82,193 104,190 121,185 139,178 154,166 163,154 171,139 172,124 171,112 165,96 152,92 142,92 126,86 116,79 110,75 104,72 94,73 86,75 76,75 63))'::geometry AS b ) AS example;
t
Точка на лінійному елементі міститься, але оскільки вона має менший розмір, вона не перетинається і не перекривається.
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 'POINT (100 100)'::geometry As a,
'LINESTRING (30 50,40 160,160 40,180 160)'::geometry AS b) AS toverlaps | 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 'POLYGON ((40 170,90 30,180 100,40 170))'::geometry AS a,
'LINESTRING(10 10,190 190)'::geometry 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 'POLYGON ((40 170,90 30,180 100,40 170))'::geometry AS a,
'POLYGON ((110 180,20 60,130 90,110 180))'::geometry 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. Використання явного шаблону дозволяє перевірити кілька умов перетину, перехрещення тощо за один крок. Це також дозволяє перевірити просторові відносини, які не мають іменованої функції просторових відносин. Наприклад, відношення "Внутрішнє перетинання" має шаблон DE-9IM T********, який не оцінюється жодним іменованим предикатом.
Для отримання додаткової інформації див. Розділ 5.1, «Determining Spatial Relationships».
Варіант 1: Перевіряє, чи дві геометрії пов'язані просторово відповідно до заданого intersectionMatrixPattern.
![]() | |
На відміну від більшості названих предикатів просторових відносин, це НЕ включає автоматичний виклик індексу. Причина полягає в тому, що деякі відносини є істинними для геометрій, які НЕ перетинаються (наприклад, Disjoint). Якщо ви використовуєте шаблон відносин, який вимагає перетину, включіть виклик індексу &&. |
![]() | |
Краще використовувати функцію іменованих відносин, якщо вона доступна, оскільки вона автоматично використовує просторовий індекс, якщо такий існує. Крім того, вона може реалізовувати оптимізацію продуктивності, яка недоступна при повній оцінці відносин. |
Варіант 2: Повертає матричний рядок DE-9IM для просторового відношення між двома вхідними геометріями. Матричний рядок можна перевірити на відповідність шаблону DE-9IM за допомогою ST_RelateMatch.
Варіант 3: Як і варіант 2, але дозволяє вказати правило межового вузла. Правило межового вузла дозволяє більш точно контролювати, чи кінцеві точки MultiLineStrings вважаються такими, що лежать у внутрішній частині DE-9IM або на межі. Значення boundaryNodeRule є такими:
1: OGC-Mod2 — кінцеві точки лінії знаходяться в межах межі, якщо їх кількість непарна. Це правило визначено стандартом OGC SFS і є стандартним для функції ST_Relate.
2: Кінцева точка — всі кінцеві точки знаходяться в межі.
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 увімкнув підтримку для GEOMETRYCOLLECTION
Використання функції з булевим значенням для перевірки просторових взаємозв'язків.
SELECT ST_Relate('POINT(1 2)', ST_Buffer('POINT(1 2)', 2), '0FFFFF212');t
SELECT ST_Relate('POINT(1 2)', ST_Buffer('POINT(1 2)', 2), '*FF*FF212');t
Тестування власного шаблону просторових відносин як умови запиту за допомогою && для уможливлення використання просторового індексу.
Find compounds that properly intersect (not just touch) a poly (Interior Intersects)
SELECT c.* , p.name As poly_name
FROM polys AS p
INNER JOIN compounds As c
ON c.geom && p.geom
AND ST_Relate(p.geom, c.geom, 'T********');
Обчислення матриці перетину для просторових відносин.
SELECT ST_Relate('POINT(1 2)',
ST_Buffer('POINT(1 2)', 2));0FFFFF212
SELECT ST_Relate('LINESTRING(1 2,3 4)',
'LINESTRING(5 6,7 8)' );FF1FF0102
Використання різних правил граничних вузлів для обчислення просторових відносин між LineString і MultiLineString з дублюючою кінцевою точкою (3 3):
Використовуючи правило OGC-Mod2 (1), дубльована кінцева точка знаходиться в всередині MultiLineString, тому запис матриці DE-9IM [aB:bI] дорівнює 0, а [aB:bB] дорівнює F.
Використовуючи правило Endpoint (2), дубльована кінцева точка знаходиться в межі MultiLineString, тому запис матриці DE-9IM [aB:bI] дорівнює F, а [aB:bB] дорівнює 0.
WITH data AS (SELECT
'LINESTRING(1 1,3 3)'::geometry AS a_line,
'MULTILINESTRING((3 3,3 5),(3 3,5 3))'::geometry AS b_multiline
)
SELECT ST_Relate(a_line, b_multiline, 1) AS bnr_mod2,
ST_Relate(a_line, b_multiline, 2) AS bnr_endpoint
FROM data;bnr_mod2 | bnr_endpoint -----------+-------------- FF10F0102 | FF1F00102
ST_RelateMatch — Перевіряє, чи відповідає матриця перетину DE-9IM шаблону матриці перетину
boolean ST_RelateMatch(text intersectionMatrix, text intersectionMatrixPattern);
Перевіряє, чи значення intersectionMatrix моделі Dimensionally Extended 9-Intersection Model (DE-9IM) відповідає intersectionMatrixPattern. Значення матриці перетину можна обчислити за допомогою ST_Relate.
Для отримання додаткової інформації див. Розділ 5.1, «Determining Spatial Relationships».
Виконано модулем GEOS
Доступність: 2.0.0
SELECT ST_RelateMatch('101202FFF', 'TTTTTTFFF') ;t
Шаблони для загальних просторових відносин, що відповідають значенням матриці перетину, для лінії в різних положеннях відносно багатокутника
SELECT pat.name AS relationship, pat.val AS pattern,
mat.name AS position, mat.val AS matrix,
ST_RelateMatch(mat.val, pat.val) AS match
FROM (VALUES ( 'Equality', 'T1FF1FFF1' ),
( 'Overlaps', 'T*T***T**' ),
( 'Within', 'T*F**F***' ),
( 'Disjoint', 'FF*FF****' )) AS pat(name, val)
CROSS JOIN
(VALUES ('non-intersecting', 'FF1FF0212'),
('overlapping', '1010F0212'),
('inside', '1FF0FF212')) AS mat(name, val);relationship | pattern | position | matrix | match --------------+-----------+------------------+-----------+------- Equality | T1FF1FFF1 | non-intersecting | FF1FF0212 | f Equality | T1FF1FFF1 | overlapping | 1010F0212 | f Equality | T1FF1FFF1 | inside | 1FF0FF212 | f Overlaps | T*T***T** | non-intersecting | FF1FF0212 | f Overlaps | T*T***T** | overlapping | 1010F0212 | t Overlaps | T*T***T** | inside | 1FF0FF212 | f Within | T*F**F*** | non-intersecting | FF1FF0212 | f Within | T*F**F*** | overlapping | 1010F0212 | f Within | T*F**F*** | inside | 1FF0FF212 | t Disjoint | FF*FF**** | non-intersecting | FF1FF0212 | t Disjoint | FF*FF**** | overlapping | 1010F0212 | f Disjoint | FF*FF**** | inside | 1FF0FF212 | f
ST_Touches — Перевіряє, чи мають дві геометрії хоча б одну спільну точку, але їхні внутрішні частини не перетинаються
boolean ST_Touches(geometry A, geometry B);
Повертає TRUE, якщо A і B перетинаються, але їх внутрішні частини не перетинаються. Іншими словами, A і B мають принаймні одну спільну точку, і спільні точки лежать принаймні на одній межі. Для вхідних даних Point/Point відношення завжди є FALSE, оскільки точки не мають меж.
У математичних термінах: ST_Touches(A, B) ⇔ (Int(A) ⋂ Int(B) = ∅) ∧ (A ⋂ B ≠ ∅)
Ця залежність зберігається, якщо матриця перетину 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 увімкнув підтримку для GEOMETRYCOLLECTION
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 у наведених нижче прикладах.
Two Polygons touching along a boundary segment.
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190))'::geometry AS a, 'POLYGON ((80 110,140 140,190 110,180 40,140 10,80 50,80 70,80 110))'::geometry AS b ) AS example;
t
Two Polygons touching at a boundary point.
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190))'::geometry AS a, 'POLYGON ((140 140,190 110,180 40,140 10,80 70,140 140))'::geometry AS b ) AS example;
t
A Polygon and a LineString touching at the line endpoint.
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((80 10,50 40,50 90,80 130,140 120,160 70,140 30,80 10))'::geometry AS a, 'LINESTRING (30 190,180 150,160 70)'::geometry AS b ) AS example;
t
Two LineStrings touching at their endpoints.
SELECT ST_Touches(a, b) FROM (SELECT 'LINESTRING (10 10,60 140,140 190)'::geometry AS a, 'LINESTRING (140 190,190 10)'::geometry AS b ) AS example;
t
Two LineStrings touching where an endpoint meets the other line.
SELECT ST_Touches(a, b) FROM (SELECT 'LINESTRING (10 10,60 140,140 190)'::geometry AS a, 'LINESTRING (60 140,190 10)'::geometry AS b ) AS example;
t
A Point touching a Polygon boundary.
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((30 30,10 110,40 190,120 170,180 180,170 100,130 10,30 30))'::geometry AS a, 'POINT (170 100)'::geometry AS b ) AS example;
t
SELECT ST_Touches('LINESTRING(0 0,1 1,0 2)'::geometry, 'POINT(1 1)'::geometry);f
SELECT ST_Touches('LINESTRING(0 0,1 1,0 2)'::geometry, 'POINT(0 2)'::geometry);t
ST_Within — Перевіряє, чи кожна точка A лежить в B, і чи мають їхні внутрішні частини спільну точку
boolean ST_Within(geometry A, geometry B);
Повертає TRUE, якщо геометрія A знаходиться всередині геометрії B. A знаходиться всередині B тоді і тільки тоді, коли всі точки A лежать всередині (тобто в середині або на межі) B (або, що еквівалентно, жодна точка A не лежить поза межами B), і внутрішні частини A і B мають принаймні одну спільну точку.
Щоб ця функція мала сенс, геометрії джерел повинні мати однакову проекцію координат та однаковий SRID.
У математичних термінах: ST_Within(A, B) ⇔ (A ⋂ B = A) ∧ (Int(A) ⋂ Int(B) ≠ ∅)
Внутрішнє відношення є рефлексивним: кожна геометрія знаходиться всередині себе. Відношення є антисиметричним: якщо ST_Within(A,B) = true і ST_Within(B,A) = true, то дві геометрії повинні бути топологічно рівними (ST_Equals(A,B) = true).
ST_Within є оберненим до ST_Contains. Отже, ST_Within(A,B) = ST_Contains(B,A).
![]() | |
Оскільки внутрішні частини повинні мати спільну точку, тонкість визначення полягає в тому, що лінії та точки, які повністю лежать на межі полігонів або ліній, не входять до геометрії. Для отримання додаткової інформації див. Тонкощі OGC Covers, Contains, Within. Предикат ST_CoveredBy забезпечує більш всеосяжне відношення. |
![]() | |
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 для геометрії, розширене для підтримки MultiPoints з невеликою кількістю точок. Попередні версії підтримували тільки точки в багатокутниках.
Покращено: 3.0.0 увімкнув підтримку для GEOMETRYCOLLECTION
![]() | |
Не використовуйте цю функцію з недійсними геометріями. Ви отримаєте несподівані результати. |
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число.
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
This example defines two concentric circles once in a CTE so the same inputs can be rendered and then reused in related predicate checks.
WITH circles AS (
SELECT ST_Buffer(center, 20) AS smallc,
ST_Buffer(center, 40) AS bigc
FROM (SELECT 'POINT(50 50)'::geometry AS center) AS p
)
SELECT smallc AS small_circle,
bigc AS big_circle
FROM circles;POLYGON((70 50,69.616 46.098,68.478 42.346,66.629 38.889,64.142 35.858,61.111 33.371,57.654 31.522,53.902 30.384,50 30,46.098 30.384,42.346 31.522,38.889 33.371,35.858 35.858,33.371 38.889,31.522 42.346,30.384 46.098,30 50,30.384 53.902,31.522 57.654,33.371 61.111,35.858 64.142,38.889 66.629,42.346 68.478,46.098 69.616,50 70,53.902 69.616,57.654 68.478,61.111 66.629,64.142 64.142,66.629 61.111,68.478 57.654,69.616 53.902,70 50)) | POLYGON((90 50,89.231 42.196,86.955 34.693,83.259 27.777,78.284 21.716,72.223 16.741,65.307 13.045,57.804 10.769,50 10,42.196 10.769,34.693 13.045,27.777 16.741,21.716 21.716,16.741 27.777,13.045 34.693,10.769 42.196,10 50,10.769 57.804,13.045 65.307,16.741 72.223,21.716 78.284,27.777 83.259,34.693 86.955,42.196 89.231,50 90,57.804 89.231,65.307 86.955,72.223 83.259,78.284 78.284,83.259 72.223,86.955 65.307,89.231 57.804,90 50))
Using the same circles, ST_Within is reflexive on each circle, false from the larger circle into the smaller one, and true for ST_Union only when the union does not extend beyond the larger circle.
WITH circles AS (
SELECT ST_Buffer(center, 20) AS smallc,
ST_Buffer(center, 40) AS bigc
FROM (SELECT 'POINT(50 50)'::geometry AS center) AS p
)
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 circles;t | t | f | t | t | t
ST_3DDWithin — Перевіряє, чи дві 3D-геометрії знаходяться в межах заданої 3D-відстані
boolean ST_3DDWithin(geometry g1, geometry g2, double precision distance_of_srid);
Повертає значення true, якщо 3D-відстань між двома геометричними значеннями не перевищує відстань 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
Compare the same transformed point and line in both 3D and 2D. The 3D test fails because the Z difference matters even though the 2D footprints are close enough.
WITH sample AS (
SELECT ST_Transform('SRID=4326;POINT(-72.1235 42.3521 4)'::geometry, 2163) AS input_point,
ST_Transform(
'SRID=4326;LINESTRING(-72.1260 42.45 15,-72.123 42.1546 20)'::geometry,
2163
) AS input_line
)
SELECT ST_3DDWithin(input_point, input_line, 126.8) AS within_dist_3d,
ST_DWithin(input_point, input_line, 126.8) AS within_dist_2d,
input_point AS input_point,
input_line AS input_line
FROM sample;-[ RECORD 1 ]--+---------------------------------------------------------------------------------------------------------------------------------- within_dist_3d | f within_dist_2d | t input_point | POINT Z (-11774128.9 5237160.2 4) input_line | LINESTRING Z (-11774339.5 5243556.8 15,-11773706.7 5215256.3 20)
ST_3DDFullyWithin — Перевіряє, чи дві 3D-геометрії повністю знаходяться в межах заданої 3D-відстані
boolean ST_3DDFullyWithin(geometry g1, geometry g2, double precision distance);
Повертає значення true, якщо 3D-геометрії повністю знаходяться на заданій відстані одна від одної. Відстань задається в одиницях, визначених просторовою системою координат геометрій. Щоб ця функція мала сенс, вихідні геометрії повинні мати однакову проекцію координат і однаковий 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 example compares distance-within predicates in 2D and 3D. The point is distance-within the line in 3D, but the full 3D line is not within the same distance of the point.
WITH data AS (
SELECT
'POINT(1 1 2)'::geometry AS geom_a,
'LINESTRING(1 5 2,2 7 20,1 9 100,14 12 3)'::geometry AS geom_b
)
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 data;
d3dfullywithin10 | d3dwithin10 | d2dfullywithin20 | d3dfullywithin20 ------------------+-------------+------------------+------------------ f | t | t | f
ST_DFullyWithin — Перевіряє, чи геометрія повністю знаходиться в межах відстані від іншої
boolean ST_DFullyWithin(geometry g1, geometry g2, double precision distance);
Повертає значення true, якщо g2 повністю знаходиться в межах distance від g1. Візуально умова є істинною, якщо g2 знаходиться в межах буфера distance від g1. Відстань вказується в одиницях, визначених просторовою системою координат геометрій.
![]() | |
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
Доступність: 1.5.0
Змінено: 3.5.0: логіка функції тепер використовує перевірку вмісту в буфері, а не алгоритм ST_MaxDistance. Результати будуть відрізнятися від попередніх версій, але повинні бути ближчими до очікувань користувачів.
SELECT
ST_DFullyWithin(geom_a, geom_b, 10) AS DFullyWithin10,
ST_DWithin(geom_a, geom_b, 10) AS DWithin10,
ST_DFullyWithin(geom_a, geom_b, 20) AS DFullyWithin20
FROM (VALUES
('POINT(1 1)'::geometry, 'LINESTRING(1 5,2 7,1 9,14 12)'::geometry)
) AS v(geom_a, geom_b)dfullywithin10 | dwithin10 | dfullywithin20 ----------------+-----------+---------------- f | t | t
ST_DWithin — Перевіряє, чи дві геометрії знаходяться на заданій відстані одна від одної
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid = true);
Повертає значення true, якщо геометрії знаходяться в межах заданої відстані
Для geometry: Відстань вказується в одиницях, визначених просторовою системою координат геометрій. Щоб ця функція мала сенс, вихідні геометрії повинні бути в одній системі координат (мати однаковий SRID).
Для geography: одиниці виміру в метрах, а вимірювання відстані за замовчуванням виконується за допомогою use_spheroid = true. Для прискорення обчислень використовуйте use_spheroid = false для вимірювання на сфері.
![]() | |
Для 3D-геометрій використовуйте ST_3DDWithin. |
![]() | |
Цей виклик функції включає порівняння обмежувальної рамки, яке використовує будь-які індекси, доступні для геометрій. |
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 використовує швидшу функцію короткого замикання відстані.
This self-contained geometry example keeps the compared shapes visible while also returning the boolean results.
WITH sample AS (
SELECT ST_Buffer('POINT(100 90)'::geometry, 50, 'quad_segs=2') AS coverage,
ST_Point(120, 120) AS inside_pt,
ST_Point(170, 90) AS outside_pt
)
SELECT ST_DWithin(coverage, inside_pt, 0) AS inside_now,
ST_DWithin(coverage, outside_pt, 10) AS outside_within_10,
coverage AS coverage_geom,
inside_pt AS inside_geom,
outside_pt AS outside_geom
FROM sample;-[ RECORD 1 ]----- inside_now | t outside_within_10 | f coverage_geom | POLYGON((150 90,135 55,100 40,65 55,50 90,65 125,100 140,135 125,150 90)) inside_geom | POINT(120 120) outside_geom | POINT(170 90)
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 are in units of spatial reference (for example meters, feet, or 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 locations more than 3000 units away from their nearest hospital. Use NOT EXISTS so that a location is returned only when no nearby hospital exists.
SELECT l.location_name
FROM locations l
WHERE NOT EXISTS (
SELECT 1
FROM hospitals h
WHERE ST_DWithin(l.geom, h.geom, 3000)
);
Find broadcasting towers that a receiver with limited range can receive. Data is geometry in Spherical Mercator (SRID=3857), ranges are approximate.
CREATE INDEX ON broadcasting_towers USING gist (geom); CREATE INDEX ON broadcasting_towers USING gist (ST_Expand(geom, sending_range));
Query towers that a 4-kilometer receiver in Minsk Hackerspace can get. Note: two conditions are required because the shorter LEAST(b.sending_range, 4000) will not use an 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 і радіусом radius.
![]() | |
Не використовує просторові індекси. Замість цього використовуйте ST_DWithin. |
Доступність: 1.2
Змінено: 2.2.0 У попередніх версіях це називалося ST_Point_Inside_Circle
SELECT ST_PointInsideCircle(ST_Point(1, 2), 0.5, 2, 3);
t
Ці функції обчислюють відстані, площі та кути. Існують також функції для обчислення геометричних величин, визначених за вимірами.
ST_LengthST_Perimeter.ST_Area — Повертає площу полігональної геометрії.
float ST_Area(geometry g1);
float ST_Area(geography geog, boolean use_spheroid = true);
Повертає площу полігональної геометрії. Для типів геометрії обчислюється площина 2D (плоска) з одиницями, визначеними SRID. Для типів географії за замовчуванням площа визначається на сфероїді з одиницями в квадратних метрах. Для обчислення площі за допомогою швидшої, але менш точної сферичної моделі використовуйте ST_Area(geog,false).
Покращено: 2.0.0 - додано підтримку 2D багатогранних поверхонь.
Покращено: 2.2.0 — вимірювання на сфероїді виконується за допомогою GeographicLib для підвищення точності та надійності. Для використання нової функції потрібно PROJ >= 4.9.0.
Змінено: 3.0.0 - більше не залежить від SFCGAL.
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) AS sqft,
ST_Area(geom) * 0.3048 ^ 2 AS sqm
FROM (
SELECT 'SRID=2249;POLYGON((743238 2967416,743238 2967450,
743265 2967450,743265.625 2967416,743238 2967416))'::geometry AS geom
) AS subquery;sqft | sqm --------+------------- 928.625 | 86.27208552
Return area square feet and transform to Massachusetts state plane meters (EPSG:26986) to get square meters. Note this is in square feet because 2249 is Massachusetts State Plane Feet and transformed area is in square meters since EPSG:26986 is state plane Massachusetts meters.
SELECT ST_Area(geom) AS sqft,
round(ST_Area(ST_Transform(geom, 26986))::numeric, 6) AS sqm
FROM (
SELECT 'SRID=2249;POLYGON((743238 2967416,743238 2967450,
743265 2967450,743265.625 2967416,743238 2967416))'::geometry AS geom
) AS subquery;sqft | sqm --------+----------- 928.625 | 86.272431
Поверніть площу в квадратних футах і квадратних метрах, використовуючи тип даних "географія". Зверніть увагу, що ми перетворюємо геометрію в географію (перед тим, як це зробити, переконайтеся, що ваша геометрія відповідає стандарту WGS 84 long lat 4326). Географія завжди вимірюється в метрах. Це лише для демонстрації та порівняння. Зазвичай ваша таблиця вже зберігається в типі даних "географія".
SELECT round((ST_Area(geog) / 0.3048 ^ 2)::numeric, 2) AS sqft_spheroid,
round((ST_Area(geog, false) / 0.3048 ^ 2)::numeric, 2) AS sqft_sphere,
round(ST_Area(geog)::numeric, 2) AS sqm_spheroid
FROM (
SELECT ST_Transform(
'SRID=2249;POLYGON((743238 2967416,743238 2967450,
743265 2967450,743265.625 2967416,743238 2967416))'::geometry,
4326
)::geography AS geog
) AS subquery;sqft_spheroid | sqft_sphere | sqm_spheroid
----------------+-------------+--------------
928.68 | 926.61 | 86.28Якщо ваші дані вже знаходяться в географії:
SELECT ST_Area(geog) / 0.3048 ^ 2 AS sqft,
ST_Area(the_geog) AS sqm
FROM somegeogtable;CG_3DArea, ST_GeomFromText, ST_GeographyFromText, ST_SetSRID, ST_Transform
ST_Azimuth — Повертає азимут на північ від лінії між двома точками.
float ST_Azimuth(geometry origin, geometry target);
float ST_Azimuth(geography origin, geography target);
Повертає азимут в радіанах від точки відліку до точки призначення або NULL, якщо ці дві точки збігаються. Кут азимута є додатним кутом за годинниковою стрілкою, відлічуваним від додатної осі Y (геометрія) або північного меридіана (географія): Північ = 0; Північний схід = π/4; Схід = π/2; Південний схід = 3π/4; Південь = π; Південний захід 5π/4; Захід = 3π/2; Північний захід = 7π/4.
Для типу географії рішення азимута відоме як обернена геодезична задача.
Азимут — це математичне поняття, яке визначається як кут між опорним вектором і точкою, вимірюється в радіанах. Результат у радіанах можна перетворити в градуси за допомогою функції PostgreSQL degrees().
For offsetting lines relative to their direction, use ST_OffsetCurve. For projecting a point by distance and bearing, use ST_Project.
Доступність: 1.1.0
Покращено: 2.0.0 додано підтримку географії.
Покращено: вимірювання 2.2.0 на сфероїді, виконане за допомогою GeographicLib для підвищення точності та надійності. Для використання нової функції потрібно PROJ >= 4.9.0.
Геометрія Азимут у градусах
SELECT degrees(ST_Azimuth(ST_Point(25, 45), ST_Point(75, 100))) AS degA_B,
degrees(ST_Azimuth(ST_Point(75, 100), ST_Point(25, 45) )) AS degB_A;dega_b | degb_a ------------------+------------------ 42.27368900609371 | 222.27368900609372
Compass direction labels can be computed from the azimuth.
WITH directions(deg) AS (VALUES
(0), (45), (90), (135), (180), (225), (270), (315)
),
bearings AS (
SELECT deg,
degrees(ST_Azimuth(ST_Point(0, 0),
ST_MakePoint(sin(radians(deg)),
cos(radians(deg))))) AS azimuth
FROM directions
)
SELECT deg,
round(azimuth::numeric, 1) AS azimuth,
(ARRAY['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW', 'N'])
[floor((azimuth + 22.5) / 45)::int + 1] AS direction
FROM bearings
ORDER BY deg;deg | azimuth | direction -----+---------+----------- 0 | 0.0 | N 45 | 45.0 | NE 90 | 90.0 | E 135 | 135.0 | SE 180 | 180.0 | S 225 | 225.0 | SW 270 | 270.0 | W 315 | 315.0 | NW
Azimuth from Point(25, 45) to Point(75, 100), shown against the positive Y axis (north).
WITH points AS (
SELECT 'POINT(25 45)'::geometry AS origin,
'POINT(75 100)'::geometry AS target
)
SELECT round(degrees(ST_Azimuth(origin, target))::numeric, 6) AS degrees,
ST_MakeLine(origin, ST_Translate(origin, 0, 105)) AS north,
ST_MakeLine(origin, target) AS direction
FROM points;42.273689 | LINESTRING(25 45,25 150) | LINESTRING(25 45,75 100)
Reverse azimuth from Point(75, 100) to Point(25, 45).
WITH points AS (
SELECT 'POINT(75 100)'::geometry AS origin,
'POINT(25 45)'::geometry AS target
)
SELECT round(degrees(ST_Azimuth(origin, target))::numeric, 6) AS degrees,
ST_MakeLine(origin, ST_Translate(origin, 0, 90)) AS north,
ST_MakeLine(origin, target) AS direction
FROM points;222.273689 | LINESTRING(75 100,75 190) | LINESTRING(75 100,25 45)
ST_Angle, ST_Point, ST_Translate, ST_Project, Математичні функції PostgreSQL
ST_Angle — Повертає кут між двома векторами, визначеними 3 або 4 точками, або 2 лініями.
float ST_Angle(geometry point1, geometry point2, geometry point3, geometry point4);
float ST_Angle(geometry line1, geometry line2);
Обчислює кут за годинниковою стрілкою між двома векторами.
Варіант 1: обчислює кут, утворений точками P1-P2-P3. Якщо вказано четверту точку, обчислюється кут між точками P1-P2 і P3-P4
Варіант 2: обчислює кут між двома векторами S1-E1 і S2-E2, визначеними початковою і кінцевою точками вхідних ліній
Результатом є позитивний кут між 0 і 2π радіанами. Результат у радіанах можна перетворити на градуси за допомогою функції PostgreSQL degrees().
Зверніть увагу, що ST_Angle(P1,P2,P3) = ST_Angle(P2,P1,P2,P3).
Доступність: 2.5.0
Кут між трьома точками
SELECT degrees(ST_Angle('POINT(0 0)', 'POINT(10 10)', 'POINT(20 0)'));270
Кут між векторами, визначеними чотирма точками
SELECT degrees(ST_Angle('POINT (10 10)', 'POINT (0 0)', 'POINT(90 90)', 'POINT (100 80)'));269.9999999999999
Кут між векторами, визначеними початковою та кінцевою точками ліній
SELECT degrees(ST_Angle('LINESTRING(0 0,0.3 0.7,1 1)', 'LINESTRING(0 0,0.2 0.5,1 0)'));45
ST_ClosestPoint — Повертає 2D точку на g1, яка найближча до g2. Це перша точка найкоротшої лінії від однієї геометрії до іншої.
geometry ST_ClosestPoint(geometry geom1, geometry geom2);
geography ST_ClosestPoint(geography geom1, geography geom2, boolean use_spheroid = true);
Повертає двовимірну точку на geom1, яка найближча до geom2. Це перша точка найкоротшої лінії між геометріями (розрахована за допомогою ST_ShortestLine).
![]() | |
Якщо у вас є 3D-геометрія, ви можете скористатися ST_3DClosestPoint. |
Покращено: 3.4.0 - Підтримка географії.
Доступність: 1.5.0
Найближчою точкою для точки та лінійного елемента є сама точка. Найближчою точкою для лінійного елемента та точки є точка на лінії.
SELECT ST_ClosestPoint(pt, line) AS cp_pt_line, 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)
Find the closest point on polygon A to polygon B.
WITH source AS (
SELECT 'POLYGON ((190 150,20 10,160 70,190 150))'::geometry AS a,
ST_Buffer('POINT(80 160)'::geometry, 30) AS b
)
SELECT b AS polygon_b,
ST_ClosestPoint(a, b) AS closest_point
FROM source;POLYGON((110 160,109.424 154.147,107.716 148.519,104.944 143.333,101.213 138.787,96.667 135.056,91.481 132.284,85.853 130.576,80 130,74.147 130.576,68.519 132.284,63.333 135.056,58.787 138.787,55.056 143.333,52.284 148.519,50.576 154.147,50 160,50.576 165.853,52.284 171.481,55.056 176.667,58.787 181.213,63.333 184.944,68.519 187.716,74.147 189.424,80 190,85.853 189.424,91.481 187.716,96.667 184.944,101.213 181.213,104.944 176.667,107.716 171.481,109.424 165.853,110 160)) | POINT(131.59149149528952 101.89887534906195)
ST_3DClosestPoint, ST_Distance, ST_LongestLine, ST_ShortestLine, ST_MaxDistance
ST_3DClosestPoint — Повертає 3D точку на g1, яка найближча до g2. Це перша точка найкоротшої 3D лінії.
geometry ST_3DClosestPoint(geometry g1, geometry g2);
Повертає тривимірну точку на g1, яка найближча до g2. Це перша точка найкоротшої лінії в 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 точка (замість старого поведінки, що припускає 0 для відсутнього Z). У випадку 2D і 3D, Z більше не вважається 0 для відсутнього Z.
Compare the 3D closest point to the 2D closest point for a LineString and a Point.
WITH input AS (
SELECT 'POINT(100 100 30)'::geometry AS pt,
'LINESTRING (20 80 20,98 190 1,110 180 3,50 75 1000)'::geometry AS line
)
SELECT ST_3DClosestPoint(line, pt) AS cp3d_line_pt,
ST_ClosestPoint(line, pt) AS cp2d_line_pt
FROM input;Compare the 3D closest point to the 2D closest point for a LineString and a MultiPoint.
WITH input AS (
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
)
SELECT ST_3DClosestPoint(line, pt) AS cp3d_line_pt,
ST_ClosestPoint(line, pt) AS cp2d_line_pt
FROM input;Compare the 3D closest point to the 2D closest point for a Polygon and a MultiLineString.
WITH input AS (
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
)
SELECT ST_3DClosestPoint(poly, mline) AS cp3d,
ST_ClosestPoint(poly, mline) AS cp2d
FROM input;ST_AsEWKT, ST_ClosestPoint, ST_3DDistance, ST_3DShortestLine
ST_Distance — Повертає відстань між двома геометричними або географічними значеннями.
float ST_Distance(geometry g1, geometry g2);
float ST_Distance(geography geog1, geography geog2, boolean use_spheroid = true);
Для типів geometry повертає мінімальну 2D декартову (плоску) відстань між двома геометріями в проекційних одиницях (одиницях просторової прив'язки).
Для типів geography за замовчуванням повертається мінімальна геодезична відстань між двома географічними об'єктами в метрах, обчислена на сфероїді, визначеному SRID. Якщо use_spheroid має значення false, використовується швидший сферичний розрахунок.
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 — вимірювання на сфероїді виконується за допомогою GeographicLib для підвищення точності та надійності. Для використання нової функції потрібно PROJ >= 4.9.0.
Змінено: 3.0.0 - більше не залежить від SFCGAL.
Приклад геометрії - одиниці виміру в плоских градусах 4326 - це довжина в градусах за системою WGS 84, одиниці виміру - градуси.
SELECT ST_Distance( 'SRID=4326;POINT(-72.1235 42.3521)'::geometry, 'SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry );
0.00150567726382282
Приклад геометрії — одиниці виміру в метрах (SRID: 3857, пропорційно до пікселів на популярних веб-мапах). Хоча значення не відповідає дійсності, сусідні значення можна порівняти правильно, що робить цей вибір хорошим для таких алгоритмів, як KNN або KMeans.
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 3857) );167.441410065196
Приклад геометрії — одиниці виміру в метрах (SRID: 3857, як вище, але скориговано за допомогою cos(lat) для врахування спотворення)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 3857)
) * cosd(42.3521);123.742351254151
Приклад геометрії — одиниці виміру в метрах (SRID: 26986 метри площини штату Массачусетс) (найточніше для штату Массачусетс)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 26986),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 26986) );123.797937878454
Приклад геометрії — одиниці виміру в метрах (SRID: 2163 US National Atlas Equal area) (найменша точність)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 2163),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 2163) );126.664256056812
Те саме, що й у прикладі з геометрією, але зверніть увагу на одиниці виміру в метрах — для трохи швидшого та менш точного обчислення використовуйте сферу.
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist
FROM (SELECT
'SRID=4326;POINT(-72.1235 42.3521)'::geography as gg1,
'SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geography as gg2
) As foo ;spheroid_dist | sphere_dist ------------------+------------------ 123.802076746848 | 123.475736916397
ST_3DDistance — Повертає мінімальну 3D декартову відстань (на основі просторової референції) між двома геометріями в проекційних одиницях.
float ST_3DDistance(geometry g1, geometry g2);
Повертає 3-вимірну мінімальну декартову відстань між двома геометріями в проекційних одиницях (одиницях просторової прив'язки).
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 ISO/IEC 13249-3
Доступність: 2.0.0
Змінено: 2.2.0 - У випадку 2D та 3D, Z більше не вважається рівним 0 для відсутнього Z.
Змінено: 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 that 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 | 0ST_DistanceSphere — Повертає мінімальну відстань у метрах між двома геометріями довготи/широти, використовуючи модель сферичної Землі.
float ST_DistanceSphere(geometry geomlonlatA, geometry geomlonlatB, float8 radius=6371008);
Повертає мінімальну відстань у метрах між двома точками lon/lat. Використовує сферичну Землю та радіус, отриманий із сфероїда, визначеного SRID. Швидше, ніж ST_DistanceSpheroid, але менш точне. У версіях PostGIS до 1.5 реалізовано тільки для точок.
Доступність: 1.5 — додано підтримку інших типів геометрії, крім точок. Попередні версії працюють тільки з точками.
Змінено: 2.2.0 У попередніх версіях це називалося ST_Distance_Sphere
WITH sample AS (
SELECT
ST_GeomFromText('LINESTRING(-118.584 38.374,-118.583 38.5)', 4326) AS geom,
ST_GeomFromText('POINT(-118 38)', 4326) AS pt
)
SELECT
round(ST_DistanceSphere(ST_Centroid(geom), pt)::numeric, 2) AS dist_meters,
round(ST_Distance(
ST_Transform(ST_Centroid(geom), 32611),
ST_Transform(pt, 32611)
)::numeric, 2) AS dist_utm11_meters,
round(ST_Distance(ST_Centroid(geom), pt)::numeric, 5) AS dist_degrees,
round(ST_Distance(
ST_Transform(geom, 32611),
ST_Transform(pt, 32611)
)::numeric, 2) AS min_dist_line_point_meters
FROM sample;dist_meters | dist_utm11_meters | dist_degrees | min_dist_line_point_meters
-------------+-------------------+--------------+----------------------------
70424.71 | 70438.00 | 0.72900 | 65871.18ST_DistanceSpheroid — Повертає мінімальну відстань між двома геометріями lon/lat, використовуючи сфероїдальну модель Землі.
float ST_DistanceSpheroid(geometry geomlonlatA, geometry geomlonlatB, spheroid measurement_spheroid=WGS84);
Повертає мінімальну відстань у метрах між двома геометріями lon/lat, заданими для певного сфероїда. Див. пояснення сфероїдів, наведене для ST_LengthSpheroid.
![]() | |
Ця функція не враховує SRID геометрії. Вона припускає, що координати геометрії базуються на наданому сфероїді. |
Доступність: 1.5 — додано підтримку інших типів геометрії, крім точок. Попередні версії працюють тільки з точками.
Змінено: 2.2.0 У попередніх версіях це називалося ST_Distance_Spheroid
WITH input AS (
SELECT ST_Centroid(
ST_GeomFromText(
'LINESTRING(-118.584 38.374,-118.583 38.5)', 4326
)
) AS source,
ST_GeomFromText('POINT(-118 38)', 4326) AS target
)
SELECT round(
ST_DistanceSpheroid(
source,
target,
'SPHEROID["WGS 84",6378137,298.257223563]'
)::numeric,
2
) AS dist_meters_spheroid,
round(ST_DistanceSphere(source, target)::numeric, 2)
AS dist_meters_sphere,
round(
ST_Distance(
ST_Transform(source, 32611),
ST_Transform(target, 32611)
)::numeric,
2
) AS dist_utm11_meters
FROM input;dist_meters_spheroid | dist_meters_sphere | dist_utm11_meters
----------------------+--------------------+-------------------
70454.92 | 70424.71 | 70438.00ST_FrechetDistance — Повертає відстань Фреше між двома геометріями.
float ST_FrechetDistance(geometry g1, geometry g2, float densifyFrac = -1);
Реалізує алгоритм обчислення відстані Фреше, обмеженої дискретними точками для обох геометрій, на основі Computing Discrete Fréchet Distance. Відстань Фреше — це міра подібності кривих, що враховує розташування та порядок точок уздовж кривих. Тому вона часто є кращою за відстань Гаусдорфа.
Коли вказано опціональний параметр densifyFrac, ця функція виконує ущільнення сегментів перед обчисленням дискретної відстані Фреше. Параметр densifyFrac встановлює частку, на яку ущільнюється кожен сегмент. Кожен сегмент буде розділений на декілька підсегментів однакової довжини, частка яких у загальній довжині найближча до заданої частки.
Одиниці вимірювання відповідають одиницям просторової системи координат геометрії.
![]() | |
Поточна реалізація підтримує тільки вершини як дискретні місця розташування. Це можна розширити, щоб дозволити використання довільної щільності точок. |
![]() | |
Чим менше значення densifyFrac ми вказуємо, тим точніше буде відстань Фреше. Однак час обчислення та використання пам'яті зростають пропорційно до квадрату кількості підсегментів. |
Виконується модулем GEOS.
Availability: 2.4.0 - requires GEOS >= 3.7.0
Both lines are traversed from left to right. The first line is straight, while the second bows upward through its middle vertex. The point ordering matters, so keeping both inputs in the same direction makes the comparison clearer.
WITH lines AS (
SELECT 'LINESTRING (0 0,100 0)'::geometry AS baseline,
'LINESTRING (0 0,50 50,100 0)'::geometry AS bowed
)
SELECT baseline AS baseline,
bowed AS bowed,
ST_FrechetDistance(baseline, bowed) AS discrete_distance,
ST_FrechetDistance(baseline, bowed, 0.5) AS densified_distance
FROM lines;ST_HausdorffDistance — Повертає відстань Гаусдорфа між двома геометріями.
float ST_HausdorffDistance(geometry g1, geometry g2);
float ST_HausdorffDistance(geometry g1, geometry g2, float densifyFrac);
Повертає відстань Гаусдорфа між двома геометріями. Відстань Гаусдорфа — це міра схожості або відмінності двох геометрій.
Функція фактично обчислює "дискретну відстань Гаусдорфа". Це відстань Гаусдорфа, обчислена в дискретних точках геометрії. Параметр densifyFrac можна вказати, щоб отримати більш точний результат шляхом ущільнення сегментів перед обчисленням дискретної відстані Гаусдорфа. Кожен сегмент розділяється на кілька підсегментів однакової довжини, частка яких у довжині сегмента найближча до заданої частки.
Одиниці вимірювання відповідають одиницям просторової системи координат геометрії.
![]() | |
Цей алгоритм НЕ є еквівалентним стандартній відстані Гаусдорфа. Однак він обчислює наближення, яке є правильним для великої підмножини корисних випадків. Одним з важливих випадків є лінійні рядки, які приблизно паралельні один одному і мають приблизно однакову довжину. Це корисний показник для зіставлення ліній. |
Доступність: 1.5.0
Hausdorff distance and minimum distance between two lines. The Hausdorff witness segment from the original illustration is retained and its length is checked against the computed distance.
WITH lines AS (
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,
'LINESTRING (52.69230769230769 63.46153846153846,60 100)'::geometry AS hausdorff_segment
)
SELECT round(ST_HausdorffDistance(geomA, geomB)::numeric, 6) AS hausdorff_distance,
round(ST_Distance(geomA, geomB)::numeric, 6) AS distance,
round(ST_Length(hausdorff_segment)::numeric, 6) AS witness_length,
ST_ShortestLine(geomA, geomB) AS distance_segment
FROM lines;37.262066 | 20.000000 | 37.262066 | LINESTRING(20 70,20 90)
Приклад: Відстань Гаусдорфа з ущільненням.
SELECT ST_HausdorffDistance(
'LINESTRING (130 0,0 0,0 150)'::geometry,
'LINESTRING (10 10,10 150,130 10)'::geometry,
0.5);70
Приклад: Для кожної будівлі знайдіть ділянку, яка найкраще її представляє. Спочатку ми вимагаємо, щоб ділянка перетиналася з геометрією будівлі. DISTINCT ON гарантує, що кожна будівля буде вказана тільки один раз. ORDER BY .. ST_HausdorffDistance вибирає ділянку, яка найбільш схожа на будівлю.
SELECT DISTINCT ON (buildings.gid) buildings.gid, parcels.parcel_id
FROM buildings
INNER JOIN parcels
ON ST_Intersects(buildings.geom, parcels.geom)
ORDER BY buildings.gid, ST_HausdorffDistance(buildings.geom, parcels.geom);
ST_Length — Повертає 2D довжину лінійної геометрії.
float ST_Length(geometry a_2dlinestring);
float ST_Length(geography geog, boolean use_spheroid = true);
Для типів геометрії: повертає двовимірну декартову довжину геометрії, якщо це LineString, MultiLineString, ST_Curve, ST_MultiCurve. Для плоских геометрій повертається 0; замість цього використовуйте ST_Perimeter. Одиниці довжини визначаються просторовою системою відліку геометрії.
Для географічних типів: обчислення виконується за допомогою оберненого геодезичного розрахунку. Одиниці довжини вимірюються в метрах. Сфероїд визначається SRID; якщо SRID не вказано, використовується WGS84. Якщо use_spheroid = false, обчислення базується на сфері, а не на сфероїді.
Наразі для геометрії це псевдонім для ST_Length2D, але це може змінитися для підтримки вищих вимірів.
Змінено: 2.0.0 Істотна зміна — у попередніх версіях застосування цього до MULTI/POLYGON типу geography давало периметр POLYGON/MULTIPOLYGON. У 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.
Довжина повернення в футах для рядка рядка. Зверніть увагу, що це в футах, оскільки EPSG:2249 - це фути штату Массачусетс
SELECT ST_Length(ST_GeomFromText( 'LINESTRING(743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416)', 2249));
122.63074400009504
This example transforms a WGS 84 LineString to Massachusetts State Plane meters.
SELECT ST_Length(ST_Transform(
'SRID=4326;LINESTRING(-72.1260 42.45,-72.1240 42.45666,-72.123 42.1546)'::geometry,
26986
)
);34309.4563576191
Повернути довжину географічної лінії WGS 84
This example uses the default spheroid calculation.
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.5703627284 | 34346.20609607416
ST_Length2D — Повертає 2D довжину лінійної геометрії. Псевдонім для ST_Length
float ST_Length2D(geometry a_2dlinestring);
Повертає 2D довжину геометрії, якщо це лінія або багатолінійна лінія. Це псевдонім для ST_Length
ST_3DLength — Повертає 3D довжину лінійної геометрії.
float ST_3DLength(geometry a_3dlinestring);
Повертає тривимірну або двовимірну довжину геометрії, якщо це LineString або MultiLineString. Для двовимірних ліній повертається лише двовимірна довжина (так само, як ST_Length і ST_Length2D)
This function supports 3d and will not drop the z-index.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 7.1, 10.3
Змінено: 2.0.0 У попередніх версіях це називалося ST_Length3D
Довжина повернення в футах для 3D-кабелю. Зверніть увагу, що це в футах, оскільки EPSG:2249 — це фути штату Массачусетс
SELECT ST_3DLength(ST_GeomFromText( 'LINESTRING(743238 2967416 1,743238 2967450 1,743265 2967450 3, 743265.625 2967416 3,743238 2967416 3)', 2249));
122.70471674145682
ST_LengthSpheroid — Повертає 2D або 3D довжину/периметр геометрії lon/lat на сфероїді.
float ST_LengthSpheroid(geometry a_geometry, spheroid a_spheroid);
Calculates the length or perimeter of a geometry on a spheroid. This is useful if the coordinates of the geometry are in longitude/latitude and a length is desired without reprojection. The spheroid is specified by a text value as follows:
SPHEROID[<NAME>,<SEMI-MAJOR AXIS>,<INVERSE FLATTENING>]
Наприклад:
SPHEROID["GRS_1980",6378137,298.257222101]
Доступність: 1.2.2
Змінено: 2.2.0 У попередніх версіях ця функція називалася ST_Length_Spheroid і мала псевдонім ST_3DLength_Spheroid
This function supports 3d and will not drop the z-index.
Measure a table geometry directly on a spheroid when the coordinates are stored in longitude and latitude.
SELECT ST_LengthSpheroid(
geometry_column,
'SPHEROID["GRS_1980",6378137,298.257222101]'
)
FROM geometry_table;This example measures a 2D MultiLineString and each component separately on the same spheroid.
WITH sample AS (
SELECT 'MULTILINESTRING((-118.584 38.374,-118.583 38.5),
(-71.05957 42.3589,-71.061 43))'::geometry AS geom,
CAST('SPHEROID["GRS_1980",6378137,298.257222101]' AS spheroid) AS sph_m
)
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 sample;tot_len | len_line1 | len_line2 ------------------+------------------+------------------ 85204.52077117894 | 13986.87252824332 | 71217.64824293563
This example uses 3D input; Z contributes to the measured result.
WITH sample AS (
SELECT 'MULTILINESTRING((-118.584 38.374 20,-118.583 38.5 30),
(-71.05957 42.3589 75,-71.061 43 90))'::geometry AS geom,
CAST('SPHEROID["GRS_1980",6378137,298.257222101]' AS spheroid) AS sph_m
)
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 sample;tot_len | len_line1 | len_line2 ------------------+-----------------+------------------ 85204.52592562366 | 13986.876103023424 | 71217.64982260024
ST_LongestLine — Повертає найдовшу 2D лінію між двома геометріями.
geometry ST_LongestLine(geometry g);
geometry ST_LongestLine(geometry g1, geometry g2);
Повертає найдовшу двовимірну лінію між точками двох геометрій. Повернена лінія починається в точці g1 і закінчується в точці g2.
Найдовша лінія завжди проходить між двома вершинами. Якщо знайдено більше однієї лінії, функція повертає першу найдовшу лінію. Довжина лінії дорівнює відстані, поверненій функцією ST_MaxDistance.
If only one geometry is provided, or g1 and g2 are the same geometry, returns the line between the two vertices farthest apart in the geometry. The endpoints of the line lie on the circle computed by ST_MinimumBoundingCircle.
Доступність: 1.5.0
Enhanced: 3.7.0 - support for a single geometry input.
Longest line between a Point and a LineString.
SELECT 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)
Longest line between two polygons.
SELECT ST_LongestLine(
'POLYGON ((190 150,20 10,160 70,190 150))',
ST_Buffer('POINT(80 160)', 30)
) AS llinewkt;LINESTRING(20 10,91.4805029709527 187.7163859753386)
Найдовша лінія, що проходить через одну геометрію. Довжина лінії дорівнює максимальній відстані. Кінцеві точки лінії лежать на мінімальному обмежувальному колі.
SELECT ST_LongestLine(geom) AS llinewkt,
ST_MaxDistance(geom) AS max_dist,
ST_Length(ST_LongestLine(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. Тривимірна довжина лінії дорівнює відстані, поверненій функцією ST_3DMaxDistance.
Доступність: 2.0.0
Змінено: 2.2.0 - якщо введено 2 2D геометрії, повертається 2D точка (замість старого поведінки, що припускає 0 для відсутнього Z). У випадку 2D і 3D, Z більше не вважається 0 для відсутнього Z.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
Longest line between a LineString and a Point, comparing the 3D and 2D results.
SELECT ST_3DLongestLine(line, pt) AS lol3d_line_pt, 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)
Longest line between a LineString and a MultiPoint, comparing the 3D and 2D results.
SELECT ST_3DLongestLine(line, pt) AS lol3d_line_pt, 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)
Longest line between a Polygon and a MultiLineString, comparing the 3D and 2D results.
SELECT ST_3DLongestLine(poly, mline) AS lol3d, 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 g);
float ST_MaxDistance(geometry g1, geometry g2);
Повертає максимальну відстань між двома геометріями у двовимірному просторі, в проекційних одиницях. Максимальна відстань завжди виникає між двома вершинами. Це довжина лінії, повернена функцією ST_LongestLine.
If only one geometry is provided, or g1 and g2 are the same geometry, returns the distance between the two vertices farthest apart in that geometry.
Доступність: 1.5.0
Enhanced: 3.7.0 - support for a single geometry input.
Максимальна відстань між точкою та лініями.
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);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 більше не вважається рівним 0 для відсутнього Z.
Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line) Note that currently no vertical datum support so Z is not transformed and assumed to be same units as final.
SELECT ST_3DMaxDistance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521 10000)'::geometry, 2163),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45 15,-72.123 42.1546 20)'::geometry, 2163)
) As dist_3d,
ST_MaxDistance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521 10000)'::geometry, 2163),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45 15,-72.123 42.1546 20)'::geometry, 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 до відрізка лінії, кінцевою точкою якого вона не є.
Якщо для геометрії не існує мінімального зазору (наприклад, для окремої точки або для MultiPoint, точки якого є ідентичними), повертається значення Infinity.
Щоб уникнути проблем з валідністю, спричинених втратою точності, ST_ReducePrecisionможе зменшити точність координат, гарантуючи при цьому валідність полігональної геометрії.
Доступність: 2.3.0
SELECT ST_MinimumClearance('POLYGON ((0 0,1 0,1 1,0.5 3.2e-4,0 0))');0.00032
ST_MinimumClearanceLine, ST_IsSimple, ST_IsValid, ST_ReducePrecision
ST_MinimumClearanceLine — Повертає двоточкову лінію LineString, що охоплює мінімальний простір геометрії.
Geometry ST_MinimumClearanceLine(geometry g);
Повертає двоточкову лінію LineString, що охоплює мінімальний зазор геометрії. Якщо геометрія не має мінімального зазору, повертається LINESTRING EMPTY.
Виконується модулем GEOS.
Доступність: 2.3.0 - вимагає GEOS >= 3.6.0
SELECT ST_MinimumClearanceLine('POLYGON ((0 0,1 0,1 1,0.5 3.2e-4,0 0))');LINESTRING(0.5 0.00032,0.5 0)
ST_Perimeter — Повертає довжину межі полігональної геометрії або географії.
float ST_Perimeter(geometry g1);
float ST_Perimeter(geography geog, boolean use_spheroid = true);
Повертає 2D периметр геометрії/географії, якщо це ST_Surface, ST_MultiSurface (Polygon, MultiPolygon). Для геометрій, що не мають площі, повертається 0. Для лінійних геометрій використовуйте ST_Length. Для типів геометрії одиниці виміру периметра визначаються просторовою системою відліку геометрії.
Для географічних типів обчислення виконуються за допомогою оберненої геодезичної задачі, де одиниці периметра вимірюються в метрах. Сфероїд визначається SRID; якщо 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: додано підтримку географії
Geometry.
Повернути периметр у футах для полігону та мультиполігону. Зверніть увагу, що це фути, оскільки EPSG:2249 — це фути штату Массачусетс.
SELECT ST_Perimeter(ST_GeomFromText( 'POLYGON((743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416))', 2249));
122.63074400009504
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));
845.227713366825
Повернути периметр у метрах і футах для полігону та мультиполігону. Зверніть увагу, що це географічні координати (WGS 84 long lat)
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.37904625414049 | 122.63466618812497
This example uses a MultiPolygon.
SELECT ST_Perimeter(geog) As per_meters, ST_Perimeter(geog, false) As per_sphere_meters, ST_Perimeter(geog)/0.3048 As per_ft
FROM ST_GeogFromText('MULTIPOLYGON(((-71.1044543107478 42.340674480411,-71.1044542869917 42.3406744369506,
-71.1044553562977 42.340673886454,-71.1044543107478 42.340674480411)),
((-71.1044543107478 42.340674480411,-71.1044860600303 42.3407237015564,-71.1045215770124 42.3407653385914,
-71.1045498002983 42.3407946553165,-71.1045611902745 42.3408058316308,-71.1046016507427 42.340837442371,
-71.104617893173 42.3408475056957,-71.1048586153981 42.3409875993595,-71.1048736143677 42.3409959528211,
-71.1048878050242 42.3410084812078,-71.1044020965803 42.3414730072048,
-71.1039672113619 42.3412202916693,-71.1037740497748 42.3410666421308,
-71.1044280218456 42.3406894151355,-71.1044543107478 42.340674480411)))') As geog;per_meters | per_sphere_meters | per_ft
------------------+-------------------+------------------
257.634283683311 | 257.412311446337 | 845.256836231335
ST_Perimeter2D — Повертає 2D периметр полігональної геометрії. Псевдонім для ST_Perimeter.
float ST_Perimeter2D(geometry geomA);
Повертає двовимірний периметр багатокутної геометрії.
![]() | |
Наразі це псевдонім для ST_Perimeter. У майбутніх версіях ST_Perimeter може повертати найбільший периметр для геометрії. Це питання ще розглядається |
ST_3DPerimeter — Повертає 3D периметр полігональної геометрії.
float ST_3DPerimeter(geometry geomA);
Повертає тривимірний периметр геометрії, якщо це полігон або мультиполігон. Якщо геометрія двовимірна, то повертається двовимірний периметр.
This function supports 3d and will not drop the z-index.
This method implements the SQL/MM specification. SQL-MM ISO/IEC 13249-3: 8.1, 10.5
Змінено: 2.0.0 У попередніх версіях це називалося ST_Perimeter3D
Периметр злегка піднятого полігону в повітрі в штаті Массачусетс, фути площини штату
SELECT ST_3DPerimeter(geom), ST_Perimeter2D(geom), ST_Perimeter(geom) FROM
(SELECT 'SRID=2249;POLYGON((743238 2967416 2,743238 2967450 1,
743265.625 2967416 1,743238 2967416 2))'::geometry As geom) As foo;ST_3DPerimeter | st_perimeter2d | st_perimeter ------------------+------------------+------------------ 105.46579359767418 | 105.43299727218763 | 105.43299727218763
ST_ShortestLine — Повертає найкоротшу 2D лінію між двома геометріями
geometry ST_ShortestLine(geometry geom1, geometry geom2);
geography ST_ShortestLine(geography geom1, geography geom2, boolean use_spheroid = true);
Повертає найкоротшу двовимірну лінію між двома геометріями. Повернена лінія починається в geom1 і закінчується в geom2. Якщо geom1 і geom2 перетинаються, результатом є лінія, що починається і закінчується в точці перетину. Довжина лінії дорівнює значенню, яке повертає ST_Distance для g1 і g2.
Покращено: 3.4.0 - підтримка географії.
Доступність: 1.5.0
Shortest line between a Point and a LineString.
SELECT 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)
Shortest line between polygons.
SELECT ST_ShortestLine(
'POLYGON ((190 150,20 10,160 70,190 150))',
ST_Buffer('POINT(80 160)', 30)
) AS llinewkt;LINESTRING(131.59149149528952 101.89887534906195,101.21320343559643 138.78679656440357)
ST_ClosestPoint, ST_Distance, ST_LongestLine, ST_MaxDistance
ST_3DShortestLine — Повертає найкоротшу 3D лінію між двома геометріями
geometry ST_3DShortestLine(geometry g1, geometry g2);
Повертає найкоротшу тривимірну лінію між двома геометріями. Якщо функція знаходить більше однієї найкоротшої лінії, вона повертає тільки першу. Якщо g1 і g2 перетинаються тільки в одній точці, функція повертає лінію, початок і кінець якої знаходяться в цій точці перетину. Якщо g1 і g2 перетинаються в більш ніж одній точці, функція поверне лінію, початок і кінець якої знаходяться в одній точці, але це може бути будь-яка з точок перетину. Повернена лінія завжди починатиметься в g1 і закінчуватиметься в g2. Тривимірна довжина лінії, яку повертає ця функція, завжди буде такою ж, як ST_3DDistanceповертає для g1 і g2.
Доступність: 2.0.0
Змінено: 2.2.0 - якщо введено 2 2D геометрії, повертається 2D точка (замість старого поведінки, що припускає 0 для відсутнього Z). У випадку 2D і 3D, Z більше не вважається 0 для відсутнього Z.
This function supports 3d and will not drop the z-index.
This function supports Polyhedral surfaces.
Compare the 3D shortest line to the 2D shortest line for a LineString and a Point.
WITH input AS (
SELECT 'POINT(100 100 30)'::geometry AS pt,
'LINESTRING (20 80 20,98 190 1,110 180 3,50 75 1000)'::geometry AS line
)
SELECT ST_3DShortestLine(line, pt) AS shl3d_line_pt,
ST_ShortestLine(line, pt) AS shl2d_line_pt
FROM input;Compare the 3D shortest line to the 2D shortest line for a LineString and a MultiPoint.
WITH input AS (
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
)
SELECT ST_3DShortestLine(line, pt) AS shl3d_line_pt,
ST_ShortestLine(line, pt) AS shl2d_line_pt
FROM input;Compare the 3D shortest line to the 2D shortest line for a Polygon and a MultiLineString.
WITH input AS (
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
)
SELECT ST_3DShortestLine(poly, mline) AS shl3d,
ST_ShortestLine(poly, mline) AS shl2d
FROM input;Ці функції обчислюють результати, що виникають при накладенні двох геометрій. Вони також відомі як булеві операції теорії множин точок. Також надаються деякі пов'язані функції.
ST_ClipByBox2D — Обчислює частину геометрії, що потрапляє в прямокутник.
geometry ST_ClipByBox2D(geometry geom, box2d box);
Обрізає геометрію за допомогою 2D-коробки швидким і толерантним, але, можливо, некоректним способом. Топологічно некоректні вхідні геометрії не призводять до виникнення виняткових ситуацій. Не гарантується коректність вихідної геометрії (зокрема, можуть виникнути самоперетини для полігону).
Виконується модулем GEOS.
Доступність: 2.2.0
This example relies on the implicit cast from geometry to box2d for the second parameter.
SELECT ST_ClipByBox2D(geom, ST_MakeEnvelope(0, 0, 10, 10)) FROM mytab;
ST_Difference — Обчислює геометрію, що представляє частину геометрії A, яка не перетинається з геометрією B.
geometry ST_Difference(geometry geomA, geometry geomB, float8 gridSize = -1);
Повертає геометрію, що представляє частину геометрії A, яка не перетинається з геометрією B. Це еквівалентно A - ST_Intersection(A,B). Якщо A повністю міститься в B, то повертається порожня атомарна геометрія відповідного типу.
![]() | |
Це єдина функція накладання, де порядок введення має значення. ST_Difference(A, B) завжди повертає частину A. |
If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.
Виконано модулем GEOS
Покращено: 3.1.0 приймає параметр gridSize.
Для використання параметра 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 копіюються, усереднюються або інтерполюються.
Різниця між 2D лініями.
SELECT ST_Difference('LINESTRING(50 100,50 200)'::geometry,
'LINESTRING(50 50,50 150)'::geometry
);LINESTRING(50 150,50 200)
Різниця між 3D-точками.
SELECT 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
);MULTIPOINT(-118.6 38.329 6,-118.58 38.38 5)
ST_SymDifference, ST_Intersection, ST_Union, ST_ReducePrecision
ST_Intersection — Обчислює геометрію, що представляє спільну частину геометрій A і B.
geometry ST_Intersection( geometry geomA , geometry geomB , float8 gridSize = -1 );
geography ST_Intersection( geography geogA , geography geogB );
Повертає геометрію, що представляє перетин двох геометрій. Іншими словами, це та частина геометрії A і геометрії B, яка є спільною для обох геометрій.
Якщо геометрії не мають спільних точок (тобто є роз'єднаними), то повертається порожня атомарна геометрія відповідного типу.
If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.
ST_Intersection у поєднанні з ST_Intersects корисний для обрізання геометрій, наприклад, у запитах на обмежувальну рамку, буфер або регіон, де потрібна лише частина геометрії, що знаходиться всередині країни або регіону, що цікавить.
![]() | |
Spatial predicates such as ST_Intersects and overlay functions such as |
![]() | |
|
![]() | |
Ця функція видалить значення координати M, якщо вони присутні. |
![]() | |
If working with 3D geometries, you may want to use SFCGAL based CG_3DIntersection which does a proper 3D intersection for 3D geometries. Although this function works with Z-coordinate, it does an averaging of Z-Coordinate. |
Виконано модулем GEOS
Покращено: 3.1.0 приймає параметр gridSize
Для використання параметра 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_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);POINT EMPTY
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);POINT(0 0)
Виріжте всі лінії (треки) за країною. Тут ми припускаємо, що геометрія країни є POLYGON або MULTIPOLYGONS. ПРИМІТКА: ми зберігаємо тільки перетини, які утворюють LINESTRING або MULTILINESTRING, оскільки нас не цікавлять траси, які просто мають спільну точку. Дамп необхідний для розширення колекції геометрії в окремі частини MULT*. Нижче наведено досить загальний приклад, який підійде для полігонів тощо, якщо змінити умову where.
select clipped.gid, clipped.f_name, clipped_geom
from (
select trails.gid, trails.f_name,
(ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom
from country
inner join trails on ST_Intersects(country.geom, trails.geom)
) as clipped
where ST_Dimension(clipped.clipped_geom) = 1;Для полігонів, наприклад, орієнтирів полігону, ви також можете використовувати іноді швидший хак, який буферизує все, крім полігону, на 0,0, що призводить до порожньої колекції геометрії. (Таким чином, колекція геометрії, що містить полігони, лінії та точки, буферизовані на 0,0, залишить тільки полігони і розчиниться оболонку колекції.)
select poly.gid,
ST_Multi(ST_Buffer(ST_Intersection(country.geom, poly.geom),
0.0
)
) clipped_geom
from country
inner join poly on ST_Intersects(country.geom, poly.geom)
where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));Note this is not a true 3D intersection. It uses 2.5D geometries (geometries with Z ordinates, but where calculations are performed in 2D). The same input is compared with CG_3DIntersection, which performs a true 3D intersection.
WITH data AS (
SELECT 'LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)'::geometry AS input_linestring,
'POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8))'::geometry AS input_polygon
)
SELECT input_linestring AS input_linestring,
input_polygon AS input_polygon,
ST_Intersection(input_linestring, input_polygon) AS intersection_2d,
CG_3DIntersection(input_linestring, input_polygon) AS intersection_3d
FROM data;LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10) | POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8)) | LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10) | LINESTRING Z (1 1 8,0.5 0.5 8)
ST_MemUnion — Агрегатна функція, яка об'єднує геометрії в пам'яті ефективним, але повільнішим способом.
geometry ST_MemUnion(geometry set geomfield);
Агрегатна функція, яка об'єднує вхідні геометрії, зливаючи їх для отримання геометрії результату без перекриттів. Результатом може бути одна геометрія, MultiGeometry або Geometry Collection.
![]() | |
Дає той самий результат, що й ST_Union, але використовує менше пам'яті та більше процесорного часу. Ця агрегатна функція працює шляхом послідовного об'єднання геометрій, на відміну від агрегату ST_Union, який спочатку накопичує масив, а потім об'єднує вміст за допомогою швидкого алгоритму. |
This function supports 3d and will not drop the z-index. Однак результат обчислюється тільки за допомогою XY. Значення результату Z копіюються, усереднюються або інтерполюються.
SELECT id,
ST_MemUnion(geom) as singlegeom
FROM sometable f
GROUP BY id;
ST_Node — Вузли — сукупність ліній.
geometry ST_Node(geometry geom);
Повертає (Multi)LineString, що представляє повністю вузлову версію колекції лінійних рядків. Вузли зберігають усі вхідні вузли та вводять мінімально можливу кількість нових вузлів. Результуюча лінія розчиняється (дублі ліній видаляються).
Це хороший спосіб створити повністю вузлові лінії, які можна використовувати як вхідні дані для ST_Polygonize.
ST_UnaryUnion також може використовуватися для з'єднання та роз'єднання ліній. Він надає можливість вказати розмір сітки gridSize, що дозволяє отримати простіший та надійніший результат. Див. також ST_Unionдля агрегованого варіанту.
This function supports 3d and will not drop the z-index.
Виконується модулем GEOS.
Доступність: 2.0.0
Змінено: 2.4.0 ця функція використовує GEOSNode внутрішньо замість GEOSUnaryUnion. Це може призвести до того, що отримані лінійні рядки матимуть інший порядок і напрямок порівняно з PostGIS < 2.4.
Noding a 3D LineString which self-intersects.
SELECT ST_Node('LINESTRINGZ(0 0 0, 10 10 10, 0 10 5, 10 0 3)'::geometry) As 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_Node('MULTILINESTRING ((2 5,2 1,7 1),(6 1,4 1,2 3,2 5))'::geometry) As 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);
Функція підтримує розділення LineString за межею (Multi)Point, (Multi)LineString або (Multi)Polygon, або (Multi)Polygon за LineString. Коли (Multi)Polygon використовується як лезо, його лінійні компоненти (межа) використовуються для розділення вхідних даних. Результуюча геометрія завжди є колекцією.
Ця функція в певному сенсі є протилежною до ST_Union. Застосування ST_Union до повернутої колекції теоретично повинно дати вихідну геометрію (хоча через числове округлення це може бути не зовсім так).
![]() | |
Якщо вхідні дані та лезо не перетинаються через проблеми з числовою точністю, вхідні дані можуть не розділитися як очікується. Щоб уникнути такої ситуації, може бути необхідним спочатку прив'язати вхідні дані до леза за допомогою ST_Snap з невеликим допуском. |
Доступність: 2.0.0 вимагає GEOS
Покращено: 2.2.0 додано підтримку розділення лінії мультилінією, мультиточкою або (мульти)полігоном.
Покращено: 2.5.0 додано підтримку розділення полігону мультилінією.
Split a circular polygon by a diagonal line.
SELECT
ST_Split(
ST_Buffer('POINT(100 90)'::geometry, 50),
'LINESTRING(10 10,190 190)'::geometry
);GEOMETRYCOLLECTION(POLYGON((150 90,149 80.2,146.2 70.9,141.6 62.2,135.4 54.6,127.8 48.4,119.1 43.8,109.8 41,100 40,90.2 41,80.9 43.8,72.2 48.4,64.6 54.6,60.1 60.1,129.9 129.9,135.4 125.4,141.6 117.8,146.2 109.1,149 99.8,150 90)), POLYGON((60.1 60.1,58.4 62.2,53.8 70.9,51 80.2,50 90,51 99.8,53.8 109.1,58.4 117.8,64.6 125.4,72.2 131.6,80.9 136.2,90.2 139,100 140,109.8 139,119.1 136.2,127.8 131.6,129.9 129.9,60.1 60.1)))
Розділити MultiLineString за точкою, яка лежить точно на обох елементах LineStrings.
SELECT ST_Split('MULTILINESTRING((10 10,190 190),(15 15,30 30,100 90))',
ST_Point(30, 30));GEOMETRYCOLLECTION(
LINESTRING(10 10,30 30),
LINESTRING(30 30,190 190),
LINESTRING(15 15,30 30),
LINESTRING(30 30,100 90)
)Розділити лінію String за точкою, яка не лежить точно на лінії. Показано за допомогою ST_Snap, щоб прив'язати лінію до точки, щоб її можна було розділити.
WITH data AS (SELECT
'LINESTRING(0 0,100 100)'::geometry AS line,
'POINT(51 50)':: geometry AS point
)
SELECT ST_Split(ST_Snap(line, point, 1), point) AS snapped_split,
ST_Split(line, point) AS not_snapped_not_split
FROM data;-[ RECORD 1 ]--------- snapped_split | GEOMETRYCOLLECTION(LINESTRING(0 0,51 50), LINESTRING(51 50,100 100)) not_snapped_not_split | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))
ST_Subdivide — Обчислює прямолінійний поділ геометрії.
setof geometry ST_Subdivide(geometry geom, integer max_vertices=256, float8 gridSize = -1);
Повертає набір геометрій, які є результатом поділу geom на частини за допомогою прямолінійних ліній, причому кожна частина містить не більше ніж max_vertices.
max_vertices має бути 5 або більше, оскільки для зображення закритого прямокутника потрібно 5 точок.
If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.
Операції типу "точка в полігоні" та інші просторові операції зазвичай виконуються швидше для індексованих підрозділених набори даних. Оскільки обмежувальні рамки для частин зазвичай охоплюють меншу площу, ніж оригінальна геометрія bbox, запити до індексу дають менше випадків "влучання". Випадки "влучання" обробляються швидше, оскільки просторові операції, що виконуються індексом, перевіряють менше точок.
![]() | |
При перетворенні поділеної геометрії на географію, отримана географія може відрізнятися від оригіналу. Поділ додає вершини в плоскому (геометричному) просторі. Якщо вершини вставляються вздовж межі, вони змінять географічне представлення, де краї інтерпретуються як геодезичні сегменти. Щоб мінімізувати спотворення, спочатку ущільніть географію за допомогою ST_Segmentize, щоб додати геодезичні вершини, а потім перетворіть на геометрію перед поділом. |
![]() | |
Це функція повернення набору (SRF), яка повертає набір рядків, що містять окремі значення геометрії. Її можна використовувати в списку SELECT або в розділі FROM для створення набору результатів з одним записом для кожної геометрії результату. |
Виконується модулем GEOS.
Доступність: 2.2.0
Покращено: 2.5.0 повторно використовує існуючі точки при розділенні полігону, кількість вершин зменшено з 8 до 5.
Покращено: 3.1.0 приймає параметр gridSize.
Для використання параметра gridSize необхідна версія GEOS >= 3.9.0
Приклад: Розділіть полігон на частини з не більше ніж 10 вершинами та присвойте кожній частині унікальний ідентифікатор.
SELECT row_number() OVER() As rn,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((85 35,68 29,66 28,32 56,22 64,29.82608695652174 100,119 100,119 23,85 35)) 2 │ POLYGON((186 52,178 34,168 18,147 13,132 10,119 23,119 56,186 56,186 52)) 3 │ POLYGON((185 79,186 56,119 56,119 100,190 100,185 79)) 4 │ POLYGON((40 119,36 150,57 158,75 171,92 182,114 184,114 100,29.82608695652174 100,32 110,40 119)) 5 │ POLYGON((132 186,146 178,176 184,179 162,184 141,190 122,190 100,114 100,114 184,132 186))
Приклад: Ущільніть довгу географічну лінію за допомогою ST_Segmentize(geography, distance) і використовуйте ST_Subdivide, щоб розділити отриману лінію на підлінії з 8 вершинами. Ущільнення мінімізує вплив змін на географічне представлення геометрії під час поділу.
SELECT ST_Subdivide(ST_Segmentize('LINESTRING(0 0,85 85)'::geography,
1200000)::geometry, 8);LINESTRING(0 0,0.487578359029357 5.57659056746196,0.984542144675897 11.1527721155093,1.50101059639722 16.7281035483571,1.94532113630331 21.25) LINESTRING(1.94532113630331 21.25,2.04869538062779 22.3020741387339,2.64204641967673 27.8740533545155,3.29994062412787 33.443216802941,4.04836719489742 39.0084282520239,4.59890468420694 42.5) LINESTRING(4.59890468420694 42.5,4.92498503922732 44.5680389206321,5.98737409390639 50.1195229244701,7.3290919767674 55.6587646879025,8.79638749938413 60.1969505994924) LINESTRING(8.79638749938413 60.1969505994924,9.11375579533779 61.1785363177625,11.6558166691368 66.6648504160202,15.642041247655 72.0867690601745,22.8716627200212 77.3609628116894,24.6991785131552 77.8939011989848) LINESTRING(24.6991785131552 77.8939011989848,39.4046096622744 82.1822848017636,44.7994523421035 82.5156766227011) LINESTRING(44.7994523421035 82.5156766227011,85 85)
Приклад: Розділіть складні геометрії таблиці на місці. Оригінальні записи геометрії видаляються з вихідної таблиці, а нові записи для кожної розділеної геометрії результату вставляються.
WITH complex_areas_to_subdivide AS (
DELETE from polygons_table
WHERE ST_NPoints(geom)
> 255
RETURNING id, column1, column2, column3, geom
)
INSERT INTO polygons_table (fid, column1, column2, column3, geom)
SELECT fid, column1, column2, column3,
ST_Subdivide(geom, 255) as geom
FROM complex_areas_to_subdivide;
Приклад: Створіть нову таблицю, що містить поділені геометрії, зберігаючи ключ оригінальної геометрії, щоб нову таблицю можна було об'єднати з вихідною таблицею. Оскільки ST_Subdivide є функцією, що повертає набір (таблицю) і повертає набір рядків з одним значенням, ця синтаксична конструкція автоматично створює таблицю з одним рядком для кожної частини результату.
CREATE TABLE subdivided_geoms AS
SELECT pkey, ST_Subdivide(geom) AS geom
FROM original_geoms;
ST_ClipByBox2D, ST_Segmentize, ST_Split, ST_NPoints, ST_ReducePrecision
ST_SymDifference — Обчислює геометрію, що представляє частини геометрій A і B, які не перетинаються.
geometry ST_SymDifference(geometry geomA, geometry geomB, float8 gridSize = -1);
Повертає геометрію, що представляє частини геометрій A і B, які не перетинаються. Це еквівалентно ST_Union(A,B) - ST_Intersection(A,B). Це називається симетричною різницею, оскільки ST_SymDifference(A,B) = ST_SymDifference(B,A).
If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.
Виконано модулем GEOS
Покращено: 3.1.0 приймає параметр gridSize.
Для використання параметра 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 копіюються, усереднюються або інтерполюються.
This example shows a 2D-safe symmetric difference of two LineStrings.
SELECT ST_SymDifference('LINESTRING(50 100,50 200)',
'LINESTRING(50 50,50 150)'
);MULTILINESTRING((50 150,50 200),(50 50,50 100))
In 3D, this example does not produce the expected result.
SELECT ST_SymDifference('LINESTRING(1 2 1,1 4 2)',
'LINESTRING(1 1 3,1 3 4)');MULTILINESTRING((1 3 4,1 4 2),(1 1 3,1 2 1))
ST_Difference, ST_Intersection, ST_Union, ST_ReducePrecision
ST_UnaryUnion — Обчислює об'єднання компонентів однієї геометрії.
geometry ST_UnaryUnion(geometry geom, float8 gridSize = -1);
Одновхідний варіант ST_Union. Вхідними даними може бути одна геометрія, MultiGeometry або GeometryCollection. Об'єднання застосовується до окремих елементів вхідних даних.
Цю функцію можна використовувати для виправлення полігонів MultiPolygons, які є недійсними через перекриття компонентів. Однак кожний з компонентів вхідних даних повинен бути дійсним. Недійсний компонент вхідних даних, такий як полігон у формі метелика, може спричинити помилку. З цієї причини краще використовувати ST_MakeValid.
Інше застосування цієї функції — об'єднання та роз'єднання набору лінійних рядків, які перетинаються або перекриваються, щоб зробити їх простими. (ST_Node також виконує цю функцію, але не надає опцію gridSize.)
Можна поєднати ST_UnaryUnion з ST_Collect, щоб точно налаштувати кількість геометрій, які об'єднуються одночасно. Це дозволяє досягти компромісу між використанням пам'яті та часом обчислення, забезпечуючи баланс між ST_Union та ST_MemUnion.
If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.
This function supports 3d and will not drop the z-index. Однак результат обчислюється тільки за допомогою XY. Значення результату Z копіюються, усереднюються або інтерполюються.
Покращено: 3.1.0 приймає параметр gridSize.
Для використання параметра gridSize необхідна версія GEOS >= 3.9.0
Доступність: 2.0.0
ST_Union, ST_MemUnion, ST_MakeValid, ST_Collect, ST_Node, ST_ReducePrecision
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);
Об'єднує геометрії вхідних даних, об'єднуючи геометрію для отримання геометрії результату без перекриттів. Результатом може бути атомна геометрія, MultiGeometry або колекція геометрій. Існує в декількох варіантах:
Варіант з двома входами: повертає геометрію, яка є об'єднанням двох вхідних геометрій. Якщо будь-який з входів має значення NULL, то повертається NULL.
Варіант масиву: повертає геометрію, яка є об'єднанням масиву геометрій.
Агрегований варіант: повертає геометрію, яка є об'єднанням набору рядків геометрій. Функція ST_Union() є "агрегованою" функцією в термінології PostgreSQL. Це означає, що вона працює з рядками даних так само, як функції SUM() та AVG(), і, як більшість агрегатів, ігнорує геометрії NULL.
Див. ST_UnaryUnionдля неагрегованого варіанту з одним вхідним параметром.
Масив ST_Union та варіанти набору використовують швидкий алгоритм каскадного об'єднання, описаний у http://blog.cleverelephant.ca/2009/01/must-faster-unions-in-postgis-14.html
If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.
![]() | |
ST_Collect іноді може використовуватися замість ST_Union, якщо результат не повинен бути неперекривним. ST_Collect зазвичай працює швидше, ніж ST_Union, оскільки не виконує обробку зібраних геометрій. |
Виконується модулем GEOS.
ST_Union створює MultiLineString і не з'єднує LineStrings в один LineString. Для з'єднання LineStrings використовуйте ST_LineMerge.
ПРИМІТКА: раніше ця функція називалася GeomUnion(), але була перейменована з "Union", оскільки UNION є зарезервованим словом SQL.
Покращено: 3.1.0 приймає параметр gridSize.
Для використання параметра gridSize необхідна версія GEOS >= 3.9.0
Змінено: 3.0.0 не залежить від SFCGAL.
Доступність: 1.4.0 — ST_Union було вдосконалено. Було впроваджено ST_Union(geomarray), а також пришвидшено збір агрегатів у PostgreSQL.
This method implements the OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3
![]() | |
Агрегована версія не визначена явно в OGC SPEC. |
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_Union('POINT(1 2)'::geometry, 'POINT(-2 3)'::geometry);MULTIPOINT((1 2),(-2 3))
SELECT ST_Union('POINT(1 2)'::geometry, 'POINT(1 2)'::geometry);POINT(1 2)
3D example - sort of supports 3D (and with mixed geometry types!)
SELECT ST_Union(geom)
FROM (
SELECT 'POLYGON Z((-7 4.2 5,-7.1 4.2 5,-7.1 4.3 5,-7 4.2 5))'::geometry geom
UNION ALL
SELECT 'POINT Z(5 5 5)'::geometry geom
UNION ALL
SELECT 'POINT Z(-2 3 1)'::geometry geom
UNION ALL
SELECT 'LINESTRING Z(5 5 5,10 10 10)'::geometry geom
) AS foo;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)))
This 3D example does not mix dimensions.
SELECT 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;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)))
This example unions an array built from a query.
SELECT ST_Union(ARRAY(SELECT geom FROM sometable));
This example unions an array of linestrings.
SELECT ST_Union(ARRAY[
'LINESTRING(1 2,3 4)'::geometry,
'LINESTRING(4 5,5 6)'::geometry
]) As wktunion;MULTILINESTRING((1 2,3 4),(4 5,5 6))
Ці функції обчислюють геометричні конструкції або змінюють розмір чи форму геометрії.
ST_Buffer — Обчислює геометрію, що охоплює всі точки в межах заданої відстані від геометрії.
geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters = '');
geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);
geography ST_Buffer(geography g1, float radius_of_buffer, text buffer_style_parameters);
geography ST_Buffer(geography g1, float radius_of_buffer, integer num_seg_quarter_circle);
Обчислює POLYGON або MULTIPOLYGON, що представляє всі точки, відстань яких від геометрії/географії менше або дорівнює заданій відстані. Від'ємна відстань зменшує геометрію, а не розширює її. Від'ємна відстань може повністю зменшити полігон, і в цьому випадку повертається POLYGON EMPTY. Для точок і ліній від'ємні відстані завжди повертають порожні результати.
Для геометрії відстань вказується в одиницях просторової системи координат геометрії. Для географії відстань вказується в метрах.
Опціональний третій параметр контролює точність і стиль буфера. Точність кругових дуг у буфері визначається як кількість лінійних сегментів, що використовуються для апроксимації чверті кола (за замовчуванням — 8). Стиль буфера можна вказати, надавши список пар ключ=значення, розділених пробілами, як показано нижче:
'quad_segs=#' : кількість відрізків лінії, що використовуються для апроксимації чверті кола (за замовчуванням — 8).
'endcap=round|flat|square' : стиль кінцевої частини (за замовчуванням "round"). 'butt' приймається як синонім 'flat'.
'join=round|mitre|bevel' : стиль з'єднання (за замовчуванням "round"). 'miter' приймається як синонім 'mitre'.
'mitre_limit=#.#' : обмеження кута зрізу (впливає тільки на стиль з'єднання з кутом зрізу). 'miter_limit' приймається як синонім 'mitre_limit'.
“side=both|left|right” : за замовчуванням “both”. “left” або “right” виконує односторонній буфер на геометрії, причому буферована сторона відносна до напрямку лінії. Це застосовується тільки до геометрії LINESTRING і не впливає на геометрії POINT або POLYGON. За замовчуванням кінцеві кришки є квадратними, коли вказано “left” або “right”.
![]() | |
|
![]() | |
Буфер може обробляти недійсні вхідні дані, а вихідні дані завжди мають дійсну полігональну геометрію. Буферизація за відстанню 0 іноді використовується як спосіб виправлення недійсних полігонів. ST_MakeValidбільш підходить для цього процесу, оскільки може обробляти мультиполігони. |
![]() | |
Буферизація іноді використовується для виконання пошуку в межах певної відстані. Для цього випадку використання ефективніше використовувати ST_DWithin. |
![]() | |
Ця функція ігнорує вимір Z. Вона завжди дає двовимірний результат, навіть якщо використовується для тривимірної геометрії. |
Покращено: 2.5.0 - Підтримка геометрії ST_Buffer була покращена, щоб дозволити вказати бічне буферизування side=both|left|right.
Доступність: 1.5 - ST_Buffer було вдосконалено для підтримки різних кінцевих капсул та типів з'єднання. Це корисно, наприклад, для перетворення лінійних дорожніх об'єктів у полігонні дороги з плоскими або квадратними краями замість заокруглених. Додано тонкий обгортковий об'єкт для географії.
Виконується модулем 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 IEC 13249-3: 5.1.30
The textual results are rounded to whole coordinate units for readability. Each result remains available as text, while the manual initially favors the shared input/output figure.
|
quad_segs=8 (за замовчуванням) Code SELECT ST_Buffer(
ST_GeomFromText('POINT(100 90)'),
50, 'quad_segs=8');Вивід растрових зображень POLYGON((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)) Figure |
quad_segs=2 Code SELECT ST_Buffer(
ST_GeomFromText('POINT(100 90)'),
50, 'quad_segs=2');Вивід растрових зображень POLYGON((150 90,135 55,100 40,65 55,50 90,65 125,100 140,135 125,150 90)) Figure |
|
endcap=round join=round (за замовчуванням) Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'endcap=round join=round');Вивід растрових зображень POLYGON((143 157,144 158,146 159,148 160,150 160,152 160,154 159,156 158,157 157,158 156,159 154,160 152,160 150,160 50,160 48,159 46,158 44,157 43,156 42,154 41,152 40,150 40,148 40,146 41,144 42,143 43,142 44,141 46,140 48,140 50,140 126,57 43,56 42,54 41,52 40,50 40,48 40,46 41,44 42,43 43,42 44,41 46,40 48,40 50,40 52,41 54,42 56,43 57,143 157)) Figure |
endcap=square Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'endcap=square join=round');Вивід растрових зображень POLYGON((143 157,144 158,146 159,148 160,150 160,152 160,154 159,156 158,157 157,158 156,159 154,160 152,160 150,160 50,160 40,140 40,140 126,57 43,50 36,36 50,143 157)) Figure |
|
endcap=flat Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'endcap=flat join=round');Вивід растрових зображень POLYGON((143 157,144 158,146 159,148 160,150 160,152 160,154 159,156 158,157 157,158 156,159 154,160 152,160 150,160 50,140 50,140 126,57 43,43 57,143 157)) Figure |
join=bevel Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'join=bevel');Вивід растрових зображень POLYGON((143 157,160 150,160 50,160 48,159 46,158 44,157 43,156 42,154 41,152 40,150 40,148 40,146 41,144 42,143 43,142 44,141 46,140 48,140 50,140 126,57 43,56 42,54 41,52 40,50 40,48 40,46 41,44 42,43 43,42 44,41 46,40 48,40 50,40 52,41 54,42 56,43 57,143 157)) Figure |
|
join=mitre mitre_limit=5.0 (стандартне обмеження mitre) Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'join=mitre mitre_limit=5.0');Вивід растрових зображень POLYGON((160 174,160 50,160 48,159 46,158 44,157 43,156 42,154 41,152 40,150 40,148 40,146 41,144 42,143 43,142 44,141 46,140 48,140 50,140 126,57 43,56 42,54 41,52 40,50 40,48 40,46 41,44 42,43 43,42 44,41 46,40 48,40 50,40 52,41 54,42 56,43 57,160 174)) Figure |
join=mitre mitre_limit=1 Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'join=mitre mitre_limit=1.0');Вивід растрових зображень POLYGON((148 162,160 157,160 50,160 48,159 46,158 44,157 43,156 42,154 41,152 40,150 40,148 40,146 41,144 42,143 43,142 44,141 46,140 48,140 50,140 126,57 43,56 42,54 41,52 40,50 40,48 40,46 41,44 42,43 43,42 44,41 46,40 48,40 50,40 52,41 54,42 56,43 57,148 162)) Figure |
|
side=left Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'side=left');Вивід растрових зображень POLYGON((150 50,150 150,50 50,43 57,143 157,144 158,146 159,148 160,150 160,152 160,154 159,156 158,157 157,158 156,159 154,160 152,160 150,160 50,150 50)) Figure |
side=right Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'side=right');Вивід растрових зображень POLYGON((50 50,150 150,150 50,140 50,140 126,57 43,50 50)) Figure |
|
side=left join=mitre Code SELECT ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'side=left join=mitre');Вивід растрових зображень POLYGON((150 50,150 150,50 50,43 57,160 174,160 50,150 50)) Figure |
right-hand winding, polygon boundary side=left Code SELECT ST_Buffer(
ST_ForceRHR(ST_Boundary(ST_GeomFromText(
'POLYGON ((50 50,50 150,150 150,150 50,50 50))'))),
20, 'side=left');Вивід растрових зображень POLYGON((50 50,50 150,150 150,150 50,50 50)) Figure |
|
right-hand winding, polygon boundary side=right Code SELECT ST_Buffer(
ST_ForceRHR(ST_Boundary(ST_GeomFromText(
'POLYGON ((50 50,50 150,150 150,150 50,50 50))'))),
20, 'side=right');Вивід растрових зображень POLYGON((50 50,50 70,50 150,150 150,150 50,70 50,50 50),(70 70,130 70,130 130,70 130,70 70)) Figure |
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('POINT(100 90)'::geometry, 50)) As promisingcircle_pcount,
ST_NPoints(ST_Buffer('POINT(100 90)'::geometry, 50, 2)) As lamecircle_pcount;
promisingcircle_pcount | lamecircle_pcount
------------------------+-------------------
33 | 9
A lighter, less smooth circle using only 2 points per quarter circle is an octagon.
The following example creates a 100 meter octagon in NAD83 longitude/latitude by transforming to the Massachusetts state plane meter projection and then buffering. The figure shows the input and output in separate panels because the coordinates are in different SRIDs.
WITH input AS (
SELECT ST_SetSRID(ST_Point(-71.063526, 42.35785), 4269) AS point_4269
), projected AS (
SELECT point_4269,
ST_Transform(point_4269, 26986) AS point_26986
FROM input
)
SELECT point_4269 AS input_point_4269,
ST_Buffer(point_26986, 100, 2) AS octagon_26986
FROM projected;SRID=4269;POINT(-71.063526 42.35785) | SRID=26986;POLYGON((236057.5905746494 900908.7599186979,236028.30125276805 900838.0492405792,235957.5905746494 900808.7599186979,235886.87989653074 900838.0492405792,235857.5905746494 900908.7599186979,235886.87989653074 900979.4705968165,235957.5905746494 901008.7599186979,236028.30125276805 900979.4705968165,236057.5905746494 900908.7599186979))
Buffering a polygon by a positive distance and then by the same negative distance is a morphological closing operation. It can be useful for smoothing noisy boundaries, such as simplifying a coastline by removing narrow inlets and bays. The result intentionally changes the shape and area of the input, and the distance must be chosen in the units of the input SRS. For data in a geographic SRS, transform to a projected SRS suited to the operation first; for cartographic visualization in Web Mercator, using that display SRS can be appropriate.
Smooth a coastline using a 1 km closing operation, then simplify the result. The example uses Massachusetts State Plane meter units for the operation.
WITH projected AS ( SELECT id, ST_Transform(geom, 26986) AS geom FROM coast ), closed AS ( SELECT id, ST_Buffer(ST_Buffer(geom, 1000), -1000) AS geom FROM projected ) SELECT id, ST_Transform(ST_SimplifyPreserveTopology(geom, 50), 4326) AS geom FROM closed;
The same technique is described in Paul Ramsey's Removing Complexities. The final simplification step is optional; use ST_SimplifyPreserveTopology when polygonal validity matters, and check the result against the cartographic or analytical tolerance required by the application.
A small negative buffer can also be used as a heuristic to find narrow polygon spikes. The query below compares how much area and perimeter remain after erosion. A large erosion_index indicates that the perimeter dropped proportionally more than the area. This is only a preselection aid; the threshold and buffer distance must be chosen for the data units and the kind of spike being checked.
WITH sample(id, geom) AS (
VALUES
('plain', 'POLYGON((0 0,10 0,10 10,0 10,0 0))'::geometry),
('spike', 'POLYGON((0 0,10 0,10 10,5.2 10,5 16,4.8 10,0 10,0 0))'::geometry)
),
eroded AS (
SELECT id, geom, ST_Buffer(geom, -0.5) AS eroded_geom
FROM sample
),
scored AS (
SELECT id,
round((
ST_Area(eroded_geom) / ST_Area(geom) /
NULLIF(ST_Perimeter(eroded_geom) / ST_Perimeter(geom), 0)
)::numeric, 3) AS erosion_index
FROM eroded
WHERE NOT ST_IsEmpty(eroded_geom)
)
SELECT id, erosion_index, erosion_index > 1.1 AS possible_spike
FROM scored
ORDER BY id;id | erosion_index | possible_spike -------+---------------+---------------- plain | 0.900 | f spike | 1.147 | t
A variable-distance buffer can be approximated by buffering each vertex of a line by a distance interpolated along the line, building the convex hull for each consecutive pair of vertex buffers, and unioning the segment hulls. As with any geometry buffer, distances are in the units of the input SRS.
Taper a line buffer from 5 to 25 units along the line.
WITH line AS (
SELECT 'LINESTRING(0 0, 100 0, 160 40)'::geometry AS geom
),
vertices AS (
SELECT (dump).path[1] AS n,
(dump).geom AS geom,
line.geom AS line_geom
FROM line
CROSS JOIN LATERAL ST_DumpPoints(line.geom) AS dump
),
radii AS (
SELECT n,
geom,
5 + (25 - 5) * ST_LineLocatePoint(line_geom, geom) AS radius
FROM vertices
),
segments AS (
SELECT n,
geom,
radius,
lead(geom) OVER (ORDER BY n) AS next_geom,
lead(radius) OVER (ORDER BY n) AS next_radius
FROM radii
)
SELECT ST_Union(
ST_ConvexHull(
ST_Collect(
ST_Buffer(geom, radius),
ST_Buffer(next_geom, next_radius)
)
)
) AS tapered_buffer
FROM segments
WHERE next_geom IS NOT NULL;POLYGON((96.758 -16.301,-0.975 -4.904,-1.913 -4.619,-2.778 -4.157,-3.536 -3.536,-4.157 -2.778,-4.619 -1.913,-4.904 -0.975,-5 0,-4.904 0.975,-4.619 1.913,-4.157 2.778,-3.536 3.536,-2.778 4.157,-1.913 4.619,-0.975 4.904,93.101 15.875,142.322 57.678,146.111 60.787,150.433 63.097,155.123 64.52,160 65,164.877 64.52,169.567 63.097,173.889 60.787,177.678 57.678,180.787 53.889,183.097 49.567,184.52 44.877,185 40,184.52 35.123,183.097 30.433,180.787 26.111,177.678 22.322,173.889 19.213,169.567 16.903,106.36 -15.355,103.242 -16.301,100 -16.62,96.758 -16.301))
ST_BuildArea — Створює полігональну геометрію, утворену лініями геометрії.
geometry ST_BuildArea(geometry geom);
Створює площинну геометрію, утворену лініями, що складають вхідну геометрію. Вхідними даними можуть бути LineString, MultiLineString, Polygon, MultiPolygon або GeometryCollection. Результатом є Polygon або MultiPolygon, залежно від вхідних даних. Якщо вхідні лінії не утворюють полігонів, повертається NULL.
На відміну від ST_MakePolygon, ця функція приймає кільця, утворені декількома лініями, і може утворювати будь-яку кількість полігонів.
Ця функція перетворює внутрішні кільця на отвори. Щоб перетворити внутрішні кільця також на полігони, використовуйте ST_Polygonize.
![]() | |
Для коректної роботи цієї функції вхідні лінії повинні бути правильно позначені вузлами. Для позначення ліній можна використовувати ST_Node. Якщо вхідні лінії перетинаються, ця функція створить недійсні полігони. ST_MakeValidможна використовувати для забезпечення дійсності вихідних даних. |
Доступність: 1.1.0
Building an area from five input lines.
WITH data(geom) AS (VALUES
('LINESTRING (180 40,30 20,20 90)'::geometry),
('LINESTRING (180 40,160 160)'::geometry),
('LINESTRING (160 160,80 190,80 120,20 90)'::geometry),
('LINESTRING (80 60,120 130,150 80)'::geometry),
('LINESTRING (80 60,150 80)'::geometry)
)
SELECT ST_BuildArea(ST_Collect(geom )) AS wkt
FROM data;POLYGON((180 40,30 20,20 90,80 120,80 190,160 160,180 40),(150 80,120 130,80 60,150 80))
Create a donut from two circular polygons.
WITH input AS (
SELECT 'POINT(100 90)'::geometry AS geom
),
rings AS (
SELECT ST_Buffer(geom, 25, 'quad_segs=1') AS inring,
ST_Buffer(geom, 50, 'quad_segs=1') AS outring
FROM input
)
SELECT inring AS inner_ring,
outring AS outer_ring,
ST_BuildArea(ST_Collect(inring, outring)) AS area
FROM rings;-[ RECORD 1 ]----- inner_ring | POLYGON((125 90,100 65,75 90,100 115,125 90)) outer_ring | POLYGON((150 90,100 40,50 90,100 140,150 90)) area | POLYGON((150 90,100 40,50 90,100 140,150 90),(125 90,100 115,75 90,100 65,125 90))
Input linework that crosses at non-endpoint intersections must be noded before building areas:
WITH lines(geom) AS (VALUES
('LINESTRING(36 35,45 307)'::geometry),
('LINESTRING(30 290,390 280)'::geometry),
('LINESTRING(320 60,300 310)'::geometry),
('LINESTRING(20 60,320 60)'::geometry),
('LINESTRING(120 140,168 225)'::geometry),
('LINESTRING(140 220,220 150,120 170)'::geometry)
),
noded AS (
SELECT ST_Node(ST_UnaryUnion(ST_Collect(geom))) AS geom FROM lines
)
SELECT ST_BuildArea(geom) AS area
FROM noded;
POLYGON((320 60,36.8 60,44.4 289.6,302.2 282.4,320 60),(156.9 205.3,135.2 167,220 150,156.9 205.3))
ST_Collect, ST_MakePolygon, ST_MakeValid, ST_Node, ST_Polygonize, ST_BdPolyFromText, ST_BdMPolyFromText (обгортки для цієї функції зі стандартним інтерфейсом OGC)
ST_Centroid — Повертає геометричний центр геометрії.
geometry ST_Centroid(geometry g1);
geography ST_Centroid(geography g1, boolean use_spheroid = true);
Обчислює точку, яка є геометричним центром маси геометрії. Для [MULTI]POINTs, центроїд є середнім арифметичним вхідних координат. Для [MULTI]LINESTRINGs, центроїд обчислюється за допомогою зваженої довжини кожного відрізка лінії. Для [MULTI]POLYGONs, центроїд обчислюється за площею. Якщо надано порожню геометрію, повертається порожній GEOMETRYCOLLECTION. Якщо вказано NULL, повертається NULL. Якщо вказано CIRCULARSTRING або COMPOUNDCURVE, вони спочатку перетворюються на лінії за допомогою CurveToLine, а потім так само, як для LINESTRING
Для вхідних даних змішаного розміру результат дорівнює центроїду компонента Геометрії найвищого розміру (оскільки геометрії нижчого розміру не мають "ваги" для центроїда).
Зверніть увагу, що для полігональних геометрій центр ваги не обов'язково лежить всередині полігону. Наприклад, дивіться схему нижче, що зображує центр ваги С-подібного полігону. Щоб побудувати точку, яка гарантовано лежить всередині полігону, використовуйте 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
Centroid of a MultiPoint.
SELECT ST_Centroid( 'MULTIPOINT (8 24,10 92,12 154,17 68,28 10,29 52,29 84,55 50,56 24,131 14,160 180,189 180)');
POINT(60.333 77.667)
Centroid of a LineString.
SELECT ST_Centroid( 'LINESTRING (190 160,10 190,40 90,20 70,10 10,30 40,30 10,110 40,70 10,110 10,140 40,140 10,160 30,180 10)');
POINT(76.191 79.876)
Centroid of a Polygon.
SELECT ST_Centroid( 'POLYGON ((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190))');
POINT(80.251 113.405)
Centroid of the highest-dimension components of a GeometryCollection.
SELECT ST_Centroid(
'GEOMETRYCOLLECTION (POLYGON ((190 170,180 100,80 140,80 160,130 160,110 180,110 190,180 180,190 170)),
LINESTRING (80 120,120 20,140 70,150 30,180 50,190 10),
MULTIPOINT (19 150,22 49,30 13,32 101,45 35,67 88,75 16))');POINT(143.361 148.263)
SELECT 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 ;st_astext ------------- POINT(0.5 1) (1 row)
SELECT 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;st_astext ------------- POINT(0.5 1) (1 row)
Centroids of the parts of a MultiPolygon.
SELECT ST_Collect(ST_Centroid(geom) ORDER BY path)
FROM ST_Dump('MULTIPOLYGON (
((0 0,0 1,1 1,1 0,0 0)),
((2 2,2 3,3 3,3 2,2 2))
)'::geometry);
MULTIPOINT((0.5 0.5),(2.5 2.5))
ST_ChaikinSmoothing — Повертає згладжену версію геометрії, використовуючи алгоритм Чайкіна.
geometry ST_ChaikinSmoothing(geometry geom, integer nIterations = 1, boolean preserveEndPoints = false);
Згладжує лінійну або полігональну геометрію за допомогою алгоритму Чайкіна. Ступінь згладжування контролюється параметром nIterations. На кожній ітерації кожна внутрішня вершина замінюється двома вершинами, розташованими на 1/4 довжини відрізків лінії перед і після вершини. Розумний ступінь згладжування забезпечується 3 ітераціями; максимальне значення обмежено 5.
Якщо preserveEndPoints має значення true, кінцеві точки кілець полігону не згладжуються. Кінцеві точки лінійних об'єктів завжди зберігаються.
![]() | |
Кількість вершин подвоюється з кожною ітерацією, тому геометрія результату може мати набагато більше точок, ніж вхідні дані. Щоб зменшити кількість точок, скористайтеся функцією спрощення результату (див. ST_Simplify, ST_SimplifyPreserveTopologyта ST_SimplifyVW). |
Результатом є інтерпольовані значення для розмірів Z і M, якщо вони присутні.
This function supports 3d and will not drop the z-index.
Доступність: 2.5.0
Smoothing a Polygon using 1, 2 and 3 iterations.
SELECT n AS iterations, ST_ChaikinSmoothing(
'POLYGON ((20 20,60 90,10 150,100 190,190 160,130 120,190 50,140 70,120 10,90 60,20 20))', n
) AS smoothed
FROM generate_series(1, 3) AS n;1 | POLYGON((30 37.5,50 72.5,47.5 105,22.5 135,32.5 160,77.5 180,122.5 182.5,167.5 167.5,175 150,145 130,145 102.5,175 67.5,177.5 55,152.5 65,135 55,125 25,112.5 22.5,97.5 47.5,72.5 50,37.5 30,30 37.5)) 2 | POLYGON((35 46.25,45 63.75,49.375 80.625,48.125 96.875,41.25 112.5,28.75 127.5,25 141.25,30 153.75,43.75 165,66.25 175,88.75 180.625,111.25 181.875,133.75 178.75,156.25 171.25,169.375 163.125,173.125 154.375,167.5 145,152.5 135,145 123.125,145 109.375,152.5 93.75,167.5 76.25,175.625 64.375,176.875 58.125,171.25 57.5,158.75 62.5,148.125 62.5,139.375 57.5,132.5 47.5,127.5 32.5,121.875 24.375,115.625 23.125,108.75 28.75,101.25 41.25,91.25 48.125,78.75 49.375,63.75 45,46.25 35,35.625 31.875,31.875 35.625,35 46.25)) 3 | POLYGON((37.5 50.625,42.5 59.375,46.09375 67.96875,48.28125 76.40625,49.0625 84.6875,48.4375 92.8125,46.40625 100.78125,42.96875 108.59375,38.125 116.25,31.875 123.75,27.8125 130.9375,25.9375 137.8125,26.25 144.375,28.75 150.625,33.4375 156.5625,40.3125 162.1875,49.375 167.5,60.625 172.5,71.875 176.40625,83.125 179.21875,94.375 180.9375,105.625 181.5625,116.875 181.09375,128.125 179.53125,139.375 176.875,150.625 173.125,159.53125 169.21875,166.09375 165.15625,170.3125 160.9375,172.1875 156.5625,171.71875 152.03125,168.90625 147.34375,163.75 142.5,156.25 137.5,150.625 132.03125,146.875 126.09375,145 119.6875,145 112.8125,146.875 105.46875,150.625 97.65625,156.25 89.375,163.75 80.625,169.53125 73.28125,173.59375 67.34375,175.9375 62.8125,176.5625 59.6875,175.46875 57.96875,172.65625 57.65625,168.125 58.75,161.875 61.25,156.09375 62.5,150.78125 62.5,145.9375 61.25,141.5625 58.75,137.65625 55,134.21875 50,131.25 43.75,128.75 36.25,126.09375 30.46875,123.28125 26.40625,120.3125 24.0625,117.1875 23.4375,113.90625 24.53125,110.46875 27.34375,106.875 31.875,103.125 38.125,98.75 42.96875,93.75 46.40625,88.125 48.4375,81.875 49.0625,75 48.28125,67.5 46.09375,59.375 42.5,50.625 37.5,43.59375 34.21875,38.28125 32.65625,34.6875 32.8125,32.8125 34.6875,32.65625 38.28125,34.21875 43.59375,37.5 50.625))
Smoothing a LineString using 1, 2 and 3 iterations.
SELECT n AS iterations, ST_ChaikinSmoothing(
'LINESTRING (10 140,80 130,100 190,190 150,140 20,120 120,50 30,30 100)', n
) AS smoothed
FROM generate_series(1, 3) AS n;1 | LINESTRING(10 140,62.5 132.5,85 145,95 175,122.5 180,167.5 160,177.5 117.5,152.5 52.5,135 45,125 95,102.5 97.5,67.5 52.5,45 47.5,30 100) 2 | LINESTRING(10 140,49.375 134.375,68.125 135.625,79.375 141.875,87.5 152.5,92.5 167.5,101.875 176.25,115.625 178.75,133.75 175,156.25 165,170 149.375,175 128.125,171.25 101.25,158.75 68.75,148.125 50.625,139.375 46.875,132.5 57.5,127.5 82.5,119.375 95.625,108.125 96.875,93.75 86.25,76.25 63.75,61.875 51.25,50.625 48.75,41.25 60.625,30 100) 3 | LINESTRING(10 140,39.53125 135.78125,54.0625 134.6875,63.4375 135.3125,70.9375 137.1875,76.5625 140.3125,81.40625 144.53125,85.46875 149.84375,88.75 156.25,91.25 163.75,94.84375 169.6875,99.53125 174.0625,105.3125 176.875,112.1875 178.125,120.15625 177.8125,129.21875 175.9375,139.375 172.5,150.625 167.5,159.6875 161.09375,166.5625 153.28125,171.25 144.0625,173.75 133.4375,174.0625 121.40625,172.1875 107.96875,168.125 93.125,161.875 76.875,156.09375 64.21875,150.78125 55.15625,145.9375 49.6875,141.5625 47.8125,137.65625 49.53125,134.21875 54.84375,131.25 63.75,128.75 76.25,125.46875 85.78125,121.40625 92.34375,116.5625 95.9375,110.9375 96.5625,104.53125 94.21875,97.34375 88.90625,89.375 80.625,80.625 69.375,72.65625 60.625,65.46875 54.375,59.0625 50.625,53.4375 49.375,48.28125 51.71875,43.59375 57.65625,38.4375 70.46875,30 100)
Smoothing a triangle shows the weakest visual change, so it is kept last.
SELECT ST_ChaikinSmoothing(geom) smoothed FROM (SELECT 'POLYGON((0 0,8 8,0 16,0 0))'::geometry geom) AS foo;
POLYGON((2 2,6 6,6 10,2 14,0 12,0 4,2 2))
ST_CatmullRomSmoothing — Returns a smoothed version of a geometry, using the Catmull-Rom spline algorithm
geometry ST_CatmullRomSmoothing(geometry geom, integer nSegments = 5);
Smoothes a linear or polygonal geometry using the Catmull-Rom spline algorithm. Unlike ST_ChaikinSmoothing, this is an interpolating spline: the output curve passes through every original vertex. Between each pair of consecutive original vertices, nSegments - 1 new intermediate points are inserted.
The nSegments parameter controls the density of the output. With nSegments = 5 (the default), each original span is divided into 5 sub-segments (inserting 4 new points per span). The minimum value is 2.
At least 4 input vertices are required to apply smoothing; geometries with fewer vertices are returned unchanged. Points and multipoints are always returned unchanged.
![]() | |
The output vertex count grows as |
Результатом є інтерпольовані значення для розмірів Z і M, якщо вони присутні.
This function supports 3d and will not drop the z-index.
Доступність: 3.6.0
Smoothing a LineString using nSegments = 5 and 10.
WITH input(geom) AS (VALUES
('LINESTRING (10 140,80 130,100 190,190 150,140 20,120 120,50 30,30 100)'::geometry)
)
SELECT ST_CatmullRomSmoothing(geom, 5) AS segments_5,
ST_CatmullRomSmoothing(geom, 10) AS segments_10
FROM input;LINESTRING(10 140,24.8 136.88,40.4 132.64,55.6 128.96,69.2 127.52,80 130,86.08 139.12,88.24 153.76,89.36 169.84,92.32 183.28,100 190,115.76 189.84,137.68 185.52,160.72 177.28,179.84 165.36,190 150,188.48 126.08,178.64 93.44,164.56 59.76,150.32 32.72,140 20,134.88 28.32,132.24 52.56,130.16 82.64,126.72 108.48,120 120,108.4 111.6,93.2 90,76.8 63.6,61.6 40.8,50 30,42.8 33.76,38.4 46.48,35.6 64.32,33.2 83.44,30 100) | LINESTRING(10 140,17.225 138.685,24.8 136.88,32.575 134.795,40.4 132.64,48.125 130.625,55.6 128.96,62.675 127.855,69.2 127.52,75.025 128.165,80 130,83.71 133.615,86.08 139.12,87.47 146.005,88.24 153.76,88.75 161.875,89.36 169.84,90.43 177.145,92.32 183.28,95.39 187.735,100 190,106.795 190.455,115.76 189.84,126.265 188.185,137.68 185.52,149.375 181.875,160.72 177.28,171.085 171.765,179.84 165.36,186.355 158.095,190 150,190.535 139.61,188.48 126.08,184.345 110.37,178.64 93.44,171.875 76.25,164.56 59.76,157.205 44.93,150.32 32.72,144.415 24.09,140 20,137.01 21.54,134.88 28.32,133.37 39.08,132.24 52.56,131.25 67.5,130.16 82.64,128.73 96.72,126.72 108.48,123.89 116.66,120 120,114.8 117.975,108.4 111.6,101.1 101.925,93.2 90,85 76.875,76.8 63.6,68.9 51.225,61.6 40.8,55.2 33.375,50 30,45.975 30.52,42.8 33.76,40.325 39.24,38.4 46.48,36.875 55,35.6 64.32,34.425 73.96,33.2 83.44,31.775 92.28,30 100)
Smoothing a 4-point collinear line with default nSegments=5 shows the minimal change case.
SELECT ST_CatmullRomSmoothing('LINESTRING(0 0,5 0,10 0,15 0)');LINESTRING(0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0,10 0,11 0,12 0,13 0,14 0,15 0)
Smoothing a Polygon using nSegments = 5 and 10. This larger example is kept last.
WITH input(geom) AS (VALUES
('POLYGON ((20 20,60 90,10 150,100 190,190 160,130 120,190 50,140 70,120 10,90 60,20 20))'::geometry)
)
SELECT ST_CatmullRomSmoothing(geom, 5) AS segments_5,
ST_CatmullRomSmoothing(geom, 10) AS segments_10
FROM input;POLYGON((20 20,22.4 27.12,32.4 40.56,45.2 57.44,56 74.88,60 90,53.52 102.96,39.76 115.68,24.24 127.92,12.48 139.44,10 150,19.04 160.4,35.92 170.8,57.28 180,79.76 186.8,100 190,120.4 188.64,143.2 183.52,164.8 176.08,181.6 167.76,190 160,185.68 153.12,171.04 146.16,152.56 138.64,136.72 130.08,130 120,136.08 106.48,150.64 89.84,168.16 72.96,183.12 58.72,190 50,186.56 49.52,176.48 55.36,163.12 63.44,149.84 69.68,140 70,134.24 61.36,130.32 46.48,127.28 29.92,124.16 16.24,120 10,115.28 14.4,110.64 26.4,105.36 41.2,98.72 54,90 60,76.8 56,59.6 45.2,42 32.4,27.6 22.4,20 20)) | POLYGON((20 20,19.95 22.59,22.4 27.12,26.75 33.23,32.4 40.56,38.75 48.75,45.2 57.44,51.15 66.27,56 74.88,59.15 82.91,60 90,58.015 96.495,53.52 102.96,47.205 109.365,39.76 115.68,31.875 121.875,24.24 127.92,17.545 133.785,12.48 139.44,9.735 144.855,10 150,13.33 155.125,19.04 160.4,26.71 165.675,35.92 170.8,46.25 175.625,57.28 180,68.59 183.775,79.76 186.8,90.37 188.925,100 190,109.675 189.88,120.4 188.64,131.725 186.46,143.2 183.52,154.375 180,164.8 176.08,174.025 171.94,181.6 167.76,187.075 163.72,190 160,189.535 156.54,185.68 153.12,179.245 149.68,171.04 146.16,161.875 142.5,152.56 138.64,143.905 134.52,136.72 130.08,131.815 125.26,130 120,131.635 113.81,136.08 106.48,142.645 98.37,150.64 89.84,159.375 81.25,168.16 72.96,176.305 65.33,183.12 58.72,187.915 53.49,190 50,189.32 48.715,186.56 49.52,182.14 51.905,176.48 55.36,170 59.375,163.12 63.44,156.26 67.045,149.84 69.68,144.28 70.835,140 70,136.83 66.745,134.24 61.36,132.11 54.415,130.32 46.48,128.75 38.125,127.28 29.92,125.79 22.435,124.16 16.24,122.27 11.905,120 10,117.585 10.95,115.28 14.4,112.995 19.75,110.64 26.4,108.125 33.75,105.36 41.2,102.255 48.15,98.72 54,94.665 58.15,90 60,84.125 59.15,76.8 56,68.475 51.15,59.6 45.2,50.625 38.75,42 32.4,34.175 26.75,27.6 22.4,22.725 19.95,20 20))
ST_ConcaveHull — Обчислює можливу увігнуту геометрію, яка містить усі вершини вхідної геометрії
geometry ST_ConcaveHull(geometry param_geom, float param_pctconvex, boolean param_allow_holes = false);
Увігнутий контур — це (зазвичай) увігнута геометрія, яка містить вхідні дані, а її вершини є підмножиною вершин вхідних даних. У загальному випадку увігнутий корпус є полігоном. Увігнутий корпус двох або більше колінеарних точок є двоточковим LineString. Увігнутий корпус однієї або більше ідентичних точок є точкою. Полігон не буде містити отворів, якщо опціональний аргумент param_allow_holes не вказано як true.
Уявіть собі увігнутий контур, що "обгортає" набір точок. Це відрізняється від опуклого контуру, який більше нагадує гумку, натягнуту навколо точок. Увігнутий контур зазвичай має меншу площу і є більш природною межею для вхідних точок.
Параметр param_pctconvex контролює увігнутість обчислюваної оболонки. Значення 1 створює опуклу оболонку. Значення від 1 до 0 створюють оболонки із зростаючою увігнутістю. Значення 0 створює оболонку з максимальною увігнутістю (але все одно єдиний полігон). Вибір відповідного значення залежить від характеру вхідних даних, але часто значення між 0,3 і 0,1 дають прийнятні результати.
![]() | |
Технічно, параметр |
Для точкових і лінійних вхідних даних оболонка охоплюватиме всі точки вхідних даних. Для полігональних вхідних даних оболонка охоплюватиме всі точки вхідних даних а також всі області, що охоплюються вхідними даними. Якщо ви хочете отримати точкову оболонку полігональних вхідних даних, спочатку перетворіть їх у точки за допомогою ST_Points.
This is not an aggregate function. To compute the concave hull of a set of geometries use ST_Collect (e.g. ST_ConcaveHull(ST_Collect(geom ), 0.80).
Доступність: 2.0.0
Покращено: 3.3.0, увімкнено вбудовану реалізацію GEOS для GEOS 3.11+
Concave hull of a MultiPoint.
SELECT 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)) (1 row)
Concave hull of a MultiPoint, allowing holes.
SELECT 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)) (1 row)
Порівняння увігнутого корпусу полігону з увігнутим корпусом складових точок. Корпус дотримується меж полігону, тоді як оболонка на основі точок цього не робить.
WITH data(geom) AS (VALUES
('POLYGON ((10 90,39 85,61 79,50 90,80 80,95 55,25 60,90 45,70 16,63 38,60 10,50 30,43 27,30 10,20 20,10 90))'::geometry)
)
SELECT ST_ConcaveHull(geom, 0.1) AS polygon_hull,
ST_ConcaveHull(ST_Points(geom), 0.1) AS points_hull
FROM data;
POLYGON((60 10,50 30,43 27,30 10,20 20,10 90,39 85,50 90,80 80,95 55,90 45,70 16,60 10)) | POLYGON((25 60,10 90,39 85,50 90,80 80,95 55,90 45,70 16,60 10,30 10,20 20,43 27,50 30,63 38,61 79,25 60))
Використання з ST_Collect для обчислення увігнутої оболонки набору геометрій.
This example estimates an infected area from point observations.
SELECT disease_type,
ST_ConcaveHull(ST_Collect(obs_pnt), 0.3 ) AS geom
FROM disease_obs
GROUP BY disease_type;
ST_ConvexHull, ST_Collect, CG_AlphaShape, CG_OptimalAlphaShape
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 IEC 13249-3: 5.1.16
This function supports 3d and will not drop the z-index.
Compute the convex hull of a MultiLineString and a MultiPoint.
SELECT 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)) (1 row)
Використання разом із ST_Collect для обчислення опуклих оболонок наборів геометричних фігур.
This example returns an estimated infected area from 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 — Повертає триангуляцію Делауея вершин геометрії.
geometry ST_DelaunayTriangles(geometry g1, float tolerance = 0.0, int4 flags = 0);
Обчислює триангуляцію Делоне вершин вхідної геометрії. Опціональний параметр tolerance можна використовувати для з'єднання сусідніх вхідних вершин, що в деяких ситуаціях підвищує надійність. Результуюча геометрія обмежується опуклою оболонкою вхідних вершин. Представлення результуючої геометрії визначається кодом flags:
0 - GEOMETRYCOLLECTION трикутних полігонів (за замовчуванням)
1 - MULTILINESTRING граней триангуляції
2 - TIN триангуляції
Виконується модулем 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).
Triangulation of the vertices of a polygon and a buffered point.
WITH data AS (
SELECT polygon, ST_Buffer(center, 20) AS point_buffer
FROM (SELECT
'POLYGON((175 150,20 40,50 60,125 100,175 150))'::geometry AS polygon,
'POINT(110 170)'::geometry AS center
) AS input
)
SELECT ST_DelaunayTriangles(ST_Union(polygon, point_buffer)) AS triangles
FROM data;GEOMETRYCOLLECTION(POLYGON((96 184,93 181,96 156,96 184)), POLYGON((96 184,96 156,102 188,96 184)), POLYGON((96 184,102 188,99 187,96 184)), POLYGON((102 188,96 156,99 153,102 188)), POLYGON((102 188,99 153,102 152,102 188)), POLYGON((102 188,102 152,106 190,102 188)), POLYGON((106 190,102 152,106 150,106 190)), POLYGON((106 190,106 150,110 190,106 190)), POLYGON((110 190,106 150,110 150,110 190)), POLYGON((110 190,110 150,118 188,110 190)), POLYGON((110 190,118 188,114 190,110 190)), POLYGON((118 188,110 150,121 153,118 188)), POLYGON((118 188,121 153,121 187,118 188)), POLYGON((121 187,121 153,124 156,121 187)), POLYGON((121 187,124 156,124 184,121 187)), POLYGON((121 187,124 184,175 150,121 187)), POLYGON((175 150,124 184,127 181,175 150)), POLYGON((175 150,127 181,128 178,175 150)), POLYGON((175 150,128 178,130 174,175 150)), POLYGON((175 150,130 174,130 170,175 150)), POLYGON((175 150,130 170,130 166,175 150)), POLYGON((175 150,130 166,128 162,175 150)), POLYGON((175 150,128 162,127 159,175 150)), POLYGON((175 150,127 159,124 156,175 150)), POLYGON((175 150,124 156,125 100,175 150)), POLYGON((125 100,124 156,121 153,125 100)), POLYGON((125 100,121 153,118 152,125 100)), POLYGON((125 100,118 152,114 150,125 100)), POLYGON((125 100,114 150,110 150,125 100)), POLYGON((125 100,110 150,106 150,125 100)), POLYGON((125 100,106 150,102 152,125 100)), POLYGON((125 100,102 152,99 153,125 100)), POLYGON((125 100,99 153,50 60,125 100)), POLYGON((125 100,50 60,20 40,125 100)), POLYGON((20 40,50 60,90 166,20 40)), POLYGON((20 40,90 166,90 170,20 40)), POLYGON((20 40,90 170,90 174,20 40)), POLYGON((20 40,90 174,92 178,20 40)), POLYGON((92 178,90 174,90 170,92 178)), POLYGON((92 178,90 170,92 162,92 178)), POLYGON((92 178,92 162,93 159,92 178)), POLYGON((92 178,93 159,93 181,92 178)), POLYGON((93 181,93 159,96 156,93 181)), POLYGON((96 156,93 159,50 60,96 156)), POLYGON((96 156,50 60,99 153,96 156)), POLYGON((50 60,93 159,92 162,50 60)), POLYGON((50 60,92 162,90 166,50 60)), POLYGON((90 166,92 162,90 170,90 166)), POLYGON((110 150,114 150,121 153,110 150)), POLYGON((121 153,114 150,118 152,121 153)), POLYGON((124 156,127 159,130 166,124 156)), POLYGON((124 156,130 166,128 178,124 156)), POLYGON((124 156,128 178,124 184,124 156)), POLYGON((124 184,128 178,127 181,124 184)), POLYGON((128 178,130 166,130 170,128 178)), POLYGON((128 178,130 170,130 174,128 178)), POLYGON((130 166,127 159,128 162,130 166)))
Triangulation edges returned as a MULTILINESTRING.
WITH data AS (
SELECT polygon, ST_Buffer(center, 20) AS point_buffer
FROM (SELECT
'POLYGON((175 150,20 40,50 60,125 100,175 150))'::geometry AS polygon,
'POINT(110 170)'::geometry AS center
) AS input
)
SELECT ST_DelaunayTriangles(ST_Union(polygon, point_buffer), 0.001, 1) AS triangulation_edges
FROM data;MULTILINESTRING((121 187,175 150),(118 188,121 187),(114 190,118 188),(110 190,114 190),(106 190,110 190),(102 188,106 190),(99 187,102 188),(96 184,99 187),(93 181,96 184),(92 178,93 181),(20 40,92 178),(20 40,125 100),(125 100,175 150),(124 156,125 100),(124 156,175 150),(124 156,127 159),(127 159,175 150),(127 159,128 162),(128 162,175 150),(128 162,130 166),(130 166,175 150),(130 166,130 170),(130 170,175 150),(130 174,130 170),(130 174,175 150),(128 178,130 174),(128 178,175 150),(127 181,128 178),(127 181,175 150),(124 184,127 181),(124 184,175 150),(121 187,124 184),(124 156,124 184),(121 187,124 156),(121 153,124 156),(121 153,121 187),(118 188,121 153),(110 150,121 153),(110 150,118 188),(110 150,110 190),(110 190,118 188),(106 150,110 150),(106 150,110 190),(106 190,106 150),(102 152,106 150),(102 152,106 190),(102 152,102 188),(99 153,102 152),(99 153,102 188),(96 156,99 153),(96 156,102 188),(96 156,96 184),(96 184,102 188),(93 181,96 156),(93 159,96 156),(93 159,93 181),(92 178,93 159),(92 162,93 159),(92 162,92 178),(90 170,92 162),(90 170,92 178),(90 170,90 174),(90 174,92 178),(20 40,90 174),(20 40,90 170),(90 170,90 166),(20 40,90 166),(50 60,90 166),(20 40,50 60),(50 60,125 100),(50 60,99 153),(99 153,125 100),(50 60,96 156),(50 60,93 159),(50 60,92 162),(90 166,92 162),(102 152,125 100),(106 150,125 100),(110 150,125 100),(110 150,114 150),(114 150,125 100),(114 150,118 152),(118 152,125 100),(118 152,121 153),(121 153,125 100),(114 150,121 153),(124 184,128 178),(124 156,128 178),(128 178,130 166),(124 156,130 166),(127 159,130 166),(128 178,130 170))
Triangulation of 42 points forming an L shape.
WITH data AS (
SELECT '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)'::geometry AS l_shape_points
)
SELECT ST_DelaunayTriangles(l_shape_points) AS triangles
FROM data;GEOMETRYCOLLECTION(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)), POLYGON((154 6,150 14,134 6,154 6)), POLYGON((134 6,150 14,134 14,134 6)), POLYGON((134 6,134 14,114 14,134 6)), POLYGON((134 6,114 14,114 6,134 6)), POLYGON((114 6,114 14,94 14,114 6)), POLYGON((114 6,94 14,94 6,114 6)), POLYGON((94 6,94 14,74 14,94 6)), POLYGON((94 6,74 14,74 6,94 6)), POLYGON((74 6,74 14,54 14,74 6)), POLYGON((74 6,54 14,54 6,74 6)), POLYGON((54 6,54 14,34 14,54 6)), POLYGON((54 6,34 14,34 6,54 6)), POLYGON((34 6,34 14,14 14,34 6)), POLYGON((34 6,14 14,14 6,34 6)), POLYGON((14 6,14 14,10 6,14 6)), POLYGON((10 6,14 14,6 10,10 6)), POLYGON((10 6,6 10,7 7,10 6)), POLYGON((10 6,7 7,8 6,10 6)), POLYGON((7 7,6 10,6 8,7 7)), POLYGON((6 10,14 14,6 30,6 10)), POLYGON((6 30,14 14,14 34,6 30)), POLYGON((6 30,14 34,6 50,6 30)), POLYGON((6 50,14 34,14 54,6 50)), POLYGON((6 50,14 54,6 70,6 50)), POLYGON((6 70,14 54,14 74,6 70)), POLYGON((6 70,14 74,6 90,6 70)), POLYGON((6 90,14 74,14 94,6 90)), POLYGON((6 90,14 94,6 110,6 90)), POLYGON((6 110,14 94,14 114,6 110)), POLYGON((6 110,14 114,6 130,6 110)), POLYGON((6 130,14 114,14 134,6 130)), POLYGON((6 130,14 134,6 150,6 130)), POLYGON((6 150,14 134,14 154,6 150)), POLYGON((6 150,14 154,6 170,6 150)), POLYGON((6 170,14 154,14 174,6 170)), POLYGON((6 170,14 174,6 190,6 170)), POLYGON((14 154,14 134,150 14,14 154)), POLYGON((150 14,14 134,134 14,150 14)), POLYGON((134 14,14 134,114 14,134 14)), POLYGON((114 14,14 134,14 114,114 14)), POLYGON((114 14,14 114,94 14,114 14)), POLYGON((94 14,14 114,14 94,94 14)), POLYGON((94 14,14 94,74 14,94 14)), POLYGON((74 14,14 94,14 74,74 14)), POLYGON((74 14,14 74,54 14,74 14)), POLYGON((54 14,14 74,14 54,54 14)), POLYGON((54 14,14 54,34 14,54 14)), POLYGON((34 14,14 54,14 34,34 14)), POLYGON((34 14,14 34,14 14,34 14)))
Приклад використання вершин із значеннями Z.
SELECT ST_DelaunayTriangles( 'MULTIPOINT Z(14 14 10,150 14 100,34 6 25,20 10 150)'::geometry);
GEOMETRYCOLLECTION Z (POLYGON Z ((14 14 10,20 10 150,34 6 25,14 14 10)),POLYGON Z ((14 14 10,34 6 25,150 14 100,14 14 10)))
ST_FilterByM — Видаляє вершини на основі їхнього значення M
geometry ST_FilterByM(geometry geom, double precision min, double precision max = null, boolean returnM = false);
Відфільтровує вершинні точки на основі їх M-значення. Повертає геометрію, що містить тільки вершинні точки, M-значення яких більше або дорівнює мінімальному значенню і менше або дорівнює максимальному значенню. Якщо аргумент max-value не вказано, враховується тільки значення min. Якщо четвертий аргумент не вказано, m-значення не буде включено в результуючу геометрію. Якщо в результуючій геометрії залишилося занадто мало вершинних точок для її типу, буде повернута порожня геометрія. У колекції геометрій геометрії без достатньої кількості точок просто пропускаються без повідомлення.
Ця функція в основному призначена для використання разом із ST_SetEffectiveArea. ST_EffectiveArea встановлює ефективну площу вершини в її m-значенні. За допомогою ST_FilterByM можна отримати спрощену версію геометрії без будь-яких обчислень, просто за допомогою фільтрування
![]() | |
Існує різниця в тому, що повертає ST_SimplifyVW, коли недостатньо точок відповідають критеріям, порівняно з ST_FilterByM. ST_SimplifyVW повертає геометрію з достатньою кількістю точок, тоді як ST_FilterByM повертає порожню геометрію |
![]() | |
Зверніть увагу, що повернута геометрія може бути недійсною |
![]() | |
Ця функція повертає всі розмірності, включаючи значення Z і M |
Доступність: 2.5.0
Лінійний рядок фільтрується
SELECT ST_FilterByM(geom, 30) simplified
FROM (SELECT ST_SetEffectiveArea('LINESTRING(5 2,3 8,6 20,7 25,10 10)'::geometry) geom) As foo;LINESTRING(5 2,7 25,10 10)
ST_GeneratePoints — Генерує множину випадкових точок, що містяться в полігоні або полігоні.
geometry ST_GeneratePoints(geometry g, integer npoints, integer seed = 0);
ST_GeneratePoints генерує мультиточку, що складається з заданої кількості псевдовипадкових точок, які лежать у межах вхідної області. Опціональний параметр seed використовується для повторного генерування детермінованої послідовності точок і повинен бути більшим за нуль.
Доступність: 2.3.0
Покращено: 3.0.0, додано параметр seed
Generate 12 points inside a buffered LineString using the deterministic seed 1996.
WITH source AS (
SELECT ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10, 'endcap=round join=round') AS geom
)
SELECT geom AS area,
ST_GeneratePoints(geom, 12, 1996) AS points
FROM source;POLYGON((142.929 157.071,144.444 158.315,146.173 159.239,148.049 159.808,150 160,151.951 159.808,153.827 159.239,155.556 158.315,157.071 157.071,158.315 155.556,159.239 153.827,159.808 151.951,160 150,160 50,159.808 48.049,159.239 46.173,158.315 44.444,157.071 42.929,155.556 41.685,153.827 40.761,151.951 40.192,150 40,148.049 40.192,146.173 40.761,144.444 41.685,142.929 42.929,141.685 44.444,140.761 46.173,140.192 48.049,140 50,140 125.858,57.071 42.929,55.556 41.685,53.827 40.761,51.951 40.192,50 40,48.049 40.192,46.173 40.761,44.444 41.685,42.929 42.929,41.685 44.444,40.761 46.173,40.192 48.049,40 50,40.192 51.951,40.761 53.827,41.685 55.556,42.929 57.071,142.929 157.071)) | MULTIPOINT((97.546 111.15),(155.206 69.56),(101.94 114.818),(90.308 91.125),(151.257 106.401),(143.12 120.461),(152.952 146.697),(119.774 123.985),(148.672 40.92),(54.376 45.337),(150.667 88.153),(129.634 120.578))
Задано таблицю полігонів s. Поверніть 12 окремих точок для кожного полігону. Результати будуть різними при кожному запуску.
SELECT s.id, dp.path[1] AS pt_id, dp.geom FROM s, ST_DumpPoints(ST_GeneratePoints(s.geom, 12)) AS dp;
Generate dot-density points from a polygon table, using the absolute value of an attribute as the number of points and keeping the sign of the attribute for styling.
SELECT z.id,
CASE WHEN z.count_delta < 0 THEN -1 ELSE 1 END AS sign,
dp.path[1] AS pt_id,
dp.geom
FROM zones AS z
CROSS JOIN LATERAL ST_DumpPoints(
ST_GeneratePoints(z.geom, abs(z.count_delta)::integer, z.id + 1)
) AS dp
WHERE z.count_delta <> 0;ST_GeometricMedian — Повертає геометричну медіану MultiPoint.
geometry ST_GeometricMedian ( geometry geom, float8 tolerance = NULL, int max_iter = 10000, boolean fail_if_not_converged = false);
Обчислює приблизну геометричну медіану геометрії MultiPoint за допомогою алгоритму Вайзфельда. Геометрична медіана — це точка, що мінімізує суму відстаней до вхідних точок. Вона забезпечує міру центральності, яка є менш чутливою до виняткових точок, ніж центроїд (центр маси).
Алгоритм повторюється доти, доки зміна відстані між послідовними ітераціями не стане меншою за заданий параметр tolerance. Якщо ця умова не виконана після max_iterations ітерацій, функція видає помилку і завершує роботу, якщо fail_if_not_converged не встановлено в false (за замовчуванням).
Якщо аргумент tolerance не вказано, значення допуску обчислюється на основі розмірів вхідної геометрії.
Якщо присутні, значення вхідної точки M інтерпретуються як їх відносні ваги.
Доступність: 2.3.0
Покращено: 2.5.0 Додано підтримку M як ваги точок.
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
Compare the geometric median and centroid of a MultiPoint.
WITH test AS ( SELECT 'MULTIPOINT((10 10),(10 40),(40 10),(190 190))'::geometry geom) SELECT ST_Centroid(geom) centroid, ST_GeometricMedian(geom) median FROM test;
centroid | median --------------------+---------------------------------------- POINT(62.5 62.5) | POINT(25.01778421249728 25.01778421249728) (1 row)
ST_LineMerge — Повернути лінії, утворені зшиванням MultiLineString.
geometry ST_LineMerge(geometry amultilinestring);
geometry ST_LineMerge(geometry amultilinestring, boolean directed);
Повертає LineString або MultiLineString, утворений шляхом з'єднання лінійних елементів MultiLineString. Лінії з'єднуються в кінцевих точках на двосторонніх перетинах. Лінії не з'єднуються на перетинах з трьома або більше точками.
Якщо directed має значення TRUE, то ST_LineMerge не змінюватиме порядок точок у LineStrings, тому лінії з протилежними напрямками не будуть об'єднані
![]() | |
Використовуйте тільки з MultiLineString/LineStrings. Інші типи геометрії повертають порожній GeometryCollection |
Виконується модулем GEOS.
Покращено: 3.3.0 приймає спрямований параметр.
Для використання параметра directed необхідна версія GEOS >= 3.11.0.
Доступність: 1.1.0
![]() | |
Ця функція видаляє розмірність M. |
Nodes with cardinality 2 are merged away.
SELECT ST_LineMerge('MULTILINESTRING((10 160,60 120),(120 140,60 120),(120 140,180 120))'
);LINESTRING(10 160,60 120,120 140,180 120)
Лінії не об'єднуються на перетинах зі ступенем > 2.
SELECT ST_LineMerge('MULTILINESTRING((10 160,60 120),(120 140,60 120),(120 140,180 120),(100 180,120 140))'
);MULTILINESTRING((10 160,60 120,120 140),(100 180,120 140),(120 140,180 120))
Якщо об'єднання неможливе через непересічні лінії, повертається оригінальний MultiLineString.
SELECT ST_LineMerge('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45.2 -33.2,-46 -32))'
);MULTILINESTRING((-45.2 -33.2,-46 -32),(-29 -27,-30 -29.7,-36 -31,-45 -33))
Lines with opposite directions are not merged if directed is TRUE.
SELECT ST_LineMerge('MULTILINESTRING((60 30,10 70),(120 50,60 30),(120 50,180 30))',
TRUE);MULTILINESTRING((120 50,60 30,10 70),(120 50,180 30))
SELECT ST_LineMerge('MULTILINESTRING((-29 -27 11,-30 -29.7 10,-36 -31 5,-45 -33 6),(-29 -27 12,-30 -29.7 5),(-45 -33 1,-46 -32 11))'
);LINESTRING Z (-30 -29.7 5,-29 -27 11,-30 -29.7 10,-36 -31 5,-45 -33 1,-46 -32 11)
ST_MaximumInscribedCircle — Обчислює найбільше коло, що міститься в геометрії.
(geometry, geometry, double precision) ST_MaximumInscribedCircle(geometry geom);
Знаходить найбільше коло, яке міститься в (мульти)полігоні або не перетинається з лініями та точками. Повертає запис із полями:
center - центр кола
nearest - точка на геометрії, найближча до центру
radius - радіус кола
Для полігональних вхідних даних коло вписується в межі кільця, використовуючи внутрішні кільця як межі. Для лінійних і точкових вхідних даних коло вписується в опуклу оболонку вхідних даних, використовуючи лінії і точки вхідних даних як додаткові межі.
Доступність: 3.1.0.
Потрібна версія GEOS >= 3.9.0.
Maximum inscribed circle of a polygon. Center, nearest point, radius, circle, and radius line are returned.
WITH mic AS (
SELECT * 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))')
)
SELECT round(radius::numeric, 3) AS radius,
ST_SnapToGrid(center, 1) AS center,
ST_SnapToGrid(nearest, 1) AS nearest,
ST_SnapToGrid(ST_Buffer(center, radius), 1) AS circle,
ST_SnapToGrid(ST_MakeLine(center, nearest), 1) AS radius_line
FROM mic;-[ RECORD 1 ]----- radius | 45.189 center | POINT(97 76) nearest | POINT(62 105) circle | POLYGON((142 76,141 68,139 59,135 51,129 44,122 39,114 35,106 32,97 31,88 32,80 35,72 39,65 44,59 51,55 59,53 68,52 76,53 85,55 94,59 101,65 108,72 114,80 118,88 121,97 122,106 121,114 118,122 114,129 108,135 101,139 94,141 85,142 76)) radius_line | LINESTRING(97 76,62 105)
Maximum inscribed circle of a MultiLineString.
WITH mic AS (
SELECT * FROM ST_MaximumInscribedCircle(
'MULTILINESTRING((100 40,10 150),(10 160,100 150),(190 150,80 40))')
)
SELECT round(radius::numeric, 3) AS radius,
ST_SnapToGrid(center, 1) AS center,
ST_SnapToGrid(nearest, 1) AS nearest,
ST_SnapToGrid(ST_Buffer(center, radius), 1) AS circle,
ST_SnapToGrid(ST_MakeLine(center, nearest), 1) AS radius_line
FROM mic;-[ RECORD 1 ]----- radius | 39.924 center | POINT(94 110) nearest | POINT(63 85) circle | POLYGON((134 110,133 103,131 95,127 88,122 82,116 77,109 74,102 71,94 71,86 71,79 74,72 77,66 82,61 88,57 95,55 103,54 110,55 118,57 126,61 133,66 139,72 144,79 147,86 150,94 150,102 150,109 147,116 144,122 139,127 133,131 126,133 118,134 110)) radius_line | LINESTRING(94 110,63 85)
ST_LargestEmptyCircle — Обчислює найбільше коло, яке не перетинається з геометрією.
(geometry, geometry, double precision) ST_LargestEmptyCircle(geometry geom, double precision tolerance=0.0, geometry boundary=POINT EMPTY);
Знаходить найбільше коло, яке не перетинається з набором точкових і лінійних перешкод. (Полігональні геометрії можуть бути включені як перешкоди, але використовуються тільки їх межі.) Центр кола обмежений межами полігональної фігури, яка за замовчуванням є опуклою оболонкою вхідної геометрії. Центр кола — це точка всередині межі, яка має найбільшу відстань від перешкод. Саме коло задається центром і найближчою точкою, що лежить на перешкоді, яка визначає радіус кола.
Центр кола визначається з заданою точністю, яка визначається допуском на відстань, за допомогою ітераційного алгоритму. Якщо точність відстані не вказана, використовується розумне значення за замовчуванням.
Повертає запис із полями:
center - центр кола
nearest - точка на геометрії, найближча до центру
radius - радіус кола
Щоб знайти найбільше порожнє коло всередині полігону, див. ST_MaximumInscribedCircle.
Доступність: 3.4.0.
Потрібна версія GEOS >= 3.9.0.
Largest empty circle within a set of lines.
WITH obstacles(geom) AS (VALUES ('MULTILINESTRING (
(10 100,60 180,130 150,190 160),
(20 50,70 70,90 20,110 40),
(160 30,100 100,180 100))'::geometry)),
circle AS (
SELECT result.*
FROM obstacles
CROSS JOIN LATERAL ST_LargestEmptyCircle(obstacles.geom) AS result
)
SELECT round(radius::numeric, 6) AS radius,
ST_SnapToGrid(center, 1) AS center,
ST_SnapToGrid(nearest, 1) AS nearest,
ST_SnapToGrid(ST_MakeLine(center, nearest), 1) AS radius_line,
ST_SnapToGrid(ST_Buffer(center, radius), 1) AS circle
FROM circle;-[ RECORD 1 ]----- radius | 39.260545 center | POINT(62 108) nearest | POINT(70 70) radius_line | LINESTRING(62 108,70 70) circle | POLYGON((101 108,100 101,98 93,94 87,89 81,83 76,77 72,69 70,62 69,54 70,47 72,40 76,34 81,29 87,25 93,23 101,22 108,23 116,25 123,29 130,34 136,40 141,47 145,54 147,62 148,69 147,77 145,83 141,89 136,94 130,98 123,100 116,101 108))
Largest empty circle within a set of points, constrained to lie in a polygon. The constraint polygon boundary is included both as an obstacle and as the constraint for the circle center.
WITH inputs(points, boundary) AS (VALUES (
'MULTIPOINT ((70 50),(60 130),(130 150),(80 90))'::geometry,
'POLYGON ((90 190,10 100,60 10,190 40,120 100,190 180,90 190))'::geometry
)),
circle AS (
SELECT result.*
FROM inputs
CROSS JOIN LATERAL ST_LargestEmptyCircle(
ST_Collect(points, boundary), 0, boundary
) AS result
)
SELECT round(radius::numeric, 6) AS radius,
ST_SnapToGrid(center, 1) AS center,
ST_SnapToGrid(nearest, 1) AS nearest,
ST_SnapToGrid(ST_MakeLine(center, nearest), 1) AS radius_line,
ST_SnapToGrid(ST_Buffer(center, radius), 1) AS circle
FROM circle;-[ RECORD 1 ]----- radius | 19.903876 center | POINT(97 100) nearest | POINT(80 90) radius_line | LINESTRING(97 100,80 90) circle | POLYGON((117 100,117 96,116 92,114 89,111 86,108 83,105 82,101 80,97 80,93 80,90 82,86 83,83 86,81 89,79 92,78 96,77 100,78 104,79 108,81 111,83 114,86 116,90 118,93 119,97 120,101 119,105 118,108 116,111 114,114 111,116 108,117 104,117 100))
ST_MinimumBoundingCircle — Повертає найменший полігон кола, що містить геометрію.
geometry ST_MinimumBoundingCircle(geometry geomA, integer num_segs_per_qt_circ=48);
Повертає найменший полігон кола, що містить геометрію.
![]() | |
Обмежувальне коло наближається полігоном із 48 сегментами на чверть кола за замовчуванням. Оскільки полігон є наближенням мінімального обмежувального кола, деякі точки в геометрії вхідних даних можуть не міститися в полігоні. Наближення можна поліпшити, збільшивши кількість сегментів. Для додатків, де наближення не підходить, можна використовувати ST_MinimumBoundingRadius. |
Використовуйте з ST_Collect, щоб отримати мінімальне обмежуюче коло набору геометрій.
Щоб обчислити дві точки, що лежать на мінімальному колі (максимальний діаметр), використовуйте ST_LongestLine.
Відношення площі полігону до площі його мінімального обмежувального кола називається коефіцієнтом компактності Реока.
Виконується модулем 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;
Minimum bounding circle of a point and linestring, using 8 segments to approximate a quarter circle.
SELECT ST_MinimumBoundingCircle(ST_Collect('LINESTRING(55 75,125 150)',
ST_Point(20, 80)), 8
) As wktmbc;POLYGON((72.5 178.4024474346694,84.86920388664029 177.18418718546332,96.76306620464646 173.57622349601382,107.72451249529237 167.71720838753708,117.33230052487836 159.83230052487838,125.21720838753708 150.22451249529237,131.07622349601382 139.26306620464646,134.68418718546332 127.3692038866403,135.9024474346694 115,134.68418718546332 102.63079611335971,131.07622349601382 90.73693379535354,125.21720838753708 79.77548750470766,117.33230052487838 70.16769947512164,107.72451249529237 62.282791612462916,96.76306620464648 56.42377650398619,84.86920388664032 52.815812814536685,72.50000000000001 51.59755256533059,60.13079611335969 52.815812814536685,48.236933795353536 56.42377650398618,37.27548750470765 62.28279161246291,27.667699475121637 70.16769947512162,19.782791612462923 79.77548750470763,13.923776503986204 90.7369337953535,10.315812814536692 102.63079611335968,9.097552565330588 114.99999999999999,10.315812814536685 127.3692038866403,13.923776503986197 139.2630662046465,19.78279161246291 150.22451249529234,27.667699475121623 159.83230052487835,37.275487504707634 167.71720838753708,48.236933795353494 173.5762234960138,60.13079611335967 177.18418718546332,72.5 178.4024474346694))
ST_MinimumBoundingRadius — Повертає центр і радіус найменшого кола, що містить геометрію.
(geometry, double precision) ST_MinimumBoundingRadius(geometry geom);
Обчислює центр і радіус найменшого кола, що містить геометрію. Повертає запис із полями:
center - центр кола
radius - радіус кола
Використовуйте з ST_Collect, щоб отримати мінімальне обмежуюче коло набору геометрій.
Щоб обчислити дві точки, що лежать на мінімальному колі (максимальний діаметр), використовуйте ST_LongestLine.
Доступність - 2.3.0
SELECT center, radius FROM ST_MinimumBoundingRadius('POLYGON((26426 65078,26531 65242,26075 65136,26096 65427,26426 65078))');st_astext | radius ------------------------------------------+------------------ POINT(26284.84180271327 65267.114509082545) | 247.43604559140655
ST_OrientedEnvelope — Повертає прямокутник з мінімальною площею, що містить геометрію.
geometry ST_OrientedEnvelope( geometry geom );
Повертає прямокутник з мінімальною площею, що охоплює геометрію. Зверніть увагу, що може існувати більше одного такого прямокутника. У разі вироджених вхідних даних може повертати Point або LineString.
Доступність: 2.5.0.
Вимагає GEOS >= 3.6.0.
SELECT ST_OrientedEnvelope('MULTIPOINT ((0 0),(-1 -1),(3 2))');POLYGON((3 2,-1 -1,-1.12 -0.84,2.88 2.16,3 2))
Oriented envelope of a Point and LineString.
SELECT ST_OrientedEnvelope(ST_Collect('LINESTRING(55 75,125 150)',
ST_Point(20, 80))
) As wktenv;POLYGON((20 80,125 150,138.0769230769241 130.38461538461573,33.07692307692291 60.384615384615195,20 80))
ST_OffsetCurve — Повертає лінію зміщення на заданій відстані та стороні від вхідної лінії.
geometry ST_OffsetCurve(geometry line, float signed_distance, text style_parameters='');
Повертає лінію зміщення на заданій відстані та стороні від вхідної лінії. Всі точки повернутих геометрій знаходяться не далі, ніж на заданій відстані від вхідної геометрії. Корисно для обчислення паралельних ліній відносно центральної лінії.
Для позитивної відстані зміщення знаходиться з лівого боку від лінії введення і зберігає той самий напрямок. Для негативної відстані воно знаходиться з правого боку і має протилежний напрямок.
Одиниці відстані вимірюються в одиницях просторової системи координат.
Зверніть увагу, що результат може бути MULTILINESTRING або EMPTY для деяких вхідних геометрій із "фігурою пазла".
Додатковий третій параметр дозволяє вказати список пар ключ=значення, розділених пробілами, для налаштування операцій наступним чином:
'quad_segs=#' : кількість сегментів, що використовуються для апроксимації чверті кола (за замовчуванням 8).
'join=round|mitre|bevel' : стиль з'єднання (за замовчуванням "round"). 'miter' також приймається як синонім 'mitre'.
'mitre_limit=#.#' : обмеження коефіцієнта mitre (впливає тільки на стиль mitred). 'miter_limit' також приймається як синонім 'mitre_limit'.
Виконується модулем GEOS.
У GEOS 3.11 поведінка змінилася, тому криві зміщення тепер мають той самий напрямок, що й лінія введення, як для позитивних, так і для негативних зміщень.
Доступність: 2.0
Покращено: 2.5 — додано підтримку GEOMETRYCOLLECTION та MULTILINESTRING
![]() | |
Ця функція ігнорує вимір Z. Вона завжди дає двовимірний результат, навіть якщо використовується для тривимірної геометрії. |
Compute an open buffer around roads.
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;
Offset 15 units with quad_segs=4 join=round.
SELECT 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');LINESTRING(164 1,18 1,15.073645169758077 1.288220793951544,
12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818,
7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,
3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654,
1.288220793951544 15.073645169758075,1 18,1 195)Offset -15 units with quad_segs=4 join=round.
SELECT 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;LINESTRING(164 31,31 31,31 195)
Apply two negative offsets to obtain a smoother curve; the distances combine to -45 units.
SELECT 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;LINESTRING(164 61,61 61,61 195)
Collect the positive offset and the double-offset to produce parallel curves.
SELECT 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;MULTILINESTRING((164 1,18 1,15.073645169758077 1.288220793951544, 12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818, 7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788, 3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654, 1.288220793951544 15.073645169758075,1 18,1 195),(164 61,61 61,61 195))
Offset 15 units with a bevel join.
SELECT 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');LINESTRING(164 1,18 1,7.393398282201788 5.393398282201788,
5.393398282201788 7.393398282201788,1 18,1 195)Collect offsets on both sides using a mitre join and a mitre limit of 2.2.
SELECT 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;MULTILINESTRING((164 1,11.786796564403577 1,1 11.786796564403577,1 195),
(164 31,31 31,31 195))ST_PointOnSurface — Обчислює точку, яка гарантовано лежить у полігоні або на геометрії.
geometry ST_PointOnSurface(geometry g1);
Повертає POINT, який гарантовано лежить всередині поверхні (полігон, MULTIPOLYGON та CURVEPOLYGON). У 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.
Point on surface of a MultiPoint.
SELECT ST_PointOnSurface( 'MULTIPOINT (8 24,10 92,12 154,17 68,28 10,29 52,29 84,55 50,56 24,131 14,160 180,189 180)');
POINT(55 50)
Point on surface of a LineString.
SELECT ST_PointOnSurface( 'LINESTRING (190 160,10 190,40 90,20 70,10 10,30 40,30 10,110 40,70 10,110 10,140 40,140 10,160 30,180 10)');
POINT(40 90)
Point on surface of a Polygon.
SELECT ST_PointOnSurface( 'POLYGON ((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190))');
POINT(35 80)
Point on surface of the highest-dimension components of a GeometryCollection.
SELECT ST_PointOnSurface(
'GEOMETRYCOLLECTION (POLYGON ((190 170,180 100,80 140,80 160,130 160,110 180,110 190,180 180,190 170)),
LINESTRING (80 120,120 20,140 70,150 30,180 50,190 10),
MULTIPOINT (19 150,22 49,30 13,32 101,45 35,67 88,75 16))');POINT(133.571 150)
SELECT ST_PointOnSurface('LINESTRING(0 5 1,0 0 1,0 10 2)');st_asewkt -------------- POINT(0 0 1) (1 row)
Приклад: Результат ST_PointOnSurface гарантовано лежить всередині полігонів, тоді як точка, обчислена за допомогою ST_Centroid, може лежати поза ними.
SELECT ST_PointOnSurface(geom) AS pt_on_surf, ST_Centroid(geom) AS centroid
FROM (SELECT 'POLYGON ((130 120,120 190,30 140,50 20,190 20,
170 100,90 60,90 130,130 120))'::geometry AS geom) AS t;pt_on_surf | centroid -----------------+--------------------------------------------- POINT(62.5 110) | POINT(100.18264840182648 85.11415525114155)
ST_Polygonize — Обчислює сукупність полігонів, утворених з ліній набору геометрій.
geometry ST_Polygonize(geometry set geomfield);
geometry ST_Polygonize(geometry[] geom_array);
Створює GeometryCollection, що містить полігони, утворені лініями набору геометрій. Якщо вхідні лінії не утворюють полігонів, повертається порожній GeometryCollection.
Ця функція створює полігони, що охоплюють усі обмежені області. Якщо результат повинен утворювати дійсну полігональну геометрію, використовуйте ST_BuildArea, щоб запобігти заповненню отворів.
![]() | |
Щоб ця функція працювала належним чином, вхідні лінії повинні бути правильно вузлові. Щоб переконатися, що вхідні дані є вузловими, перед полігоном використовуйте ST_Node на вхідній геометрії. |
![]() | |
GeometryCollections може бути складно обробляти за допомогою зовнішніх інструментів. Використовуйте ST_Dump, щоб перетворити полігонізований результат на окремі полігони. |
Виконується модулем GEOS.
Доступність: 1.0.0RC1
Polygonize a set of input lines.
WITH data(geom) AS (
VALUES
('LINESTRING (180 40,30 20,20 90)'::geometry),
('LINESTRING (180 40,160 160)'::geometry),
('LINESTRING (80 60,120 130,150 80)'::geometry),
('LINESTRING (80 60,150 80)'::geometry),
('LINESTRING (20 90,70 70,80 130)'::geometry),
('LINESTRING (80 130,160 160)'::geometry),
('LINESTRING (20 90,20 160,70 190)'::geometry),
('LINESTRING (70 190,80 130)'::geometry),
('LINESTRING (70 190,160 160)'::geometry)
)
SELECT ST_Polygonize(geom)
FROM data;GEOMETRYCOLLECTION(POLYGON((180 40,30 20,20 90,70 70,80 130,160 160,180 40),(150 80,120 130,80 60,150 80)), POLYGON((80 60,120 130,150 80,80 60)), POLYGON((80 130,70 70,20 90,20 160,70 190,80 130)), POLYGON((160 160,80 130,70 190,160 160)))
Polygonizing two polygon coverages and transferring attributes to the resultants:
WITH poly_a(id, geom) AS (VALUES
('a1', 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry),
('a2', 'POLYGON ((4 0, 8 0, 8 4, 4 4, 4 0))'::geometry)
),
poly_b(id, geom) AS (VALUES
('b1', 'POLYGON ((0 0, 8 0, 8 2, 0 2, 0 0))'::geometry),
('b2', 'POLYGON ((0 2, 8 2, 8 4, 0 4, 0 2))'::geometry)
),
lines AS (
SELECT ST_Boundary(geom) AS geom FROM poly_a
UNION ALL
SELECT ST_Boundary(geom) FROM poly_b
),
noded AS (
SELECT ST_UnaryUnion(ST_Collect(geom)) AS geom FROM lines
),
cells AS (
SELECT (ST_Dump(ST_Polygonize(geom))).geom AS geom FROM noded
)
SELECT a.id AS id_a,
b.id AS id_b,
c.geom AS geom
FROM cells AS c
LEFT JOIN poly_a AS a ON ST_Within(ST_PointOnSurface(c.geom), a.geom)
LEFT JOIN poly_b AS b ON ST_Within(ST_PointOnSurface(c.geom), b.geom)
WHERE a.id IS NOT NULL OR b.id IS NOT NULL
ORDER BY id_a, id_b;id_a | id_b | geom ------+------+-------------------------------- a1 | b1 | POLYGON((4 0,0 0,0 2,4 2,4 0)) a1 | b2 | POLYGON((4 4,4 2,0 2,0 4,4 4)) a2 | b1 | POLYGON((4 0,4 2,8 2,8 0,4 0)) a2 | b2 | POLYGON((4 2,4 4,8 4,8 2,4 2))
Polygonizing таблиці лінійних рядків:
SELECT ST_Polygonize(geom_4269) As geomtextrep FROM (SELECT geom_4269 FROM ma.suffolk_edges) 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_Dump(t.polycoll)).geom AS geomtextrep
FROM (SELECT ST_Polygonize(geom_4269) AS polycoll
FROM (SELECT geom_4269 FROM ma.suffolk_edges)
As foo) AS t;
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_BuildArea, ST_Boundary, ST_Collect, ST_Dump, ST_Node, ST_PointOnSurface, ST_UnaryUnion, ST_Within
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_ReducePrecision('POINT(1.412 19.323)', 0.1);POINT(1.4 19.3)
SELECT ST_ReducePrecision('POINT(1.412 19.323)', 1.0);POINT(1 19)
SELECT ST_ReducePrecision('POINT(1.412 19.323)', 10);POINT(0 20)
Зниження точності може зменшити кількість вершин
SELECT ST_ReducePrecision('LINESTRING (10 10,19.6 30.1,20 30,20.3 30,40 40)', 1);LINESTRING (10 10, 20 30, 40 40)
Точне скорочення розділяє полігони, якщо це необхідно для забезпечення валідності
WITH data(geom) AS (
VALUES ('POLYGON ((10 10,60 60.1,70 30,40 40,50 10,10 10))'::geometry)
)
SELECT geom AS input,
ST_ReducePrecision(geom, 10) AS reduced
FROM data;ST_Simplify — Повертає спрощене представлення геометрії, використовуючи алгоритм Дугласа-Пьюкера.
geometry ST_Simplify(geometry geom, float tolerance);
geometry ST_Simplify(geometry geom, float tolerance, boolean preserveCollapsed);
Обчислює спрощене представлення геометрії за допомогою алгоритму Дугласа-Пьюкера. Спрощення tolerance є значенням відстані в одиницях вхідної SRS. Спрощення видаляє вершини, які знаходяться в межах відстані толерантності спрощеної лінії. Результат може бути недійсним, навіть якщо вхідні дані є дійсними.
Функція може бути викликана з будь-яким типом геометрії (включаючи GeometryCollections), але спрощуються тільки елементи лінії та полігону. Кінцеві точки лінійної геометрії зберігаються.
Прапор preserveCollapsed зберігає невеликі геометрії, які в іншому випадку були б видалені з урахуванням заданого допуску. Наприклад, якщо лінія довжиною 1 м спрощується з допуском 10 м, то при значенні preserveCollapsed лінія не зникне. Цей прапор корисний для цілей візуалізації, щоб запобігти зникненню дуже невеликих об'єктів з карти.
![]() | |
Повернена геометрія може втратити свою простоту (див. ST_IsSimple), топологія може не зберегтися, а полігональні результати можуть бути недійсними (див. ST_IsValid). Використовуйте ST_SimplifyPreserveTopology, щоб зберегти топологію та забезпечити дійсність. |
![]() | |
Ця функція не зберігає межі, спільні для полігонів. Якщо це необхідно, використовуйте ST_CoverageSimplify. |
Доступність: 1.2.2
A circle simplified with a medium tolerance becomes an octagon, and with a large tolerance disappears.
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_gone,
(ST_Simplify(geom, 100) is null) AS np100_geometrygoesaway
FROM (SELECT ST_Buffer('POINT(1 3)', 10, 12) As geom) AS t;-[ RECORD 1 ]------------ np_before | 49 np01_notbadcircle | 33 np05_notquitecircle | 17 np1_octagon | 9 np10_gone | null np100_geometrygoesaway | t
Спрощення набору ліній. Після спрощення лінії можуть перетинатися.
SELECT ST_Simplify('MULTILINESTRING ((20 180,20 150,50 150,50 100,110 150,150 140,170 120),(20 10,80 30,90 120),(90 120,130 130),(130 130,130 70,160 40,180 60,180 90,140 80),(50 40,70 40,80 70,70 60,60 60,50 50,50 40))'::geometry,
40);MULTILINESTRING((20 180,50 100,170 120),(20 10,90 120),(90 120,130 130),(130 130,160 40,180 90,140 80),(50 40,80 70,50 40))
Спрощення багатокутника. Результати багатокутника можуть бути недійсними.
SELECT ST_Simplify('MULTIPOLYGON (((90 110,80 180,50 160,10 170,10 140,20 110,90 110)),((40 80,100 100,120 160,170 180,190 70,140 10,110 40,60 40,40 80),(180 70,170 110,142.5 128.5,128.5 77.5,90 60,180 70)))'::geometry,
40);MULTIPOLYGON(((90 110,80 180,10 170,20 110,90 110)),((40 80,170 180,140 10,40 80),(180 70,142.5 128.5,90 60,180 70)))
ST_IsSimple, ST_SimplifyPreserveTopology, ST_SimplifyVW, ST_CoverageSimplify, Topology ST_Simplify
ST_SimplifyPreserveTopology — Повертає спрощене та дійсне представлення геометрії, використовуючи алгоритм Дугласа-Пьюкера.
geometry ST_SimplifyPreserveTopology(geometry geom, float tolerance);
Обчислює спрощене представлення геометрії за допомогою варіанту алгоритму Дугласа-Пьюкера, який обмежує спрощення, щоб забезпечити топологію результату, ідентичну топології вхідних даних. Допуск спрощення tolerance є значенням відстані в одиницях вхідної SRS. Спрощення видаляє вершини, які знаходяться в межах допуску відстані спрощеної лінії, за умови збереження топології. Результат буде дійсним і простим, якщо вхідні дані є такими.
Функцію можна викликати з будь-яким типом геометрії (включаючи GeometryCollections), але спрощуються тільки елементи лінії та полігону. Для полігональних вхідних даних результат матиме таку саму кількість кілець (оболонок і отворів), і кільця не перетинатимуться. Кінцеві точки кілець можуть бути спрощені. Для лінійних вхідних даних результат матиме таку саму кількість ліній, і лінії не перетинатимуться, якщо вони не перетиналися в оригінальній геометрії. Кінцеві точки лінійної геометрії зберігаються.
![]() | |
Ця функція не зберігає межі, спільні для полігонів. Якщо це необхідно, використовуйте ST_CoverageSimplify. |
Виконується модулем GEOS.
Доступність: 1.3.3
For the same example as ST_Simplify, ST_SimplifyPreserveTopology prevents the geometry from disappearing.
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_minimal,
ST_NPoints(ST_SimplifyPreserveTopology(geom, 100)) AS np100_minimal
FROM (SELECT ST_Buffer('POINT(1 3)', 10, 12) AS geom) AS t;np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_minimal | np100_minimal
-----------+-------------------+---------------------+-------------+--------------+---------------
49 | 33 | 17 | 9 | 4 | 4Спрощення набору ліній із збереженням топології ліній, що не перетинаються.
SELECT ST_SimplifyPreserveTopology('MULTILINESTRING ((20 180,20 150,50 150,50 100,110 150,150 140,170 120),(20 10,80 30,90 120),(90 120,130 130),(130 130,130 70,160 40,180 60,180 90,140 80),(50 40,70 40,80 70,70 60,60 60,50 50,50 40))'::geometry,
40);MULTILINESTRING((20 180,50 100,110 150,170 120),(20 10,80 30,90 120),(90 120,130 130),(130 130,130 70,160 40,180 90,140 80),(50 40,70 40,80 70,60 60,50 40))
Спрощення мультиполігону із збереженням топології оболонок і отворів.
SELECT ST_SimplifyPreserveTopology('MULTIPOLYGON (((90 110,80 180,50 160,10 170,10 140,20 110,90 110)),((40 80,100 100,120 160,170 180,190 70,140 10,110 40,60 40,40 80),(180 70,170 110,142.5 128.5,128.5 77.5,90 60,180 70)))'::geometry,
40);MULTIPOLYGON(((90 110,80 180,10 170,20 110,90 110)),((40 80,100 100,170 180,190 70,140 10,40 80),(180 70,142.5 128.5,90 60,180 70)))
ST_SimplifyPolygonHull — Обчислює спрощену зовнішню або внутрішню оболонку полігональної геометрії із збереженням топології.
geometry ST_SimplifyPolygonHull(geometry param_geom, float vertex_fraction, boolean is_outer = true);
Обчислює спрощену зовнішню або внутрішню оболонку полігональної геометрії, що зберігає топологію. Зовнішня оболонка повністю покриває вхідну геометрію. Внутрішня оболонка повністю покривається вхідною геометрією. Результатом є полігональна геометрія, утворена підмножиною вхідних вершин. Мультиполігони та отвори обробляються і дають результат з такою ж структурою, як і вхідні дані.
Зменшення кількості вершин контролюється параметром vertex_fraction, який є числом в діапазоні від 0 до 1. Менші значення дають простіші результати, з меншою кількістю вершин і меншою увігнутістю. Як для зовнішніх, так і для внутрішніх оболонок частка вершин 1,0 дає вихідну геометрію. Для зовнішніх оболонок значення 0,0 дає опуклу оболонку (для одного полігона); для внутрішніх оболонок воно дає трикутник.
Процес спрощення працює шляхом поступового видалення увігнутих кутів, які містять найменшу площу, до досягнення цільового значення кількості вершин. Це запобігає перетину ребер, тому результатом завжди є дійсна полігональна геометрія.
Щоб отримати кращі результати з геометріями, що містять відносно довгі відрізки ліній, може знадобитися "сегментувати" вхідні дані, як показано нижче.
Виконується модулем GEOS.
Доступність: 3.3.0.
Вимагає GEOS >= 3.11.0.
Outer hull of a Polygon.
SELECT ST_SimplifyPolygonHull( 'POLYGON ((131 158,136 163,161 165,173 156,179 148,169 140,186 144,190 137,185 131,174 128,174 124,166 119,158 121,158 115,165 107,161 97,166 88,166 79,158 57,145 57,112 53,111 47,93 43,90 48,88 40,80 39,68 32,51 33,40 31,39 34,49 38,34 38,25 34,28 39,36 40,44 46,24 41,17 41,14 46,19 50,33 54,21 55,13 52,11 57,22 60,34 59,41 68,75 72,62 77,56 70,46 72,31 69,46 76,52 82,47 84,56 90,66 90,64 94,56 91,33 97,36 100,23 100,22 107,29 106,31 112,46 116,36 118,28 131,53 132,59 127,62 131,76 130,80 135,89 137,87 143,73 145,80 150,88 150,85 157,99 162,116 158,115 165,123 165,122 170,134 164,131 158))'::geometry, 0.3 );
POLYGON((161 165,173 156,186 144,190 137,185 131,174 124,166 119,166 79,158 57,68 32,40 31,25 34,17 41,14 46,11 57,56 91,33 97,23 100,22 107,28 131,80 135,73 145,85 157,99 162,122 170,161 165))
Inner hull of a Polygon.
SELECT ST_SimplifyPolygonHull( 'POLYGON ((131 158,136 163,161 165,173 156,179 148,169 140,186 144,190 137,185 131,174 128,174 124,166 119,158 121,158 115,165 107,161 97,166 88,166 79,158 57,145 57,112 53,111 47,93 43,90 48,88 40,80 39,68 32,51 33,40 31,39 34,49 38,34 38,25 34,28 39,36 40,44 46,24 41,17 41,14 46,19 50,33 54,21 55,13 52,11 57,22 60,34 59,41 68,75 72,62 77,56 70,46 72,31 69,46 76,52 82,47 84,56 90,66 90,64 94,56 91,33 97,36 100,23 100,22 107,29 106,31 112,46 116,36 118,28 131,53 132,59 127,62 131,76 130,80 135,89 137,87 143,73 145,80 150,88 150,85 157,99 162,116 158,115 165,123 165,122 170,134 164,131 158))'::geometry, 0.3, false );
POLYGON((131 158,116 158,99 162,89 137,76 130,59 127,28 131,46 116,36 100,64 94,75 72,41 68,33 54,68 32,90 48,112 53,145 57,158 57,161 97,158 115,158 121,190 137,169 140,179 148,161 165,131 158))
Outer hull simplification of a MultiPolygon, with segmentization.
WITH letters AS (
SELECT ST_Letters('xt') AS geom
)
SELECT geom AS input,
ST_SimplifyPolygonHull(ST_Segmentize(geom, 2.0), 0.1) AS outer_hull
FROM letters;MULTIPOLYGON(((18.3 57.6,20.7 51,23.3 41.9,26 51,28.4 57.6,45.4 57.6,33.1 28.8,46.6 0,29.5 0,26.6 6.7,23.3 16.3,19.8 6.3,17.1 0,0 0,13.5 28.8,1.3 57.6,18.3 57.6)),((77.808 15.2,82.208 15.2,83.508 16,83.508 -0.9,82.108 -0.2,76.808 -0.2,76.108 -0.2,75.408 -0.2,74.608 -0.1,73.908 -0.1,73.208 0,72.508 0,71.808 0.1,71.108 0.2,70.408 0.3,69.708 0.5,69.008 0.6,68.408 0.9,67.708 1.1,67.008 1.4,66.408 1.7,65.708 2,65.108 2.4,64.408 2.8,63.808 3.2,63.208 3.7,62.608 4.1,62.108 4.7,61.508 5.2,61.008 5.8,60.508 6.4,60.008 7.1,59.508 7.8,59.108 8.6,58.708 9.5,58.308 10.4,57.908 11.3,57.608 12.3,57.608 42.7,52.208 42.7,51.108 41.8,51.108 58.9,52.208 57.9,57.608 57.9,57.608 74.4,56.508 75.4,74.408 75.4,73.308 74.2,73.308 57.9,81.408 57.9,82.508 58.9,82.508 41.8,81.408 42.7,73.308 42.7,73.308 17.7,73.408 17.4,73.608 17.2,73.808 16.9,74.008 16.7,74.208 16.5,74.408 16.3,74.708 16.1,75.008 15.9,75.308 15.7,75.608 15.6,76.008 15.5,76.308 15.4,76.708 15.3,77.008 15.2,77.408 15.2,77.808 15.2))) | MULTIPOLYGON(((45.4 57.6,44.631 55.8,33.869 30.6,46.6 0,29.5 0,19.8 6.3,18.45 3.15,17.1 0,0 0,10.969 23.4,9.688 37.8,2.062 55.8,1.3 57.6,45.4 57.6)),((83.508 16,83.508 -0.9,72.508 0,71.108 0.2,70.408 0.3,69.008 0.6,67.708 1.1,67.008 1.4,65.708 2,64.408 2.8,63.808 3.2,62.608 4.1,61.508 5.2,60.508 6.4,59.508 7.8,59.108 8.6,58.308 10.4,57.908 11.3,57.608 12.3,51.108 41.8,51.108 58.9,56.508 75.4,74.408 75.4,82.508 58.9,83.508 16)))
ST_SimplifyVW — Повертає спрощене представлення геометрії, використовуючи алгоритм Вісвалінгама-Вайатта
geometry ST_SimplifyVW(geometry geom, float tolerance);
Returns a simplified representation of a geometry using the Visvalingam-Whyatt algorithm. The simplification tolerance is an area value, in squared units of the input SRS. Simplification removes vertices which form "corners" with area less than the tolerance. The result may not be valid even if the input is.
Функція може бути викликана з будь-яким типом геометрії (включаючи GeometryCollections), але спрощуються тільки елементи лінії та полігону. Кінцеві точки лінійної геометрії зберігаються.
![]() | |
Повернена геометрія може втратити свою простоту (див. ST_IsSimple), топологія може не зберегтися, а полігональні результати можуть бути недійсними (див. ST_IsValid). Використовуйте ST_SimplifyPreserveTopology, щоб зберегти топологію та забезпечити дійсність. ST_CoverageSimplifyтакож зберігає топологію та дійсність. |
This is a general-purpose simplification function. It may remove narrow polygon spikes when their effective area is below the tolerance, but it is not a dedicated spike-removal or polygon-repair operation. Use ST_IsValid to check the result and ST_MakeValid to repair invalid polygonal output if needed.
Ця функція не зберігає межі, спільні для полігонів. Якщо це необхідно, використовуйте ST_CoverageSimplify.
Ця функція обробляє 3D, і третій вимір впливатиме на результат.
Доступність: 2.2.0
This polygon has a narrow spike whose effective area is small enough to be removed by a tolerance of 20 square units.
SELECT geom AS original, ST_SimplifyVW(geom, 20) AS simplified FROM (SELECT 'POLYGON((0 0,10 0,10 10,5.2 10,5 16,4.8 10,0 10,0 0))'::geometry AS geom) AS t;
POLYGON((0 0,10 0,10 10,5.2 10,5 16,4.8 10,0 10,0 0)) | POLYGON((0 0,10 0,10 10,0 10,0 0))
A LineString is simplified with a minimum-area tolerance of 30. For a linear simplification using ST_Simplify, a comparable tolerance would be a length in input-SRS units, so the value here is roughly that linear tolerance squared.
SELECT ST_SimplifyVW(geom, 30) simplified FROM (SELECT 'LINESTRING(5 2,3 8,6 20,7 25,10 10)'::geometry AS geom) AS t;
LINESTRING(5 2,7 25,10 10)
Спрощення лінії.
SELECT ST_SimplifyVW('LINESTRING (10 10,50 40,30 70,50 60,70 80,50 110,100 100,90 140,100 180,150 170,170 140,190 90,180 40,110 40,150 20)'::geometry,
1600);LINESTRING(10 10,100 100,100 180,150 170,190 90,150 20)
Спрощення полігону.
SELECT ST_SimplifyVW('POLYGON ((20 20,50 60,20 120,40 170,80 180,120 140,180 180,160 130,180 100,180 30,130 70,150 10,20 20))'::geometry,
1600);POLYGON((20 20,20 120,80 180,160 130,180 30,20 20))
ST_SetEffectiveArea, ST_Simplify, ST_SimplifyPreserveTopology, ST_CoverageSimplify, Топологія ST_Simplify
ST_SetEffectiveArea — Встановлює ефективну площу для кожної вершини, використовуючи алгоритм Вісвалінгама-Вайатта.
geometry ST_SetEffectiveArea(geometry geom, float threshold = 0, integer set_area = 1);
Встановлює ефективну площу для кожної вершини, використовуючи алгоритм Вісвалінгама-Вайатта. Ефективна площа зберігається як M-значення вершини. Якщо використовується опціональний параметр "threshold", буде повернуто спрощену геометрію, що містить тільки вершини з ефективною площею, більшою або рівною значенню порогу.
Ця функція може бути використана для спрощення на стороні сервера, коли вказано поріг. Інший варіант – використання порогового значення нуль. У цьому випадку буде повернуто повну геометрію з ефективними площами у вигляді M-значень, які клієнт може використовувати для дуже швидкого спрощення.
Фактично виконує операції тільки з (мульти)лініями та (мульти)полігонами, але ви можете безпечно викликати її з будь-яким типом геометрії. Оскільки спрощення відбувається на основі окремих об'єктів, ви також можете передати цій функції GeometryCollection.
![]() | |
Зверніть увагу, що повернена геометрія може втратити свою простоту (див. ST_IsSimple) |
![]() | |
Зверніть увагу, що топологія може не зберегтися, що може призвести до недійсних геометрій. Для збереження топології використовуйте (див. ST_SimplifyPreserveTopology). |
![]() | |
Геометрія виводу втратить всю попередню інформацію в значеннях M |
![]() | |
Ця функція обробляє 3D, і третій вимір впливатиме на ефективну площу |
Доступність: 2.2.0
Обчислення ефективної площі LineString. Оскільки ми використовуємо порогове значення нуль, повертаються всі вершини вхідної геометрії.
SELECT ST_SetEffectiveArea(geom) AS all_pts,
ST_SetEffectiveArea(geom, 30) AS threshold_30
FROM (SELECT 'LINESTRING(5 2,3 8,6 20,7 25,10 10)'::geometry geom) As foo;ST_TriangulatePolygon — Обчислює обмежену триангуляцію Делоне полігонів
geometry ST_TriangulatePolygon(geometry geom);
Обчислює обмежену триангуляцію Делоне для полігонів. Підтримуються отвори та мультиполігони.
"Обмежена триангуляція Делоне" полігону — це набір трикутників, утворених з вершин полігону, які точно його покривають, з максимальним сумарним внутрішнім кутом серед усіх можливих триангуляцій. Вона забезпечує "найкращу якість" триангуляції полігону.
Доступність: 3.3.0.
Вимагає GEOS >= 3.11.0.
Тріангуляція квадрата.
SELECT ST_TriangulatePolygon('POLYGON((0 0,0 1,1 1,1 0,0 0))');GEOMETRYCOLLECTION(POLYGON((0 0,0 1,1 1,0 0)), POLYGON((1 1,1 0,0 0,1 1)))
Тріангуляція літери P.
SELECT ST_TriangulatePolygon('POLYGON ((26 17,31 19,34 21,37 24,38 29,39 43,39 161,38 172,36 176,34 179,30 181,25 183,10 185,10 190,100 190,121 189,139 187,154 182,167 177,177 169,184 161,189 152,190 141,188 128,186 123,184 117,180 113,176 108,170 104,164 101,151 96,136 92,119 89,100 89,86 89,73 89,73 39,74 32,75 27,77 23,79 20,83 18,89 17,106 15,106 10,10 10,10 15,26 17),(152 147,151 152,149 157,146 162,142 166,137 169,132 172,126 175,118 177,109 179,99 180,89 180,80 179,76 178,74 176,73 171,73 100,85 99,91 99,102 99,112 100,121 102,128 104,134 107,139 110,143 114,147 118,149 123,151 128,153 141,152 147))'
);GEOMETRYCOLLECTION (POLYGON ((10 10, 10 15, 26 17, 10 10)), POLYGON ((25 183, 10 185, 10 190, 25 183)), POLYGON ((126 175, 121 189, 139 187, 126 175)), POLYGON ((137 169, 139 187, 154 182, 137 169)), POLYGON ((149 157, 167 177, 177 169, 149 157)), POLYGON ((153 141, 189 152, 190 141, 153 141)), POLYGON ((153 141, 188 128, 186 123, 153 141)), POLYGON ((186 123, 184 117, 180 113, 186 123)), POLYGON ((149 123, 176 108, 170 104, 149 123)), POLYGON ((147 118, 164 101, 151 96, 147 118)), POLYGON ((121 102, 136 92, 119 89, 121 102)), POLYGON ((85 99, 73 89, 73 100, 85 99)), POLYGON ((89 17, 106 15, 106 10, 89 17)), POLYGON ((83 18, 10 10, 26 17, 83 18)), POLYGON ((100 190, 25 183, 10 190, 100 190)), POLYGON ((121 189, 109 179, 100 190, 121 189)), POLYGON ((189 152, 152 147, 184 161, 189 152)), POLYGON ((153 141, 190 141, 188 128, 153 141)), POLYGON ((147 118, 170 104, 164 101, 147 118)), POLYGON ((139 110, 151 96, 136 92, 139 110)), POLYGON ((73 89, 85 99, 86 89, 73 89)), POLYGON ((83 18, 89 17, 106 10, 83 18)), POLYGON ((83 18, 26 17, 31 19, 83 18)), POLYGON ((100 190, 30 181, 25 183, 100 190)), POLYGON ((189 152, 153 141, 152 147, 189 152)), POLYGON ((176 108, 151 128, 180 113, 176 108)), POLYGON ((91 99, 86 89, 85 99, 91 99)), POLYGON ((10 10, 83 18, 106 10, 10 10)), POLYGON ((76 178, 100 190, 80 179, 76 178)), POLYGON ((86 89, 91 99, 100 89, 86 89)), POLYGON ((79 20, 83 18, 31 19, 79 20)), POLYGON ((102 99, 100 89, 91 99, 102 99)), POLYGON ((34 21, 79 20, 31 19, 34 21)), POLYGON ((112 100, 100 89, 102 99, 112 100)), POLYGON ((37 24, 79 20, 34 21, 37 24)), POLYGON ((100 89, 112 100, 119 89, 100 89)), POLYGON ((79 20, 37 24, 77 23, 79 20)), POLYGON ((119 89, 112 100, 121 102, 119 89)), POLYGON ((77 23, 37 24, 75 27, 77 23)), POLYGON ((136 92, 121 102, 128 104, 136 92)), POLYGON ((38 29, 75 27, 37 24, 38 29)), POLYGON ((134 107, 136 92, 128 104, 134 107)), POLYGON ((75 27, 38 29, 74 32, 75 27)), POLYGON ((139 110, 136 92, 134 107, 139 110)), POLYGON ((74 32, 38 29, 73 39, 74 32)), POLYGON ((151 96, 139 110, 143 114, 151 96)), POLYGON ((39 43, 73 39, 38 29, 39 43)), POLYGON ((151 96, 143 114, 147 118, 151 96)), POLYGON ((73 39, 39 43, 73 89, 73 39)), POLYGON ((170 104, 147 118, 149 123, 170 104)), POLYGON ((73 89, 39 43, 73 100, 73 89)), POLYGON ((176 108, 149 123, 151 128, 176 108)), POLYGON ((39 161, 73 100, 39 43, 39 161)), POLYGON ((180 113, 151 128, 186 123, 180 113)), POLYGON ((73 100, 39 161, 73 171, 73 100)), POLYGON ((186 123, 151 128, 153 141, 186 123)), POLYGON ((38 172, 73 171, 39 161, 38 172)), POLYGON ((151 152, 184 161, 152 147, 151 152)), POLYGON ((73 171, 38 172, 74 176, 73 171)), POLYGON ((184 161, 151 152, 177 169, 184 161)), POLYGON ((36 176, 74 176, 38 172, 36 176)), POLYGON ((149 157, 177 169, 151 152, 149 157)), POLYGON ((34 179, 74 176, 36 176, 34 179)), POLYGON ((146 162, 167 177, 149 157, 146 162)), POLYGON ((74 176, 34 179, 76 178, 74 176)), POLYGON ((167 177, 146 162, 154 182, 167 177)), POLYGON ((30 181, 76 178, 34 179, 30 181)), POLYGON ((154 182, 146 162, 142 166, 154 182)), POLYGON ((100 190, 76 178, 30 181, 100 190)), POLYGON ((154 182, 142 166, 137 169, 154 182)), POLYGON ((80 179, 100 190, 89 180, 80 179)), POLYGON ((139 187, 137 169, 132 172, 139 187)), POLYGON ((100 190, 99 180, 89 180, 100 190)), POLYGON ((139 187, 132 172, 126 175, 139 187)), POLYGON ((100 190, 109 179, 99 180, 100 190)), POLYGON ((121 189, 126 175, 118 177, 121 189)), POLYGON ((121 189, 118 177, 109 179, 121 189)))
Triangulation of the polygon used in the CG_Tesselate example.
SELECT ST_TriangulatePolygon('POLYGON (( 10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190 ))'::geometry
);GEOMETRYCOLLECTION(POLYGON((50 160,120 190,120 160,50 160)), POLYGON((10 70,80 130,80 70,10 70)), POLYGON((50 160,10 70,10 190,50 160)), POLYGON((120 190,50 160,10 190,120 190)), POLYGON((80 130,10 70,50 160,80 130)))
ST_VoronoiLines — Повертає межі діаграми Вороного вершин геометрії.
geometry ST_VoronoiLines( geometry geom , float8 tolerance = 0.0 , geometry extend_to = NULL );
Обчислює двовимірну діаграму Вороного з вершин наданої геометрії та повертає межі між комірками в діаграмі як MultiLineString. Повертає null, якщо вхідна геометрія є null. Повертає порожню колекцію геометрії, якщо вхідна геометрія містить тільки одну вершину. Повертає порожню колекцію геометрії, якщо контур extend_to має нульову площу.
Додаткові параметри:
tolerance: Відстань, в межах якої вершини будуть вважатися еквівалентними. Надійність алгоритму можна підвищити, вказавши відстань толерантності, відмінну від нуля. (за замовчуванням = 0,0)
extend_to: Якщо присутній, діаграма розширюється, щоб охопити контур заданої геометрії, якщо він не менший за контур за замовчуванням (за замовчуванням = NULL, контур за замовчуванням — це обмежувальний прямокутник вхідних даних, розширений приблизно на 50%).
Виконується модулем GEOS.
Доступність: 2.3.0
Voronoi diagram lines with a tolerance of 30 units.
SELECT ST_VoronoiLines('MULTIPOINT (50 30,60 30,100 100,10 150,110 120)'::geometry,
30) AS geom;
MULTILINESTRING((135.555555555556 270,36.8181818181818 92.2727272727273),(36.8181818181818 92.2727272727273,-110 43.3333333333333),(230 -45.7142857142858,36.8181818181818 92.2727272727273))
ST_VoronoiPolygons — Повертає комірки діаграми Вороного вершин геометрії.
geometry ST_VoronoiPolygons( geometry geom , float8 tolerance = 0.0 , geometry extend_to = NULL );
Обчислює двовимірну діаграму Вороного на основі вершин наданої геометрії. Результатом є GEOMETRYCOLLECTION з POLYGON, що охоплює оболонку, більшу за розмір вхідних вершин. Повертає null, якщо вхідна геометрія є null. Повертає порожню колекцію геометрії, якщо вхідна геометрія містить тільки одну вершину. Повертає порожню колекцію геометрії, якщо контур extend_to має нульову площу.
Додаткові параметри:
tolerance: Відстань, в межах якої вершини будуть вважатися еквівалентними. Надійність алгоритму можна підвищити, вказавши відстань толерантності, відмінну від нуля. (за замовчуванням = 0,0)
extend_to: Якщо присутній, діаграма розширюється, щоб охопити контур заданої геометрії, якщо він не менший за контур за замовчуванням (за замовчуванням = NULL, контур за замовчуванням — це обмежувальний прямокутник вхідних даних, розширений приблизно на 50%).
Виконується модулем GEOS.
Доступність: 2.3.0
Points overlaid on top of the Voronoi diagram.
SELECT ST_VoronoiPolygons('MULTIPOINT (50 30,60 30,100 100,10 150,110 120)'::geometry
) AS geom;
GEOMETRYCOLLECTION(POLYGON((-110 270,100.5 270,59.34782608695652 132.82608695652175,36.81818181818182 92.27272727272727,-110 43.33333333333332,-110 270)), POLYGON((-110 -90,-110 43.33333333333332,36.81818181818182 92.27272727272727,55 79.28571428571429,55 -90,-110 -90)), POLYGON((230 -20.71428571428572,55 79.28571428571429,36.81818181818182 92.27272727272727,59.34782608695652 132.82608695652175,230 47.50000000000001,230 -20.71428571428572)), POLYGON((230 -90,55 -90,55 79.28571428571429,230 -20.71428571428572,230 -90)), POLYGON((230 270,230 47.50000000000001,59.34782608695652 132.82608695652175,100.5 270,230 270)))
Voronoi diagram with a tolerance of 30 units.
SELECT ST_VoronoiPolygons('MULTIPOINT (50 30,60 30,100 100,10 150,110 120)'::geometry,
30) AS geom;
GEOMETRYCOLLECTION(POLYGON((-110 270,135.55555555555557 270,36.81818181818182 92.27272727272727,-110 43.33333333333332,-110 270)), POLYGON((230 270,230 -45.71428571428574,36.81818181818182 92.27272727272727,135.55555555555557 270,230 270)), POLYGON((230 -90,-110 -90,-110 43.33333333333332,36.81818181818182 92.27272727272727,230 -45.71428571428574,230 -90)))
Ці функції працюють з наборами полігональної геометрії, що утворюють "неявні покриття". Щоб утворити дійсне покриття, полігони не повинні перекриватися, а вершини суміжних ребер повинні збігатися. Покриття швидко обробляються і можуть оброблятися за допомогою віконних функцій, які зберігають топологію покриття всередині розділу вікна при зміні ребер.
ST_CoverageInvalidEdges — Віконна функція, яка знаходить місця, де полігони не утворюють дійсного покриття.
geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance = 0);
Віконна функція, яка перевіряє, чи полігони у вікні утворюють дійсне полігональне покриття. Вона повертає лінійні індикатори, що показують розташування недійсних країв (якщо такі є) у кожному полігоні.
Набір дійсних полігонів є дійсним покриттям, якщо виконуються такі умови:
Неперекриваються - полігони не перекриваються (їх внутрішні частини не перетинаються)
Edge-Matched - вершини вздовж спільних ребер є ідентичними
Як віконна функція, для кожного вхідного полігону повертається значення. Для полігонів, які порушують одну або кілька умов дійсності, значенням, що повертається, є MULTILINESTRING, що містить проблемні краї. Полігони з дійсним покриттям повертають значення NULL. Неполігональні або порожні геометрії також дають значення NULL.
Умови дозволяють дійсному покриттю містити отвори (проміжки між полігонами), якщо сусідні полігони збігаються по краях. Однак дуже вузькі проміжки часто є небажаними. Якщо параметр tolerance задано з відстанню, відмінною від нуля, краї, що утворюють вужчі проміжки, також будуть повернуті як недійсні.
Полігони, що перевіряються на валідність покриття, також повинні бути валідними геометріями. Це можна перевірити за допомогою ST_IsValid.
Доступність: 3.4.0
Потрібна версія GEOS >= 3.12.0
Invalid edges caused by overlap and non-matching vertices.
WITH coverage(id, geom) AS (VALUES (1, 'POLYGON ((10 190,30 160,40 110,100 70,120 10,10 10,10 190))'::geometry), (2, 'POLYGON ((100 190,10 190,30 160,40 110,50 80,74 110.5,100 130,140 120,140 160,100 190))'::geometry), (3, 'POLYGON ((140 190,190 190,190 80,140 80,140 190))'::geometry), (4, 'POLYGON ((180 40,120 10,100 70,140 80,190 80,180 40))'::geometry) ) SELECT id, ST_CoverageInvalidEdges(geom) OVER () FROM coverage;
id | st_astext ----+--------------------------------------- 1 | LINESTRING (40 110, 100 70) 2 | MULTILINESTRING ((100 130, 140 120, 140 160, 100 190), (40 110, 50 80, 74 110.5)) 3 | LINESTRING (140 80, 140 190) 4 | null
This example tests the entire table for coverage validity.
SELECT true = ALL (
SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL
FROM coverage
);
ST_IsValid, ST_CoverageUnion, ST_CoverageClean, ST_CoverageSimplify
ST_CoverageClean — Обчислює чисте (збіжні краї, без перекриттів, без прогалин) полігональне покриття, задане нечистим вхідним даними.
geometry ST_CoverageClean(geometry winset geom, float8 gapMaximumWidth = 0, float8 snappingDistance = -1, text overlapMergeStrategy = 'MERGE_LONGEST_BORDER');
Віконна функція, яка коригує грані набору дійсних полігональних геометрій для отримання чистого покриття. Очищення включає:
прив'язування вершин і ребер для усунення невеликих розбіжностей і забезпечення однакового вузла спільних ребер
об'єднання перекриттів у батьківський багатокутник
об'єднання вузьких проміжків у сусідні багатокутники
gapMaximumWidth контролює, які проміжки між полігонами об'єднуються. Проміжки шириною <= ця відстань об'єднуються в сусідній полігон.
snappingDistance контролює прив'язку вершин і ребер. За замовчуванням (-1) автоматично визначається відстань прив'язки на основі введеного розміру. Встановіть значення 0,0, щоб вимкнути прив'язку.
overlapMergeStrategy визначає, як перекриття об'єднуються в батьківський багатокутник:
MERGE_LONGEST_BORDER — об'єднує в багатокутник з найдовшою спільною межею
MERGE_MAX_AREA - об'єднує в багатокутник з максимальною площею
MERGE_MIN_AREA - об'єднує в багатокутник з мінімальною площею
MERGE_MIN_INDEX - об'єднує в багатокутник з найменшим індексом введення (визначається порядком введення багатокутників)
Результатом є чисте полігональне покриття, яке пройде перевірку за допомогою ST_CoverageInvalidEdges і може бути введено в функції обробки покриття.
![]() | |
Щоб полегшити визначення максимальної ширини проміжків, їх можна обчислити, очистивши за допомогою |
Доступність: 3.6.0 - вимагає GEOS >= 3.14.0
Clean a coverage containing overlaps and narrow gaps, and compare the cleaned polygons with the original invalid edges.
WITH coverage(id, geom) AS (VALUES
(1, 'POLYGON ((10 190,30 160,27 134.5,40 110,122 47,120 10,10 10,10 190))'::geometry),
(2, 'POLYGON ((150 190,10 190,30 160,50 140,40 110,50 80,130 70,135 111,140 130,140 160,150 190))'::geometry),
(3, 'POLYGON ((140 190,190 190,190 80,140 80,140 190))'::geometry),
(4, 'POLYGON ((190 10,120 10,97 77,160 90,170 70,190 80,190 10))'::geometry)
), processed AS (
SELECT id,
ST_CoverageClean(geom, 1) OVER () AS cleaned,
ST_CoverageInvalidEdges(geom) OVER () AS invalid_edges
FROM coverage
)
SELECT ST_Collect(cleaned ORDER BY id) AS cleaned,
ST_Collect(invalid_edges ORDER BY id) AS invalid_edges
FROM processed;MULTIPOLYGON(((10 10,10 190,30 160,27 134.5,40 110,84.7 75.7,102 62.3,120 10,10 10)),((140 190,140 160,140 130,135 111,131.7 84.2,97 77,98 74,84.7 75.7,40 110,50 140,30 160,10 190,140 190)),((190 190,190 80,165 80,140 80,140 85.9,140 130,140 160,140 190,150 190,190 190)),((190 10,120 10,102 62.3,98 74,97 77,131.7 84.2,140 85.9,140 80,165 80,170 70,190 80,190 10))) | MULTILINESTRING((40 110,122 47,120 10),(40 110,50 80,130 70,135 111,140 130,140 160,150 190,10 190),(190 80,140 80,140 190,190 190),(120 10,97 77,160 90,170 70))
ST_CoverageSimplify — Віконна функція, яка спрощує краї полігонального покриття.
geometry ST_CoverageSimplify(geometry winset geom, float8 tolerance, boolean simplifyBoundary = true);
Віконна функція, яка спрощує краї полігонів у полігональному покритті. Спрощення зберігає топологію покриття. Це означає, що спрощені вихідні полігони є сумісними вздовж спільних країв і все ще утворюють дійсне покриття.
Спрощення використовує варіант алгоритму Visvalingam–Whyatt. Параметр tolerance має одиниці виміру відстані і приблизно дорівнює квадратному кореню з площі трикутників, що спрощуються.
Щоб спростити тільки "внутрішні" краї покриття (ті, що є спільними для двох полігонів), встановіть параметр simplifyBoundary на значення false.
Use this function to simplify adjacent polygon layers when shared boundaries must remain edge-matched. For a single geometry where only self-intersection and ring validity matter, see ST_SimplifyPreserveTopology.
![]() | |
Якщо вхідні дані не є дійсним покриттям, у вихідних даних можуть з'явитися несподівані артефакти (наприклад, перетини меж або розділені межі, які здавалися спільними). Використовуйте ST_CoverageInvalidEdges, щоб визначити, чи є покриття дійсним. |
Доступність: 3.4.0
Потрібна версія GEOS >= 3.12.0
Simplify a polygonal coverage while preserving shared boundaries.
WITH coverage(id, geom) AS (VALUES (1, 'POLYGON ((160 150,110 130,90 100,90 70,60 60,50 10,30 30,40 50,25 40,10 60,30 100,30 120,20 170,60 180,90 190,130 180,130 160,160 150),(40 160,50 140,66 125,60 100,80 140,90 170,60 160,40 160))'::geometry), (2, 'POLYGON ((40 160,60 160,90 170,80 140,60 100,66 125,50 140,40 160))'::geometry), (3, 'POLYGON ((110 130,160 50,140 50,120 33,90 30,50 10,60 60,90 70,90 100,110 130))'::geometry), (4, 'POLYGON ((160 150,150 120,160 90,160 50,110 130,160 150))'::geometry) ) SELECT id, ST_CoverageSimplify(geom, 30) OVER () FROM coverage;
id | st_astext ----+--------------------------------------- 1 | POLYGON ((160 150, 110 130, 50 10, 10 60, 20 170, 90 190, 160 150), (40 160, 66 125, 90 170, 40 160)) 2 | POLYGON ((40 160, 66 125, 90 170, 40 160)) 3 | POLYGON ((110 130, 160 50, 50 10, 110 130)) 4 | POLYGON ((160 150, 160 50, 110 130, 160 150))
ST_CoverageEdges — Computes the unique edges of a polygonal coverage.
geometry ST_CoverageEdges(geometry geom, integer edgetype = 0);
geometry ST_CoverageEdges(geometry[] geoms, integer edgetype = 0);
Returns a MultiLineString representing the unique edges of a polygonal coverage. A polygonal coverage is a set of non-overlapping polygons where adjacent polygons have matching vertices along shared edges.
The edgetype parameter can be used to select which edges are returned:
0 (ALL) - all unique edges (default)
1 (EXTERIOR) - only exterior edges (non-shared)
2 (INTERIOR) - only interior edges (shared)
Availability: 3.7.0
Requires GEOS >= 3.15.0
This example returns all unique edges of a coverage.
WITH coverage(geom) AS (
VALUES (
'GEOMETRYCOLLECTION(
POLYGON((0 0,10 0,10 10,0 10,0 0)),
POLYGON((10 0,20 0,20 10,10 10,10 0))
)'::geometry
)
)
SELECT geom AS input_coverage,
ST_CoverageEdges(geom) AS all_edges
FROM coverage;This example returns only the interior shared edges of a coverage.
WITH coverage(geom) AS (
VALUES (
'GEOMETRYCOLLECTION(
POLYGON((0 0,10 0,10 10,0 10,0 0)),
POLYGON((10 0,20 0,20 10,10 10,10 0))
)'::geometry
)
)
SELECT geom AS input_coverage,
ST_CoverageEdges(geom, 2) AS shared_edges
FROM coverage;ST_CoverageUnion — Обчислює об'єднання набору полігонів, що утворюють покриття, видаляючи спільні ребра.
geometry ST_CoverageUnion(geometry set geom);
Агрегуюча функція, яка об'єднує набір полігонів, що утворюють полігональне покриття. Результатом є полігональна геометрія, що покриває ту саму площу, що й покриття. Ця функція дає той самий результат, що й ST_Union, але використовує структуру покриття для значно швидшого обчислення об'єднання.
![]() | |
Якщо вхідні дані не є дійсним покриттям, у вихідних даних можуть з'явитися несподівані артефакти (наприклад, не об'єднані або перекриваються полігони). Використовуйте ST_CoverageInvalidEdges, щоб визначити, чи є покриття дійсним. |
Доступність: 3.4.0 - вимагає GEOS >= 3.8.0
Union a polygonal coverage.
WITH coverage(id, geom) AS (VALUES (1, 'POLYGON ((10 10,10 150,80 190,110 150,90 110,40 110,50 60,10 10))'::geometry), (2, 'POLYGON ((120 10,10 10,50 60,100 70,120 10))'::geometry), (3, 'POLYGON ((140 80,120 10,100 70,40 110,90 110,110 150,140 80))'::geometry), (4, 'POLYGON ((140 190,120 170,140 130,160 150,140 190))'::geometry), (5, 'POLYGON ((180 160,170 140,140 130,160 150,140 190,180 160))'::geometry) ) SELECT ST_CoverageUnion(geom) AS wkt FROM coverage;
MULTIPOLYGON(((10 150,80 190,110 150,140 80,120 10,10 10,10 150),(50 60,100 70,40 110,50 60)),((120 170,140 190,180 160,170 140,140 130,120 170)))
Ці функції змінюють положення та форму геометрій за допомогою афінних перетворень.
ST_Affine — Застосувати афінне перетворення 3D до геометрії.
geometry ST_Affine(geometry geomA, float a, float b, float c, float d, float e, float f, float g, float h, float i, float xoff, float yoff, float zoff);
geometry ST_Affine(geometry geomA, float a, float b, float d, float e, float xoff, float yoff);
Застосовує 3D афінне перетворення до геометрії, щоб виконати такі дії, як перенесення, обертання, масштабування за один крок.
Версія 1: Виклик
ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff)
представляє матрицю перетворення
/ a b c xoff \ | d e f yoff | | g h i zoff | \ 0 0 0 1 /
і вершини перетворюються наступним чином:
x' = a*x + b*y + c*z + xoff y' = d*x + e*y + f*z + yoff z' = g*x + h*y + i*z + zoff
Всі функції перетворення/масштабування, наведені нижче, виражаються за допомогою такого афінного перетворення.
Версія 2: Застосовує 2D афінне перетворення до геометрії. Виклик
ST_Affine(geom, a, b, d, e, xoff, yoff)
представляє матрицю перетворення.
/ a b 0 xoff \ / a b xoff \ | d e 0 yoff | rsp. | d e yoff | | 0 0 1 0 | \ 0 0 1 / \ 0 0 0 1 /
і вершини трансформуються наступним чином:
x' = a*x + b*y + xoff y' = d*x + e*y + yoff z' = z
Цей метод є підвидом вищезазначеного 3D-методу.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Доступність: 1.1.2. Назва змінена з Affine на ST_Affine у версії 1.2.2
![]() | |
До версії 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_Affine(geom, cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), 0, 0, 0, 1, 0, 0, 0) As using_affine,
ST_Rotate(geom, pi()) As using_rotate
FROM (SELECT 'LINESTRING(1 2 3,1 4 3)'::geometry 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_Affine(geom, cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), 0, 0, 0)
FROM (SELECT 'LINESTRING(1 2 3,1 4 3)'::geometry As geom) As foo;LINESTRING(-1 -2 -3,-1 -4 -3)
ST_Rotate — Обертає геометрію навколо точки початку координат.
geometry ST_Rotate(geometry geomA, float rotRadians);
geometry ST_Rotate(geometry geomA, float rotRadians, float x0, float y0);
geometry ST_Rotate(geometry geomA, float rotRadians, geometry pointOrigin);
Обертає геометрію rotRadians проти годинникової стрілки навколо точки початку координат. Початок обертання можна вказати як геометрію POINT або як координати x та y. Якщо початок координат не вказано, геометрія обертається навколо POINT(0 0).
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Покращено: 2.0.0 додано додаткові параметри для визначення початку обертання.
Доступність: 1.1.2. Назва змінена з Rotate на ST_Rotate у версії 1.2.2
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).
This example rotates a geometry by 180 degrees.
SELECT ST_Rotate('LINESTRING (50 160,50 50,100 50)'::geometry, pi());LINESTRING(-50 -160,-50 -50,-100 -50)
This example rotates a geometry 30 degrees counter-clockwise around x=50, y=160.
SELECT ST_Rotate('LINESTRING (50 160,50 50,100 50)'::geometry, pi()/6, 50, 160);LINESTRING(50 160,105 64.737206,148.30127 89.737206)
This example rotates a geometry 60 degrees clockwise around its centroid.
SELECT ST_Rotate(geom, -pi()/3, ST_Centroid(geom)) FROM (SELECT 'LINESTRING (50 160,50 50,100 50)'::geometry AS geom) AS foo;
LINESTRING(116.4225 130.6721,21.1597 75.6721,46.1597 32.3708)
ST_RotateX — Обертає геометрію навколо осі X.
geometry ST_RotateX(geometry geomA, float rotRadians);
Обертає геометрію geomA - rotRadians навколо осі X.
![]() | |
|
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Доступність: 1.1.2. Назва змінена з RotateX на ST_RotateX у версії 1.2.2
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).
This example rotates a line 90 degrees around the X axis.
SELECT ST_RotateX('LINESTRING(1 2 3,1 1 1)', pi()/2);LINESTRING(1 -3 2,1 -1 1)
ST_RotateY — Обертає геометрію навколо осі Y.
geometry ST_RotateY(geometry geomA, float rotRadians);
Обертає геометрію geomA - rotRadians навколо осі y.
![]() | |
|
Доступність: 1.1.2. Назва змінена з RotateY на ST_RotateY у версії 1.2.2.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
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).
This example rotates a line 90 degrees around the Y axis.
SELECT ST_RotateY('LINESTRING(1 2 3,1 1 1)', pi()/2);LINESTRING(3 2 -1,1 1 -1)
ST_RotateZ — Обертає геометрію навколо осі Z.
geometry ST_RotateZ(geometry geomA, float rotRadians);
Обертає геометрію geomA - rotRadians навколо осі Z.
![]() | |
Це синонім ST_Rotate |
![]() | |
|
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Доступність: 1.1.2. Назва змінена з RotateZ на ST_RotateZ у версії 1.2.2
![]() | |
До версії 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).
This example rotates a line 90 degrees around the Z axis.
SELECT ST_RotateZ('LINESTRING(1 2 3,1 1 1)', pi()/2);LINESTRING(-2 1 3,-1 1 1)
This example rotates a curved circle around the Z axis.
SELECT ST_RotateZ(geom, pi()/2)
FROM (SELECT ST_LineToCurve(ST_Buffer('POINT(234 567)'::geometry, 3)) As geom) As foo;CURVEPOLYGON(CIRCULARSTRING(-567 237.00000000000003,-567 231.00000000000003,-567 237.00000000000003))
ST_Scale — Масштабує геометрію за заданими коефіцієнтами.
geometry ST_Scale(geometry geomA, float XFactor, float YFactor, float ZFactor);
geometry ST_Scale(geometry geomA, float XFactor, float YFactor);
geometry ST_Scale(geometry geom, geometry factor);
geometry ST_Scale(geometry geom, geometry factor, geometry origin);
Масштабує геометрію до нового розміру, помножуючи ординати на відповідні параметри коефіцієнтів.
Версія, що приймає геометрію як параметр factor, дозволяє передавати 2d, 3dm, 3dz або 4d точку для встановлення коефіцієнта масштабування для всіх підтримуваних вимірів. Відсутні виміри в точці factor еквівалентні відсутності масштабування відповідного виміру.
Варіант з трьома геометріями дозволяє передавати «хибну точку відліку» для масштабування. Це дозволяє здійснювати «масштабування на місці», наприклад, використовуючи центроїд геометрії як хибну точку відліку. Без хибної точки відліку масштабування відбувається відносно фактичної точки відліку, тому всі координати просто множаться на коефіцієнт масштабування.
![]() | |
До версії 1.3.4 ця функція виходила з ладу при використанні з геометріями, що містять КРИВІ. Ця проблема вирішена у версії 1.3.4+ |
Доступність: 1.1.0.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Покращено: 2.2.0 додано підтримку масштабування всіх розмірів (параметр factor).
Покращено: 2.5.0 додано підтримку масштабування відносно локального початку координат (параметр origin).
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.
This example scales X, Y, and Z values.
SELECT ST_Scale('LINESTRING(1 2 3,1 1 1)', 0.5, 0.75, 0.8);LINESTRING(0.5 1.5 2.4,0.5 0.75 0.8)
This example scales X and Y values.
SELECT ST_Scale('LINESTRING(1 2 3,1 1 1)', 0.5, 0.75);LINESTRING(0.5 1.5 3,0.5 0.75 1)
This example scales X, Y, Z, and M values.
SELECT ST_Scale('LINESTRING(1 2 3 4,1 1 1 1)',
ST_MakePoint(0.5, 0.75, 2, -1));LINESTRING(0.5 1.5 6 -4,0.5 0.75 2 -1)
This example scales X and Y values using a false origin.
SELECT ST_Scale('LINESTRING(1 1,2 2)', 'POINT(2 2)', 'POINT(1 1)'::geometry);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);
Returns a new geometry whose coordinates are translated delta x,delta y,delta z units. Units are based on the units defined in spatial reference (SRID) for this geometry. M coordinates are preserved.
![]() | |
До версії 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.
This function supports M coordinates.
Перемістити точку на 1 градус довготи
SELECT ST_Translate(ST_GeomFromText('POINT(-71.01 42.37)', 4326), 1, 0) AS wgs_transgeomtxt;POINT(-70.01 42.37)
Перемістіть лінію на 1 градус довготи та 1/2 градуса широти
SELECT ST_Translate(ST_GeomFromText('LINESTRING(-71.01 42.37,-71.11 42.38)', 4326), 1, 0.5) AS wgs_transgeomtxt;LINESTRING(-70.01 42.87,-70.11 42.88)
Перемістити 3D-точку
SELECT ST_Translate(CAST('POINT(0 0 0)' AS geometry), 5, 12, 3);POINT(5 12 3)
Move points with a measure coordinate
SELECT ST_Translate('POINTM(0 0 11)', 5, 12);POINTM(5 12 11)
SELECT ST_Translate('POINT(0 0 7 11)', 5, 12, 3);POINT(5 12 10 11)
Переміщення кривої та точки
SELECT 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);GEOMETRYCOLLECTION(CURVEPOLYGON(CIRCULARSTRING(5 5,4.12 2.878,2 2,-0.121 7.1213,7 9,9 11,5 5)), POINT(2 5))
ST_TransScale — Перетворює та масштабує геометрію за заданими зміщеннями та коефіцієнтами.
geometry ST_TransScale(geometry geomA, float deltaX, float deltaY, float XFactor, float YFactor);
Перетворює геометрію за допомогою аргументів deltaX і deltaY, а потім масштабує її за допомогою аргументів XFactor і YFactor, працюючи тільки в 2D.
![]() | |
|
![]() | |
До версії 1.3.4 ця функція виходила з ладу при використанні з геометріями, що містять КРИВІ. Ця проблема вирішена у версії 1.3.4+ |
Доступність: 1.1.0.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
SELECT ST_TransScale('LINESTRING(1 2 3,1 1 1)', 0.5, 1, 1, 2);LINESTRING(1.5 6 3,1.5 4 1)
This example buffers a point to approximate a circle, converts it to a curve, translates it by 1,2, and scales it by 3,4.
SELECT ST_TransScale(ST_LineToCurve(ST_Buffer('POINT(234 567)', 3)), 1, 2, 3, 4);CURVEPOLYGON(CIRCULARSTRING(714 2276,696 2276,714 2276))
Ці функції реалізують алгоритми кластеризації для наборів геометрій.
ST_ClusterDBSCAN — Функція вікна, яка повертає ідентифікатор кластера для кожної вхідної геометрії за допомогою алгоритму DBSCAN.
integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);
Віконна функція, яка повертає номер кластера для кожної вхідної геометрії, використовуючи 2D алгоритм просторового кластеризації додатків на основі щільності з шумом (DBSCAN). На відміну від ST_ClusterKMeans, вона не вимагає вказання кількості кластерів, а замість цього використовує бажані параметри відстань (eps) та щільність (minpoints) для визначення кожного кластера.
Геометрія входу додається до кластера, якщо вона:
Зверніть увагу, що геометрії меж можуть знаходитися на відстані eps від геометрій ядра в більш ніж одному кластері. Будь-яке призначення буде правильним, тому геометрія межі буде довільно призначена одному з доступних кластерів. У цій ситуації можливе створення правильного кластера з меншою кількістю геометрій, ніж minpoints. Щоб забезпечити детермінований прив'язку геометрій меж (так, щоб повторні виклики ST_ClusterDBSCAN давали однакові результати), використовуйте оператор ORDER BY у визначенні вікна. Неоднозначні прив'язки кластерів можуть відрізнятися від інших реалізацій DBSCAN.
![]() | |
Геометріям, які не відповідають критеріям для приєднання до будь-якого кластера, присвоюється номер кластера NULL. |
Доступність: 2.3.0
This method supports Circular Strings and Curves.
Cluster polygons within 50 units of each other, requiring at least two polygons per cluster. The isolated polygon is reported as noise.
WITH input(name, geom) AS (
VALUES
('A1', ST_MakeEnvelope(0, 0, 10, 10)),
('A2', ST_MakeEnvelope(30, 0, 40, 10)),
('B1', ST_MakeEnvelope(100, 0, 110, 10)),
('B2', ST_MakeEnvelope(130, 0, 140, 10)),
('noise', ST_MakeEnvelope(250, 0, 260, 10))
), clustered AS (
SELECT name,
geom,
ST_ClusterDBSCAN(geom, eps => 50, minpoints => 2)
OVER (ORDER BY name) AS cid
FROM input
)
SELECT COALESCE(cid::text, 'noise') AS cluster,
string_agg(name, ',' ORDER BY name) AS members,
ST_Collect(geom ORDER BY name) AS cluster_geom
FROM clustered
GROUP BY cid
ORDER BY cid NULLS LAST;0 | A1,A2 | MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((30 0,30 10,40 10,40 0,30 0))) 1 | B1,B2 | MULTIPOLYGON(((100 0,100 10,110 10,110 0,100 0)),((130 0,130 10,140 10,140 0,130 0))) noise | noise | MULTIPOLYGON(((250 0,250 10,260 10,260 0,250 0)))
Приклад об'єднання ділянок з однаковим номером кластера в геометричні колекції.
SELECT cid, ST_Collect(geom) AS cluster_geom, array_agg(parcel_id) AS ids_in_cluster FROM (
SELECT parcel_id, ST_ClusterDBSCAN(geom, eps => 0.5, minpoints => 5) over () AS cid, geom
FROM parcels) sq
GROUP BY cid;
ST_ClusterIntersecting — Агрегуюча функція, яка групує вхідні геометрії у зв'язані набори.
geometry[] ST_ClusterIntersecting(geometry set g);
Агрегатна функція, яка повертає масив GeometryCollections, розділяючи вхідні геометрії на з'єднані кластери, які не перетинаються. Кожна геометрія в кластері перетинається принаймні з однією іншою геометрією в кластері і не перетинається з жодною геометрією в інших кластерах.
Доступність: 2.2.0
WITH testdata AS
(SELECT unnest(
ARRAY['LINESTRING (0 0,1 1)'::geometry,
'LINESTRING (5 5,4 4)'::geometry,
'LINESTRING (6 6,7 7)'::geometry,
'LINESTRING (0 0,-1 -1)'::geometry,
'POLYGON ((0 0,4 0,4 4,0 4,0 0))'::geometry]) AS geom)
SELECT unnest(ST_ClusterIntersecting(geom)) FROM testdata;
GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0))) GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))
ST_ClusterIntersectingWin — Віконна функція, яка повертає ідентифікатор кластера для кожної вхідної геометрії, групуючи вхідні геометрії у пов'язані набори.
integer ST_ClusterIntersectingWin(geometry winset geom);
Віконна функція, яка будує з'єднані кластери геометрій, що перетинаються. Можна пройти всі геометрії в кластері, не виходячи з нього. Повертається номер кластера, до якого належить аргумент геометрії, або null для нульових вхідних даних.
Доступність: 3.4.0
Return an explicit cluster id for each input geometry. Using the conventional cid alias keeps the geometry column ready for color-by-cluster rendering.
WITH testdata(id, geom) AS (
VALUES (1, 'LINESTRING (0 0,1 1)'::geometry),
(2, 'LINESTRING (5 5,4 4)'::geometry),
(3, 'LINESTRING (6 6,7 7)'::geometry),
(4, 'LINESTRING (0 0,-1 -1)'::geometry),
(5, 'POLYGON ((0 0,4 0,4 4,0 4,0 0))'::geometry)
), clustered AS (
SELECT id,
geom,
ST_ClusterIntersectingWin(geom) OVER () AS cid
FROM testdata
)
SELECT id,
geom AS geom_wkt,
cid
FROM clustered
ORDER BY id;id | geom_wkt | cid ----+--------------------------------+----- 1 | LINESTRING(0 0,1 1) | 0 2 | LINESTRING(5 5,4 4) | 0 3 | LINESTRING(6 6,7 7) | 1 4 | LINESTRING(0 0,-1 -1) | 0 5 | POLYGON((0 0,4 0,4 4,0 4,0 0)) | 0
ST_ClusterRelateWin — Window function that returns a cluster id for each input geometry, clustering input geometries into connected sets using the relate pattern to determine whether the geometries are connected.
integer ST_ClusterRelateWin(geometry winset geom, text relate_matrix);
A window function that builds connected clusters of geometries that intersect. Geometries are added to a cluster if they share a pairwise DE9IM relationship with another member of the cluster. With this function it is possible to build a cluster of all objects that touch at boundaries, but exclude those that merely overlap.
Availability: 3.7.0
This collection of line strings would form a single cluster using ST_ClusterIntersectingWin, but using ST_ClusterRelateWin can be clustered into three groups that connect only via their end points.
WITH data(id, geom) AS (
VALUES (1, 'LINESTRING(0 0,1 1)'::geometry),
(2, 'LINESTRING(2 2,1 1)'::geometry),
(3, 'LINESTRING(0 1,1 0)'::geometry),
(4, 'LINESTRING(0 1,0 4)'::geometry),
(5, 'LINESTRING(2 2,2 4)'::geometry),
(6, 'LINESTRING(1.5 2.5,2.5 3.5)'::geometry)
), clustered AS (
SELECT id, geom,
ST_ClusterRelateWin(geom, '****0****') OVER () AS cluster
FROM data
)
SELECT cluster,
string_agg(id::text, ',' ORDER BY id) AS members,
ST_Collect(geom ORDER BY id) AS cluster_geom
FROM clustered
GROUP BY cluster
ORDER BY cluster;0 | 1,2,5 | MULTILINESTRING((0 0,1 1),(2 2,1 1),(2 2,2 4)) 1 | 3,4 | MULTILINESTRING((0 1,1 0),(0 1,0 4)) 2 | 6 | MULTILINESTRING((1.5 2.5,2.5 3.5))
ST_MinimumSpanningTree — Window function that returns a tree id for each input geometry, clustering input geometries into connected trees using the Minimum Spanning Tree algorithm.
integer ST_MinimumSpanningTree(geometry winset geom);
A window function that builds connected graphs of line strings based on the Minimum Spanning Tree (MST) of the input geometries. The return value is the cluster number that the geometry argument participates in, or zero if it is not part of the minimum tree.
The Minimum Spanning Tree connects all geometries in the window partition such that the total length of the connecting lines is minimized. If the graph is not fully connected (e.g. infinite distance between some geometries), it produces a Minimum Spanning Forest, and each connected component is assigned a unique tree ID.
Availability: 3.7.0
Requires GEOS >= 3.15.0
These six edges describe a square with both diagonals. The minimum spanning tree keeps three edges and excludes the rest.
WITH edges(id, geom) AS (
VALUES
(1, 'LINESTRING(0 0,1 0)'::geometry),
(2, 'LINESTRING(0 0,0 1)'::geometry),
(3, 'LINESTRING(1 1,0 1)'::geometry),
(4, 'LINESTRING(1 1,1 0)'::geometry),
(5, 'LINESTRING(0 0,1 1)'::geometry),
(6, 'LINESTRING(1 0,0 1)'::geometry)
), marked AS (
SELECT id,
geom,
ST_MinimumSpanningTree(geom) OVER (ORDER BY id) AS tree_id
FROM edges
)
SELECT string_agg(id::text, ',' ORDER BY id)
FILTER (WHERE tree_id > 0) AS tree_edge_ids,
ST_Collect(geom ORDER BY id)
FILTER (WHERE tree_id > 0) AS tree_edges,
string_agg(id::text, ',' ORDER BY id)
FILTER (WHERE tree_id = 0) AS excluded_edge_ids,
ST_Collect(geom ORDER BY id)
FILTER (WHERE tree_id = 0) AS excluded_edges
FROM marked;-[ RECORD 1 ]----- tree_edge_ids | 1,2,3 tree_edges | MULTILINESTRING((0 0,1 0),(0 0,0 1),(1 1,0 1)) excluded_edge_ids | 4,5,6 excluded_edges | MULTILINESTRING((1 1,1 0),(0 0,1 1),(1 0,0 1))
ST_ClusterKMeans — Віконна функція, яка повертає ідентифікатор кластера для кожної вхідної геометрії за допомогою алгоритму K-means.
integer ST_ClusterKMeans( geometry winset geom , integer k , float8 max_radius );
Повертає K-means номер кластера для кожної вхідної геометрії. Відстань, що використовується для кластеризації, - це відстань між центроїдами для 2D-геометрій і відстань між центрами обмежувальних рамок для 3D-геометрій. Для вхідних даних POINT координата M буде розглядатися як вага вхідних даних і повинна бути більшою за 0.
max_radius, якщо встановлено, змусить ST_ClusterKMeans генерувати більше кластерів, ніж k, гарантуючи, що жоден кластер у вихідних даних не матиме радіус, більший за max_radius. Це корисно для аналізу доступності.
Покращено: 3.2.0 Підтримка max_radius
Покращено: 3.1.0 Підтримка 3D-геометрії та ваги
Доступність: 2.3.0
Define the parcel geometries once in a CTE and reuse them across the executable examples.
Parcels color-coded by cluster number (cid).
WITH parcels(parcel_id, geom) AS (
VALUES
('A1', ST_MakeEnvelope(0, 0, 10, 10)),
('A2', ST_MakeEnvelope(10, 0, 20, 10)),
('B1', ST_MakeEnvelope(100, 0, 110, 10)),
('B2', ST_MakeEnvelope(110, 0, 120, 10)),
('C1', ST_MakeEnvelope(200, 0, 210, 10)),
('C2', ST_MakeEnvelope(210, 0, 220, 10))
), clustered AS (
SELECT parcel_id,
geom,
ST_ClusterKMeans(geom, 3) OVER (ORDER BY parcel_id) AS cid
FROM parcels
)
SELECT cid,
string_agg(parcel_id, ',' ORDER BY parcel_id) AS parcels,
ST_Union(geom) AS cluster_geom
FROM clustered
GROUP BY cid
ORDER BY cid;0 | C1,C2 | POLYGON((200 10,210 10,220 10,220 0,210 0,200 0,200 10)) 1 | A1,A2 | POLYGON((0 10,10 10,20 10,20 0,10 0,0 0,0 10)) 2 | B1,B2 | POLYGON((100 10,110 10,120 10,120 0,110 0,100 0,100 10))
Розподіл кластерів ділянок за типом:
WITH parcel_geoms AS (
SELECT geom
FROM ST_Subdivide(
ST_Buffer('SRID=3857;LINESTRING(40 100,98 100,100 150,60 90)'::geometry,
40, 'endcap=square'),
12) AS geom
), parcels AS (
SELECT lpad(row_number() OVER (ORDER BY ST_YMin(geom), ST_XMin(geom))::text, 3, '0') AS parcel_id,
geom,
('{residential,commercial}'::text[])[1 + mod(row_number() OVER (ORDER BY ST_YMin(geom), ST_XMin(geom)), 2)] AS type
FROM parcel_geoms
)
SELECT ST_ClusterKMeans(geom, 3) over (PARTITION BY type) AS cid,
parcel_id,
type,
ST_SnapToGrid(geom, 1) AS parcel_geom
FROM parcels
ORDER BY type, parcel_id;cid | parcel_id | type | parcel_geom -----+-----------+-------------+-------------------------------------------------------------- 0 | 001 | commercial | POLYGON((33 60,0 60,0 98,71 98,71 35,33 60)) 2 | 003 | commercial | POLYGON((106 98,138 98,137 91,134 84,131 77,126 71,120 66,113 63,106 61,106 98)) 2 | 005 | commercial | POLYGON((140 148,138 98,72 98,72 148,140 148)) 1 | 007 | commercial | POLYGON((109 189,116 187,123 183,129 178,134 171,137 164,139 156,140 148,109 148,109 189)) 0 | 002 | residential | POLYGON((71 98,106 98,106 61,98 60,88 60,71 35,71 98)) 2 | 004 | residential | POLYGON((0 98,0 140,45 140,67 172,72 178,72 98,0 98)) 1 | 006 | residential | POLYGON((72 178,78 183,85 187,93 189,101 190,109 189,109 148,72 148,72 178))
Example: Clustering a preaggregated planetary-scale data population dataset using 3D clustering and weighting. Identify at least 20 regions based on Kontur Population Data that do not span more than 3000 km from their center:
CREATE TABLE kontur_population_3000km_clusters AS
SELECT
geom,
ST_ClusterKMeans(
ST_Force4D(
ST_Transform(ST_Force3D(geom), 4978),
mvalue => population
),
20,
max_radius => 3000000
) OVER () AS cid
FROM kontur_population;The clustering produces 46 regions. Clusters are centered at well-populated regions such as New York and Moscow. Greenland forms one cluster, several island clusters span the antimeridian, and cluster edges follow the Earth's curvature.

Kontur population clustered with 3000 km maximum radius.
Cluster weighted city populations on the Earth in geocentric coordinates. The maximum radius is specified in meters, while the returned geometries stay in WGS 84 for display.
WITH population(place, population, geom) AS (
VALUES
('Boston', 5.0, ST_SetSRID(ST_Point(-71.06, 42.36), 4326)),
('New York', 20.0, ST_SetSRID(ST_Point(-74.01, 40.71), 4326)),
('London', 15.0, ST_SetSRID(ST_Point(-0.13, 51.51), 4326)),
('Paris', 11.0, ST_SetSRID(ST_Point(2.35, 48.86), 4326)),
('Osaka', 19.0, ST_SetSRID(ST_Point(135.50, 34.69), 4326)),
('Tokyo', 37.0, ST_SetSRID(ST_Point(139.69, 35.68), 4326)),
('Melbourne', 5.0, ST_SetSRID(ST_Point(144.96, -37.81), 4326)),
('Sydney', 5.0, ST_SetSRID(ST_Point(151.21, -33.87), 4326))
), clustered AS (
SELECT place,
geom,
ST_ClusterKMeans(
ST_Force4D(
ST_Transform(ST_Force3D(geom), 4978),
mvalue => population
),
4,
max_radius => 3000000
) OVER (ORDER BY place) AS cid
FROM population
)
SELECT cid,
string_agg(place, ', ' ORDER BY place) AS places,
ST_Collect(geom ORDER BY place) AS cluster_geom
FROM clustered
GROUP BY cid
ORDER BY cid;0 | Melbourne, Sydney | MULTIPOINT((144.96 -37.81),(151.21 -33.87)) 1 | Boston, New York | MULTIPOINT((-71.06 42.36),(-74.01 40.71)) 2 | Osaka, Tokyo | MULTIPOINT((135.5 34.69),(139.69 35.68)) 3 | London, Paris | MULTIPOINT((-0.13 51.51),(2.35 48.86))
ST_ClusterWithin — Агрегатна функція, яка групує геометрії за відстанню розділення.
geometry[] ST_ClusterWithin(geometry set g, float8 distance);
Агрегатна функція, яка повертає масив GeometryCollections, де кожна колекція є кластером, що містить деякі вхідні геометрії. Кластеризація розділяє вхідні геометрії на набори, в яких кожна геометрія знаходиться в межах заданої відстані від принаймні однієї іншої геометрії в тому самому кластері. Відстані є декартовими відстанями в одиницях SRID.
ST_ClusterWithin еквівалентний виконанню ST_ClusterDBSCAN з minpoints => 0.
Доступність: 2.2.0
This method supports Circular Strings and Curves.
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 unnest(ST_ClusterWithin(geom, 1.4)) FROM testdata;
GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0))) GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))
ST_ClusterWithinWin — Віконна функція, яка повертає ідентифікатор кластера для кожної вхідної геометрії, кластеризуючи за відстанню розділення.
integer ST_ClusterWithinWin(geometry winset geom, float8 distance);
Віконна функція, яка повертає номер кластера для кожної вхідної геометрії. Кластеризація розділяє геометрії на набори, в яких кожна геометрія знаходиться в межах заданої відстані distance від принаймні однієї іншої геометрії в тому самому кластері. Відстані є декартовими відстанями в одиницях SRID.
ST_ClusterWithinWin еквівалентно виконанню ST_ClusterDBSCAN з minpoints => 0.
Доступність: 3.4.0
This method supports Circular Strings and Curves.
WITH testdata AS (
SELECT id, geom::geometry FROM (
VALUES (1, 'LINESTRING (0 0,1 1)'),
(2, 'LINESTRING (5 5,4 4)'),
(3, 'LINESTRING (6 6,7 7)'),
(4, 'LINESTRING (0 0,-1 -1)'),
(5, 'POLYGON ((0 0,4 0,4 4,0 4,0 0))')) AS t(id, geom)
)
SELECT id,
geom,
ST_ClusterWithinWin(geom, 1.4) OVER () AS cluster
FROM testdata;id | st_astext | cluster ----+--------------------------------+--------- 1 | LINESTRING(0 0,1 1) | 0 2 | LINESTRING(5 5,4 4) | 0 3 | LINESTRING(6 6,7 7) | 1 4 | LINESTRING(0 0,-1 -1) | 0 5 | POLYGON((0 0,4 0,4 4,0 4,0 0)) | 0
Ці функції створюють або оперують обмежувальними рамками. Вони також можуть надавати та приймати значення геометрії, використовуючи автоматичні або явні приведення типів.
Див. також Розділ 13.7, «Функції PostGIS Box».
Box2D — Повертає BOX2D, що представляє 2D розмір геометрії.
box2d Box2D(geometry geom);
Повертає box2d, що представляє 2D розмір геометрії.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
This method supports Circular Strings and Curves.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT Box2D('LINESTRING(1 2,3 4,5 6)'::geometry);BOX(1 2,5 6)
SELECT Box2D('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'::geometry);BOX(220186.99512189245 150406,220288.24878054656 150506.12682932706)
Box3D — Повертає BOX3D, що представляє 3D-розмір геометрії.
box3d Box3D(geometry geom);
Повертає box3d, що представляє 3D-розмір геометрії.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
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 Box3D('LINESTRING(1 2 3,3 4 5,5 6 5)'::geometry);BOX3D(1 2 3,5 6 5)
SELECT Box3D('CIRCULARSTRING(220268 150415 1,220227 150505 1,220227 150406 1)'::geometry);BOX3D(220186.99512189245 150406 1,220288.24878054656 150506.12682932706 1)
ST_EstimatedExtent — Повертає приблизний діапазон просторової таблиці.
box2d ST_EstimatedExtent(text schema_name, text table_name, text geocolumn_name, boolean parent_only);
box2d ST_EstimatedExtent(text schema_name, text table_name, text geocolumn_name);
box2d ST_EstimatedExtent(text table_name, text geocolumn_name);
Повертає приблизний діапазон просторової таблиці у вигляді box2d. Якщо не вказано, використовується поточна схема. Приблизний діапазон береться зі статистики стовпця геометрії. Зазвичай це набагато швидше, ніж обчислення точного діапазону таблиці за допомогою ST_Extent або ST_3DExtent.
За замовчуванням також використовуються статистичні дані, зібрані з дочірніх таблиць (таблиць з INHERITS), якщо вони доступні. Якщо parent_only встановлено на TRUE, використовуються тільки статистичні дані для заданої таблиці, а дочірні таблиці ігноруються.
Для PostgreSQL >= 8.0.0 статистика збирається за допомогою VACUUM ANALYZE, а результат буде приблизно 95% від фактичного. Для PostgreSQL <8.0.0 статистика збирається за допомогою update_geometry_stats(), а результат є точним.
![]() | |
За відсутності статистики (порожня таблиця або не викликано ANALYZE) ця функція повертає NULL. До версії 1.5.4 замість цього виникало виключення. |
![]() | |
Для імен таблиць та/або просторів імен, що містять спеціальні символи та лапки, може знадобитися спеціальна обробка. Користувач зазначає: "Для схем і таблиць використовуйте правила екранування ідентифікаторів, щоб створити рядок у подвійних лапках, а потім видаліть перший і останній символи подвійних лапок. Для стовпця геометрії передайте як є" |
Доступність: 1.0.0
Змінено: 2.1.0. До версії 2.0.x це називалося ST_Estimated_Extent.
This method supports Circular Strings and Curves.
SELECT ST_EstimatedExtent('ny', 'edges', 'geom');st_estimatedextent -------------------------------------------------- BOX(-8877653 4912316,-8010225.5 5589284) (1 row)
SELECT ST_EstimatedExtent('feature_poly', 'geom');st_estimatedextent --------------------------------------------------------------------- BOX(-124.659652709961 24.6830825805664,-67.7798080444336 49.0012092590332) (1 row)
ST_Expand — Повертає обмежувальну рамку, розширену з іншої обмежувальної рамки або геометрії.
geometry ST_Expand(geometry geom, float units_to_expand);
geometry ST_Expand(geometry geom, float dx, float dy, float dz=0, float dm=0);
box2d ST_Expand(box2d box, float units_to_expand);
box2d ST_Expand(box2d box, float dx, float dy);
box3d ST_Expand(box3d box, float units_to_expand);
box3d ST_Expand(box3d box, float dx, float dy, float dz=0);
Повертає обмежувальну рамку, розширену від обмежувальної рамки вхідних даних, або шляхом вказання єдиної відстані, на яку слід розширити рамку по обох осях, або шляхом вказання відстані розширення для кожної осі. Використовує подвійну точність. Може використовуватися для запитів відстані або для додавання фільтра обмежувальної рамки до запиту, щоб скористатися перевагами просторового індексу.
На додаток до версії ST_Expand, яка приймає та повертає геометрію, надаються варіанти, які приймають та повертають типи даних box2d та box3d.
Відстані вказані в одиницях просторової системи координат вхідних даних.
ST_Expand схожий на ST_Buffer, за винятком того, що під час буферизації геометрія розширюється в усіх напрямках, а ST_Expand розширює обмежувальну рамку вздовж кожної осі.
![]() | |
До версії 1.3 ST_Expand використовувався разом з ST_Distance для виконання індексованих запитів на відстань. Наприклад, |
Доступність: 1.5.0 поведінка змінена на виведення координат подвійної точності замість float4.
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Покращено: додано підтримку версії 2.3.0 для розширення поля на різну величину в різних вимірах.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
![]() | |
У наведених нижче прикладах використовується карта США National Atlas Equal Area (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);BOX(2312882 110666,2312990 110724)
This example expands a 3D box by 10 meters.
SELECT ST_Expand(CAST('BOX3D(778783 2951741 1,794875 2970042.61545891 10)' AS box3d), 10)BOX3D(778773 2951731 -9,794885 2970052.61545891 20)
This example renders the text representation of a 10-meter expanded box around a point geometry.
SELECT ST_Expand('SRID=2163;POINT(2312980 110676)'::geometry, 10);SRID=2163;POLYGON((2312970 110666,2312970 110686,2312990 110686,2312990 110666,2312970 110666))
ST_Extent — Агрегатна функція, яка повертає обмежувальну рамку геометрій.
box2d ST_Extent(geometry set geomfield);
Агрегатна функція, яка повертає обмежувальну рамку box2d, що обмежує набір геометрій.
Координати обмежувальної рамки знаходяться в просторовій системі координат вхідних геометрій.
ST_Extent за своєю концепцією схожий на SDO_AGGR_MBR Oracle Spatial/Locator.
![]() | |
ST_Extent повертає прямокутники тільки з координатами X і Y, навіть для 3D-геометрій. Щоб повернути координати XYZ, використовуйте ST_3DExtent. |
![]() | |
Повернене значення |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
![]() | |
У наведених нижче прикладах використовується система координат штату Массачусетс (SRID=2249) |
SELECT ST_Extent(geom) AS bextent FROM sometable;
BOX(739651.875 2908247.25,794875.8125 2970042.75)
Return extent of each geometry category.
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
This example converts the extent back into a geometry and renders its extended text representation.
SELECT ST_SetSRID(ST_Extent(geom), 2249) AS bextent FROM sometable;
SRID=2249;POLYGON((739651.875 2908247.25,739651.875 2970042.75,794875.8125 2970042.75,
794875.8125 2908247.25,739651.875 2908247.25))
ST_3DExtent — Агрегатна функція, яка повертає 3D обмежувальну рамку геометрій.
box3d ST_3DExtent(geometry set geomfield);
Агрегатна функція, яка повертає обмежувальну рамку box3d(включає координату Z), що обмежує набір геометрій.
Координати обмежувальної рамки знаходяться в просторовій системі координат вхідних геометрій.
![]() | |
Повернене значення |
Покращено: 2.0.0 додано підтримку багатогранних поверхонь, трикутників і TIN.
Змінено: 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;BOX3D(1 1 0,3 2 2)
This example returns the extent of several elevated CircularStrings.
SELECT ST_3DExtent(foo.geom) As b3extent
FROM (SELECT ST_Translate(ST_Force3DZ(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;BOX3D(0 0 0,4 3 2)
ST_MakeBox2D — Створює BOX2D, визначений двома 2D точковими геометріями.
box2d ST_MakeBox2D(geometry pointLowLeft, geometry pointUpRight);
Створює box2d, визначений двома геометріями Point. Це корисно для виконання запитів діапазону.
Return all features that fall within 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, визначений двома геометріями 3D-точок.
box3d ST_3DMakeBox(geometry point3DLowLeftBottom, geometry point3DUpRightTop);
Створює box3d, визначений двома геометріями 3D Point.
Ця функція підтримує 3D і не знижує z-індекс.
Змінено: 2.0.0 У попередніх версіях це називалося ST_MakeBox3D
SELECT ST_3DMakeBox(ST_MakePoint(-989502.1875, 528439.5625, 10),
ST_MakePoint(-987121.375 , 529933.1875, 10))BOX3D(-989502.1875 528439.5625 10,-987121.375 529933.1875 10)
ST_XMax — Повертає X максимум 2D або 3D обмежувальної рамки або геометрії.
float ST_XMax(box3d aGeomorBox2DorBox3D);
Повертає X максимум 2D або 3D обмежувальної рамки або геометрії.
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або 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)');4
SELECT ST_XMax('LINESTRING(1 3 4,5 6 7)'::geometry);5
SELECT ST_XMax(CAST('BOX(-3 2,3 4)' AS box2d));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('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'::geometry);220288.248780547
ST_XMin — Повертає мінімальне значення X для 2D або 3D обмежувальної рамки або геометрії.
float ST_XMin(box3d aGeomorBox2DorBox3D);
Повертає мінімальне значення X для 2D або 3D обмежувальної рамки або геометрії.
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або 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)');1
SELECT ST_XMin('LINESTRING(1 3 4,5 6 7)'::geometry);1
SELECT ST_XMin(CAST('BOX(-3 2,3 4)' AS box2d));-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('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'::geometry);220186.995121892
ST_YMax — Повертає максимальне значення Y 2D або 3D обмежувальної рамки або геометрії.
float ST_YMax(box3d aGeomorBox2DorBox3D);
Повертає максимальне значення Y 2D або 3D обмежувальної рамки або геометрії.
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або 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)');5
SELECT ST_YMax('LINESTRING(1 3 4,5 6 7)'::geometry);6
SELECT ST_YMax(CAST('BOX(-3 2,3 4)' AS box2d));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('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'::geometry);150506.126829327
ST_YMin — Повертає мінімальне значення Y для 2D або 3D обмежувальної рамки або геометрії.
float ST_YMin(box3d aGeomorBox2DorBox3D);
Повертає мінімальне значення Y 2D або 3D обмежувальної рамки або геометрії.
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або 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)');2
SELECT ST_YMin('LINESTRING(1 3 4,5 6 7)'::geometry);3
SELECT ST_YMin(CAST('BOX(-3 2,3 4)' AS box2d));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('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'::geometry);150406
ST_ZMax — Повертає максимальне значення Z для 2D або 3D обмежувальної рамки або геометрії.
float ST_ZMax(box3d aGeomorBox2DorBox3D);
Повертає максимальне значення Z для 2D або 3D обмежувальної рамки або геометрії..
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або 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)');6
SELECT ST_ZMax('LINESTRING(1 3 4,5 6 7)'::geometry);7
SELECT ST_ZMax('BOX3D(-3 2 1,3 4 1)');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('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'::geometry);3
ST_ZMin — Повертає мінімальне значення Z для 2D або 3D обмежувальної рамки або геометрії.
float ST_ZMin(box3d aGeomorBox2DorBox3D);
Повертає мінімальне значення Z 2D- або 3D-обмежувальної рамки або геометрії.
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або 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)');3
SELECT ST_ZMin('LINESTRING(1 3 4,5 6 7)'::geometry);4
SELECT ST_ZMin('BOX3D(-3 2 1,3 4 1)');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('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'::geometry);1
ST_GeomFromEWKT, ST_GeomFromText, ST_XMin, ST_XMax, ST_YMin, ST_YMax, ST_ZMax, ST_MMin, ST_MMax
ST_XSize — Returns the X size of a 2D or 3D bounding box or a geometry.
float ST_XSize(box3d aGeomorBox2DorBox3D);
Returns the X size of a 2D or 3D bounding box or a geometry, computed as ST_XMax(aGeomorBox2DorBox3D) - ST_XMin(aGeomorBox2DorBox3D).
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або box2d, оскільки вони не перетворюються автоматично. |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
Availability: 3.7.0
SELECT ST_XSize('BOX3D(1 2 3,4 5 6)');3
SELECT ST_XSize('LINESTRING(1 3,5 6)'::geometry);4
ST_YSize — Returns the Y size of a 2D or 3D bounding box or a geometry.
float ST_YSize(box3d aGeomorBox2DorBox3D);
Returns the Y size of a 2D or 3D bounding box or a geometry, computed as ST_YMax(aGeomorBox2DorBox3D) - ST_YMin(aGeomorBox2DorBox3D).
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або box2d, оскільки вони не перетворюються автоматично. |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
Availability: 3.7.0
SELECT ST_YSize('BOX3D(1 2 3,4 5 6)');3
SELECT ST_YSize('LINESTRING(1 3,5 6)'::geometry);3
ST_ZSize — Returns the Z size of a 2D or 3D bounding box or a geometry.
float ST_ZSize(box3d aGeomorBox2DorBox3D);
Returns the Z size of a 2D or 3D bounding box or a geometry, computed as ST_ZMax(aGeomorBox2DorBox3D) - ST_ZMin(aGeomorBox2DorBox3D).
![]() | |
Хоча ця функція визначена тільки для box3d, вона також працює для значень box2d і geometry завдяки автоматичному перетворенню. Однак вона не приймає текстове представлення geometry або box2d, оскільки вони не перетворюються автоматично. |
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
Availability: 3.7.0
SELECT ST_ZSize('BOX3D(1 2 3,4 5 6)');3
SELECT ST_ZSize('LINESTRING(1 3 4,5 6 7)'::geometry);3
ST_MMin — Повертає M-мінімум геометрії.
float ST_MMin(geometry geom);
Returns the M minima of a geometry, or null if the geometry lacks M values.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
SELECT ST_MMin('POINT M (1 2 3)');3
ST_MMax — Returns the M maxima of a geometry.
float ST_MMax(geometry geom);
Returns the M maxima of a geometry, or null if the geometry lacks M values.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
SELECT ST_MMax('POINT M (1 2 3)');3
ST_MSize — Returns the M size of a geometry.
float ST_MSize(geometry geom);
Returns the M size of a geometry, computed as ST_MMax(geom) - ST_MMin(geom), or null if the geometry lacks M values.
This function supports 3d and will not drop the z-index.
This method supports Circular Strings and Curves.
Availability: 3.7.0
SELECT ST_MSize('LINESTRING M (1 2 3,4 6 8)');5
Ці функції вимірюють і визначають місце розташування подій уздовж лінійних об'єктів. Вони підтримують класичний робочий процес лінійного посилання, що полягає у вираженні позицій у вигляді дробів або вимірів уздовж маршрутів і перетворенні цих вимірів назад у просторові координати.
ST_LineInterpolatePoint — Повертає точку, інтерпольовану вздовж лінії в дробовому місці.
geometry ST_LineInterpolatePoint(geometry a_linestring, float8 a_fraction);
geography ST_LineInterpolatePoint(geography a_linestring, float8 a_fraction, boolean use_spheroid = true);
Повертає точку, інтерпольовану вздовж лінії в дробовому місці. Перший аргумент повинен бути LINESTRING. Другий аргумент — це число з плаваючою комою від 0 до 1, що позначає дрібну частину довжини лінії, де має бути розташована точка. Значення Z і M інтерполюються, якщо вони є.
Див. ST_LineLocatePointдля обчислення найближчого до точки місця розташування лінії.
![]() | |
ST_3DLineInterpolatePoint обчислює точки в 3D і інтерполює тільки значення M. |
![]() | |
Починаючи з версії 1.1.1, ця функція також інтерполює значення M і Z (якщо вони присутні), тоді як у попередніх версіях вони встановлювалися на 0,0. |
Доступність: 0.8.2, підтримка Z і M додана в 1.1.1
Змінено: 2.1.0. До версії 2.0.x ця функція називалася ST_Line_Interpolate_Point.
This function supports 3d and will not drop the z-index.
This example returns the point 20 percent along a line.
SELECT ST_LineInterpolatePoint( 'LINESTRING(25 50,100 125,150 190)', 0.2);
POINT(51.5974135047432 76.5974135047432)
Середина 3D лінії:
SELECT ST_LineInterpolatePoint( 'LINESTRING(1 2 3,4 5 6,6 7 8)', 0.5);
POINT(3.5 4.5 5.5)
Найближча точка на прямій до точки:
SELECT ST_LineInterpolatePoint(
line.geom,
ST_LineLocatePoint(line.geom, 'POINT(4 3)'))
FROM (SELECT 'LINESTRING(1 2,4 5,6 7)'::geometry As geom) AS line;POINT(3 4)
An interpolated point can be offset to the left or right of a line by using ST_OffsetCurve before interpolation. This is useful for locating an address point beside a street centerline.
WITH street AS (
SELECT 'LINESTRING(0 0, 10 0)'::geometry AS geom,
100 AS from_num,
200 AS to_num
)
SELECT
ST_LineInterpolatePoint(
ST_OffsetCurve(geom, -2),
(160 - from_num)::float8 / (to_num - from_num)
) AS interpolated_offset_point
FROM street;
interpolated_offset_point --------------------------- POINT(6 -2)
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
This function supports 3d and will not drop the z-index.
Точка повернення 20% вздовж 3D лінії
SELECT ST_3DLineInterpolatePoint( 'LINESTRING(25 50 70,100 125 90,150 190 200)', 0.20);
POINT Z (59.06758929108215 84.06758929108216 79.0846904776219)
ST_LineInterpolatePoints — Повертає точки, інтерпольовані вздовж лінії з дробовим інтервалом.
geometry ST_LineInterpolatePoints(geometry a_linestring, float8 a_fraction, boolean repeat);
geography ST_LineInterpolatePoints(geography a_linestring, float8 a_fraction, boolean use_spheroid = true, boolean repeat = true);
Повертає одну або кілька точок, інтерпольованих вздовж лінії з дробовим інтервалом. Перший аргумент повинен бути LINESTRING. Другий аргумент — це float8 від 0 до 1, що представляє відстань між точками як дріб довжини лінії. Якщо третій аргумент має значення false, буде побудовано не більше однієї точки (що еквівалентно ST_LineInterpolatePoint)
Якщо результат має нуль або один пункт, він повертається як POINT. Якщо він має два або більше пунктів, він повертається як MULTIPOINT.
Доступність: 2.5.0
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
This example returns points every 20 percent along a two-dimensional line.
SELECT ST_LineInterpolatePoints( 'LINESTRING(25 50,100 125,150 190)', 0.20);
MULTIPOINT((51.5974135047432 76.5974135047432),(78.1948270094864 103.194827009486),(104.132163186446 130.37181214238),(127.066081593223 160.18590607119),(150 190))
ST_LineLocatePoint — Повертає дробове значення відстані найближчої точки на лінії до заданої точки.
float8 ST_LineLocatePoint(geometry a_linestring, geometry a_point);
float8 ST_LineLocatePoint(geography a_linestring, geography a_point, boolean use_spheroid = true);
Повертає число з плаваючою комою в діапазоні від 0 до 1, що представляє розташування найближчої точки на LineString до заданої точки Point, як частку довжини 2d line.
Ви можете використовувати повернуте місце розташування для вилучення точки (ST_LineInterpolatePoint) або підрядка (ST_LineSubstring).
Це корисно для наближення кількості адрес
Доступність: 1.1.0
Змінено: 2.1.0. До версії 2.0.x це називалося ST_Line_Locate_Point.
This example approximates the street number of a house by locating the closest point on a street line. The subquery generates sample house and street data, and ST_DWithin excludes houses that are too far from the street.
SELECT 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 'LINESTRING(1 2,3 4)'::geometry 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
This example finds the closest point on a line to a point or other geometry.
SELECT ST_LineInterpolatePoint(
foo.the_line,
ST_LineLocatePoint(foo.the_line, 'POINT(4 3)'::geometry))
FROM (SELECT 'LINESTRING(1 2,4 5,6 7)'::geometry As the_line) As foo;POINT(3 4)
This example locates the closest segment and point on a LineString.
WITH data AS (
SELECT
'LINESTRING (0 0, 10 10, 20 20, 30 30)'::geometry AS line,
'POINT(15 15.1)'::geometry AS pt
),
segments AS (
SELECT
s.i,
d.pt,
ST_MakeLine(ST_PointN(d.line, s.i), ST_PointN(d.line, s.i + 1)) AS segment
FROM data AS d
CROSS JOIN LATERAL generate_series(1, ST_NumPoints(d.line) - 1) AS s(i)
)
SELECT
i AS segment_number,
round(ST_Distance(segment, pt)::numeric, 3) AS distance,
ST_ClosestPoint(segment, pt) AS closest_point
FROM segments
ORDER BY ST_Distance(segment, pt)
LIMIT 1;segment_number | distance | closest_point
----------------+----------+--------------------
2 | 0.071 | POINT(15.05 15.05)ST_LineSubstring — Повертає частину лінії між двома дробовими позиціями.
geometry ST_LineSubstring(geometry a_linestring, float8 startfraction, float8 endfraction);
geography ST_LineSubstring(geography a_linestring, float8 startfraction, float8 endfraction);
Computes the line which is the section of the input line starting and ending at the given fractional locations. The first argument must be a LINESTRING. The second and third arguments are values in the range [0, 1] representing the start and end locations. For geometry inputs, the fractions are measured in 2D line length. The Z and M values are interpolated for added endpoints if present.
Якщо startfraction та endfraction мають однакове значення, це еквівалентно ST_LineInterpolatePoint.
![]() | |
Це працює тільки з LINESTRING. Щоб використовувати на суміжних MULTILINESTRING, спочатку об'єднайте їх за допомогою ST_LineMerge. |
![]() | |
Починаючи з версії 1.1.1, ця функція інтерполює значення M і Z. У попередніх версіях Z і M встановлювалися на невизначені значення. |
Покращено: 3.4.0 - Додано підтримку географії.
Змінено: 2.1.0. До версії 2.0.x це називалося ST_Line_Substring.
Доступність: 1.1.0, підтримка Z і M додана в 1.1.1
This function supports 3d and will not drop the z-index.
Extract the middle third of a LineString, from 0.333 to 0.666.
SELECT 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_LineSubstring( 'LINESTRING(25 50,100 125,150 190)', 0.333, 0.333);
POINT(69.28469348539744 94.28469348539744)
Запит для розрізання LineString на секції довжиною 100 або менше. Він використовує generate_series() з CROSS JOIN LATERAL для створення еквівалента циклу FOR.
The final generated step is filtered out when the line length is an exact multiple of the requested section length.
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_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)
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)
Split a LineString by points by locating the points along the line, adding the 0 and 1 endpoints, and extracting substrings between adjacent locations.
WITH data AS (
SELECT 'LINESTRING(0 0, 10 0)'::geometry AS line,
'MULTIPOINT((2 0),(5 0),(8 0))'::geometry AS points
),
fractions AS (
SELECT 0.0 AS fraction
UNION ALL
SELECT 1.0
UNION ALL
SELECT ST_LineLocatePoint(line, (dp).geom)
FROM data
CROSS JOIN LATERAL ST_Dump(points) AS dp
),
ordered AS (
SELECT DISTINCT fraction
FROM fractions
),
segments AS (
SELECT fraction AS start_fraction,
lead(fraction) OVER (ORDER BY fraction) AS end_fraction
FROM ordered
)
SELECT row_number() OVER (ORDER BY start_fraction) AS segment_id,
ST_LineSubstring(line, start_fraction, end_fraction) AS geom
FROM data
CROSS JOIN segments
WHERE end_fraction IS NOT NULL
AND start_fraction <
> end_fraction
ORDER BY start_fraction;
segment_id | geom
------------+----------------------
1 | LINESTRING(0 0,2 0)
2 | LINESTRING(2 0,5 0)
3 | LINESTRING(5 0,8 0)
4 | LINESTRING(8 0,10 0)Заходи з реалізації географії вздовж сфероїда, геометрія вздовж лінії
SELECT ST_LineSubstring(
'LINESTRING(-118.2436 34.0522,-71.0570 42.3611)'::geography,
0.333,
0.666) AS geog_sub,
ST_LineSubstring(
'LINESTRING(-118.2436 34.0522,-71.0570 42.3611)'::geometry,
0.333,
0.666) AS geom_sub;For geometry inputs, the fractional locations are based on the 2D length of the line, even when the input has Z values. The resulting Z values are interpolated along the selected 2D location.
WITH data AS (
SELECT 'LINESTRING Z (0 0 0,0 2 5,0 10 10)'::geometry AS geom
)
SELECT ST_Length(geom) AS length_2d,
ST_3DLength(geom) AS length_3d,
ST_LineSubstring(geom, 0, 0.5) AS substring
FROM data;length_2d | length_3d | substring
-----------+------------------+-------------------------------------
10 | 14.819145939191106 | LINESTRING Z (0 0 0,0 2 5,0 5 6.875)ST_LocateAlong — Повертає точку (точки) на геометрії, яка відповідає значенню міри.
geometry ST_LocateAlong(geometry geom_with_measure, float8 measure, float8 offset = 0);
Повертає місцезнаходження вздовж виміряної геометрії, яке має задані значення вимірювання. Результатом є точка або багатоточка. Полігональні вхідні дані не підтримуються.
Якщо вказано offset, результат буде зміщений вліво або вправо від лінії введення на вказану відстань. Позитивне зміщення буде вліво, а негативне — вправо.
![]() | |
Використовуйте цю функцію тільки для лінійних геометрій з компонентом M |
Семантика визначається стандартом ISO/IEC 13249-3 SQL/MM Spatial.
Доступність: 1.1.0 під старою назвою ST_Locate_Along_Measure.
Змінено: 2.0.0 у попередніх версіях це називалося ST_Locate_Along_Measure.
This function supports M coordinates.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1.13
SELECT ST_LocateAlong( 'MULTILINESTRINGM((1 2 3, 3 4 2, 9 4 3),(1 2 3, 5 4 5))'::geometry, 3);
MULTIPOINT M ((1 2 3),(9 4 3),(1 2 3))
ST_LocateBetween — Повертає частини геометрії, які відповідають діапазону вимірювання.
geometry ST_LocateBetween(geometry geom, float8 measure_start, float8 measure_end, float8 offset = 0);
Повернути геометрію (колекцію) з частинами виміряної геометрії вхідних даних, які відповідають заданому діапазону вимірювання (включно).
Якщо вказано offset, результат буде зміщений вліво або вправо від вхідної лінії на вказану відстань. Позитивне зміщення буде вліво, а негативне — вправо.
Обрізка не опуклого полігону може призвести до некоректної геометрії.
Семантика визначається стандартом ISO/IEC 13249-3 SQL/MM Spatial.
Доступність: 1.1.0 під старою назвою ST_Locate_Between_Measures.
Змінено: 2.0.0 — у попередніх версіях ця функція називалася ST_Locate_Between_Measures.Змінено: 2.0.0 — у попередніх версіях ця функція називалася ST_Locate_Between_Measures.
Покращено: 3.0.0 - додано підтримку POLYGON, TIN, TRIANGLE.
This function supports M coordinates.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1
SELECT 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))
Extract the section between measures 2 and 8, offset to the left. Because the clipped line and the offset result share the same coordinate space, this example is intended for a single overlay panel rather than separate side-by-side figures.
SELECT ST_LocateBetween(
ST_AddMeasure(
'LINESTRING (20 180,50 20,100 120,180 20)',
0,
10),
2,
8,
20);MULTILINESTRING((54.49835 104.53427,58.700561 82.122481,82.111456 128.944272,84.248937 132.324934,87.01637 135.21267,90.303073 137.491987,93.977598 139.071724,97.892984 139.888702,101.892639 139.910247,105.816599 139.135495,109.507928 137.595434,112.818995 135.351657,115.617376 132.493901,145.310173 95.377905))
ST_LocateBetweenElevations — Повертає частини геометрії, що лежать у діапазоні висоти (Z).
geometry ST_LocateBetweenElevations(geometry geom, float8 elevation_start, float8 elevation_end);
Повертає геометрію (колекцію) з частинами геометрії, що лежать у діапазоні висоти (Z).
Обрізка не опуклого полігону може призвести до некоректної геометрії.
Доступність: 1.4.0
Покращено: 3.0.0 - додано підтримку POLYGON, TIN, TRIANGLE.
This function supports 3d and will not drop the z-index.
SELECT ST_LocateBetweenElevations( 'LINESTRING(1 2 3,4 5 6)'::geometry, 2, 4);
MULTILINESTRING Z ((1 2 3,2 3 4))
SELECT ST_LocateBetweenElevations( 'LINESTRING(1 2 6,4 5 -1,7 8 9)', 6, 9) As ewelev;
GEOMETRYCOLLECTION Z (POINT Z (1 2 6),LINESTRING Z (6.1 7.1 6,7 8 9))
ST_InterpolatePoint — Повертає інтерпольоване значення геометрії, найближчої до точки.
float8 ST_InterpolatePoint(geometry linear_geom_with_measure, geometry point);
Повертає інтерпольоване значення вимірювання лінійної геометрії в місці, найближчому до заданої точки.
![]() | |
Використовуйте цю функцію тільки для лінійних геометрій з компонентом M |
Доступність: 2.0.0
This function supports 3d and will not drop the z-index.
SELECT ST_InterpolatePoint( 'LINESTRING M (0 0 0,10 0 20)', 'POINT(5 5)');
10
ST_3DInterpolatePoint — Returns the interpolated measure of a geometry closest to a point in 3D.
float8 ST_3DInterpolatePoint(geometry linear_geom_with_measure, geometry point);
Returns the interpolated measure value of a linear ZM geometry at the location closest to the given point, using 3D (XYZ) distance for the projection. Use this function when the geometry has significant Z variation, such as flight trajectories, where ST_InterpolatePoint would give incorrect results by ignoring the Z dimension.
![]() | |
The line must have both Z and M dimensions. The point should have a Z dimension. |
Availability: 3.7.0
This function supports 3d and will not drop the z-index.
This example interpolates on a line rising diagonally in Z, using a point at the 3D midpoint.
SELECT ST_3DInterpolatePoint( 'LINESTRING ZM (0 0 0 0,10 0 10 20)', 'POINT Z (5 0 5)');
10
This example uses a vertical line with zero XY extent, where 3D projection works but 2D projection does not.
SELECT ST_3DInterpolatePoint( 'LINESTRING ZM (0 0 0 0,0 0 10 100)', 'POINT Z (5 5 5)');
50
ST_InterpolatePoint, ST_AddMeasure, ST_LocateAlong, ST_LocateBetween
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_AddMeasure( 'LINESTRING(1 0,2 0,4 0)', 1, 4) As ewelev;
LINESTRING M (1 0 1,2 0 2,4 0 4)
SELECT ST_AddMeasure( 'LINESTRING(1 0 4,2 0 4,4 0 4)', 10, 40) As ewelev;
LINESTRING ZM (1 0 4 10,2 0 4 20,4 0 4 40)
SELECT ST_AddMeasure( 'LINESTRINGM(1 0 4, 2 0 4, 4 0 4)', 10, 40) As ewelev;
LINESTRING M (1 0 10,2 0 20,4 0 40)
SELECT ST_AddMeasure( 'MULTILINESTRINGM((1 0 4, 2 0 4, 4 0 4),(1 0 4, 2 0 4, 4 0 4))', 10, 70) As ewelev;
MULTILINESTRING M ((1 0 10,2 0 20,4 0 40),(1 0 40,2 0 50,4 0 70))
Ці функції підтримують роботу з траєкторіями. Траєкторія — це лінійна геометрія зі зростаючими значеннями (значення M) на кожній координаті. Просторово-часові дані можна моделювати, використовуючи відносні часи (наприклад, епоху) як значення вимірювань.
ST_IsValidTrajectory — Перевіряє, чи є геометрія дійсною траєкторією.
boolean ST_IsValidTrajectory(geometry line);
Перевіряє, чи геометрія кодує дійсну траєкторію. Дійсна траєкторія представлена як LINESTRING з вимірами (значеннями M). Значення вимірів повинні збільшуватися від кожної вершини до наступної.
Очікуються дійсні траєкторії як вхідні дані для просторово-часових функцій, таких як ST_ClosestPointOfApproach
Доступність: 2.2.0
This function supports 3d and will not drop the z-index.
This example constructs a valid trajectory.
SELECT ST_IsValidTrajectory(ST_MakeLine(ST_MakePointM(0, 0, 1), ST_MakePointM(0, 1, 2)));
t
This example constructs 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) 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 timestamp '2015-05-26 10:00' AT TIME ZONE 'UTC'),
extract(epoch from timestamp '2015-05-26 11:00' AT TIME ZONE 'UTC')
) a,
ST_AddMeasure('LINESTRING Z (0 2 10,12 1 2)'::geometry,
extract(epoch from timestamp '2015-05-26 10:00' AT TIME ZONE 'UTC'),
extract(epoch from timestamp '2015-05-26 11:00' AT TIME ZONE 'UTC')
) b
), cpa AS (
SELECT ST_ClosestPointOfApproach(a, b) m FROM inp
), points AS (
SELECT ST_GeometryN(ST_LocateAlong(a, m), 1) pa,
ST_GeometryN(ST_LocateAlong(b, m), 1) pb
FROM inp, cpa
)
SELECT to_timestamp(m) AT TIME ZONE 'UTC' t,
ST_3DDistance(pa, pb) distance,
pa AS pa, pb AS pb
FROM points, cpa;-[ RECORD 1 ]----------------------------- t | 2015-05-26 10:45:31.034483 distance | 1.9652147377620688 pa | POINT ZM (7.59 0 3.79 1432637131.03) pb | POINT ZM (9.1 1.24 3.93 1432637131.03)
ST_IsValidTrajectory, ST_DistanceCPA, ST_LocateAlong, ST_AddMeasure
ST_DistanceCPA — Повертає відстань між найближчою точкою зближення двох траєкторій.
float8 ST_DistanceCPA(geometry track1, geometry track2);
Повертає відстань (у 2D) між двома траєкторіями в точці їх найближчого зближення.
Вхідні дані повинні бути дійсними траєкторіями, перевіреними за допомогою 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 timestamp '2015-05-26 10:00' AT TIME ZONE 'UTC'),
extract(epoch from timestamp '2015-05-26 11:00' AT TIME ZONE 'UTC')
) a,
ST_AddMeasure('LINESTRING Z (0 2 10,12 1 2)'::geometry,
extract(epoch from timestamp '2015-05-26 10:00' AT TIME ZONE 'UTC'),
extract(epoch from timestamp '2015-05-26 11:00' AT TIME ZONE 'UTC')
) b
)
SELECT ST_DistanceCPA(a, b) distance FROM inp;1.9652147377620688
ST_IsValidTrajectory, ST_ClosestPointOfApproach, ST_AddMeasure, |=|
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 timestamp '2015-05-26 10:00' AT TIME ZONE 'UTC'),
extract(epoch from timestamp '2015-05-26 11:00' AT TIME ZONE 'UTC')
) a,
ST_AddMeasure('LINESTRING Z (0 2 10,12 1 2)'::geometry,
extract(epoch from timestamp '2015-05-26 10:00' AT TIME ZONE 'UTC'),
extract(epoch from timestamp '2015-05-26 11:00' AT TIME ZONE 'UTC')
) b
)
SELECT ST_CPAWithin(a, b, 2), ST_DistanceCPA(a, b) distance FROM inp;st_cpawithin | distance --------------+------------------ t | 1.9652147377620688
ST_IsValidTrajectory, ST_ClosestPointOfApproach, ST_DistanceCPA, |=|
These functions report and upgrade PostGIS versions.
PostGIS_Extensions_Upgrade — Packages and upgrades PostGIS extensions (e.g. postgis_raster, postgis_topology, postgis_sfcgal) to given or latest version.
text PostGIS_Extensions_Upgrade(text target_version=null);
Packages and upgrades PostGIS extensions to given or latest version. Only extensions you have installed in the database will be packaged and upgraded if needed. Reports full PostGIS version and build configuration infos after. This is short-hand for doing multiple CREATE EXTENSION .. FROM unpackaged and ALTER EXTENSION .. UPDATE for each PostGIS extension. Currently only tries to upgrade extensions postgis, postgis_raster, postgis_sfcgal, and postgis_topology.
Доступність: 2.5.0
Changed: 3.4.0 to add target_version argument.
Changed: 3.3.0 support for upgrades from any PostGIS version. Does not work on all systems.
Changed: 3.0.0 to repackage loose extensions and support 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
PostGIS_Full_Version — Reports full PostGIS version and build configuration infos.
text PostGIS_Full_Version();
Reports full PostGIS version and build configuration infos. Also informs about synchronization between libraries and scripts suggesting upgrades as needed.
Enhanced: 3.4.0 now includes extra PROJ configurations NETWORK_ENABLED, URL_ENDPOINT and DATABASE_PATH of proj.db location
SELECT PostGIS_Full_Version();
POSTGIS="3.7.0dev 3.7.0alpha1-477-ga9004e778" [EXTENSION] PGSQL="180" GEOS="3.15.0beta1" SFCGAL="2.3.0" PROJ="9.8.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org DATABASE_PATH=/usr/share/proj/proj.db" GDAL="GDAL 3.13.1, released 2026/06/01" LIBXML="2.15.3"
PostGIS_GEOS_Version — Returns the version number of the GEOS library.
text PostGIS_GEOS_Version();
Returns the version number of the GEOS library, or NULL if GEOS support is not enabled.
SELECT PostGIS_GEOS_Version();
3.12.0dev-CAPI-1.18.0
PostGIS_GEOS_Compiled_Version — Returns the version number of the GEOS library against which PostGIS was built.
text PostGIS_GEOS_Compiled_Version();
Returns the version number of the GEOS library, or against which PostGIS was built.
Доступність: 3.4.0
SELECT PostGIS_GEOS_Compiled_Version();
3.12.0
PostGIS_Liblwgeom_Version — Returns the version number of the liblwgeom library. This should match the version of PostGIS.
text PostGIS_Liblwgeom_Version();
Returns the version number of the liblwgeom library/
SELECT PostGIS_Liblwgeom_Version();
3.4.0dev 3.3.0rc2-993-g61bdf43a7
PostGIS_LibXML_Version — Returns the version number of the libxml2 library.
text PostGIS_LibXML_Version();
Returns the version number of the LibXML2 library.
Доступність: 1.5
SELECT PostGIS_LibXML_Version();
2.9.10
PostGIS_LibJSON_Version — Returns the version number of the libjson-c library.
text PostGIS_LibJSON_Version();
Returns the version number of the LibJSON-C library.
SELECT PostGIS_LibJSON_Version();
0.17
PostGIS_Lib_Build_Date — Returns build date of the PostGIS library.
text PostGIS_Lib_Build_Date();
Returns build date of the PostGIS library.
SELECT PostGIS_Lib_Build_Date();
2023-06-22 03:56:11
PostGIS_Lib_Version — Returns the version number of the PostGIS library.
text PostGIS_Lib_Version();
Returns the version number of the PostGIS library.
SELECT PostGIS_Lib_Version();
3.4.0dev
PostGIS_PROJ_Version — Returns the version number of the PROJ4 library.
text PostGIS_PROJ_Version();
Returns the version number of the PROJ library and some configuration options of proj.
Enhanced: 3.4.0 now includes NETWORK_ENABLED, URL_ENDPOINT and DATABASE_PATH of proj.db location
SELECT PostGIS_PROJ_Version();
7.2.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/proj.db
PostGIS_PROJ_Compiled_Version — Returns the version number of the PROJ library against which PostGIS was built.
text PostGIS_PROJ_Compiled_Version();
Returns the version number of the PROJ library, or against which PostGIS was built.
Доступність: 3.5.0
SELECT PostGIS_PROJ_Compiled_Version();
9.1.1
PostGIS_Wagyu_Version — Returns the version number of the internal Wagyu library.
text PostGIS_Wagyu_Version();
Returns the version number of the internal Wagyu library, or NULL if Wagyu support is not enabled.
SELECT PostGIS_Wagyu_Version();
0.5.0 (Internal)
PostGIS_Scripts_Build_Date — Returns build date of the PostGIS scripts.
text PostGIS_Scripts_Build_Date();
Returns build date of the PostGIS scripts.
Доступність: 1.0.0RC1
SELECT PostGIS_Scripts_Build_Date();
2023-06-22 03:56:11
PostGIS_Scripts_Installed — Returns version of the PostGIS scripts installed in this database.
text PostGIS_Scripts_Installed();
Returns version of the PostGIS scripts installed in this database.
![]() | |
If the output of this function doesn't match the output of PostGIS_Scripts_Released you probably missed to properly upgrade an existing database. See the Upgrading section for more info. |
Availability: 0.9.0
SELECT PostGIS_Scripts_Installed();
3.4.0dev 3.3.0rc2-993-g61bdf43a7
PostGIS_Scripts_Released — Returns the version number of the postgis.sql script released with the installed PostGIS lib.
text PostGIS_Scripts_Released();
Returns the version number of the postgis.sql script released with the installed PostGIS lib.
![]() | |
Starting with version 1.1.0 this function returns the same value of PostGIS_Lib_Version. Kept for backward compatibility. |
Availability: 0.9.0
SELECT PostGIS_Scripts_Released();
3.4.0dev 3.3.0rc2-993-g61bdf43a7
PostGIS_Version — Returns PostGIS version number and compile-time options.
text PostGIS_Version();
Returns PostGIS version number and compile-time options.
SELECT PostGIS_Version();
3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
У цьому розділі перелічено власні великі уніфіковані змінні PostGIS (GUC). Їх можна налаштувати глобально, для бази даних, для сеансу або для транзакції. Найкраще налаштовувати на глобальному рівні або на рівні бази даних.
Більше прикладів використання див. SQL SET та SQL ALTER SYSTEM
postgis.gdal_datapath — Параметр конфігурації для призначення значення параметра GDAL_DATA GDAL. Якщо не встановлено, використовується змінна GDAL_DATA, встановлена в середовищі.
Змінна PostgreSQL GUC для встановлення значення опції GDAL_DATA GDAL. Значення postgis.gdal_datapath повинно бути повним фізичним шляхом до файлів даних GDAL.
Ця опція конфігурації найбільш корисна для платформ Windows, де шлях до файлів даних GDAL не є жорстко заданим. Цю опцію також слід встановити, якщо файли даних GDAL не знаходяться в очікуваному GDAL шляху.
![]() | |
Цей параметр можна встановити у файлі конфігурації PostgreSQL postgresql.conf. Його також можна встановити для окремого з'єднання або транзакції. |
Доступність: 2.2.0
![]() | |
Додаткова інформація про GDAL_DATA доступна в розділі "Параметри конфігурації" на сайті GDAL Опція конфігурації. |
Встановити та скинути postgis.gdal_datapath
SET postgis.gdal_datapath TO '/usr/local/share/gdal.hidden';
SET postgis.gdal_datapath TO default;
Налаштування Windows для певної бази даних
ALTER DATABASE gisdb SET postgis.gdal_datapath = 'C:/Program Files/PostgreSQL/9.3/gdal-data';
postgis.gdal_enabled_drivers — Параметр конфігурації для встановлення увімкнених драйверів GDAL у середовищі PostGIS. Впливає на змінну конфігурації GDAL GDAL_SKIP.
Параметр конфігурації для встановлення увімкнених драйверів GDAL у середовищі PostGIS. Впливає на змінну конфігурації GDAL GDAL_SKIP. Цей параметр можна встановити у файлі конфігурації PostgreSQL: postgresql.conf. Його також можна встановити для з'єднання або транзакції.
Початкове значення postgis.gdal_enabled_drivers також можна встановити, передавши змінну середовища POSTGIS_GDAL_ENABLED_DRIVERS зі списком увімкнених драйверів процесу, що запускає PostgreSQL.
Увімкнені драйвери GDAL можна вказати за короткою назвою або кодом драйвера. Короткі назви або коди драйверів можна знайти за посиланням GDAL Raster Formats. Можна вказати кілька драйверів, розділивши їх пробілом.
![]() | |
Для
Коли |
![]() | |
У стандартній установці PostGIS |
![]() | |
Додаткова інформація про GDAL_SKIP доступна в розділі "Параметри конфігурації" на сайті GDAL Опція конфігурації. |
Доступність: 2.2.0
Set and reset postgis.gdal_enabled_drivers for the current session.
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL';
SET postgis.gdal_enabled_drivers = default;
Set specific drivers for all new connections to a database.
ALTER DATABASE mygisdb SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG';
Set the default for the whole database cluster to enable all drivers. This requires superuser access. Also note that database, session, and user settings override this.
This example writes the setting to postgres.auto.conf.
ALTER SYSTEM SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
Reload the PostgreSQL configuration so the changed setting is applied.
SELECT pg_reload_conf();
postgis.enable_outdb_rasters — Булева опція конфігурації для увімкнення доступу до растрових смуг out-db.
Булева опція конфігурації для увімкнення доступу до растрових смуг out-db. Цю опцію можна встановити у файлі конфігурації PostgreSQL: postgresql.conf. Її також можна встановити для з'єднання або транзакції.
Початкове значення postgis.enable_outdb_rasters також можна встановити, передавши змінну середовища POSTGIS_ENABLE_OUTDB_RASTERS з значенням, відмінним від нуля, процесу, що запускає PostgreSQL.
![]() | |
Навіть якщо |
![]() | |
У стандартній установці PostGIS |
Доступність: 2.2.0
Set and reset postgis.enable_outdb_rasters for the current session.
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;
Set the default for all new connections to a database.
ALTER DATABASE gisdb SET postgis.enable_outdb_rasters = true;
Set the default for the whole database cluster. This requires superuser access. Also note that database, session, and user settings override this.
This example writes the setting to postgres.auto.conf.
ALTER SYSTEM SET postgis.enable_outdb_rasters = true;
Reload the PostgreSQL configuration so the changed setting is applied.
SELECT pg_reload_conf();
postgis.gdal_vsi_options — Конфігурація рядка для встановлення параметрів, що використовуються під час роботи з растровим файлом out-db.
Конфігурація рядка для встановлення опцій, що використовуються під час роботи з растровим файлом out-db. Опції конфігурації контролюють такі параметри, як обсяг простору, що GDAL виділяє для локального кешу даних, чи читати огляди та які ключі доступу використовувати для віддалених джерел даних out-db.
Доступність: 3.2.0
Встановити postgis.gdal_vsi_options для поточної сесії:
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy';
Встановіть postgis.gdal_vsi_options тільки для поточної транзакції за допомогою ключового слова LOCAL:
SET LOCAL postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy';
postgis.gdal_cpl_debug — Булева конфігурація для ввімкнення та вимкнення реєстрації повідомлень про налагодження GDAL.
За замовчуванням, журнали GDAL друкуються на stderr, а повідомлення нижчого рівня не друкуються взагалі. Встановлення цього GUC на true призведе до надсилання журналів GDAL до потоку журналів PostgreSQL, тож ви зможете бачити більше або менше з них, змінюючи client_min_message PostgreSQL GUC.
Доступність: 3.6.0
Ці функції є утилітами для усунення несправностей та відновлення геометричних даних. Вони потрібні лише у випадку, якщо геометричні дані якимось чином пошкоджені, що за звичайних обставин не повинно траплятися.
PostGIS_AddBBox — Додати обмежувальну рамку до геометрії.
geometry PostGIS_AddBBox(geometry geomA);
Додати обмежувальну рамку до геометрії. Це пришвидшить запити на основі обмежувальної рамки, але збільшить розмір геометрії.
![]() | |
Обмежувальні рамки автоматично додаються до геометрій, тому, як правило, це не потрібно, якщо тільки створена обмежувальна рамка якимось чином не пошкодилася або у вас стара версія, в якій відсутні обмежувальні рамки. Тоді вам потрібно видалити стару і додати нову. |
This method supports Circular Strings and Curves.
UPDATE sometable SET geom = PostGIS_AddBBox(geom) WHERE PostGIS_HasBBox(geom) = false;
PostGIS_DropBBox — Видалити кеш обмежувальної рамки з геометрії.
geometry PostGIS_DropBBox(geometry geomA);
Видалити кеш обмежувальної рамки з геометрії. Це зменшує розмір геометрії, але уповільнює запити на основі обмежувальної рамки. Також використовується для видалення пошкодженої обмежувальної рамки. Ознакою пошкодження кешованої обмежувальної рамки є те, що ST_Intersects та інші запити на відношення пропускають геометрії, які повинні повертати значення true.
![]() | |
Обмежувальні рамки автоматично додаються до геометрій і покращують швидкість запитів, тому, як правило, це не потрібно, якщо тільки створена обмежувальна рамка якимось чином не пошкодилася або у вас стара версія, в якій відсутні обмежувальні рамки. У такому випадку потрібно видалити старі та додати заново. Таке пошкодження спостерігалося в серіях 8.3-8.3.6, де кешовані bboxes не завжди перераховувалися при зміні геометрії, і оновлення до нової версії без перезавантаження дампа не виправляє вже пошкоджені рамки. Тому можна вручну виправити за допомогою наведеного нижче коду та додати bbox заново або виконати перезавантаження дампа. |
This method supports Circular Strings and Curves.
This example drops cached bounding boxes where the stored box is wrong. Applying Box2D to ST_AsBinary forces a fresh box calculation, while Box2D on the table geometry reads the cached box.
UPDATE sometable SET geom = PostGIS_DropBBox(geom) WHERE Not (Box2D(ST_AsBinary(geom)) = Box2D(geom));
UPDATE ...
After dropping corrupt cached boxes, re-add them where needed.
UPDATE sometable SET geom = PostGIS_AddBBox(geom) WHERE Not PostGIS_HasBBOX(geom);
UPDATE ...
PostGIS_HasBBox — Повертає TRUE, якщо bbox цієї геометрії кешована, і FALSE в іншому випадку.
boolean PostGIS_HasBBox(geometry geomA);
Повертає TRUE, якщо bbox цієї геометрії кешована, і FALSE в іншому випадку. Використовуйте PostGIS_AddBBoxта PostGIS_DropBBoxдля керування кешуванням.
This method supports Circular Strings and Curves.
SELECT geom FROM sometable WHERE PostGIS_HasBBox(geom) = false;
SFCGAL — це бібліотека-обгортка C++ навколо CGAL, яка надає розширені 2D- та 3D-просторові функції. Для надійності координати геометрії мають точне раціональне числове представлення.
Інструкції з інсталяції бібліотеки можна знайти на домашній сторінці SFCGAL http://www.sfcgal.org). Щоб увімкнути функції, скористайтеся командою create extension postgis_sfcgal.
У цьому розділі перелічено функції для визначення версії SFCGAL та залежностей бібліотек, які ви використовуєте.
postgis_sfcgal_version — Повертає версію SFCGAL, що використовується
текст postgis_sfcgal_version(void);
Повертає версію SFCGAL, що використовується
Доступність: 2.1.0
This method needs SFCGAL backend.
postgis_sfcgal_full_version — Повертає повну версію SFCGAL, що використовується, включаючи версії CGAL та Boost
текст postgis_sfcgal_full_version(void);
Повертає повну версію SFCGAL, що використовується, включаючи версії CGAL і Boost
Доступність: 3.3.0
This method needs SFCGAL backend.
Ці функції забезпечують доступ до властивостей геометрій або їх налаштування. Геометрії, які в першу чергу підтримуються цими функціями, — це TINS і поліедральні поверхні.
CG_ForceLHR — Примусова орієнтація LHR
geometry CG_ForceLHR(geometry geom);
Returns an equivalent geometry whose polygonal components follow the left-hand rule: exterior rings are counter-clockwise and interior rings are clockwise. Rings are reversed as needed; coordinates and dimensionality are preserved. The input must be valid.
Доступність: 3.5.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).
Reorient a polygon and its hole to the left-hand rule.
WITH data AS (
SELECT 'POLYGON((0 0,0 4,4 4,4 0,0 0),
(1 1,3 1,3 3,1 3,1 1))'::geometry AS geom
)
SELECT geom AS input_polygon,
CG_ForceLHR(geom) AS lhr_polygon,
ST_IsPolygonCCW(geom) AS input_is_lhr,
ST_IsPolygonCCW(CG_ForceLHR(geom)) AS output_is_lhr
FROM data;POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,3 1,3 3,1 3,1 1)) | POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1,1 3,3 3,3 1,1 1)) | f | t
CG_IsPlanar — Перевірте, чи є поверхня плоскою
boolean CG_IsPlanar(geometry geom);
Tests whether the input geometry lies in a single plane in 3D.
Доступність: 3.5.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).
CG_IsSolid — Перевірте, чи є геометрія об'ємною. Перевірка дійсності не виконується.
boolean CG_IsSolid(geometry geom1);
Returns true when the input carries the solid flag, such as a geometry produced by CG_MakeSolid. A closed PolyhedralSurface remains a surface until it is explicitly converted. This tests the representation, not shell closure or validity; no validity check is performed.
Доступність: 3.5.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).
Compare the same closed shell before and after converting it to a solid.
WITH data AS (
SELECT '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))
)'::geometry AS geom
)
SELECT CG_IsSolid(geom) AS shell_is_solid,
CG_IsSolid(CG_MakeSolid(geom)) AS solid_is_solid
FROM data;f | t
CG_MakeSolid — Перетворити геометрію в об'ємне тіло. Перевірка не виконується. Щоб отримати дійсне об'ємне тіло, вхідна геометрія повинна бути закритою поліедральною поверхнею або закритою TIN.
geometry CG_MakeSolid(geometry geom1);
Marks a PolyhedralSurface or TIN as a solid. The input is expected to describe a closed shell; the function sets the solid representation and does not validate the shell.
Доступність: 3.5.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).
CG_Orientation — Визначте орієнтацію поверхні
integer CG_Orientation(geometry geom);
Функція застосовується тільки до полігонів. Вона повертає -1, якщо полігон орієнтований проти годинникової стрілки, і 1, якщо полігон орієнтований за годинниковою стрілкою.
Доступність: 3.5.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
CG_Area — Обчислює площу геометрії
double precision CG_Area( geometry geom );
Обчислює площу геометричної фігури.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає значення подвійної точності, що представляє площу. |
Доступність: 3.5.0
This method needs SFCGAL backend.
SELECT CG_Area('Polygon ((0 0,0 5,5 5,5 0,0 0),(1 1,2 1,2 2,1 2,1 1),(3 3,4 3,4 4,3 4,3 3))');23
CG_3DArea — Обчислює площу 3D-поверхні. Для об'ємних тіл повертає значення 0.
floatCG_3DArea(geometry geom1);
Доступність: 3.5.0
This method needs SFCGAL backend.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 8.1, 10.5
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).
Примітка: За замовчуванням PolyhedralSurface, побудований на основі WKT, є геометрією поверхні, а не об'ємним тілом. Тому він має площу поверхні. Після перетворення на об'ємне тіло площа поверхні зникає.
SELECT CG_3DArea(geom) As cube_surface_area, CG_3DArea(CG_MakeSolid(geom)) As solid_surface_area FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)) )'::geometry) As f(geom);
cube_surface_area │ solid_surface_area ──────────────────┼──────────────────── 6 │ 0
CG_Volume — Computes the volume of a 3D geometry. Closed surfaces can have non-zero volume.
float CG_Volume(geometry geom1);
Доступність: 3.5.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).
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 9.1 (same as CG_3DVolume)
Closed surface geometries can have non-zero volume. Use CG_MakeSolid when the geometry value itself must carry the solid flag.
A closed polyhedral surface has volume. CG_MakeSolid makes the solid representation explicit.
SELECT CG_Volume(geom) As cube_surface_vol, CG_Volume(CG_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)) )'::geometry) As f(geom);
cube_surface_vol │ solid_surface_vol ─────────────────┼────────────────── 1 │ 1
CG_Intersection — Обчислює перетин двох геометрій
geometry CG_Intersection( geometry geomA , geometry geomB );
Обчислює перетин двох геометрій.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає геометрію, що представляє перетин. |
Доступність: 3.5.0
This method needs SFCGAL backend.
SELECT CG_Intersection('LINESTRING(0 0,5 5)', 'LINESTRING(5 0,0 5)');POINT(2.5 2.5)
CG_Intersects — Перевіряє, чи перетинаються дві геометрії (чи мають вони хоча б одну спільну точку)
boolean CG_Intersects( geometry geomA , geometry geomB );
Повертає true, якщо дві геометрії перетинаються. Геометрії перетинаються, якщо вони мають спільну точку.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число. |
Доступність: 3.5.0
This method needs SFCGAL backend.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT CG_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);f
SELECT CG_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);t
CG_3DIntersects, ST_3DIntersects, ST_Intersects, ST_Disjoint
CG_3DIntersects — Перевіряє, чи перетинаються дві 3D-геометрії
boolean CG_3DIntersects( geometry geomA , geometry geomB );
Перевіряє, чи перетинаються дві 3D-геометрії. 3D-геометрії перетинаються, якщо вони мають спільну точку в тривимірному просторі.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: це "допустима" версія, яка повертає логічне значення, а не ціле число. |
Доступність: 3.5.0
This method needs SFCGAL backend.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT CG_3DIntersects('POINT(1.2 0.1 0)', 'POLYHEDRALSURFACE(((0 0 0,0.5 0.5 0,1 0 0,1 1 0,0 1 0,0 0 0)),((1 0 0,2 0 0,2 1 0,1 1 0,1 0 0),(1.2 0.2 0,1.2 0.8 0,1.8 0.8 0,1.8 0.2 0,1.2 0.2 0)))');t
CG_Difference — Обчислює геометричну різницю між двома геометріями
geometry CG_Difference( geometry geomA , geometry geomB );
Обчислює геометричну різницю між двома геометріями. Результуюча геометрія є набором точок, які присутні в geomA, але відсутні в geomB.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає геометрію. |
Доступність: 3.5.0
This method needs SFCGAL backend.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT CG_Difference('POLYGON((0 0,0 1,1 1,1 0,0 0))'::geometry, 'LINESTRING(0 0,2 2)'::geometry);POLYGON((0 0,1 0,1 1,0 1,0 0))
CG_3DDifference — Виконати 3D-різницю
geometry CG_3DDifference(geometry geom1, geometry geom2);
Повертає ту частину geom1, яка не входить до geom2.
Доступність: 3.5.0
This method needs SFCGAL backend.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1
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).
Subtract a smaller tetrahedral solid and render the two inputs and the actual remaining solid separately.
WITH data AS (
SELECT CG_MakeSolid('POLYHEDRALSURFACE Z (
((0 0 0,0 4 0,4 0 0,0 0 0)),
((0 0 0,4 0 0,0 0 4,0 0 0)),
((0 0 0,0 0 4,0 4 0,0 0 0)),
((4 0 0,0 4 0,0 0 4,4 0 0))
)'::geometry) AS outer_solid
), solids AS (
SELECT outer_solid,
ST_Scale(outer_solid, 0.5, 0.5, 0.5) AS inner_solid
FROM data
)
SELECT outer_solid AS input_outer,
inner_solid AS input_inner,
CG_3DDifference(outer_solid, inner_solid) AS difference
FROM solids;POLYHEDRALSURFACE Z (((0 0 0,0 4 0,4 0 0,0 0 0)),((0 0 0,4 0 0,0 0 4,0 0 0)),((0 0 0,0 0 4,0 4 0,0 0 0)),((4 0 0,0 4 0,0 0 4,4 0 0))) | POLYHEDRALSURFACE Z (((0 0 0,0 2 0,2 0 0,0 0 0)),((0 0 0,2 0 0,0 0 2,0 0 0)),((0 0 0,0 0 2,0 2 0,0 0 0)),((2 0 0,0 2 0,0 0 2,2 0 0))) | POLYHEDRALSURFACE Z (((0 2 0,4 0 0,2 0 0,0 2 0)),((0 0 2,2 0 0,0 0 4,0 0 2)),((0 0 2,0 4 0,0 2 0,0 0 2)),((4 0 0,0 4 0,0 0 4,4 0 0)),((4 0 0,0 2 0,0 4 0,4 0 0)),((2 0 0,4 0 0,0 0 4,2 0 0)),((0 4 0,0 0 2,0 0 4,0 4 0)),((0 0 2,0 2 0,2 0 0,0 0 2)))
CG_Distance — Обчислює мінімальну відстань між двома геометріями
double precision CG_Distance( geometry geomA , geometry geomB );
Обчислює мінімальну відстань між двома геометріями.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає значення подвійної точності, що представляє відстань. |
Доступність: 3.5.0
This method needs SFCGAL backend.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT CG_Distance('LINESTRING(0.0 0.0,-1.0 -1.0)', 'LINESTRING(3.0 4.0,4.0 5.0)');5
CG_3DDistance — Обчислює мінімальну 3D відстань між двома геометріями
double precision CG_3DDistance( geometry geomA , geometry geomB );
Обчислює мінімальну 3D відстань між двома геометріями.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає значення подвійної точності, що представляє 3D-відстань. |
Доступність: 3.5.0
This method needs SFCGAL backend.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
SELECT CG_3DDistance('LINESTRING(-1.0 0.0 2.0,1.0 0.0 3.0)', 'TRIANGLE((-4.0 0.0 1.0,4.0 0.0 1.0,0.0 4.0 1.0,-4.0 0.0 1.0))');1
CG_3DConvexHull — Обчислює 3D опуклу оболонку геометрії.
geometry CG_3DConvexHull(geometry geom1);
Computes the smallest convex three-dimensional geometry that contains the input. Unlike ST_ConvexHull, this function uses Z coordinates when constructing the hull.
Доступність: 3.5.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).
Compute the 3D convex hull of a 3D LineString.
WITH data AS ( SELECT 'LINESTRING Z(0 0 5,1 5 3,5 7 6,9 5 3,5 7 5,6 3 5)'::geometry AS source_line ) SELECT CG_3DConvexHull(source_line) AS convex_hull FROM data;
POLYHEDRALSURFACE Z (((1 5 3,9 5 3,0 0 5,1 5 3)),((1 5 3,0 0 5,5 7 6,1 5 3)),((5 7 6,5 7 5,1 5 3,5 7 6)),((0 0 5,6 3 5,5 7 6,0 0 5)),((6 3 5,9 5 3,5 7 6,6 3 5)),((0 0 5,9 5 3,6 3 5,0 0 5)),((9 5 3,5 7 5,5 7 6,9 5 3)),((1 5 3,5 7 5,9 5 3,1 5 3)))
Compare the extruded source geometry with its 3D convex hull.
WITH footprints(label, geom, height) AS (VALUES
('C', 'POLYGON((0 0,0 8,5 8,5 6,2 6,2 2,5 2,5 0,0 0))'::geometry, 3),
('H', 'POLYGON((7 0,9 0,9 3,12 3,12 0,14 0,14 8,12 8,12 5,9 5,9 8,7 8,7 0))'::geometry, 7)
), parts AS (
SELECT label, CG_Extrude(geom, 0, 0, height) AS geom
FROM footprints
), shapes AS (
SELECT ST_Collect(geom ORDER BY label) AS source_geometry
FROM parts
)
SELECT
source_geometry AS input_source_geometry,
CG_3DConvexHull(source_geometry) AS convex_hull
FROM shapes;CG_3DIntersection — Виконати 3D перетин
geometry CG_3DIntersection(geometry geom1, geometry geom2);
Повернути геометрію, яка є спільною частиною між geom1 і geom2.
Доступність: 3.5.0
This method needs SFCGAL backend.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1
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 linestrings and polygons can intersect in a 3D segment.
WITH data AS (
SELECT 'LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)'::geometry AS input_linestring,
'POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8))'::geometry AS input_polygon
)
SELECT input_linestring AS input_linestring,
input_polygon AS input_polygon,
CG_3DIntersection(input_linestring, input_polygon) AS intersection
FROM data;LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10) | POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8)) | LINESTRING Z (1 1 8,0.5 0.5 8)
Intersect a cube shell with a vertical polygon.
WITH data AS (
SELECT '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))
)'::geometry AS input_cube,
'POLYGON Z ((0 0 0,0 0 0.5,0 0.5 0.5,0 0.5 0,0 0 0))'::geometry AS input_polygon
)
SELECT input_cube AS input_cube,
input_polygon AS input_polygon,
CG_3DIntersection(input_cube, input_polygon) AS intersection
FROM data;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)) | TIN Z (((0 0 0,0 0 0.5,0 0.5 0.5,0 0 0)),((0 0.5 0,0 0 0,0 0.5 0.5,0 0.5 0)))
A smaller solid contained by a larger solid remains volumetric after intersection.
WITH data AS (
SELECT CG_MakeSolid('POLYHEDRALSURFACE Z (
((0 0 0,0 4 0,4 0 0,0 0 0)),
((0 0 0,4 0 0,0 0 4,0 0 0)),
((0 0 0,0 0 4,0 4 0,0 0 0)),
((4 0 0,0 4 0,0 0 4,4 0 0))
)'::geometry) AS outer_solid
), solids AS (
SELECT outer_solid,
ST_Scale(outer_solid, 0.5, 0.5, 0.5) AS inner_solid
FROM data
)
SELECT outer_solid AS input_outer,
inner_solid AS input_inner,
CG_3DIntersection(outer_solid, inner_solid) AS intersection
FROM solids;POLYHEDRALSURFACE Z (((0 0 0,0 4 0,4 0 0,0 0 0)),((0 0 0,4 0 0,0 0 4,0 0 0)),((0 0 0,0 0 4,0 4 0,0 0 0)),((4 0 0,0 4 0,0 0 4,4 0 0))) | POLYHEDRALSURFACE Z (((0 0 0,0 2 0,2 0 0,0 0 0)),((0 0 0,2 0 0,0 0 2,0 0 0)),((0 0 0,0 0 2,0 2 0,0 0 0)),((2 0 0,0 2 0,0 0 2,2 0 0))) | POLYHEDRALSURFACE Z (((0 0 0,0 2 0,2 0 0,0 0 0)),((0 0 0,0 0 2,0 2 0,0 0 0)),((2 0 0,0 0 2,0 0 0,2 0 0)),((2 0 0,0 2 0,0 0 2,2 0 0)))
CG_Union — Обчислює об'єднання двох геометрій
geometry CG_Union( geometry geomA , geometry geomB );
Обчислює об'єднання двох геометрій.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає геометрію, що представляє об'єднання. |
Доступність: 3.5.0
This method needs SFCGAL backend.
SELECT CG_Union('POINT(.5 0)', 'LINESTRING(-1 0,1 0)');LINESTRING(-1 0,0.5 0,1 0)
CG_3DUnion — Виконайте об'єднання 3D за допомогою postgis_sfcgal.
geometry CG_3DUnion(geometry geom1, geometry geom2);
geometry CG_3DUnion(geometry set g1field);
Доступність: 3.5.0
This method needs SFCGAL backend.
This method implements the SQL/MM specification. SQL-MM IEC 13249-3: 5.1
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 об'єднанням набору рядків геометрій. Функція CG_3DUnion() є "агрегатною" функцією в термінології PostgreSQL. Це означає, що вона оперує рядками даних так само, як функції SUM() і AVG(), і, як і більшість агрегатів, ігнорує геометрії NULL.
Union two overlapping tetrahedral solids.
WITH solids AS (
SELECT CG_MakeSolid('POLYHEDRALSURFACE Z (
((0 0 0,4 0 0,0 4 0,0 0 0)),
((0 0 0,0 0 4,4 0 0,0 0 0)),
((0 0 0,0 4 0,0 0 4,0 0 0)),
((4 0 0,0 0 4,0 4 0,4 0 0)))'::geometry) AS geom1,
CG_MakeSolid('POLYHEDRALSURFACE Z (
((2 0 0,6 0 0,2 4 0,2 0 0)),
((2 0 0,2 0 4,6 0 0,2 0 0)),
((2 0 0,2 4 0,2 0 4,2 0 0)),
((6 0 0,2 0 4,2 4 0,6 0 0)))'::geometry) AS geom2
)
SELECT CG_3DUnion(geom1, geom2) AS union_result
FROM solids;POLYHEDRALSURFACE Z (((2 0 0,0 0 0,2 2 0,2 0 0)),((2 0 2,0 0 0,2 0 0,2 0 2)),((0 0 4,0 4 0,0 0 0,0 0 4)),((2 0 2,0 4 0,0 0 4,2 0 2)),((0 4 0,2 2 0,0 0 0,0 4 0)),((2 2 0,0 4 0,2 0 2,2 2 0)),((0 0 0,2 0 2,0 0 4,0 0 0)),((4 0 0,2 0 0,2 2 0,4 0 0)),((4 0 0,2 0 2,2 0 0,4 0 0)),((4 0 0,2 2 0,6 0 0,4 0 0)),((2 0 2,4 0 0,2 0 4,2 0 2)),((2 0 2,2 4 0,2 2 0,2 0 2)),((2 4 0,2 0 4,6 0 0,2 4 0)),((2 2 0,2 4 0,6 0 0,2 2 0)),((2 4 0,2 0 2,2 0 4,2 4 0)),((4 0 0,6 0 0,2 0 4,4 0 0)))
CG_AlphaShape — Обчислює альфа-форму, що охоплює геометрію
geometry CG_AlphaShape(geometry geom, float alpha, boolean allow_holes = false);
Обчислює альфа-форму точок у геометрії. Альфа-форма — це (зазвичай) увігнута багатокутна геометрія, яка містить усі вершини вхідних даних і вершини якої є підмножиною вершин вхідних даних. Альфа-форма забезпечує більш точне наближення до форми вхідних даних, ніж форма, створена опуклою оболонкою.
"Тіснота прилягання" контролюється параметром alpha, який може мати значення від 0 до нескінченності. Менші значення альфа дають більш увігнуті результати. Значення альфа, більші за певне значення, що залежить від даних, дають опуклу оболонку вхідних даних.
![]() | |
Після впровадження CGAL значення альфа є квадратом радіуса диска, що використовується в алгоритмі Alpha-Shape для "ерозії" триангуляції Делоне вхідних точок. Докладнішу інформацію див. у CGAL Alpha-Shapes. Це відрізняється від оригінального визначення альфа-форм, яке визначає альфа як радіус ерозійного диска. |
Обчислена форма не містить отворів, якщо опціональний аргумент allow_holes не вказаний як true.
Ця функція ефективно обчислює увігнуту оболонку геометрії подібно до ST_ConcaveHull, але використовує CGAL та інший алгоритм.
Доступність: 3.5.0 — вимагає SFCGAL >= 1.4.1.
This method needs SFCGAL backend.
The original point cloud and the alpha-shape share one comparison frame.
WITH data AS (
SELECT '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 AS input_points
)
SELECT input_points AS input_points,
CG_AlphaShape(input_points, 80.2) AS alpha_shape
FROM data;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)) | MULTIPOLYGON(((89 53,88 58,85 71,83 72,75 84,76 88,72 95,64 97,57 97,52 98,49 95,45 90,39 88,34 86,26 85,24 82,27 77,24 67,23 60,27 54,26 44,23 36,28 33,30 22,37 23,43 19,53 18,65 16,73 16,78 16,84 19,88 29,90 30,87 42,91 50,89 53)))
The same point cloud can produce a shape with a hole when holes are allowed.
WITH data AS (
SELECT '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 AS input_points
)
SELECT input_points AS input_points,
CG_AlphaShape(input_points, 100.1, true) AS alpha_shape
FROM data;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)) | MULTIPOLYGON(((89 53,88 58,85 71,83 72,75 84,76 88,72 95,64 97,57 97,52 98,49 95,45 90,39 88,34 86,26 85,24 82,27 77,24 67,23 60,27 54,26 44,23 36,28 33,30 22,43 19,53 18,65 16,73 16,78 16,84 19,90 30,87 42,91 50,89 53),(36 68,40 75,43 80,60 81,68 73,77 67,81 60,82 54,81 47,78 43,76 27,62 22,54 32,44 42,38 46,36 61,36 68)))
The second documented point cloud also produces a holed alpha-shape.
WITH data AS (
SELECT '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 AS input_points
)
SELECT input_points AS input_points,
CG_AlphaShape(input_points, 102.2, true) AS alpha_shape
FROM data;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)) | MULTIPOLYGON(((168 36,163 51,157 69,150 84,143 100,139 113,132 131,126 149,119 164,112 180,101 180,88 180,81 164,74 149,68 133,63 118,57 100,50 84,43 69,39 55,35 45,32 36,26 20,37 20,46 20,52 36,57 49,63 64,81 64,90 69,99 64,114 64,132 64,139 49,143 36,150 20,163 20,174 20,168 36),(81 109,88 124,92 138,103 138,110 122,114 109,121 96,112 82,99 82,83 82,74 93,81 109)))
CG_ApproxConvexPartition — Обчислює наближене опукле розбиття геометрії багатокутника
geometry CG_ApproxConvexPartition(geometry geom);
Обчислює наближене опукле розбиття геометрії полігону (за допомогою триангуляції).
![]() | |
Розбиття багатокутника P — це набір полігонів, внутрішні частини яких не перетинаються, а об'єднання полігонів дорівнює внутрішній частині вихідного полігону P. Функції CG_ApproxConvexPartition і CG_GreeneApproxConvexPartition створюють приблизно оптимальні опуклі розбиття. Обидві ці функції створюють опуклі розбиття, спочатку розбиваючи полігон на простіші полігони. CG_ApproxConvexPartition використовує триангуляцію, а CG_GreeneApproxConvexPartition — монотонний поділ. Обидві ці функції гарантують, що вони створюють не більше ніж в чотири рази більше опуклих частин, ніж оптимальна кількість, але вони відрізняються за складністю виконання. Хоча алгоритм наближення на основі триангуляції часто дає менше опуклих частин, це не завжди так. |
Доступність: 3.5.0 — вимагає SFCGAL >= 1.5.0.
Вимагає SFCGAL >= 1.5.0
This method needs SFCGAL backend.
Approximate convex partition of the same polygon used by the other partition examples.
WITH data AS (
SELECT 'POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_ApproxConvexPartition(input_polygon) AS partition
FROM data;POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150)) | GEOMETRYCOLLECTION(POLYGON((156 150,83 181,89 131,148 120,156 150)), POLYGON((32 159,0 45,41 86,32 159)), POLYGON((107 61,32 159,41 86,107 61)), POLYGON((45 1,177 2,67 24,45 1)), POLYGON((41 86,45 1,67 24,41 86)), POLYGON((107 61,41 86,67 24,109 31,107 61)), POLYGON((148 120,107 61,109 31,170 60,148 120)), POLYGON((156 150,148 120,170 60,180 110,156 150)))
CG_ApproximateMedialAxis — Обчисліть приблизну медіальну вісь плоскої геометрії.
geometry CG_ApproximateMedialAxis(geometry geom);
geometry CG_ApproximateMedialAxis(geometry geom, boolean projected);
Повертає приблизну медіальну вісь для введеної площі на основі її прямого скелета. Використовує специфічний API SFCGAL, якщо побудований на основі сумісної версії (1.2.0+). В іншому випадку функція є лише обгорткою навколо CG_StraightSkeleton (повільніший варіант).
When projected is true, free endpoints of the medial axis are extended to reach the polygon boundary (projected medial axis). Requires SFCGAL 2.3.0+. When built against an older SFCGAL version, a notice is emitted and the non-projected result is returned instead.
Доступність: 3.5.0
Availability: 3.7.0 - projected parameter. Requires SFCGAL >= 2.3.0 for projected result; falls back to non-projected with a notice on older versions.
![]() | |
Ця функція ігнорує вимір Z. Вона завжди дає двовимірний результат, навіть якщо використовується для тривимірної геометрії. |
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).
A polygon and its approximate medial axis.
WITH data AS (
SELECT 'POLYGON((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190))'::geometry AS polygon
)
SELECT polygon AS input_polygon,
CG_ApproximateMedialAxis(polygon) AS medial_axis
FROM data;POLYGON((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190)) | MULTILINESTRING((184.189 15.811,158.377 20),(50 20,158.377 20),(50 20,35 35),(35 153.151,35 35),(35 153.151,40.697 159.303),(164.04 164.04,40.697 159.303))
This example computes the projected medial axis with free endpoints extended to the polygon boundary.
SELECT CG_ApproximateMedialAxis('POLYGON((0 0,2 0,2 1,0 1,0 0))', true);MULTILINESTRING((0 0.5,0.5 0.5,1.5 0.5,2 0.5))
CG_GenerateFlatRoof — Generate a flat (box) roof from a footprint polygon.
geometry CG_GenerateFlatRoof(geometry geom, float8 height);
Generate a flat (box-shaped) roof as a 3D PolyhedralSurface Z from a 2D footprint polygon. The roof height above the ground plane is given by height (default 3.0).
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
Generate a flat roof two units above a rectangular footprint.
WITH data AS ( SELECT 'POLYGON((0 0,5 0,5 4,0 4,0 0))'::geometry AS footprint ) SELECT CG_GenerateFlatRoof(footprint, 2.0) AS roof FROM data;
POLYHEDRALSURFACE Z (((0 0 0,0 4 0,5 4 0,5 0 0,0 0 0)),((0 0 2,5 0 2,5 4 2,0 4 2,0 0 2)),((0 0 0,0 0 2,0 4 2,0 4 0,0 0 0)),((0 4 0,0 4 2,5 4 2,5 4 0,0 4 0)),((5 4 0,5 4 2,5 0 2,5 0 0,5 4 0)),((5 0 0,5 0 2,0 0 2,0 0 0,5 0 0)))
CG_GenerateHippedRoof — Generate a hipped roof from a footprint polygon.
geometry CG_GenerateHippedRoof(geometry geom, float8 height);
Generate a hipped roof as a 3D PolyhedralSurface Z from a 2D footprint polygon. All sides slope upward to meet at a ridge or apex. The roof height is given by height (default 3.0).
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
The footprint and hipped roof are shown side-by-side so the generated 3D faces do not hide behind the input footprint.
WITH data AS (
SELECT 'POLYGON((0 0,5 0,5 4,0 4,0 0))'::geometry AS input_footprint
)
SELECT input_footprint AS input_footprint,
CG_GenerateHippedRoof(input_footprint, 2.0) AS hipped_roof
FROM data;POLYGON((0 0,5 0,5 4,0 4,0 0)) | POLYHEDRALSURFACE Z (((0 4 0,5 4 0,5 0 0,0 0 0,0 4 0)),((0 4 0,0 0 0,2 2 2,0 4 0)),((0 0 0,5 0 0,3 2 2,2 2 2,0 0 0)),((5 0 0,5 4 0,3 2 2,5 0 0)),((5 4 0,0 4 0,2 2 2,3 2 2,5 4 0)))
CG_GenerateGableRoof — Generate a gable roof from a footprint polygon.
geometry CG_GenerateGableRoof(geometry geom, float8 height, float8 slope_angle);
Generate a gable roof as a 3D PolyhedralSurface Z from a 2D footprint polygon. Two opposite sides are vertical gable ends; the other two sides slope to a horizontal ridge. height sets the ridge height above the ground (default 3.0) and slope_angle controls the pitch in degrees (default 30.0). The SRID of the input geometry is preserved.
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
Generate a gable roof using a height of 2 and a 30 degree slope.
WITH data AS ( SELECT 'POLYGON((0 0,5 0,5 4,0 4,0 0))'::geometry AS footprint ) SELECT CG_GenerateGableRoof(footprint, 2.0, 30.0) AS roof FROM data;
POLYHEDRALSURFACE Z (((5 4 0,5 0 0,0 0 0,0 4 0,5 4 0)),((0 4 0,0 0 0,0 2 1.155,0 4 0)),((0 0 0,5 0 0,5 2 1.155,0 2 1.155,0 0 0)),((5 0 0,5 4 0,5 2 1.155,5 0 0)),((5 4 0,0 4 0,0 2 1.155,5 2 1.155,5 4 0)))
CG_GenerateSkillionRoof — Generate a skillion (single-slope) roof from a footprint polygon.
geometry CG_GenerateSkillionRoof(geometry geom, float8 height, float8 slope_angle, integer primary_edge_index);
Generate a skillion (single-slope, shed-style) roof as a 3D PolyhedralSurface Z from a 2D footprint polygon. The entire roof surface slopes in one direction. height sets the maximum ridge height (default 3.0), slope_angle sets the pitch in degrees (default 30.0), and primary_edge_index selects which polygon edge defines the high side (0-based, default 0).
When the combination of height and slope_angle would cause a side wall to vanish (the slope reaches the far edge before the full height is achieved), that face is omitted from the result. This means the number of output patches can vary depending on the parameters — a lower height relative to the footprint depth produces more faces than a taller, steeper configuration.
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
Height 2.0 produces 6 faces (all walls present); height 4.0 produces 5 faces (one side wall is filtered out because the slope reaches the far edge before the full height).
SELECT
ST_NumPatches(CG_GenerateSkillionRoof(
'POLYGON((0 0,5 0,5 4,0 4,0 0))', 2.0)) AS "height 2",
ST_NumPatches(CG_GenerateSkillionRoof(
'POLYGON((0 0,5 0,5 4,0 4,0 0))', 4.0)) AS "height 4";6 | 5
The height 2.0 result is shown with its footprint.
WITH data AS ( SELECT 'POLYGON((0 0,5 0,5 4,0 4,0 0))'::geometry AS footprint ) SELECT CG_GenerateSkillionRoof(footprint, 2.0) AS roof FROM data;
POLYHEDRALSURFACE Z (((0 4 0,5 4 0,5 0 0,0 0 0,0 4 0)),((5 0 2,5 4 2,3.464 4 2,3.464 0 2,5 0 2)),((0 4 0,0 0 0,3.464 0 2,3.464 4 2,0 4 0)),((0 0 0,5 0 0,5 0 2,3.464 0 2,0 0 0)),((5 0 0,5 4 0,5 4 2,5 0 2,5 0 0)),((5 4 0,0 4 0,3.464 4 2,5 4 2,5 4 0)))
CG_GenerateRoof — Generate a roof of the requested type from a footprint polygon.
geometry CG_GenerateRoof(geometry geom, text roof_type, float8 height, float8 slope_angle, integer primary_edge_index);
Generate a roof as a 3D PolyhedralSurface Z from a 2D footprint polygon. The roof_type parameter selects the roof style (default 'HIPPED'):
FLAT — flat box roof.
HIPPED — hipped roof (all sides slope to apex).
GABLE — gable roof (two sloping sides, two vertical ends).
SKILLION — single-slope (shed) roof.
height sets the roof height (default 3.0), slope_angle sets the pitch in degrees (default 30.0), and primary_edge_index selects the reference edge for skillion roofs (default 0).
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
The generic dispatcher returns the same 3D roofs as the specialized helpers for the same footprint.
WITH data AS (
SELECT 'POLYGON((0 0,4 0,4 4,0 4,0 0))'::geometry AS input_footprint
)
SELECT input_footprint AS input_footprint,
CG_GenerateRoof(input_footprint, 'HIPPED', 2.0, 30.0, 0) AS hipped_roof,
CG_GenerateRoof(input_footprint, 'FLAT', 2.0, 30.0, 0) AS flat_roof
FROM data;POLYGON((0 0,4 0,4 4,0 4,0 0)) | POLYHEDRALSURFACE Z (((0 4 0,4 4 0,4 0 0,0 0 0,0 4 0)),((0 4 0,0 0 0,2 2 2,0 4 0)),((0 0 0,4 0 0,2 2 2,0 0 0)),((4 0 0,4 4 0,2 2 2,4 0 0)),((4 4 0,0 4 0,2 2 2,4 4 0))) | POLYHEDRALSURFACE Z (((0 0 0,0 4 0,4 4 0,4 0 0,0 0 0)),((0 0 2,4 0 2,4 4 2,0 4 2,0 0 2)),((0 0 0,0 0 2,0 4 2,0 4 0,0 0 0)),((0 4 0,0 4 2,4 4 2,4 4 0,0 4 0)),((4 4 0,4 4 2,4 0 2,4 0 0,4 4 0)),((4 0 0,4 0 2,0 0 2,0 0 0,4 0 0)))
CG_PolygonRepair — Repair an invalid polygon or multipolygon.
geometry CG_PolygonRepair(geometry geom, text rule);
Repair an invalid polygon or multipolygon using CGAL's 2D Polygon Repair algorithm. Returns a MultiPolygon.
The rule parameter controls the repair strategy:
EVEN_ODD (default) — areas covered an odd number of times are kept. Available with CGAL 6.0+.
NON_ZERO — areas with non-zero winding number are kept. Requires CGAL 6.1+.
UNION — union of all input polygons. Requires CGAL 6.1+.
INTERSECTION — intersection of all input polygons. Requires CGAL 6.1+.
Availability: 3.7.0 - requires SFCGAL >= 2.3.0 and CGAL >= 6.0.
This method needs SFCGAL backend.
This function supports Polyhedral surfaces.
Repair a self-intersecting bowtie polygon with the default EVEN_ODD rule.
WITH data AS (
SELECT 'POLYGON((0 0,2 2,2 0,0 2,0 0))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_PolygonRepair(input_polygon) AS repaired_polygon
FROM data;POLYGON((0 0,2 2,2 0,0 2,0 0)) | MULTIPOLYGON(((0 0,1 1,0 2,0 0)),((1 1,2 0,2 2,1 1)))
With the UNION rule, all winding area is kept. This rule requires CGAL 6.1 or later.
WITH data AS (
SELECT 'POLYGON((0 0,2 2,2 0,0 2,0 0))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_PolygonRepair(input_polygon, 'UNION') AS repaired_polygon
FROM data;POLYGON((0 0,2 2,2 0,0 2,0 0)) | MULTIPOLYGON(((0 0,1 1,0 2,0 0)))
CG_ConstrainedDelaunayTriangles — Повернути обмежену триангуляцію Делоне навколо заданої вхідної геометрії.
geometry CG_ConstrainedDelaunayTriangles(geometry g1);
Повертає обмежену триангуляцію Делоне навколо вершин вхідної геометрії. Вихідними даними є TIN.
This method needs SFCGAL backend.
Доступність: 3.0.0
This function supports 3d and will not drop the z-index.
Constrained Delaunay triangulation of the polygon and buffered point.
SELECT
CG_ConstrainedDelaunayTriangles(
ST_Union(
'POLYGON((175 150,20 40,50 60,125 100,175 150))'::geometry,
ST_Buffer('POINT(110 170)'::geometry, 20)
)
);TIN(((50 60,175 150,20 40,50 60)),((125 100,50 60,20 40,125 100)),((50 60,125 100,175 150,50 60)),((130 170,129.6 166.1,175 150,130 170)),((128.5 162.3,175 150,129.6 166.1,128.5 162.3)),((130 170,124.1 155.9,129.6 166.1,130 170)),((126.6 158.9,175 150,128.5 162.3,126.6 158.9)),((129.6 166.1,126.6 158.9,128.5 162.3,129.6 166.1)),((124.1 155.9,175 150,126.6 158.9,124.1 155.9)),((129.6 166.1,124.1 155.9,126.6 158.9,129.6 166.1)),((121.1 153.4,175 150,124.1 155.9,121.1 153.4)),((110 150,121.1 153.4,124.1 155.9,110 150)),((117.7 151.5,175 150,121.1 153.4,117.7 151.5)),((113.9 150.4,117.7 151.5,121.1 153.4,113.9 150.4)),((113.9 150.4,175 150,117.7 151.5,113.9 150.4)),((20 40,113.9 150.4,110 150,20 40)),((20 40,175 150,113.9 150.4,20 40)),((20 40,110 150,106.1 150.4,20 40)),((113.9 150.4,121.1 153.4,110 150,113.9 150.4)),((20 40,106.1 150.4,102.3 151.5,20 40)),((110 150,124.1 155.9,128.5 177.7,110 150)),((20 40,102.3 151.5,98.9 153.4,20 40)),((106.1 150.4,110 150,98.9 153.4,106.1 150.4)),((20 40,98.9 153.4,95.9 155.9,20 40)),((102.3 151.5,106.1 150.4,98.9 153.4,102.3 151.5)),((20 40,95.9 155.9,93.4 158.9,20 40)),((98.9 153.4,110 150,95.9 155.9,98.9 153.4)),((20 40,93.4 158.9,91.5 162.3,20 40)),((95.9 155.9,110 150,102.3 188.5,95.9 155.9)),((20 40,91.5 162.3,90.4 166.1,20 40)),((93.4 158.9,95.9 155.9,91.5 162.3,93.4 158.9)),((20 40,90.4 166.1,90 170,20 40)),((91.5 162.3,95.9 155.9,90 170,91.5 162.3)),((20 40,90 170,90.4 173.9,20 40)),((90.4 166.1,91.5 162.3,90 170,90.4 166.1)),((20 40,90.4 173.9,91.5 177.7,20 40)),((90 170,95.9 155.9,102.3 188.5,90 170)),((90.4 173.9,90 170,91.5 177.7,90.4 173.9)),((91.5 177.7,90 170,102.3 188.5,91.5 177.7)),((93.4 181.1,91.5 177.7,95.9 184.1,93.4 181.1)),((95.9 184.1,91.5 177.7,102.3 188.5,95.9 184.1)),((98.9 186.6,95.9 184.1,102.3 188.5,98.9 186.6)),((102.3 188.5,110 150,128.5 177.7,102.3 188.5)),((106.1 189.6,102.3 188.5,110 190,106.1 189.6)),((110 190,102.3 188.5,117.7 188.5,110 190)),((113.9 189.6,110 190,117.7 188.5,113.9 189.6)),((117.7 188.5,102.3 188.5,128.5 177.7,117.7 188.5)),((121.1 186.6,124.1 184.1,175 150,121.1 186.6)),((121.1 186.6,117.7 188.5,124.1 184.1,121.1 186.6)),((124.1 184.1,126.6 181.1,175 150,124.1 184.1)),((124.1 184.1,117.7 188.5,128.5 177.7,124.1 184.1)),((126.6 181.1,128.5 177.7,175 150,126.6 181.1)),((126.6 181.1,124.1 184.1,128.5 177.7,126.6 181.1)),((128.5 177.7,129.6 173.9,175 150,128.5 177.7)),((128.5 177.7,124.1 155.9,130 170,128.5 177.7)),((129.6 173.9,130 170,175 150,129.6 173.9)),((129.6 173.9,128.5 177.7,130 170,129.6 173.9)))
ST_DelaunayTriangles applied to the same input. Triangle edges cross polygon boundaries.
SELECT
ST_DelaunayTriangles(
ST_Union(
'POLYGON((175 150,20 40,50 60,125 100,175 150))'::geometry,
ST_Buffer('POINT(110 170)'::geometry, 20)
)
);GEOMETRYCOLLECTION(POLYGON((95.9 184.1,93.4 181.1,95.9 155.9,95.9 184.1)), POLYGON((95.9 184.1,95.9 155.9,102.3 188.5,95.9 184.1)), POLYGON((95.9 184.1,102.3 188.5,98.9 186.6,95.9 184.1)), POLYGON((102.3 188.5,95.9 155.9,98.9 153.4,102.3 188.5)), POLYGON((102.3 188.5,98.9 153.4,102.3 151.5,102.3 188.5)), POLYGON((102.3 188.5,102.3 151.5,106.1 189.6,102.3 188.5)), POLYGON((106.1 189.6,102.3 151.5,106.1 150.4,106.1 189.6)), POLYGON((106.1 189.6,106.1 150.4,110 190,106.1 189.6)), POLYGON((110 190,106.1 150.4,110 150,110 190)), POLYGON((110 190,110 150,117.7 188.5,110 190)), POLYGON((110 190,117.7 188.5,113.9 189.6,110 190)), POLYGON((117.7 188.5,110 150,121.1 153.4,117.7 188.5)), POLYGON((117.7 188.5,121.1 153.4,121.1 186.6,117.7 188.5)), POLYGON((121.1 186.6,121.1 153.4,124.1 155.9,121.1 186.6)), POLYGON((121.1 186.6,124.1 155.9,124.1 184.1,121.1 186.6)), POLYGON((121.1 186.6,124.1 184.1,175 150,121.1 186.6)), POLYGON((175 150,124.1 184.1,126.6 181.1,175 150)), POLYGON((175 150,126.6 181.1,128.5 177.7,175 150)), POLYGON((175 150,128.5 177.7,129.6 173.9,175 150)), POLYGON((175 150,129.6 173.9,130 170,175 150)), POLYGON((175 150,130 170,129.6 166.1,175 150)), POLYGON((175 150,129.6 166.1,128.5 162.3,175 150)), POLYGON((175 150,128.5 162.3,126.6 158.9,175 150)), POLYGON((175 150,126.6 158.9,124.1 155.9,175 150)), POLYGON((175 150,124.1 155.9,125 100,175 150)), POLYGON((125 100,124.1 155.9,121.1 153.4,125 100)), POLYGON((125 100,121.1 153.4,117.7 151.5,125 100)), POLYGON((125 100,117.7 151.5,113.9 150.4,125 100)), POLYGON((125 100,113.9 150.4,110 150,125 100)), POLYGON((125 100,110 150,106.1 150.4,125 100)), POLYGON((125 100,106.1 150.4,102.3 151.5,125 100)), POLYGON((125 100,102.3 151.5,98.9 153.4,125 100)), POLYGON((125 100,98.9 153.4,50 60,125 100)), POLYGON((125 100,50 60,20 40,125 100)), POLYGON((20 40,50 60,90.4 166.1,20 40)), POLYGON((20 40,90.4 166.1,90 170,20 40)), POLYGON((20 40,90 170,90.4 173.9,20 40)), POLYGON((20 40,90.4 173.9,91.5 177.7,20 40)), POLYGON((91.5 177.7,90.4 173.9,90 170,91.5 177.7)), POLYGON((91.5 177.7,90 170,91.5 162.3,91.5 177.7)), POLYGON((91.5 177.7,91.5 162.3,93.4 158.9,91.5 177.7)), POLYGON((91.5 177.7,93.4 158.9,93.4 181.1,91.5 177.7)), POLYGON((93.4 181.1,93.4 158.9,95.9 155.9,93.4 181.1)), POLYGON((95.9 155.9,93.4 158.9,50 60,95.9 155.9)), POLYGON((95.9 155.9,50 60,98.9 153.4,95.9 155.9)), POLYGON((50 60,93.4 158.9,91.5 162.3,50 60)), POLYGON((50 60,91.5 162.3,90.4 166.1,50 60)), POLYGON((90.4 166.1,91.5 162.3,90 170,90.4 166.1)), POLYGON((110 150,113.9 150.4,121.1 153.4,110 150)), POLYGON((121.1 153.4,113.9 150.4,117.7 151.5,121.1 153.4)), POLYGON((124.1 155.9,126.6 158.9,129.6 166.1,124.1 155.9)), POLYGON((124.1 155.9,129.6 166.1,128.5 177.7,124.1 155.9)), POLYGON((124.1 155.9,128.5 177.7,124.1 184.1,124.1 155.9)), POLYGON((124.1 184.1,128.5 177.7,126.6 181.1,124.1 184.1)), POLYGON((128.5 177.7,129.6 166.1,130 170,128.5 177.7)), POLYGON((128.5 177.7,130 170,129.6 173.9,128.5 177.7)), POLYGON((129.6 166.1,126.6 158.9,128.5 162.3,129.6 166.1)))
CG_Extrude — Видавити поверхню до відповідного об'єму
geometry CG_Extrude(geometry geom, float x, float y, float z);
Extrudes the input along the vector (x, y, z) and connects it to its translated copy. Extrusion can raise the dimensionality of the result, for example from a surface to a volume.
Доступність: 3.5.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).
The figures use ST_Affine to project Z diagonally into XY after extrusion. The returned geometry from CG_Extrude remains a 3D PolyhedralSurface.
Extruding an octagonal Polygon 30 units along Z.
WITH data AS (
SELECT ST_Buffer('POINT(100 90)'::geometry, 50, 'quad_segs=2') AS geom
), projected AS (
SELECT ST_Force2D(ST_Affine(geom,
1, 0, 0.5, 0, 1, 0.5, 0, 0, 0, 0, 0, 0)) AS input_geom,
ST_Force2D(ST_Affine(CG_Extrude(geom, 0, 0, 30),
1, 0, 0.5, 0, 1, 0.5, 0, 0, 0, 0, 0, 0)) AS output_geom
FROM data
)
SELECT input_geom AS input_geometry,
output_geom AS extruded_projection
FROM projected;POLYGON((150 90,135.355 54.645,100 40,64.645 54.645,50 90,64.645 125.355,100 140,135.355 125.355,150 90)) | POLYHEDRALSURFACE(((150 90,135.355 54.645,100 40,64.645 54.645,50 90,64.645 125.355,100 140,135.355 125.355,150 90)),((165 105,150.355 140.355,115 155,79.645 140.355,65 105,79.645 69.645,115 55,150.355 69.645,165 105)),((150 90,165 105,150.355 69.645,135.355 54.645,150 90)),((135.355 54.645,150.355 69.645,115 55,100 40,135.355 54.645)),((100 40,115 55,79.645 69.645,64.645 54.645,100 40)),((64.645 54.645,79.645 69.645,65 105,50 90,64.645 54.645)),((50 90,65 105,79.645 140.355,64.645 125.355,50 90)),((64.645 125.355,79.645 140.355,115 155,100 140,64.645 125.355)),((100 140,115 155,150.355 140.355,135.355 125.355,100 140)),((135.355 125.355,150.355 140.355,165 105,150 90,135.355 125.355)))
Extruding a LineString 10 units along Z.
WITH data AS (
SELECT 'LINESTRING(50 50,100 90,95 150)'::geometry AS geom
), projected AS (
SELECT ST_Force2D(ST_Affine(geom,
1, 0, 0.5, 0, 1, 0.5, 0, 0, 0, 0, 0, 0)) AS input_geom,
ST_Force2D(ST_Affine(CG_Extrude(geom, 0, 0, 10),
1, 0, 0.5, 0, 1, 0.5, 0, 0, 0, 0, 0, 0)) AS output_geom
FROM data
)
SELECT input_geom AS input_geometry,
output_geom AS extruded_projection
FROM projected;LINESTRING(50 50,100 90,95 150) | POLYHEDRALSURFACE(((50 50,100 90,105 95,55 55,50 50)),((100 90,95 150,100 155,105 95,100 90)))
CG_ExtrudeStraightSkeleton — Пряма екструзія скелета
geometry CG_ExtrudeStraightSkeleton(geometry geom, float roof_height, float body_height = 0);
Обчислює екструзію з максимальною висотою геометрії багатокутника.
![]() | |
Perhaps the first (historically) use-case of straight skeletons: given a polygonal roof, the straight skeleton directly gives the layout of each tent. If each skeleton edge is lifted from the plane a height equal to its offset distance, the resulting roof is "correct" in that water will always fall down to the contour edges (the roof's border), regardless of where it falls on the roof. The function computes this extrusion aka "roof" on a polygon. If the argument body_height > 0, so the polygon is extruded like with CG_Extrude(polygon, 0, 0, body_height). The result is an union of these polyhedralsurfaces. |
Доступність: 3.5.0 — вимагає SFCGAL >= 1.5.0.
Вимагає SFCGAL >= 1.5.0
This method needs SFCGAL backend.
Extrude a polygon with a hole into a body and straight-skeleton roof.
WITH data AS (
SELECT 'POLYGON ((0 0,5 0,5 5,4 5,4 4,0 4,0 0),(1 1,1 2,2 2,2 1,1 1))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_ExtrudeStraightSkeleton(input_polygon, 3.0, 2.0) AS straight_skeleton_extrusion
FROM data;POLYGON((0 0,5 0,5 5,4 5,4 4,0 4,0 0),(1 1,1 2,2 2,2 1,1 1)) | POLYHEDRALSURFACE Z (((0 0 0,0 4 0,4 4 0,4 5 0,5 5 0,5 0 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((0 0 0,0 0 2,0 4 2,0 4 0,0 0 0)),((0 4 0,0 4 2,4 4 2,4 4 0,0 4 0)),((4 4 0,4 4 2,4 5 2,4 5 0,4 4 0)),((4 5 0,4 5 2,5 5 2,5 5 0,4 5 0)),((5 5 0,5 5 2,5 0 2,5 0 0,5 5 0)),((5 0 0,5 0 2,0 0 2,0 0 0,5 0 0)),((1 1 0,1 1 2,2 1 2,2 1 0,1 1 0)),((2 1 0,2 1 2,2 2 2,2 2 0,2 1 0)),((2 2 0,2 2 2,1 2 2,1 2 0,2 2 0)),((1 2 0,1 2 2,1 1 2,1 1 0,1 2 0)),((0 4 2,0 0 2,0.5 0.5 2.5,0.5 2.5 2.5,1 3 3,0 4 2)),((0 0 2,5 0 2,3.5 1.5 3.5,2.5 0.5 2.5,0.5 0.5 2.5,0 0 2)),((5 0 2,5 5 2,4.5 4.5 2.5,4.5 3.5 2.5,3.5 2.5 3.5,3.5 1.5 3.5,5 0 2)),((5 5 2,4 5 2,4.5 4.5 2.5,5 5 2)),((4 5 2,4 4 2,4.5 3.5 2.5,4.5 4.5 2.5,4 5 2)),((4 4 2,0 4 2,1 3 3,3 3 3,3.5 2.5 3.5,4.5 3.5 2.5,4 4 2)),((2 1 2,1 1 2,0.5 0.5 2.5,2.5 0.5 2.5,2 1 2)),((1 1 2,1 2 2,0.5 2.5 2.5,0.5 0.5 2.5,1 1 2)),((1 2 2,2 2 2,3 3 3,1 3 3,0.5 2.5 2.5,1 2 2)),((2 2 2,2 1 2,2.5 0.5 2.5,3.5 1.5 3.5,3.5 2.5 3.5,3 3 3,2 2 2)))
CG_GreeneApproxConvexPartition — Обчислює наближене опукле розбиття геометрії багатокутника
geometry CG_GreeneApproxConvexPartition(geometry geom);
Обчислює наближене монотонне опукле розбиття геометрії багатокутника.
![]() | |
Розбиття багатокутника P — це набір полігонів, внутрішні частини яких не перетинаються, а об'єднання полігонів дорівнює внутрішній частині вихідного полігону P. Функції CG_ApproxConvexPartition і CG_GreeneApproxConvexPartition створюють приблизно оптимальні опуклі розбиття. Обидві ці функції створюють опуклі розбиття, спочатку розбиваючи полігон на простіші полігони. CG_ApproxConvexPartition використовує триангуляцію, а CG_GreeneApproxConvexPartition — монотонний поділ. Обидві ці функції гарантують, що вони створюють не більше ніж в чотири рази більше опуклих частин, ніж оптимальна кількість, але вони відрізняються за складністю виконання. Хоча алгоритм наближення на основі триангуляції часто дає менше опуклих частин, це не завжди так. |
Доступність: 3.5.0 — вимагає SFCGAL >= 1.5.0.
Вимагає SFCGAL >= 1.5.0
This method needs SFCGAL backend.
Greene's monotone-based approximation uses the same polygon and stays directly comparable in one panel.
WITH data AS (
SELECT 'POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_GreeneApproxConvexPartition(input_polygon) AS partition
FROM data;POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150)) | GEOMETRYCOLLECTION(POLYGON((32 159,0 45,41 86,32 159)), POLYGON((45 1,177 2,67 24,45 1)), POLYGON((67 24,109 31,170 60,107 61,67 24)), POLYGON((41 86,45 1,67 24,41 86)), POLYGON((107 61,32 159,41 86,67 24,107 61)), POLYGON((148 120,107 61,170 60,148 120)), POLYGON((148 120,170 60,180 110,156 150,148 120)), POLYGON((156 150,83 181,89 131,148 120,156 150)))
CG_MinkowskiSum — Обчислює суму Мінковського
geometry CG_MinkowskiSum(geometry geom1, geometry geom2);
Ця функція виконує двовимірну суму Мінковського точки, лінії або багатокутника з багатокутником.
Сума Мінковського двох геометрій A і B — це множина всіх точок, які є сумою будь-якої точки в A і B. Суми Мінковського часто використовуються в плануванні руху та комп'ютерному проектуванні. Більш детальна інформація на Вікіпедія Сума Мінковського.
Перший параметр може бути будь-якою 2D-геометрією (точка, лінія, багатокутник). Якщо передається 3D-геометрія, вона буде перетворена в 2D шляхом примусового встановлення Z на 0, що може призвести до випадків недійсність. Другий параметр повинен бути 2D-багатокутником.
Реалізація використовує CGAL 2D Minkowskisum.
Доступність: 3.5.0
This method needs SFCGAL backend.
Minkowski sum of a LineString and a circular polygon. The line crosses the polygon, and the result sweeps the polygon along the line.
WITH data AS (
SELECT ST_MakeLine(ST_Point(10, 10), ST_Point(100, 100)) AS line,
ST_Buffer('POINT(50 50)'::geometry, 30) AS circle
)
SELECT line AS input_line,
circle AS input_circle,
CG_MinkowskiSum(line, circle) AS minkowski_sum
FROM data;LINESTRING(10 10,100 100) | POLYGON((80 50,79.424 44.147,77.716 38.519,74.944 33.333,71.213 28.787,66.667 25.056,61.481 22.284,55.853 20.576,50 20,44.147 20.576,38.519 22.284,33.333 25.056,28.787 28.787,25.056 33.333,22.284 38.519,20.576 44.147,20 50,20.576 55.853,22.284 61.481,25.056 66.667,28.787 71.213,33.333 74.944,38.519 77.716,44.147 79.424,50 80,55.853 79.424,61.481 77.716,66.667 74.944,71.213 71.213,74.944 66.667,77.716 61.481,79.424 55.853,80 50)) | MULTIPOLYGON(((179.424 155.853,177.716 161.481,174.944 166.667,171.213 171.213,166.667 174.944,161.481 177.716,155.853 179.424,150 180,144.147 179.424,138.519 177.716,133.333 174.944,128.787 171.213,38.787 81.213,35.056 76.667,32.284 71.481,30.576 65.853,30 60,30.576 54.147,32.284 48.519,35.056 43.333,38.787 38.787,43.333 35.056,48.519 32.284,54.147 30.576,60 30,65.853 30.576,71.481 32.284,76.667 35.056,81.213 38.787,171.213 128.787,174.944 133.333,177.716 138.519,179.424 144.147,180 150,179.424 155.853)))
Minkowski sum of a MultiPoint and a polygon. The result contains one translated copy of the polygon for each point.
WITH data AS (
SELECT 'MULTIPOINT(25 50,70 25)'::geometry AS points,
'POLYGON((130 150,20 40,50 60,125 100,130 150))'::geometry AS polygon
)
SELECT points AS input_points,
polygon AS input_polygon,
CG_MinkowskiSum(points, polygon) AS minkowski_sum
FROM data;MULTIPOINT((25 50),(70 25)) | POLYGON((130 150,20 40,50 60,125 100,130 150)) | MULTIPOLYGON(((45 90,75 110,150 150,155 200,45 90)),((90 65,120 85,195 125,200 175,90 65)))
CG_OptimalAlphaShape — Обчислює альфа-форму, що охоплює геометрію, використовуючи «оптимальне» значення альфа.
geometry CG_OptimalAlphaShape(geometry geom, boolean allow_holes = false, integer nb_components = 1);
Обчислює «оптимальну» альфа-форму точок у геометрії. Альфа-форма обчислюється з використанням значення α, обраного таким чином, щоб:
кількість елементів полігону дорівнює або менше, ніж nb_components (за замовчуванням 1)
всі точки введення містяться в фігурі
Результат не буде містити отвори, якщо опціональний аргумент allow_holes не буде вказаний як true.
Доступність: 3.5.0 — вимагає SFCGAL >= 1.4.1.
This method needs SFCGAL backend.
The original point cloud and the optimal alpha-shape share one comparison frame.
WITH data AS (
SELECT '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 AS input_points
)
SELECT input_points AS input_points,
CG_OptimalAlphaShape(input_points) AS optimal_alpha_shape
FROM data;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)) | MULTIPOLYGON(((89 53,88 58,83 64,85 71,83 72,75 77,75 84,76 88,72 95,64 97,57 97,52 98,49 95,45 90,39 88,34 86,26 85,24 82,27 77,24 67,23 60,27 54,26 44,23 36,28 33,30 22,37 23,43 19,53 18,65 16,73 16,78 16,84 19,88 29,90 30,87 42,91 50,89 53)))
Allowing holes keeps the same outer shell but carves a central hole.
WITH data AS (
SELECT '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 AS input_points
)
SELECT input_points AS input_points,
CG_OptimalAlphaShape(input_points, allow_holes => true) AS optimal_alpha_shape
FROM data;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)) | MULTIPOLYGON(((89 53,88 58,83 64,85 71,83 72,75 77,75 84,76 88,72 95,64 97,57 97,52 98,49 95,45 90,39 88,34 86,26 85,24 82,27 77,24 67,23 60,27 54,26 44,23 36,28 33,30 22,37 23,43 19,53 18,65 16,73 16,78 16,84 19,88 29,90 30,87 42,91 50,89 53),(36 68,40 75,43 80,50 86,60 81,68 73,77 67,81 60,82 54,81 47,78 43,81 29,76 27,70 20,62 22,55 26,54 32,48 34,44 42,38 46,36 61,36 68)))
CG_OptimalConvexPartition — Обчислює оптимальний опуклий поділ геометрії багатокутника
geometry CG_OptimalConvexPartition(geometry geom);
Обчислює оптимальний опуклий поділ геометрії багатокутника.
![]() | |
Розбиття багатокутника P — це набір багатокутників, внутрішні частини яких не перетинаються, а об'єднання багатокутників дорівнює внутрішній частині вихідного багатокутника P. CG_OptimalConvexPartition створює розбиття, яке є оптимальним за кількістю частин. |
Доступність: 3.5.0 — вимагає SFCGAL >= 1.5.0.
Вимагає SFCGAL >= 1.5.0
This method needs SFCGAL backend.
The optimal convex partition uses the same polygon and produces the smallest documented piece count.
WITH data AS (
SELECT 'POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_OptimalConvexPartition(input_polygon) AS partition
FROM data;POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150)) | GEOMETRYCOLLECTION(POLYGON((156 150,83 181,89 131,148 120,156 150)), POLYGON((32 159,0 45,41 86,32 159)), POLYGON((45 1,177 2,67 24,45 1)), POLYGON((41 86,45 1,67 24,41 86)), POLYGON((107 61,32 159,41 86,67 24,109 31,107 61)), POLYGON((148 120,107 61,109 31,170 60,180 110,148 120)), POLYGON((156 150,148 120,180 110,156 150)))
CG_StraightSkeleton — Обчислити прямий скелет з геомeтрії
geometry CG_StraightSkeleton(geometry geom, boolean use_distance_as_m = false);
Computes the straight skeleton of a polygon by tracing the inward propagation of its edges. When use_distance_as_m is true, the M coordinate of each output point stores its distance from the input boundary.
Доступність: 3.5.0
Для використання опції use_distance_as_m необхідна версія SFCGAL >= 1.3.8
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).
WITH data AS ( SELECT 'POLYGON((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190))'::geometry AS polygon ) SELECT CG_StraightSkeleton(polygon) AS straight_skeleton FROM data;
MULTILINESTRING((190 190,164.03987973986756 164.03987973986756),(10 190,40.697077206292434 159.30292279370755),(10 10,35 35),(190 10,184.18861169915812 15.811388300841896),(190 20,184.18861169915812 15.811388300841896),(160 30,158.3772233983162 20),(60 30,50 20),(60 130,35 153.15077848154866),(190 140,164.03987973986756 164.03987973986756),(184.18861169915812 15.811388300841896,158.3772233983162 20),(50 20,158.3772233983162 20),(50 20,35 35),(35 153.15077848154866,35 35),(35 153.15077848154866,40.697077206292434 159.30292279370755),(164.03987973986756 164.03987973986756,40.697077206292434 159.30292279370755))
WITH data AS ( SELECT 'POLYGON((0 0,1 0,1 1,0 1,0 0))'::geometry AS polygon ) SELECT CG_StraightSkeleton(polygon, true) AS straight_skeleton_with_m FROM data;
MULTILINESTRING M ((0 0 0,0.5 0.5 0.5),(1 0 0,0.5 0.5 0.5),(1 1 0,0.5 0.5 0.5),(0 1 0,0.5 0.5 0.5))
Зверніть увагу, що дійсні вхідні дані з кільцями, які стикаються в одній точці, спричинять помилку.
SELECT CG_StraightSkeleton('POLYGON((0 0,3 0,3 3,0 3,0 0),(0 0,1 2,2 1,0 0))'));NOTICE: During straight_skeleton(A) : NOTICE: with A: POLYGON((0/1 0/1,3/1 0/1,3/1 3/1,0/1 3/1,0/1 0/1),(0/1 0/1,1/1 2/1,2/1 1/1,0/1 0/1)) ERROR: straight skeleton of Polygon with point touching rings is not implemented.
CG_Tesselate — Виконує тесселяцію поверхні полігона або багатогранної поверхні і повертає результат у вигляді TIN або набору TIN
geometry CG_Tesselate(geometry geom);
Приймає як вхідні дані поверхню типу MULTI(POLYGON) або POLYHEDRALSURFACE і повертає представлення TIN за допомогою процесу тесселяції з використанням трикутників.
![]() | |
ST_TriangulatePolygon виконує подібну функцію, за винятком того, що повертає колекцію геометрії багатокутників замість TIN, а також працює тільки з 2D-геометріями. |
Доступність: 3.5.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).
Tessellation divides each face of a cube into triangles.
WITH data AS ( SELECT '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)) )'::geometry AS cube ) SELECT CG_Tesselate(cube) AS tessellation FROM data;
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)))
Tessellation of a Polygon.
WITH data AS (
SELECT 'POLYGON((10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190))'::geometry AS polygon
)
SELECT polygon AS input_polygon,
CG_Tesselate(polygon) AS tessellation
FROM data;POLYGON((10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190)) | TIN(((80 130,10 70,80 70,80 130)),((50 160,10 190,10 70,50 160)),((80 130,50 160,10 70,80 130)),((120 160,120 190,50 160,120 160)),((120 190,10 190,50 160,120 190)))
CG_Triangulate — Тріангулює полігональну геометрію
geometry CG_Triangulate( geometry geom );
Триангулює полігональну геометрію.
Виконується модулем SFCGAL
![]() | |
ПРИМІТКА: ця функція повертає геометрію, що представляє триангульований результат. |
Доступність: 3.5.0
This method needs SFCGAL backend.
SELECT CG_Triangulate(
'POLYGON((0 0,1 0,1 1,0 1,0 0),
(0.2 0.2,0.2 0.8,0.8 0.8,0.8 0.2,0.2 0.2))'
);TIN(((0.8 0.2,0.2 0.2,1 0,0.8 0.2)),((0.2 0.2,0 0,1 0,0.2 0.2)),((1 1,0.8 0.8,0.8 0.2,1 1)),((0 1,0 0,0.2 0.2,0 1)),((0 1,0.2 0.8,1 1,0 1)),((0 1,0.2 0.2,0.2 0.8,0 1)),((0.2 0.8,0.8 0.8,1 1,0.2 0.8)),((0.2 0.8,0.2 0.2,0.8 0.2,0.2 0.8)),((1 1,0.8 0.2,1 0,1 1)),((0.8 0.8,0.2 0.8,0.8 0.2,0.8 0.8)))
CG_Visibility — Обчислити полігон видимості з точки або сегмента в геометрії полігона
geometry CG_Visibility(geometry polygon, geometry point);
geometry CG_Visibility(geometry polygon, geometry pointA, geometry pointB);
Returns the portion of a polygon visible from an observer point, or from the observer segment defined by pointA and pointB.
Доступність: 3.5.0 — вимагає SFCGAL >= 1.5.0.
Вимагає SFCGAL >= 1.5.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).
Visibility from a point inside a polygon with holes.
WITH data AS (
SELECT 'POLYGON((23.5 23.5,23.5 173.5,173.5 173.5,173.5 23.5,23.5 23.5),(108 98,108 36,156 37,155 99,108 98),(107 157.5,107 106.5,135 107.5,133 127.5,143.5 127.5,143.5 108.5,153.5 109.5,151.5 166,107 157.5),(41 95.5,41 35,100.5 36,98.5 68,78.5 68,77.5 96.5,41 95.5),(39 150,40 104,97.5 106.5,95.5 152,39 150))'::geometry AS polygon,
'POINT(91 87)'::geometry AS observer
)
SELECT ST_Collect(polygon, observer) AS input_scene,
CG_Visibility(polygon, observer) AS visibility
FROM data;GEOMETRYCOLLECTION(POLYGON((23.5 23.5,23.5 173.5,173.5 173.5,173.5 23.5,23.5 23.5),(108 98,108 36,156 37,155 99,108 98),(107 157.5,107 106.5,135 107.5,133 127.5,143.5 127.5,143.5 108.5,153.5 109.5,151.5 166,107 157.5),(41 95.5,41 35,100.5 36,98.5 68,78.5 68,77.5 96.5,41 95.5),(39 150,40 104,97.5 106.5,95.5 152,39 150)), POINT(91 87)) | POLYGON((78.5 68,98.5 68,108 43.93333333333334,108 98,121.96219931271477 107.03436426116838,107 106.5,107 135,97.5 106.5,65.28017241379311 105.09913793103448,77.5 96.5,78.5 68))
Visibility from a segment inside the same polygon.
WITH data AS (
SELECT 'POLYGON((23.5 23.5,23.5 173.5,173.5 173.5,173.5 23.5,23.5 23.5),(108 98,108 36,156 37,155 99,108 98),(107 157.5,107 106.5,135 107.5,133 127.5,143.5 127.5,143.5 108.5,153.5 109.5,151.5 166,107 157.5),(41 95.5,41 35,100.5 36,98.5 68,78.5 68,77.5 96.5,41 95.5),(39 150,40 104,97.5 106.5,95.5 152,39 150))'::geometry AS polygon,
'LINESTRING(78.5 68,98.5 68)'::geometry AS observer
)
SELECT ST_Collect(polygon, observer) AS input_scene,
CG_Visibility(polygon,
ST_StartPoint(observer),
ST_EndPoint(observer)) AS visibility
FROM data;GEOMETRYCOLLECTION(POLYGON((23.5 23.5,23.5 173.5,173.5 173.5,173.5 23.5,23.5 23.5),(108 98,108 36,156 37,155 99,108 98),(107 157.5,107 106.5,135 107.5,133 127.5,143.5 127.5,143.5 108.5,153.5 109.5,151.5 166,107 157.5),(41 95.5,41 35,100.5 36,98.5 68,78.5 68,77.5 96.5,41 95.5),(39 150,40 104,97.5 106.5,95.5 152,39 150)), LINESTRING(78.5 68,98.5 68)) | POLYGON((78.5 68,98.5 68,100.5 36,101.28125 23.5,111.7109375 23.5,108 36,108 98,110.73389524382901 106.63335340156533,107 106.5,107 157.5,108.51955307262571 173.5,95.75974025974025 173.5,97.5 106.5,70.9811529933481 105.3470066518847,77.5 96.5,78.5 68))
CG_YMonotonePartition — Обчислює y-монотонний поділ геометрії багатокутника
geometry CG_YMonotonePartition(geometry geom);
Обчислює y-монотонний поділ геометрії багатокутника.
![]() | |
Розбиття багатокутника P — це множина багатокутників, такі, що внутрішні частини багатокутників не перетинаються, а об'єднання багатокутників дорівнює внутрішній частині вихідного багатокутника P. Y-монотонний багатокутник — це багатокутник, вершини v1,…,vn якого можна розділити на два ланцюги v1,…,vk і vk,…,vn,v1, такі, що будь-яка горизонтальна лінія перетинає кожен ланцюг не більше одного разу. Цей алгоритм не гарантує обмеження кількості багатокутників, що утворюються, відносно оптимальної кількості. |
Доступність: 3.5.0 — вимагає SFCGAL >= 1.5.0.
Вимагає SFCGAL >= 1.5.0
This method needs SFCGAL backend.
The same polygon can also be partitioned into y-monotone pieces for downstream processing.
WITH data AS (
SELECT 'POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150))'::geometry AS input_polygon
)
SELECT input_polygon AS input_polygon,
CG_YMonotonePartition(input_polygon) AS partition
FROM data;POLYGON((156 150,83 181,89 131,148 120,107 61,32 159,0 45,41 86,45 1,177 2,67 24,109 31,170 60,180 110,156 150)) | GEOMETRYCOLLECTION(POLYGON((32 159,0 45,41 86,32 159)), POLYGON((107 61,32 159,41 86,45 1,177 2,67 24,109 31,170 60,107 61)), POLYGON((156 150,83 181,89 131,148 120,107 61,170 60,180 110,156 150)))
CG_StraightSkeletonPartition — Обчислює прямий скелетний поділ багатокутника.
geometry CG_StraightSkeletonPartition(geometry geom, boolean auto_orientation);
Обчислює пряме скелетне розділення вхідної геометрії багатокутника geom. Прямий скелет — це розділення багатокутника на грані, утворені шляхом відстеження збігання його ребер. Якщо auto_orientation встановлено на true, функція автоматично налаштує орієнтацію вхідного багатокутника, щоб забезпечити правильні результати.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0.
This method needs SFCGAL backend.
SELECT CG_StraightSkeletonPartition('POLYGON((0 0,4 0,2 2,0 0))', true);POLYHEDRALSURFACE(((0 0,2 0.82842712474619,2 2,0 0)),((4 0,2 0.82842712474619,0 0,4 0)),((2 2,2 0.82842712474619,4 0,2 2)))
Straight skeleton partition of a polygon.
WITH data AS (
SELECT 'POLYGON((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190))'::geometry AS polygon
)
SELECT polygon AS input_polygon,
CG_StraightSkeletonPartition(polygon, true) AS skeleton_partition
FROM data;POLYGON((190 190,10 190,10 10,190 10,190 20,160 30,60 30,60 130,190 140,190 190)) | POLYHEDRALSURFACE(((190 190,164.04 164.04,190 140,190 190)),((10 190,40.697 159.303,164.04 164.04,190 190,10 190)),((10 10,35 35,35 153.151,40.697 159.303,10 190,10 10)),((190 10,184.189 15.811,158.377 20,50 20,35 35,10 10,190 10)),((190 20,184.189 15.811,190 10,190 20)),((160 30,158.377 20,184.189 15.811,190 20,160 30)),((60 30,50 20,158.377 20,160 30,60 30)),((60 130,35 153.151,35 35,50 20,60 30,60 130)),((190 140,164.04 164.04,40.697 159.303,35 153.151,60 130,190 140)))
CG_3DBuffer — Обчислює 3D-буфер навколо геометрії.
geometry CG_3DBuffer(geometry geom, float8 radius, integer segments, integer buffer_type);
Створює 3D-буфер навколо вхідної геометрії geom із заданим radius. Буфер будується в 3D-просторі, створюючи об'ємне представлення оточення геометрії. Параметр segments визначає кількість сегментів, що використовуються для апроксимації вигнутих ділянок буфера, з мінімальним значенням 4 сегменти. Параметр buffer_type визначає тип буфера, що створюється: 0: округлений буфер (за замовчуванням) 1: плоский буфер 2: квадратний буфер
Геометрія вхідних даних повинна бути точкою або лінією.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
SELECT CG_3DBuffer('POINT(0 0 0)', 1, 8, 0);POLYHEDRALSURFACE Z (((0 0 1, 0.5 -0.5 0.71, 0 -0.71 0.71, 0 0 1)), ... )
A rounded point buffer using 32 segments.
SELECT
'POINT(100 90)'::geometry AS input_geometry,
CG_3DBuffer('POINT(100 90)'::geometry, 50, 32, 0) AS buffer;POINT(100 90) | POLYHEDRALSURFACE Z (((74 133 0,66 126 7,78 133 12,74 133 0)),((60 115 15,71 124 21,66 126 7,60 115 15)),((85 130 25,78 133 12,71 124 21,85 130 25)),((66 126 7,71 124 21,78 133 12,66 126 7)),((57 90 26,64 97 34,57 102 22,57 90 26)),((75 105 40,66 111 29,64 97 34,75 105 40)),((60 115 15,57 102 22,66 111 29,60 115 15)),((64 97 34,66 111 29,57 102 22,64 97 34)),((100 116 43,93 124 36,88 112 43,100 116 43)),((85 130 25,79 119 34,93 124 36,85 130 25)),((75 105 40,88 112 43,79 119 34,75 105 40)),((93 124 36,79 119 34,88 112 43,93 124 36)),((60 115 15,66 111 29,71 124 21,60 115 15)),((75 105 40,79 119 34,66 111 29,75 105 40)),((85 130 25,71 124 21,79 119 34,85 130 25)),((66 111 29,79 119 34,71 124 21,66 111 29)),((74 133 0,78 133 12,85 138 0,74 133 0)),((85 130 25,92 138 13,78 133 12,85 130 25)),((100 140 0,85 138 0,92 138 13,100 140 0)),((78 133 12,92 138 13,85 138 0,78 133 12)),((100 116 43,107 124 36,93 124 36,100 116 43)),((115 130 25,100 133 26,107 124 36,115 130 25)),((85 130 25,93 124 36,100 133 26,85 130 25)),((107 124 36,100 133 26,93 124 36,107 124 36)),((126 133 0,115 138 0,122 133 12,126 133 0)),((100 140 0,108 138 13,115 138 0,100 140 0)),((115 130 25,122 133 12,108 138 13,115 130 25)),((115 138 0,108 138 13,122 133 12,115 138 0)),((85 130 25,100 133 26,92 138 13,85 130 25)),((115 130 25,108 138 13,100 133 26,115 130 25)),((100 140 0,92 138 13,108 138 13,100 140 0)),((100 133 26,108 138 13,92 138 13,100 133 26)),((74 133 0,85 138 0,78 133 -12,74 133 0)),((100 140 0,92 138 -13,85 138 0,100 140 0)),((85 130 -25,78 133 -12,92 138 -13,85 130 -25)),((85 138 0,92 138 -13,78 133 -12,85 138 0)),((126 133 0,122 133 -12,115 138 0,126 133 0)),((115 130 -25,108 138 -13,122 133 -12,115 130 -25)),((100 140 0,115 138 0,108 138 -13,100 140 0)),((122 133 -12,108 138 -13,115 138 0,122 133 -12)),((100 116 -43,93 124 -36,107 124 -36,100 116 -43)),((85 130 -25,100 133 -26,93 124 -36,85 130 -25)),((115 130 -25,107 124 -36,100 133 -26,115 130 -25)),((93 124 -36,100 133 -26,107 124 -36,93 124 -36)),((100 140 0,108 138 -13,92 138 -13,100 140 0)),((115 130 -25,100 133 -26,108 138 -13,115 130 -25)),((85 130 -25,92 138 -13,100 133 -26,85 130 -25)),((108 138 -13,100 133 -26,92 138 -13,108 138 -13)),((74 133 0,78 133 -12,66 126 -7,74 133 0)),((85 130 -25,71 124 -21,78 133 -12,85 130 -25)),((60 115 -15,66 126 -7,71 124 -21,60 115 -15)),((78 133 -12,71 124 -21,66 126 -7,78 133 -12)),((100 116 -43,88 112 -43,93 124 -36,100 116 -43)),((75 105 -40,79 119 -34,88 112 -43,75 105 -40)),((85 130 -25,93 124 -36,79 119 -34,85 130 -25)),((88 112 -43,79 119 -34,93 124 -36,88 112 -43)),((57 90 -26,57 102 -22,64 97 -34,57 90 -26)),((60 115 -15,66 111 -29,57 102 -22,60 115 -15)),((75 105 -40,64 97 -34,66 111 -29,75 105 -40)),((57 102 -22,66 111 -29,64 97 -34,57 102 -22)),((85 130 -25,79 119 -34,71 124 -21,85 130 -25)),((75 105 -40,66 111 -29,79 119 -34,75 105 -40)),((60 115 -15,71 124 -21,66 111 -29,60 115 -15)),((79 119 -34,66 111 -29,71 124 -21,79 119 -34)),((74 133 0,66 126 -7,66 126 7,74 133 0)),((60 115 -15,57 116 0,66 126 -7,60 115 -15)),((60 115 15,66 126 7,57 116 0,60 115 15)),((66 126 -7,57 116 0,66 126 7,66 126 -7)),((57 90 -26,52 90 -15,57 102 -22,57 90 -26)),((50 90 0,52 103 -8,52 90 -15,50 90 0)),((60 115 -15,57 102 -22,52 103 -8,60 115 -15)),((52 90 -15,52 103 -8,57 102 -22,52 90 -15)),((57 90 26,57 102 22,52 90 15,57 90 26)),((60 115 15,52 103 8,57 102 22,60 115 15)),((50 90 0,52 90 15,52 103 8,50 90 0)),((57 102 22,52 103 8,52 90 15,57 102 22)),((60 115 -15,52 103 -8,57 116 0,60 115 -15)),((50 90 0,52 103 8,52 103 -8,50 90 0)),((60 115 15,57 116 0,52 103 8,60 115 15)),((52 103 -8,52 103 8,57 116 0,52 103 -8)),((126 133 0,122 133 12,134 126 7,126 133 0)),((115 130 25,129 124 21,122 133 12,115 130 25)),((140 115 15,134 126 7,129 124 21,140 115 15)),((122 133 12,129 124 21,134 126 7,122 133 12)),((100 116 43,112 112 43,107 124 36,100 116 43)),((125 105 40,121 119 34,112 112 43,125 105 40)),((115 130 25,107 124 36,121 119 34,115 130 25)),((112 112 43,121 119 34,107 124 36,112 112 43)),((143 90 26,143 102 22,136 97 34,143 90 26)),((140 115 15,134 111 29,143 102 22,140 115 15)),((125 105 40,136 97 34,134 111 29,125 105 40)),((143 102 22,134 111 29,136 97 34,143 102 22)),((115 130 25,121 119 34,129 124 21,115 130 25)),((125 105 40,134 111 29,121 119 34,125 105 40)),((140 115 15,129 124 21,134 111 29,140 115 15)),((121 119 34,134 111 29,129 124 21,121 119 34)),((100 116 43,88 112 43,100 105 48,100 116 43)),((75 105 40,87 98 48,88 112 43,75 105 40)),((100 90 50,100 105 48,87 98 48,100 90 50)),((88 112 43,87 98 48,100 105 48,88 112 43)),((57 90 26,64 83 34,64 97 34,57 90 26)),((75 75 40,74 90 43,64 83 34,75 75 40)),((75 105 40,64 97 34,74 90 43,75 105 40)),((64 83 34,74 90 43,64 97 34,64 83 34)),((100 64 43,100 75 48,88 68 43,100 64 43)),((100 90 50,87 82 48,100 75 48,100 90 50)),((75 75 40,88 68 43,87 82 48,75 75 40)),((100 75 48,87 82 48,88 68 43,100 75 48)),((75 105 40,74 90 43,87 98 48,75 105 40)),((75 75 40,87 82 48,74 90 43,75 75 40)),((100 90 50,87 98 48,87 82 48,100 90 50)),((74 90 43,87 82 48,87 98 48,74 90 43)),((57 90 26,52 90 15,57 78 22,57 90 26)),((50 90 0,52 77 8,52 90 15,50 90 0)),((60 65 15,57 78 22,52 77 8,60 65 15)),((52 90 15,52 77 8,57 78 22,52 90 15)),((57 90 -26,57 78 -22,52 90 -15,57 90 -26)),((60 65 -15,52 77 -8,57 78 -22,60 65 -15)),((50 90 0,52 90 -15,52 77 -8,50 90 0)),((57 78 -22,52 77 -8,52 90 -15,57 78 -22)),((74 47 0,66 54 7,66 54 -7,74 47 0)),((60 65 15,57 64 0,66 54 7,60 65 15)),((60 65 -15,66 54 -7,57 64 0,60 65 -15)),((66 54 7,57 64 0,66 54 -7,66 54 7)),((50 90 0,52 77 -8,52 77 8,50 90 0)),((60 65 -15,57 64 0,52 77 -8,60 65 -15)),((60 65 15,52 77 8,57 64 0,60 65 15)),((52 77 -8,57 64 0,52 77 8,52 77 -8)),((57 90 -26,64 97 -34,64 83 -34,57 90 -26)),((75 105 -40,74 90 -43,64 97 -34,75 105 -40)),((75 75 -40,64 83 -34,74 90 -43,75 75 -40)),((64 97 -34,74 90 -43,64 83 -34,64 97 -34)),((100 116 -43,100 105 -48,88 112 -43,100 116 -43)),((100 90 -50,87 98 -48,100 105 -48,100 90 -50)),((75 105 -40,88 112 -43,87 98 -48,75 105 -40)),((100 105 -48,87 98 -48,88 112 -43,100 105 -48)),((100 64 -43,88 68 -43,100 75 -48,100 64 -43)),((75 75 -40,87 82 -48,88 68 -43,75 75 -40)),((100 90 -50,100 75 -48,87 82 -48,100 90 -50)),((88 68 -43,87 82 -48,100 75 -48,88 68 -43)),((75 105 -40,87 98 -48,74 90 -43,75 105 -40)),((100 90 -50,87 82 -48,87 98 -48,100 90 -50)),((75 75 -40,74 90 -43,87 82 -48,75 75 -40)),((87 98 -48,87 82 -48,74 90 -43,87 98 -48)),((100 116 -43,107 124 -36,112 112 -43,100 116 -43)),((115 130 -25,121 119 -34,107 124 -36,115 130 -25)),((125 105 -40,112 112 -43,121 119 -34,125 105 -40)),((107 124 -36,121 119 -34,112 112 -43,107 124 -36)),((126 133 0,134 126 -7,122 133 -12,126 133 0)),((140 115 -15,129 124 -21,134 126 -7,140 115 -15)),((115 130 -25,122 133 -12,129 124 -21,115 130 -25)),((134 126 -7,129 124 -21,122 133 -12,134 126 -7)),((143 90 -26,136 97 -34,143 102 -22,143 90 -26)),((125 105 -40,134 111 -29,136 97 -34,125 105 -40)),((140 115 -15,143 102 -22,134 111 -29,140 115 -15)),((136 97 -34,134 111 -29,143 102 -22,136 97 -34)),((115 130 -25,129 124 -21,121 119 -34,115 130 -25)),((140 115 -15,134 111 -29,129 124 -21,140 115 -15)),((125 105 -40,121 119 -34,134 111 -29,125 105 -40)),((129 124 -21,134 111 -29,121 119 -34,129 124 -21)),((126 47 0,134 54 7,122 47 12,126 47 0)),((140 65 15,129 56 21,134 54 7,140 65 15)),((115 50 25,122 47 12,129 56 21,115 50 25)),((134 54 7,129 56 21,122 47 12,134 54 7)),((143 90 26,136 83 34,143 78 22,143 90 26)),((125 75 40,134 69 29,136 83 34,125 75 40)),((140 65 15,143 78 22,134 69 29,140 65 15)),((136 83 34,134 69 29,143 78 22,136 83 34)),((100 64 43,107 56 36,112 68 43,100 64 43)),((115 50 25,121 61 34,107 56 36,115 50 25)),((125 75 40,112 68 43,121 61 34,125 75 40)),((107 56 36,121 61 34,112 68 43,107 56 36)),((140 65 15,134 69 29,129 56 21,140 65 15)),((125 75 40,121 61 34,134 69 29,125 75 40)),((115 50 25,129 56 21,121 61 34,115 50 25)),((134 69 29,121 61 34,129 56 21,134 69 29)),((126 47 0,122 47 12,115 42 0,126 47 0)),((115 50 25,108 42 13,122 47 12,115 50 25)),((100 40 0,115 42 0,108 42 13,100 40 0)),((122 47 12,108 42 13,115 42 0,122 47 12)),((100 64 43,93 56 36,107 56 36,100 64 43)),((85 50 25,100 47 26,93 56 36,85 50 25)),((115 50 25,107 56 36,100 47 26,115 50 25)),((93 56 36,100 47 26,107 56 36,93 56 36)),((74 47 0,85 42 0,78 47 12,74 47 0)),((100 40 0,92 42 13,85 42 0,100 40 0)),((85 50 25,78 47 12,92 42 13,85 50 25)),((85 42 0,92 42 13,78 47 12,85 42 0)),((115 50 25,100 47 26,108 42 13,115 50 25)),((85 50 25,92 42 13,100 47 26,85 50 25)),((100 40 0,108 42 13,92 42 13,100 40 0)),((100 47 26,92 42 13,108 42 13,100 47 26)),((126 47 0,115 42 0,122 47 -12,126 47 0)),((100 40 0,108 42 -13,115 42 0,100 40 0)),((115 50 -25,122 47 -12,108 42 -13,115 50 -25)),((115 42 0,108 42 -13,122 47 -12,115 42 0)),((74 47 0,78 47 -12,85 42 0,74 47 0)),((85 50 -25,92 42 -13,78 47 -12,85 50 -25)),((100 40 0,85 42 0,92 42 -13,100 40 0)),((78 47 -12,92 42 -13,85 42 0,78 47 -12)),((100 64 -43,107 56 -36,93 56 -36,100 64 -43)),((115 50 -25,100 47 -26,107 56 -36,115 50 -25)),((85 50 -25,93 56 -36,100 47 -26,85 50 -25)),((107 56 -36,100 47 -26,93 56 -36,107 56 -36)),((100 40 0,92 42 -13,108 42 -13,100 40 0)),((85 50 -25,100 47 -26,92 42 -13,85 50 -25)),((115 50 -25,108 42 -13,100 47 -26,115 50 -25)),((92 42 -13,100 47 -26,108 42 -13,92 42 -13)),((126 47 0,122 47 -12,134 54 -7,126 47 0)),((115 50 -25,129 56 -21,122 47 -12,115 50 -25)),((140 65 -15,134 54 -7,129 56 -21,140 65 -15)),((122 47 -12,129 56 -21,134 54 -7,122 47 -12)),((100 64 -43,112 68 -43,107 56 -36,100 64 -43)),((125 75 -40,121 61 -34,112 68 -43,125 75 -40)),((115 50 -25,107 56 -36,121 61 -34,115 50 -25)),((112 68 -43,121 61 -34,107 56 -36,112 68 -43)),((143 90 -26,143 78 -22,136 83 -34,143 90 -26)),((140 65 -15,134 69 -29,143 78 -22,140 65 -15)),((125 75 -40,136 83 -34,134 69 -29,125 75 -40)),((143 78 -22,134 69 -29,136 83 -34,143 78 -22)),((115 50 -25,121 61 -34,129 56 -21,115 50 -25)),((125 75 -40,134 69 -29,121 61 -34,125 75 -40)),((140 65 -15,129 56 -21,134 69 -29,140 65 -15)),((121 61 -34,134 69 -29,129 56 -21,121 61 -34)),((126 47 0,134 54 -7,134 54 7,126 47 0)),((140 65 -15,143 64 0,134 54 -7,140 65 -15)),((140 65 15,134 54 7,143 64 0,140 65 15)),((134 54 -7,143 64 0,134 54 7,134 54 -7)),((143 90 -26,148 90 -15,143 78 -22,143 90 -26)),((150 90 0,148 77 -8,148 90 -15,150 90 0)),((140 65 -15,143 78 -22,148 77 -8,140 65 -15)),((148 90 -15,148 77 -8,143 78 -22,148 90 -15)),((143 90 26,143 78 22,148 90 15,143 90 26)),((140 65 15,148 77 8,143 78 22,140 65 15)),((150 90 0,148 90 15,148 77 8,150 90 0)),((143 78 22,148 77 8,148 90 15,143 78 22)),((140 65 -15,148 77 -8,143 64 0,140 65 -15)),((150 90 0,148 77 8,148 77 -8,150 90 0)),((140 65 15,143 64 0,148 77 8,140 65 15)),((148 77 -8,148 77 8,143 64 0,148 77 -8)),((100 64 43,112 68 43,100 75 48,100 64 43)),((125 75 40,113 82 48,112 68 43,125 75 40)),((100 90 50,100 75 48,113 82 48,100 90 50)),((112 68 43,113 82 48,100 75 48,112 68 43)),((143 90 26,136 97 34,136 83 34,143 90 26)),((125 105 40,126 90 43,136 97 34,125 105 40)),((125 75 40,136 83 34,126 90 43,125 75 40)),((136 97 34,126 90 43,136 83 34,136 97 34)),((100 116 43,100 105 48,112 112 43,100 116 43)),((100 90 50,113 98 48,100 105 48,100 90 50)),((125 105 40,112 112 43,113 98 48,125 105 40)),((100 105 48,113 98 48,112 112 43,100 105 48)),((125 75 40,126 90 43,113 82 48,125 75 40)),((125 105 40,113 98 48,126 90 43,125 105 40)),((100 90 50,113 82 48,113 98 48,100 90 50)),((126 90 43,113 98 48,113 82 48,126 90 43)),((74 47 0,78 47 12,66 54 7,74 47 0)),((85 50 25,71 56 21,78 47 12,85 50 25)),((60 65 15,66 54 7,71 56 21,60 65 15)),((78 47 12,71 56 21,66 54 7,78 47 12)),((100 64 43,88 68 43,93 56 36,100 64 43)),((75 75 40,79 61 34,88 68 43,75 75 40)),((85 50 25,93 56 36,79 61 34,85 50 25)),((88 68 43,79 61 34,93 56 36,88 68 43)),((57 90 26,57 78 22,64 83 34,57 90 26)),((60 65 15,66 69 29,57 78 22,60 65 15)),((75 75 40,64 83 34,66 69 29,75 75 40)),((57 78 22,66 69 29,64 83 34,57 78 22)),((85 50 25,79 61 34,71 56 21,85 50 25)),((75 75 40,66 69 29,79 61 34,75 75 40)),((60 65 15,71 56 21,66 69 29,60 65 15)),((79 61 34,66 69 29,71 56 21,79 61 34)),((100 64 -43,93 56 -36,88 68 -43,100 64 -43)),((85 50 -25,79 61 -34,93 56 -36,85 50 -25)),((75 75 -40,88 68 -43,79 61 -34,75 75 -40)),((93 56 -36,79 61 -34,88 68 -43,93 56 -36)),((74 47 0,66 54 -7,78 47 -12,74 47 0)),((60 65 -15,71 56 -21,66 54 -7,60 65 -15)),((85 50 -25,78 47 -12,71 56 -21,85 50 -25)),((66 54 -7,71 56 -21,78 47 -12,66 54 -7)),((57 90 -26,64 83 -34,57 78 -22,57 90 -26)),((75 75 -40,66 69 -29,64 83 -34,75 75 -40)),((60 65 -15,57 78 -22,66 69 -29,60 65 -15)),((64 83 -34,66 69 -29,57 78 -22,64 83 -34)),((85 50 -25,71 56 -21,79 61 -34,85 50 -25)),((60 65 -15,66 69 -29,71 56 -21,60 65 -15)),((75 75 -40,79 61 -34,66 69 -29,75 75 -40)),((71 56 -21,66 69 -29,79 61 -34,71 56 -21)),((143 90 -26,136 83 -34,136 97 -34,143 90 -26)),((125 75 -40,126 90 -43,136 83 -34,125 75 -40)),((125 105 -40,136 97 -34,126 90 -43,125 105 -40)),((136 83 -34,126 90 -43,136 97 -34,136 83 -34)),((100 64 -43,100 75 -48,112 68 -43,100 64 -43)),((100 90 -50,113 82 -48,100 75 -48,100 90 -50)),((125 75 -40,112 68 -43,113 82 -48,125 75 -40)),((100 75 -48,113 82 -48,112 68 -43,100 75 -48)),((100 116 -43,112 112 -43,100 105 -48,100 116 -43)),((125 105 -40,113 98 -48,112 112 -43,125 105 -40)),((100 90 -50,100 105 -48,113 98 -48,100 90 -50)),((112 112 -43,113 98 -48,100 105 -48,112 112 -43)),((125 75 -40,113 82 -48,126 90 -43,125 75 -40)),((100 90 -50,113 98 -48,113 82 -48,100 90 -50)),((125 105 -40,126 90 -43,113 98 -48,125 105 -40)),((113 82 -48,113 98 -48,126 90 -43,113 82 -48)),((143 90 26,148 90 15,143 102 22,143 90 26)),((150 90 0,148 103 8,148 90 15,150 90 0)),((140 115 15,143 102 22,148 103 8,140 115 15)),((148 90 15,148 103 8,143 102 22,148 90 15)),((143 90 -26,143 102 -22,148 90 -15,143 90 -26)),((140 115 -15,148 103 -8,143 102 -22,140 115 -15)),((150 90 0,148 90 -15,148 103 -8,150 90 0)),((143 102 -22,148 103 -8,148 90 -15,143 102 -22)),((126 133 0,134 126 7,134 126 -7,126 133 0)),((140 115 15,143 116 0,134 126 7,140 115 15)),((140 115 -15,134 126 -7,143 116 0,140 115 -15)),((134 126 7,143 116 0,134 126 -7,134 126 7)),((150 90 0,148 103 -8,148 103 8,150 90 0)),((140 115 -15,143 116 0,148 103 -8,140 115 -15)),((140 115 15,148 103 8,143 116 0,140 115 15)),((148 103 -8,143 116 0,148 103 8,148 103 -8)))
A coarser rounded point buffer using 5 segments.
SELECT
'POINT(100 90)'::geometry AS input_geometry,
CG_3DBuffer('POINT(100 90)'::geometry, 50, 5, 0) AS buffer;POINT(100 90) | POLYHEDRALSURFACE Z (((74 133 0,60 115 15,85 130 25,74 133 0)),((57 90 26,75 105 40,60 115 15,57 90 26)),((100 116 43,85 130 25,75 105 40,100 116 43)),((60 115 15,75 105 40,85 130 25,60 115 15)),((74 133 0,85 130 25,100 140 0,74 133 0)),((100 116 43,115 130 25,85 130 25,100 116 43)),((126 133 0,100 140 0,115 130 25,126 133 0)),((85 130 25,115 130 25,100 140 0,85 130 25)),((74 133 0,100 140 0,85 130 -25,74 133 0)),((126 133 0,115 130 -25,100 140 0,126 133 0)),((100 116 -43,85 130 -25,115 130 -25,100 116 -43)),((100 140 0,115 130 -25,85 130 -25,100 140 0)),((74 133 0,85 130 -25,60 115 -15,74 133 0)),((100 116 -43,75 105 -40,85 130 -25,100 116 -43)),((57 90 -26,60 115 -15,75 105 -40,57 90 -26)),((85 130 -25,75 105 -40,60 115 -15,85 130 -25)),((74 133 0,60 115 -15,60 115 15,74 133 0)),((57 90 -26,50 90 0,60 115 -15,57 90 -26)),((57 90 26,60 115 15,50 90 0,57 90 26)),((60 115 -15,50 90 0,60 115 15,60 115 -15)),((126 133 0,115 130 25,140 115 15,126 133 0)),((100 116 43,125 105 40,115 130 25,100 116 43)),((143 90 26,140 115 15,125 105 40,143 90 26)),((115 130 25,125 105 40,140 115 15,115 130 25)),((100 116 43,75 105 40,100 90 50,100 116 43)),((57 90 26,75 75 40,75 105 40,57 90 26)),((100 64 43,100 90 50,75 75 40,100 64 43)),((75 105 40,75 75 40,100 90 50,75 105 40)),((57 90 26,50 90 0,60 65 15,57 90 26)),((57 90 -26,60 65 -15,50 90 0,57 90 -26)),((74 47 0,60 65 15,60 65 -15,74 47 0)),((50 90 0,60 65 -15,60 65 15,50 90 0)),((57 90 -26,75 105 -40,75 75 -40,57 90 -26)),((100 116 -43,100 90 -50,75 105 -40,100 116 -43)),((100 64 -43,75 75 -40,100 90 -50,100 64 -43)),((75 105 -40,100 90 -50,75 75 -40,75 105 -40)),((100 116 -43,115 130 -25,125 105 -40,100 116 -43)),((126 133 0,140 115 -15,115 130 -25,126 133 0)),((143 90 -26,125 105 -40,140 115 -15,143 90 -26)),((115 130 -25,140 115 -15,125 105 -40,115 130 -25)),((126 47 0,140 65 15,115 50 25,126 47 0)),((143 90 26,125 75 40,140 65 15,143 90 26)),((100 64 43,115 50 25,125 75 40,100 64 43)),((140 65 15,125 75 40,115 50 25,140 65 15)),((126 47 0,115 50 25,100 40 0,126 47 0)),((100 64 43,85 50 25,115 50 25,100 64 43)),((74 47 0,100 40 0,85 50 25,74 47 0)),((115 50 25,85 50 25,100 40 0,115 50 25)),((126 47 0,100 40 0,115 50 -25,126 47 0)),((74 47 0,85 50 -25,100 40 0,74 47 0)),((100 64 -43,115 50 -25,85 50 -25,100 64 -43)),((100 40 0,85 50 -25,115 50 -25,100 40 0)),((126 47 0,115 50 -25,140 65 -15,126 47 0)),((100 64 -43,125 75 -40,115 50 -25,100 64 -43)),((143 90 -26,140 65 -15,125 75 -40,143 90 -26)),((115 50 -25,125 75 -40,140 65 -15,115 50 -25)),((126 47 0,140 65 -15,140 65 15,126 47 0)),((143 90 -26,150 90 0,140 65 -15,143 90 -26)),((143 90 26,140 65 15,150 90 0,143 90 26)),((140 65 -15,150 90 0,140 65 15,140 65 -15)),((100 64 43,125 75 40,100 90 50,100 64 43)),((143 90 26,125 105 40,125 75 40,143 90 26)),((100 116 43,100 90 50,125 105 40,100 116 43)),((125 75 40,125 105 40,100 90 50,125 75 40)),((74 47 0,85 50 25,60 65 15,74 47 0)),((100 64 43,75 75 40,85 50 25,100 64 43)),((57 90 26,60 65 15,75 75 40,57 90 26)),((85 50 25,75 75 40,60 65 15,85 50 25)),((100 64 -43,85 50 -25,75 75 -40,100 64 -43)),((74 47 0,60 65 -15,85 50 -25,74 47 0)),((57 90 -26,75 75 -40,60 65 -15,57 90 -26)),((85 50 -25,60 65 -15,75 75 -40,85 50 -25)),((143 90 -26,125 75 -40,125 105 -40,143 90 -26)),((100 64 -43,100 90 -50,125 75 -40,100 64 -43)),((100 116 -43,125 105 -40,100 90 -50,100 116 -43)),((125 75 -40,100 90 -50,125 105 -40,125 75 -40)),((143 90 26,150 90 0,140 115 15,143 90 26)),((143 90 -26,140 115 -15,150 90 0,143 90 -26)),((126 133 0,140 115 15,140 115 -15,126 133 0)),((150 90 0,140 115 -15,140 115 15,150 90 0)))
A rounded buffer around a line using 32 segments.
SELECT
'LINESTRING(50 50,150 150,150 50)'::geometry AS input_geometry,
CG_3DBuffer('LINESTRING(50 50,150 150,150 50)'::geometry, 10, 32, 0) AS buffer;LINESTRING(50 50,150 150,150 50) | POLYHEDRALSURFACE Z (((40 50 3,40 50 0,40 47 2,40 50 3)),((40 47 2,40 50 0,40 47 -2,40 47 2)),((40 47 -2,40 50 0,40 50 -3,40 47 -2)),((40 50 -3,40 50 0,40 53 -2,40 50 -3)),((40 53 -2,40 50 0,40 53 2,40 53 -2)),((40 53 2,40 50 0,40 50 3,40 53 2)),((40 53 2,40 50 3,41 52 4,40 53 2)),((41 52 4,40 50 3,41 50 5,41 52 4)),((41 50 5,40 50 3,41 48 4,41 50 5)),((41 48 4,40 50 3,40 47 2,41 48 4)),((40 47 2,40 47 -2,41 45 0,40 47 2)),((41 48 4,40 47 2,42 45 3,41 48 4)),((42 45 3,40 47 2,41 45 0,42 45 3)),((41 45 0,40 47 -2,42 45 -3,41 45 0)),((42 45 -3,40 47 -2,41 48 -4,42 45 -3)),((40 47 -2,40 50 -3,41 48 -4,40 47 -2)),((41 48 -4,40 50 -3,41 50 -5,41 48 -4)),((41 50 -5,40 50 -3,41 52 -4,41 50 -5)),((41 52 -4,40 50 -3,40 53 -2,41 52 -4)),((41 55 0,40 53 -2,40 53 2,41 55 0)),((41 52 -4,40 53 -2,42 55 -3,41 52 -4)),((42 55 -3,40 53 -2,41 55 0,42 55 -3)),((41 55 0,40 53 2,42 55 3,41 55 0)),((42 55 3,40 53 2,41 52 4,42 55 3)),((42 55 3,41 52 4,43 54 6,42 55 3)),((43 54 6,41 52 4,43 51 7,43 54 6)),((43 51 7,41 52 4,41 50 5,43 51 7)),((43 51 7,41 50 5,43 49 7,43 51 7)),((41 50 5,41 48 4,43 49 7,41 50 5)),((43 49 7,41 48 4,43 46 6,43 49 7)),((43 46 6,41 48 4,42 45 3,43 46 6)),((42 45 3,41 45 0,43 43 1,42 45 3)),((43 43 1,41 45 0,43 43 -1,43 43 1)),((43 43 -1,41 45 0,42 45 -3,43 43 -1)),((43 46 6,42 45 3,44 43 4,43 46 6)),((44 43 4,42 45 3,43 43 1,44 43 4)),((44 43 -4,42 45 -3,43 46 -6,44 43 -4)),((42 45 -3,41 48 -4,43 46 -6,42 45 -3)),((43 43 -1,42 45 -3,44 43 -4,43 43 -1)),((43 46 -6,41 48 -4,43 49 -7,43 46 -6)),((43 49 -7,41 48 -4,41 50 -5,43 49 -7)),((43 49 -7,41 50 -5,43 51 -7,43 49 -7)),((41 50 -5,41 52 -4,43 51 -7,41 50 -5)),((43 51 -7,41 52 -4,43 54 -6,43 51 -7)),((43 54 -6,41 52 -4,42 55 -3,43 54 -6)),((42 55 -3,41 55 0,43 57 -1,42 55 -3)),((43 57 -1,41 55 0,43 57 1,43 57 -1)),((43 57 1,41 55 0,42 55 3,43 57 1)),((43 54 -6,42 55 -3,44 57 -4,43 54 -6)),((44 57 -4,42 55 -3,43 57 -1,44 57 -4)),((43 57 1,42 55 3,44 57 4,43 57 1)),((44 57 4,42 55 3,43 54 6,44 57 4)),((43 54 6,46 56 7,44 57 4,43 54 6)),((44 57 4,46 56 7,146 156 7,44 57 4)),((44 57 4,146 156 7,144 157 4,44 57 4)),((46 56 7,43 54 6,45 53 8,46 56 7)),((43 54 6,43 51 7,45 53 8,43 54 6)),((45 53 8,43 51 7,45 50 9,45 53 8)),((43 51 7,43 49 7,45 50 9,43 51 7)),((45 50 9,43 49 7,45 47 8,45 50 9)),((45 47 8,43 49 7,43 46 6,45 47 8)),((45 47 8,43 46 6,46 44 7,45 47 8)),((46 44 7,43 46 6,44 43 4,46 44 7)),((43 43 1,43 43 -1,45 41 0,43 43 1)),((44 43 4,43 43 1,46 41 2,44 43 4)),((46 41 2,43 43 1,45 41 0,46 41 2)),((45 41 0,43 43 -1,46 41 -2,45 41 0)),((46 41 -2,43 43 -1,44 43 -4,46 41 -2)),((46 44 7,44 43 4,47 42 5,46 44 7)),((47 42 5,44 43 4,46 41 2,47 42 5)),((47 42 -5,44 43 -4,46 44 -7,47 42 -5)),((44 43 -4,43 46 -6,46 44 -7,44 43 -4)),((46 41 -2,44 43 -4,47 42 -5,46 41 -2)),((46 44 -7,43 46 -6,45 47 -8,46 44 -7)),((43 46 -6,43 49 -7,45 47 -8,43 46 -6)),((45 47 -8,43 49 -7,45 50 -9,45 47 -8)),((45 50 -9,43 49 -7,43 51 -7,45 50 -9)),((45 50 -9,43 51 -7,45 53 -8,45 50 -9)),((45 53 -8,43 51 -7,43 54 -6,45 53 -8)),((45 53 -8,43 54 -6,46 56 -7,45 53 -8)),((43 54 -6,44 57 -4,46 56 -7,43 54 -6)),((46 56 -7,44 57 -4,144 157 -4,46 56 -7)),((46 56 -7,144 157 -4,146 156 -7,46 56 -7)),((43 57 -1,43 57 1,143 157 -1,43 57 -1)),((143 157 -1,43 57 1,143 157 1,143 157 -1)),((43 57 -1,143 157 -1,44 57 -4,43 57 -1)),((44 57 -4,143 157 -1,144 157 -4,44 57 -4)),((43 57 1,44 57 4,143 157 1,43 57 1)),((143 157 1,44 57 4,144 157 4,143 157 1)),((146 159 2,143 157 1,144 157 4,146 159 2)),((146 159 2,144 157 4,147 158 5,146 159 2)),((147 158 5,144 157 4,146 156 7,147 158 5)),((46 56 7,45 53 8,145 153 8,46 56 7)),((146 156 7,46 56 7,145 153 8,146 156 7)),((147 158 5,146 156 7,149 157 7,147 158 5)),((149 157 7,146 156 7,148 154 9,149 157 7)),((146 156 7,145 153 8,148 154 9,146 156 7)),((145 153 8,45 53 8,48 54 9,145 153 8)),((148 154 9,145 153 8,48 54 9,148 154 9)),((48 54 9,45 53 8,47 52 10,48 54 9)),((45 53 8,45 50 9,47 52 10,45 53 8)),((47 52 10,45 50 9,47 48 10,47 52 10)),((47 48 10,45 50 9,45 47 8,47 48 10)),((47 48 10,45 47 8,48 46 9,47 48 10)),((48 46 9,45 47 8,46 44 7,48 46 9)),((48 46 9,46 44 7,49 43 7,48 46 9)),((49 43 7,46 44 7,47 42 5,49 43 7)),((46 41 2,45 41 0,47 40 0,46 41 2)),((47 40 0,45 41 0,46 41 -2,47 40 0)),((47 42 5,46 41 2,48 40 3,47 42 5)),((48 40 3,46 41 2,47 40 0,48 40 3)),((48 40 -3,46 41 -2,47 42 -5,48 40 -3)),((47 40 0,46 41 -2,48 40 -3,47 40 0)),((49 43 7,47 42 5,50 41 5,49 43 7)),((50 41 5,47 42 5,48 40 3,50 41 5)),((50 41 -5,47 42 -5,49 43 -7,50 41 -5)),((47 42 -5,46 44 -7,49 43 -7,47 42 -5)),((48 40 -3,47 42 -5,50 41 -5,48 40 -3)),((49 43 -7,46 44 -7,48 46 -9,49 43 -7)),((46 44 -7,45 47 -8,48 46 -9,46 44 -7)),((48 46 -9,45 47 -8,47 48 -10,48 46 -9)),((45 47 -8,45 50 -9,47 48 -10,45 47 -8)),((47 48 -10,45 50 -9,47 52 -10,47 48 -10)),((47 52 -10,45 50 -9,45 53 -8,47 52 -10)),((47 52 -10,45 53 -8,48 54 -9,47 52 -10)),((45 53 -8,145 153 -8,48 54 -9,45 53 -8)),((48 54 -9,145 153 -8,148 154 -9,48 54 -9)),((45 53 -8,46 56 -7,145 153 -8,45 53 -8)),((145 153 -8,46 56 -7,146 156 -7,145 153 -8)),((148 154 -9,145 153 -8,146 156 -7,148 154 -9)),((148 154 -9,146 156 -7,149 157 -7,148 154 -9)),((149 157 -7,146 156 -7,147 158 -5,149 157 -7)),((146 156 -7,144 157 -4,147 158 -5,146 156 -7)),((147 158 -5,144 157 -4,146 159 -2,147 158 -5)),((144 157 -4,143 157 -1,146 159 -2,144 157 -4)),((146 159 -2,143 157 -1,145 159 0,146 159 -2)),((145 159 0,143 157 -1,143 157 1,145 159 0)),((145 159 0,143 157 1,146 159 2,145 159 0)),((147 160 0,145 159 0,146 159 2,147 160 0)),((147 160 0,146 159 2,148 160 3,147 160 0)),((148 160 3,146 159 2,147 158 5,148 160 3)),((148 160 3,147 158 5,150 159 5,148 160 3)),((150 159 5,147 158 5,149 157 7,150 159 5)),((150 159 5,149 157 7,151 157 7,150 159 5)),((151 157 7,149 157 7,150 155 9,151 157 7)),((149 157 7,148 154 9,150 155 9,149 157 7)),((48 54 9,47 52 10,147 152 10,48 54 9)),((148 154 9,48 54 9,147 152 10,148 154 9)),((150 155 9,148 154 9,150 153 10,150 155 9)),((148 154 9,147 152 10,150 153 10,148 154 9)),((147 152 10,47 52 10,50 50 10,147 152 10)),((150 150 10,147 152 10,50 50 10,150 150 10)),((47 52 10,47 48 10,50 50 10,47 52 10)),((50 50 10,47 48 10,50 47 10,50 50 10)),((50 47 10,47 48 10,48 46 9,50 47 10)),((50 47 10,48 46 9,50 45 9,50 47 10)),((50 45 9,48 46 9,49 43 7,50 45 9)),((50 45 9,49 43 7,51 43 7,50 45 9)),((51 43 7,49 43 7,50 41 5,51 43 7)),((48 40 3,47 40 0,50 40 0,48 40 3)),((50 40 0,47 40 0,48 40 -3,50 40 0)),((50 41 5,48 40 3,52 40 3,50 41 5)),((52 40 3,48 40 3,50 40 0,52 40 3)),((50 40 0,48 40 -3,52 40 -3,50 40 0)),((52 40 -3,48 40 -3,50 41 -5,52 40 -3)),((51 43 7,50 41 5,53 42 5,51 43 7)),((53 42 5,50 41 5,52 40 3,53 42 5)),((52 40 -3,50 41 -5,53 42 -5,52 40 -3)),((53 42 -5,50 41 -5,51 43 -7,53 42 -5)),((50 41 -5,49 43 -7,51 43 -7,50 41 -5)),((51 43 -7,49 43 -7,50 45 -9,51 43 -7)),((49 43 -7,48 46 -9,50 45 -9,49 43 -7)),((50 45 -9,48 46 -9,50 47 -10,50 45 -9)),((48 46 -9,47 48 -10,50 47 -10,48 46 -9)),((50 47 -10,47 48 -10,50 50 -10,50 47 -10)),((50 50 -10,47 48 -10,47 52 -10,50 50 -10)),((47 52 -10,147 152 -10,50 50 -10,47 52 -10)),((50 50 -10,147 152 -10,150 150 -10,50 50 -10)),((47 52 -10,48 54 -9,147 152 -10,47 52 -10)),((147 152 -10,48 54 -9,148 154 -9,147 152 -10)),((150 153 -10,147 152 -10,148 154 -9,150 153 -10)),((150 153 -10,148 154 -9,150 155 -9,150 153 -10)),((150 155 -9,148 154 -9,149 157 -7,150 155 -9)),((150 155 -9,149 157 -7,151 157 -7,150 155 -9)),((151 157 -7,149 157 -7,150 159 -5,151 157 -7)),((149 157 -7,147 158 -5,150 159 -5,149 157 -7)),((150 159 -5,147 158 -5,148 160 -3,150 159 -5)),((147 158 -5,146 159 -2,148 160 -3,147 158 -5)),((148 160 -3,146 159 -2,147 160 0,148 160 -3)),((146 159 -2,145 159 0,147 160 0,146 159 -2)),((148 160 -3,147 160 0,150 160 0,148 160 -3)),((150 160 0,147 160 0,148 160 3,150 160 0)),((150 160 0,148 160 3,152 160 3,150 160 0)),((152 160 3,148 160 3,150 159 5,152 160 3)),((152 160 3,150 159 5,153 158 5,152 160 3)),((153 158 5,150 159 5,151 157 7,153 158 5)),((153 158 5,151 157 7,154 156 7,153 158 5)),((154 156 7,151 157 7,152 154 9,154 156 7)),((151 157 7,150 155 9,152 154 9,151 157 7)),((150 155 9,150 153 10,152 154 9,150 155 9)),((150 153 10,147 152 10,150 150 10,150 153 10)),((152 154 9,150 153 10,153 152 10,152 154 9)),((150 153 10,150 150 10,153 152 10,150 153 10)),((150 150 10,150 50 10,153 48 10,150 150 10)),((153 152 10,150 150 10,153 48 10,153 152 10)),((147 143 10,147 48 10,150 50 10,147 143 10)),((150 150 10,147 143 10,150 50 10,150 150 10)),((150 150 10,50 50 10,53 48 10,150 150 10)),((147 143 10,150 150 10,53 48 10,147 143 10)),((50 50 10,50 47 10,53 48 10,50 50 10)),((53 48 10,50 47 10,52 46 9,53 48 10)),((50 47 10,50 45 9,52 46 9,50 47 10)),((52 46 9,50 45 9,51 43 7,52 46 9)),((52 46 9,51 43 7,54 44 7,52 46 9)),((54 44 7,51 43 7,53 42 5,54 44 7)),((52 40 3,50 40 0,53 40 0,52 40 3)),((53 40 0,50 40 0,52 40 -3,53 40 0)),((53 42 5,52 40 3,54 41 2,53 42 5)),((54 41 2,52 40 3,53 40 0,54 41 2)),((53 40 0,52 40 -3,54 41 -2,53 40 0)),((54 41 -2,52 40 -3,53 42 -5,54 41 -2)),((54 44 7,53 42 5,56 43 4,54 44 7)),((56 43 4,53 42 5,54 41 2,56 43 4)),((54 41 -2,53 42 -5,56 43 -4,54 41 -2)),((56 43 -4,53 42 -5,54 44 -7,56 43 -4)),((53 42 -5,51 43 -7,54 44 -7,53 42 -5)),((54 44 -7,51 43 -7,52 46 -9,54 44 -7)),((51 43 -7,50 45 -9,52 46 -9,51 43 -7)),((52 46 -9,50 45 -9,50 47 -10,52 46 -9)),((52 46 -9,50 47 -10,53 48 -10,52 46 -9)),((53 48 -10,50 47 -10,50 50 -10,53 48 -10)),((50 50 -10,150 150 -10,53 48 -10,50 50 -10)),((53 48 -10,150 150 -10,147 143 -10,53 48 -10)),((147 48 -10,147 143 -10,150 50 -10,147 48 -10)),((150 50 -10,147 143 -10,150 150 -10,150 50 -10)),((150 50 -10,150 150 -10,153 48 -10,150 50 -10)),((153 48 -10,150 150 -10,153 152 -10,153 48 -10)),((153 152 -10,150 150 -10,150 153 -10,153 152 -10)),((150 150 -10,147 152 -10,150 153 -10,150 150 -10)),((153 152 -10,150 153 -10,152 154 -9,153 152 -10)),((152 154 -9,150 153 -10,150 155 -9,152 154 -9)),((152 154 -9,150 155 -9,151 157 -7,152 154 -9)),((152 154 -9,151 157 -7,154 156 -7,152 154 -9)),((154 156 -7,151 157 -7,153 158 -5,154 156 -7)),((151 157 -7,150 159 -5,153 158 -5,151 157 -7)),((153 158 -5,150 159 -5,152 160 -3,153 158 -5)),((150 159 -5,148 160 -3,152 160 -3,150 159 -5)),((152 160 -3,148 160 -3,150 160 0,152 160 -3)),((152 160 -3,150 160 0,153 160 0,152 160 -3)),((153 160 0,150 160 0,152 160 3,153 160 0)),((153 160 0,152 160 3,154 159 2,153 160 0)),((154 159 2,152 160 3,153 158 5,154 159 2)),((154 159 2,153 158 5,156 157 4,154 159 2)),((156 157 4,153 158 5,154 156 7,156 157 4)),((156 157 4,154 156 7,157 154 6,156 157 4)),((157 154 6,154 156 7,155 153 8,157 154 6)),((154 156 7,152 154 9,155 153 8,154 156 7)),((155 153 8,152 154 9,153 152 10,155 153 8)),((155 153 8,153 152 10,155 150 9,155 153 8)),((153 152 10,153 48 10,155 50 9,153 152 10)),((155 150 9,153 152 10,155 50 9,155 150 9)),((150 50 10,150 47 10,153 48 10,150 50 10)),((155 50 9,153 48 10,155 47 8,155 50 9)),((153 48 10,152 46 9,155 47 8,153 48 10)),((153 48 10,150 47 10,152 46 9,153 48 10)),((150 50 10,147 48 10,150 47 10,150 50 10)),((145 138 9,145 50 9,147 48 10,145 138 9)),((145 138 9,145 138 9,147 48 10,145 138 9)),((147 143 10,145 138 9,147 48 10,147 143 10)),((53 48 10,52 46 9,145 138 9,53 48 10)),((147 143 10,53 48 10,145 138 9,147 143 10)),((147 48 10,145 50 9,145 47 8,147 48 10)),((150 47 10,147 48 10,148 46 9,150 47 10)),((147 48 10,145 47 8,148 46 9,147 48 10)),((145 138 9,52 46 9,55 47 8,145 138 9)),((145 138 9,145 138 9,55 47 8,145 138 9)),((144 136 8,145 138 9,55 47 8,144 136 8)),((55 47 8,52 46 9,54 44 7,55 47 8)),((55 47 8,54 44 7,143 133 7,55 47 8)),((144 136 8,55 47 8,143 133 7,144 136 8)),((143 133 7,54 44 7,56 43 4,143 133 7)),((143 133 7,143 133 7,56 43 4,143 133 7)),((141 128 4,141 130 5,56 43 4,141 128 4)),((141 130 5,143 133 7,56 43 4,141 130 5)),((54 41 2,53 40 0,55 41 0,54 41 2)),((55 41 0,53 40 0,54 41 -2,55 41 0)),((56 43 4,54 41 2,57 43 1,56 43 4)),((57 43 1,54 41 2,55 41 0,57 43 1)),((55 41 0,54 41 -2,57 43 -1,55 41 0)),((57 43 -1,54 41 -2,56 43 -4,57 43 -1)),((141 128 4,56 43 4,57 43 1,141 128 4)),((140 127 3,141 128 4,57 43 1,140 127 3)),((140 126 1,140 127 3,57 43 1,140 126 1)),((57 43 -1,56 43 -4,141 128 -4,57 43 -1)),((140 126 -1,57 43 -1,140 127 -3,140 126 -1)),((140 127 -3,57 43 -1,141 128 -4,140 127 -3)),((56 43 -4,54 44 -7,143 133 -7,56 43 -4)),((141 130 -5,56 43 -4,143 133 -7,141 130 -5)),((143 133 -7,56 43 -4,143 133 -7,143 133 -7)),((141 128 -4,56 43 -4,141 130 -5,141 128 -4)),((54 44 -7,55 47 -8,143 133 -7,54 44 -7)),((143 133 -7,55 47 -8,144 136 -8,143 133 -7)),((54 44 -7,52 46 -9,55 47 -8,54 44 -7)),((52 46 -9,145 138 -9,55 47 -8,52 46 -9)),((55 47 -8,145 138 -9,145 138 -9,55 47 -8)),((55 47 -8,145 138 -9,144 136 -8,55 47 -8)),((52 46 -9,53 48 -10,145 138 -9,52 46 -9)),((145 138 -9,53 48 -10,147 143 -10,145 138 -9)),((145 50 -9,145 138 -9,147 48 -10,145 50 -9)),((147 48 -10,145 138 -9,145 138 -9,147 48 -10)),((147 48 -10,145 138 -9,147 143 -10,147 48 -10)),((150 47 -10,147 48 -10,150 50 -10,150 47 -10)),((153 48 -10,150 47 -10,150 50 -10,153 48 -10)),((145 47 -8,145 50 -9,147 48 -10,145 47 -8)),((148 46 -9,145 47 -8,147 48 -10,148 46 -9)),((148 46 -9,147 48 -10,150 47 -10,148 46 -9)),((155 47 -8,153 48 -10,155 50 -9,155 47 -8)),((153 48 -10,153 152 -10,155 50 -9,153 48 -10)),((155 50 -9,153 152 -10,155 150 -9,155 50 -9)),((152 46 -9,150 47 -10,153 48 -10,152 46 -9)),((155 47 -8,152 46 -9,153 48 -10,155 47 -8)),((155 150 -9,153 152 -10,155 153 -8,155 150 -9)),((153 152 -10,152 154 -9,155 153 -8,153 152 -10)),((155 153 -8,152 154 -9,154 156 -7,155 153 -8)),((155 153 -8,154 156 -7,157 154 -6,155 153 -8)),((157 154 -6,154 156 -7,156 157 -4,157 154 -6)),((154 156 -7,153 158 -5,156 157 -4,154 156 -7)),((156 157 -4,153 158 -5,154 159 -2,156 157 -4)),((153 158 -5,152 160 -3,154 159 -2,153 158 -5)),((154 159 -2,152 160 -3,153 160 0,154 159 -2)),((154 159 -2,153 160 0,155 159 0,154 159 -2)),((155 159 0,153 160 0,154 159 2,155 159 0)),((155 159 0,154 159 2,157 157 1,155 159 0)),((157 157 1,154 159 2,156 157 4,157 157 1)),((157 157 1,156 157 4,158 155 3,157 157 1)),((158 155 3,156 157 4,157 154 6,158 155 3)),((158 155 3,157 154 6,159 152 4,158 155 3)),((159 152 4,157 154 6,157 151 7,159 152 4)),((157 154 6,155 153 8,157 151 7,157 154 6)),((157 151 7,155 153 8,155 150 9,157 151 7)),((155 150 9,155 50 9,157 49 7,155 150 9)),((157 151 7,155 150 9,157 49 7,157 151 7)),((155 50 9,155 47 8,157 49 7,155 50 9)),((150 47 10,150 45 9,152 46 9,150 47 10)),((150 47 10,148 46 9,150 45 9,150 47 10)),((157 49 7,155 47 8,157 46 6,157 49 7)),((155 47 8,154 44 7,157 46 6,155 47 8)),((155 47 8,152 46 9,154 44 7,155 47 8)),((152 46 9,151 43 7,154 44 7,152 46 9)),((152 46 9,150 45 9,151 43 7,152 46 9)),((143 133 7,143 49 7,145 50 9,143 133 7)),((143 133 7,143 133 7,145 50 9,143 133 7)),((145 138 9,144 136 8,145 50 9,145 138 9)),((144 136 8,143 133 7,145 50 9,144 136 8)),((145 50 9,143 49 7,145 47 8,145 50 9)),((145 47 8,143 49 7,143 46 6,145 47 8)),((148 46 9,145 47 8,146 44 7,148 46 9)),((145 47 8,143 46 6,146 44 7,145 47 8)),((150 45 9,148 46 9,149 43 7,150 45 9)),((148 46 9,146 44 7,149 43 7,148 46 9)),((141 50 5,143 49 7,141 130 5,141 50 5)),((141 130 5,143 49 7,143 133 7,141 130 5)),((140 50 3,141 50 5,140 127 3,140 50 3)),((141 128 4,141 50 5,141 130 5,141 128 4)),((140 127 3,141 50 5,141 128 4,140 127 3)),((57 43 1,55 41 0,57 43 -1,57 43 1)),((57 43 1,57 43 -1,140 126 -1,57 43 1)),((140 126 1,57 43 1,140 126 0,140 126 1)),((140 126 0,57 43 1,140 126 -1,140 126 0)),((140 50 0,140 50 3,140 126 0,140 50 0)),((140 126 1,140 50 3,140 127 3,140 126 1)),((140 126 0,140 50 3,140 126 1,140 126 0)),((140 50 0,140 126 0,140 50 -3,140 50 0)),((140 50 -3,140 126 0,140 126 -1,140 50 -3)),((140 50 -3,140 126 -1,140 127 -3,140 50 -3)),((140 50 -3,140 127 -3,141 50 -5,140 50 -3)),((141 50 -5,140 127 -3,141 128 -4,141 50 -5)),((141 50 -5,141 128 -4,141 130 -5,141 50 -5)),((141 50 -5,141 130 -5,143 49 -7,141 50 -5)),((143 49 -7,141 130 -5,143 133 -7,143 49 -7)),((143 49 -7,143 133 -7,145 50 -9,143 49 -7)),((145 50 -9,143 133 -7,143 133 -7,145 50 -9)),((145 50 -9,143 133 -7,144 136 -8,145 50 -9)),((144 136 -8,145 138 -9,145 50 -9,144 136 -8)),((145 47 -8,143 49 -7,145 50 -9,145 47 -8)),((150 45 -9,148 46 -9,150 47 -10,150 45 -9)),((152 46 -9,150 45 -9,150 47 -10,152 46 -9)),((143 46 -6,143 49 -7,145 47 -8,143 46 -6)),((146 44 -7,143 46 -6,145 47 -8,146 44 -7)),((146 44 -7,145 47 -8,148 46 -9,146 44 -7)),((149 43 -7,146 44 -7,148 46 -9,149 43 -7)),((149 43 -7,148 46 -9,150 45 -9,149 43 -7)),((157 46 -6,155 47 -8,157 49 -7,157 46 -6)),((157 49 -7,155 47 -8,155 50 -9,157 49 -7)),((154 44 -7,152 46 -9,155 47 -8,154 44 -7)),((157 46 -6,154 44 -7,155 47 -8,157 46 -6)),((155 50 -9,155 150 -9,157 49 -7,155 50 -9)),((157 49 -7,155 150 -9,157 151 -7,157 49 -7)),((155 150 -9,155 153 -8,157 151 -7,155 150 -9)),((151 43 -7,150 45 -9,152 46 -9,151 43 -7)),((154 44 -7,151 43 -7,152 46 -9,154 44 -7)),((157 151 -7,155 153 -8,157 154 -6,157 151 -7)),((157 151 -7,157 154 -6,159 152 -4,157 151 -7)),((159 152 -4,157 154 -6,158 155 -3,159 152 -4)),((157 154 -6,156 157 -4,158 155 -3,157 154 -6)),((158 155 -3,156 157 -4,157 157 -1,158 155 -3)),((156 157 -4,154 159 -2,157 157 -1,156 157 -4)),((157 157 -1,154 159 -2,155 159 0,157 157 -1)),((157 157 -1,155 159 0,157 157 1,157 157 -1)),((159 155 0,157 157 -1,157 157 1,159 155 0)),((159 155 0,157 157 1,158 155 3,159 155 0)),((159 155 0,158 155 3,160 153 2,159 155 0)),((160 153 2,158 155 3,159 152 4,160 153 2)),((160 153 2,159 152 4,160 150 3,160 153 2)),((159 152 4,159 150 5,160 150 3,159 152 4)),((159 152 4,157 151 7,159 150 5,159 152 4)),((157 151 7,157 49 7,159 50 5,157 151 7)),((159 150 5,157 151 7,159 50 5,159 150 5)),((159 50 5,157 49 7,159 48 4,159 50 5)),((157 49 7,157 46 6,159 48 4,157 49 7)),((150 45 9,149 43 7,151 43 7,150 45 9)),((159 48 4,157 46 6,158 45 3,159 48 4)),((157 46 6,156 43 4,158 45 3,157 46 6)),((157 46 6,154 44 7,156 43 4,157 46 6)),((154 44 7,153 42 5,156 43 4,154 44 7)),((154 44 7,151 43 7,153 42 5,154 44 7)),((151 43 7,149 43 7,150 41 5,151 43 7)),((151 43 7,150 41 5,153 42 5,151 43 7)),((141 50 5,141 48 4,143 49 7,141 50 5)),((143 49 7,141 48 4,143 46 6,143 49 7)),((143 46 6,141 48 4,142 45 3,143 46 6)),((146 44 7,143 46 6,144 43 4,146 44 7)),((143 46 6,142 45 3,144 43 4,143 46 6)),((149 43 7,146 44 7,147 42 5,149 43 7)),((146 44 7,144 43 4,147 42 5,146 44 7)),((149 43 7,147 42 5,150 41 5,149 43 7)),((141 50 5,140 50 3,141 48 4,141 50 5)),((140 50 3,140 50 0,140 47 2,140 50 3)),((141 48 4,140 50 3,140 47 2,141 48 4)),((140 47 2,140 50 0,140 47 -2,140 47 2)),((140 47 -2,140 50 0,140 50 -3,140 47 -2)),((141 48 -4,140 50 -3,141 50 -5,141 48 -4)),((140 47 -2,140 50 -3,141 48 -4,140 47 -2)),((143 49 -7,141 48 -4,141 50 -5,143 49 -7)),((143 46 -6,141 48 -4,143 49 -7,143 46 -6)),((151 43 -7,149 43 -7,150 45 -9,151 43 -7)),((142 45 -3,141 48 -4,143 46 -6,142 45 -3)),((144 43 -4,142 45 -3,143 46 -6,144 43 -4)),((144 43 -4,143 46 -6,146 44 -7,144 43 -4)),((147 42 -5,144 43 -4,146 44 -7,147 42 -5)),((147 42 -5,146 44 -7,149 43 -7,147 42 -5)),((150 41 -5,149 43 -7,151 43 -7,150 41 -5)),((150 41 -5,147 42 -5,149 43 -7,150 41 -5)),((158 45 -3,157 46 -6,159 48 -4,158 45 -3)),((159 48 -4,157 46 -6,157 49 -7,159 48 -4)),((156 43 -4,154 44 -7,157 46 -6,156 43 -4)),((158 45 -3,156 43 -4,157 46 -6,158 45 -3)),((159 48 -4,157 49 -7,159 50 -5,159 48 -4)),((159 50 -5,157 49 -7,157 151 -7,159 50 -5)),((159 150 -5,159 50 -5,157 151 -7,159 150 -5)),((153 42 -5,151 43 -7,154 44 -7,153 42 -5)),((156 43 -4,153 42 -5,154 44 -7,156 43 -4)),((159 150 -5,157 151 -7,159 152 -4,159 150 -5)),((153 42 -5,150 41 -5,151 43 -7,153 42 -5)),((160 150 -3,159 150 -5,159 152 -4,160 150 -3)),((160 150 -3,159 152 -4,160 153 -2,160 150 -3)),((159 152 -4,158 155 -3,160 153 -2,159 152 -4)),((160 153 -2,158 155 -3,159 155 0,160 153 -2)),((158 155 -3,157 157 -1,159 155 0,158 155 -3)),((160 153 -2,159 155 0,160 153 2,160 153 -2)),((160 150 0,160 153 -2,160 153 2,160 150 0)),((160 150 0,160 153 2,160 150 3,160 150 0)),((159 150 5,159 50 5,160 50 3,159 150 5)),((160 150 3,159 150 5,160 50 3,160 150 3)),((160 150 3,160 50 3,160 50 0,160 150 3)),((160 150 0,160 150 3,160 50 0,160 150 0)),((160 50 3,159 50 5,159 48 4,160 50 3)),((160 50 3,159 48 4,160 47 2,160 50 3)),((159 48 4,158 45 3,160 47 2,159 48 4)),((160 47 2,158 45 3,159 45 0,160 47 2)),((158 45 3,157 43 1,159 45 0,158 45 3)),((158 45 3,156 43 4,157 43 1,158 45 3)),((156 43 4,154 41 2,157 43 1,156 43 4)),((156 43 4,153 42 5,154 41 2,156 43 4)),((153 42 5,152 40 3,154 41 2,153 42 5)),((153 42 5,150 41 5,152 40 3,153 42 5)),((150 41 5,147 42 5,148 40 3,150 41 5)),((150 41 5,148 40 3,152 40 3,150 41 5)),((141 48 4,140 47 2,142 45 3,141 48 4)),((142 45 3,140 47 2,141 45 0,142 45 3)),((144 43 4,142 45 3,143 43 1,144 43 4)),((142 45 3,141 45 0,143 43 1,142 45 3)),((147 42 5,144 43 4,146 41 2,147 42 5)),((144 43 4,143 43 1,146 41 2,144 43 4)),((147 42 5,146 41 2,148 40 3,147 42 5)),((140 47 2,140 47 -2,141 45 0,140 47 2)),((141 45 0,140 47 -2,142 45 -3,141 45 0)),((142 45 -3,140 47 -2,141 48 -4,142 45 -3)),((143 43 -1,141 45 0,142 45 -3,143 43 -1)),((143 43 -1,142 45 -3,144 43 -4,143 43 -1)),((146 41 -2,143 43 -1,144 43 -4,146 41 -2)),((146 41 -2,144 43 -4,147 42 -5,146 41 -2)),((148 40 -3,146 41 -2,147 42 -5,148 40 -3)),((148 40 -3,147 42 -5,150 41 -5,148 40 -3)),((152 40 -3,150 41 -5,153 42 -5,152 40 -3)),((152 40 -3,148 40 -3,150 41 -5,152 40 -3)),((159 45 0,158 45 -3,160 47 -2,159 45 0)),((160 47 -2,158 45 -3,159 48 -4,160 47 -2)),((157 43 -1,156 43 -4,158 45 -3,157 43 -1)),((159 45 0,157 43 -1,158 45 -3,159 45 0)),((160 47 -2,159 48 -4,160 50 -3,160 47 -2)),((159 48 -4,159 50 -5,160 50 -3,159 48 -4)),((154 41 -2,153 42 -5,156 43 -4,154 41 -2)),((157 43 -1,154 41 -2,156 43 -4,157 43 -1)),((160 50 -3,159 50 -5,159 150 -5,160 50 -3)),((160 150 -3,160 50 -3,159 150 -5,160 150 -3)),((154 41 -2,152 40 -3,153 42 -5,154 41 -2)),((160 50 0,160 50 -3,160 150 -3,160 50 0)),((160 150 0,160 50 0,160 150 -3,160 150 0)),((160 150 -3,160 153 -2,160 150 0,160 150 -3)),((160 50 3,160 47 2,160 50 0,160 50 3)),((160 50 0,160 47 -2,160 50 -3,160 50 0)),((160 47 2,160 47 -2,160 50 0,160 47 2)),((160 47 2,159 45 0,160 47 -2,160 47 2)),((157 43 1,157 43 -1,159 45 0,157 43 1)),((157 43 1,155 41 0,157 43 -1,157 43 1)),((157 43 1,154 41 2,155 41 0,157 43 1)),((154 41 2,153 40 0,155 41 0,154 41 2)),((154 41 2,152 40 3,153 40 0,154 41 2)),((152 40 3,148 40 3,150 40 0,152 40 3)),((152 40 3,150 40 0,153 40 0,152 40 3)),((148 40 3,146 41 2,147 40 0,148 40 3)),((148 40 3,147 40 0,150 40 0,148 40 3)),((143 43 1,141 45 0,143 43 -1,143 43 1)),((143 43 1,143 43 -1,145 41 0,143 43 1)),((146 41 2,143 43 1,145 41 0,146 41 2)),((146 41 2,145 41 0,147 40 0,146 41 2)),((145 41 0,143 43 -1,146 41 -2,145 41 0)),((147 40 0,145 41 0,146 41 -2,147 40 0)),((147 40 0,146 41 -2,148 40 -3,147 40 0)),((150 40 0,148 40 -3,152 40 -3,150 40 0)),((150 40 0,147 40 0,148 40 -3,150 40 0)),((153 40 0,152 40 -3,154 41 -2,153 40 0)),((153 40 0,150 40 0,152 40 -3,153 40 0)),((155 41 0,154 41 -2,157 43 -1,155 41 0)),((155 41 0,153 40 0,154 41 -2,155 41 0)))
A square buffer around the same line using 32 segments.
SELECT
'LINESTRING(50 50,150 150,150 50)'::geometry AS input_geometry,
CG_3DBuffer('LINESTRING(50 50,150 150,150 50)'::geometry, 10, 32, 2) AS buffer;LINESTRING(50 50,150 150,150 50) | POLYHEDRALSURFACE Z (((50 36 0,50 36 -2,140 126 -2,140 126 0,50 36 0)),((140 126 -2,50 36 -2,49 36 -4,141 128 -4,140 126 -2)),((141 128 -4,49 36 -4,49 37 -6,142 130 -6,141 128 -4)),((142 130 -6,49 37 -6,48 38 -7,143 133 -7,142 130 -6)),((143 133 -7,48 38 -7,47 39 -8,144 137 -8,143 133 -7)),((144 137 -8,47 39 -8,46 40 -9,146 141 -9,144 137 -8)),((146 141 -9,46 40 -9,44 42 -10,148 145 -10,146 141 -9)),((148 145 -10,44 42 -10,43 43 -10,150 150 -10,148 145 -10)),((150 150 -10,43 43 -10,42 44 -10,152 155 -10,150 150 -10)),((152 155 -10,42 44 -10,40 46 -9,154 159 -9,152 155 -10)),((154 159 -9,40 46 -9,39 47 -8,156 163 -8,154 159 -9)),((156 163 -8,39 47 -8,38 48 -7,157 167 -7,156 163 -8)),((157 167 -7,38 48 -7,37 49 -6,158 170 -6,157 167 -7)),((158 170 -6,37 49 -6,36 49 -4,159 172 -4,158 170 -6)),((159 172 -4,36 49 -4,36 50 -2,160 174 -2,159 172 -4)),((160 174 -2,36 50 -2,36 50 -1e-15,160 174 -1e-15,160 174 -2)),((160 174 -1e-15,36 50 -1e-15,36 50 2,160 174 2,160 174 -1e-15)),((160 174 2,36 50 2,36 49 4,159 172 4,160 174 2)),((159 172 4,36 49 4,37 49 6,158 170 6,159 172 4)),((158 170 6,37 49 6,38 48 7,157 167 7,158 170 6)),((157 167 7,38 48 7,39 47 8,156 163 8,157 167 7)),((156 163 8,39 47 8,40 46 9,154 159 9,156 163 8)),((154 159 9,40 46 9,42 44 10,152 155 10,154 159 9)),((152 155 10,42 44 10,43 43 10,150 150 10,152 155 10)),((150 150 10,43 43 10,44 42 10,148 145 10,150 150 10)),((148 145 10,44 42 10,46 40 9,146 141 9,148 145 10)),((146 141 9,46 40 9,47 39 8,144 137 8,146 141 9)),((144 137 8,47 39 8,48 38 7,143 133 7,144 137 8)),((143 133 7,48 38 7,49 37 6,142 130 6,143 133 7)),((142 130 6,49 37 6,49 36 4,141 128 4,142 130 6)),((141 128 4,49 36 4,50 36 2,140 126 2,141 128 4)),((50 36 0,140 126 0,140 126 2,50 36 2,50 36 0)),((140 126 0,140 126 -2,140 40 -2,140 40 0,140 126 0)),((140 40 -2,140 126 -2,141 128 -4,141 40 -4,140 40 -2)),((141 40 -4,141 128 -4,142 130 -6,142 40 -6,141 40 -4)),((142 40 -6,142 130 -6,143 133 -7,143 40 -7,142 40 -6)),((143 40 -7,143 133 -7,144 137 -8,144 40 -8,143 40 -7)),((144 40 -8,144 137 -8,146 141 -9,146 40 -9,144 40 -8)),((146 40 -9,146 141 -9,148 145 -10,148 40 -10,146 40 -9)),((148 40 -10,148 145 -10,150 150 -10,150 40 -10,148 40 -10)),((150 40 -10,150 150 -10,152 155 -10,152 40 -10,150 40 -10)),((152 40 -10,152 155 -10,154 159 -9,154 40 -9,152 40 -10)),((154 40 -9,154 159 -9,156 163 -8,156 40 -8,154 40 -9)),((156 40 -8,156 163 -8,157 167 -7,157 40 -7,156 40 -8)),((157 40 -7,157 167 -7,158 170 -6,158 40 -6,157 40 -7)),((158 40 -6,158 170 -6,159 172 -4,159 40 -4,158 40 -6)),((159 40 -4,159 172 -4,160 174 -2,160 40 -2,159 40 -4)),((160 40 -2,160 174 -2,160 174 -1e-15,160 40 -1e-15,160 40 -2)),((160 40 -1e-15,160 174 -1e-15,160 174 2,160 40 2,160 40 -1e-15)),((160 40 2,160 174 2,159 172 4,159 40 4,160 40 2)),((159 40 4,159 172 4,158 170 6,158 40 6,159 40 4)),((158 40 6,158 170 6,157 167 7,157 40 7,158 40 6)),((157 40 7,157 167 7,156 163 8,156 40 8,157 40 7)),((156 40 8,156 163 8,154 159 9,154 40 9,156 40 8)),((154 40 9,154 159 9,152 155 10,152 40 10,154 40 9)),((152 40 10,152 155 10,150 150 10,150 40 10,152 40 10)),((150 40 10,150 150 10,148 145 10,148 40 10,150 40 10)),((148 40 10,148 145 10,146 141 9,146 40 9,148 40 10)),((146 40 9,146 141 9,144 137 8,144 40 8,146 40 9)),((144 40 8,144 137 8,143 133 7,143 40 7,144 40 8)),((143 40 7,143 133 7,142 130 6,142 40 6,143 40 7)),((142 40 6,142 130 6,141 128 4,141 40 4,142 40 6)),((141 40 4,141 128 4,140 126 2,140 40 2,141 40 4)),((140 126 0,140 40 0,140 40 2,140 126 2,140 126 0)),((50 36 -2,50 36 0,50 36 2,49 36 4,49 37 6,48 38 7,47 39 8,46 40 9,44 42 10,43 43 10,42 44 10,40 46 9,39 47 8,38 48 7,37 49 6,36 49 4,36 50 2,36 50 -1e-15,36 50 -2,36 49 -4,37 49 -6,38 48 -7,39 47 -8,40 46 -9,42 44 -10,43 43 -10,44 42 -10,46 40 -9,47 39 -8,48 38 -7,49 37 -6,49 36 -4,50 36 -2)),((140 40 0,140 40 -2,141 40 -4,142 40 -6,143 40 -7,144 40 -8,146 40 -9,148 40 -10,150 40 -10,152 40 -10,154 40 -9,156 40 -8,157 40 -7,158 40 -6,159 40 -4,160 40 -2,160 40 -1e-15,160 40 2,159 40 4,158 40 6,157 40 7,156 40 8,154 40 9,152 40 10,150 40 10,148 40 10,146 40 9,144 40 8,143 40 7,142 40 6,141 40 4,140 40 2,140 40 0)))
CG_Rotate — Повертає геометрію на заданий кут навколо початку координат (0,0).
geometry CG_Rotate(geometry geom, float8 angle);
Повертає вхідну геометрію geom на angle радіан навколо точки початку координат (0,0). Поворот виконується у 2D-просторі; координати Z не змінюються. Позитивні кути повертають геометрію проти годинникової стрілки.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
SELECT CG_Rotate('LINESTRING(1 0,0 1)', pi()/2);LINESTRING(6.123233995736766e-17 1,-1 6.123233995736766e-17)
CG_2DRotate — Повертає геометрію на заданий кут навколо вказаної точки в 2D.
geometry CG_2DRotate(geometry geom, float8 angle, float8 cx, float8 cy);
Повертає вхідну геометрію geom на angle радіан навколо точки (cx, cy). Поворот виконується у 2D-просторі; координати Z ігноруються. Позитивні кути повертають геометрію проти годинникової стрілки.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
SELECT CG_2DRotate('POINT(1 0)', pi()/2, 1, 1);POINT(2 1)
CG_3DRotate — Обертає геометрію в 3D-просторі навколо вектора осі.
geometry CG_3DRotate(geometry geom, float8 angle, float8 ax, float8 ay, float8 az);
Повертає вхідну геометрію geom на angle радіан навколо осі, визначеної вектором (ax, ay, az), що проходить через початок координат (0,0,0).
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_3DRotate('POINT(1 0 0)', pi()/2, 0, 0, 1);POINT Z (6.123233995736766e-17 1 0)
CG_RotateX — Повертає геометрію навколо осі X на заданий кут.
geometry CG_RotateX(geometry geom, float8 angle);
Повертає вхідну геометрію geom на angle радіан навколо осі X.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_RotateX('POINT(0 1 0)', pi()/2);POINT Z (0 6.123233995736766e-17 1)
CG_RotateY — Повертає геометрію навколо осі Y на заданий кут.
geometry CG_RotateY(geometry geom, float8 angle);
Повертає вхідну геометрію geom на angle радіан навколо осі Y.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_RotateY('POINT(1 0 0)', pi()/2);POINT Z (6.123233995736766e-17 0 -1)
CG_RotateZ — Повертає геометрію навколо осі Z на заданий кут.
geometry CG_RotateZ(geometry geom, float8 angle);
Повертає вхідну геометрію geom на angle радіан навколо осі Z.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_RotateZ('POINT(1 0 0)', pi()/2);POINT Z (6.123233995736766e-17 1 0)
CG_Scale — Масштабує геометрію рівномірно у всіх вимірах за заданим коефіцієнтом.
geometry CG_Scale(geometry geom, float8 factor);
Масштабує вхідну геометрію geom за допомогою єдиного коефіцієнта масштабування factor у всіх вимірах (X, Y та Z). Масштабування виконується відносно точки початку координат (0,0,0).
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
SELECT CG_Scale('LINESTRING(1 1,2 2)', 2);LINESTRING(2 2,4 4)
CG_3DScale — Масштабує геометрію за окремими коефіцієнтами вздовж осей X, Y та Z.
geometry CG_3DScale(geometry geom, float8 factorX, float8 factorY, float8 factorZ);
Масштабує вхідну геометрію geom за допомогою різних коефіцієнтів вздовж осей X, Y та Z. Масштабування виконується відносно точки початку координат (0,0,0).
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_3DScale('POINT(1 1 1)', 2, 3, 4);POINT Z (2 3 4)
CG_3DScaleAroundCenter — Масштабує геометрію в 3D-просторі навколо вказаної центральної точки.
geometry CG_3DScaleAroundCenter(geometry geom, float8 factorX, float8 factorY, float8 factorZ, float8 centerX, float8 centerY, float8 centerZ);
Масштабує вхідну геометрію geom за допомогою різних коефіцієнтів вздовж осей X, Y і Z відносно вказаної центральної точки (centerX, centerY, centerZ).
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_3DScaleAroundCenter('POINT(2 2 2)', 0.5, 0.5, 0.5, 1, 1, 1);POINT Z (1.5 1.5 1.5)
CG_Translate — Перекладає (переміщує) геометрію на задані відступи в 2D-просторі.
geometry CG_Translate(geometry geom, float8 deltaX, float8 deltaY);
Перетворює вхідну геометрію geom, додаючи deltaX до координат X і deltaY до координат Y. Координати Z ігноруються.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
SELECT CG_Translate('LINESTRING(1 1,2 2)', 1, -1);LINESTRING(2 0,3 1)
CG_3DTranslate — Перекладає (переміщує) геометрію на задані відступи в 3D-просторі.
geometry CG_3DTranslate(geometry geom, float8 deltaX, float8 deltaY, float8 deltaZ);
Перетворює вхідну геометрію geom, додаючи deltaX до координат X, deltaY до координат Y і deltaZ до координат Z.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.0.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
SELECT CG_3DTranslate('POINT(1 1 1)', 1, -1, 2);POINT Z (2 0 3)
CG_Simplify — Зменшує складність геометрії, зберігаючи при цьому основні характеристики та значення Z/M.
geometry CG_Simplify(geometry geom, double precision threshold, boolean preserveTopology = false);
Спрощує геометрію за допомогою алгоритму спрощення SFCGAL, який зменшує кількість точок або вершин, зберігаючи при цьому основні характеристики геометрії. Ця функція зберігає значення Z і M під час спрощення.
Алгоритм базується на обмеженій триангуляції та використовує бібліотеку CGAL Polyline Simplification 2 з додатковою обробкою для збереження координат Z та M. Коли топологія зберігається, а геометрії перетинаються, значення Z та M інтерполюються в точках перетину.
Ця функція добре працює з геометрією, схожою на 3D-рельєф (2,5D), але не призначена для вертикальних поверхонь, таких як стіни.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.1.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
This function supports M coordinates.
geomВхідна геометрія
thresholdМаксимальний поріг відстані (в одиницях геометрії) для спрощення. Чим вище це значення, тим більш спрощеною буде отримана геометрія.
preserveTopologyЯкщо встановлено значення true, функція гарантує збереження топології геометрії. Коли геометрії перетинаються в цьому режимі, значення Z і M у точках перетину інтерполюються. Значення за замовчуванням — false.
Повертає спрощену геометрію із збереженими значеннями Z та M.
This example simplifies a polygon with a threshold of 0.5.
SELECT CG_Simplify(
'POLYGON((0 0,0 1,0.1 1,0.2 1,0.3 1,0.4 1,0.5 1,1 1,1 0,0 0))',
0.5
);POLYGON((0 0,0 1,1 1,1 0,0 0))
Preserving topology can keep additional support points in a mixed ZM collection.
SELECT CG_Simplify(
'GEOMETRYCOLLECTION ZM(
LINESTRING ZM(-1 -1 3 4,0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150),
POLYGON ZM((0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150,0 0 10 100))
)',
2,
false
);GEOMETRYCOLLECTION ZM (LINESTRING ZM (-1 -1 3 4,2 19 25 250,-4 20 15 150),POLYGON ZM ((0 0 10 100,2 19 25 250,-4 20 15 150,0 0 10 100)))
The topology-preserving variant keeps the shared anchor point at the collection intersection.
SELECT CG_Simplify(
'GEOMETRYCOLLECTION ZM(
LINESTRING ZM(-1 -1 3 4,0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150),
POLYGON ZM((0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150,0 0 10 100))
)',
2,
true
);GEOMETRYCOLLECTION ZM (LINESTRING ZM (-1 -1 3 4,0 0 10 100,2 19 25 250,-4 20 15 150),POLYGON ZM ((0 0 10 100,2 19 25 250,-4 20 15 150,0 0 10 100)))
Compare simplification with and without topology preservation, using a threshold of 50.
WITH data AS (
SELECT ST_GeomFromText('GEOMETRYCOLLECTION(
POLYGON((88.46 158.85,90.77 171.54,147.31 173.85,146.15 145,173.85 119.62,146.15 103.46,112.69 118.46,91.92 93.08,65.38 101.15,34.23 121.92,41.15 142.69,49.23 143.85,88.46 158.85)),
POLYGON((112.69 118.46,146.15 103.46,190 60.77,185.38 43.46,126.54 26.15,83.85 28.46,67.69 64.23,43.46 58.46,10 83.85,34.23 121.92,65.38 101.15,91.92 93.08,112.69 118.46)))
') AS geom
)
SELECT geom AS input_geometry,
CG_Simplify(geom, 50, true) AS topology_preserved,
CG_Simplify(geom, 50, false) AS topology_not_preserved
FROM data;GEOMETRYCOLLECTION(POLYGON((88.46 158.85,90.77 171.54,147.31 173.85,146.15 145,173.85 119.62,146.15 103.46,112.69 118.46,91.92 93.08,65.38 101.15,34.23 121.92,41.15 142.69,49.23 143.85,88.46 158.85)), POLYGON((112.69 118.46,146.15 103.46,190 60.77,185.38 43.46,126.54 26.15,83.85 28.46,67.69 64.23,43.46 58.46,10 83.85,34.23 121.92,65.38 101.15,91.92 93.08,112.69 118.46))) | GEOMETRYCOLLECTION(POLYGON((88.46 158.85,147.31 173.85,146.15 103.46,112.69 118.46,34.23 121.92,88.46 158.85)), POLYGON((112.69 118.46,146.15 103.46,185.38 43.46,10 83.85,34.23 121.92,112.69 118.46))) | GEOMETRYCOLLECTION(POLYGON((88.46 158.85,173.85 119.62,34.23 121.92,88.46 158.85)), POLYGON((112.69 118.46,190 60.77,10 83.85,112.69 118.46)))
CG_3DAlphaWrapping — Обчислює 3D-обгортку альфа, яка суворо охоплює геометрію.
geometry CG_3DAlphaWrapping(geometry geom, integer relative_alpha, integer relative_offset);
Обчислює 3D Alpha Wrapping точок у геометрії. Альфа-обгортання — це водонепроникна та орієнтована поверхнева сітка, яка суворо охоплює вхідні дані. Його можна розглядати як розширення або вдосконалення альфа-форми.
The relative_alpha parameter controls which features will appear in the output. It can have values from 0 to infinity. Higher relative_alpha values produce coarser wraps; lower values retain more detail.
The relative_offset parameter controls the tightness of the result. It can have values from 0 to infinity. If this parameter is set to 0, its value is automatically determined based on the relative_alpha parameter.
Доступність: 3.6.0 — вимагає SFCGAL >= 2.1.0
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
Wrap a tetrahedral surface and show the native 3D input beside the actual enclosing mesh.
WITH data AS (
SELECT 'POLYHEDRALSURFACE Z (
((0 0 0,4 0 0,0 4 0,0 0 0)),
((0 0 0,0 0 4,4 0 0,0 0 0)),
((0 0 0,0 4 0,0 0 4,0 0 0)),
((4 0 0,0 0 4,0 4 0,4 0 0))
)'::geometry AS input_geometry
)
SELECT input_geometry AS input_geometry,
CG_3DAlphaWrapping(input_geometry, 1)
AS wrapped_geometry
FROM data;POLYHEDRALSURFACE Z (((0 0 0,4 0 0,0 4 0,0 0 0)),((0 0 0,0 0 4,4 0 0,0 0 0)),((0 0 0,0 4 0,0 0 4,0 0 0)),((4 0 0,0 0 4,0 4 0,4 0 0))) | POLYHEDRALSURFACE Z (((-0.193 0.127 4,-0.035 -0.228 4.004,0.087 0.087 4.195,-0.193 0.127 4)),((0.083 0.082 3.801,0.087 0.087 4.195,-0.035 -0.228 4.004,0.083 0.082 3.801)),((0.087 0.087 4.195,0.083 0.082 3.801,-0.193 0.127 4,0.087 0.087 4.195)),((0.048 3.84 0.16,3.867 0.133 0.133,0.091 3.926 -0.199,0.048 3.84 0.16)),((3.92 0.08 -0.201,0.037 -0.007 -0.228,0.091 3.926 -0.199,3.92 0.08 -0.201)),((3.867 0.133 0.133,3.92 0.08 -0.201,0.091 3.926 -0.199,3.867 0.133 0.133)),((3.867 0.133 0.133,3.877 -0.195 0.012,4.228 -0.006 0.037,3.867 0.133 0.133)),((3.867 0.133 0.133,4.228 -0.006 0.037,3.92 0.08 -0.201,3.867 0.133 0.133)),((3.877 -0.195 0.012,3.92 0.08 -0.201,4.228 -0.006 0.037,3.877 -0.195 0.012)),((0.012 -0.196 0.121,-0.035 -0.228 4.004,-0.202 0.079 0.078,0.012 -0.196 0.121)),((-0.202 0.079 0.078,0.037 -0.007 -0.228,0.012 -0.196 0.121,-0.202 0.079 0.078)),((3.867 0.133 0.133,0.083 0.082 3.801,3.877 -0.195 0.012,3.867 0.133 0.133)),((0.091 3.926 -0.199,0.101 4.199 0.06,0.048 3.84 0.16,0.091 3.926 -0.199)),((0.101 4.199 0.06,-0.228 4.028 -0.021,0.048 3.84 0.16,0.101 4.199 0.06)),((0.091 3.926 -0.199,-0.228 4.028 -0.021,0.101 4.199 0.06,0.091 3.926 -0.199)),((3.867 0.133 0.133,0.048 3.84 0.16,0.083 0.082 3.801,3.867 0.133 0.133)),((3.877 -0.195 0.012,0.037 -0.007 -0.228,3.92 0.08 -0.201,3.877 -0.195 0.012)),((0.012 -0.196 0.121,0.037 -0.007 -0.228,3.877 -0.195 0.012,0.012 -0.196 0.121)),((0.083 0.082 3.801,0.048 3.84 0.16,-0.193 0.127 4,0.083 0.082 3.801)),((-0.228 4.028 -0.021,-0.193 0.127 4,0.048 3.84 0.16,-0.228 4.028 -0.021)),((-0.228 4.028 -0.021,-0.202 0.079 0.078,-0.193 0.127 4,-0.228 4.028 -0.021)),((-0.202 0.079 0.078,-0.035 -0.228 4.004,-0.193 0.127 4,-0.202 0.079 0.078)),((3.877 -0.195 0.012,0.083 0.082 3.801,-0.035 -0.228 4.004,3.877 -0.195 0.012)),((0.012 -0.196 0.121,3.877 -0.195 0.012,-0.035 -0.228 4.004,0.012 -0.196 0.121)),((0.091 3.926 -0.199,0.037 -0.007 -0.228,-0.228 4.028 -0.021,0.091 3.926 -0.199)),((-0.228 4.028 -0.021,0.037 -0.007 -0.228,-0.202 0.079 0.078,-0.228 4.028 -0.021)))
CG_NurbsCurveInterpolate — Creates an interpolating NURBS curve passing through all given data points
geometry CG_NurbsCurveInterpolate(geometry data_points, integer degree);
Creates a NURBS curve that interpolates through all provided data points. The resulting curve passes exactly through each point in the input geometry.
Parameters:
data_points - A LINESTRING geometry containing the points to interpolate through.
degree - Polynomial degree of the NURBS curve (typically 2 or 3).
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
Interpolate a degree-3 NURBS curve through four 2D points.
WITH data AS (
SELECT 'LINESTRING(0 0,2 5,5 3,8 1)'::geometry AS input_points
)
SELECT input_points AS input_points,
CG_NurbsCurveInterpolate(input_points, 3) AS interpolated_curve
FROM data;LINESTRING(0 0,2 5,5 3,8 1) | NURBSCURVE(DEGREE 3, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(-0.43 10.29),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(4.95 1.9),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(8 1),WEIGHT 1)),KNOTS (KNOT(0,4), KNOT(1,4)))
Interpolate a 3D degree-3 NURBS curve through the documented control points.
WITH data AS (
SELECT 'LINESTRING Z (0 0 0,2 5 2,5 3 1,8 1 0)'::geometry AS input_points
)
SELECT input_points AS input_points,
CG_NurbsCurveInterpolate(input_points, 3) AS interpolated_curve
FROM data;LINESTRING Z (0 0 0,2 5 2,5 3 1,8 1 0) | NURBSCURVE Z (DEGREE 3,CONTROLPOINTS Z (NURBSPOINT(WEIGHTEDPOINT Z (0 0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (-0.43 10.29 4.36),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (4.95 1.9 0.54),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (8 1 0),WEIGHT 1)),KNOTS (KNOT(0,4), KNOT(1,4)))
CG_NurbsCurveApproximate — Creates an approximating NURBS curve fitting data points within a tolerance
geometry CG_NurbsCurveApproximate(geometry data_points, integer degree, float8 tolerance, integer max_control_points=100);
Creates a NURBS curve that approximates the given data points within the specified tolerance. Unlike interpolation, the curve does not necessarily pass through all points but provides a smooth fit with fewer control points.
Parameters:
data_points - A LINESTRING geometry containing the points to approximate.
degree - Polynomial degree of the NURBS curve.
tolerance - Maximum allowed distance between the curve and data points.
max_control_points - Optional maximum number of control points (default: 100). Limits curve complexity.
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
Approximate noisy 2D data with a degree-2 curve and a tolerance of 0.5.
WITH data AS (
SELECT 'LINESTRING(0 0,1 2.1,2 1.9,3 3.2,4 2.8,5 1)'::geometry AS input_points
)
SELECT input_points AS input_points,
CG_NurbsCurveApproximate(input_points, 2, 0.5) AS approximated_curve
FROM data;LINESTRING(0 0,1 2.1,2 1.9,3 3.2,4 2.8,5 1) | NURBSCURVE(DEGREE 2, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(-0.05 2.64),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(2.24 1.65),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(2.79 3.48),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(4.84 2.43),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 1),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(0.35,1), KNOT(0.51,1), KNOT(0.68,1), KNOT(1,3)))
Approximate a 3D point set while preserving the Z dimension in the fitted curve.
WITH data AS (
SELECT 'LINESTRING Z (0 0 0,1 2 1,2 3 2,3 2 1,4 1 0,5 0 0)'::geometry AS input_points
)
SELECT input_points AS input_points,
CG_NurbsCurveApproximate(input_points, 3, 0.1) AS approximated_curve
FROM data;LINESTRING Z (0 0 0,1 2 1,2 3 2,3 2 1,4 1 0,5 0 0) | NURBSCURVE Z (DEGREE 3,CONTROLPOINTS Z (NURBSPOINT(WEIGHTEDPOINT Z (0 0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (0.18 -0.15 -1.29),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (1.49 4.36 3.35),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (3.33 1.33 0.38),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (4.34 0.83 -0.44),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (5 0 0),WEIGHT 1)),KNOTS (KNOT(0,4), KNOT(0.46,1), KNOT(0.64,1), KNOT(1,4)))
CG_NurbsCurveDerivative — Computes the derivative (tangent, curvature) of a NURBS curve at a given parameter
geometry CG_NurbsCurveDerivative(geometry nurbscurve, float8 parameter, integer derivative_order);
Computes the derivative of a NURBS curve at a specific parameter value. The derivative represents the rate of change at that point:
Order 1: Tangent vector (direction and speed)
Order 2: Curvature vector (how the tangent changes)
Order 3: Third-order derivative (supported maximum)
Parameters:
nurbscurve - A NURBS curve geometry.
parameter - Parameter value for evaluation (typically 0.0 to 1.0).
derivative_order - Order of derivative to compute (1, 2, or 3).
Returns a POINT geometry representing the derivative vector at the specified parameter.
Availability: 3.7.0 - requires SFCGAL >= 2.3.0.
This method needs SFCGAL backend.
This function supports 3d and will not drop the z-index.
The first derivative gives the tangent vector at the evaluation parameter.
WITH data AS (
SELECT 'NURBSCURVE (2, (0.00 0.00, 5.00 10.00, 10.00 0.00))'::geometry AS input_curve
)
SELECT input_curve AS input_curve,
CG_NurbsCurveDerivative(input_curve, 0.5, 1) AS tangent
FROM data;NURBSCURVE(DEGREE 2, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(1,3))) | POINT Z (10 0 0)
The second derivative exposes curvature change for a higher-degree curve.
WITH data AS (
SELECT 'NURBSCURVE (3, (0.00 0.00, 2.00 8.00, 5.00 5.00, 8.00 2.00, 10.00 0.00))'::geometry AS input_curve
)
SELECT input_curve AS input_curve,
CG_NurbsCurveDerivative(input_curve, 0.5, 2) AS curvature
FROM data;NURBSCURVE(DEGREE 3, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(2 8),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 5),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(8 2),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0),WEIGHT 1)),KNOTS (KNOT(0,4), KNOT(0.5,1), KNOT(1,4))) | POINT Z (9 -9 0)
The same derivative call also works for 3D NURBS curves.
WITH data AS (
SELECT 'NURBSCURVE Z (2, (0.00 0.00 0.00, 5.00 10.00 5.00, 10.00 0.00 0.00))'::geometry AS input_curve
)
SELECT input_curve AS input_curve,
CG_NurbsCurveDerivative(input_curve, 0.5, 1) AS tangent
FROM data;NURBSCURVE Z (DEGREE 2,CONTROLPOINTS Z (NURBSPOINT(WEIGHTEDPOINT Z (0 0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (5 10 5),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (10 0 0),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(1,3))) | POINT Z (10 0 0)
CG_3DIntersection.CG_3DDifference.CG_3DUnion.CG_Tesselate.CG_3DArea.CG_Extrude.CG_ForceLHR.CG_Orientation.CG_MinkowskiSum.CG_StraightSkeleton.CG_ApproximateMedialAxis.CG_IsPlanar.CG_Volume.CG_MakeSolid.CG_IsSolid.CG_ConstrainedDelaunayTriangles.CG_3DConvexHull.CG_AlphaShape.CG_OptimalAlphaShape.
These ST_ names remain available for compatibility and emit deprecation notices.
Their entries contain only the legacy signature and migration link. Use the corresponding
CG_ pages for behavior, examples, and geometry support details.
ST_3DIntersection — Deprecated alias for CG_3DIntersection.
geometry ST_3DIntersection(geometry geom1, geometry geom2);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_3DDifference — Deprecated alias for CG_3DDifference.
geometry ST_3DDifference(geometry geom1, geometry geom2);
![]() | |
|
Availability: 2.2.0
This method needs SFCGAL backend.
ST_3DUnion — Deprecated alias for CG_3DUnion.
geometry ST_3DUnion(geometry geom1, geometry geom2);
geometry ST_3DUnion(geometry set g1field);
![]() | |
|
Availability: 2.2.0
This method needs SFCGAL backend.
ST_Tesselate — Deprecated alias for CG_Tesselate.
geometry ST_Tesselate(geometry geom);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_3DArea — Deprecated alias for CG_3DArea.
floatST_3DArea(geometry geom1);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_Extrude — Deprecated alias for CG_Extrude.
geometry ST_Extrude(geometry geom, float x, float y, float z);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_ForceLHR — Deprecated alias for CG_ForceLHR.
geometry ST_ForceLHR(geometry geom);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_Orientation — Deprecated alias for CG_Orientation.
integer ST_Orientation(geometry geom);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_MinkowskiSum — Deprecated alias for CG_MinkowskiSum.
geometry ST_MinkowskiSum(geometry geom1, geometry geom2);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_StraightSkeleton — Deprecated alias for CG_StraightSkeleton.
geometry ST_StraightSkeleton(geometry geom);
![]() | |
|
Availability: 2.1.0
This method needs SFCGAL backend.
ST_ApproximateMedialAxis — Deprecated alias for CG_ApproximateMedialAxis.
geometry ST_ApproximateMedialAxis(geometry geom);
![]() | |
|
Availability: 2.2.0
This method needs SFCGAL backend.
ST_IsPlanar — Deprecated alias for CG_IsPlanar.
boolean ST_IsPlanar(geometry geom);
![]() | |
|
Availability: 2.2.0: This was documented in 2.1.0 but got accidentally left out in 2.1 release.
This method needs SFCGAL backend.
ST_Volume — Deprecated alias for CG_Volume.
float ST_Volume(geometry geom1);
![]() | |
|
Availability: 2.2.0
This method needs SFCGAL backend.
ST_MakeSolid — Deprecated alias for CG_MakeSolid.
geometry ST_MakeSolid(geometry geom1);
![]() | |
|
Availability: 2.2.0
This method needs SFCGAL backend.
ST_IsSolid — Deprecated alias for CG_IsSolid.
boolean ST_IsSolid(geometry geom1);
![]() | |
|
Availability: 2.2.0
This method needs SFCGAL backend.
ST_ConstrainedDelaunayTriangles — Deprecated alias for CG_ConstrainedDelaunayTriangles.
geometry ST_ConstrainedDelaunayTriangles(geometry g1);
![]() | |
|
Availability: 3.0.0
This method needs SFCGAL backend.
ST_3DConvexHull — Deprecated alias for CG_3DConvexHull.
geometry ST_3DConvexHull(geometry geom1);
![]() | |
|
Availability: 3.3.0
This method needs SFCGAL backend.
ST_AlphaShape — Deprecated alias for CG_AlphaShape.
geometry ST_AlphaShape(geometry geom,
float
alpha
,
boolean
allow_holes = false
);
![]() | |
|
This method needs SFCGAL backend.
ST_OptimalAlphaShape — Deprecated alias for CG_OptimalAlphaShape.
geometry ST_OptimalAlphaShape(geometry geom,
boolean
allow_holes = false
,
integer
nb_components = 1
);
![]() | |
|
Availability: 3.3.0 - requires SFCGAL >= 1.4.1.
This method needs SFCGAL backend.
Типи та функції топології PostGIS використовуються для управління топологічними об'єктами, такими як грані, ребра та вузли.
Презентація Сандро Сантіллі на конференції PostGIS Day Paris 2011 містить хороший огляд топології PostGIS та її перспектив Топологія з PostGIS 2.0, презентація.
Вінсент Пікавет надає хороший огляд та узагальнення того, що таке топологія, як вона використовується, а також різних інструментів FOSS4G, які її підтримують, у PostGIS Topology PGConf EU 2012.
An example of a topologically based GIS database is the US Census Topologically Integrated Geographic Encoding and Referencing System (TIGER) database. If you want to experiment with PostGIS topology and need some data.
Модуль топології PostGIS існує вже давно, але не завжди був частиною офіційної документації. В результаті масштабного очищення були видалені застарілі функції, виправлені відомі проблеми з користувацькою зручністю, задокументовані можливості та функції, додані нові функції та покращено відповідність SQL-MM.
This chapter is the maintained reference for the topology module, including its primitive tables, TopoGeometry type, topology management functions, editing functions, validation functions, and conversion helpers.
Усі функції та таблиці, пов'язані з цим модулем, встановлюються у схемі під назвою topology.
Функції, які визначені в стандарті SQL/MM, мають префікс ST_, а функції, специфічні для PostGIS, не мають префікса.
Підтримка топології вбудована за замовчуванням і може бути вимкнена шляхом вказання опції конфігурації --without-topology під час компіляції, як описано в Розділ 2, Встановлення PostGIS
Основні примітиви будь-якої топології зберігаються в таблицях edge_data, node та face, які знаходяться в схемі, створеній за допомогою CreateTopology. Кожен рядок таблиці edge_data представляє орієнтовану грань: він записує спрямовану криву від start_node до end_node разом з ідентифікатором грані, що зустрічається зліва від цього напрямку (left_face), та грані, що зустрічається справа (right_face). Таким чином, один і той самий геометричний сегмент може з'являтися двічі — по одному разу для кожного напрямку — якщо він належить до двох граней.
Стовпці next_left_edge та next_right_edge доповнюють цю інформацію про орієнтацію, кодуючи спосіб продовження руху навколо грані. Вони зберігають цілочисельні значення зі знаком, абсолютна величина яких є ідентифікатором наступної орієнтованої грані, а знак визначає, чи слід дотримуватися збереженої орієнтації без змін, чи слід її змінити на протилежну під час проходження. Формально для кожної ребра e діють такі правила:
abs(next_left_edge) — це ідентифікатор ребра, до якого можна дістатися, продовжуючи рух навколо грані, що лежить ліворуч від e. Якщо значення є додатним, проходження продовжується від кінцевого вузла e вздовж збереженої орієнтації посилального ребра; якщо воно є від'ємним, посилальне ребро необхідно пройти назад, щоб спільна грань залишалася ліворуч від об'єкта проходження.
abs(next_right_edge) аналогічно слідує за межею грані, розташованої праворуч від e. Позитивне значення означає, що наступна грань береться з її записаною орієнтацією, починаючи з кінцевого вузла e, тоді як негативне значення вказує на необхідність проходження по вказаній грані у зворотному напрямку, починаючи з її кінцевого вузла, щоб зберегти праву грань.
Значення нуль вказує на те, що ребро звисає з відповідного боку (наприклад, ізольоване ребро, дотична грань якого є універсальною гранью 0). Стовпці abs_next_left_edge та abs_next_right_edge, що відображаються у вигляді edge, є зручними проекціями цих абсолютних значень.
Ця репрезентація є варіантом подвійно зв'язаного списку ребер і використовується багатьма топологічними процедурами. Такі функції, як GetRingEdges та ValidateTopology, покладаються на неї для відновлення меж граней та діагностики невідповідностей — звідси і діагностичні повідомлення «invalid next_left_edge» та «invalid next_right_edge», що з'являються під час перевірки. Конструктори, такі як AddEdge, ініціалізують атрибути next_* з тривіальними самопосиланнями, тоді як процедури редагування, включаючи ST_AddEdgeModFace та ST_RemEdgeModFace, оновлюють посилання під час вставлення або видалення ребер. Інші масові операції (наприклад, Polygonize) можуть навмисно залишати поля невизначеними, тому в документації їхня поведінка чітко позначена.
У цьому розділі перелічено типи даних PostgreSQL, встановлені PostGIS Topology. Зверніть увагу, що ми описуємо поведінку цих типів при перетворенні, що є дуже важливим, особливо при розробці власних функцій.
ValidateTopology.getfaceedges_returntype — Комбінований тип, що складається з порядкового номера та номера ребра.
Композитний тип, що складається з порядкового номера та номера ребра. Це тип повернення для функцій ST_GetFaceEdges та GetNodeEdges.
sequence integer: Посилається на топологію, визначену в таблиці topology.topology, яка визначає схему топології та srid.
edge integer: ідентифікатор ребра.
TopoGeometry — Композитний тип, що представляє топологічно визначену геометрію.
Композитний тип, що посилається на геометрію топології в конкретному шарі топології, має конкретний тип і конкретний ідентифікатор. Елементами TopoGeometry є властивості: topology_id, layer_id, id integer, type integer.
topology_id integer: Посилається на топологію, визначену в таблиці topology.topology, яка визначає схему топології та srid.
layer_id integer: layer_id у таблиці шарів, до якої належить TopoGeometry. Поєднання topology_id та layer_id забезпечує унікальне посилання в таблиці topology.layers.
id integer: id — це автоматично згенерований порядковий номер, який однозначно визначає топогеометрію у відповідному шарі топології.
type integer від 1 до 4, що визначає тип геометрії: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection
У цьому розділі перелічено автоматичні та явні приведення типів, дозволені для цього типу даних
| Приведення типів в | Поведінка |
|---|---|
| geometry | автоматичне |
validatetopology_returntype — Комбінований тип, що складається з повідомлення про помилку та ідентифікаторів id1 та id2 для позначення місця помилки. Це тип повернення для ValidateTopology.
Композитний тип, що складається з повідомлення про помилку та двох цілих чисел. Функція ValidateTopology повертає набір таких елементів для позначення помилок перевірки, а також ідентифікатори id1 та id2 для позначення ідентифікаторів об'єктів топології, пов'язаних із помилкою.
| Field | Type | Description |
|---|---|---|
error | varchar |
Denotes the type of error. Current error descriptors are: coincident nodes, edge crosses node, edge not simple, edge end node geometry mismatch, edge start node geometry mismatch, face overlaps face, face within face. |
id1 | integer | Denotes the identifier of the edge, face, or node in error. |
id2 | integer | For errors that involve two objects, denotes the secondary edge or node. |
У цьому розділі перелічено домени PostgreSQL, встановлені PostGIS Topology. Домени можна використовувати як типи об'єктів, наприклад, як об'єкти, що повертаються функціями, або стовпці таблиць. Відмінність домену від типу полягає в тому, що домен — це існуючий тип, до якого прив'язано обмеження перевірки.
TopoElement — Масив із 2 цілих чисел, що зазвичай використовується для ідентифікації компонента TopoGeometry.
Масив із 2 цілих чисел, що використовується для представлення одного компонента простого або ієрархічного TopoGeometry.
У випадку простої TopoGeometry перший елемент масиву представляє ідентифікатор топологічного примітиву, а другий елемент представляє його тип (1:вузол, 2:ребро, 3:грань). У випадку ієрархічної TopoGeometry перший елемент масиву представляє ідентифікатор дочірньої TopoGeometry, а другий елемент представляє ідентифікатор її шару.
![]() | |
Для будь-якої ієрархічної TopoGeometry всі дочірні елементи TopoGeometry будуть походити з того самого дочірнього шару, як зазначено в записі topology.layer для шару TopoGeometry, що визначається. |
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}
This example shows what happens when casting a three-element array to topology.topoelement. The domain requires a two-element array, so the dimension check fails.
SELECT ARRAY[1, 2, 3]::topology.topoelement;
ERROR: value for domain topology.topoelement violates check constraint "dimensions"
TopoElementArray — Масив об'єктів TopoElement.
Масив з 1 або більше об'єктів TopoElement, який зазвичай використовується для передачі компонентів об'єктів TopoGeometry.
SELECT '{{1,2},{4,3}}'::topology.topoelementarray AS tea;{{1,2},{4,3}}This is the more verbose equivalent.
SELECT ARRAY[ARRAY[1, 2], ARRAY[4, 3]]::topology.topoelementarray AS tea;
{{1,2},{4,3}}This example uses the array aggregate function packaged with topology.
SELECT topology.TopoElementArray_Agg(ARRAY[e, t] ORDER BY e, t) As tea
FROM generate_series(1, 4) As e CROSS JOIN generate_series(1, 3) As t;
{{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3},{4,1},{4,2},{4,3}}SELECT '{{1,2,4},{3,4,5}}'::topology.topoelementarray AS tea;ERROR: value for domain topology.topoelementarray violates check constraint "dimensions"
У цьому розділі перелічено функції топології для створення нових схем топології, перевірки топологій та управління стовпцями TopoGeometry
table_name у схемі schema_name та скасовує реєстрацію стовпців у таблиці topology.layer.AddTopoGeometryColumn — Додає стовпець топогеометрії до існуючої таблиці, реєструє цей новий стовпець як шар у topology.layer і повертає новий layer_id.
integer AddTopoGeometryColumn(name topology_name, name schema_name, name table_name, name column_name, varchar feature_type, integer child_layer);
integer AddTopoGeometryColumn(name topology_name, regclass tab, name column_name, integer layer_id, varchar feature_type, integer child_layer);
Кожен об'єкт TopoGeometry належить до певного шару певної топології. Перед створенням об'єкта TopoGeometry потрібно створити його TopologyLayer. Топологічний шар — це зв'язок таблиці об'єктів з топологією. Він також містить інформацію про тип та ієрархію. Ми створюємо шар за допомогою функції AddTopoGeometryColumn():
Ця функція додасть запитуваний стовпець до таблиці та додасть запис до таблиці topology.layer з усією наданою інформацією.
Якщо ви не вкажете [child_layer] (або встановите його значення NULL), цей шар буде містити базові топогеометрії (складені з примітивних топологічних елементів). В іншому випадку цей шар буде містити ієрархічні топогеометрії (складені з топогеометрій з child_layer).
Після створення шару (його ідентифікатор повертається функцією AddTopoGeometryColumn) ви готові до побудови об'єктів TopoGeometry в ньому
Дійсні feature_types: POINT, MULTIPOINT, LINE, MULTILINE, POLYGON, MULTIPOLYGON, COLLECTION
Доступність: 1.1
This example creates the new table in the ma_topo schema. The table could be created 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');
DropTopoGeometryColumn, toTopoGeom, CreateTopology, CreateTopoGeom
RenameTopoGeometryColumn — Перейменовує стовпець топогеометрії
topology.layer RenameTopoGeometryColumn(regclass layer_table, name feature_column, name new_name);
Ця функція змінює назву існуючого стовпця TopoGeometry, забезпечуючи відповідне оновлення метаданих про нього.
Доступність: 3.4.0
SELECT topology.RenameTopoGeometryColumn('public.parcels', 'topogeom', 'tgeom');DropTopology — Використовуйте з обережністю: видаляє схему топології та її посилання з таблиці topology.topology, а також посилання на таблиці в цій схемі з таблиці geometry_columns.
integer DropTopology(varchar topology_schema_name);
Видаляє схему топології та її посилання з таблиці topology.topology, а також посилання на таблиці в цій схемі з таблиці geometry_columns. Цю функцію слід ВИКОРИСТОВУВАТИ З ОБЕРЕЖНІСТЮ, оскільки вона може знищити важливі для вас дані. Якщо схема не існує, вона просто видаляє записи посилань на вказану схему.
Доступність: 1.1
Cascade видаляє схему ma_topo та всі посилання на неї в topology.topology та geometry_columns.
SELECT topology.DropTopology('ma_topo');RenameTopology — Перейменовує топологію
varchar RenameTopology(varchar old_name, varchar new_name);
Перейменовує схему топології, оновлюючи запис метаданих у таблиці topology.topology.
Доступність: 3.4.0
Перейменуйте топологію з topo_stage на topo_prod.
SELECT topology.RenameTopology('topo_stage', 'topo_prod');DropTopoGeometryColumn — Видаляє стовпець топогеометрії з таблиці з назвою table_name у схемі schema_name та скасовує реєстрацію стовпців у таблиці topology.layer.
text DropTopoGeometryColumn(varchar schema_name, varchar table_name, varchar column_name);
Видаляє стовпець топогеометрії з таблиці з назвою table_name у схемі schema_name та скасовує реєстрацію стовпців у таблиці topology.layer. Повертає підсумок стану видалення. ПРИМІТКА: перед видаленням спочатку встановлює всі значення на NULL, щоб обійти перевірки цілісності посилань.
Доступність: 1.1
SELECT topology.DropTopoGeometryColumn('ma_topo', 'parcel_topo', 'topo');FixCorruptTopoGeometryColumn — Виправлено пошкодження топогеометрії, спричинене оновленням до postgis_topology 3.6.0 та вище
text FixCorruptTopoGeometryColumn(name layerSchema, name layerTable, name layerColumn );
При оновленні топології PostGIS <3.6.0 до версії >3.6.0+ було змінено визначення стовпця topogeometry. Це спричинило пошкодження топогеометрій, створених до оновлення. Ця функція виправляє це пошкодження в уражених таблицях.
The function refuses to process tables with expression or partial indexes; drop or rebuild those indexes manually around the repair.
Доступність: 3.6.1
Виправити всі стовпці топології
SELECT topology.FixCorruptTopoGeometryColumn(schema_name, table_name, feature_column)
FROM topology.layer;
Populate_Topology_Layer — Додає відсутні записи до таблиці topology.layer, зчитуючи метадані з таблиць topo.
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');createtopology
----------------
1
(1 row)
CREATE SCHEMA
CREATE TABLE
addtopogeometrycolumn
-----------------------
1
(1 row)This query returns no records because the feature is already registered.
SELECT * FROM topology.Populate_Topology_Layer();
(0 rows)
Rebuild the topology layer catalog.
TRUNCATE TABLE topology.layer;
TRUNCATE TABLE
SELECT * FROM topology.Populate_Topology_Layer();
schema_name | table_name | feature_column -------------+------------+---------------- strk | parcels | topo (1 row)
SELECT topology_id, layer_id,
schema_name AS sn, table_name AS tn, feature_column AS fc
FROM topology.layer;topology_id | layer_id | sn | tn | fc
-------------+----------+------+---------+------
1 | 1 | strk | parcels | topo
(1 row)TopologySummary — Бере ім'я топології та надає підсумкові суми типів об'єктів у топології.
text TopologySummary(varchar topology_schema_name);
Бере ім'я топології та надає підсумкові суми типів об'єктів у топології.
Доступність: 2.0.0
SELECT topology.TopologySummary('city_data');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 — Повертає набір об'єктів validated_topology_returntype, що детально описують проблеми з топологією.
setof validatetopology_returntype ValidateTopology(varchar toponame, geometry bbox);
Повертає набір об'єктів validatetopology_returntype, що детально описують проблеми з топологією, за бажанням обмежуючи перевірку областю, вказаною параметром bbox.
Нижче наведено перелік можливих помилок, їх значення та значення повернених ідентифікаторів:
| Error | id1 | id2 | Meaning |
|---|---|---|---|
| coincident nodes | Ідентифікатор першого вузла. | Ідентифікатор другого вузла. | Два вузли мають однакову геометрію. |
| edge crosses node | Ідентифікатор ребра. | Ідентифікатор вузла. | Ребро має вузол у своїй внутрішній частині. Див. ST_Relate. |
| invalid edge | Ідентифікатор ребра. | Геометрія ребра недійсна. Див. ST_IsValid. | |
| edge not simple | Ідентифікатор ребра. | Геометрія ребра має самоперетини. Див. ST_IsSimple. | |
| edge crosses edge | Ідентифікатор першого ребра. | Ідентифікатор другого ребра. | Дві ребра мають внутрішнє перетин. Див. ST_Relate. |
| edge start node geometry mismatch | Ідентифікатор ребра. | Ідентифікатор вказаного початкового вузла. | Геометрія вузла, вказаного як початковий вузол для ребра, не відповідає першій точці геометрії ребра. Див. ST_StartPoint. |
| edge end node geometry mismatch | Ідентифікатор ребра. | Ідентифікатор вказаного кінцевого вузла. | Геометрія вузла, вказаного як кінцевий вузол для ребра, не відповідає останній точці геометрії ребра. Див. ST_EndPoint. |
| face without edges | Ідентифікатор "осиротілої" грані. | Жодне ребро не повідомляє про наявність грані з будь-якого боку (left_face, right_face). | |
| face has no rings | Ідентифікатор частково визначеної грані. | Ребра, що утворюють грань на своїх боках, не утворюють кільця. | |
| face has wrong mbr | Ідентифікатор грані з неправильним кешем mbr. | Мінімальна обмежувальна рамка грані не збігається з мінімальною обмежувальною рамкою сукупності ребер, що утворюють грань по своїх сторонах. | |
| hole not in advertised face | Підписаний ідентифікатор ребра, що ідентифікує кільце. Див. GetRingEdges. | Кільце ребер, що утворюють грань на зовнішній поверхні, міститься в іншій грані. | |
| not-isolated node has not- containing_face | Ідентифікатор неправильно визначеного вузла. | Вузол, який повідомляється як такий, що знаходиться на межі одного або декількох ребер, вказує на вмістну грань. | |
| isolated node has containing_face | Ідентифікатор неправильно визначеного вузла. | Вузол, який не вказаний як такий, що знаходиться на межі будь-яких ребер, не має позначення грані, що його містить. | |
| isolated node has wrong containing_face | Ідентифікатор неправильно представленого вузла. | Вузол, який не вказаний як такий, що знаходиться на межі будь-яких ребер, вказує на грань, що його містить, яка не є фактичною гранью, що його містить. Див. GetFaceContainingPoint. | |
| invalid next_right_edge | Ідентифікатор неправильно представленого ребра. | Підписаний ідентифікатор ребра, яке слід вказати як наступне праве ребро. | Ребро, позначене як наступне ребро, на яке натрапляєш, рухаючись праворуч від ребра, є неправильним. |
| invalid next_left_edge | Ідентифікатор неправильно представленого ребра. | Підписаний ідентифікатор ребра, яке слід вказати як наступне ліве ребро. | Ребро, вказане як наступне ребро, на яке натрапляєш, рухаючись лівою стороною ребра, є неправильним. |
| mixed face labeling in ring | Підписаний ідентифікатор ребра, що ідентифікує кільце. Див. GetRingEdges. | Ребра в кільці позначають конфліктуючі грані на стороні ходіння. Це також називається "конфліктом розташування сторін". | |
| non-closed ring | Підписаний ідентифікатор ребра, що ідентифікує кільце. Див. GetRingEdges. | Кільце ребер, утворене атрибутами next_left_edge/next_right_edge, починається і закінчується на різних вузлах. | |
| face has multiple shells | Ідентифікатор грані, що є предметом суперечки. | Підписаний ідентифікатор ребра, що ідентифікує кільце. Див. GetRingEdges. | Більше ніж одне кільце ребер вказує на ту саму грань всередині. |
Доступність: 1.0.0
Покращено: 2.0.0 більш ефективне виявлення перетину ребер та виправлення помилок, що були присутні в попередніх версіях.
Змінено: 2.2.0 значення id1 та id2 були поміняні місцями для "перетину ребер вузлом" з метою узгодження з описом помилки.
Змінено: 3.2.0 додано опційний параметр bbox, виконується перевірка маркування ребер та з'єднання ребер.
SELECT * FROM topology.ValidateTopology('ma_topo');error | id1 | id2 -------------------+-----+----- face without edges | 1 |
ValidateTopologyRelation — Повертає інформацію про недійсні записи топологічних відносин
setof record ValidateTopologyRelation(varchar toponame);
Повертає набір записів, що містять інформацію про недійсні елементи в таблиці відносин топології.
Доступність: 3.2.0
ValidateTopologyPrecision — Повертає неточні вершини в топології.
geometry ValidateTopologyPrecision(name toponame, geometry bbox, float8 gridSize);
Повертає всі вершини, які не округлені до топології або задані gridSize як точкова геометрія, опціонально обмежуючи перевірку областю, заданою параметром bbox.
Доступність: 3.6.0
SELECT g
FROM topology.ValidateTopologyPrecision(
'city_data',
gridSize =
> 2,
bbox =
> ST_MakeEnvelope(0, 0, 20, 20)
) g;MULTIPOINT(9 6,9 14)
MakeTopologyPrecise — Прив'язати вершини топології до сітки з високою точністю.
void MakeTopologyPrecise(name toponame, geometry bbox, float8 gridSize);
Прив'язує всі вершини топології до сітки точності топології або до сітки, розмір якої вказано параметром gridSize, за бажанням обмежуючи операцію об'єктами, що перетинають область, вказану параметром bbox.
Using a gridSize larger than the smallest edge extent raises an exception rather than collapsing the edge into an empty geometry. This safeguards adjacent topological relationships by preventing precision snapping from removing primitives altogether.
![]() | |
При використанні функції "Прив'язати" топологія може стати недійсною, тому рекомендується перевірити результат операції за допомогою ValidateTopology. |
Доступність: 3.6.0
SELECT topology.MakeTopologyPrecise(
'city_data',
gridSize =
> 2
);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);
Приймає ідентифікатор топології або ідентифікатор об'єкта, пов'язаного з топологією, і повертає запис топології.
Доступність: 3.2.0
SELECT name(FindTopology('features.land_parcels', 'feature'));city_data
FindLayer — Повертає запис topology.layer різними способами.
topology.layer FindLayer(topogeometry tg);
topology.layer FindLayer(regclass layer_table, name feature_column);
topology.layer FindLayer(name schema_name, name table_name, name feature_column);
topology.layer FindLayer(integer topology_id, integer layer_id);
Приймає ідентифікатор шару або ідентифікатор об'єкта, пов'язаного з топологією, і повертає запис topology.layer.
Доступність: 3.2.0
SELECT layer_id(FindLayer('features.land_parcels', 'feature'));1
TotalTopologySize — Загальний обсяг дискового простору, використовуваний зазначеною топологією, включаючи всі індекси та дані TOAST.
int8 TotalTopologySize(name toponame);
Приймає ім'я топології та надає загальний обсяг дискового простору, зайнятого всіма її таблицями, включаючи індекси та дані TOAST.
Доступність: 3.6.0
SELECT topology.TopologySummary('city_data');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
UpgradeTopology — Оновлює вказану топологію для підтримки великих ідентифікаторів (int8) для топології та примітивних ідентифікаторів.
void UpgradeTopology(name toponame);
Бере ім'я топології та оновлює його для підтримки великих ідентифікаторів (int8) для топології та примітивних ідентифікаторів. Функція оновлює наступне: - face (стовпець face_id з int4 до int8, face_id_seq з int4 до int8) - node (стовпець node_id з int4 до int8, столпець containing_face з int4 до int8, node_id_seq з int4 до int8) - edge_data (стовпець edge_id з int4 до int8, edge_data_edge_id_seq з int4 до int8, стовпці left_face та right_face з int4 до int8, стовпці start_node та end_node з int4 до int8, стовпці next_left_edge та next_right_edge з int4 до int8) - relation (стовпець topogeo_id з int4 до int8, element_id з int4 до int8) - topology (стовпець useslargeids встановлено на true)
Доступність: 3.6.0
SELECT topology.UpgradeTopology('city_data');У цьому розділі розглядається управління статистикою бази даних під час побудови топології.
Додавання елементів до топології викликає багато запитів до бази даних для пошуку існуючих ребер, які будуть розділені, додавання вузлів та оновлення ребер, які будуть з'єднані з новою лінією. З цієї причини корисно, щоб статистичні дані про дані в таблицях топології були актуальними.
Функції заповнення та редагування топології PostGIS не оновлюють статистику автоматично, оскільки оновлення статистики після кожної зміни в топології було б надмірним, тому це обов'язок того, хто викликає функцію.
![]() | |
Статистика, оновлена за допомогою autovacuum, НЕ буде видима для транзакцій, які були запущені до завершення процесу autovacuum, тому для використання оновленої статистики довготривалі транзакції повинні самостійно виконати ANALYZE. |
У цьому розділі описано функції топології для створення нових топологій.
CreateTopology — Створює нову схему топології та реєструє її в таблиці topology.topology.
integer CreateTopology(name topology_schema_name, integer srid, double precision prec=0, boolean hasz=false, integer topoid=0, boolean useslargeids=false);
Створює нову схему топології з іменем topology_name і реєструє її в таблиці topology.topology. Топології повинні мати унікальні імена. Таблиці топологій (edge_data, face, node та relation створюються в схемі. Повертає ідентифікатор топології.
srid — це SRID просторової системи координат для топології. Якщо SRID не вказано, за замовчуванням використовується значення -1 (невідомо).
Допуск prec вимірюється в одиницях просторової системи відліку. За замовчуванням допуск дорівнює 0.
hasz за замовчуванням має значення false, якщо не вказано інше.
topoid необов'язковий явний ідентифікатор (дозволяє детерміновано присвоювати ідентифікатори топології, повинен бути унікальним)
useslargeids необов'язковий, за замовчуванням false. Якщо true, то топологія буде створена для підтримки великих ідентифікаторів (int8) для топології та примітивних ідентифікаторів.
Це схоже на SQL/MM ST_InitTopoGeo, але має більше функціональних можливостей.
Доступність: 1.1
Покращено: у версії 2.0 додано підтримку hasZ.
Покращено: у версії 3.6.0 додано параметри topoid та usesLargeIDs.
Створіть схему топології під назвою ma_topo, яка зберігає ребра та вузли в системі координат Massachusetts State Plane-meters (SRID = 26986). Допуск становить 0,5 метра, оскільки система просторових координат базується на метрах.
SELECT topology.CreateTopology('ma_topo', 26986, 0.5);Створіть топологію для Род-Айленду під назвою ri_topo у системі просторових координат State Plane-feet (SRID = 3438)
SELECT topology.CreateTopology('ri_topo', 3438) AS topoid;2
CopyTopology — Створює копію топології (вузлів, ребер, граней, шарів і TopoGeometries) у новій схемі
integer CopyTopology(varchar existing_topology_name, varchar new_name);
Створює нову топологію з назвою new_name, з SRID і точністю, скопійованими з existing_topology_name. Вузли, ребра та грані в existing_topology_name копіюються в нову топологію, а також шари та пов'язані з ними TopoGeometries.
![]() | |
Нові рядки в таблиці |
Доступність: 2.0.0
Створіть резервну копію топології під назвою ma_topo.
SELECT topology.CopyTopology('ma_topo', 'ma_topo_backup');ST_InitTopoGeo — Створює нову схему топології та реєструє її в таблиці topology.topology.
text ST_InitTopoGeo(varchar topology_schema_name);
Це еквівалент SQL-MM для CreateTopology. У ньому відсутні параметри для просторової системи координат і допуску. Він повертає текстовий опис створення топології замість ідентифікатора топології.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM 3 Topo-Geo and Topo-Net 3: Routine Details: X.3.17
SELECT topology.ST_InitTopoGeo('topo_schema_to_create') AS topocreation;Topology-Geometry 'topo_schema_to_create' (id:7) created.
ST_CreateTopoGeo — Додає колекцію геометрій до заданої порожньої топології та повертає повідомлення з детальною інформацією про успішність операції.
text ST_CreateTopoGeo(varchar atopology, geometry acollection);
Додає колекцію геометрій до заданої порожньої топології та повертає повідомлення з детальною інформацією про успішність виконання.
Корисно для заповнення порожньої топології.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo and Topo-Net 3: Routine Details -- X.3.18
Populate the 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) );
Topology ri_topo populated
Create the tables and topogeometries.
CREATE TABLE ri.roads(gid serial PRIMARY KEY, road_name text);
SELECT topology.AddTopoGeometryColumn('ri_topo', 'ri', 'roads', 'topo', 'LINE');TopoGeo_AddPoint — Додає точку до існуючої топології, використовуючи допуск і, можливо, розділяючи існуюче ребро.
bigint TopoGeo_AddPoint(varchar atopology, geometry apoint, float8 tolerance);
Додає точку до існуючої топології та повертає її ідентифікатор. Задана точка буде прив'язана до існуючих вузлів або ребер в межах заданого допуску. Існуюче ребро може бути розділене прив'язаною точкою.
Доступність: 2.0.0
TopoGeo_AddLineString — Додає лінійний елемент до існуючої топології з використанням допуску та можливого розділення існуючих ребер/граней.
SETOF bigint TopoGeo_AddLineString(varchar atopology, geometry aline, float8 tolerance, int max_edges);
Додає лінію до існуючої топології та повертає набір ідентифікаторів ребер із знаком, що її утворюють (негативні ідентифікатори означають, що ребро йде в протилежному напрямку від вхідної лінії).
Дана лінія прив'яжеться до існуючих вузлів або ребер в межах заданої похибки. Існуючі ребра і грані можуть бути розділені лінією. Крім нових ребер, можуть бути додані нові вузли і грані.
Повернені ідентифікатори ребер можуть бути як існуючими ребрами, так і новоствореними ребрами, залежно від необхідності, щоб якомога точніше відобразити введену лінію.
Кількість новостворених ребер (які покривають раніше непокритий простір або є результатом розділення існуючих ребер) може бути обмежена параметром max_edges.
![]() | |
When adding many lines, the load order can have a large impact on performance because each call checks the line against topology elements already loaded. In bulk workflows, adding large closed or enclosing lines before smaller contained lines can avoid expensive later splits. For loading a collection in one call, see TopoGeo_LoadGeometry. |
![]() | |
Оновлення статистики про топології, що завантажуються за допомогою цієї функції, залежить від виклику, див. maintaining statistics during topology editing and population. |
Доступність: 2.0.0
Покращено: у версії 3.2.0 додано підтримку повернення підписаного ідентифікатора.
Покращено: у версії 3.7.0 додано підтримку обмеження кількості нових ребер, що створюються в топології.
TopoGeo_AddPolygon — Додає полігон до існуючої топології, використовуючи допуск і, можливо, розділяючи існуючі ребра/грані. Повертає ідентифікатори граней.
SETOF bigint TopoGeo_AddPolygon(varchar atopology, geometry apoly, float8 tolerance);
Додає полігон до існуючої топології та повертає набір ідентифікаторів граней, що його утворюють. Межа заданого полігону буде прив'язана до існуючих вузлів або ребер з урахуванням заданого допуску. Існуючі ребра та грані можуть бути розділені межею нового полігону.
![]() | |
Оновлення статистики про топології, що завантажуються за допомогою цієї функції, залежить від виклику, див. maintaining statistics during topology editing and population. |
Доступність: 2.0.0
TopoGeo_LoadGeometry — Завантажте геометрію в існуючу топологію, при необхідності вирівнюючи та розділяючи.
void TopoGeo_LoadGeometry(varchar atopology, geometry ageom, float8 tolerance);
Завантажує геометрію в існуючу топологію. Задана геометрія буде прив'язана до існуючих вузлів або ребер в межах заданого допуску. Існуючі ребра та грані можуть бути розділені в результаті завантаження.
![]() | |
Оновлення статистики про топології, що завантажуються за допомогою цієї функції, залежить від виклику, див. maintaining statistics during topology editing and population. |
Доступність: 3.5.0
Цей розділ охоплює функції топології для додавання, переміщення, видалення та розділення ребер, граней та вузлів. Усі ці функції визначені стандартом ISO SQL/MM.
alinestring, до топології, що з'єднує два існуючі ізольовані вузли anode та anothernode, і повертає ідентифікатор нового ребра.apoint існує як вузол, виникає помилка. Повертає опис переміщення.ST_AddIsoNode — Додає ізольований вузол до грані в топології та повертає ідентифікатор нового вузла. Якщо грань має нульове значення, вузол все одно створюється.
bigint ST_AddIsoNode(varchar atopology, bigint aface, geometry apoint);
Додає ізольований вузол із точкою розташування apoint до існуючої грані з ідентифікатором грані aface до топології atopology і повертає ідентифікатор нового вузла.
Якщо система просторових координат (srid) геометрії точки не збігається з топологією, apoint не є геометрією точки, точка є нульовою або точка перетинає існуючу ребро (навіть на межі), то виникає виняток. Якщо точка вже існує як вузол, виникає виняток.
Якщо aface не дорівнює нулю, а apoint не знаходиться в межах грані, то генерується виняток.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM: Топо-мережеві процедури: X+1.3.1
ST_AddIsoEdge — Додає ізольоване ребро, визначене геометрією alinestring, до топології, що з'єднує два існуючі ізольовані вузли anode та anothernode, і повертає ідентифікатор нового ребра.
bigint ST_AddIsoEdge(varchar atopology, bigint anode, bigint anothernode, geometry alinestring);
Додає ізольоване ребро, визначене геометрією alinestring, до топології, що з'єднує два існуючі ізольовані вузли anode та anothernode, і повертає ідентифікатор нового ребра.
Якщо система просторових посилань (srid) геометрії alinestring не збігається з топологією, будь-який з вхідних аргументів має значення null, або вузли містяться в більш ніж одній грані, або вузли є початковими або кінцевими вузлами існуючої ребра, то генерується виняток.
Якщо alinestring не знаходиться в межах грані, до якої належать anode та anothernode, то генерується виняток.
Якщо anode та anothernode не є початковою та кінцевою точками alinestring, то генерується виняток.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3
ST_AddEdgeNewFaces — Додайте нову ребро і, якщо при цьому розділяється грань, видаліть оригінальну грань і замініть її двома новими.
bigint ST_AddEdgeNewFaces(varchar atopology, bigint anode, bigint anothernode, geometry acurve);
Додайте нове ребро і, якщо при цьому розділяється грань, видаліть оригінальну грань і замініть її двома новими гранями. Повертає ідентифікатор новододаного ребра.
Відповідно оновлює всі існуючі з'єднані ребра та взаємозв'язки.
Якщо будь-які аргументи мають нульове значення, вказані вузли невідомі (повинні вже існувати в таблиці node схеми топології) , acurve не є LINESTRING, anode та anothernode не є початковою та кінцевою точками acurve, тоді генерується помилка.
Якщо система просторових посилань (srid) геометрії acurve не збігається з топологією, виникає виняток.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3.12
ST_AddEdgeModFace — Додайте нову кромку і, якщо при цьому розділяється грань, змініть вихідну грань і додайте нову.
bigint ST_AddEdgeModFace(varchar atopology, bigint anode, bigint anothernode, geometry acurve);
Додайте нове ребро і, якщо це призведе до розділення грані, змініть оригінальну грань і додайте нову.
![]() | |
Якщо можливо, нова грань буде створена зліва від нового ребра. Це буде неможливо, якщо грань зліва повинна бути необмеженою. |
Повертає ідентифікатор новододаного ребра.
Відповідно оновлює всі існуючі з'єднані ребра та взаємозв'язки.
Якщо будь-які аргументи мають нульове значення, вказані вузли невідомі (повинні вже існувати в таблиці node схеми топології) , acurve не є LINESTRING, anode та anothernode не є початковою та кінцевою точками acurve, тоді генерується помилка.
Якщо система просторових посилань (srid) геометрії acurve не збігається з топологією, виникає виняток.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3.13
ST_RemEdgeNewFace — Видаляє ребро і, якщо видалене ребро розділяло дві грані, видаляє оригінальні грані та замінює їх новою гранею.
bigint ST_RemEdgeNewFace(varchar atopology, bigint anedge);
Видаляє ребро і, якщо видалене ребро розділяло дві грані, видаляє оригінальні грані та замінює їх новою гранею.
Повертає ідентифікатор новоствореної грані або NULL, якщо нова грань не створена. Нова грань не створюється, якщо видалена ребро є висячою, ізольованою або обмеженою гранею всесвіту (що може призвести до затоплення всесвіту гранею з іншого боку).
Відповідно оновлює всі існуючі з'єднані ребра та взаємозв'язки.
Відмовляється видаляти край, що бере участь у визначенні існуючої TopoGeometry. Відмовляється виправляти дві грані, якщо будь-яка TopoGeometry визначена тільки однією з них (а не іншою).
Якщо будь-які аргументи мають нульове значення, задана ребро невідома (повинна вже існувати в таблиці edge схеми топології), ім'я топології недійсне, то генерується помилка.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3.14
ST_RemEdgeModFace — Видаляє ребро, і якщо ребро розділяє дві грані, видаляє одну грань і модифікує іншу грань, щоб покрити простір обох.
bigint ST_RemEdgeModFace(varchar atopology, bigint anedge);
Видаляє ребро, і якщо видалене ребро розділяє дві грані, видаляє одну грань і модифікує іншу грань, щоб покрити простір обох. Переважно зберігає грань праворуч, щоб забезпечити узгодженість з ST_AddEdgeModFace. Повертає ідентифікатор грані, яка зберігається.
Відповідно оновлює всі існуючі з'єднані ребра та взаємозв'язки.
Відмовляється видаляти край, що бере участь у визначенні існуючої TopoGeometry. Відмовляється виправляти дві грані, якщо будь-яка TopoGeometry визначена тільки однією з них (а не іншою).
Якщо будь-які аргументи мають нульове значення, задана ребро невідома (повинна вже існувати в таблиці edge схеми топології), ім'я топології недійсне, то генерується помилка.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3.15
ST_ChangeEdgeGeom — Змінює форму ребра, не впливаючи на топологічну структуру.
text ST_ChangeEdgeGeom(varchar atopology, bigint anedge, geometry acurve);
Змінює форму ребра, не впливаючи на топологічну структуру.
Якщо будь-які аргументи мають значення null, задана ребро не існує в таблиці edge схеми топології, acurve не є LINESTRING, або модифікація змінить базову топологію, то буде видано помилку.
Якщо система просторових посилань (srid) геометрії acurve не збігається з топологією, виникає виняток.
Якщо новий acurve не є простим, то виникає помилка.
Якщо переміщення ребра зі старого положення в нове призведе до зіткнення з перешкодою, буде видано помилку.
Доступність: 1.1.0
Покращено: у версії 2.0.0 додано забезпечення топологічної узгодженості
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі рутинних операцій X.3.6
SELECT topology.ST_ChangeEdgeGeom(
'ma_topo',
1,
ST_GeomFromText(
'LINESTRING(227591.9 893900.4,227622.6 893844.3,227641.6 893816.6,227704.5 893778.5)',
26986)
);Edge 1 changed
ST_ModEdgeSplit — Розділіть ребро, створивши новий вузол уздовж існуючого ребра, змінивши оригінальне ребро та додавши нове.
bigint ST_ModEdgeSplit(varchar atopology, bigint 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 to split.
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227592 893910,227600 893910)', 26986)) AS edgeid;3
Split the edge with a new node.
SELECT topology.ST_ModEdgeSplit('ma_topo', 3, ST_SetSRID(ST_Point(227594, 893910), 26986)) AS node_id;7
ST_ModEdgeHeal — Виправляє двa ребра, видаляючи вузол, що їх з'єднує, змінюючи перше ребро та видаляючи друге ребро. Повертає ідентифікатор видаленого вузла.
bigint ST_ModEdgeHeal(varchar atopology, bigint anedge, bigint anotheredge);
Виправляє два ребра, видаляючи вузол, що їх з'єднує, змінюючи перше ребро та видаляючи друге ребро. Повертає ідентифікатор видаленого вузла. Відповідно оновлює всі існуючі з'єднані ребра та відносини.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3.9
ST_NewEdgeHeal — Відновлює два ребра, видаляючи вузол, що їх з'єднує, видаляючи обидва ребра та замінюючи їх ребром, напрямок якого збігається з напрямком першого наданого ребра.
bigint ST_NewEdgeHeal(varchar atopology, bigint anedge, bigint anotheredge);
Виправляє дві ребра, видаляючи вузол, що їх з'єднує, видаляючи обидві ребра та замінюючи їх ребром, напрямок якого збігається з напрямком першого наданого ребра. Повертає ідентифікатор нового ребра, що замінює виправлені ребра. Відповідно оновлює всі існуючі з'єднані ребра та відносини.
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X.3.9
ST_MoveIsoNode — Переміщує ізольований вузол у топології з однієї точки в іншу. Якщо нова геометрія apoint існує як вузол, виникає помилка. Повертає опис переміщення.
text ST_MoveIsoNode(varchar atopology, bigint anode, geometry apoint);
Переміщує ізольований вузол у топології з однієї точки в іншу. Якщо нова геометрія apoint існує як вузол, виникає помилка.
Якщо будь-які аргументи мають нульове значення, 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;7
Move the new node.
SELECT topology.ST_MoveIsoNode('ma_topo', 7, ST_GeomFromText('POINT(227579.5 893916.5)', 26986)) AS descrip;Isolated Node 7 moved to location 227579.5,893916.5
ST_NewEdgesSplit — Розділіть ребро, створивши новий вузол уздовж існуючого ребра, видаливши оригінальне ребро і замінивши його двома новими ребрами. Повертає ідентифікатор нового вузла, створеного для з'єднання нових ребер.
bigint ST_NewEdgesSplit(varchar atopology, bigint anedge, geometry apoint);
Розділити ребро з ідентифікатором anedge шляхом створення нового вузла з точкою розташування apoint вздовж поточного ребра, видалення оригінального ребра та заміни його двома новими ребрами. Повертає ідентифікатор нового вузла, створеного для з'єднання нових ребер. Відповідно оновлює всі існуючі з'єднані ребра та відносини.
Якщо система просторових посилань (srid) геометрії точки не збігається з топологією, apoint не є геометрією точки, точка є нульовою, точка вже існує як вузол, край не відповідає існуючому краю або точка не знаходиться в межах краю, то генерується виняток.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM: Процедури Topo-Net: X.3.8
Add an edge to split.
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227575 893917,227592 893900)', 26986)) AS edgeid;2
Split the new edge.
SELECT topology.ST_NewEdgesSplit('ma_topo', 2, ST_GeomFromText('POINT(227578.5 893913.5)', 26986)) AS newnodeid;6
ST_RemoveIsoNode — Видаляє ізольований вузол і повертає опис дії. Якщо вузол не ізольований (є початком або кінцем ребра), то генерується виняток.
text ST_RemoveIsoNode(varchar atopology, bigint anode);
Видаляє ізольований вузол і повертає опис дії. Якщо вузол не ізольований (є початком або кінцем ребра), то генерується виняток.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X+1.3.3
Remove an isolated node with no face.
SELECT topology.ST_RemoveIsoNode('ma_topo', 7) AS result;Isolated node 7 removed
ST_RemoveIsoEdge — Видаляє ізольовану грань і повертає опис дії. Якщо грань не ізольована, то генерується виняток.
text ST_RemoveIsoEdge(varchar atopology, bigint anedge);
Видаляє ізольовану грань і повертає опис дії. Якщо грань не ізольована, то генерується виняток.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM: Topo-Geo та Topo-Net 3: Деталі процедури: X+1.3.3
Remove an isolated edge with no face.
SELECT topology.ST_RemoveIsoEdge('ma_topo', 7) AS result;Isolated edge 7 removed
aface.GetEdgeByPoint — Знаходить ідентифікатор ребра, яке перетинає задану точку.
bigint GetEdgeByPoint(varchar atopology, geometry apoint, float8 tol1);
Отримує ідентифікатор ребра, яке перетинає точку.
Функція повертає ціле число (id-edge) за заданою топологією, точкою POINT і допуском tolerance. Якщо tolerance = 0, то точка повинна перетинати край.
Якщо apoint не перетинає ребро, повертає 0 (нуль).
Якщо використання tolerance > 0 і поблизу точки є більше ніж одна грань, то виникає виняток.
![]() | |
Якщо tolerance = 0, функція використовує ST_Intersects, в іншому випадку використовує ST_DWithin. |
Виконується модулем GEOS.
Доступність: 2.0.0
У цих прикладах використовуються ребра, які ми створили в AddEdge
SELECT topology.GetEdgeByPoint('ma_topo', geom, 1) As with1mtol, topology.GetEdgeByPoint('ma_topo', geom, 0) As withnotol
FROM ST_GeomFromEWKT('SRID=26986;POINT(227622.6 893843)') As geom;with1mtol | withnotol
-----------+-----------
2 | 0This query errors because two or more edges are found.
SELECT topology.GetEdgeByPoint('ma_topo', geom, 1) As nearnode
FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom;ERROR: Two or more edges found
GetFaceByPoint — Знаходить грань, що перетинає задану точку.
bigint 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 | 0This query errors because two or more faces are found.
SELECT topology.GetFaceByPoint('ma_topo', geom, 1) As nearnode
FROM ST_GeomFromEWKT('POINT(227591.9 893900.4)') As geom;ERROR: Two or more faces found
GetFaceContainingPoint, AddFace, GetNodeByPoint, GetEdgeByPoint
GetFaceContainingPoint — Знаходить обличчя, що містить точку.
bigint GetFaceContainingPoint(text atopology, geometry apoint);
Повертає ідентифікатор грані, що містить точку.
Якщо точка потрапляє на межу грані, генерується виняток.
![]() | |
Функція базується на дійсній топології, використовуючи зв'язки між ребрами та маркування граней. |
Доступність: 3.2.0
GetNodeByPoint — Знаходить ідентифікатор вузла в точці.
bigint GetNodeByPoint(varchar atopology, geometry apoint, float8 tol1);
Отримує ідентифікатор вузла в точці розташування.
Функція повертає ціле число (id-node) за заданою топологією, POINT і допуском. Якщо допуск = 0, це означає точне перетин, в іншому випадку витягує вузол з інтервалу.
Якщо apoint не перетинає вузол, повертає 0 (нуль).
Якщо використання tolerance > 0 і поблизу точки знаходиться більше одного вузла, то виникає виняток.
![]() | |
Якщо tolerance = 0, функція використовує ST_Intersects, в іншому випадку використовує ST_DWithin. |
Виконується модулем GEOS.
Доступність: 2.0.0
У цих прикладах використовуються ребра, які ми створили в AddEdge
SELECT topology.GetNodeByPoint('ma_topo', geom, 1) As nearnode
FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom;2
This query errors because the tolerance matches two or more nodes.
SELECT topology.GetNodeByPoint('ma_topo', geom, 1000) As too_much_tolerance
FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom;ERROR: Two or more nodes found
GetTopologyID — Повертає ідентифікатор топології в таблиці topology.topology за назвою топології.
integer GetTopologyID(varchar toponame);
Повертає ідентифікатор топології в таблиці topology.topology за назвою топології.
Доступність: 1.1
SELECT topology.GetTopologyID('ma_topo') AS topo_id;1
CreateTopology, DropTopology, GetTopologyName, GetTopologySRID
GetTopologySRID — Повертає SRID топології в таблиці topology.topology, задавши ім'я топології.
integer GetTopologyID(varchar toponame);
Повертає ідентифікатор просторового посилання топології в таблиці topology.topology за назвою топології.
Доступність: 2.0.0
SELECT topology.GetTopologySRID('ma_topo') AS srid;4326
CreateTopology, DropTopology, GetTopologyName, GetTopologyID
GetTopologyName — Повертає назву топології (схеми) за ідентифікатором топології.
varchar GetTopologyName(integer topology_id);
Повертає ім'я топології (схему) з таблиці topology.topology, задавши ідентифікатор топології.
Доступність: 1.1
SELECT topology.GetTopologyName(1) AS topo_name;
ma_topo
CreateTopology, DropTopology, GetTopologyID, GetTopologySRID
ST_GetFaceEdges — Повертає набір впорядкованих ребер, що обмежують aface.
getfaceedges_returntype ST_GetFaceEdges(varchar atopology, bigint aface);
Повертає набір впорядкованих ребер, що обмежують aface. Кожен вихідний елемент складається з послідовності та edgeid. Номери послідовності починаються з значення 1.
Перелік кожного краю кільця починається з краю з найменшим ідентифікатором. Порядок країв відповідає правилу лівої руки (межа знаходиться ліворуч від кожного спрямованого краю).
Доступність: 2.0
This method implements the SQL/MM specification. SQL-MM 3 Topo-Geo та Topo-Net 3: Деталі процедури: X.3.5
This query returns the edges that bound face 1.
SELECT (topology.ST_GetFaceEdges('tt', 1)).*;sequence | edge
----------+------
1 | -4
2 | 5
3 | 7
4 | -6
5 | 1
6 | 2
7 | 3This query returns the sequence, edge identifier, and geometry of the edges that bound face 1. Use ST_GetFaceGeometry if only the geometry and sequence are needed.
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 — Повертає багатокутник у заданій топології із зазначеним ідентифікатором грані.
geometry ST_GetFaceGeometry(varchar atopology, bigint aface);
Повертає багатокутник у заданій топології із зазначеним ідентифікатором грані. Будує багатокутник із ребер, що утворюють грань.
Доступність: 1.1
This method implements the SQL/MM specification. SQL-MM 3 Topo-Geo та Topo-Net 3: Деталі процедури: X.3.16
This query returns the WKT of the polygon added with AddFace.
SELECT topology.ST_GetFaceGeometry('ma_topo', 1) AS 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, bigint aring, integer max_edges=null);
Повертає впорядкований набір ідентифікаторів підписаних ребер, зустрінутих під час проходження по заданій стороні ребра. Кожен вихідний елемент складається з послідовності та ідентифікатора підписаного ребра. Номери послідовності починаються з значення 1.
Якщо ви передаєте позитивний ідентифікатор ребра, проходження починається з лівого боку відповідного ребра і слідує за напрямком ребра. Якщо ви передаєте негативний ідентифікатор ребра, проходження починається з правого боку ребра і йде назад.
Якщо max_edges не дорівнює нулю, функція повертає не більше цих записів. Це є параметром безпеки при роботі з потенційно недійсними топологіями.
![]() | |
Ця функція використовує метадані зв'язку крайових кілець. |
Доступність: 2.0.0
GetNodeEdges — Повертає впорядкований набір ребер, що прилягають до заданого вузла.
getfaceedges_returntype GetNodeEdges(varchar atopology, bigint anode);
Повертає впорядкований набір ребер, що прилягають до заданого вузла. Кожен вихідний елемент складається з послідовності та ідентифікатора ребра зі знаком. Номери послідовності починаються з 1. Позитивне ребро починається в заданому вузлі. Негативне ребро закінчується в заданому вузлі. Замкнуті ребра з'являються двічі (з обома знаками). Порядок визначається за годинниковою стрілкою, починаючи з півночі.
![]() | |
Ця функція обчислює порядок, а не виводить його з метаданих, і тому може використовуватися для побудови зв'язків між кільцями ребер. |
Доступність: 2.0
FindVertexSegmentPairsBelowDistance — Find pairs of topology vertex/segment that are closer than tolerated distance
setof record FindVertexSegmentPairsBelowDistance(varchar atopology, float8 tolerance);
Returns a relation in which each tuple is a pair of vertex/segment where the vertex is NOT an endpoint of the segment but the distance between them is below the given tolerance.
Availability: 3.7
Цей розділ описує функції для обробки топологій нестандартними способами.
Polygonize — Знаходить і реєструє всі грані, визначені краями топології.
text Polygonize(varchar toponame);
Реєструє всі грані, які можна побудувати з примітивів ребер.
Припускається, що цільова топологія не містить самоперетинаючих ребер.
![]() | |
Вже відомі грані розпізнаються, тому можна безпечно викликати Polygonize кілька разів для однієї топології. |
![]() | |
Ця функція не використовує і не встановлює поля next_left_edge та next_right_edge таблиці ребер. |
Доступність: 2.0.0
AddNode — Додає точковий вузол до таблиці вузлів у вказаній схемі топології та повертає ідентифікатор нового вузла. Якщо точка вже існує як вузол, повертається існуючий ідентифікатор вузла.
bigint AddNode(varchar toponame, geometry apoint, boolean allowEdgeSplitting=false, boolean computeContainingFace=false);
Додає точковий вузол до таблиці вузлів у вказаній схемі топології. Функція AddEdge автоматично додає початкову та кінцеву точки ребра при виклику, тому немає необхідності явно додавати вузли ребра.
Якщо виявлено будь-яке ребро, що перетинає вузол, то, залежно від значення параметра allowEdgeSplitting, або генерується виняток, або ребро розділяється.
Якщо computeContainingFace має значення true, для новододаного вузла буде обчислено правильну грань, що його містить.
![]() | |
Якщо геометрія |
Доступність: 2.0.0
SELECT topology.AddNode('ma_topo', ST_GeomFromText('POINT(227641.6 893816.5)', 26986)) AS nodeid;4
AddEdge — Додає лінійний край до таблиці країв ребер та пов'язані початкові та кінцеві точки до таблиці вузлів точок заданої топологічної схеми, використовуючи задану геометрію лінійного ребра, та повертає ідентифікатор нового (або існуючого) ребра.
bigint AddEdge(varchar toponame, geometry aline);
Додає ребро до таблиці ребер і пов'язані вузли до таблиці вузлів заданої схеми toponame з використанням заданої геометрії лінійного рядка та повертає edgeid нового або існуючого запису. Новододане ребро має обох боків "універсум" і пов'язане саме з собою.
![]() | |
Якщо геометрія |
![]() | |
Геометрія |
Виконується модулем GEOS.
![]() | |
AddEdge застаріло з версії 3.5.0. Замість цього використовуйте TopoGeo_AddLineString. |
Доступність: 2.0.0
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227575.8 893917.2,227591.9 893900.4)', 26986)) AS 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;2
This query errors because the edge intersects an existing edge away from the endpoints.
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227591.2 893900,227591.9 893900.4,227704.5 893778.5)', 26986)) AS edgeid;ERROR: Edge intersects (not on endpoints) with existing edge 1
AddFace — Реєструє примітив грані в топології та отримує його ідентифікатор.
bigint AddFace(varchar toponame, geometry apolygon, boolean force_new=false);
Реєструє примітив грані в топології та отримує його ідентифікатор.
Для новододаної грані краї, що утворюють її межі, та краї, що містяться в грані, будуть оновлені, щоб мати правильні значення в полях left_face та right_face. Ізольовані вузли, що містяться в грані, також будуть оновлені, щоб мати правильне значення поля containing_face.
![]() | |
Ця функція не використовує і не встановлює поля next_left_edge та next_right_edge таблиці ребер. |
Припускається, що топологія цілі є правильною (не містить самоперетинаючих ребер). Виникає виняток, якщо: Межа багатокутника не повністю визначена існуючими ребрами або багатокутник перетинає існуючу грань.
Якщо геометрія apolygon вже існує як грань, то: якщо force_new має значення false (за замовчуванням), повертається ідентифікатор існуючої грані; якщо force_new має значення true, новому зареєстрованому грані присвоюється новий ідентифікатор.
![]() | |
Коли виконується нова реєстрація існуючої грані (force_new=true), не буде виконано жодних дій для вирішення висячих посилань на існуючу грань у таблицях ребер, вузлів та відносин, а також не буде оновлено поле MBR існуючого запису грані. Це має зробити викликаючий. |
![]() | |
Геометрія |
Доступність: 2.0.0
First add the edges using generate_series as an iterator. This query only works for polygons with fewer than 10000 points because of the maximum value in generate_series.
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;3 4 5 6 7 8 9 10 11 12
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;
1
ST_Simplify — Повертає "спрощену" версію геометрії заданої TopoGeometry за допомогою алгоритму Дугласа-Пеукера.
geometry ST_Simplify(topogeometry tg, float8 tolerance);
Повертає "спрощену" геометрію заданої TopoGeometry, використовуючи алгоритм Дугласа-Пеукера для кожного компонента ребра.
![]() | |
Повернена геометрія може бути неспрощеною або недійсна. Розділення граней компонентів може допомогти зберегти простоту/дійсність. |
Виконується модулем GEOS.
Доступність: 2.1.0
Геометрія ST_Simplify, ST_IsSimple, ST_IsValid, ST_ModEdgeSplit
RemoveUnusedPrimitives — Видаляє примітивні елементи топології, які не потрібні для визначення існуючих об'єктів TopoGeometry.
bigint RemoveUnusedPrimitives(text topology_name, geometry bbox);
Знаходить всі примітиви (вузли, ребра, грані), які не є строго необхідними для представлення існуючих об'єктів TopoGeometry, і видаляє їх, зберігаючи топологічну валідність (зв'язки ребер, маркування граней) і зайнятість простору TopoGeometry.
Нові примітивні ідентифікатори не створюються, а існуючі примітиви розширюються, щоб включити об'єднані грані (після видалення ребер) або відновлені ребра (після видалення вузлів).
Доступність: 3.3.0
Цей розділ присвячений функціям топології для створення нових топогеометрій.
topoelementarray для набору масивів element_id, type (topoelements).CreateTopoGeom — Створює новий об'єкт топографічної геометрії з масиву топографічних елементів - tg_type: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection
topogeometry CreateTopoGeom(varchar toponame, integer tg_type, integer layer_id, topoelementarray tg_objs, bigint tg_id);
topogeometry CreateTopoGeom(varchar toponame, integer tg_type, integer layer_id);
Створює об'єкт топогеометрії для шару, позначеного layer_id, і реєструє його в таблиці відносин у схемі toponame.
tg_type є цілим числом: 1:[multi]point (точкова), 2:[multi]line (лінійна), 3:[multi]poly (площа), 4:колекція. layer_id є ідентифікатором шару в таблиці topology.layer.
пунктуальні шари утворюються з набору вузлів, лінійні шари утворюються з набору ребер, площинні шари утворюються з набору граней, а колекції можуть утворюватися з суміші вузлів, ребер і граней.
Пропуск масиву компонентів призводить до створення порожнього об'єкта TopoGeometry.
Доступність: 1.1
Form from existing edges.
Створіть топогеометрію в схемі ri_topo для шару 2 (наш ri_roads) типу (2) LINE для першого ребра (ми завантажили в ST_CreateTopoGeo).
INSERT INTO ri.ri_roads(road_name, topo)
VALUES (
'Unknown',
topology.CreateTopoGeom(
'ri_topo',
2,
2,
'{{1,2}}'::topology.topoelementarray
)
);Convert an areal geometry to best guess topogeometry.
Припустимо, ми маємо геометрії, які повинні бути сформовані з набору граней. Наприклад, ми маємо таблицю груп блоків і хочемо знати топологічну геометрію кожної групи блоків. Якщо наші дані були б ідеально вирівняні, ми могли б зробити так:
Create the topogeometry column.
SELECT topology.AddTopoGeometryColumn( 'topo_boston', 'boston', 'blockgroups', 'topo', 'POLYGON');
1
Update the column assuming everything is perfectly aligned with the 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, so this version allows some error. It counts a face if 50 percent of it falls within the expected block group boundary.
WITH candidate_faces AS (
SELECT
b.gid,
b.geom AS block_geom,
f.face_id,
topology.ST_GetFaceGeometry('topo_boston', f.face_id) AS face_geom
FROM boston.blockgroups AS b
INNER JOIN topo_boston.face AS f
ON b.geom && f.mbr
),
block_faces AS (
SELECT
gid,
topology.TopoElementArray_Agg(ARRAY[face_id, 3]) AS bfaces
FROM candidate_faces
WHERE ST_Covers(block_geom, face_geom)
OR (
ST_Intersects(block_geom, face_geom)
AND ST_Area(ST_Intersection(block_geom, face_geom))
> ST_Area(face_geom) * 0.5
)
GROUP BY gid
)
UPDATE boston.blockgroups AS bg
SET topo = topology.CreateTopoGeom(
'topo_boston',
3,
1,
block_faces.bfaces
)
FROM block_faces
WHERE block_faces.gid = bg.gid;To convert the topogeometry back to a denormalized geometry aligned with faces and edges, cast the topogeometry to a geometry. The resulting geometries are aligned with the TIGER street centerlines.
UPDATE boston.blockgroups SET new_geom = topo::geometry;
toTopoGeom — Перетворює просту геометрію в топологічну геометрію.
topogeometry toTopoGeom(geometry geom, varchar toponame, integer layer_id, float8 tolerance=-1);
topogeometry toTopoGeom(geometry geom, topogeometry topogeom, float8 tolerance=-1);
Перетворює просту геометрію в TopoGeometry.
Топологічні примітиви, необхідні для представлення вхідної геометрії, будуть додані до базової топології, можливо з розділенням існуючих, і будуть пов'язані з вихідною TopoGeometry в таблиці relation.
Існуючі об'єкти TopoGeometry (за можливим винятком topogeom, якщо вказано) збережуть свої форми.
Коли вказано tolerance, воно буде використовуватися для прив'язки вхідної геометрії до існуючих примітивів. Спеціальне значення -1 (за замовчуванням) означає використання точності топології як допуску.
У першій формі буде створено нову топогеометрію для заданого шару (layer_id) заданої топології (toponame).
У другій формі примітиви, отримані в результаті перетворення, будуть додані до існуючої TopoGeometry (topogeom), можливо, додаючи простір до її остаточної форми. Щоб нова форма повністю замінила стару, див. clearTopoGeom.
Доступність: 2.0
Покращено: у версії 2.1.0 додано версію, що використовує існуючу TopoGeometry.
Змінено: у версії 3.7.0 змінено значення толерантності 0, яке тепер означає 0 і -1 (нове значення за замовчуванням), щоб вимагати використання точності топології.
Це повністю автономний робочий процес
Create the topology without 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 the new table.
SELECT topology.AddTopoGeometryColumn('topo_boston_test', 'public', 'nei_topo', 'topo', 'MULTIPOLYGON') AS new_layer_id;1
Use the new layer identifier to populate the topogeometry column.
INSERT INTO nei_topo(nei, topo) SELECT nei, topology.toTopoGeom(geom, 'topo_boston_test', 1) FROM neighborhoods WHERE gid BETWEEN 1 and 15;
Verify what happened.
SELECT * FROM
topology.TopologySummary('topo_boston_test');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 = toTopoGeom(ST_Buffer(topo, -10), clearTopoGeom(topo), 0);
Find faces that are left without any TopoGeometry reference after the shrink operation.
SELECT ST_GetFaceGeometry('topo_boston_test', f.face_id)
FROM topo_boston_test.face f
WHERE f.face_id
> 0
AND NOT EXISTS (
SELECT * FROM topo_boston_test.relation
WHERE layer_id = 1 AND element_id = f.face_id
);
TopoElementArray_Agg — Повертає topoelementarray для набору масивів element_id, type (topoelements).
topoelementarray TopoElementArray_Agg(topoelement set tefield);
SELECT topology.TopoElementArray_Agg(ARRAY[e, t] ORDER BY e, t) As tea FROM generate_series(1, 3) As e CROSS JOIN generate_series(1, 4) As t;
{{1,1},{1,2},{1,3},{1,4},{2,1},{2,2},{2,3},{2,4},{3,1},{3,2},{3,3},{3,4}}TopoElement — Перетворює топогеометрію в топоелемент.
topoelement TopoElement(topogeometry topo);
Це повністю автономний робочий процес
Return the TopoElement representation of each topogeometry.
SELECT TopoElement(topo) FROM neighborhoods;
Use a cast to aggregate topogeometries into a TopoElementArray.
SELECT topology.TopoElementArray_Agg(topo::topoelement) FROM neighborhoods GROUP BY city;
Цей розділ охоплює функції топології для редагування існуючих топогеометрій.
clearTopoGeom — Очищає вміст геометрії топографії.
topogeometry clearTopoGeom(topogeometry topogeom);
Очищає вміст TopoGeometry, перетворюючи його на порожній. Найчастіше використовується разом з toTopoGeom для заміни форми існуючих об'єктів та будь-яких залежних об'єктів на вищих ієрархічних рівнях.
Доступність: 2.1
Shrink all TopoGeometry polygons by 10 meters.
UPDATE nei_topo SET topo = toTopoGeom(ST_Buffer(topo, -10), clearTopoGeom(topo), 0);
TopoGeom_addElement — Додає елемент до визначення TopoGeometry.
topogeometry TopoGeom_addElement(topogeometry tg, topoelement el);
Додає TopoElement до визначення об'єкта TopoGeometry. Не видає помилку, якщо елемент вже є частиною визначення.
Доступність: 2.3
Add edge 5 to TopoGeometry tg.
UPDATE mylayer SET tg = TopoGeom_addElement(tg, '{5,2}');TopoGeom_remElement — Видаляє елемент з визначення TopoGeometry.
topogeometry TopoGeom_remElement(topogeometry tg, topoelement el);
Remove face 43 from TopoGeometry tg.
UPDATE mylayer SET tg = TopoGeom_remElement(tg, '{43,3}');TopoGeom_addTopoGeom — Додає елемент TopoGeometry до визначення іншого TopoGeometry.
topogeometry TopoGeom_addTopoGeom(topogeometry tgt, topogeometry src);
Додає елементи TopoGeometry до визначення іншого TopoGeometry, можливо змінюючи його кешований тип (атрибут type) на колекцію, якщо це необхідно для збереження всіх елементів в об'єкті-джерелі.
Два об'єкти TopoGeometry повинні бути визначені відповідно до *однієї і тієї ж* топології, а якщо вони визначені ієрархічно, то повинні складатися з елементів одного і того ж дочірнього шару.
Доступність: 3.2
Set an overall TopoGeometry value to be composed of all elements from specific TopoGeometry values.
UPDATE mylayer SET tg_overall = TopoGeom_addTopoGeom(
TopoGeom_addTopoGeom(
clearTopoGeom(tg_overall),
tg_specific1
),
tg_specific2
);
toTopoGeom — Додає геометричну фігуру до існуючої топографічної геометрії.
Див. toTopoGeom.
topoelementarray (масив топоелементів), що містить топологічні елементи та тип заданої TopoGeometry (примітивні елементи).topoelement, що містять топологічні element_id,element_type заданої TopoGeometry (примітивні елементи).GetTopoGeomElementArray — Повертає topoelementarray (масив топоелементів), що містить топологічні елементи та тип заданої TopoGeometry (примітивні елементи).
topoelementarray GetTopoGeomElementArray(varchar toponame, integer layer_id, bigint tg_id);
topoelementarray GetTopoGeomElementArray(topogeometry tg);
Повертає TopoElementArray, що містить топологічні елементи та тип заданої TopoGeometry (примітивні елементи). Це схоже на GetTopoGeomElements, за винятком того, що повертає елементи у вигляді масиву, а не набору даних.
tg_id — ідентифікатор топогеометрії об'єкта топогеометрії в топології в шарі, позначеному layer_id в таблиці topology.layer.
Доступність: 1.1
GetTopoGeomElements — Повертає набір об'єктів topoelement, що містять топологічні element_id,element_type заданої TopoGeometry (примітивні елементи).
setof topoelement GetTopoGeomElements(varchar toponame, integer layer_id, bigint tg_id);
setof topoelement GetTopoGeomElements(topogeometry tg);
Повертає набір element_id,element_type (topoelements), що відповідає елементам примітивної топології TopoElement (1: вузли, 2: ребра, 3: грані), з яких складається заданий об'єкт топогеометрії в схемі toponame.
tg_id — ідентифікатор топогеометрії об'єкта топогеометрії в топології в шарі, позначеному layer_id в таблиці topology.layer.
Доступність: 2.0.0
ST_SRID — Повертає ідентифікатор просторової прив'язки для топогеометрії.
integer ST_SRID(topogeometry tg);
Returns the spatial reference identifier of the topology containing the TopoGeometry.
The identifier is recorded for the topology when it is created and refers to an entry in Розділ 4.5, «Spatial Reference Systems».
Доступність: 3.2.0
Return the SRID of a TopoGeometry stored in the ri_topo topology.
SELECT topology.ST_SRID(topo) AS srid FROM ri.roads WHERE road_name = 'Unknown';
srid ------ 3438
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);
Повертає GML-представлення топогеометрії у форматі GML3. Якщо не вказано nsprefix_in, використовується gml. Передайте порожній рядок для nsprefix, щоб отримати некваліфікований простір імен. Параметри точності (за замовчуванням: 15) та опції (за замовчуванням 1), якщо вони вказані, передаються без змін до базового виклику ST_AsGML.
Параметр visitedTable, якщо він вказаний, використовується для відстеження відвіданих елементів Node та Edge, щоб використовувати перехресні посилання (xlink:xref) замість дублювання визначень. Таблиця повинна мати (принаймні) два цілочисельні поля: 'element_type' та 'element_id'. Користувач, який викликає функцію, повинен мати права на читання та запис у вказаній таблиці. Для найкращої продуктивності слід визначити індекс для element_type та element_id у такому порядку. Такий індекс буде створено автоматично шляхом додавання унікального обмеження до полів. Приклад:
CREATE TABLE visited ( element_type integer, element_id integer, unique(element_type, element_id) );
Параметр idprefix, якщо вказано, буде додано перед ідентифікаторами тегів Edge та Node.
Параметр gmlver, якщо вказано, буде передано до базового ST_AsGML. За замовчуванням встановлено значення 3.
Доступність: 2.0.0
Тут використовується геометрія топографії, яку ми створили в CreateTopoGeom
SELECT topology.AsGML(topo) As rdgml FROM ri.roads WHERE road_name = 'Unknown';
<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';
<TopoCurve>
<directedEdge>
<Edge id="E1">
<directedNode orientation="-">
<Node id="N1"/>
</directedNode>
<directedNode
></directedNode>
<curveProperty>
<Curve srsName="urn:ogc:def:crs:EPSG::3438">
<segments>
<LineStringSegment>
<posList srsDimension="2"
>384744 236928 384750 236923 384769 236911 384799 236895 384811 236890
384833 236884 384844 236882 384866 236881 384879 236883 384954 236898 385087 236932 385117 236938
385167 236938 385203 236941 385224 236946 385233 236950 385241 236956 385254 236971
385260 236979 385268 236999 385273 237018 385273 237037 385271 237047 385267 237057 385225 237125
385210 237144 385192 237161 385167 237192 385162 237202 385159 237214 385159 237227 385162 237241
385166 237256 385196 237324 385209 237345 385234 237375 385237 237383 385238 237399 385236 237407
385227 237419 385213 237430 385193 237439 385174 237451 385170 237455 385169 237460 385171 237475
385181 237503 385190 237521 385200 237533 385206 237538 385213 237541 385221 237542 385235 237540 385242 237541
385249 237544 385260 237555 385270 237570 385289 237584 385292 237589 385291 237596 385284 237630</posList>
</LineStringSegment>
</segments>
</Curve>
</curveProperty>
</Edge>
</directedEdge>
</TopoCurve>
AsTopoJSON — Повертає представлення топогеометрії у форматі TopoJSON.
text AsTopoJSON(topogeometry tg, regclass edgeMapTable);
Повертає представлення топогеометрії у форматі TopoJSON. Якщо edgeMapTable не є нульовим, воно буде використовуватися як відображення ідентифікаторів ребер на індекси дуг для пошуку/зберігання. Це необхідно для того, щоб у кінцевому документі можна було отримати компактний масив "дуг".
У таблиці, якщо вона надана, має бути поле "arc_id" типу "serial" та "edge_id" типу integer; код буде запитувати таблицю щодо "edge_id", тому рекомендується додати індекс до цього поля.
![]() | |
Індекси дуг у вихідних даних TopoJSON починаються з 0, але в таблиці "edgeMapTable" вони починаються з 1. |
Повний документ TopoJSON повинен містити, крім фрагментів, повернутих цією функцією, фактичні дуги та деякі заголовки. Див. специфікацію TopoJSON.
Доступність: 2.1.0
Покращено: у версії 2.2.1 додано підтримку вхідних сигналів puntal
Create a temporary edge map for the TopoJSON output.
CREATE TEMP TABLE edgemap(arc_id serial, edge_id int unique);
Build the TopoJSON header, objects, arcs, and footer.
SELECT '{ "type": "Topology", "transform": { "scale": [1,1], "translate": [0,0] }, "objects": {'
UNION ALL SELECT '"' || feature_name || '": ' || AsTopoJSON(feature, 'edgemap')
FROM features.big_parcels WHERE feature_name = 'P3P4';
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
UNION ALL SELECT ']}'::text as t;
{ "type": "Topology", "transform": { "scale": [1,1], "translate": [0,0] }, "objects": {
"P3P4": { "type": "MultiPolygon", "arcs": [[[-1]],[[6,5,-5,-4,-3,1]]]}
}, "arcs": [
[[25,30],[6,0],[0,10],[-14,0],[0,-10],[8,0]],
[[35,6],[0,8]],
[[35,6],[12,0]],
[[47,6],[0,8]],
[[47,14],[0,8]],
[[35,22],[12,0]],
[[35,14],[0,8]]
]}
У цьому розділі перелічено функції топології, що використовуються для перевірки взаємозв'язків між топогеометріями та топологічними примітивами
Equals — Повертає true, якщо дві топогеометрії складаються з однакових топологічних примітивів.
boolean Equals(topogeometry tg1, topogeometry tg2);
Повертає true, якщо дві топогеометрії складаються з однакових топологічних примітивів: граней, ребер, вузлів.
![]() | |
Ця функція не підтримується для топогеометрій, які є колекціями геометрій. Вона також не може порівнювати топогеометрії з різних топологій. |
Доступність: 1.1.0
This function supports 3d and will not drop the z-index.
The following example uses the nei_topo table created in the toTopoGeom examples.
SELECT topology.Equals(a.topo, b.topo) FROM nei_topo AS a JOIN nei_topo AS b ON b.gid = a.gid WHERE a.gid = 1;
t
Intersects — Повертає true, якщо будь-яка пара примітивів з двох топогеометрій перетинаються.
boolean Intersects(topogeometry tg1, topogeometry tg2);
Повертає true, якщо будь-яка пара примітивів з двох топогеометрій перетинаються.
![]() | |
Ця функція не підтримується для топогеометрій, які є колекціями геометрій. Вона також не може порівнювати топогеометрії з різних топологій. Також наразі не підтримується для ієрархічних топогеометрій (топогеометрій, що складаються з інших топогеометрій). |
Доступність: 1.1.0
This function supports 3d and will not drop the z-index.
The following example uses the nei_topo table created in the toTopoGeom examples.
SELECT topology.Intersects(a.topo, b.topo) FROM nei_topo AS a JOIN nei_topo AS b ON b.gid = a.gid WHERE a.gid = 1;
t
Після створення топологій і, можливо, пов'язаних топологічних шарів, ви можете експортувати їх у файловий формат для резервного копіювання або перенесення в іншу базу даних.
Використання стандартних інструментів PostgreSQL для вивантаження/відновлення є проблематичним, оскільки топології складаються з набору таблиць (4 для примітивних типів, довільна кількість для шарів) та записів у таблицях метаданих (topology.topology та topology.layer). Крім того, ідентифікатори топології не є однозначними в різних базах даних, тому параметри топології потрібно буде змінити після її відновлення.
Для спрощення експорту/відновлення топологій надається пара виконуваних файлів: pgtopo_export та pgtopo_import. Приклад використання:
pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db
Скрипт pgtopo_export бере ім'я бази даних і топологію та виводить файл дампа, який можна використовувати для імпорту топології (та пов'язаних шарів) до нової бази даних.
За замовчуванням pgtopo_export записує файл дампа у стандартний вивід, щоб його можна було передати до pgtopo_import або перенаправити до файлу (відмовляючись записувати в термінал). За бажанням можна вказати ім'я файлу виводу за допомогою параметра командного рядка -f.
За замовчуванням pgtopo_export включає вивантаження всіх шарів, визначених для заданої топології. Це може бути більше даних, ніж вам потрібно, або вони можуть не працювати (у випадку, якщо таблиці шарів мають складні залежності). У такому випадку ви можете попросити пропустити шари за допомогою перемикача --skip-layers і обробити їх окремо.
Виклик pgtopo_export з параметром --help (або -h для скорочення) завжди виведе короткий текст про використання.
Формат файлу дампа — це стиснений архів tar каталогу pgtopo_export, що містить принаймні файл pgtopo_dump_version з інформацією про версію формату. Починаючи з версії 1, каталог містить CSV-файли, розділені табуляцією, з даними таблиць примітивних елементів топології (node, edge_data, face, relation), пов'язаними з ними записами топології та шарів, а також (якщо не вказано --skip-layers) дамп таблиць у форматі PostgreSQL, що повідомляються як шари заданої топології.
Скрипт pgtopo_import приймає дамп топології у форматі pgtopo_export та ім'я, яке буде надано створюваній топології, і виводить SQL-скрипт, що відтворює топологію та пов'язані з нею шари.
Створений файл SQL міститиме оператори, які створюють топологію з заданою назвою, завантажують в неї примітивні дані, відновлюють і реєструють усі шари топології, правильно пов'язуючи всі значення TopoGeometry з відповідною топологією.
За замовчуванням pgtopo_import зчитує дамп із стандартного вводу, щоб його можна було використовувати разом із pgtopo_export у конвеєрі. За бажанням можна вказати ім'я вхідного файлу за допомогою параметра командного рядка -f.
За замовчуванням pgtopo_import включає у вихідний файл SQL код для відновлення всіх шарів, знайдених у дампі.
Це може бути небажаним або непрацюючим у випадку, якщо ваша цільова база даних вже містить таблиці з такими самими іменами, як і в дампі. У такому випадку ви можете попросити пропустити рівні за допомогою перемикача --skip-layers і обробити їх окремо (або пізніше).
SQL для завантаження та зв'язування шарів тільки з топологією з іменем можна створити за допомогою перемикача --only-layers. Це може бути корисно для завантаження шарів ПІСЛЯ вирішення конфліктів імен або для зв'язування шарів з іншою топологією (наприклад, простою версією вихідної топології).
Якщо цільова топологія вже існує і ви хочете її видалити заздалегідь, ви можете передати параметр --drop-topology (починаючи з PostGIS-3.6.0).
For most use cases, you will create PostGIS rasters by loading existing raster files using the packaged raster2pgsql raster loader.
The raster2pgsql is a raster loader executable that loads GDAL supported raster formats into SQL suitable for loading into a PostGIS raster table. It is capable of loading folders of raster files as well as creating overviews of rasters.
Since the raster2pgsql is compiled as part of PostGIS most often (unless you compile your own GDAL library), the raster types supported by the executable will be the same as those compiled in the GDAL dependency library. To get a list of raster types your particular raster2pgsql supports use the -G switch.
![]() | |
When creating overviews of a specific factor from a set of rasters that are aligned, it is possible for the overviews to not align. Visit http://trac.osgeo.org/postgis/ticket/1764 for an example where the overviews do not align. |
An example session using the loader to create an input file and uploading it chunked in 100x100 tiles might look like this:
The loader assigns SRID 4326, creates an index and standard constraints, analyzes the loaded table, records source filenames, and stores the input rasters in 100 by 100 pixel tiles.
raster2pgsql -s 4326 -I -C -M -F -t 100x100 *.tif public.demelevation > elev.sql psql -d gisdb -f elev.sql
![]() | |
If you do not specify the schema as part of the target table name, the table will be created in the default schema of the database or user you are connecting with. |
A conversion and upload can be done all in one step using UNIX pipes:
raster2pgsql -s 4326 -I -C -M -F -t 100x100 \ *.tif public.demelevation | psql -d gisdb
Load rasters Massachusetts state plane meters aerial tiles into a schema called aerial and create a full view, 2 and 4 level overview tables, use copy mode for inserting (no intermediary file just straight to db), and -e don't force everything in a transaction (good if you want to see data in tables right away without waiting). Break up the rasters into 128x128 pixel tiles and apply raster constraints. Use copy mode instead of table insert. (-F) Include a field called filename to hold the name of the file the tiles were cut from.
raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128 -l 2,4 \ bostonaerials2008/*.jpg aerials.boston | psql -U postgres -d gisdb -h localhost -p 5432
List the raster formats supported by this build:
raster2pgsql -G
The -G command outputs a list something like:
Available GDAL raster formats: Virtual Raster GeoTIFF National Imagery Transmission Format Raster Product Format TOC format ECRG TOC format Erdas Imagine Images (.img) CEOS SAR Image CEOS Image ... Arc/Info Export E00 GRID ZMap Plus Grid NOAA NGS Geoid Height Grids
Long options that take values also accept the --option=value spelling.
-?, --helpDisplay help screen. Help will also display if you don't pass in any arguments.
-G, --gdal-formatsPrint the supported raster formats.
-cCreate new table and populate it with raster(s), this is the default mode
-aAppend raster(s) to an existing table.
-dDrop table, create new one and populate it with raster(s)
-pPrepare mode, only create the table.
--if-not-existsUse IF NOT EXISTS for table creation in -c and -p modes. When -I or --create-index is also specified, use IF NOT EXISTS for index creation too. This option cannot be used with -d. Append mode requires an explicit creation action.
The short modes are presets over explicit actions. The equivalent long options are --drop-table, --create-table, --load-data, --create-index, --add-constraints, --vacuum, --analyze, and --no-transaction. Add --if-not-exists to make active creation actions use IF NOT EXISTS. --drop-table emits DROP TABLE IF EXISTS before the selected actions. With no mode specified, the default create/load actions still apply.
-C, --add-constraintsApply raster constraints -- srid, pixelsize etc. to ensure raster is properly registered in raster_columns view.
-x, --no-extentDisable setting the max extent constraint. Only applied if -C or --add-constraints is also used.
-r, --regular-blockingSet the constraints (spatially unique and coverage tile) for regular blocking. Only applied if -C or --add-constraints is also used.
-s, --srid [<FROM_SRID>:]<SRID>Assign the output raster to the specified SRID. When FROM_SRID is also provided, raster2pgsql marks the input raster with FROM_SRID and emits SQL that reprojects the raster to the target SRID. If the source SRID is omitted or is zero, the raster metadata will be checked to determine an appropriate source SRID. Reprojection cannot be used with copy mode.
-b, --band BANDIndex (1-based) of band to extract from raster. For more than one band index, separate with comma (,). If unspecified, all bands of raster will be extracted.
-t, --tile-size TILE_SIZECut raster into tiles to be inserted one per table row. TILE_SIZE is expressed as WIDTHxHEIGHT or set to the value "auto" to allow the loader to compute an appropriate tile size using the first raster and applied to all rasters.
-P, --padPad right-most and bottom-most tiles to guarantee that all tiles have the same width and height.
-R, --registerRegister the raster as a filesystem (out-db) raster.
Only the metadata of the raster and path location to the raster is stored in the database (not the pixels).
-l, --overview-factor OVERVIEW_FACTORCreate overview of the raster. For more than one factor, separate with comma(,). Overview table name follows the pattern o_overview factor_table, where overview factor is a placeholder for numerical overview factor and table is replaced with the base table name. If a source raster already has an overview with matching dimensions, that overview is reused. Created overview is stored in the database and is not affected by -R. Note that your generated sql file will contain both the main table and overview tables.
-N, --nodata NODATANODATA value to use on bands without a NODATA value.
-f, --raster-column COLUMNSpecify name of destination raster column, default is 'rast'
-F, --filenameAdd a column with the name of the file
-n, --filename-column COLUMNSpecify the name of the filename column. Implies -F.
-q, --quoteWrap PostgreSQL identifiers in quotes.
-IAlias for --create-index.
--create-indexCreate a GiST index on the raster column at the end of this raster2pgsql run. With repeated -a append runs, create the index on the final run or after loading; add --if-not-exists to make reruns tolerate an existing index.
-MVacuum analyze the raster table.
-k, --skip-nodata-checkKeeps empty tiles and skips NODATA value checks for each raster band. Note you save time in checking, but could end up with far more junk rows in your database and those junk rows are not marked as empty tiles.
-T, --tablespace tablespaceSpecify the tablespace for the new table. Note that indices (including the primary key) will still use the default tablespace unless the -X flag is also used.
-X, --index-tablespace tablespaceSpecify the tablespace for the table's new index. This applies to the primary key and the spatial index if the -I flag is used.
-Y, --copy [MAX_ROWS_PER_COPY]Use copy statements instead of insert statements. Optionally specify max_rows_per_copy; default 50 when not specified.
-e, --no-transactionExecute each statement individually, do not use a transaction.
-E, --endian ENDIANControl endianness of generated binary output of raster; specify 0 for XDR and 1 for NDR (default); only NDR output is supported now
-V, --wkb-version versionSpecify version of output format. Default is 0. Only 0 is supported at this time.
On many occasions, you'll want to create rasters and raster tables right in the database. There are a plethora of functions to do that. The general steps to follow.
Create a table with a raster column to hold the new raster records which can be accomplished with:
CREATE TABLE myrasters(rid serial primary key, rast raster);
There are many functions to help with that goal. If you are creating rasters not as a derivative of other rasters, you will want to start with: ST_MakeEmptyRaster, followed by ST_AddBand
You can also create rasters from geometries. To achieve that you'll want to use ST_AsRaster perhaps accompanied with other functions such as ST_Union or ST_MapAlgebraFct or any of the family of other map algebra functions.
There are even many more options for creating new raster tables from existing tables. For example you can create a raster table in a different projection from an existing one using ST_Transform
Once you are done populating your table initially, you'll want to create a spatial index on the raster column with something like:
CREATE INDEX myrasters_rast_st_convexhull_idx ON myrasters USING gist(ST_ConvexHull(rast));
Note the use of ST_ConvexHull since most raster operators are based on the convex hull of the rasters.
![]() | |
Pre-2.0 versions of PostGIS raster were based on the envelop rather than the convex hull. For the spatial indexes to work properly you'll need to drop those and replace with convex hull based index. |
Apply raster constraints using AddRasterConstraints
The raster2pgsql tool uses GDAL to access raster data, and can take advantage of a key GDAL feature: the ability to read from rasters that are stored remotely in cloud "object stores" (e.g. AWS S3, Google Cloud Storage).
Efficient use of cloud stored rasters requires the use of a "cloud optimized" format. The most well-known and widely used is the "cloud optimized GeoTIFF" format. Using a non-cloud format, like a JPEG, or an un-tiled TIFF will result in very poor performance, as the system will have to download the entire raster each time it needs to access a subset.
First, load your raster into the cloud storage of your choice. Once it is loaded, you will have a URI to access it with, either an "http" URI, or sometimes a URI specific to the service. (e.g., "s3://bucket/object"). To access non-public buckets, you will need to supply GDAL config options to authenticate your connection. Note that this command is reading from the cloud raster and writing to the database.
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
Once the table is loaded, you need to give the database permission to read from remote rasters, by setting two permissions, postgis.enable_outdb_rasters and postgis.gdal_enabled_drivers.
SET postgis.enable_outdb_rasters = true;
SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
To make the changes sticky, set them directly on your database. You will need to re-connect to experience the new settings.
ALTER DATABASE your_db SET postgis.enable_outdb_rasters = true;
ALTER DATABASE your_db SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
For non-public rasters, you may have to provide access keys to read from the cloud rasters. The same keys you used to write the raster2pgsql call can be set for use inside the database, with the postgis.gdal_vsi_options configuration. Note that multiple options can be set by space-separating the key=value pairs.
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
Once you have the data loaded and permissions set you can interact with the raster table like any other raster table, using the same functions. The database will handle all the mechanics of connecting to the cloud data when it needs to read pixel data.
There are two raster catalog views that come packaged with PostGIS. Both views utilize information embedded in the constraints of the raster tables. As a result the catalog views are always consistent with the raster data in the tables since the constraints are enforced.
raster_columns this view catalogs all the raster table columns in your database.
raster_overviews this view catalogs all the raster table columns in your database that serve as overviews for a finer grained table. Tables of this type are generated when you use the -l switch during load.
The raster_columns is a catalog of all raster table columns in your database that are of type raster. It is a view utilizing the constraints on the tables so the information is always consistent even if you restore one raster table from a backup of another database. The following columns exist in the raster_columns catalog.
If you created your tables not with the loader or forgot to specify the -C flag during load, you can enforce the constraints after the fact using AddRasterConstraints so that the raster_columns catalog registers the common information about your raster tiles.
r_table_catalog The database the table is in. This will always read the current database.
r_table_schema The database schema the raster table belongs to.
r_table_name raster table
r_raster_column the column in the r_table_name table that is of type raster. There is nothing in PostGIS preventing you from having multiple raster columns per table so its possible to have a raster table listed multiple times with a different raster column for each.
srid The spatial reference identifier of the raster. Should be an entry in the Розділ 4.5, «Spatial Reference Systems».
scale_x The scaling between geometric spatial coordinates and pixel. This is only available if all tiles in the raster column have the same scale_x and this constraint is applied. Refer to ST_ScaleX for more details.
scale_y The scaling between geometric spatial coordinates and pixel. This is only available if all tiles in the raster column have the same scale_y and the scale_y constraint is applied. Refer to ST_ScaleY for more details.
blocksize_x The width (number of pixels across) of each raster tile . Refer to ST_Width for more details.
blocksize_y The width (number of pixels down) of each raster tile . Refer to ST_Height for more details.
same_alignment A boolean that is true if all the raster tiles have the same alignment . Refer to ST_SameAlignment for more details.
regular_blocking If the raster column has the spatially unique and coverage tile constraints, the value with be TRUE. Otherwise, it will be FALSE.
num_bands The number of bands in each tile of your raster set. This is the same information as what is provided by ST_NumBands
pixel_types An array defining the pixel type for each band. You will have the same number of elements in this array as you have number of bands. The pixel_types are one of the following defined in ST_BandPixelType.
nodata_values An array of double precision numbers denoting the nodata_value for each band. You will have the same number of elements in this array as you have number of bands. These numbers define the pixel value for each band that should be ignored for most operations. This is similar information provided by ST_BandNoDataValue.
out_db An array of boolean flags indicating if the raster bands data is maintained outside the database. You will have the same number of elements in this array as you have number of bands.
extent This is the extent of all the raster rows in your raster set. If you plan to load more data that will change the extent of the set, you'll want to run the DropRasterConstraints function before load and then reapply constraints with AddRasterConstraints after load.
spatial_index A boolean that is true if raster column has a spatial index.
raster_overviews catalogs information about raster table columns used for overviews and additional information about them that is useful to know when utilizing overviews. Overview tables are cataloged in both raster_columns and raster_overviews because they are rasters in their own right but also serve an additional special purpose of being a lower resolution caricature of a higher resolution table. These are generated along-side the main raster table when you use the -l switch in raster loading or can be generated manually using AddOverviewConstraints.
Overview tables contain the same constraints as other raster tables as well as additional informational only constraints specific to overviews.
![]() | |
The information in |
Two main reasons for overviews are:
Low resolution representation of the core tables commonly used for fast mapping zoom-out.
Computations are generally faster to do on them than their higher resolution parents because there are fewer records and each pixel covers more territory. Though the computations are not as accurate as the high-res tables they support, they can be sufficient in many rule-of-thumb computations.
The raster_overviews catalog contains the following columns of information.
o_table_catalog The database the overview table is in. This will always read the current database.
o_table_schema The database schema the overview raster table belongs to.
o_table_name raster overview table name
o_raster_column the raster column in the overview table.
r_table_catalog The database the raster table that this overview services is in. This will always read the current database.
r_table_schema The database schema the raster table that this overview services belongs to.
r_table_name raster table that this overview services.
r_raster_column the raster column that this overview column services.
overview_factor - this is the pyramid level of the overview table. The higher the number the lower the resolution of the table. raster2pgsql if given a folder of images, will compute overview of each image file and load separately. Level 1 is assumed and always the original file. Level 2 is will have each tile represent 4 of the original. So for example if you have a folder of 5000x5000 pixel image files that you chose to chunk 125x125, for each image file your base table will have (5000*5000)/(125*125) records = 1600, your (l=2) o_2 table will have ceiling(1600/Power(2,2)) = 400 rows, your (l=3) o_3 will have ceiling(1600/Power(2,3) ) = 200 rows. If your pixels aren't divisible by the size of your tiles, you'll get some scrap tiles (tiles not completely filled). Note that each overview tile generated by raster2pgsql has the same number of pixels as its parent, but is of a lower resolution where each pixel of it represents (Power(2,overview_factor) pixels of the original).
The fact that PostGIS raster provides you with SQL functions to render rasters in known image formats gives you a lot of options for rendering them. For example you can use OpenOffice / LibreOffice for rendering as demonstrated in Rendering PostGIS Raster graphics with LibreOffice Base Reports. In addition you can use a wide variety of languages as demonstrated in this section.
In this section, we'll demonstrate how to use the PHP PostgreSQL driver and the ST_AsGDALRaster family of functions to output band 1,2,3 of a raster to a PHP request stream that can then be embedded in an img src html tag.
The sample query demonstrates how to combine a whole bunch of raster functions together to grab all tiles that intersect a particular wgs 84 bounding box and then unions with ST_Union the intersecting tiles together returning all bands, transforms to user specified projection using ST_Transform, and then outputs the results as a png using ST_AsPNG.
You would call the script with http://mywebserver/test_raster.php?srid=2249 to get the raster image in Massachusetts state plane feet.
<?php
$conn_str = 'dbname=mydb host=localhost port=5432 user=myuser password=mypwd';
$dbconn = pg_connect($conn_str);
header('Content-Type: image/png');
if (!empty($_REQUEST['srid']) && is_numeric($_REQUEST['srid'])) {
$input_srid = intval($_REQUEST['srid']);
} else {
$input_srid = 26986;
}
$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]);
?>
In this section, we'll demonstrate how to use Npgsql PostgreSQL .NET driver and the ST_AsGDALRaster family of functions to output band 1,2,3 of a raster to the HTTP response stream so it can be embedded in an img tag.
You will need the npgsql .NET PostgreSQL driver for this exercise which you can get the latest of from http://npgsql.projects.postgresql.org/. Just download the latest and drop into your ASP.NET bin folder and you'll be good to go.
The sample query demonstrates how to combine a whole bunch of raster functions together to grab all tiles that intersect a particular wgs 84 bounding box and then unions with ST_Union the intersecting tiles together returning all bands, transforms to user specified projection using ST_Transform, and then outputs the results as a png using ST_AsPNG.
This is same example as Розділ 10.3.1, «PHP Example Outputting using ST_AsPNG in concert with other raster functions» except implemented in C#.
You would call the handler with http://mywebserver/TestRaster.ashx?srid=2249 to get the raster image in Massachusetts state plane feet.
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 {
string connectionString = System.Configuration.ConfigurationManager
.ConnectionStrings["DSN"].ConnectionString;
using (NpgsqlConnection conn = new NpgsqlConnection(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;
}
}
This is a simple java console app that takes a query that returns one image and outputs to specified file.
You can download the latest PostgreSQL JDBC drivers from http://jdbc.postgresql.org/download.html
You can compile the following code with commands like:
CLASSPATH=".:../postgresql.jar" javac SaveQueryImage.java jar cfm SaveQueryImage.jar Manifest.txt *.class
And call it from the command line with something like:
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);
}
}
}This is a plpython stored function that creates a file in the server directory for each record. Requires you have plpython installed. Should work fine with both plpythonu and 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. The PostgreSQL daemon account needs write access to the folder; this echoes 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
Sadly PSQL doesn't have easy to use built-in functionality for outputting binaries. This is a bit of a hack that piggy backs on PostgreSQL somewhat legacy large object support. To use it, first launch your psql command line connected to your database.
Unlike the python approach, this approach creates the file on your local computer.
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);oid | num_bytes ---------+----------- 2630819 | 74860
Note the large object OID and export it to a file on your local computer, replacing the example path with the desired file path.
\lo_export 2630819 'C:/temp/aerial_samp.png'
This deletes the file from large object storage in the database.
SELECT lo_unlink(2630819);
raster — це тип PostGIS для зберігання та аналізу растрових даних.
Для завантаження растрів з растрових файлів див. Розділ 10.1, «Loading and Creating Rasters»
Деякі приклади в цьому довіднику використовують растрову таблицю фіктивних даних, створену за допомогою наступного коду:
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);Нижче наведено функції, які можуть знадобитися користувачеві PostGIS Raster. Існують також інші функції підтримки растрових даних, які не представляють інтересу для звичайного користувача.
У цьому розділі перелічено типи даних PostgreSQL, спеціально створені для підтримки растрової функціональності.
geomval — Просторовий тип даних із двома полями — geom (містить об’єкт геометрії) та val (містить значення пікселя з растрового каналу у форматі double precision).
geomval — це складений тип даних, що складається з геометричного об’єкта, на який посилається поле .geom, та val — числа з подвійною точністю, яке представляє значення пікселя в певній геометричній точці в растровому каналі. Він використовується функціями ST_DumpAsPolygon та сімейством функцій перетину растрових даних як вихідний тип для розбиття растрового шару на геометричні полігони.
addbandarg — Складений тип, що використовується як вхідний параметр у функції ST_AddBand для визначення атрибутів та початкового значення нового каналу.
Складений тип, що використовується як вхідний параметр у функції ST_AddBand для визначення атрибутів та початкового значення нового каналу
| Field | Type | Description |
|---|---|---|
index | integer | Значення з відліком від 1, яке вказує позицію, куди буде додано новий шар серед каналів растра. Якщо вказано NULL, новий канал буде додано в кінець списку шарів растра. |
pixeltype | text | Pixel type of the new band. One of the pixel types described in ST_BandPixelType. |
initialvalue | double precision | Initial value that all pixels of the new band will be set to. |
nodataval | double precision | Значення NODATA для нового каналу. Якщо встановлено NULL, новий канал не матиме призначеного значення NODATA. |
rastbandarg — Композитний тип, який використовується, коли потрібно виразити растр і індекс каналу цього растра.
Комбінований тип, який використовується, коли потрібно виразити растр і індекс каналу цього растру.
| Field | Type | Description |
|---|---|---|
rast | raster | The raster in question. |
nband | integer | 1-based value indicating the raster band. |
raster — растровий тип просторових даних.
Растр — це тип просторових даних, що використовується для представлення растрових даних, таких як дані, імпортовані з файлів JPEG, TIFF, PNG, цифрових моделей рельєфу. Кожен растр має 1 або більше каналів, кожен з яких має набір значень пікселів. Растри можуть бути геореферентними.
![]() | |
Вимагає компіляції PostGIS з підтримкою GDAL. Наразі растри можуть бути неявним чином перетворені на геометричний тип, але перетворення повертає ST_ConvexHullрастра. Це автоматичне перетворення може бути видалене в найближчому майбутньому, тому не покладайтеся на нього. |
У цьому розділі перелічено автоматичні та явні приведення типів, дозволені для цього типу даних
| Приведення типів в | Поведінка |
|---|---|
| geometry | автоматичне |
reclassarg — Композитний тип, що використовується як вхідні дані для функції ST_Reclass, яка визначає поведінку перекласифікації.
Композитний тип, що використовується як вхідні дані для функції ST_Reclass, яка визначає поведінку перекласифікації.
| Field | Type | Description |
|---|---|---|
nband | integer | Номер каналу, який потрібно перекласифікувати. |
reclassexpr | text | Comma-delimited range:map_range mappings that define how old band values map to new band values. |
pixeltype | text | One of defined pixel types as described in ST_BandPixelType. |
nodataval | double precision | Значення, яке слід розглядати як відсутність даних. Для зображень, що підтримують прозорість, ці поля будуть порожніми. |
The reclassexpr range delimiters mean: ( greater than, ) less than, ] less than or equal, and [ greater than or equal.
[a-b] means a <= x <= b.
(a-b] means a < x <= b.
[a-b) means a <= x < b.
(a-b) means a < x < b.
Opening-parenthesis notation is optional, so a-b means the same as (a-b).
Reclassify band 2 as an 8BUI where 255 is nodata value.
SELECT ROW(2, '0-100:1-10, 101-500:11-150,501 - 10000: 151-254', '8BUI', 255)::reclassarg;
Reclassify band 1 as an 1BB and no nodata value defined.
SELECT ROW(1, '0-100]:0, (100-255:1', '1BB', NULL)::reclassarg;
summarystats — Композитний тип, що повертається функціями ST_SummaryStats та ST_SummaryStatsAgg.
Композитний тип, що повертається функціями ST_SummaryStats та ST_SummaryStatsAgg.
Кількість пікселів, що враховуються для зведеної статистики.
Сума всіх підрахованих значень пікселів.
Арифметичне середнє всіх підрахованих значень пікселів.
Стандартне відхилення всіх підрахованих значень пікселів.
Мінімальне значення підрахованих значень пікселів.
Максимальне значення підрахованих значень пікселів.
unionarg — Композитний тип, що використовується як вхідні дані для функції ST_Union, яка визначає смуги, що підлягають обробці, та поведінку операції UNION.
Композитний тип, що використовується як вхідні дані для функції ST_Union, яка визначає смуги, що підлягають обробці, та поведінку операції UNION.
| Field | Type | Description |
|---|---|---|
nband | integer | Значення на основі 1, що вказує діапазон кожного вхідного растра, який підлягає обробці. |
uniontype | text | Type of union operation. One of the types described in ST_Union. |
AddRasterConstraints — Додає обмеження растру до завантаженої таблиці растру для певного стовпця, що обмежує просторове посилання, масштабування, розмір блоку, вирівнювання, смуги, тип смуги та прапорець, що позначає, чи стовпець растру регулярно блокується. Таблиця повинна бути завантажена даними, щоб обмеження могли бути виведені. Повертає значення true, якщо налаштування обмеження було виконано, і видає повідомлення в іншому випадку.
boolean AddRasterConstraints(name rasttable, name rastcolumn, boolean srid=true, boolean scale_x=true, boolean scale_y=true, boolean blocksize_x=true, boolean blocksize_y=true, boolean same_alignment=true, boolean regular_blocking=false, boolean num_bands=true , boolean pixel_types=true , boolean nodata_values=true , boolean out_db=true , boolean extent=true );
boolean AddRasterConstraints(name rasttable, name rastcolumn, text[] VARIADIC constraints);
boolean AddRasterConstraints(name rastschema, name rasttable, name rastcolumn, text[] VARIADIC constraints);
boolean AddRasterConstraints(name rastschema, name rasttable, name rastcolumn, boolean srid=true, boolean scale_x=true, boolean scale_y=true, boolean blocksize_x=true, boolean blocksize_y=true, boolean same_alignment=true, boolean regular_blocking=false, boolean num_bands=true, boolean pixel_types=true, boolean nodata_values=true , boolean out_db=true , boolean extent=true );
Створює обмеження для стовпця растра, які використовуються для відображення інформації в каталозі растра raster_columns. rastschema — це назва схеми таблиці, в якій знаходиться таблиця. srid має бути цілим числом, що посилається на запис у таблиці SPATIAL_REF_SYS.
Завантажувач raster2pgsql використовує цю функцію для реєстрації растрових таблиць
Дійсні імена обмежень для передачі: детальнішу інформацію див. у Розділ 10.2.1, «Raster Columns Catalog».
blocksize встановлює розмір блоку як по осі X, так і по осі Y
blocksize_x встановлює розмір плитки X (ширина кожної плитки в пікселях)
blocksize_y встановлює Y-плитку (висоту кожної плитки в пікселях)
extent обчислює розмір всієї таблиці та застосовує обмеження, згідно з яким усі растри повинні знаходитися в межах цього розміру
num_bands кількість смуг
pixel_types зчитує масив типів пікселів для кожного діапазону, щоб переконатися, що всі діапазони n мають однаковий тип пікселів
regular_blocking встановлює обмеження просторової унікальності (жодні два растри не можуть бути просторово однаковими) та покриття плитки (растр вирівнюється до покриття)
same_alignment гарантує, що всі вони мають однакове вирівнювання, тобто будь-які дві плитки, які ви порівнюєте, будуть повертати значення true. Див. ST_SameAlignment.
srid гарантує, що всі мають однаковий srid
Більше — все, що вказано як вхідні дані для вищезазначених функцій
![]() | |
Ця функція виводить обмеження на основі даних, що вже містяться в таблиці. Щоб вона працювала, спочатку потрібно створити стовпець растрових даних, а потім завантажити в нього дані. |
![]() | |
Якщо вам потрібно завантажити більше даних у таблиці після того, як ви вже застосували обмеження, ви можете запустити DropRasterConstraints, якщо обсяг ваших даних змінився. |
Доступність: 2.0.0
Apply all possible constraints on column based on data.
Verify the raster table is registered correctly in the raster_columns view.
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);
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}Apply single constraint.
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');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. Корисно, якщо вам потрібно завантажити більше даних або оновити дані стовпця растра. Вам не потрібно це робити, якщо ви хочете позбутися таблиці растра або стовпця растра.
To drop a raster table use standard SQL: DROP TABLE mytable.
To drop just a raster column and leave the rest of the table, use standard SQL: ALTER TABLE mytable DROP COLUMN rast.
таблиця зникне з каталогу raster_columns, якщо стовпець або таблиця будуть видалені. Однак, якщо будуть видалені тільки обмеження, стовпець растра все одно буде вказаний у каталозі raster_columns, але крім імені стовпця та таблиці про нього не буде жодної іншої інформації.
Доступність: 2.0.0
SELECT DropRasterConstraints ('myrasters', 'rast');droprasterconstraints ----------------------- t (1 row)
Verify change in raster_columns.
SELECT srid, scale_x, scale_y, blocksize_x, blocksize_y, num_bands, pixel_types, nodata_values
FROM raster_columns
WHERE r_table_name = 'myrasters';srid | scale_x | scale_y | blocksize_x | blocksize_y | num_bands | pixel_types| nodata_values
------+---------+---------+-------------+-------------+-----------+-------------+---------------
0 | | | | | | |AddOverviewConstraints — Позначте стовпець растрових даних як огляд іншого стовпця.
boolean AddOverviewConstraints(name ovschema, name ovtable, name ovcolumn, name refschema, name reftable, name refcolumn, int ovfactor);
boolean AddOverviewConstraints(name ovtable, name ovcolumn, name reftable, name refcolumn, int ovfactor);
Додає обмеження до стовпця растра, які використовуються для відображення інформації в каталозі растрів raster_overviews.
Параметр ovfactor представляє коефіцієнт масштабування в стовпці огляду: вищі коефіцієнти огляду мають нижчу роздільну здатність.
Якщо параметри ovschema та refschema пропущені, буде використана перша таблиця, знайдена під час сканування search_path.
Доступність: 2.0.0
Verify the raster table is registered correctly in the raster_overviews view.
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);
SELECT o_table_name ot, o_raster_column oc,
r_table_name rt, r_raster_column rc,
overview_factor f
FROM raster_overviews WHERE o_table_name = 'res2';ot | oc | rt | rc | f ------+----+------+----+--- res2 | r2 | res1 | r1 | 2 (1 row)
DropOverviewConstraints — Зніміть позначку стовпця растрового зображення, щоб він не був представленням іншого.
boolean DropOverviewConstraints(name ovschema, name ovtable, name ovcolumn);
boolean DropOverviewConstraints(name ovtable, name ovcolumn);
Видалити з колонки растра обмеження, що використовуються для відображення її як представлення іншого растра в каталозі растрів raster_overviews.
Якщо параметр ovschema пропущено, буде використано першу таблицю, знайдено під час сканування search_path.
Доступність: 2.0.0
PostGIS_GDAL_Version — Повідомляє про версію бібліотеки GDAL, яка використовується PostGIS.
text PostGIS_GDAL_Version();
Повідомляє про версію бібліотеки GDAL, яка використовується PostGIS. Також перевіряє і повідомляє, чи може GDAL знайти свої файли даних.
SELECT PostGIS_GDAL_Version();
GDAL 1.11dev, released 2013/04/13
PostGIS_Raster_Lib_Build_Date — Повідомляє дату створення повної растрової бібліотеки.
text PostGIS_Raster_Lib_Build_Date();
Звіти про дату створення растру
SELECT PostGIS_Raster_Lib_Build_Date();
2010-04-28 21:15:10
PostGIS_Raster_Lib_Version — Повідомляє про повну растрову версію та інформацію про конфігурацію збірки.
text PostGIS_Raster_Lib_Version();
Повідомляє про повну растрову версію та інформацію про конфігурацію збірки.
SELECT PostGIS_Raster_Lib_Version();
2.0.0
ST_GDALDrivers — Повертає список растрових форматів, що підтримуються PostGIS через GDAL. Тільки формати з can_write=True можуть використовуватися ST_AsGDALRaster.
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);
Повертає список растрових форматів short_name, long_name та опцій creator для кожного формату, що підтримується GDAL. Використовуйте short_name як вхідні дані в параметрі format ST_AsGDALRaster. Опції залежать від драйверів, з якими було скомпільовано libgdal. create_options повертає набір CreationOptionList/Option у форматі xml, що складається з імені та опціональних type, description та набору VALUE для кожної опції creator для конкретного драйвера.
Змінено: 2.5.0 — додано стовпці can_read та can_write.
Змінено: 2.0.6, 2.1.3 — за замовчуванням драйвери не ввімкнені, якщо не встановлено GUC або змінну середовища gdal_enabled_drivers.
Доступність: 2.0.0 — вимагає GDAL >= 1.6.0.
List of Drivers.
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
List of options for each driver.
Output the create options XML column of JPEG as a table. These creator options can be used in the 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 generate 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)This example turns a few common GeoTIFF creator options into a compact table.
WITH gtiff_options AS (
SELECT
option_name,
option_type,
default_value
FROM ST_GDALDrivers() AS driver
CROSS JOIN LATERAL XMLTABLE(
'/CreationOptionList/Option'
PASSING (driver.create_options::xml)
COLUMNS
option_name text PATH '@name',
option_type text PATH '@type',
default_value text PATH '@default'
) AS options
WHERE driver.short_name = 'GTiff'
)
SELECT option_name AS name, option_type AS type, coalesce(default_value, '') AS default_value
FROM gtiff_options
WHERE option_name = ANY (ARRAY[
'COMPRESS',
'INTERLEAVE',
'TILED',
'BLOCKXSIZE',
'BLOCKYSIZE',
'JPEG_QUALITY'
])
ORDER BY 1;name | type | default_value ---------------+---------------+--------------- BLOCKXSIZE | int | BLOCKYSIZE | int | COMPRESS | string-select | INTERLEAVE | string-select | PIXEL JPEG_QUALITY | int | 75 TILED | boolean | (6 rows)
Use XMLTABLE to expose selected GTiff creation options as rows. The same pattern can be used without the name filter to inspect the full XML document.
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL';
SELECT option_name, option_type
FROM ST_GDALDrivers() AS driver
CROSS JOIN LATERAL XMLTABLE(
'/CreationOptionList/Option'
PASSING (driver.create_options::xml)
COLUMNS
option_name text PATH '@name',
option_type text PATH '@type'
) AS options
WHERE driver.short_name = 'GTiff'
AND option_name IN ('COMPRESS', 'TILED', 'BIGTIFF')
ORDER BY option_name;option_name | option_type -------------+--------------- BIGTIFF | string-select COMPRESS | string-select TILED | boolean (3 rows)
UpdateRasterSRID — Змінити SRID всіх растрів у вказаній користувачем колонці та таблиці.
raster UpdateRasterSRID(name schema_name, name table_name, name column_name, integer new_srid);
raster UpdateRasterSRID(name table_name, name column_name, integer new_srid);
Змінити SRID всіх растрів у вказаній користувачем колонці та таблиці. Перед зміною SRID растрів у вказаній колонці функція видалить усі відповідні обмеження колонки (розмір, вирівнювання та SRID).
![]() | |
Ця функція не впливає на дані (значення пікселів смуги) растрів. Змінюються лише метадані растра. |
Доступність: 2.1.0
ST_CreateOverview — Створити версію заданого растрового покриття зі зниженою роздільною здатністю.
regclass ST_CreateOverview(regclass tab, name col, int factor, text algo='NearestNeighbor');
Створіть оглядову таблицю з передискретизованими плитками з вихідної таблиці. Вихідні плитки матимуть той самий розмір, що й вхідні, і покриватимуть ту саму просторову площу з меншою роздільною здатністю (розмір пікселя буде 1/factor від оригіналу в обох напрямках).
Таблиця огляду буде доступна в каталозі raster_overviews і матиме обмеження растрового формату.
Варіанти алгоритму: 'NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline' та 'Lanczos'. Докладнішу інформацію див. у розділі: Методи передискретизації GDAL Warp.
Доступність: 2.2.0
Вихідна якість загалом краща, але формат продукту створюється повільніше
SELECT ST_CreateOverview('mydata.mytable'::regclass, 'rast', 2, 'Lanczos');Вивід для швидшої обробки найближчого сусіда за замовчуванням
SELECT ST_CreateOverview('mydata.mytable'::regclass, 'rast', 2);ST_AddBand — Повертає растр з новим каналом (каналами) заданого типу, доданим із заданим початковим значенням у заданому місці індексу. Якщо індекс не вказано, діапазон додається в кінець.
(1) raster ST_AddBand(raster rast, addbandarg[] addbandargset);
(2) raster ST_AddBand(raster rast, integer index, text pixeltype, double precision initialvalue=0, double precision nodataval=NULL);
(3) raster ST_AddBand(raster rast, text pixeltype, double precision initialvalue=0, double precision nodataval=NULL);
(4) raster ST_AddBand(raster torast, raster fromrast, integer fromband=1, integer torastindex=at_end);
(5) raster ST_AddBand(raster torast, raster[] fromrasts, integer fromband=1, integer torastindex=at_end);
(6) raster ST_AddBand(raster rast, integer index, text outdbfile, integer[] outdbindex, double precision nodataval=NULL);
(7) raster ST_AddBand(raster rast, text outdbfile, integer[] outdbindex, integer index=at_end, double precision nodataval=NULL);
Повертає растр з новим каналом, доданим у заданому положенні (індексі), заданого типу, заданого початкового значення та заданого значення nodata. Якщо індекс не вказано, діапазон додається в кінець. Якщо fromband не вказано, вважається, що це діапазон 1. Тип пікселя — це рядкове представлення одного з типів пікселів, зазначених у ST_BandPixelType. Якщо вказано існуючий індекс, усі наступні смуги >= цей індекс збільшуються на 1. Якщо вказано початкове значення, яке перевищує максимальне значення типу пікселя, то початкове значення встановлюється на найвище значення, дозволене типом пікселя.
Для варіанту, що приймає масив addbandarg(Варіант 1), конкретне значення індексу addbandarg є відносним до растру на момент додавання до растру каналу, описаної цим addbandarg. Дивіться приклад "Кілька нових каналів" нижче.
Для варіанту, який приймає масив растрів (Варіант 5), якщо torast дорівнює NULL, то канал fromband кожного растра в масиві накопичується в новому растрі.
Для варіантів, які приймають outdbfile (варіанти 6 і 7), значення повинно містити повний шлях до растрового файлу. Файл також повинен бути доступним для процесу сервера postgres.
Покращено: додано підтримку addbandarg 2.1.0.
Покращено: додано підтримку 2.1.0 для нових діапазонів out-db.
Single New Band.
This example adds another 8-bit unsigned integer band 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.
Output metadata for the raster bands to verify they are correct.
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[]
)
);
SELECT (bmd).*
FROM (SELECT ST_BandMetaData(rast, generate_series(1, 2)) As bmd
FROM dummy_rast WHERE rid = 10) AS foo;pixeltype | nodatavalue | isoutdb | path -----------+----------------+-------------+---------+------ 1BB | | f | 4BUI | | f |
This example outputs metadata for the raster.
SELECT (rmd).width, (rmd).height, (rmd).numbands
FROM (SELECT ST_MetaData(rast) As rmd
FROM dummy_rast WHERE rid = 10) AS foo;width | height | numbands -------+--------+---------- 100 | 100 | 2
Multiple New Bands.
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 | outdbbandnum | filesize | filetimestamp
---------+-----------+-------------+---------+------+--------------+----------+---------------
1 | 8BUI | 0 | f | null | null | null | null
2 | 32BF | -1 | f | null | null | null | null
3 | 32BUI | 12 | f | null | null | null | null
4 | 16BUI | 2 | f | null | null | null | nullAggregate 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 that The ORDER BY test_type clause relies on aggregate ORDER BY support. 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;
New Out-db band.
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.tifST_AsRaster — Перетворює геометрію PostGIS у растр PostGIS.
raster ST_AsRaster(geometry geom, raster ref, text pixeltype, double precision value=1, double precision nodataval=0, boolean touched=false);
raster ST_AsRaster(geometry geom, raster ref, text[] pixeltype=ARRAY['8BUI'], double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], boolean touched=false);
raster ST_AsRaster(geometry geom, double precision scalex, double precision scaley, double precision gridx, double precision gridy, text pixeltype, double precision value=1, double precision nodataval=0, double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, double precision scalex, double precision scaley, double precision gridx=NULL, double precision gridy=NULL, text[] pixeltype=ARRAY['8BUI'], double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, double precision scalex, double precision scaley, text pixeltype, double precision value=1, double precision nodataval=0, double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, double precision scalex, double precision scaley, text[] pixeltype, double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, integer width, integer height, double precision gridx, double precision gridy, text pixeltype, double precision value=1, double precision nodataval=0, double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, integer width, integer height, double precision gridx=NULL, double precision gridy=NULL, text[] pixeltype=ARRAY['8BUI'], double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, integer width, integer height, text pixeltype, double precision value=1, double precision nodataval=0, double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false);
raster ST_AsRaster(geometry geom, integer width, integer height, text[] pixeltype, double precision[] value=ARRAY[1], double precision[] nodataval=ARRAY[0], double precision upperleftx=NULL, double precision upperlefty=NULL, double precision skewx=0, double precision skewy=0, boolean touched=false);
Перетворює геометрію PostGIS у растр PostGIS. Багато варіантів пропонують три групи можливостей для налаштування вирівнювання та розміру пікселів отриманого растру.
Перша група, що складається з двох перших варіантів, створює растр, який має таке саме вирівнювання (scalex, scaley, gridx та gridy), тип пікселів та значення nodata, як і наданий еталонний растр. Зазвичай цей еталонний растр передається шляхом об'єднання таблиці, що містить геометрію, з таблицею, що містить еталонний растр.
Друга група, що складається з чотирьох варіантів, дозволяє встановити розміри растру, задавши параметри розміру пікселя (scalex &scaley та skewx &skewy). Ширина width та висота height отриманого растра будуть скориговані відповідно до розмірів геометрії. У більшості випадків необхідно перетворити цілі аргументи scalex та scaley у подвійну точність, щоб PostgreSQL вибрав правильний варіант.
Третя група, що складається з чотирьох варіантів, дозволяє зафіксувати розміри растра, вказавши розміри растра (width &height). Параметри розміру пікселя (scalex &scaley та skewx &skewy) отриманого растра будуть скориговані відповідно до розмірів геометрії.
Два перших варіанти кожної з цих двох останніх груп дозволяють вказати вирівнювання за допомогою довільного кута сітки вирівнювання (gridx &gridy), а два останніх варіанти використовують верхній лівий кут (upperleftx &upperlefty).
Кожна група варіантів дозволяє створити односмуговий або багатосмуговий растр. Щоб створити багатосмуговий растр, необхідно вказати масив типів пікселів (pixeltype[]), масив початкових значень (value) та масив значень nodata (nodataval). Якщо не вказано, pixeltyped за замовчуванням дорівнює 8BUI, values дорівнює 1, а nodataval дорівнює 0.
Вихідний растр буде мати ту саму просторову систему координат, що й вихідна геометрія. Єдиним винятком є варіанти з еталонним растром. У цьому випадку вихідний растр отримає той самий SRID, що й еталонний растр.
Опціональний параметр touched за замовчуванням має значення false і відповідає опції растрування GDAL ALL_TOUCHED, яка визначає, чи будуть спалені пікселі, до яких торкаються лінії або полігони. Не тільки ті, що знаходяться на шляху рендерингу лінії, або ті, центральна точка яких знаходиться всередині полігону.
Це особливо корисно для візуалізації jpeg- та png-файлів геометрій безпосередньо з бази даних при використанні в поєднанні з ST_AsPNGта іншими функціями сімейства ST_AsGDALRaster.
Доступність: 2.0.0 — вимагає GDAL >= 1.6.0.
Curved geometry inputs are linearized before rasterization, including NURBSCurve inputs handled by PostGIS. TIN and PolyhedralSurface inputs are not supported.
This example outputs a black circle on a white background, occupying 150 by 150 pixels.
SELECT ST_AsPNG(
ST_AsRaster(
ST_Buffer(ST_Point(1, 5), 10),
150, 150,
ARRAY['8BUI', '8BUI', '8BUI'],
ARRAY[0, 0, 0],
ARRAY[255, 255, 255]
)
) AS image;image
-------------------------------
PNG image, 150 x 150 pixels
This example maps bands to RGB channels, producing the teal value (118,154,118).
SELECT ST_AsPNG(
ST_AsRaster(
ST_Buffer('LINESTRING(50 50,150 150,150 50)'::geometry, 10, 'join=bevel'),
200, 200,
ARRAY['8BUI', '8BUI', '8BUI'],
ARRAY[118, 154, 118],
ARRAY[255, 255, 255]
)
) AS image;image
-------------------------------
PNG image, 200 x 200 pixels
ST_BandPixelType, ST_Buffer, ST_GDALDrivers, ST_AsGDALRaster, ST_AsPNG, ST_AsJPEG, ST_SRID
ST_AsRasterAgg — Агрегація. Перетворює геометрії PostGIS у новий растр.
raster ST_AsRasterAgg(geometry geom, double precision val, raster ref, text pixeltype, double precision nodataval, text uniontype, boolean touched);
Повертає одноканальний растр, що містить відтворену версію всіх вхідних геометрій, кожна з яких має відповідне значення.
Доступність: 3.6.0
WITH inp(g, v) AS (
VALUES
( ST_Buffer(ST_MakePoint(10, 0), 10), 1 ),
( ST_Buffer(ST_MakePoint(20, 0), 10), 2 )
),
agg AS (
SELECT ST_AsRasterAgg(
g,
v,
ST_MakeEmptyRaster(0, 0, 0, 0, 1.0),
'8BUI',
99,
'SUM',
true
) r
FROM inp
)
SELECT
ST_Width(r) w,
ST_Height(r) h,
ST_Value(r, 'POINT(5 0)') v5_0,
ST_Value(r, 'POINT(15 0)') v15_0,
ST_Value(r, 'POINT(25 0)') v25_0
FROM agg;w | h | v5_0 | v15_0 | v25_0 ----+----+------+-------+------- 30 | 20 | 1 | 3 | 2 (1 row)
ST_Band — Повертає один або декілька каналів існуючого растру як новий растр. Корисно для створення нових растрів на основі існуючих.
raster ST_Band(raster rast, integer[] nbands = ARRAY[1]);
raster ST_Band(raster rast, integer nband);
raster ST_Band(raster rast, text nbands, character delimiter=,);
Повертає один або декілька каналів існуючого растра як новий растр. Корисно для створення нових растрів з існуючих растрів або експорту лише вибраних каналів растра, або для зміни порядку каналів у растрі. Якщо канал не вказано або будь-який із вказаних каналів не існує в растрі, то повертаються всі канали. Використовується як допоміжна функція в різних функціях, наприклад для видалення каналів.
![]() | |
Для |
Доступність: 2.0.0
This example creates two rasters: one containing band 1 of dummy_rast, and one containing band 2 reclassified as 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 | 2BUIReturn 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;
2
Return bands 2 and 3 using array syntax.
SELECT ST_NumBands(ST_Band(rast, ARRAY[2, 3])) As num_bands
FROM dummy_rast
WHERE rid=2;
2
This example uses three distinct shapes as the red, green, and blue bands of a synthetic raster. It compares the original RGB raster with band 2 followed by band 1 twice, and with band 3 alone.
WITH canvas AS (
SELECT ST_AddBand(
ST_AddBand(
ST_AddBand(
ST_MakeEmptyRaster(128, 128, 0, 128, 1, -1, 0, 0, 0),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
) AS rast
), bands AS (
SELECT ST_SetValue(
ST_SetValue(
ST_SetValue(rast, 1, ST_Buffer('POINT(32 96)'::geometry, 22), 220),
2, ST_Buffer('LINESTRING(18 20,110 110)'::geometry, 6,
'endcap=flat join=bevel'), 210
),
3, ST_Buffer('LINESTRING(10 48,118 48)'::geometry, 7,
'endcap=flat'), 180
) AS rast
FROM canvas
)
SELECT ST_AsPNG(rast) AS "original RGB",
ST_AsPNG(ST_Band(rast, ARRAY[2, 1, 1])) AS "bands 2,1,1",
ST_AsPNG(ST_Band(rast, 3)) AS "band 3"
FROM bands;
original RGB | bands 2,1,1 | band 3 -----------------------------+----------------------------+---------------------------- PNG image, 128 x 128 pixels | PNG image, 128 x 128 pixels | PNG image, 128 x 128 pixels
Band selection from a multi-band raster.
![]() оригінал (стовпчик rast) | ![]() dupe_band |
![]() sing_band |
ST_AddBand, ST_NumBands, ST_Reclass, Розділ 11, Растрова довідка
ST_MakeEmptyCoverage — Покрийте геореференційну область сіткою порожніх растрових плиток.
raster ST_MakeEmptyCoverage(integer tilewidth, integer tileheight, integer width, integer height, double precision upperleftx, double precision upperlefty, double precision scalex, double precision scaley, double precision skewx, double precision skewy, integer srid=unknown);
Створіть набір растрових плиток за допомогою ST_MakeEmptyRaster. Розмір сітки становить width та height. Розмір плитки становить tilewidth та tileheight. Область, що охоплюється геореференцією, простягається від верхнього лівого кута (upperleftx, upperlefty) до нижнього правого кута (upperleftx + width * scalex, upperlefty + height * scaley).
![]() | |
Зверніть увагу, що scaley зазвичай є від'ємним для растрів, а scalex — додатним. Отже, нижній правий кут матиме нижче значення y і вище значення x, ніж верхній лівий кут. |
Доступність: 2.4.0
Створіть 16 плиток у сітці 4x4, щоб покрити область WGS84 від верхнього лівого кута (22, 77) до нижнього правого кута (55, 33).
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 | 0ST_MakeEmptyRaster — Повертає порожній растр (без каналів) заданих розмірів (ширина і висота), верхнього лівого кута X і Y, розміру пікселя і повороту (scalex, scaley, skewx і skewy) та системи координат (srid). Якщо передано растр, повертає новий растр з тим самим розміром, вирівнюванням та SRID. Якщо srid не вказано, просторова система координат встановлюється на невідому (0).
raster ST_MakeEmptyRaster(raster rast);
raster ST_MakeEmptyRaster(integer width, integer height, float8 upperleftx, float8 upperlefty, float8 scalex, float8 scaley, float8 skewx, float8 skewy, integer srid=unknown);
raster ST_MakeEmptyRaster(integer width, integer height, float8 upperleftx, float8 upperlefty, float8 pixelsize);
Повертає порожній растр (без каналу) заданих розмірів (ширина та висота) з геореференцією в просторових (або світових) координатах з верхнім лівим X (upperleftx), верхнім лівим Y (upperlefty), розміром пікселя та обертанням (scalex, scaley, skewx та skewy) і системи координат (srid).
В останній версії для визначення розміру пікселя (pixelsize) використовується єдиний параметр. scalex встановлюється на значення цього аргументу, а scaley — на від'ємне значення цього аргументу. skewx і skewy встановлюються на 0.
Якщо передається існуючий растр, він повертає новий растр з тими ж налаштуваннями метаданих (без каналів).
Якщо srid не вказано, за замовчуванням використовується значення 0. Після створення порожнього растру ви, ймовірно, захочете додати до нього канали і, можливо, відредагувати його. Дивіться ST_AddBandдля визначення каналів і ST_SetValueдля встановлення початкових значень пікселів.
Use an existing raster as a template and output metadata of the rasters we added.
INSERT INTO dummy_rast(rid, rast)
VALUES(3, ST_MakeEmptyRaster(100, 100, 0.0005, 0.0005, 1, 1, 0, 0, 4326) );
INSERT INTO dummy_rast(rid, rast)
SELECT 4, ST_MakeEmptyRaster(rast)
FROM dummy_rast WHERE rid = 3;
SELECT
rid,
(md).width,
(md).height,
(md).scalex,
(md).scaley,
(md).srid
FROM (
SELECT rid, ST_MetaData(rast) AS md
FROM dummy_rast
WHERE rid IN (3, 4)
) AS foo
ORDER BY rid;
rid | width | height | scalex | scaley | srid -----+-------+--------+--------+--------+------ 3 | 100 | 100 | 1 | 1 | 4326 4 | 100 | 100 | 1 | 1 | 4326
ST_AddBand, ST_MetaData, ST_ScaleX, ST_ScaleY, ST_SetValue, ST_SkewX, , ST_SkewY
ST_Tile — Повертає набір растрів, отриманих в результаті розділення вхідного растра на основі бажаних розмірів вихідних растрів.
setof raster ST_Tile(raster rast, int[] nband, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL);
setof raster ST_Tile(raster rast, integer nband, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL);
setof raster ST_Tile(raster rast, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL);
Повертає набір растрів, отриманих в результаті розділення вхідного растра на основі бажаних розмірів вихідних растрів.
Якщо padwithnodata = FALSE, крайні плитки з правого та нижнього боків растра можуть мати інші розміри, ніж решта плиток. Якщо padwithnodata = TRUE, всі плитки матимуть однакові розміри, при цьому крайні плитки можуть бути заповнені значеннями NODATA. Якщо для растрових смуг не вказано значення NODATA, його можна вказати, встановивши nodataval.
![]() | |
Якщо вказаний діапазон вхідного растра знаходиться поза межами бази даних, відповідний діапазон у вихідних растрах також буде поза межами бази даних. |
Доступність: 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
row_number() OVER (
ORDER BY ST_UpperLeftY(rast) DESC, ST_UpperLeftX(rast)
) AS tile_id,
rast
FROM (
SELECT ST_Tile(rast, 3, 3, TRUE) AS rast
FROM bar
) AS tiled
)
SELECT
tile_id,
ST_UpperLeftX(rast) AS ulx,
ST_UpperLeftY(rast) AS uly,
ST_Value(rast, 1, 1, 1) AS band1,
ST_Value(rast, 2, 1, 1) AS band2
FROM baz;tile_id | ulx | uly | band1 | band2
---------+-----+-----+-------+-------
1 | 0 | 0 | 1 | 10
2 | 3 | 0 | 2 | 20
3 | 6 | 0 | 3 | 30
4 | 0 | -3 | 4 | 40
5 | 3 | -3 | 5 | 50
6 | 6 | -3 | 6 | 60
7 | 0 | -6 | 7 | 70
8 | 3 | -6 | 8 | 80
9 | 6 | -6 | 9 | 90
(9 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
row_number() OVER (
ORDER BY ST_UpperLeftY(rast) DESC, ST_UpperLeftX(rast)
) AS tile_id,
rast
FROM (
SELECT ST_Tile(rast, ARRAY[2], 3, 3) AS rast
FROM bar
) AS tiled
)
SELECT
tile_id,
ST_UpperLeftX(rast) AS ulx,
ST_UpperLeftY(rast) AS uly,
ST_Value(rast, 1, 1, 1) AS band_value
FROM baz;tile_id | ulx | uly | band_value
---------+-----+-----+------------
1 | 0 | 0 | 10
2 | 3 | 0 | 20
3 | 6 | 0 | 30
4 | 0 | -3 | 40
5 | 3 | -3 | 50
6 | 6 | -3 | 60
7 | 0 | -6 | 70
8 | 3 | -6 | 80
9 | 6 | -6 | 90
(9 rows)ST_Retile — Повернути набір налаштованих плиток з довільно розбитого на плитки растрового покриття.
SETOF raster ST_Retile(regclass tab, name col, geometry ext, float8 sfx, float8 sfy, int tw, int th, text algo='NearestNeighbor');
Повернути набір плиток із заданим масштабом (sfx, sfy) і максимальний розмір (tw, th), що покривають вказану площу (ext) з даними, що надходять із вказаного растрового покриття (tab, col).
Варіанти алгоритму: 'NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline' та 'Lanczos'. Докладнішу інформацію див. у розділі: Методи передискретизації GDAL Warp.
Доступність: 2.2.0
ST_FromGDALRaster — Повертає растр із підтримуваного файлу растра GDAL.
raster ST_FromGDALRaster(bytea gdaldata, integer srid=NULL);
Повертає растр із підтримуваного файлу растра GDAL. gdaldata має тип bytea і повинен містити вміст файлу растра GDAL.
Якщо srid має значення NULL, функція спробує автоматично призначити SRID з растру 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, як це зазвичай бачимо у файлі world. За замовчуванням використовується GDAL, якщо тип не вказано. Тип — це рядок "GDAL" або "ESRI".
Різниця між форматами представлення полягає в наступному:
GDAL:
scalex skewy skewx scaley upperleftx upperlefty
ESRI:
scalex skewy skewx scaley upperleftx + scalex*0.5 upperlefty + scaley*0.5
SELECT
format,
replace(ST_GeoReference(rast, format), E'\n', ' | ') AS georef
FROM dummy_rast
CROSS JOIN (VALUES ('ESRI'), ('GDAL')) AS formats(format)
WHERE rid = 1;format | georef --------+--------------------------------------------------------------------------- ESRI | 2.0000000000 | 0.0000000000 | 0.0000000000 | 3.0000000000 | 1.5000000000 | 2.0000000000 GDAL | 2.0000000000 | 0.0000000000 | 0.0000000000 | 3.0000000000 | 0.5000000000 | 0.5000000000 (2 rows)
ST_Height — Повертає висоту растра в пікселях.
integer ST_Height(raster rast);
Повертає висоту растру.
SELECT rid, ST_Height(rast) As rastheight FROM dummy_rast;
rid | rastheight -----+------------ 1 | 20 2 | 5
ST_IsEmpty — Повертає значення true, якщо растр порожній (ширина = 0 і висота = 0). В іншому випадку повертає значення false.
boolean ST_IsEmpty(raster rast);
Повертає значення true, якщо растр порожній (ширина = 0 і висота = 0). В іншому випадку повертає значення false.
Доступність: 2.0.0
SELECT ST_IsEmpty(ST_MakeEmptyRaster(100, 100, 0, 0, 0, 0, 0, 0))
f
SELECT ST_IsEmpty(ST_MakeEmptyRaster(0, 0, 0, 0, 0, 0, 0, 0))
t
ST_MemSize — Повертає обсяг простору (у байтах), який займає растр.
integer ST_MemSize(raster rast);
Повертає обсяг простору (у байтах), який займає растр.
Це гарне доповнення до вбудованих функцій PostgreSQL pg_column_size, pg_size_pretty, pg_relation_size, pg_total_relation_size.
![]() | |
pg_relation_size, що визначає розмір таблиці в байтах, може повертати розмір, менший за ST_MemSize. Це пов'язано з тим, що pg_relation_size не додає розмір тостованих таблиць, а великі геометрії зберігаються в таблицях TOAST. pg_column_size може повертати менший розмір, оскільки він повертає стислий розмір. pg_total_relation_size - включає таблицю, тостовані таблиці та індекси. |
Доступність: 2.2.0
SELECT ST_MemSize(ST_AsRaster(ST_Buffer(ST_Point(1, 5), 10, 1000), 150, 150, '8BUI')) AS rast_mem;
22568
ST_MetaData — Повертає основні метадані про растровий об'єкт, такі як розмір пікселя, поворот (перекос), верхній, нижній лівий кут тощо.
record ST_MetaData(raster rast);
Повертає основні метадані про растровий об'єкт, такі як розмір пікселя, поворот (перекос), верхній, нижній лівий кут тощо. Повертаються стовпці: upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands
SELECT
rid,
format('(%s, %s)', (md).upperleftx, (md).upperlefty) AS upper_left,
format('%sx%s', (md).width, (md).height) AS size,
format('(%s, %s)', (md).scalex, (md).scaley) AS scale,
format('(%s, %s)', (md).skewx, (md).skewy) AS skew,
(md).srid AS srid,
(md).numbands AS numbands
FROM (
SELECT rid, ST_MetaData(rast) AS md
FROM dummy_rast
) AS foo
ORDER BY rid;rid | upper_left | size | scale | skew | srid | numbands -----+--------------------------+-------+-----------------+--------+------+---------- 1 | (0.5, 0.5) | 10x20 | (2, 3) | (0, 0) | 0 | 0 2 | (3427927.75, 5793244) | 5x5 | (0.05, -0.05) | (0, 0) | 0 | 3 (2 rows)
ST_NumBands — Повертає кількість каналів у растровому об'єкті.
integer ST_NumBands(raster rast);
Повертає кількість каналів у растровому об'єкті.
SELECT rid, ST_NumBands(rast) As numbands FROM dummy_rast;
rid | numbands ----+---------- 1 | 0 2 | 3
ST_PixelHeight — Повертає висоту пікселя в геометричних одиницях просторової системи координат.
double precision ST_PixelHeight(raster rast);
Повертає висоту пікселя в геометричних одиницях просторової системи координат. У звичайному випадку, коли немає нахилу, висота пікселя дорівнює співвідношенню масштабу між геометричними координатами та растровими пікселями.
Дивіться ST_PixelWidthдля схематичного зображення цього взаємозв'язку.
Rasters with no skew.
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 | 0Rasters with skew different than 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.5ST_PixelWidth — Повертає ширину пікселя в геометричних одиницях просторової системи координат.
double precision ST_PixelWidth(raster rast);
Повертає ширину пікселя в геометричних одиницях просторової системи координат. У звичайному випадку, коли немає нахилу, ширина пікселя дорівнює співвідношенню масштабу між геометричними координатами та растровими пікселями.
The following executable example draws the two pixel basis vectors on the same coordinate frame as a skewed raster footprint. The i direction vector is (scaleX, skewY); the j direction vector is (skewX, scaleY).
Pixel basis vectors and footprint for a raster with non-zero skew.
WITH raster AS (
SELECT ST_MakeEmptyRaster(
3, 3, 0, 0,
2, -3, 1, 0.5,
0
) AS rast
)
SELECT
ST_ConvexHull(rast) AS footprint,
ST_MakeLine(
ST_Point(0, 0),
ST_Point(ST_ScaleX(rast), ST_SkewY(rast))
) AS "i direction (scaleX, skewY)",
ST_MakeLine(
ST_Point(0, 0),
ST_Point(ST_SkewX(rast), ST_ScaleY(rast))
) AS "j direction (skewX, scaleY)"
FROM raster;POLYGON((0 0,6 1.5,9 -7.5,3 -9,0 0)) | LINESTRING(0 0,2 0.5) | LINESTRING(0 0,1 -3)
Rasters with no skew.
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
Rasters with skew different than 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);
Повертає компонент X ширини пікселя в одиницях системи координат. Докладнішу інформацію див. у World File.
Змінено: 2.0.0. У версіях WKTRaster це називалося ST_PixelSizeX.
SELECT rid, ST_ScaleX(rast) As rastpixwidth FROM dummy_rast;
rid | rastpixwidth -----+-------------- 1 | 2 2 | 0.05
ST_ScaleY — Повертає компонент Y висоти пікселя в одиницях системи координат.
float8 ST_ScaleY(raster rast);
Повертає компонент Y висоти пікселя в одиницях системи координат. Може бути від'ємним. Докладнішу інформацію див. у World File.
Змінено: 2.0.0. У версіях WKTRaster це називалося ST_PixelSizeY.
SELECT rid, ST_ScaleY(rast) As rastpixheight FROM dummy_rast;
rid | rastpixheight -----+--------------- 1 | 3 2 | -0.05
ST_RasterToWorldCoord — Повертає верхній лівий кут растра у вигляді геометричних координат X та Y (довгота та широта) за заданим стовпцем та рядком. Стовпець та рядок починаються з 1.
record ST_RasterToWorldCoord(raster rast, integer xcolumn, integer yrow);
Повертає верхній лівий кут у вигляді геометричних координат X та Y (довгота та широта) за заданим стовпцем та рядком. Повернені координати X та Y виражені в геометричних одиницях растру з геореференцією. Нумерація стовпців і рядків починається з 1, але якщо будь-який параметр передається як нуль, від'ємне число або число, більше за відповідний розмір растра, то будуть повернуті координати за межами растра, припускаючи, що сітка растра застосовується за межами растра.
Доступність: 2.1.0
This example uses a non-skewed raster.
SELECT
rid,
(ST_RasterToWorldCoord(rast, 1, 1)).*,
(ST_RasterToWorldCoord(rast, 2, 2)).*
FROM dummy_rastrid | longitude | latitude | longitude | latitude -----+------------+----------+-----------+------------ 1 | 0.5 | 0.5 | 2.5 | 3.5 2 | 3427927.75 | 5793244 | 3427927.8 | 5793243.95
This example uses a 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 foorid | 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.
This example shows that providing a column is sufficient for a non-skewed raster.
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 let's 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 let's skew it.
SELECT rid, ST_RasterToWorldCoordY(rast, 1, 1) As y1coord,
ST_RasterToWorldCoordY(rast, 2, 3) As y2coord,
ST_ScaleY(rast) As pixely
FROM (SELECT rid, ST_SetSkew(rast, 0, 100.5) As rast FROM dummy_rast) As foo;rid | y1coord | y2coord | pixely -----+---------+-----------+-------- 1 | 0.5 | 107 | 3 2 | 5793244 | 5793344.4 | -0.05
ST_Rotation — Повертає величину повороту растра в радіанах.
float8 ST_Rotation(raster rast);
Повертає рівномірне обертання растру в радіанах. Якщо растр не має рівномірного обертання, повертається NaN. Докладнішу інформацію див. у розділі World File.
SELECT rid, ST_Rotation(ST_SetScale(ST_SetSkew(rast, sqrt(2)), sqrt(2))) AS rot FROM dummy_rast;
rid | rot -----+------------------- 1 | 0.785398163397448 2 | 0.785398163397448
ST_SkewX — Повертає геоприв'язку X skew (або параметр обертання).
float8 ST_SkewX(raster rast);
Повертає геоприв'язку X skew (або параметр обертання). Докладнішу інформацію див. у World File.
WITH refs AS (
SELECT
rid,
format('(%s, %s)', ST_SkewX(rast), ST_SkewY(rast)) AS skew,
string_to_array(ST_GeoReference(rast), E'\n') AS georef
FROM dummy_rast
)
SELECT
rid,
skew,
term,
georef[idx] AS value
FROM refs
CROSS JOIN (VALUES
(1, 'scaleX'),
(2, 'skewY'),
(3, 'skewX'),
(4, 'scaleY'),
(5, 'originX'),
(6, 'originY')
) AS parts(idx, term)
ORDER BY rid, idx;rid | skew | term | value -----+--------+---------+-------------------- 1 | (0, 0) | scaleX | 2.0000000000 1 | (0, 0) | skewY | 0.0000000000 1 | (0, 0) | skewX | 0.0000000000 1 | (0, 0) | scaleY | 3.0000000000 1 | (0, 0) | originX | 0.5000000000 1 | (0, 0) | originY | 0.5000000000 2 | (0, 0) | scaleX | 0.0500000000 2 | (0, 0) | skewY | 0.0000000000 2 | (0, 0) | skewX | 0.0000000000 2 | (0, 0) | scaleY | -0.0500000000 2 | (0, 0) | originX | 3427927.7500000000 2 | (0, 0) | originY | 5793244.0000000000 (12 rows)
ST_SkewY — Повертає геоприв'язку Y skew (або параметр обертання).
float8 ST_SkewY(raster rast);
Повертає геоприв'язку Y skew (або параметр обертання). Докладнішу інформацію див. у World File.
WITH refs AS (
SELECT
rid,
format('(%s, %s)', ST_SkewX(rast), ST_SkewY(rast)) AS skew,
string_to_array(ST_GeoReference(rast), E'\n') AS georef
FROM dummy_rast
)
SELECT
rid,
skew,
term,
georef[idx] AS value
FROM refs
CROSS JOIN (VALUES
(1, 'scaleX'),
(2, 'skewY'),
(3, 'skewX'),
(4, 'scaleY'),
(5, 'originX'),
(6, 'originY')
) AS parts(idx, term)
ORDER BY rid, idx;rid | skew | term | value -----+--------+---------+-------------------- 1 | (0, 0) | scaleX | 2.0000000000 1 | (0, 0) | skewY | 0.0000000000 1 | (0, 0) | skewX | 0.0000000000 1 | (0, 0) | scaleY | 3.0000000000 1 | (0, 0) | originX | 0.5000000000 1 | (0, 0) | originY | 0.5000000000 2 | (0, 0) | scaleX | 0.0500000000 2 | (0, 0) | skewY | 0.0000000000 2 | (0, 0) | skewX | 0.0000000000 2 | (0, 0) | scaleY | -0.0500000000 2 | (0, 0) | originX | 3427927.7500000000 2 | (0, 0) | originY | 5793244.0000000000 (12 rows)
ST_SRID — Повертає ідентифікатор просторової системи координат растра, як визначено в таблиці spatial_ref_sys.
integer ST_SRID(raster rast);
Повертає ідентифікатор просторової системи координат растрового об'єкта, як визначено в таблиці spatial_ref_sys.
![]() | |
Растери та геометрії без геореференції використовують SRID 0. |
SELECT ST_SRID(rast) As srid FROM dummy_rast WHERE rid=1;
0
ST_Summary — Повертає текстовий підсумок вмісту растру.
text ST_Summary(raster rast);
Повертає текстовий підсумок вмісту растру.
Доступність: 2.1.0
SELECT ST_Summary(ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 1, -1, 0, 0, 0),
1, '8BUI', 1, 0
),
2, '32BF', 0, -9999
),
3, '16BSI', 0, NULL
)
);Raster of 10x10 pixels has 3 bands and extent of BOX(0 -10,10 0)+
band 1 of pixtype 8BUI is in-db with NODATA value of 0 +
band 2 of pixtype 32BF is in-db with NODATA value of -9999 +
band 3 of pixtype 16BSI is in-db with no NODATA value
(1 row)ST_UpperLeftX — Повертає верхню ліву координату X растру в проекційній просторовій системі координат.
float8 ST_UpperLeftX(raster rast);
Повертає верхню ліву координату X растра в проекційній просторовій системі відліку.
SELECt rid, ST_UpperLeftX(rast) As ulx FROM dummy_rast;
rid | ulx -----+------------ 1 | 0.5 2 | 3427927.75
ST_UpperLeftY — Повертає верхню ліву координату Y растру в проекційній просторовій системі координат.
float8 ST_UpperLeftY(raster rast);
Повертає верхню ліву координату Y растру в проекційній просторовій системі координат.
SELECT rid, ST_UpperLeftY(rast) As uly FROM dummy_rast;
rid | uly -----+--------- 1 | 0.5 2 | 5793244
ST_Width — Повертає ширину растру в пікселях.
integer ST_Width(raster rast);
Повертає ширину растра в пікселях.
SELECT ST_Width(rast) As rastwidth FROM dummy_rast WHERE rid=1;
10
ST_WorldToRasterCoord — Повертає верхній лівий кут як стовпець і рядок, задані геометричними координатами X і Y (довгота і широта) або геометрією точки, вираженою в системі координат просторової прив'язки растру.
record ST_WorldToRasterCoord(raster rast, geometry pt);
record ST_WorldToRasterCoord(raster rast, double precision longitude, double precision latitude);
Повертає верхній лівий кут як стовпець і рядок, задані геометричними X і Y (довгота і широта) або геометрією точки. Ця функція працює незалежно від того, чи знаходяться геометричні X і Y або геометрія точки за межами растра. Геометричні X і Y повинні бути виражені в системі координат просторової прив'язки растра.
Доступність: 2.1.0
SELECT
rid,
(ST_WorldToRasterCoord(rast, 3427927.8, 20.5)).*,
(ST_WorldToRasterCoord(rast, ST_GeomFromText('POINT(3427927.8 20.5)', ST_SRID(rast)))).*
FROM dummy_rast;rid | columnx | rowy | columnx | rowy -----+---------+-----------+---------+----------- 1 | 1713964 | 7 | 1713964 | 7 2 | 2 | 115864471 | 2 | 115864471
ST_WorldToRasterCoordX — Повертає стовпець у растрі геометрії точки (pt) або світові координати X та Y (xw, yw), представлені у світовій просторовій системі відліку растру.
integer ST_WorldToRasterCoordX(raster rast, geometry pt);
integer ST_WorldToRasterCoordX(raster rast, double precision xw);
integer ST_WorldToRasterCoordX(raster rast, double precision xw, double precision yw);
Повертає стовпець у растрі геометрії точки (pt) або світові координати X і Y (xw, yw). Точка або (якщо растр перекошений, потрібні обидві світові координати xw і yw). Якщо растр не перекошений, достатньо xw. Світові координати знаходяться в просторовій системі координат растра.
Змінено: 2.1.0 У попередніх версіях це називалося ST_World2RasterCoordX
SELECT rid, ST_WorldToRasterCoordX(rast, 3427927.8) As xcoord,
ST_WorldToRasterCoordX(rast, 3427927.8, 20.5) As xcoord_xwyw,
ST_WorldToRasterCoordX(rast, ST_GeomFromText('POINT(3427927.8 20.5)', ST_SRID(rast))) As ptxcoord
FROM dummy_rast;rid | xcoord | xcoord_xwyw | ptxcoord -----+---------+---------+---------- 1 | 1713964 | 1713964 | 1713964 2 | 1 | 1 | 1
ST_WorldToRasterCoordY — Повертає рядок у растрі геометрії точки (pt) або світові координати X і Y (xw, yw), представлені у світовій просторовій системі координат растра.
integer ST_WorldToRasterCoordY(raster rast, geometry pt);
integer ST_WorldToRasterCoordY(raster rast, double precision xw);
integer ST_WorldToRasterCoordY(raster rast, double precision xw, double precision yw);
Повертає рядок у растрі геометрії точки (pt) або світові координати X і Y (xw, yw). Точка або (якщо растр перекошений, потрібні обидві світові координати xw і yw). Якщо растр не перекошений, достатньо xw. Світові координати знаходяться в просторовій системі координат растра.
Змінено: 2.1.0 У попередніх версіях це називалося ST_World2RasterCoordY
SELECT rid, ST_WorldToRasterCoordY(rast, 20.5) As ycoord,
ST_WorldToRasterCoordY(rast, 3427927.8, 20.5) As ycoord_xwyw,
ST_WorldToRasterCoordY(rast, ST_GeomFromText('POINT(3427927.8 20.5)', ST_SRID(rast))) As ptycoord
FROM dummy_rast;rid | ycoord | ycoord_xwyw | ptycoord -----+-----------+-------------+----------- 1 | 7 | 7 | 7 2 | 115864471 | 115864471 | 115864471
ST_BandMetaData — Повертає основні метадані для конкретного растрового каналу. Якщо не вказано, припускається канал № 1.
(1) record ST_BandMetaData(raster rast, integer band=1);
(2) record ST_BandMetaData(raster rast, integer[] band);
Повертає основні метадані про растровий канал. Повертаються стовпці: pixeltype, nodatavalue, isoutdb, path, outdbbandnum, filesize, filetimestamp.
![]() | |
Якщо растр не містить каналів, то видається помилка. |
![]() | |
Якщо канал не має значення NODATA, nodatavalue дорівнює NULL. |
![]() | |
Якщо isoutdb має значення False, path, outdbbandnum, filesize та filetimestamp мають значення NULL. Якщо доступ до outdb вимкнено, filesize та filetimestamp також матимуть значення NULL. |
Покращено: 2.5.0, додано outdbbandnum, filesize та filetimestamp для растрів outdb.
Variant 1.
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 | |
(1 row)
Variant 2.
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
bandnum,
pixeltype,
isoutdb,
regexp_replace(path, '^.*/', '') AS file,
outdbbandnum
FROM ST_BandMetaData((SELECT rast FROM foo),
ARRAY[1, 3, 2]::int[]
);bandnum | pixeltype | isoutdb | file | outdbbandnum
---------+-----------+---------+---------------+--------------
1 | 8BUI | t | Projected.tif | 1
3 | 8BUI | t | Projected.tif | 3
2 | 8BUI | t | Projected.tif | 2ST_BandNoDataValue — Повертає значення в заданому каналі, яке не представляє даних. Якщо карал № 1 не задано.
double precision ST_BandNoDataValue(raster rast, integer bandnum=1);
Повертає значення, яке не представляє даних для каналу
SELECT ST_BandNoDataValue(rast, 1) As bnval1,
ST_BandNoDataValue(rast, 2) As bnval2, ST_BandNoDataValue(rast, 3) As bnval3
FROM dummy_rast
WHERE rid = 2;bnval1 | bnval2 | bnval3
--------+--------+--------
0 | 0 | 0ST_BandIsNoData — Повертає значення true, якщо канал заповнений тільки значеннями nodata.
boolean ST_BandIsNoData(raster rast, integer band, boolean forceChecking=false);
boolean ST_BandIsNoData(raster rast, boolean forceChecking=false);
Повертає значення true, якщо канал заповнений тільки значеннями nodata. Якщо не вказано, припускається канал 1. Якщо останній аргумент дорівнює TRUE, весь канал перевіряється піксель за пікселем. В іншому випадку функція просто повертає значення прапорця isnodata для каналу. Якщо не вказано, значенням за замовчуванням для цього параметра є FALSE.
Доступність: 2.0.0
![]() | |
If the flag is dirty (this is, the result is different using TRUE as last parameter and not using it) you should update the raster to set this flag to true, by using ST_SetBandIsNoData(), or ST_SetBandNoDataValue() with TRUE as last argument. See ST_SetBandIsNoData. |
This example creates a dummy table with one raster column. The raster has two bands and one pixel per band. In the first band, the NODATA value and pixel value are both 3. In the second band, the NODATA value is 13 and the pixel value is 4.
create table dummy_rast (rid integer, rast raster);
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);
Повертає шлях до системного файлу каналу растра. Видає помилку, якщо викликається з каналом в db.
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 bandnum, ST_BandPath(rast, bandnum) AS path
FROM foo
CROSS JOIN generate_series(1, 3) AS bandnum;bandnum | path
---------+----------------------------------------------------------------------------
1 | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif
2 | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif
3 | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tifST_BandFileSize — Повертає розмір файлу каналу, що зберігається у файловій системі. Якщо номер каналу не вказано, вважається, що він дорівнює 1.
bigint ST_BandFileSize(raster rast, integer bandnum=1);
Повертає розмір файлу каналу, що зберігається у файловій системі. Видає помилку, якщо викликається зі каналу в db або якщо доступ outdb не ввімкнено.
Ця функція зазвичай використовується разом із ST_BandPath() та ST_BandFileTimestamp(), щоб клієнт міг визначити, чи ім'я файлу растрового зображення outdb, яке він бачить, збігається з ім'ям файлу, яке бачить сервер.
Доступність: 2.5.0
SELECT ST_BandFileSize(rast, 1) FROM dummy_rast WHERE rid = 1;
240574
ST_BandFileTimestamp — Повертає мітку часу файлу смуги, що зберігається у файловій системі. Якщо номер смуги не вказано, вважається, що він дорівнює 1.
bigint ST_BandFileTimestamp(raster rast, integer bandnum=1);
Повертає мітку часу файлу (кількість секунд з 1 січня 1970 року 00:00:00 UTC) смуги, що зберігається у файловій системі. Видає помилку, якщо викликається зі смугою в базі даних або якщо доступ outdb не ввімкнено.
Ця функція зазвичай використовується разом з ST_BandPath() та ST_BandFileSize(), щоб клієнт міг визначити, чи ім'я файлу растрового зображення outdb, яке він бачить, збігається з ім'ям файлу, яке бачить сервер.
Доступність: 2.5.0
SELECT ST_BandFileTimestamp(rast, 1) FROM dummy_rast WHERE rid = 1;
1521807257
ST_BandPixelType — Повертає тип пікселя для заданого діапазону. Якщо діапазон не вказано, приймається значення 1.
text ST_BandPixelType(raster rast, integer bandnum=1);
Повертає ім'я, що описує тип даних і розмір значень, що зберігаються в кожній комірці заданого діапазону.
Існує 11 типів пікселів. Підтримуються такі типи пікселів:
1BB - 1-бітний логічний
2BUI - 2-бітне ціле число без знака
4BUI - 4-бітне ціле число без знака
8BSI – 8-бітне ціле число зі знаком
8BUI – 8-бітне ціле число без знака
16BSI – 16-бітне ціле число зі знаком
16BUI – 16-бітне ціле число без знака
32BSI – 32-бітне ціле число без знака
32BUI – 32-бітне ціле число без знака
32BF - 32-бітний з плаваючою комою
64BF - 64-бітний з плаваючою комою
SELECT ST_BandPixelType(rast, 1) As btype1,
ST_BandPixelType(rast, 2) As btype2, ST_BandPixelType(rast, 3) As btype3
FROM dummy_rast
WHERE rid = 2;btype1 | btype2 | btype3 --------+--------+-------- 8BUI | 8BUI | 8BUI
ST_MinPossibleValue — Повертає мінімальне значення, яке може зберігати цей тип пікселів.
integer ST_MinPossibleValue(text pixeltype);
Повертає мінімальне значення, яке може зберігати цей тип пікселів.
SELECT ST_MinPossibleValue('16BSI');-32768
SELECT ST_MinPossibleValue('8BUI');0
ST_HasNoBand — Повертає значення true, якщо немає діапазону з вказаним номером. Якщо номер діапазону не вказано, то вважається, що це діапазон № 1.
boolean ST_HasNoBand(raster rast, integer bandnum=1);
Повертає значення true, якщо немає діапазону з вказаним номером. Якщо номер діапазону не вказано, то вважається, що це діапазон № 1.
Доступність: 2.0.0
SELECT rid, ST_HasNoBand(rast) As hb1, ST_HasNoBand(rast, 2) as hb2, ST_HasNoBand(rast, 4) as hb4, ST_NumBands(rast) As numbands FROM dummy_rast;
rid | hb1 | hb2 | hb4 | numbands -----+-----+-----+-----+---------- 1 | t | t | t | 0 2 | f | f | t | 3
exclude_nodata_value встановлено на false, то всі пікселі, включаючи пікселі nodata, вважаються пересічними і повертають значення. Якщо exclude_nodata_value не передано, то воно зчитується з метаданих растру.NODATA, пікселя заданого діапазону, визначеного стовпцем x і рядком y, або геометричної точки, вираженої в тій самій системі координат просторової прив'язки, що й растр. NODATA, навколо пікселя заданого діапазону, визначеного або стовпцемX і рядкомY, або геометричною точкою, вираженою в тій самій системі координат просторової прив'язки, що й растр. ST_PixelAsPolygon — Повертає геометрію полігону, що обмежує піксель для певного рядка та стовпця.
geometry ST_PixelAsPolygon(raster rast, integer columnx, integer rowy);
Повертає геометрію полігону, що обмежує піксель для певного рядка та стовпця.
Доступність: 2.0.0
This example returns a raster pixel polygon.
SELECT i, j, ST_PixelAsPolygon(foo.rast, i, j) As b1pgeom
FROM dummy_rast As foo
CROSS JOIN generate_series(1, 2) As i
CROSS JOIN generate_series(1, 1) As j
WHERE rid=2;i | j | b1pgeom ---+---+----------------------------------------------------------------------------- 1 | 1 | POLYGON((3427927.75 5793244,3427927.8 5793244,3427927.8 5793243.95,... 2 | 1 | POLYGON((3427927.8 5793244,3427927.85 5793244,3427927.85 5793243.95, ..
ST_PixelAsPolygons — Повертає геометрію полігону, що обмежує кожен піксель растрового каналу, разом із значенням, X- та Y-координатами кожного пікселя.
setof record ST_PixelAsPolygons(raster rast, integer band=1, boolean exclude_nodata_value=TRUE);
Повертає геометрію полігону, що обмежує кожен піксель растрового каналу, разом із значенням (подвійна точність), X- та Y-координатами растру (цілими числами) кожного пікселя.
Формат запису повернення: geom geometry, val подвійна точність, x ціле число, y цілі числа.
![]() | |
When |
Доступність: 2.0.0
Покращено: 2.1.0 додано опціональний аргумент exclude_nodata_value.
Змінено: 2.1.1 Змінено поведінку exclude_nodata_value.
This example returns a raster pixel polygon.
WITH raster AS (
SELECT ST_SetValue(
ST_SetValue(
ST_AddBand(
ST_MakeEmptyRaster(
2, 2, 0, 0, 0.001, -0.001, 0.001, 0.001, 4269
),
1, '8BUI', 1, 0
),
2, 2, 10
),
1, 1, NULL
) AS rast
), pixels AS (
SELECT (ST_PixelAsPolygons(rast)).*
FROM raster
)
SELECT x, y, val, geom AS geom
FROM pixels
ORDER BY x, y;x | y | val | geom ---+---+----------------------------------------------------------------------------- 1 | 2 | 1 | POLYGON((0.001 -0.001,0.002 0,0.003 -0.001,0.002 -0.002,0.001 -0.001)) 2 | 1 | 1 | POLYGON((0.001 0.001,0.002 0.002,0.003 0.001,0.002 0,0.001 0.001)) 2 | 2 | 10 | POLYGON((0.002 0,0.003 0.001,0.004 0,0.003 -0.001,0.002 0))
ST_PixelAsPoint — Повертає геометрію точки верхнього лівого кута пікселя.
geometry ST_PixelAsPoint(raster rast, integer columnx, integer rowy);
Повертає точкову геометрію верхнього лівого кута пікселя.
Доступність: 2.1.0
SELECT ST_PixelAsPoint(rast, 1, 1) FROM dummy_rast WHERE rid = 1;
POINT(0.5 0.5)
ST_PixelAsPoints — Повертає точкову геометрію для кожного пікселя растрового діапазону разом із значенням, X- та Y-координатами кожного пікселя. Координати точкової геометрії відповідають верхньому лівому куту пікселя.
setof record ST_PixelAsPoints(raster rast, integer band=1, boolean exclude_nodata_value=TRUE);
Повертає точкову геометрію для кожного пікселя растрового діапазону разом із значенням, X- та Y-координатами кожного пікселя. Координати точкової геометрії відповідають верхньому лівому куту пікселя.
Формат запису повернення: geom geometry, val подвійна точність, x ціле число, y цілі числа.
![]() | |
Коли |
Доступність: 2.1.0
Змінено: 2.1.1 Змінено поведінку exclude_nodata_value.
This example returns point features together with a derived marker size that a client can use for value-scaled point rendering.
SELECT
x,
y,
val,
round((val / 32.0)::numeric, 2) AS marker_scale,geom AS geom
FROM (
SELECT (ST_PixelAsPoints(rast, 1)).*
FROM dummy_rast
WHERE rid = 2
) AS foo
ORDER BY y, x;x | y | val | marker_scale | geom ---+---+-----+--------------+------------------------------ 1 | 1 | 253 | 7.91 | POINT(3427927.75 5793244) 2 | 1 | 254 | 7.94 | POINT(3427927.8 5793244) 3 | 1 | 253 | 7.91 | POINT(3427927.85 5793244) 4 | 1 | 254 | 7.94 | POINT(3427927.9 5793244) 5 | 1 | 254 | 7.94 | POINT(3427927.95 5793244) 1 | 2 | 253 | 7.91 | POINT(3427927.75 5793243.95) 2 | 2 | 254 | 7.94 | POINT(3427927.8 5793243.95) 3 | 2 | 254 | 7.94 | POINT(3427927.85 5793243.95) 4 | 2 | 253 | 7.91 | POINT(3427927.9 5793243.95) 5 | 2 | 249 | 7.78 | POINT(3427927.95 5793243.95) 1 | 3 | 250 | 7.81 | POINT(3427927.75 5793243.9) 2 | 3 | 254 | 7.94 | POINT(3427927.8 5793243.9) 3 | 3 | 254 | 7.94 | POINT(3427927.85 5793243.9) 4 | 3 | 252 | 7.88 | POINT(3427927.9 5793243.9) 5 | 3 | 249 | 7.78 | POINT(3427927.95 5793243.9) 1 | 4 | 251 | 7.84 | POINT(3427927.75 5793243.85) 2 | 4 | 253 | 7.91 | POINT(3427927.8 5793243.85) 3 | 4 | 254 | 7.94 | POINT(3427927.85 5793243.85) 4 | 4 | 254 | 7.94 | POINT(3427927.9 5793243.85) 5 | 4 | 253 | 7.91 | POINT(3427927.95 5793243.85) 1 | 5 | 252 | 7.88 | POINT(3427927.75 5793243.8) 2 | 5 | 250 | 7.81 | POINT(3427927.8 5793243.8) 3 | 5 | 254 | 7.94 | POINT(3427927.85 5793243.8) 4 | 5 | 254 | 7.94 | POINT(3427927.9 5793243.8) 5 | 5 | 254 | 7.94 | POINT(3427927.95 5793243.8)
ST_PixelAsCentroid — Повертає центроїд (точкову геометрію) області, представленої пікселем.
geometry ST_PixelAsCentroid(raster rast, integer x, integer y);
Повертає центроїд (точкову геометрію) області, представленої пікселем.
Покращено: 3.2.0 Тепер швидше реалізовано в C.
Доступність: 2.1.0
SELECT ST_PixelAsCentroid(rast, 1, 1) FROM dummy_rast WHERE rid = 1;
POINT(1.5 2)
ST_PixelAsCentroids — Повертає центроїд ( точкову геометрію) для кожного пікселя растрового каналу разом із значенням, X- та Y-координатами кожного пікселя. Точкова геометрія — це центроїд області, представленої пікселем.
setof record ST_PixelAsCentroids(raster rast, integer band=1, boolean exclude_nodata_value=TRUE);
Повертає центроїд ( точкову геометрію) для кожного пікселя растрового каналу разом із значенням, X- та Y-координатами кожного пікселя. Точкова геометрія є центроїдом області, представленої пікселем..
Формат запису повернення: geom geometry, val подвійна точність, x ціле число, y цілі числа.
![]() | |
Коли |
Покращено: 3.2.0 Тепер швидше реалізовано в C.
Змінено: 2.1.1 Змінено поведінку exclude_nodata_value.
Доступність: 2.1.0
This example uses LATERAL syntax.
SELECT x, y, val,geom
FROM (SELECT dp.* FROM dummy_rast, LATERAL ST_PixelAsCentroids(rast, 1) AS dp WHERE rid = 2) foo;x | y | val | st_astext ---+---+-----+-------------------------------- 1 | 1 | 253 | POINT(3427927.775 5793243.975) 2 | 1 | 254 | POINT(3427927.825 5793243.975) 3 | 1 | 253 | POINT(3427927.875 5793243.975) 4 | 1 | 254 | POINT(3427927.925 5793243.975) 5 | 1 | 254 | POINT(3427927.975 5793243.975) 1 | 2 | 253 | POINT(3427927.775 5793243.925) 2 | 2 | 254 | POINT(3427927.825 5793243.925) 3 | 2 | 254 | POINT(3427927.875 5793243.925) 4 | 2 | 253 | POINT(3427927.925 5793243.925) 5 | 2 | 249 | POINT(3427927.975 5793243.925) 1 | 3 | 250 | POINT(3427927.775 5793243.875) 2 | 3 | 254 | POINT(3427927.825 5793243.875) 3 | 3 | 254 | POINT(3427927.875 5793243.875) 4 | 3 | 252 | POINT(3427927.925 5793243.875) 5 | 3 | 249 | POINT(3427927.975 5793243.875) 1 | 4 | 251 | POINT(3427927.775 5793243.825) 2 | 4 | 253 | POINT(3427927.825 5793243.825) 3 | 4 | 254 | POINT(3427927.875 5793243.825) 4 | 4 | 254 | POINT(3427927.925 5793243.825) 5 | 4 | 253 | POINT(3427927.975 5793243.825) 1 | 5 | 252 | POINT(3427927.775 5793243.775) 2 | 5 | 250 | POINT(3427927.825 5793243.775) 3 | 5 | 254 | POINT(3427927.875 5793243.775) 4 | 5 | 254 | POINT(3427927.925 5793243.775) 5 | 5 | 254 | POINT(3427927.975 5793243.775)
ST_Value — Повертає значення заданого каналу в заданому стовпці x, рядку y пікселя або в певній геометричній точці. Номери смуг починаються з 1 і, якщо не вказано, приймаються за 1. Якщо exclude_nodata_value встановлено на false, то всі пікселі, включаючи пікселі nodata, вважаються пересічними і повертають значення. Якщо exclude_nodata_value не передано, то воно зчитується з метаданих растру.
double precision ST_Value(raster rast, geometry pt, boolean exclude_nodata_value=true);
double precision ST_Value(raster rast, integer band, geometry pt, boolean exclude_nodata_value=true, text resample='nearest');
double precision ST_Value(raster rast, integer x, integer y, boolean exclude_nodata_value=true);
double precision ST_Value(raster rast, integer band, integer x, integer y, boolean exclude_nodata_value=true);
Повертає значення заданого каналу в заданому стовпці x, рядку y пікселя або в заданій геометричній точці. Номери діапазонів починаються з 1, і якщо діапазон не вказано, то вважається, що він дорівнює 1.
Якщо exclude_nodata_value встановлено на true, то враховуються тільки пікселі, що не є nodata. Якщо exclude_nodata_value встановлено на false, то враховуються всі пікселі.
The allowed values of the resample parameter are "nearest" which performs the default nearest-neighbor resampling, "bilinear" which performs a bilinear interpolation to estimate the value between pixel centers, and the nearest-neighbor boundary options "nearest-UL", "nearest-UR", "nearest-LL", and "nearest-LR". Boundary options choose which pixel is returned when the point lies on a horizontal or vertical pixel boundary, including corner intersections.
Enhanced: 3.7.0 resample accepts nearest-neighbor boundary options "nearest-UL", "nearest-UR", "nearest-LL", and "nearest-LR".
Покращено: 3.2.0 додано опціональний аргумент resample.
Покращено: 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_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 a particular polygon.
SELECT 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_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, пікселя заданого діапазону, визначеного стовпцем x і рядком y, або геометричної точки, вираженої в тій самій системі координат просторової прив'язки, що й растр.
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, рядку y пікселя або в конкретній геометричній точці. Якщо стовпець x, рядок y пікселя або піксель у заданій геометричній точці є NODATA, функція знайде найближчий піксель до стовпця x, рядка y пікселя або геометричної точки, значення якого не є NODATA.
Номери смуг починаються з 1, і якщо не вказано інше, то bandnum вважається рівним 1. Якщо exclude_nodata_value встановлено на false, то всі пікселі, включаючи пікселі nodata, вважаються пересічними і повертають значення. Якщо exclude_nodata_value не передається, то воно зчитується з метаданих растра.
Доступність: 2.1.0
![]() | |
ST_NearestValue є повноцінною заміною для ST_Value. |
This example reads a value from pixel 2x2.
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0),
1, '8BUI', 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[][]
) AS rast
)
SELECT
ST_Value(rast, 2, 2) AS value,
ST_NearestValue(rast, 2, 2) AS nearestvalue
FROM sourcevalue | nearestvalue
-------+--------------
1 | 1This example reads a NODATA value from pixel 2x3.
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0),
1, '8BUI', 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[][]
) AS rast
)
SELECT
ST_Value(rast, 2, 3) AS value,
ST_NearestValue(rast, 2, 3) AS nearestvalue
FROM sourcevalue | nearestvalue
-------+--------------
| 1ST_SetZ — Повертає геометрію з тими самими координатами X/Y, що й вхідна геометрія, та значеннями з растру, скопійованими у вимір Z за допомогою заданого алгоритму ресемплювання.
geometry ST_SetZ(raster rast, geometry geom, text resample=nearest, integer band=1);
Повертає геометрію з тими самими координатами X/Y, що й вхідна геометрія, та значеннями з растру, скопійованими у вимір Z за допомогою заданого алгоритму ресемплювання.
Параметр resample можна встановити на значення "nearest", щоб скопіювати значення з комірки, в яку потрапляє кожна вершина, або "bilinear", щоб використовувати білінійну інтерполяцію для обчислення значення, яке також враховує сусідні комірки.
Доступність: 3.2.0
2x2 test raster with values. 10 50. 40 20.
WITH test_raster AS (
SELECT
ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(
width => 2,
height => 2,
upperleftx => 0,
upperlefty => 2,
scalex => 1.0,
scaley => -1.0,
skewx => 0,
skewy => 0,
srid => 4326),
index => 1,
pixeltype => '16BSI',
initialvalue => 0,
nodataval => -999
),
1,
1,
1,
newvalueset => ARRAY[ARRAY[10.0::float8, 50.0::float8], ARRAY[40.0::float8, 20.0::float8]]) AS rast
)
SELECT
ST_SetZ(
rast,
band => 1,
geom => 'SRID=4326;LINESTRING(1.0 1.9,1.0 0.2)'::geometry,
resample => 'bilinear'
)
FROM test_rasterLINESTRING Z (1 1.9 38,1 0.2 27)
ST_SetM — Повертає геометрію з тими самими координатами X/Y, що й вхідна геометрія, та значеннями з растра, скопійованими в розмірність M за допомогою заданого алгоритму ресемплювання.
geometry ST_SetM(raster rast, geometry geom, text resample=nearest, integer band=1);
Повертає геометрію з тими самими координатами X/Y, що й вхідна геометрія, та значеннями з растру, скопійованими в M виміри за допомогою запитуваного алгоритму ресемплювання.
Параметр resample можна встановити на значення "nearest", щоб скопіювати значення з комірки, в яку потрапляє кожна вершина, або "bilinear", щоб використовувати білінійну інтерполяцію для обчислення значення, яке також враховує сусідні комірки.
Доступність: 3.2.0
2x2 test raster with values. 10 50. 40 20.
WITH test_raster AS (
SELECT
ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(
width => 2,
height => 2,
upperleftx => 0,
upperlefty => 2,
scalex => 1.0,
scaley => -1.0,
skewx => 0,
skewy => 0,
srid => 4326),
index => 1,
pixeltype => '16BSI',
initialvalue => 0,
nodataval => -999
),
1,
1,
1,
newvalueset => ARRAY[ARRAY[10.0::float8, 50.0::float8], ARRAY[40.0::float8, 20.0::float8]]) AS rast
)
SELECT
ST_SetM(
rast,
band => 1,
geom => 'SRID=4326;LINESTRING(1.0 1.9,1.0 0.2)'::geometry,
resample => 'bilinear'
)
FROM test_rasterLINESTRING M (1 1.9 38,1 0.2 27)
ST_Neighborhood — Повертає двовимірний масив подвійної точності значень, що не є NODATA, навколо пікселя заданого діапазону, визначеного або стовпцемX і рядкомY, або геометричною точкою, вираженою в тій самій системі координат просторової прив'язки, що й растр.
double precision[][] ST_Neighborhood(raster rast, integer bandnum, integer columnX, integer rowY, integer distanceX, integer distanceY, boolean exclude_nodata_value=true);
double precision[][] ST_Neighborhood(raster rast, integer columnX, integer rowY, integer distanceX, integer distanceY, boolean exclude_nodata_value=true);
double precision[][] ST_Neighborhood(raster rast, integer bandnum, geometry pt, integer distanceX, integer distanceY, boolean exclude_nodata_value=true);
double precision[][] ST_Neighborhood(raster rast, geometry pt, integer distanceX, integer distanceY, boolean exclude_nodata_value=true);
Повертає двовимірний масив подвійної точності значень, що не є NODATA, навколо пікселя заданого діапазону, визначеного або стовпцемX і рядкомY, або геометричною точкою, вираженою в тій самій системі координат просторової прив'язки, що й растр. Параметри distanceX та distanceY визначають кількість пікселів навколо заданого пікселя по осях X та Y, наприклад, я хочу отримати всі значення в межах 3 пікселів по осі X та 2 пікселів по осі Y навколо пікселя, що мене цікавить. Центральним значенням двовимірного масиву буде значення в пікселі, вказаному стовпцем X і рядком Y, або геометричною точкою.
Номери смуг починаються з 1, і якщо не вказано інше, то bandnum вважається рівним 1. Якщо exclude_nodata_value встановлено на false, то всі пікселі, включаючи пікселі nodata, вважаються пересічними і повертають значення. Якщо exclude_nodata_value не передається, то воно зчитується з метаданих растра.
![]() | |
Кількість елементів уздовж кожної осі двовимірного масиву, що повертається, дорівнює 2 * ( |
![]() | |
Вихідні дані двовимірного масиву можна передати до будь-якої з вбудованих функцій обробки растрових даних, наприклад ST_Min4ma, ST_Sum4ma, ST_Mean4ma. |
Доступність: 2.1.0
This example reads a value from pixel 2x2.
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{{NULL,1,1},{1,1,1},{1,NULL,1}}This example reads a NODATA value from pixel 2x3.
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{{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{{1,1,0},{0,1,1},{1,1,1}}ST_NearestValue, ST_Min4ma, ST_Max4ma, ST_Sum4ma, ST_Mean4ma, ST_Range4ma, ST_Distinct4ma, ST_StdDev4ma
ST_SetValue — Повертає модифікований растр, отриманий в результаті встановлення значення заданого каналу в заданому стовпці x, рядку y пікселя або пікселів, що перетинають певну геометрію. Номери каналів починаються з 1 і, якщо не вказано інше, приймаються за 1.
raster ST_SetValue(raster rast, integer bandnum, geometry geom, double precision newvalue);
raster ST_SetValue(raster rast, geometry geom, double precision newvalue);
raster ST_SetValue(raster rast, integer bandnum, integer columnx, integer rowy, double precision newvalue);
raster ST_SetValue(raster rast, integer columnx, integer rowy, double precision newvalue);
Повертає модифікований растр, отриманий в результаті встановлення значень вказаних пікселів на нове значення для призначеного каналу, враховуючи рядок і стовпець растра або геометрію. Якщо канал не вказано, то вважається, що це діапазон 1.
Покращено: 2.1.0 Варіант геометрії ST_SetValue() тепер підтримує будь-який тип геометрії, а не тільки точку. Варіант геометрії є обгорткою навколо варіанту geomval[] функції ST_SetValues()
This example uses geometry input.
SELECT (foo.geomval).val, 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 ...
This example stores the changed raster.
UPDATE dummy_rast SET rast = ST_SetValue(rast, 1, ST_Point(3427927.75, 5793243.95), 100)
WHERE rid = 2 ;
ST_SetValues — Повертає змінений растр, отриманий в результаті встановлення значень заданого каналу.
raster ST_SetValues(raster rast, integer nband, integer columnx, integer rowy, double precision[][] newvalueset, boolean[][] noset=NULL, boolean keepnodata=FALSE);
raster ST_SetValues(raster rast, integer nband, integer columnx, integer rowy, double precision[][] newvalueset, double precision nosetvalue, boolean keepnodata=FALSE);
raster ST_SetValues(raster rast, integer nband, integer columnx, integer rowy, integer width, integer height, double precision newvalue, boolean keepnodata=FALSE);
raster ST_SetValues(raster rast, integer columnx, integer rowy, integer width, integer height, double precision newvalue, boolean keepnodata=FALSE);
raster ST_SetValues(raster rast, integer nband, geomval[] geomvalset, boolean keepnodata=FALSE);
Повертає змінений растр, отриманий в результаті встановлення зазначених пікселів на нові значення для вказаного каналу. columnx та rowy індексуються з 1.
Якщо keepnodata має значення TRUE, пікселі, значення яких є NODATA, не будуть встановлені з відповідним значенням у newvalueset.
Для варіанту 1 конкретні пікселі, які потрібно встановити, визначаються координатами пікселів columnx, rowy та розмірами масиву newvalueset. noset можна використовувати, щоб запобігти встановленню пікселів із значеннями, присутніми в newvalueset (оскільки PostgreSQL не дозволяє використовувати нерівномірні/нерівні масиви). Див. приклад варіанту 1.
Варіант 2 схожий на варіант 1, але замість масиву булевих значень noset використовується проста подвійна точність nosetvalue. Елементи в newvalueset із значенням nosetvalue будуть пропущені. Див. приклад варіанту 2.
Для варіанту 3 конкретні пікселі, які потрібно встановити, визначаються координатами пікселів columnx, rowy, width та height. Див. приклад варіанту 3.
Варіант 4 аналогічний варіанту 3, за винятком того, що він передбачає, що пікселі першого каналу rast будуть встановлені.
Для варіанту 5 масив geomval використовується для визначення конкретних пікселів, які потрібно встановити. Якщо всі геометрії в масиві мають тип POINT або MULTIPOINT, функція використовує скорочення, де довгота і широта кожної точки використовуються для безпосереднього встановлення пікселя. В іншому випадку геометрії перетворюються на растри, а потім проходять ітерацію за один прохід. Див. приклад варіанту 5.
Доступність: 2.1.0
Variant 1.
These examples pass FALSE for exclude_nodata_value so that every raster cell remains visible. NODATA cells display the band's NODATA value, which is 0 here.
Set the lower-right 2 by 2 block of a 3 by 3 raster to 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[][]
),
1, FALSE
) 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
Replace the complete raster from an array; the central NULL becomes NODATA.
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[][]
),
1, FALSE
) AS poly
) foo
ORDER BY 1, 2;x | y | val ---+---+----- 1 | 1 | 9 1 | 2 | 9 1 | 3 | 9 2 | 1 | 9 2 | 2 | 0 2 | 3 | 9 3 | 1 | 9 3 | 2 | 9 3 | 3 | 9
Use the noset mask to retain the left-middle source pixel while replacing the other cells.
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[][]
),
1, FALSE
) AS poly
) foo
ORDER BY 1, 2;x | y | val ---+---+----- 1 | 1 | 9 1 | 2 | 1 1 | 3 | 9 2 | 1 | 9 2 | 2 | 0 2 | 3 | 9 3 | 1 | 9 3 | 2 | 9 3 | 3 | 9
With keepnodata enabled, an existing NODATA pixel is not overwritten.
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
),
1, FALSE
) AS poly
) foo
ORDER BY 1, 2;x | y | val ---+---+----- 1 | 1 | 0 1 | 2 | 1 1 | 3 | 9 2 | 1 | 9 2 | 2 | 0 2 | 3 | 9 3 | 1 | 9 3 | 2 | 9 3 | 3 | 9
Variant 2.
Use -1 as the value that should not be written; only the lower-right 2 by 2 block changes.
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
),
1, FALSE
) 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 same update can use NULL as the value that should not be written.
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
),
1, FALSE
) 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
Variant 3.
Set a 2 by 2 rectangle starting at column 2, row 2.
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
),
1, FALSE
) 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
When keepnodata is true, the NODATA cell inside the rectangle remains unchanged.
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
),
1, FALSE
) AS poly
) foo
ORDER BY 1, 2;x | y | val ---+---+----- 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 2 | 1 | 1 2 | 2 | 0 2 | 3 | 9 3 | 1 | 1 3 | 2 | 9 3 | 3 | 9
Variant 5.
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
), changed AS (
SELECT rid, gid, ST_SetValue(rast, 1, geom, gid) AS rast
FROM foo
CROSS JOIN bar
)
SELECT
rid,
gid,
y,
array_agg(ST_Value(rast, 1, x, y) ORDER BY x) AS values
FROM changed
CROSS JOIN generate_series(1, 5) AS x
CROSS JOIN generate_series(1, 5) AS y
GROUP BY rid, gid, y
ORDER BY rid, gid, y;rid | gid | y | values
-----+-----+---+----------------------------
1 | 1 | 1 | {NULL,NULL,NULL,NULL,NULL}
1 | 1 | 2 | {NULL,NULL,NULL,NULL,NULL}
1 | 1 | 3 | {NULL,NULL,1,NULL,NULL}
1 | 1 | 4 | {NULL,NULL,NULL,NULL,NULL}
1 | 1 | 5 | {NULL,NULL,NULL,NULL,NULL}
1 | 2 | 1 | {NULL,NULL,NULL,NULL,NULL}
1 | 2 | 2 | {NULL,2,2,2,NULL}
1 | 2 | 3 | {NULL,2,2,2,NULL}
1 | 2 | 4 | {NULL,2,2,2,NULL}
1 | 2 | 5 | {NULL,NULL,NULL,NULL,NULL}
1 | 3 | 1 | {3,3,3,3,3}
1 | 3 | 2 | {3,NULL,NULL,NULL,NULL}
1 | 3 | 3 | {3,NULL,NULL,NULL,NULL}
1 | 3 | 4 | {3,NULL,NULL,NULL,NULL}
1 | 3 | 5 | {NULL,NULL,NULL,NULL,NULL}
1 | 4 | 1 | {4,NULL,NULL,NULL,NULL}
1 | 4 | 2 | {NULL,NULL,NULL,NULL,NULL}
1 | 4 | 3 | {NULL,NULL,NULL,NULL,NULL}
1 | 4 | 4 | {NULL,NULL,NULL,NULL,NULL}
1 | 4 | 5 | {NULL,NULL,NULL,NULL,4}
(20 rows)Нижче показано, що geomvals, розташовані далі в масиві, можуть перезаписати попередні geomvals
WITH foo AS (
SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0) AS rast
), bar AS (
SELECT 1 AS gid, 'SRID=0;POINT(2.5 -2.5)'::geometry geom UNION ALL
SELECT 2 AS gid, 'SRID=0;POLYGON((1 -1,4 -1,4 -4,1 -4,1 -1))'::geometry geom UNION ALL
SELECT 3 AS gid, 'SRID=0;POLYGON((0 0,5 0,5 -1,1 -1,1 -4,0 -4,0 0))'::geometry geom UNION ALL
SELECT 4 AS gid, 'SRID=0;MULTIPOINT(0 0,4 4,4 -4)'::geometry
), changed AS (
SELECT ST_SetValues(
rast,
1,
ARRAY[
ROW((SELECT geom FROM bar WHERE gid = 1), 1),
ROW((SELECT geom FROM bar WHERE gid = 2), 2)
]::geomval[]
) AS rast
FROM foo
)
SELECT
y,
array_agg(ST_Value(rast, 1, x, y) ORDER BY x) AS values
FROM changed
CROSS JOIN generate_series(1, 5) AS x
CROSS JOIN generate_series(1, 5) AS y
GROUP BY y
ORDER BY y;y | values
---+----------------------------
1 | {NULL,NULL,NULL,NULL,NULL}
2 | {NULL,2,2,2,NULL}
3 | {NULL,2,2,2,NULL}
4 | {NULL,2,2,2,NULL}
5 | {NULL,NULL,NULL,NULL,NULL}
(5 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
), changed AS (
SELECT ST_SetValues(
rast,
1,
ARRAY[
ROW((SELECT geom FROM bar WHERE gid = 2), 2),
ROW((SELECT geom FROM bar WHERE gid = 1), 1)
]::geomval[]
) AS rast
FROM foo
)
SELECT
y,
array_agg(ST_Value(rast, 1, x, y) ORDER BY x) AS values
FROM changed
CROSS JOIN generate_series(1, 5) AS x
CROSS JOIN generate_series(1, 5) AS y
GROUP BY y
ORDER BY y;y | values
---+----------------------------
1 | {NULL,NULL,NULL,NULL,NULL}
2 | {NULL,2,2,2,NULL}
3 | {NULL,2,1,2,NULL}
4 | {NULL,2,2,2,NULL}
5 | {NULL,NULL,NULL,NULL,NULL}
(5 rows)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 );
Отримати значення вказаного каналу у вигляді двовимірного масиву (перший індекс — рядок, другий — стовпець). Якщо nband дорівнює NULL або не вказано, обробляються всі растрові канали.
Доступність: 2.1.0
WITH foo AS (
SELECT ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI'::text, 1, 0), 2, '32BF'::text, 3, -9999), 3, '16BSI', 0, 0) AS rast
)
SELECT
(ST_DumpValues(rast)).*
FROM foo;nband | valarray
-------+------------------------------------------------------
1 | {{1,1,1},{1,1,1},{1,1,1}}
2 | {{3,3,3},{3,3,3},{3,3,3}}
3 | {{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
(3 rows)WITH foo AS (
SELECT ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI'::text, 1, 0), 2, '32BF'::text, 3, -9999), 3, '16BSI', 0, 0) AS rast
)
SELECT
(ST_DumpValues(rast, ARRAY[3, 1])).*
FROM foo;nband | valarray
-------+------------------------------------------------------
3 | {{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
1 | {{1,1,1},{1,1,1},{1,1,1}}
(2 rows)WITH foo AS (
SELECT ST_SetValue(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0), 1, 2, 5) AS rast
)
SELECT
(ST_DumpValues(rast, 1))[2][1]
FROM foo;5
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 );
Отримайте координати columnx, rowy пікселя, значення якого дорівнює значенню пошуку. Якщо канал не вказаний, то вважається, що це канал 1.
Доступність: 2.1.0
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0),
1, '8BUI', 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, 255],
[1, 1, 0, 1, 1]
]::double precision[][]
) AS rast
)
SELECT (ST_PixelOfValue(rast, 1, ARRAY[1, 255])).*
FROM sourceval | 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 координат не вказано, повертається нульове значення.
Різниця між форматами представлення полягає в наступному:
GDAL uses the value order shown below.
scalex skewy skewx scaley upperleftx upperlefty
ESRI uses the value order shown below.
scalex skewy skewx scaley upperleftx + scalex*0.5 upperlefty + scaley*0.5
![]() | |
Якщо растр має канали, що виходять за межі бази даних, зміна геореференції може призвести до неправильного доступу до даних каналу, що зберігаються зовні. |
Покращено: 2.1.0 Додано варіант ST_SetGeoReference(raster, double precision, ...)
WITH source AS (
SELECT ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0) AS rast
), variants AS (
SELECT 0 AS rid, rast FROM source
UNION ALL
SELECT 1, ST_SetGeoReference(rast, '10 0 0 -10 0.1 0.1', 'GDAL')
FROM source
UNION ALL
SELECT 2, ST_SetGeoReference(rast, '10 0 0 -10 5.1 -4.9', 'ESRI')
FROM source
UNION ALL
SELECT 3, ST_SetGeoReference(rast, 1, 1, 10, -10, 0.001, 0.001)
FROM source
)
SELECT
rid,
round(ST_UpperLeftX(rast)::numeric, 3) AS upperleftx,
round(ST_UpperLeftY(rast)::numeric, 3) AS upperlefty,
ST_ScaleX(rast) AS scalex,
ST_ScaleY(rast) AS scaley,
ST_SkewX(rast) AS skewx,
ST_SkewY(rast) AS skewy
FROM variants
ORDER BY rid;rid | upperleftx | upperlefty | scalex | scaley | skewx | skewy -----+------------+------------+--------+--------+-------+------- 0 | 0.000 | 0.000 | 1 | -1 | 0 | 0 1 | 0.100 | 0.100 | 10 | -10 | 0 | 0 2 | 0.100 | 0.100 | 10 | -10 | 0 | 0 3 | 1.000 | 1.000 | 10 | -10 | 0.001 | 0.001 (4 rows)
ST_GeoReference, ST_ScaleX, ST_ScaleY, ST_UpperLeftX, ST_UpperLeftY
ST_SetRotation — Встановіть поворот растра в радіанах.
raster ST_SetRotation(raster rast, float8 rotation);
Рівномірно повертає растр. Поворот вимірюється в радіанах. Докладнішу інформацію див. у World File.
WITH variants AS (
SELECT rid, 'rotated' AS kind, ST_SetRotation(rast, 15) AS rast
FROM dummy_rast
UNION ALL
SELECT rid, 'original', rast
FROM dummy_rast
)
SELECT
rid,
kind,
round(ST_ScaleX(rast)::numeric, 4) AS scale_x,
round(ST_ScaleY(rast)::numeric, 4) AS scale_y,
round(ST_SkewX(rast)::numeric, 4) AS skew_x,
round(ST_SkewY(rast)::numeric, 4) AS skew_y
FROM variants
ORDER BY rid, kind;rid | kind | scale_x | scale_y | skew_x | skew_y -----+----------+---------+---------+--------+-------- 1 | original | 2.0000 | 3.0000 | 0.0000 | 0.0000 1 | rotated | -1.5194 | -2.2791 | 1.9509 | 1.3006 2 | original | 0.0500 | -0.0500 | 0.0000 | 0.0000 2 | rotated | -0.0380 | -0.0380 | 0.0325 | 0.0325 (4 rows)
ST_SetScale — Встановлює розмір пікселів по осях X та Y в одиницях системи координат. Кількість одиниць/ширина пікселя/висота.
raster ST_SetScale(raster rast, float8 xy);
raster ST_SetScale(raster rast, float8 x, float8 y);
Встановлює розмір пікселів по осях X та Y в одиницях системи координат. Кількість одиниць/ширина/висота пікселя. Якщо передано лише одну одиницю, вважається, що X та Y мають однакове значення.
![]() | |
ST_SetScale відрізняється від ST_Rescale тим, що ST_SetScale не передискретизує растр для відповідності розмірам растра. Він лише змінює метадані (або геореференцію) растра, щоб виправити спочатку неправильно вказане масштабування. ST_Rescale призводить до того, що растр має різну ширину і висоту, обчислені для відповідності географічному розміру вхідного растра. ST_SetScale не змінює ні ширину, ні висоту растра. |
Змінено: 2.0.0 У версіях WKTRaster це називалося ST_SetPixelSize. Це було змінено у версії 2.0.0.
UPDATE dummy_rast
SET rast = ST_SetScale(rast, 1.5)
WHERE rid = 2;
SELECT ST_ScaleX(rast) As pixx, ST_ScaleY(rast) As pixy, Box3D(rast) As newbox
FROM dummy_rast
WHERE rid = 2;pixx | pixy | newbox ------+------+---------------------------------------------- 1.5 | 1.5 | BOX(3427927.75 5793244 0, 3427935.25 5793251.5 0)
UPDATE dummy_rast
SET rast = ST_SetScale(rast, 1.5, 0.55)
WHERE rid = 2;
SELECT ST_ScaleX(rast) As pixx, ST_ScaleY(rast) As pixy, Box3D(rast) As newbox
FROM dummy_rast
WHERE rid = 2;pixx | pixy | newbox ------+------+-------------------------------------------- 1.5 | 0.55 | BOX(3427927.75 5793244 0,3427935.25 5793247 0)
ST_SetSkew — Встановлює геореференцію X і Y (або параметр обертання). Якщо передається тільки один параметр, X і Y встановлюються на одне і те ж значення.
raster ST_SetSkew(raster rast, float8 skewxy);
raster ST_SetSkew(raster rast, float8 skewx, float8 skewy);
Встановлює геореференцію X і Y (або параметр обертання). Якщо передається тільки один параметр, X і Y встановлюються на одне і те ж значення. Докладнішу інформацію див. у World File.
This is the first example.
UPDATE dummy_rast SET rast = ST_SetSkew(rast, 1, 2) WHERE rid = 1;
SELECT
rid,
format('(%s, %s)', skewx, skewy) AS skew,
term,
georef[idx] AS value
FROM (
SELECT
rid,
ST_SkewX(rast) AS skewx,
ST_SkewY(rast) AS skewy,
string_to_array(ST_GeoReference(rast), E'\n') AS georef
FROM dummy_rast
WHERE rid = 1
) AS refs
CROSS JOIN (VALUES
(1, 'scaleX'),
(2, 'skewY'),
(3, 'skewX'),
(4, 'scaleY'),
(5, 'originX'),
(6, 'originY')
) AS parts(idx, term)
ORDER BY idx;rid | skew | term | value -----+--------+---------+-------------- 1 | (1, 2) | scaleX | 2.0000000000 1 | (1, 2) | skewY | 2.0000000000 1 | (1, 2) | skewX | 1.0000000000 1 | (1, 2) | scaleY | 3.0000000000 1 | (1, 2) | originX | 0.5000000000 1 | (1, 2) | originY | 0.5000000000 (6 rows)
This second example sets both values to the same number.
UPDATE dummy_rast SET rast = ST_SetSkew(rast, 0) WHERE rid = 1;
SELECT
rid,
format('(%s, %s)', skewx, skewy) AS skew,
term,
georef[idx] AS value
FROM (
SELECT
rid,
ST_SkewX(rast) AS skewx,
ST_SkewY(rast) AS skewy,
string_to_array(ST_GeoReference(rast), E'\n') AS georef
FROM dummy_rast
WHERE rid = 1
) AS refs
CROSS JOIN (VALUES
(1, 'scaleX'),
(2, 'skewY'),
(3, 'skewX'),
(4, 'scaleY'),
(5, 'originX'),
(6, 'originY')
) AS parts(idx, term)
ORDER BY idx;rid | skew | term | value -----+--------+---------+-------------- 1 | (0, 0) | scaleX | 2.0000000000 1 | (0, 0) | skewY | 0.0000000000 1 | (0, 0) | skewX | 0.0000000000 1 | (0, 0) | scaleY | 3.0000000000 1 | (0, 0) | originX | 0.5000000000 1 | (0, 0) | originY | 0.5000000000 (6 rows)
ST_SetSRID — Встановлює SRID растра на певне ціле число srid, визначене в таблиці spatial_ref_sys.
raster ST_SetSRID(raster rast, integer srid);
Встановлює SRID на растрі на певне ціле значення.
![]() | |
Ця функція жодним чином не трансформує растр — вона просто встановлює метадані, що визначають просторову референцію системи координат, в якій він зараз знаходиться. Корисно для подальших трансформацій. |
ST_SetUpperLeft — Встановлює значення верхнього лівого кута пікселя растру на проектовані координати X і Y.
raster ST_SetUpperLeft(raster rast, double precision x, double precision y);
Встановіть значення верхнього лівого кута растра на проектовані координати X і Y
SELECT ST_SetUpperLeft(rast, -71.01, 42.37)
FROM dummy_rast
WHERE rid = 2;
ST_Resample — Передискретизуйте растр, використовуючи вказаний алгоритм ресемплінгу, нові розміри, довільний кут сітки та набір атрибутів геореференціювання растра, визначених або запозичених з іншого растра.
raster ST_Resample(raster rast, integer width, integer height, double precision gridx=NULL, double precision gridy=NULL, double precision skewx=0, double precision skewy=0, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Resample(raster rast, double precision scalex=0, double precision scaley=0, double precision gridx=NULL, double precision gridy=NULL, double precision skewx=0, double precision skewy=0, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Resample(raster rast, raster ref, text algorithm=NearestNeighbor, double precision maxerr=0.125, boolean usescale=true);
raster ST_Resample(raster rast, raster ref, boolean usescale, text algorithm=NearestNeighbor, double precision maxerr=0.125);
Ресемплуйте растр, використовуючи вказаний алгоритм ресемплінгу, нові розміри (ширина та висота), кут сітки (gridx та gridy) та набір атрибутів геореференціювання растра (scalex, scaley, skewx та skewy), визначених або запозичених з іншого растра. Якщо використовується еталонний растр, обидва растри повинні мати однаковий SRID.
Нові значення пікселів обчислюються за допомогою одного з наступних алгоритмів ресемплінгу:
NearestNeighbor (англійська або американська орфографія)
Bilinear
Cubic
CubicSpline
Lanczos
Max
Min
За замовчуванням використовується NearestNeighbor, який є найшвидшим, але дає найгірші результати інтерполяції.
Якщо не вказано maxerr, використовується максимальна похибка 0,125%.
![]() | |
Докладнішу інформацію див.: Методи ресемплювання GDAL Warp. |
Доступність: 2.0.0 Вимагає GDAL 1.6.1+
Покращено: додано опції максимального та мінімального значення ресемплювання 3.4.0
SELECT
ST_Width(orig) AS orig_width,
ST_Width(reduce_100) AS new_width
FROM (
SELECT
rast AS orig,
ST_Resample(rast, 100, 100) AS reduce_100
FROM aerials.boston
WHERE ST_Intersects(
rast,
ST_Transform(ST_MakeEnvelope(-71.128, 42.2392, -71.1277, 42.2397, 4326),
26986)
)
LIMIT 1
) AS foo;orig_width | new_width
------------+-------------
200 | 100ST_Rescale — Виконує ресемплінг растра, змінивши тільки його масштаб (або розмір пікселя). Нові значення пікселів обчислюються за допомогою алгоритму ресемплінгу NearestNeighbor (англійська або американська орфографія), Bilinear, Cubic, CubicSpline, Lanczos, Max або Min. За замовчуванням використовується NearestNeighbor.
raster ST_Rescale(raster rast, double precision scalexy, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Rescale(raster rast, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125);
Виконує ресемплінг растра, змінивши тільки його масштаб (або розмір пікселя). Нові значення пікселів обчислюються за допомогою одного з наступних алгоритмів ресемплінгу:
NearestNeighbor (англійська або американська орфографія)
Bilinear
Cubic
CubicSpline
Lanczos
Max
Min
За замовчуванням використовується NearestNeighbor, який є найшвидшим, але дає найгірші результати інтерполяції.
scalex та scaley визначають новий розмір пікселя. scaley часто повинен бути від'ємним, щоб отримати добре орієнтований растр.
Коли новий scalex або scaley не є дільником ширини або висоти растра, розмір отриманого растра розширюється, щоб охопити розмір наданого растра. Якщо ви хочете бути впевнені, що точний розмір вхідних даних буде збережено, див. ST_Resize
maxerr — це поріг для наближення перетворення за допомогою алгоритму ресемплінгу (в пікселях). Якщо maxerr не вказано, використовується значення за замовчуванням 0,125, яке є таким самим, як і в утиліті GDAL gdalwarp. Якщо встановлено нульове значення, наближення не відбувається.
![]() | |
Докладнішу інформацію див.: Методи ресемплювання GDAL Warp. |
![]() | |
ST_Rescale відрізняється від ST_SetScale тим, що ST_SetScale не виконує ресемплінг растру для відповідності розмірам растру. ST_SetScale лише змінює метадані (або геореференцію) растра, щоб виправити спочатку неправильно вказане масштабування. ST_Rescale призводить до того, що растр має різну ширину і висоту, обчислені для відповідності географічному розміру вхідного растра. ST_SetScale не змінює ні ширину, ні висоту растра. |
Доступність: 2.0.0 Вимагає GDAL 1.6.1+
Покращено: додано опції максимального та мінімального значення ресемплювання 3.4.0
Змінено: 2.1.0 Працює з растрами без SRID
Простий приклад перемасштабування растру з розміру пікселя 0,001 градуса до розміру пікселя 0,0015 градуса.
This example returns 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
0.001
This example returns the pixel size of the rescaled raster.
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
0.0015
ST_Resize, ST_Resample, ST_SetScale, ST_ScaleX, ST_ScaleY, ST_Transform
ST_Reskew — Виконує ресемплінг растра, регулюючи тільки його нахил (або параметри обертання). Нові значення пікселів обчислюються за допомогою алгоритму ресемплінгу NearestNeighbor (англійське або американське написання), Bilinear, Cubic, CubicSpline або Lanczos. За замовчуванням використовується NearestNeighbor.
raster ST_Reskew(raster rast, double precision skewxy, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Reskew(raster rast, double precision skewx, double precision skewy, text algorithm=NearestNeighbor, double precision maxerr=0.125);
Виконує ресемплінг растра, регулюючи тільки його нахил (або параметри обертання). Нові значення пікселів обчислюються за допомогою алгоритму ресемплінгу NearestNeighbor (англійське або американське написання), Bilinear, Cubic, CubicSpline або Lanczos. За замовчуванням використовується NearestNeighbor, який є найшвидшим, але дає найгіршу інтерполяцію.
skewx та skewy визначають новий кут нахилу.
Розмір нового растра буде відповідати розміру наданого растра.
Відсоток максимальної похибки 0,125, якщо не вказано maxerr.
![]() | |
Докладнішу інформацію див.: Методи ресемплювання GDAL Warp. |
![]() | |
ST_Reskew відрізняється від ST_SetSkew тим, що ST_SetSkew не виконує ресемплінгу растра для відповідності розмірам растра. ST_SetSkew лише змінює метадані (або геореференцію) растра, щоб виправити спочатку неправильно вказаний нахил. ST_Reskew призводить до того, що растр має різну ширину і висоту, обчислені для відповідності географічному розміру вхідного растра. ST_SetSkew не змінює ні ширину, ні висоту растра. |
Доступність: 2.0.0 Вимагає GDAL 1.6.1+
Змінено: 2.1.0 Працює з растрами без SRID
Простий приклад вирівнювання растру з нахилом від 0,0 до 0,0015.
This example uses the original non-rotated raster.
SELECT ST_Rotation(ST_AddBand(ST_MakeEmptyRaster(100, 100, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0));
st_rotation
-------------
0
(1 row)The reskewed 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));
st_rotation ------------------ -0.982793723247329 (1 row)
ST_Resample, ST_Rescale, ST_SetSkew, ST_SetRotation, ST_SkewX, ST_SkewY, ST_Transform
ST_SnapToGrid — Виконує ресемплінг растра, прив'язавши його до сітки. Нові значення пікселів обчислюються за допомогою алгоритму ресемплінгу NearestNeighbor (англійське або американське написання), Bilinear, Cubic, CubicSpline або Lanczos. За замовчуванням використовується NearestNeighbor.
raster ST_SnapToGrid(raster rast, double precision gridx, double precision gridy, text algorithm=NearestNeighbor, double precision maxerr=0.125, double precision scalex=DEFAULT 0, double precision scaley=DEFAULT 0);
raster ST_SnapToGrid(raster rast, double precision gridx, double precision gridy, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_SnapToGrid(raster rast, double precision gridx, double precision gridy, double precision scalexy, text algorithm=NearestNeighbor, double precision maxerr=0.125);
Виконує ресемплінг растра, прив'язуючи його до сітки, визначеної довільним кутом пікселя (gridx & gridy) і, за бажанням, розміром пікселя (scalex & scaley). Нові значення пікселів обчислюються за допомогою алгоритму передискретизації NearestNeighbor (англійська або американська орфографія), Bilinear, Cubic, CubicSpline або Lanczos. За замовчуванням використовується NearestNeighbor, який є найшвидшим, але дає найгіршу інтерполяцію.
gridx та gridy визначають будь-який довільний піксельний кут нової сітки. Це не обов'язково верхній лівий кут нового растра, і він не обов'язково повинен знаходитися всередині або на краю нового растрового простору.
Ви можете додатково визначити розмір пікселів нової сітки за допомогою scalex та scaley.
Розмір нового растра буде відповідати розміру наданого растра.
Відсоток максимальної похибки 0,125, якщо не вказано maxerr.
![]() | |
Докладнішу інформацію див.: Методи ресемплювання GDAL Warp. |
![]() | |
Використовуйте ST_Resample, якщо вам потрібно більше контролю над параметрами сітки. |
Доступність: 2.0.0 Вимагає GDAL 1.6.1+
Змінено: 2.1.0 Працює з растрами без SRID
Простий приклад прив'язки растру до дещо іншої сітки.
This example returns the upper-left X coordinate of the original raster.
SELECT ST_UpperLeftX(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0.001, -0.001, 0, 0, 4269), '8BUI'::text, 1, 0));
st_upperleftx
---------------
0
(1 row)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));
st_upperleftx
---------------
-0.0008
(1 row)ST_Resize — Змінити розмір растру до нової ширини/висоти
raster ST_Resize(raster rast, integer width, integer height, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Resize(raster rast, double precision percentwidth, double precision percentheight, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Resize(raster rast, text width, text height, text algorithm=NearestNeighbor, double precision maxerr=0.125);
Змінити розмір растру до нової ширини/висоти. Нову ширину/висоту можна вказати у вигляді точної кількості пікселів або відсотка від ширини/висоти растру. Розмір нового растру буде таким самим, як розмір наданого растру.
Нові значення пікселів обчислюються за допомогою алгоритму передискретизації NearestNeighbor (англійське або американське написання), Bilinear, Cubic, CubicSpline або Lanczos. За замовчуванням використовується NearestNeighbor, який є найшвидшим, але дає найгіршу інтерполяцію.
Варіант 1 очікує фактичну ширину/висоту вихідного растру.
Варіант 2 очікує десяткові значення від нуля (0) до одиниці (1), що вказують відсоток ширини/висоти вхідного растра.
Варіант 3 приймає або фактичну ширину/висоту вихідного растра, або текстовий відсоток ("20%"), що вказує відсоток ширини/висоти вхідного растра.
Доступність: 2.1.0 Вимагає GDAL 1.6.1+
WITH foo AS(
SELECT
1 AS rid,
ST_Resize(ST_AddBand(ST_MakeEmptyRaster(1000, 1000, 0, 0, 1, -1, 0, 0, 0),
1, '8BUI', 255, 0
),
'50%', '500') AS rast
UNION ALL
SELECT
2 AS rid,
ST_Resize(ST_AddBand(ST_MakeEmptyRaster(1000, 1000, 0, 0, 1, -1, 0, 0, 0),
1, '8BUI', 255, 0
),
500, 100) AS rast
UNION ALL
SELECT
3 AS rid,
ST_Resize(ST_AddBand(ST_MakeEmptyRaster(1000, 1000, 0, 0, 1, -1, 0, 0, 0),
1, '8BUI', 255, 0
),
0.25, 0.9) AS rast
)
SELECT
rid,
ST_Width(rast) AS width,
ST_Height(rast) AS height,
ST_ScaleX(rast) AS scale_x,
round(ST_ScaleY(rast)::numeric, 4) AS scale_y
FROM foo
ORDER BY ridrid | width | height | scale_x | scale_y -----+-------+--------+---------+--------- 1 | 500 | 500 | 2 | -2.0000 2 | 500 | 100 | 2 | -10.0000 3 | 250 | 900 | 4 | -1.1111 (3 rows)
ST_Transform — Перепроектує растр у відомій системі просторових координат в іншу відому систему просторових координат, використовуючи вказаний алгоритм передискретизації. Доступні опції: NearestNeighbor, Bilinear, Cubic, CubicSpline, Lanczos. За замовчуванням використовується NearestNeighbor.
raster ST_Transform(raster rast, integer srid, text algorithm=NearestNeighbor, double precision maxerr=0.125, double precision scalex, double precision scaley);
raster ST_Transform(raster rast, integer srid, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Transform(raster rast, raster alignto, text algorithm=NearestNeighbor, double precision maxerr=0.125);
Перепроектує растр у відомій системі просторових координат в іншу відому систему просторових координат, використовуючи вказаний алгоритм деформації пікселів. Використовує 'NearestNeighbor', якщо алгоритм не вказано, і maxerror у відсотках 0,125, якщо maxerr не вказано.
Варіанти алгоритму: 'NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline' та 'Lanczos'. Докладнішу інформацію див. у розділі: Методи передискретизації GDAL Warp.
ST_Transform часто плутають з ST_SetSRID(). ST_Transform фактично змінює координати растра (і перераховує значення пікселів) з однієї системи просторових координат в іншу, тоді як ST_SetSRID() просто змінює ідентифікатор SRID растра.
На відміну від інших варіантів, варіант 3 вимагає використання опорного растра як alignto. Перетворений растр буде перетворений у просторову систему координат (SRID) опорного растра і вирівняний (ST_SameAlignment = TRUE) з опорним растром.
![]() | |
Якщо ви виявили, що підтримка перетворення не працює належним чином, можливо, вам доведеться встановити змінну середовища PROJSO на бібліотеку проекцій, яку використовує ваша збірка PostGIS. Для цього потрібно лише вказати ім'я файлу. Наприклад, у Windows у Панелі керування -> Система -> Змінні середовища додайте системну змінну з назвою |
![]() | |
При трансформації покриття плиток майже завжди потрібно використовувати опорний растр, щоб забезпечити однакове вирівнювання і відсутність проміжків у плитках, як показано в прикладі: Варіант 3. |
Доступність: 2.0.0 Вимагає GDAL 1.6.1+
Покращено: 2.1.0 Додано варіант ST_Transform(rast, alignto)
Compare a source raster with nearest-neighbor and bilinear reprojections. The diagonal bands make the resampling behavior visible: nearest-neighbor keeps hard pixel steps, while bilinear smooths values between pixels. All three figures are generated from this query at manual build time.
WITH rows AS (
SELECT
y,
array_agg(
((
x * 3 + y * 5
+ CASE WHEN (x + y) % 8 < 4 THEN 80 ELSE 0 END
) % 255)::double precision
ORDER BY x
) AS row_values
FROM generate_series(1, 80) AS y
CROSS JOIN generate_series(1, 80) AS x
GROUP BY y
), source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(
80, 80,
-500000, 600000,
2500, -2500,
0, 0,
2163
),
1, '8BUI', 0, NULL
),
1, 1, 1,
array_agg(row_values ORDER BY y)::double precision[][]
) AS rast
FROM rows
), transformed AS (
SELECT
rast,
ST_Transform(rast, 4326, 'NearestNeighbor') AS nearest,
ST_Transform(rast, 4326, 'Bilinear') AS bilinear
FROM source
)
SELECT
ST_AsPNG(rast) AS "source (EPSG:2163)",
ST_AsPNG(nearest) AS "nearest (EPSG:4326)",
ST_AsPNG(bilinear) AS "bilinear (EPSG:4326)"
FROM transformed;PNG image, 80 x 80 pixels | PNG image, 98 x 64 pixels | PNG image, 98 x 64 pixels
Raster reprojection and resampling.
![]() Massachusetts State Plane source | ![]() WGS 84 nearest-neighbor | ![]() WGS 84 bilinear |
Variant 3.
Нижче показано різницю між використанням ST_Transform(raster, srid) та ST_Transform(raster, alignto)
WITH foo AS (
SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 1, 0) AS rast UNION ALL
SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 2, 0) AS rast UNION ALL
SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 3, 0) AS rast UNION ALL
SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 10, 0) AS rast UNION ALL
SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 20, 0) AS rast UNION ALL
SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 30, 0) AS rast UNION ALL
SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 100, 0) AS rast UNION ALL
SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 200, 0) AS rast UNION ALL
SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 300, 0) AS rast
), bar AS (
SELECT
ST_Transform(rast, 4269) AS alignto
FROM foo
LIMIT 1
), baz AS (
SELECT
rid,
rast,
ST_Transform(rast, 4269) AS not_aligned,
ST_Transform(rast, alignto) AS aligned
FROM foo
CROSS JOIN bar
)
SELECT
ST_Collect(ST_ConvexHull(not_aligned) ORDER BY rid) AS not_aligned,
ST_Collect(ST_ConvexHull(aligned) ORDER BY rid) AS aligned
FROM bazMULTIPOLYGON(((-107.007 50.2,-107.005 50.2,-107.005 50.198,-107.007 50.198,-107.007 50.2)),((-107.004 50.201,-107.002 50.201,-107.002 50.198,-107.004 50.198,-107.004 50.201)),((-107.001 50.201,-106.999 50.201,-106.999 50.198,-107.001 50.198,-107.001 50.201)),((-107.007 50.199,-107.004 50.199,-107.004 50.196,-107.007 50.196,-107.007 50.199)),((-107.004 50.199,-107.001 50.199,-107.001 50.196,-107.004 50.196,-107.004 50.199)),((-107.001 50.199,-106.999 50.199,-106.999 50.196,-107.001 50.196,-107.001 50.199)),((-107.006 50.197,-107.004 50.197,-107.004 50.194,-107.006 50.194,-107.006 50.197)),((-107.004 50.197,-107.001 50.197,-107.001 50.194,-107.004 50.194,-107.004 50.197)),((-107.001 50.197,-106.998 50.197,-106.998 50.195,-107.001 50.195,-107.001 50.197))) | MULTIPOLYGON(((-107.007 50.2,-107.005 50.2,-107.005 50.198,-107.007 50.198,-107.007 50.2)),((-107.005 50.202,-107.001 50.202,-107.001 50.198,-107.005 50.198,-107.005 50.202)),((-107.002 50.202,-106.998 50.202,-106.998 50.198,-107.002 50.198,-107.002 50.202)),((-107.007 50.199,-107.003 50.199,-107.003 50.195,-107.007 50.195,-107.007 50.199)),((-107.005 50.199,-107.001 50.199,-107.001 50.195,-107.005 50.195,-107.005 50.199)),((-107.002 50.199,-106.998 50.199,-106.998 50.195,-107.002 50.195,-107.002 50.199)),((-107.007 50.198,-107.003 50.198,-107.003 50.194,-107.007 50.194,-107.007 50.198)),((-107.005 50.198,-107.001 50.198,-107.001 50.194,-107.005 50.194,-107.005 50.198)),((-107.002 50.198,-106.998 50.198,-106.998 50.194,-107.002 50.194,-107.002 50.198)))
ST_SetBandNoDataValue — Встановлює значення для заданого каналу, яке не представляє даних. Якщо канал не вказано, вважається, що це канао 1. Щоб позначити канал як такий, що не має значення nodata, встановіть значення nodata = NULL.
raster ST_SetBandNoDataValue(raster rast, double precision nodatavalue);
raster ST_SetBandNoDataValue(raster rast, integer band, double precision nodatavalue, boolean forcechecking=false);
Встановлює значення, яке не представляє даних для каналу. Якщо не вказано, припускається канал 1. Це вплине на результати функцій ST_Polygon, ST_DumpAsPolygons та ST_PixelAs...().
This example changes only the first band NODATA value.
UPDATE dummy_rast
SET rast = ST_SetBandNoDataValue(rast, 1, 254)
WHERE rid = 2;This example changes the NODATA value for bands 1, 2, and 3.
UPDATE dummy_rast
SET rast =
ST_SetBandNoDataValue(ST_SetBandNoDataValue(ST_SetBandNoDataValue(rast, 1, 254),
2, 99),
3, 108)
WHERE rid = 2;This example removes the NODATA value so that all pixels are considered by 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 як останнього аргументу і без його використання
Доступність: 2.0.0
This example creates a dummy table with one raster column. The raster has two bands and one pixel per band. In the first band, the NODATA value and pixel value are both 3. In the second band, the NODATA value is 13 and the pixel value is 4.
create table dummy_rast (rid integer, rast raster);
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, so set it to true.
update dummy_rast set rast = ST_SetBandIsNoData(rast, 1) where rid = 1;
select ST_BandIsNoData(rast, 1) from dummy_rast where rid = 1; -- Expected true
ST_SetBandPath — Оновлює шля та номер зовнішнього каналу out-db
raster ST_SetBandPath(raster rast, integer band, text outdbpath, integer outdbindex, boolean force=false);
Оновлює шлях до зовнішнього растрового файлу та номер зовнішнього каналу out-db.
![]() | |
Якщо |
Доступність: 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,
bandnum,
regexp_replace(path, '^.*/', '') AS path,
outdbbandnum
FROM ST_BandMetaData(
(SELECT rast FROM foo),
ARRAY[1, 3, 2]::int[]
) AS metadata
UNION ALL
SELECT
2, bandnum,
regexp_replace(path, '^.*/', ''),
outdbbandnum
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[]
) AS metadata
ORDER BY 1, 2;In the second result set, band 2 now points at Projected2.tif and uses out-db band 1.
query | bandnum | path | outdbbandnum
-------+---------+----------------+--------------
1 | 1 | Projected.tif | 1
1 | 2 | Projected.tif | 2
1 | 3 | Projected.tif | 3
2 | 1 | Projected.tif | 1
2 | 2 | Projected2.tif | 1
2 | 3 | Projected.tif | 3ST_SetBandIndex — Оновити номер зовнішнього каналу out-db
raster ST_SetBandIndex(raster rast, integer band, integer outdbindex, boolean force=false);
Оновлює зовнішній номер каналу out-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,
bandnum,
regexp_replace(path, '^.*/', '') AS path,
outdbbandnum
FROM ST_BandMetaData(
(SELECT rast FROM foo),
ARRAY[1, 3, 2]::int[]
) AS metadata
UNION ALL
SELECT
2, bandnum,
regexp_replace(path, '^.*/', ''),
outdbbandnum
FROM ST_BandMetaData((
SELECT
ST_SetBandIndex(rast,
2,
1
) AS rast
FROM foo
),
ARRAY[1, 3, 2]::int[]
) AS metadata
ORDER BY 1, 2;In the second result set, band 2 still points at the same file but now reads external band 1.
query | bandnum | path | outdbbandnum
-------+---------+---------------+--------------
1 | 1 | Projected.tif | 1
1 | 2 | Projected.tif | 2
1 | 3 | Projected.tif | 3
2 | 1 | Projected.tif | 1
2 | 2 | Projected.tif | 1
2 | 3 | Projected.tif | 3ST_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);
Повертає кількість пікселів у заданому каналі растрового зображення або растрового покриття. Якщо канал не вказано, nband за замовчуванням дорівнює 1.
![]() | |
Якщо |
Змінено: 3.1.0 - Вилучено варіанти ST_Count(rastertable, rastercolumn, ...). Замість цього використовуйте ST_CountAgg.
Доступність: 2.0.0
Example will count all pixels not 249 and one will count all pixels.
SELECT rid, ST_Count(ST_SetBandNoDataValue(rast, 249)) As exclude_nodata,
ST_Count(ST_SetBandNoDataValue(rast, 249), false) As include_nodata
FROM dummy_rast WHERE rid=2;rid | exclude_nodata | include_nodata -----+----------------+---------------- 2 | 23 | 25
ST_CountAgg — Агрегат. Повертає кількість пікселів у заданому каналі набору растрів. Якщо канал не вказано, за замовчуванням використовується канал 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);
Повертає кількість пікселів у заданому каналі набору растрів. Якщо канал не вказано, nband за замовчуванням дорівнює 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) AS non_nodata_pixels
FROM foo;non_nodata_pixels
-------------------
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);
Повертає набір записів, що складається з мінімального, максимального значення, кількості та відсотка для заданого растрового діапазону для кожного біна. Якщо діапазон не вказано, nband за замовчуванням дорівнює 1.
![]() | |
За замовчуванням враховуються тільки значення пікселів, які не дорівнюють значенню |
widthwidth: масив, що вказує ширину кожної категорії/біну. Якщо кількість бінів перевищує кількість ширин, ширини повторюються.
Приклад: 9 контейнерів, ширина яких становить [a, b, c], дадуть результат [a, b, c, a, b, c, a, b, c]
binsКількість розривів — це кількість записів, які ви отримаєте від функції, якщо вони вказані. Якщо вони не вказані, кількість розривів обчислюється автоматично.
rightобчислювати гістограму справа, а не зліва (за замовчуванням). Це змінює критерії оцінки значення x з [a, b) на (a, b]
Змінено: 3.1.0 Вилучено варіант ST_Histogram(table_name, column_name).
Доступність: 2.0.0
Single raster tile - compute histograms for bands 1, 2, 3 and autocompute bins.
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.16Just band 2 but for 6 bins.
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
Example will consider only pixels of band 1 that are not 249 and in named quantiles.
UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast, 249) WHERE rid=2;
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 | 254SELECT ST_Quantile(rast, 0.75) As value FROM dummy_rast WHERE rid=2;
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_Count, ST_SummaryStats, ST_SummaryStatsAgg, ST_SetBandNoDataValue
ST_SummaryStats — Повертає зведені статистичні дані, що складаються з кількості, суми, середнього значення, стандартного відхилення, мінімального та максимального значень для заданого растрового каналу растрового зображення або растрового покриття. Якщо діапазон не вказано, то вважається, що це канал 1.
summarystats ST_SummaryStats(raster rast, boolean exclude_nodata_value);
summarystats ST_SummaryStats(raster rast, integer nband, boolean exclude_nodata_value);
Повертає summarystats, що складається з кількості, суми, середнього значення, стандартного відхилення, мінімального та максимального значень для заданого растрового каналу растрового зображення або растрового покриття. Якщо діапазон не вказано, nband за замовчуванням дорівнює 1.
![]() | |
За замовчуванням враховуються тільки значення пікселів, які не дорівнюють значенню |
![]() | |
За замовчуванням буде зразковано всі пікселі. Щоб отримати швидшу відповідь, встановіть |
Змінено: 3.1.0 Варіанти ST_SummaryStats(rastertable, rastercolumn, ...) видалено. Замість них використовуйте ST_SummaryStatsAgg.
Доступність: 2.0.0
Single raster tile.
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
Summarize pixels that intersect buildings of interest.
This example selects the target buildings, clips band 2 of the raster tiles to each building boundary, computes statistics for each clipped region, and then summarizes those statistics by building. It took 574ms on PostGIS Windows 64-bit with all of Boston Buildings and aerial Tiles (tiles each 150x150 pixels ~ 134,000 tiles), ~102,000 building records.
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
Raster coverage.
This example returns statistics 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 | 255For a table, sampling less than 100% can improve speed. Here the sampling is set to 25%.
SELECT band, (stats).*
FROM (SELECT band, ST_SummaryStats('o_4_boston', 'rast', band, true, 0.25) As stats
FROM generate_series(1, 3) As band) As foo;band | count | sum | mean | stddev | min | max
------+---------+--------+------------------+------------------+-----+-----
1 | 2112500 | 180686 | 82.6890480473373 | 45.6961043857248 | 0 | 255
2 | 2112500 | 174571 | 81.448503668639 | 44.2252623171821 | 0 | 255
3 | 2112500 | 144364 | 74.6765884023669 | 44.2014869384578 | 0 | 255
ST_SummaryStatsAgg — Агрегат. Повертає зведені статистичні дані, що складаються з кількості, суми, середнього значення, стандартного відхилення, мінімального та максимального значень для заданого растрового каналу набору растрів. Якщо діапазон не вказано, передбачається канал 1.
summarystats ST_SummaryStatsAgg(raster rast, integer nband, boolean exclude_nodata_value, double precision sample_percent);
summarystats ST_SummaryStatsAgg(raster rast, boolean exclude_nodata_value, double precision sample_percent);
summarystats ST_SummaryStatsAgg(raster rast, integer nband, boolean exclude_nodata_value);
Повертає summarystats, що складається з кількості, суми, середнього значення, стандартного відхилення, мінімального та максимального значень для заданого растрового каналу растрового зображення або растрового покриття. Якщо діапазон не вказано, nband за замовчуванням дорівнює 1.
![]() | |
За замовчуванням враховуються тільки значення пікселів, які не дорівнюють значенню |
![]() | |
За замовчуванням буде зразковано всі пікселі. Щоб отримати швидшу відповідь, встановіть |
Доступність: 2.2.0
WITH foo AS (
SELECT
rast.rast
FROM (
SELECT ST_SetValue(ST_SetValue(ST_SetValue(ST_AddBand(ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0, 0),
1, '64BF', 0, 0
),
1, 1, 1, -10
),
1, 5, 4, 0
),
1, 5, 5, 3.14159
) AS rast
) AS rast
FULL JOIN (
SELECT generate_series(1, 10) AS id
) AS id
ON 1 = 1
)
SELECT
(stats).count AS count,
round((stats).sum::numeric, 3) AS sum,
round((stats).mean::numeric, 3) AS mean,
round((stats).stddev::numeric, 3) AS stddev,
round((stats).min::numeric, 3) AS min,
round((stats).max::numeric, 3) AS max
FROM (
SELECT
ST_SummaryStatsAgg(rast, 1, TRUE, 1) AS stats
FROM foo
) bar;count | sum | mean | stddev | min | max
-------+---------+--------+--------+---------+-------
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);
Повертає набір записів із стовпцями value count, які містять значення пікселя каналу та кількість пікселів у растровій плитці або растровому покритті вибраного каналу.
Якщо канал не вказано, nband за замовчуванням дорівнює 1. Якщо searchvalues не вказано, повертаються всі значення пікселів, знайдені в растрі або растровому покритті. Якщо вказано одне значення пошуку, повертається ціле число замість записів, що позначають кількість пікселів, які мають це значення пікселів каналу
![]() | |
Якщо |
Доступність: 2.0.0
Example will count only pixels of band 1 that are not 249.
UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast, 249) WHERE rid=2;
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 | 521Just 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 — Повернути растрове значення з растрового файлу Well-Known Binary (WKB).
raster ST_RastFromWKB(bytea wkb);
За заданим растром Well-Known Binary (WKB) повернути растр.
Доступність: 2.5.0
SELECT (ST_MetaData(ST_RastFromWKB('\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\010@\000\000\000\000\000\000\340?\000\000\000\000\000\000\340?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\024\000'::bytea
)
)).* AS metadata;upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands
------------+------------+-------+--------+--------+--------+-------+-------+------+----------
0.5 | 0.5 | 10 | 20 | 2 | 3 | 0 | 0 | 10 | 0ST_MetaData, ST_RastFromHexWKB, ST_AsBinary/ST_AsWKB, ST_AsHexWKB
ST_RastFromHexWKB — Повернути растрове значення з шестнадцяткового представлення растру Well-Known Binary (WKB).
raster ST_RastFromHexWKB(text wkb);
За заданим растром Well-Known Binary (WKB) у шістнадцятковому представленні повернути растр.
Доступність: 2.5.0
SELECT (ST_MetaData(ST_RastFromHexWKB('010000000000000000000000400000000000000840000000000000E03F000000000000E03F000000000000000000000000000000000A0000000A001400'
)
)).* AS metadata;upperleftx | upperlefty | width | height | scalex | scaley | skewx | skewy | srid | numbands
------------+------------+-------+--------+--------+--------+-------+-------+------+----------
0.5 | 0.5 | 10 | 20 | 2 | 3 | 0 | 0 | 10 | 0ST_MetaData, ST_RastFromWKB, ST_AsBinary/ST_AsWKB, ST_AsHexWKB
ST_AsBinary/ST_AsWKB — Повернути представлення растру у вигляді добре відомого бінарного коду (WKB).
bytea ST_AsBinary(raster rast, boolean outasin=FALSE);
bytea ST_AsWKB(raster rast, boolean outasin=FALSE);
Повертає двійкове представлення растру. Якщо outasin має значення TRUE, смуги out-db обробляються як in-db. Детальні відомості про представлення див. у файлі raster/doc/RFC2-WellKnownBinaryFormat, що міститься в папці джерел PostGIS.
Це корисно в бінарних курсорах для вилучення даних з бази даних без перетворення їх у рядкове представлення.
![]() | |
За замовчуванням, вихідні дані WKB містять зовнішній шлях до файлу для смуг out-db. Якщо клієнт не має доступу до растрового файлу, що лежить в основі смуги out-db, встановіть |
Покращено: 2.1.0 Додано outasin
Покращено: 2.5.0 Додано ST_AsWKB
SELECT ST_AsBinary(rast) AS rastbin FROM dummy_rast WHERE rid=1;
\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\010@\000\000\000\000\000\000\340?\000\000\000\000\000\000\340?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\024\000
ST_AsHexWKB — Повернути добре відомий бінарний файл (WKB) у шістнадцятковому представленні растру.
bytea ST_AsHexWKB(raster rast, boolean outasin=FALSE);
Повертає двійкове представлення у шістнадцятковому форматі растра. Якщо outasin дорівнює TRUE, смуги out-db обробляються як in-db. Детальніше про представлення див. raster/doc/RFC2-WellKnownBinaryFormat у папці джерел PostGIS.
![]() | |
За замовчуванням вихідні дані Hex WKB містять зовнішній шлях до файлу для смуг out-db. Якщо клієнт не має доступу до растрового файлу, що лежить в основі смуги out-db, встановіть |
Доступність: 2.5.0
SELECT ST_AsHexWKB(rast) AS rastbin FROM dummy_rast WHERE rid=1;
010000000000000000000000400000000000000840000000000000E03F000000000000E03F000000000000000000000000000000000A0000000A001400
ST_AsGDALRaster — Повертає растрову плитку у визначеному форматі GDAL Raster. Растрові формати є одними з тих, що підтримуються вашою скомпільованою бібліотекою. Використовуйте ST_GDALDrivers(), щоб отримати список форматів, що підтримуються вашою бібліотекою.
bytea ST_AsGDALRaster(raster rast, text format, text[] options=NULL, integer srid=sameassource);
Повертає растрову плитку у вказаному форматі. Аргументи наведені нижче:
Формат format для виводу. Це залежить від драйверів, скомпільованих у вашій бібліотеці libgdal. Зазвичай доступні формати "JPEG", "GTIff", "PNG". Використовуйте ST_GDALDrivers, щоб отримати список форматів, які підтримує ваша бібліотека.
options текстовий масив опцій GDAL. Допустимі опції залежать від формату. Докладнішу інформацію див. у розділі Опції формату GDAL Raster.
srid the spatial reference identifier to embed in the output raster
Доступність: 2.0.0 — вимагає GDAL >= 1.6.0.
Export multiple raster tiles as a single JPEG image with 50 percent quality.
SELECT ST_AsGDALRaster(ST_Union(rast), 'JPEG', ARRAY['QUALITY=50']) As rastjpg FROM dummy_rast WHERE rast && ST_MakeEnvelope(10, 10, 11, 11);
One way to export raster into another format is using PostgreSQL large object export functions. The following repeats the JPEG example and exports the result. Note that this requires superuser access because it uses server-side large object functions. It will also export to path on server network. If you need export locally, use the psql equivalent lo_ functions which export to the local file system instead of the server file system.
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;
Export a raster as a GeoTIFF using the default creation options.
SELECT ST_AsGDALRaster(rast, 'GTiff') AS rasttiff FROM dummy_rast WHERE rid = 2;
Export a GeoTIFF using JPEG compression at 90 percent quality and embed SRID 4269.
SELECT ST_AsGDALRaster(
rast,
'GTiff',
ARRAY['COMPRESS=JPEG', 'JPEG_QUALITY=90'],
4269) AS rasttiff
FROM dummy_rast WHERE rid = 2;
ST_AsJPEG — Повертає вибрані канали растрової плитки як одне зображення у форматі Joint Photographic Exports Group (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);
Повертає вибрані канали растра як єдине зображення Joint Photographic Exports Group Image (JPEG). Використовуйте ST_AsGDALRaster, якщо вам потрібно експортувати менш поширені типи растрів. Якщо смуга не вказана і 1 або більше 3 каналів, то використовується тільки перший канал. Якщо 3 канали, то використовуються всі 3 канали. Існує багато варіантів функції з багатьма опціями. Вони перераховані нижче:
nband призначений для експорту одного каналу.
nbands — це масив каналів, які потрібно експортувати (зверніть увагу, що для JPEG максимальне значення становить 3), а порядок каналів — RGB. Наприклад, ARRAY[3,2,1] означає, що канал 3 відповідає червоному кольору, канал 2 — зеленому, а канал 1 — синьому
quality число від 0 до 100. Чим вище число, тим чіткіше зображення.
options текст Масив опцій GDAL, як визначено для JPEG (див. create_options для JPEG ST_GDALDrivers). Для JPEG дійсними є PROGRESSIVE ON або OFF і QUALITY в діапазоні від 0 до 100, а за замовчуванням — 75. Докладнішу інформацію див. у Параметри формату GDAL Raster.
Доступність: 2.0.0 — вимагає GDAL >= 1.6.0.
Output the first three bands at 75 percent quality.
SELECT ST_AsJPEG(rast) As rastjpg FROM dummy_rast WHERE rid=2;
Output only the first band at 90 percent quality.
SELECT ST_AsJPEG(rast, 1, 90) As rastjpg FROM dummy_rast WHERE rid=2;
Output the first three bands, mapping band 2 to red, band 1 to green, and band 3 to blue, using progressive encoding at 90 percent 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);
Повертає вибрані канали растра як єдине зображення Portable Network Graphics Image (PNG). Використовуйте ST_AsGDALRaster, якщо вам потрібно експортувати менш поширені типи растрів. Якщо канал не вказаний, експортуються перші 3 канали. Існує багато варіантів функції з багатьма опціями. Якщо не вказано srid, то використовується srid растру. Вони перераховані нижче:
nband призначений для експорту одного каналу.
nbands — це масив каналів, які потрібно експортувати (зверніть увагу, що для PNG максимальне значення становить 4), а порядок каналів — RGBA. Наприклад, ARRAY[3,2,1] означає, що канал 3 відповідає червоному кольору, канал 2 — зеленому, а канал 1 — синьому
compression число від 1 до 9. Чим вище число, тим сильніше стиснення.
options текст Масив опцій GDAL, як визначено для PNG (дивіться create_options для PNG у ST_GDALDrivers). Для PNG дійсним є тільки ZLEVEL (кількість часу, що витрачається на стиснення — за замовчуванням 6), наприклад ARRAY["ZLEVEL=9"]. WORLDFILE не допускається, оскільки функція повинна видавати два результати. Докладнішу інформацію див. у Параметри формату GDAL Raster.
Доступність: 2.0.0 — вимагає GDAL >= 1.6.0.
Export the first 3 bands and map band 3 to red, band 1 to green, and band 2 to blue.
SELECT ST_AsPNG(rast) As rastpng
FROM dummy_rast WHERE rid=2;
SELECT ST_AsPNG(rast, ARRAY[3, 1, 2]) As rastpng
FROM dummy_rast WHERE rid=2;
ST_AsTIFF — Повертає вибрані канали растра як одне зображення TIFF (масив байтів). Якщо канал не вказана або будь-яка із вказаних смуг не існує в растрі, то буде зроблена спроба використати всі канали.
bytea ST_AsTIFF(raster rast, text[] options='', integer srid=sameassource);
bytea ST_AsTIFF(raster rast, text compression='', integer srid=sameassource);
bytea ST_AsTIFF(raster rast, integer[] nbands, text compression='', integer srid=sameassource);
bytea ST_AsTIFF(raster rast, integer[] nbands, text[] options, integer srid=sameassource);
Повертає вибрані канали растра у вигляді єдиного файлу формату TIFF (Tagged Image File Format). Якщо канал не вказано, буде зроблена спроба використати всі канали. Це обгортка навколо ST_AsGDALRaster. Використовуйте ST_AsGDALRaster, якщо вам потрібно експортувати менш поширені типи растрів. Існує багато варіантів функції з багатьма опціями. Якщо текст просторової системи координат (SRS) відсутній, використовується просторова система координат растра. Вони перелічені нижче:
nbands — це масив каналів, які потрібно експортувати (зверніть увагу, що для PNG максимальне значення становить 3), а порядок каналів — RGB. Наприклад, ARRAY[3,2,1] означає, що канал 3 відповідає червоному кольору, канал 2 — зеленому, а канал 1 — синьому
compression Вираз стиснення — JPEG90 (або інший відсоток), LZW, JPEG, DEFLATE9.
options текст Масив опцій створення GDAL, як визначено для GTiff (дивіться create_options для GTiff у ST_GDALDrivers). або дивіться Опції формату GDAL Raster для більш детальної інформації.
srid srid просторової системи координат растра. Використовується для заповнення геореференційної інформації
Доступність: 2.0.0 — вимагає GDAL >= 1.6.0.
SELECT ST_AsTIFF(rast, 'JPEG90') As rasttiff
FROM dummy_rast WHERE rid=2;
crop не вказано або TRUE, вихідний растр обрізається. Якщо touched встановлено на TRUE, то долучаються дотичні пікселі, інакше долучається тільки той піксель, центр якого знаходиться в геометрії.ST_Clip — Повертає растр, обрізаний вхідною геометрією. Якщо номер каналу не вказано, обробляються всі канали. Якщо crop не вказано або TRUE, вихідний растр обрізається. Якщо touched встановлено на TRUE, то долучаються дотичні пікселі, інакше долучається тільки той піксель, центр якого знаходиться в геометрії.
raster ST_Clip(raster rast, integer[] nband, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, integer nband, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, integer nband, geometry geom, boolean crop, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, boolean crop, boolean touched=FALSE);
Повертає растр, обрізаний вхідною геометрією geom. Якщо індекс канал не вказано, обробляються всі канали.
Растери, отримані в результаті ST_Clip, повинні мати значення nodata, призначене для обрізаних областей, по одному для кожного каналу. Якщо такі значення не вказані, а вхідний растр не має визначеного значення nodata, значення nodata результуючого растра встановлюються на ST_MinPossibleValue(ST_BandPixelType(rast, band)). Якщо кількість значень nodata в масиві менша за кількість каналів, для решти каналів використовується останнє значення в масиві. Якщо кількість значень nodata більша за кількість каналів, зайві значення nodata ігноруються. Усі варіанти, що приймають масив значень nodata, також приймають одне значення, яке буде присвоєно кожному каналі.
Якщо crop не вказано, вважається, що значення true, тобто вихідний растр обрізається до перетину меж geom та rast. Якщо crop встановлено на false, новий растр отримує ті ж межі, що і rast. Якщо touched встановлено на true, то вибираються всі пікселі в rast, які перетинають геометрію.
![]() | |
За замовчуванням використовується значення touched=false, яке вибирає тільки ті пікселі, центр яких покритий геометрією. |
Покращено: 3.5.0 - додано аргумент touched.
Доступність: 2.0.0
Покращено: 2.1.0 Переписано на C
У наведених прикладах використовуються аерофотознімки штату Массачусетс, доступні на сайті MassGIS MassGIS Aerial Orthos.
Comparing selecting all touched vs. not all touched.
WITH source AS (
SELECT rast, geom
FROM ST_AsRaster(ST_Letters('R'), scalex =
> 1.0, scaley =
> -1.0) AS r(rast)
INNER JOIN ST_GeomFromText('LINESTRING(0 1,5 6,10 10)') AS g(geom)
ON ST_Intersects(r.rast, g.geom)
), clipped AS (
SELECT rast,
ST_Clip(rast, geom, touched =
> true) AS rast_touched,
ST_Clip(rast, geom, touched =
> false) AS rast_not_touched
FROM source
), variants AS (
SELECT 'original' AS title, ST_Count(rast) AS pixel_count, rast AS rendered
FROM clipped
UNION ALL
SELECT 'all touched', ST_Count(rast_touched), rast_touched
FROM clipped
UNION ALL
SELECT 'default clip', ST_Count(rast_not_touched), rast_not_touched
FROM clipped
)
SELECT title, pixel_count, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'original' THEN 1
WHEN 'all touched' THEN 2
ELSE 3
END;title | pixel_count | image --------------+-------------+---------------------------- original | 2605 | PNG image, 48 x 74 pixels all touched | 16 | PNG image, 11 x 11 pixels default clip | 10 | PNG image, 11 x 11 pixels (3 rows)
The following self-contained example uses three simple shapes as RGB bands. It compares cropping band 1, clipping band 1 without cropping and then restoring bands 2 and 3, and clipping every band without cropping.
WITH canvas AS (
SELECT ST_AddBand(
ST_AddBand(
ST_AddBand(
ST_MakeEmptyRaster(128, 128, 0, 128, 1, -1, 0, 0, 0),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
) AS rast
), source AS (
SELECT ST_SetValue(
ST_SetValue(
ST_SetValue(rast, 1, ST_Buffer('POINT(32 96)'::geometry, 22), 220),
2, ST_Buffer('LINESTRING(18 20,110 110)'::geometry, 6,
'endcap=flat join=bevel'), 210
),
3, ST_Buffer('LINESTRING(10 48,118 48)'::geometry, 7,
'endcap=flat'), 180
) AS rast,
ST_Buffer('POINT(64 64)'::geometry, 34) AS clipper
FROM canvas
), variants AS (
SELECT 'original RGB' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'band 1 cropped', ST_Clip(rast, 1, clipper, true) FROM source
UNION ALL
SELECT
'band 1 only',
ST_AddBand(
ST_Clip(rast, 1, clipper, false),
ARRAY[ST_Band(rast, 2), ST_Band(rast, 3)]
)
FROM source
UNION ALL
SELECT 'all bands clipped', ST_Clip(rast, clipper, false) FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'original RGB' THEN 1
WHEN 'band 1 cropped' THEN 2
WHEN 'band 1 only' THEN 3
ELSE 4
END;title | image -------------------+----------------------------- original RGB | PNG image, 128 x 128 pixels band 1 cropped | PNG image, 68 x 68 pixels band 1 only | PNG image, 128 x 128 pixels all bands clipped | PNG image, 128 x 128 pixels (4 rows)
Crop, single-band clipping, and all-band clipping.
![]() Source tile | ![]() Cropped |
![]() One-band source | ![]() One-band clip |
![]() All-band source | ![]() All-band clip |
ST_ColorMap — Створює новий растр з максимум чотирма смугами 8BUI (відтінки сірого, RGB, RGBA) на основі вихідного растра та вказаної смуги. Якщо смуга не вказана, за замовчуванням використовується смуга 1.
raster ST_ColorMap(raster rast, integer nband=1, text colormap=grayscale, text method=INTERPOLATE);
raster ST_ColorMap(raster rast, text colormap, text method=INTERPOLATE);
Застосуйте colormap до каналу на nband з rast, в результаті чого буде створено новий растр, що складатиметься з чотирьох 8BUI каналів. Кількість каналів 8BUI у новому растрі визначається кількістю компонентів кольору, визначених у colormap.
Якщо nband не вказано, то вважається, що використовується канал 1.
colormap може бути ключовим словом заздалегідь визначеної колірної карти або набором рядків, що визначають значення та колірні компоненти.
Дійсне заздалегідь визначене ключове слово colormap:
grayscale або greyscale для одного 8BUI-діапазону растру відтінків сірого.
pseudocolor для чотирьох 8BUI (RGBA) канального растру з кольорами від синього до зеленого до червоного.
fire для чотирьох 8BUI (RGBA) канального растру з кольорами від чорного до червоного та блідо-жовтого.
bluered для чотирьох 8BUI (RGBA) канального растру з кольорами від синього до блідо-білого та червоного.
Користувачі можуть передати набір записів (по одному на рядок) до colormap, щоб вказати власні колірні карти. Кожен запис зазвичай складається з п'яти значень: значення пікселя та відповідні компоненти червоного, зеленого, синього та альфа (компоненти кольору від 0 до 255). Замість значень пікселів можна використовувати процентні значення, де 0% і 100% є мінімальним і максимальним значеннями, що зустрічаються в растровому каналі. Значення можна розділяти комами (","), табуляцією, двокрапкою (":") та/або пробілами. Значення пікселя можна встановити як nv, null або nodata для значення NODATA. Приклад наведено нижче.
5 0 0 0 255
4 100:50 55 255
1 150, 100 150 255
0% 255 255 255 255
nv 0 0 0 0
Синтаксис colormap схожий на синтаксис режиму кольорового рельєфу GDAL gdaldem.
Дійсні ключові слова для method:
INTERPOLATE для використання лінійної інтерполяції для плавного змішування кольорів між заданими значеннями пікселів
EXACT для точного збігу тільки тих значень пікселів, які знаходяться в колірній карті. Пікселі, значення яких не збігаються із записом у колірній карті, будуть встановлені на 0 0 0 0 (RGBA)
NEAREST для використання запису колірної карти, значення якого найближче до значення пікселя
![]() | |
Чудовим джерелом інформації про колірні карти є ColorBrewer. |
![]() | |
У отриманих каналах нового растра не буде встановлено значення NODATA. Використовуйте ST_SetBandNoDataValue, щоб встановити значення NODATA, якщо це необхідно. |
Доступність: 2.1.0
This example builds a raster from rotated buffered lines and compares the original values with predefined and custom color maps.
WITH ref AS (
SELECT ST_MakeEmptyRaster(200, 200, 0, 200, 1, -1, 0, 0) AS rast
), source AS (
SELECT ST_Union(rast) AS rast
FROM (
SELECT
ST_AsRaster(ST_Rotate(ST_Buffer('LINESTRING(0 2,50 50,150 150,125 50)'::geometry,
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 title, ST_AsPNG(rendered) AS image
FROM source
CROSS JOIN LATERAL (VALUES
('original', rast),
('grayscale', ST_ColorMap(rast, 1, 'greyscale')),
('pseudocolor', ST_ColorMap(rast, 1, 'pseudocolor')),
('fire', ST_ColorMap(rast, 1, 'fire')),
('blue-red', ST_ColorMap(rast, 1, 'bluered')),
('custom red', ST_ColorMap(
rast,
1,
E'100% 255 0 0 255\n80% 160 0 0 255\n50% 130 0 0 255\n' ||
E'30% 30 0 0 255\n20% 60 0 0 255\n0% 0 0 0 255\n' ||
E'nv 255 255 255 0'
))
) AS variants(title, rendered);title | image
------------+--------------------------------
original | PNG image, 224 x 295 pixels
grayscale | PNG image, 224 x 295 pixels
pseudocolor| PNG image, 224 x 295 pixels
fire | PNG image, 224 x 295 pixels
blue-red | PNG image, 224 x 295 pixels
custom red | PNG image, 224 x 295 pixels
ST_Grayscale — Створює новий растр з одним каналом 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
This self-contained example paints an apple with gradients and highlights into three raster bands. It compares the original RGB raster with the equivalent grayscale results produced by both function variants.
WITH pixels AS (
SELECT
col,
row,
x,
y,
(((x - 48.0)^2 / (25.0^2) + (y - 54.0)^2 / (29.0^2) < 1)
OR ((x - 72.0)^2 / (25.0^2) + (y - 54.0)^2 / (29.0^2) < 1))
AND NOT ((x - 60.0)^2 / (8.0^2) + (y - 26.0)^2 / (5.0^2) < 1) AS fruit,
((x - 82.0) * 0.84 + (y - 28.0) * 0.54)^2 / (22.0^2)
+ (-(x - 82.0) * 0.54 + (y - 28.0) * 0.84)^2 / (8.0^2) < 1 AS leaf,
abs((x - 62.0) * 0.96 - (y - 29.0) * 0.28) < 3
AND x BETWEEN 60 AND 69 AND y BETWEEN 21 AND 45 AS stem
FROM (
SELECT
col,
row,
col / 2.0 AS x,
row / 2.0 AS y
FROM generate_series(1, 180) AS row
CROSS JOIN generate_series(1, 240) AS col
) AS source_pixels
), shaded AS (
SELECT
col,
row,
x,
y,
CASE
WHEN stem THEN 95 + y * 0.7 + (x % 3) * 8
WHEN leaf THEN 28 + (90 - x) * 0.5
WHEN fruit THEN LEAST(255, GREATEST(0,
150
+ (85 - sqrt((x - 39.0)^2 + (y - 37.0)^2)) * 1.1
+ CASE
WHEN (x - 43.0)^2 / (10.0^2) + (y - 43.0)^2 / (7.0^2) < 1
THEN 35
ELSE 0
END
- CASE
WHEN (x - 77.0)^2 / (20.0^2) + (y - 67.0)^2 / (13.0^2) < 1
THEN 35
ELSE 0
END
+ ((x * 13 + y * 7) % 19 - 9)
))
ELSE 245
END AS red,
CASE
WHEN stem THEN 50 + y * 0.35
WHEN leaf THEN LEAST(190, GREATEST(40,
105 + (95 - x) * 1.2 + (y - 20) * 1.5
+ CASE
WHEN (x - 76.0)^2 / (12.0^2) + (y - 24.0)^2 / (4.0^2) < 1
THEN 45
ELSE 0
END
))
WHEN fruit THEN LEAST(95, GREATEST(15,
24 + (68 - y) * 0.35
+ CASE
WHEN (x - 43.0)^2 / (10.0^2) + (y - 43.0)^2 / (7.0^2) < 1
THEN 30
ELSE 0
END
+ ((x * 5 + y * 11) % 13 - 6)
))
ELSE 245
END AS green,
CASE
WHEN stem THEN 22 + (x % 4) * 3
WHEN leaf THEN 42 + (100 - x) * 0.4
WHEN fruit THEN LEAST(75, GREATEST(10,
18
+ CASE
WHEN (x - 43.0)^2 / (10.0^2) + (y - 43.0)^2 / (7.0^2) < 1
THEN 25
ELSE 0
END
+ ((x * 3 + y * 5) % 11 - 5)
))
ELSE 245
END AS blue
FROM pixels
), rows AS (
SELECT
row,
array_agg(red::double precision ORDER BY col) AS red_values,
array_agg(green::double precision ORDER BY col) AS green_values,
array_agg(blue::double precision ORDER BY col) AS blue_values
FROM shaded
GROUP BY row
), source AS (
SELECT ST_SetValues(ST_SetValues(ST_SetValues(
ST_AddBand(ST_AddBand(ST_AddBand(
ST_MakeEmptyRaster(240, 180, 0, 180, 1, -1, 0, 0, 0),
'8BUI'::text, 245::double precision, 0::double precision),
'8BUI'::text, 245::double precision, 0::double precision),
'8BUI'::text, 245::double precision, 0::double precision),
1, 1, 1, array_agg(red_values ORDER BY row)::double precision[][]),
2, 1, 1, array_agg(green_values ORDER BY row)::double precision[][]),
3, 1, 1, array_agg(blue_values ORDER BY row)::double precision[][]) AS rast
FROM rows
)
SELECT ST_AsPNG(rast) AS "original RGB",
ST_AsPNG(ST_Grayscale(rast)) AS "grayscale (variant 1)",
ST_AsPNG(ST_Grayscale(ARRAY[
ROW(rast, 1)::rastbandarg,
ROW(rast, 2)::rastbandarg,
ROW(rast, 3)::rastbandarg
]::rastbandarg[])) AS "grayscale (variant 2)"
FROM source;original RGB | grayscale (variant 1) | grayscale (variant 2) -----------------------------+----------------------------+---------------------------- PNG image, 240 x 180 pixels | PNG image, 240 x 180 pixels | PNG image, 240 x 180 pixels (1 row)
Original photographic illustration:
![]() original apple | ![]() grayscale apple |
ST_Intersection — Повертає растр або набір пар геометрія-піксельне значення, що представляють спільну частину двох растрів або геометричне перетин векторизації растра і геометрії.
setof geomval ST_Intersection(geometry geom, raster rast, integer band_num=1);
setof geomval ST_Intersection(raster rast, geometry geom);
setof geomval ST_Intersection(raster rast, integer band, geometry geomin);
raster ST_Intersection(raster rast1, raster rast2, double precision[] nodataval);
raster ST_Intersection(raster rast1, raster rast2, text returnband, double precision[] nodataval);
raster ST_Intersection(raster rast1, integer band1, raster rast2, integer band2, double precision[] nodataval);
raster ST_Intersection(raster rast1, integer band1, raster rast2, integer band2, text returnband, double precision[] nodataval);
Повертає растр або набір пар геометрія-піксель, що представляють спільну частину двох растрів або геометричне перетин векторизації растру і геометрії.
Перші три варіанти, що повертають набір geomval, працюють у векторному просторі. Растр спочатку векторизується (за допомогою ST_DumpAsPolygons) у набір рядків geomval, а потім ці рядки перетинаються з геометрією за допомогою функції PostGIS ST_Intersection(geometry, geometry). Геометрії, що перетинаються тільки з областю растра зі значенням nodata, повертають порожню геометрію. Зазвичай вони виключаються з результатів за допомогою правильного використання ST_Intersects в розділі WHERE.
Ви можете отримати доступ до геометрії та значень результативного набору geomval, обернувши їх у дужки та додавши ".geom" або ".val" в кінці виразу. Наприклад, (ST_Intersection(rast, geom)).geom
Інші варіанти, що повертають растр, працюють у растровому просторі. Вони використовують версію ST_MapAlgebraExpr з двома растрами для виконання перетину.
Межі отриманого растра відповідають геометричному перетину двох меж растра. Отриманий растр включає канали "BAND1", "BAND2" або "BOTH", відповідно до того, що передається як параметр returnband. Області з значенням nodata, присутні в будь-якій смузі, призводять до появи областей з значенням nodata в усіх смугах результату. Іншими словами, будь-який піксель, що перетинається з пікселем із значенням nodata, стає пікселем із значенням nodata в результаті.
Растри, отримані в результаті ST_Intersection, повинні мати значення nodata, призначене для областей, що не перетинаються. Ви можете визначити або замінити значення nodata для будь-якого отриманого каналу, надавши масив nodataval[] з одним або двома значеннями nodata, залежно від того, чи ви запитуєте канали "BAND1", "BAND2" або "BOTH". Перше значення в масиві замінює значення nodata в першому каналі, а друге значення замінює значення nodata в другому каналі. Якщо один вхідний канал не має визначеного значення nodata і жодне значення не вказано в масиві, воно вибирається за допомогою функції ST_MinPossibleValue. Усі варіанти, що приймають масив значень nodata, також можуть приймати одне значення, яке буде присвоєно кожному запитуваному каналу.
У всіх варіантах, якщо номер каналу не вказано, вважається, що це каналу 1. Якщо вам потрібна перетин між растром і геометрією, який повертає растр, зверніться до ST_Clip.
![]() | |
For more control over the result extent or NODATA handling, use the two-raster variant of ST_MapAlgebraExpr. To compute a raster-space intersection with a geometry, use ST_Clip. Use this function together with ST_Intersects and an index on the raster or geometry column when filtering table data. |
Покращено: 2.0.0 — додано перетин у растровому просторі. У попередніх версіях до 2.0.0 підтримувався лише перетин у векторному просторі.
SELECT
foo.rid,
foo.gid,
GeometryType((foo.geomval).geom) AS geom_type,
(foo.geomval).val AS value
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, 'LINESTRING(3427927.85 5793243.75,3427927.8 5793243.75,3427927.8 5793243.8)'::geometry),
(3, 'LINESTRING(1 2,3 4)'::geometry)
) As g(gid, geom)
WHERE A.rid = 2
) AS foo;rid | gid | geom_type | value -----+-----+----------------------+------- 2 | 1 | POINT | 249 2 | 1 | POINT | 253 2 | 2 | POINT | 254 2 | 2 | POINT | 251 2 | 2 | POINT | 253 2 | 2 | LINESTRING | 252 2 | 2 | MULTILINESTRING | 250 2 | 3 | GEOMETRYCOLLECTION |
The same line example rendered in a common coordinate frame. The raster footprint and complete input line remain visible behind the returned intersection pieces.
WITH source AS (
SELECT
rast,
ST_GeomFromText(
'LINESTRING(3427927.85 5793243.75,'
'3427927.8 5793243.75,3427927.8 5793243.8)'
) AS input_geometry
FROM dummy_rast
WHERE rid = 2
), intersection AS (
SELECT
rast,
input_geometry,
ST_Collect(gv.geom) AS result_geometry
FROM source
CROSS JOIN LATERAL ST_Intersection(rast, input_geometry) AS gv
GROUP BY rast, input_geometry
), layers AS (
SELECT
'raster' AS title,
ST_Translate(ST_Envelope(rast), -3427927.75, -5793243.75) AS geom
FROM intersection
UNION ALL
SELECT
'input',
ST_Translate(input_geometry, -3427927.75, -5793243.75)
FROM intersection
UNION ALL
SELECT
'intersection',
ST_Translate(result_geometry, -3427927.75, -5793243.75)
FROM intersection
)
SELECT title, geom AS geom
FROM layers
ORDER BY CASE title
WHEN 'raster' THEN 1
WHEN 'input' THEN 2
ELSE 3
END;title | geom --------------+------------------------------------------------------------- raster | POLYGON((0 0,0 0.25,0.25 0.25,0.25 0,0 0)) input | LINESTRING(0.1 0,0.05 0,0.05 0.05) intersection | GEOMETRYCOLLECTION
geomval, ST_Intersects, ST_MapAlgebraExpr, ST_Clip, ST_AsText
ST_MapAlgebra (callback function version) — Версія функції зворотного виклику - Повертає односмуговий растр, заданий одним або декількома вхідними растрами, індексами каналів і однією функцією зворотного виклику, заданою користувачем.
raster ST_MapAlgebra(rastbandarg[] rastbandargset, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
raster ST_MapAlgebra(raster rast, integer[] nband, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=FIRST, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
raster ST_MapAlgebra(raster rast, integer nband, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=FIRST, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
raster ST_MapAlgebra(raster rast1, integer nband1, raster rast2, integer nband2, regprocedure callbackfunc, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
raster ST_MapAlgebra(raster rast, integer nband, regprocedure callbackfunc, float8[] mask, boolean weighted, text pixeltype=NULL, text extenttype=INTERSECTION, raster customextent=NULL, text[] VARIADIC userargs=NULL);
Повертає одноканальний растр, заданий одним або декількома вхідними растрами, індексами каналів і однією функцією зворотного виклику, заданою користувачем.
rast,rast1,rast2, rastbandargsetРастри, на яких оцінюється процес алгебри карт.
rastbandargset дозволяє використовувати операцію алгебри карт на багатьох растрах та/або багатьох каналах. Див. приклад Варіант 1.
nband, nband1, nband2Номери каналів растра, що підлягають оцінці. nband може бути цілим числом або цілим числом [], що позначає каналу. nband1 — це канал на rast1, а nband2 — канал на rast2 для випадку 2 raster/2band.
callbackfuncПараметр callbackfunc повинен бути ім'ям і сигнатурою функції SQL або PL/pgSQL, перетвореною в regprocedure. Приклад функції PL/pgSQL:
CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], pos integer[][], VARIADIC userargs text[])
RETURNS double precision
AS $$
BEGIN
RETURN 0;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
The callbackfunc must have two or three arguments: a 3-dimension double precision array, a 2-dimension integer array and, optionally, 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 optional third argument userargs is for passing through any user-specified arguments.
The callback return value is used as the value of the output pixel. If the callback returns NULL, the output pixel is set to NODATA when the output band has a NODATA value. If the output band has no NODATA value, a NULL callback result raises an error.
Для передачі аргументу regprocedure до функції SQL необхідно передати повну сигнатуру функції, а потім перетворити її до типу regprocedure. Щоб передати вищезазначену функцію PL/pgSQL як аргумент, SQL для аргументу буде таким:
'sample_callbackfunc(double precision[], integer[], text[])'::regprocedure
Note that PostgreSQL array types do not encode dimensions in function signatures, so multidimensional callback arguments are written as double precision[] and integer[] in the regprocedure signature.
maskN-вимірний масив (матриця) чисел, що використовується для фільтрації комірок, які передаються до функції зворотного виклику алгебри мап. 0 означає, що значення сусідньої комірки слід розглядати як відсутність даних, а 1 означає, що значення слід розглядати як дані. Якщо вага встановлена як true, то значення використовуються як множники для множення значення пікселя цього значення в сусідній позиції.
weightedбулеве значення (true/false) для позначення того, чи слід зважувати значення маски (помножити на вихідне значення), чи ні (застосовується тільки до прототипу, який приймає маску).
pixeltypeЯкщо передано pixeltype, одон канал нового растру буде мати цей тип пікселів. Якщо pixeltype передається як NULL або пропускається, новий растровий канал матиме той самий тип пікселів, що й вказаний канал першого растру (для типів розширення: INTERSECTION, UNION, FIRST, CUSTOM) або вказаний канал відповідного растру (для типів розширення: SECOND, LAST). У разі сумнівів завжди вказуйте pixeltype.
Тип пікселів вихідного растру повинен бути одним із типів, перелічених у ST_BandPixelType, або пропущений, або встановлений як NULL.
extenttypeМожливі значення: INTERSECTION (за замовчуванням), UNION, FIRST (за замовчуванням для одного растрового варіанту), SECOND, LAST, CUSTOM.
customextentЯкщо extentype дорівнює CUSTOM, для customextent необхідно вказати растр. Див. приклад 4 варіанту 1.
distancexВідстань у пікселях від опорної комірки в напрямку x. Отже, ширина результуючої матриці буде дорівнювати 2*distancex + 1. Якщо не вказано, враховується лише опорна комірка (околиця 0).
distanceyВідстань у пікселях від опорної комірки у напрямку y. Висота отриманої матриці буде дорівнювати 2*distancey + 1. Якщо не вказано, враховується тільки опорна комірка (околиця 0).
userargsIf the callbackfunc declares a third argument, that argument is a variadic text array. All trailing text arguments are passed through to the specified callbackfunc, and are contained in the userargs argument.
![]() | |
Для отримання додаткової інформації про ключове слово VARIADIC зверніться до документації PostgreSQL та розділу "Функції SQL із змінною кількістю аргументів" у Функції мови запитів (SQL). |
Варіант 1 приймає масив rastbandarg, що дозволяє використовувати операцію алгебри карт на багатьох растрах та/або багатьох каналах. Див. приклад Варіант 1.
Варіанти 2 і 3 працюють з одним або декількома каналами одного растра. Див. приклад варіантів 2 і 3.
Варіант 4 працює з двома растрами з одним каналом на растр. Див. приклад Варіант 4.
Доступність: 2.2.0: Можливість додавання маски
Доступність: 2.1.0
Compare an unmasked mean with neighbor-only and weighted-neighbor masks. The weighted mask multiplies neighboring values by 2 before computing the result.
WITH foo AS (
SELECT ST_SetBandNoDataValue(
ST_SetValue(
ST_SetValue(
ST_AsRaster(
ST_Buffer('LINESTRING(50 50,100 90,100 50)'::geometry, 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
), variants AS (
SELECT 'original' AS title, rast
FROM foo
UNION ALL
SELECT 'unmasked mean' AS title,
ST_MapAlgebra(rast, 1, 'ST_Mean4ma(double precision[], int[], text[])'::regprocedure) AS rast
FROM foo
UNION ALL
SELECT 'neighbor-only mean' 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 'weighted neighbor mean' 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
)
SELECT title, ST_AsPNG(rast) AS image
FROM variants;title | image
------------------------+--------------------------------
original | PNG image, 200 x 200 pixels
unmasked mean | PNG image, 200 x 200 pixels
neighbor-only mean | PNG image, 200 x 200 pixels
weighted neighbor mean | PNG image, 200 x 200 pixels
Variant 1.
Один растр, один канал
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
Повний приклад плиток покриття з сусідством.
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
Приклад, подібний до попереднього, для плиток покриття з сусідством, але з використанням лише основних функцій SQL.
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
), 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[],
'sample_callbackfunc(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;
Variants 2 and 3.
Один растр, кілька каналів
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
Variant 4.
Два растри, два канали
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
ST_MapAlgebra (expression version) — Версія виразу — повертає одноканальний растр, заданий одним або двома вхідними растрами, індексами каналів і одним або декількома визначеними користувачем виразами SQL.
raster ST_MapAlgebra(raster rast, integer nband, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebra(raster rast, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebra(raster rast1, integer nband1, raster rast2, integer nband2, text expression, text pixeltype=NULL, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
raster ST_MapAlgebra(raster rast1, raster rast2, text expression, text pixeltype=NULL, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
Версія виразу — повертає одноканальний растр на основі одного або двох вхідних растрів, індексів каналів та одного або декількох визначених користувачем виразів SQL.
Доступність: 2.1.0
Створює новий одноканальний растр, сформований шляхом застосування дійсної алгебраїчної операції PostgreSQL, визначеної виразом expression на вхідному растрі (rast). Якщо nband не вказано, припускається, що це канал 1. Новий растр матиме ті ж геореференцію, ширину та висоту, що й оригінальний растр, але матиме лише один канал.
Якщо передано pixeltype, то новий растр матиме канал цього типу пікселів. Якщо передано NULL, то новий канал растра матиме той самий тип пікселів, що й вхідний канал rast.
Ключові слова, дозволені для expression
[rast] - Значення пікселя, що цікавить
[rast.val] - Значення пікселя, що цікавить
[rast.x] - стовпець пікселів з індексом 1, що представляє піксель, який нас цікавить
[rast.y] - ряд пікселів, що починається з 1, який представляє піксель, що нас цікавить
Створює новий одноканальний растр, сформований шляхом застосування дійсної алгебраїчної операції PostgreSQL до двох каналів, визначених виразом expression на двох вхідних растрових каналах rast1, (rast2). Якщо не вказано band1, band2, то вважається, що це канал 1. Отриманий растр буде вирівняний (масштаб, нахил і кути пікселів) на сітці, визначеній першим растром. Отриманий растр матиме розмір, визначений параметром extenttype.
expressionАлгебраїчний вираз PostgreSQL, що включає два растри та визначені функції/оператори PostgreSQL, які визначатимуть значення пікселя при перетині пікселів. Наприклад, (([rast1] + [rast2])/2.0)::integer
pixeltypeТип пікселів вихідного растру. Повинен бути одним із типів, перелічених у ST_BandPixelType, пропущений або встановлений як NULL. Якщо не переданий або встановлений як NULL, за замовчуванням буде використовуватися тип пікселів першого растру.
extenttypeКонтролює розмір отриманого растру
INTERSECTION — розмір нового растра дорівнює перетину двох растрів. Це значення є типовим.
UNION - Розмір нового растра є об'єднанням двох растрів.
FIRST - Розмір нового растра такий самий, як і розмір першого растра.
SECOND - Розмір нового растра такий самий, як і розмір другого растра.
nodata1exprАлгебраїчний вираз, що містить тільки rast2 або константу, яка визначає, що повертати, коли пікселі rast1 є значеннями nodata, а просторово відповідні пікселі rast2 мають значення.
nodata2exprАлгебраїчний вираз, що містить тільки rast1 або константу, яка визначає, що повертати, коли пікселі rast2 є значеннями nodata, а просторово відповідні пікселі rast1 мають значення.
nodatanodatavalЧислова константа, яка повертається, коли просторово відповідні пікселі rast1 і rast2 мають значення nodata.
Ключові слова, дозволені в expression, nodata1expr та nodata2expr
[rast1] - Значення пікселя, що цікавить, з rast1
[rast1.val] - Значення пікселя, що цікавить, з rast1
[rast1.x] - стовпець пікселів з індексом 1, що представляє піксель, який цікавить, з rast1
[rast1.y] - ряд пікселів, що починається з 1, пікселів, що цікавлять, з rast1
[rast2] - Значення пікселя, що цікавить, з rast2
[rast2.val] - Значення пікселя, що цікавить, з rast2
[rast2.x] - стовпець пікселів з індексом 1, що представляє піксель, який нас цікавить, з rast2
[rast2.y] - ряд пікселів, що починається з 1, пікселя, що цікавить, з rast2
Variants 1 and 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;
Variant 3 and 4.
WITH foo AS (
SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI'::text, 100, 0) AS rast UNION ALL
SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI'::text, 300, 0) AS rast
)
SELECT
ST_MapAlgebra(
t1.rast,
2,
t2.rast,
1,
'([rast2] + [rast1.val]) / 2'
) AS rast
FROM foo t1
CROSS JOIN foo t2
WHERE t1.rid = 1
AND t2.rid = 2;
ST_MapAlgebraExpr — Версія з 1 растровим каналом: створює новий одноканальний растр, сформований шляхом застосування дійсної алгебраїчної операції PostgreSQL до вхідного растрового каналу та наданого типу пікселів. Якщо діапазон не вказано, передбачається діапазон 1.
raster ST_MapAlgebraExpr(raster rast, integer band, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebraExpr(raster rast, text pixeltype, text expression, double precision nodataval=NULL);
![]() | |
ST_MapAlgebraExpr є застарілим починаючи з версії 2.1.0. Замість нього використовуйте ST_MapAlgebra (expression version). |
Створює новий одноканальний растр, сформований шляхом застосування дійсної алгебраїчної операції PostgreSQL, визначеної виразом expression на вхідному растрі (rast). Якщо не вказано band, то вважається, що це канал 1. Новий растр матиме ті ж геореференцію, ширину та висоту, що й оригінальний растр, але матиме лише один канал.
Якщо передано pixeltype, то новий растр матиме канал цього типу пікселів. Якщо передано NULL, то новий канал растра матиме той самий тип пікселів, що й вхідний канал rast.
У виразі можна використовувати термін [rast] для посилання на значення пікселя оригінального каналу, [rast.x] для посилання на індекс стовпця пікселя з базою 1, [rast.y] для посилання на індекс рядка пікселя з базою 1.
Доступність: 2.0.0
Створіть новий одноканальний растр на основі нашого оригіналу, який є функцією модуля 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 з нашого оригіналу, який перекласифіковано, і встановіть значення 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 | 3SELECT
ST_BandPixelType(map_rast2) As b1pixtyp
FROM dummy_rast
WHERE rid = 2;2BUI
A self-contained source raster and the raster produced by classifying its values into four display levels.
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(8, 8, 0, 8, 1, -1, 0, 0, 0),
1, '8BUI', 0, 0
),
1, 1, 1,
ARRAY[
[0, 1, 2, 3, 4, 5, 6, 7],
[8, 9, 10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29, 30, 31],
[32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47],
[48, 49, 50, 51, 52, 53, 54, 55],
[56, 57, 58, 59, 60, 61, 62, 63]
]::double precision[][]
) AS rast
), variants AS (
SELECT 'source' AS title, rast AS rendered
FROM source
UNION ALL
SELECT
'classified',
ST_MapAlgebraExpr(rast, '8BUI', 'floor([rast] / 16) * 85')
FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;title | image ------------+------------------------- source | PNG image, 8 x 8 pixels classified | PNG image, 8 x 8 pixels
Map algebra altering the first band of a three-band raster.
![]() оригінал (стовпець rast_view) | ![]() rast_view_ma |
Створіть новий 3-канальний растр того ж типу пікселів, що і наш оригінальний 3-канальний растр, з першим каналом, зміненим за допомогою алгебри карт, і двома іншими каналами, що залишилися без змін.
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, ST_MapAlgebraFct, ST_BandPixelType, ST_GeoReference, ST_Value
ST_MapAlgebraExpr — 2-канальна версія растра: створює новий одноканальний растр, сформований шляхом застосування дійсної алгебраїчної операції PostgreSQL до двох вхідних растрових каналів та наданого типу пікселів. Якщо номери каналів не вказані, то за замовчуванням використовується канал 1 кожного растру. Результуючий растр буде вирівняний (масштаб, нахил і кути пікселів) на сітці, визначеній першим растром, а його розмір буде визначений параметром "extenttype". Значення для "extenttype" можуть бути: INTERSECTION, UNION, FIRST, SECOND.
raster ST_MapAlgebraExpr(raster rast1, raster rast2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
raster ST_MapAlgebraExpr(raster rast1, integer band1, raster rast2, integer band2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
![]() | |
ST_MapAlgebraExpr є застарілим починаючи з версії 2.1.0. Замість нього використовуйте ST_MapAlgebra (expression version). |
Створює новий одноканальний растр, сформований шляхом застосування дійсної алгебраїчної операції PostgreSQL до двох каналів, визначених виразом expression на двох вхідних растрових каналах rast1, (rast2). Якщо не вказано band1, band2, то вважається, що це канал 1. Отриманий растр буде вирівняний (масштаб, нахил і кути пікселів) на сітці, визначеній першим растром. Отриманий растр матиме розмір, визначений параметром extenttype.
expressionАлгебраїчний вираз PostgreSQL, що включає два растри та визначені функції/оператори PostgreSQL, які визначатимуть значення пікселя при перетині пікселів. Наприклад, (([rast1] + [rast2])/2.0)::integer
pixeltypeТип пікселів вихідного растру. Повинен бути одним із типів, перелічених у ST_BandPixelType, пропущений або встановлений як NULL. Якщо не переданий або встановлений як NULL, за замовчуванням буде використовуватися тип пікселів першого растру.
extenttypeКонтролює розмір отриманого растру
INTERSECTION — розмір нового растра дорівнює перетину двох растрів. Це значення є типовим.
UNION - Розмір нового растра є об'єднанням двох растрів.
FIRST - Розмір нового растра такий самий, як і розмір першого растра.
SECOND - Розмір нового растра такий самий, як і розмір другого растра.
nodata1exprАлгебраїчний вираз, що містить тільки rast2 або константу, яка визначає, що повертати, коли пікселі rast1 є значеннями nodata, а просторово відповідні пікселі rast2 мають значення.
nodata2exprАлгебраїчний вираз, що містить тільки rast1 або константу, яка визначає, що повертати, коли пікселі rast2 є значеннями nodata, а просторово відповідні пікселі rast1 мають значення.
nodatanodatavalЧислова константа, яка повертається, коли просторово відповідні пікселі rast1 і rast2 мають значення nodata.
Якщо передано pixeltype, то новий растр матиме канал цього типу пікселів. Якщо pixeltype передано NULL або тип пікселів не вказано, то новий канал растра матиме той самий тип пікселів, що й вхіднатй канал rast1.
Використовуйте термін [rast1.val] [rast2.val] для посилання на значення пікселів оригінальних растрових каналів і [rast1.x], [rast1.y] тощо для посилання на позиції стовпців/рядків пікселів.
Доступність: 2.0.0
2 Band Intersection and Union.
Створіть новий одноканальний растр на основі нашого оригіналу, який є функцією модуля 2 від каналу оригінального растра.
Create a cool set of rasters.
Insert some cool shapes around Boston in Massachusetts state plane meters, then map their intersection and union.
DROP TABLE IF EXISTS fun_shapes;
CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster);
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;
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
The same intersection and union operations using two deterministic, self-contained rasters.
WITH canvas AS (
SELECT ST_AddBand(
ST_MakeEmptyRaster(80, 80, 0, 80, 1, -1, 0, 0, 0),
1, '8BUI', 40, 0
) AS rast
), inputs AS (
SELECT
rast AS raster_1,
ST_AsRaster(
ST_Buffer(ST_Point(40, 40), 28),
rast,
'8BUI', 220, 0
) AS raster_2
FROM canvas
), variants AS (
SELECT 'raster 1' AS title, raster_1 AS rendered FROM inputs
UNION ALL
SELECT 'raster 2', raster_2 FROM inputs
UNION ALL
SELECT 'intersection', ST_MapAlgebraExpr(
raster_1, raster_2,
'[rast2.val]', '8BUI', 'INTERSECTION',
'[rast2.val]', '[rast1.val]'
) FROM inputs
UNION ALL
SELECT 'union', ST_MapAlgebraExpr(
raster_1, raster_2,
'[rast2.val]', '8BUI', 'UNION',
'[rast2.val]', '[rast1.val]'
) FROM inputs
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'raster 1' THEN 1
WHEN 'raster 2' THEN 2
WHEN 'intersection' THEN 3
ELSE 4
END;title | image --------------+--------------------------- raster 1 | PNG image, 80 x 80 pixels raster 2 | PNG image, 56 x 56 pixels intersection | PNG image, 56 x 56 pixels union | PNG image, 80 x 80 pixels
Overlaying rasters on a one-unit-per-pixel canvas as separate bands. 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,
ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10,
'join=bevel'
)
UNION ALL
SELECT 1,
ST_Buffer(
ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'),
5,
'join=bevel'
)
), 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
FROM mygeoms
) AS bounds
), 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]'
)
FROM mygeoms AS m
CROSS JOIN canvas
ORDER BY m.bnum
) AS rasts
)
SELECT title, ST_AsPNG(rendered) AS image
FROM rbands
CROSS JOIN LATERAL (VALUES
('band 1', rasts[1]),
('band 2', rasts[2]),
('band 3', rasts[3]),
('RGB', ST_AddBand(ST_AddBand(rasts[1], rasts[2]), rasts[3]))
) AS variants(title, rendered);title | image --------+----------------------------- band 1 | PNG image, 200 x 200 pixels band 2 | PNG image, 200 x 200 pixels band 3 | PNG image, 200 x 200 pixels RGB | PNG image, 200 x 200 pixels
Overlay a two-meter boundary of selected parcels over aerial imagery. The query first unions the parcel geometries, clips the source raster shards to the region, unions those smaller shards, and finally adds the first two bands plus a third-band map algebra overlay.
Create a new three-band raster composed of the first two clipped bands and the third band overlaid with the geometry. This query took 3.6 seconds on a 64-bit PostGIS Windows installation.
WITH pr AS (
SELECT ST_Clip(rast, ST_Expand(geom, 50)) AS rast, g.geom
FROM aerials.o_2_boston AS r
INNER JOIN (
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))
), 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
)
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;
Parcel-boundary overlay.
![]() The blue lines are the boundaries of selected parcels |
The generated four-panel canvas example above shows the same band-overlay technique without requiring an external aerial-imagery or parcel table.
ST_MapAlgebraFct — Версія з 1 каналом - Створює новий одноканальний растр, сформований шляхом застосування дійсної функції PostgreSQL до вхідного каналу растра та наданого типу пікселів. Якщо канал не вказаний, передбачається канал 1.
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
![]() | |
ST_MapAlgebraFct є застарілим з версії 2.1.0. Замість нього використовуйте ST_MapAlgebra (callback function version). |
Створює новий одноканальний растр, сформований шляхом застосування дійсної функції PostgreSQL, вказаної в onerasteruserfunc, до вхідного растра (rast). Якщо band не вказано, вважається, що це канал 1. Новий растр матиме ті ж геореференцію, ширину та висоту, що й оригінальний растр, але матиме лише один канал.
Якщо передано pixeltype, то новий растр матиме канал цього типу пікселів. Якщо передано NULL, то новий канал растра матиме той самий тип пікселів, що й вхідний канал rast.
Параметр onerasteruserfunc повинен бути ім'ям і сигнатурою функції SQL або PL/pgSQL, перетвореної в regprocedure. Дуже простий і досить марний приклад функції PL/pgSQL:
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[])
RETURNS FLOAT
AS $$ BEGIN
RETURN 0.0;
END; $$
LANGUAGE 'plpgsql' IMMUTABLE;Функція userfunction може приймати два або три аргументи: значення типу float, опціональний масив цілих чисел та масив тексту з змінною кількістю елементів. Перший аргумент — це значення окремої комірки растра (незалежно від типу даних растра). Другий аргумент — це позиція поточної оброблюваної комірки у вигляді "{x,y}". Третій аргумент вказує, що всі інші параметри для ST_MapAlgebraFct мають бути передані до userfunction.
Для передачі аргументу regprodedure до функції SQL необхідно передати повну сигнатуру функції, а потім перетворити її на тип regprocedure. Щоб передати вищезазначену функцію PL/pgSQL як аргумент, SQL для аргументу буде таким:
'simple_function(float,integer[],text[])'::regprocedure
Зверніть увагу, що аргумент містить ім'я функції, типи аргументів функції, лапки навколо імені та типів аргументів, а також приведення до типу regprocedure.
Третім аргументом для userfunction є масив variadic text. Усі кінцеві текстові аргументи для будь-якого виклику ST_MapAlgebraFct передаються до вказаної userfunction і містяться в аргументі args.
![]() | |
Для отримання додаткової інформації про ключове слово VARIADIC зверніться до документації PostgreSQL та розділу "Функції SQL із змінною кількістю аргументів" у Функції мови запитів (SQL). |
![]() | |
Аргумент text[] для |
Доступність: 2.0.0
Створіть новий одноканальний растр на основі нашого оригіналу, який є функцією модуля 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Створіть новий 1-канальний растр піксельного типу 2BUI з нашого оригіналу, який перекласифіковано, і встановіть значення 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 | 3SELECT ST_BandPixelType(map_rast2) As b1pixtyp FROM dummy_rast WHERE rid = 2;
b1pixtyp ---------- 2BUI
Створіть новий 3-канальний растр того ж типу пікселів, що і наш оригінальний 3-канальний растр, з першим каналом, зміненим за допомогою алгебри карт, і двома іншими каналами, що залишилися без змін.
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;
The deprecated callback form above is equivalent to a modern ST_MapAlgebra (callback function version) expression for simple per-pixel transforms. This build-time example renders the original raster and a modulo-2 classification.
WITH pixels AS (
SELECT x, y, (x + y * 2)::double precision AS value
FROM generate_series(1, 48) AS x
CROSS JOIN generate_series(1, 48) AS y
), rows AS (
SELECT y, array_agg(value ORDER BY x) AS values
FROM pixels
GROUP BY y
), source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(48, 48, 0, 48, 1, -1, 0, 0, 0),
1, '8BUI', 0, 0
),
1, 1, 1, array_agg(values ORDER BY y)::double precision[][]
) AS rast
FROM rows
), variants AS (
SELECT 'source' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'modulo 2', ST_MapAlgebra(
rast, 1,
'8BUI',
'mod([rast]::integer,2) * 255'
)
FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;title | image ----------+------------------------- source | PNG image, 48 x 48 pixels modulo 2 | PNG image, 48 x 48 pixels
ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue
ST_MapAlgebraFct — 2-канальна версія - Створює новий одноканальний растр, сформований шляхом застосування дійсної функції PostgreSQL до 2 вхідних каналів растра та наданого типу пікселів. Якщо канал не вказано, то за замовчуванням використовується канал 1. Тип розширення за замовчуванням - INTERSECTION, якщо не вказано інше.
raster ST_MapAlgebraFct(raster rast1, raster rast2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);
raster ST_MapAlgebraFct(raster rast1, integer band1, raster rast2, integer band2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);
![]() | |
ST_MapAlgebraFct є застарілим з версії 2.1.0. Замість нього використовуйте ST_MapAlgebra (callback function version). |
Створює новий одноканальний растр, сформований шляхом застосування дійсної функції PostgreSQL, вказаної в tworastuserfunc, до вхідного растру rast1, rast2. Якщо не вказано band1 або band2, то вважається, що це канал 1. Новий растр матиме ті ж геореференцію, ширину та висоту, що й оригінальні растри, але матиме лише однин канал.
Якщо передано pixeltype, то новий растр матиме канал цього типу пікселів. Якщо pixeltype передано NULL або пропущено, то новий канал растра матиме той самий тип пікселів, що і вхідний канал rast1.
Параметр tworastuserfunc повинен бути ім'ям і сигнатурою функції SQL або PL/pgSQL, перетвореною в regprocedure. Приклад функції PL/pgSQL:
CREATE OR REPLACE FUNCTION simple_function_for_two_rasters(pixel1 FLOAT, pixel2 FLOAT, pos INTEGER[], VARIADIC args TEXT[])
RETURNS FLOAT
AS $$ BEGIN
RETURN 0.0;
END; $$
LANGUAGE 'plpgsql' IMMUTABLE;tworastuserfunc може приймати три або чотири аргументи: значення подвійної точності, значення подвійної точності, опціональний масив цілих чисел та масив тексту змінної довжини. Перший аргумент — це значення окремої комірки растра в rast1 (незалежно від типу даних растра). Другий аргумент — це значення окремої комірки растра в rast2. Третій аргумент — це позиція поточної комірки обробки у формі "{x,y}". Четвертий аргумент вказує, що всі інші параметри ST_MapAlgebraFctмають бути передані до tworastuserfunc.
Для передачі аргументу regprodedure до функції SQL необхідно передати повну сигнатуру функції, а потім перетворити її на тип regprocedure. Щоб передати вищезазначену функцію PL/pgSQL як аргумент, SQL для аргументу буде таким:
'simple_function(double precision, double precision, integer[], text[])'::regprocedure
Зверніть увагу, що аргумент містить ім'я функції, типи аргументів функції, лапки навколо імені та типів аргументів, а також приведення до типу regprocedure.
Четвертий аргумент для tworastuserfunc є масивом variadic text. Усі кінцеві текстові аргументи до будь-якого виклику ST_MapAlgebraFct передаються до вказаного tworastuserfunc і містяться в аргументі userargs.
![]() | |
Для отримання додаткової інформації про ключове слово VARIADIC зверніться до документації PostgreSQL та розділу "Функції SQL із змінною кількістю аргументів" у Функції мови запитів (SQL). |
![]() | |
Аргумент text[] для |
Доступність: 2.0.0
The deprecated two-raster callback form can often be expressed with the modern two-raster ST_MapAlgebra (callback function version) expression variant. This build-time example renders two input rasters and their averaged overlap.
WITH canvas AS (
SELECT ST_AddBand(
ST_MakeEmptyRaster(80, 80, 0, 80, 1, -1, 0, 0, 0),
1, '8BUI', 0, 0
) AS rast
), inputs AS (
SELECT
ST_AsRaster(ST_Buffer(ST_Point(30, 40), 25), rast, '8BUI', 80, 0)
AS raster_1,
ST_AsRaster(ST_Buffer(ST_Point(50, 40), 25), rast, '8BUI', 220, 0)
AS raster_2
FROM canvas
), variants AS (
SELECT 'raster 1' AS title, raster_1 AS rendered FROM inputs
UNION ALL
SELECT 'raster 2', raster_2 FROM inputs
UNION ALL
SELECT 'averaged', ST_MapAlgebra(
raster_1, 1,
raster_2, 1,
'([rast1] + [rast2]) / 2',
'8BUI',
'UNION'
) FROM inputs
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;title | image ----------+------------------------- raster 2 | PNG image, 50 x 50 pixels raster 1 | PNG image, 50 x 50 pixels averaged | PNG image, 70 x 50 pixels
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;
Prepare a 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 the result 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;
A compact, executable callback example. The source rasters and their averaged overlap are rendered at build time.
CREATE OR REPLACE FUNCTION pg_temp.raster_average(
value_1 double precision,
value_2 double precision,
position integer[],
VARIADIC userargs text[]
) RETURNS double precision
LANGUAGE SQL IMMUTABLE
AS 'SELECT COALESCE(($1 + $2) / 2.0, $1, $2)';
WITH canvas AS (
SELECT ST_AddBand(
ST_MakeEmptyRaster(80, 80, 0, 80, 1, -1, 0, 0, 0),
1, '8BUI', 0, 0
) AS rast
), inputs AS (
SELECT
ST_AsRaster(ST_Buffer(ST_Point(30, 40), 25), rast, '8BUI', 80, 0)
AS raster_1,
ST_AsRaster(ST_Buffer(ST_Point(50, 40), 25), rast, '8BUI', 220, 0)
AS raster_2
FROM canvas
), variants AS (
SELECT 'raster 1' AS title, raster_1 AS rendered FROM inputs
UNION ALL
SELECT 'raster 2', raster_2 FROM inputs
UNION ALL
SELECT 'averaged', ST_MapAlgebraFct(
raster_1,
raster_2,
'pg_temp.raster_average(double precision,double precision,integer[],text[])'::regprocedure,
'8BUI',
'UNION'
) FROM inputs
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;title | image ----------+--------------------------- raster 2 | PNG image, 50 x 50 pixels raster 1 | PNG image, 50 x 50 pixels averaged | PNG image, 70 x 50 pixels
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)';
The generated callback figure above demonstrates the raster alignment and overlap used by this variant; the exact callback result remains available as text.
ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue
ST_MapAlgebraFctNgb — 1-канальна версія: Map Algebra Nearest Neighbor з використанням визначеної користувачем функції PostgreSQL. Повертає растр, значення якого є результатом функції користувача PLPGSQL, що включає сусідство значень із вхідної каналу растра.
raster ST_MapAlgebraFctNgb(raster rast, integer band, text pixeltype, integer ngbwidth, integer ngbheight, regprocedure onerastngbuserfunc, text nodatamode, text[] VARIADIC args);
![]() | |
ST_MapAlgebraFctNgb є застарілим з версії 2.1.0. Замість нього використовуйте ST_MapAlgebra (callback function version). |
(одно растрова версія) Повертає растр, значення якого є результатом функції користувача PLPGSQL, що включає сусідство значень з вхідного растрового каналу. Функція користувача приймає сусідство значень пікселів як масив чисел, для кожного пікселя повертає результат функції користувача, замінюючи значення пікселя, що перевіряється в даний момент, результатом функції.
rastРастр, на якому оцінюється функція користувача.
bandНомер каналу растра, що оцінюється. За замовчуванням — 1.
pixeltypeТип пікселів вихідного растру. Повинен бути вказаний у ST_BandPixelTypeабо пропущений, або встановлений як NULL. Якщо не вказаний або встановлений як NULL, за замовчуванням буде використовуватися тип пікселів rast. Результати обрізаються, якщо вони перевищують дозволений для типу пікселів розмір.
ngbwidthШирина оточення, в клітинках.
ngbheightВисота оточення, в клітинках.
onerastngbuserfuncКористувацька функція PLPGSQL/psql для застосування до сусідніх пікселів одного каналу растру. Перший елемент — це двовимірний масив чисел, що представляють прямокутне оточення пікселя
nodatamodeВизначає, яке значення передавати функції для сусідніх пікселів, які не містять даних або мають значення NULL
"ignore": будь-які значення NODATA, що зустрічаються в оточенні, ігноруються під час обчислення — цей прапор повинен бути надісланий до функції зворотного виклику користувача, і функція користувача вирішує, як його ігнорувати.
"NULL": будь-які значення NODATA, що зустрічаються в оточенні, призведуть до того, що результуючий піксель буде NULL — у цьому випадку функція зворотного виклику користувача пропускається.
"value": будь-які значення NODATA, що зустрічаються в оточенні, замінюються пікселем-посиланням (тим, що знаходиться в центрі оточення). Зверніть увагу, що якщо це значення є NODATA, поведінка буде такою ж, як і для "NULL" (для відповідного оточення)
argsАргументи, які передаються в користувацьку функцію.
Доступність: 2.0.0
Приклади використовують растр "katrina", завантажений як окремий фрагмент, описаний у https://gdal.org/user/drivers/raster/postgisraster.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;
Apply the raster averaging callback within two pixels of each input pixel in the X and Y directions.
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;
A self-contained neighborhood average. The source raster has a sharp central square, while the result spreads those values across neighboring pixels. The source uses a non-NODATA background so nodatamode ignore averages background values with the square values, instead of treating the background as absent.
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(16, 16, 0, 16, 1, -1, 0, 0, 0),
1, '8BUI', 25, NULL
),
1, 6, 6,
ARRAY[
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240]
]::double precision[][]
) AS rast
), variants AS (
SELECT 'source' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'averaged', ST_SetBandNoDataValue(ST_MapAlgebraFctNgb(
rast,
1,
'8BUI',
2,
2,
'ST_Mean4ma(float[][],text,text[])'::regprocedure,
'ignore',
NULL
), NULL) FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;title | image ----------+------------------------- source | PNG image, 16 x 16 pixels averaged | PNG image, 16 x 16 pixels
Neighborhood averaging.
![]() Перший канал нашого растра | ![]() Averaged result |
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);
Створює новий растр, сформований шляхом застосування операції перекласифікації, визначеної reclassexpr на вхідному растрі (rast). Опис виразів перекласифікації див. у reclassarg. Якщо band не вказано, вважається, що це смуга 1.
Новий растр матиме ті ж геореференцію, ширину та висоту, що й оригінальний растр. Канали нового растра мають тип пікселів pixeltype. Якщо вказано reclassargset, то кожен reclassarg визначає тип цільового каналу. Незазначені канали повертаються без змін.
Доступність: 2.0.0
Basic.
Створіть новий растр з оригіналу, де канал 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
Advanced using multiple reclassargs.
Створіть новий растр з оригіналу, де канали 1,2,3 перетворюються відповідно на 1BB,4BUI, 4BUI і перекласифікуються. Зверніть увагу, що тут використовується аргумент reclassarg з змінною кількістю параметрів, який може приймати як вхідні дані необмежену кількість reclassargs (теоретично стільки смуг, скільки у вас є)
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
Advanced Map a single band 32BF raster to multiple viewable bands.
Створити новий 3-канальний (8BUI, 8BUI, 8BUI видимий растр) з растра, який має тільки один канал 32bf
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_AddBand, ST_Band, ST_BandPixelType, ST_MakeEmptyRaster, reclassarg, ST_Value
ST_ReclassExact — Створює новий растр, що складається з каналів, перекласифікованих з оригінальних, використовуючи співвідношення 1:1 між значеннями в оригінальному каналі та новими значеннями в каналі призначення.
raster ST_ReclassExact(raster rast, double precision[] inputvalues, double precision[] outputvalues, integer bandnumber=1, text pixeltype=32BF, double precision nodatavalue=NULL);
Створює новий растр, сформований шляхом застосування операції перекласифікації, визначеної масивами inputvalues та outputvalues. Значення пікселів, знайдені у вхідному масиві, відображаються на відповідні значення у вихідному масиві. Усі інші значення пікселів відображаються на nodatavalue.
Тип вихідного пікселя за замовчуванням є float, але його можна вказати за допомогою параметра pixeltype. Якщо не вказано bandnumber, то вважається, що це канал 1.
Новий растр матиме ті ж геореференцію, ширину та висоту, що й оригінальний растр. Невизначені канали повертаються без змін.
Доступність: 3.6.0
Створіть невеликий растр і зіставте його пікселі з новими значеннями.
Create a raster with four pixels: first row 1 2, second row 3 4.
CREATE TABLE reclassexact (
id integer,
rast raster
);
INSERT INTO reclassexact (id, rast)
SELECT 1, ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(2, -- width in pixels
2, -- height in pixels
0, -- upper-left x-coordinate
0, -- upper-left y-coordinate
1, -- pixel size in x-direction
-1, -- pixel size in y-direction (negative for north-up)
0, -- skew in x-direction
0, -- skew in y-direction
4326 -- SRID (e.g., WGS 84)
),
'32BUI'::text, -- pixel type (e.g., '32BF' for float, '8BUI' for unsigned 8-bit int)
0.0, -- initial value for the band (e.g., 0.0 or a no-data value)
-99 -- nodatavalue
),
1, -- band number (usually 1 for single-band rasters)
1, -- x origin for setting values (usually 1)
1, -- y origin for setting values (usually 1)
ARRAY[
ARRAY[1, 2],
ARRAY[3, 4]
]::double precision[][] -- 2D array of values
);
Reclass the values to new values and dump the values of the new raster for display.
WITH rc AS (
SELECT ST_ReclassExact(rast, -- input raster
ARRAY[4, 3, 2, 1], -- input map
ARRAY[14, 13, 12, 11], -- output map
1, -- band number to remap
'32BUI' -- output raster pixel type
) AS rast
FROM reclassexact
WHERE id = 1
)
SELECT 'rce-1', (ST_DumpValues(rc.rast)).*
FROM rc;
ST_Union — Повертає об'єднання набору растрових плиток в один растр, що складається з 1 або більше каналів.
raster ST_Union(setof raster rast);
raster ST_Union(setof raster rast, unionarg[] unionargset);
raster ST_Union(setof raster rast, integer nband);
raster ST_Union(setof raster rast, text uniontype);
raster ST_Union(setof raster rast, integer nband, text uniontype);
Повертає об'єднання набору растрових плиток в один растр, що складається з принаймні одного каналу. Розмір отриманого растру дорівнює розміру всього набору. У разі перетину отримане значення визначається uniontype, яке може бути одним із таких: LAST (за замовчуванням), FIRST, MIN, MAX, COUNT, SUM, MEAN, RANGE.
![]() | |
Щоб растри могли бути об'єднані, вони повинні мати однакове вирівнювання. Для отримання додаткової інформації та допомоги використовуйте ST_SameAlignment та ST_NotSameAlignmentReason. Одним із способів виправлення проблем з вирівнюванням є використання ST_Resample та використання одного і того ж еталонного растру для вирівнювання. |
Доступність: 2.0.0
Покращено: 2.1.0 Покращена швидкість (повністю на базі C).
Доступність: 2.1.0 Введено варіант ST_Union(rast, unionarg).
Покращено: 2.1.0 ST_Union(rast) (варіант 1) об'єднує всі канали всіх вхідних растрів. Попередні версії PostGIS використовували першу канал.
Покращено: 2.1.0 ST_Union(rast, uniontype) (варіант 4) об'єднує всі канали всіх вхідних растрів.
Reconstitute a single band chunked raster tile.
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;
Return a multi-band raster that is the union of tiles intersecting geometry.
This creates a multi band raster collecting all the tiles that intersect a line. Note that 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) );
Select and reorder bands while unioning tiles that intersect a geometry.
Тут ми використовуємо довший синтаксис, якщо нам потрібна лише частина каналів або ми хочемо змінити порядок каналів
This creates a multi band raster collecting all the tiles that intersect a line.
SELECT ST_Union(rast, ARRAY[ROW(2, 'LAST'), ROW(1, 'LAST'), ROW(3, 'LAST')]::unionarg[])
FROM aerials.boston
WHERE ST_Intersects(rast, ST_GeomFromText('LINESTRING(230486 887771,230500 88772)', 26986) );
ST_Distinct4ma — Функція обробки растру, яка обчислює кількість унікальних значень у сусідніх пікселях.
float8 ST_Distinct4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
double precision ST_Distinct4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Обчисліть кількість унікальних значень пікселів у сусідніх пікселях.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
SELECT
rid,
ST_Value(ST_MapAlgebraFctNgb(rast, 1, NULL, 1, 1, 'ST_Distinct4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2
)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+---------- 2 | 3 (1 row)
ST_InvDistWeight4ma — Функція растрової обробки, яка інтерполює значення пікселя з сусідніх пікселів.
double precision ST_InvDistWeight4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Обчисліть інтерпольоване значення для пікселя за допомогою методу зваженого оберненого відстані.
Існує два опціональних параметри, які можна передати через userargs. Перший параметр — це коефіцієнт потужності (змінна k у наведеному нижче рівнянні) від 0 до 1, який використовується в рівнянні зваженої оберненої відстані. Якщо не вказано, значення за замовчуванням дорівнює 1. Другий параметр — це відсоток ваги, який застосовується тільки тоді, коли значення пікселя, що цікавить, включено до інтерпольованого значення з сусідства. Якщо не вказано, а піксель, що цікавить, має значення, то це значення повертається.
The basic inverse-distance weighted estimate is:
Here zᵢ is a neighboring pixel value, dᵢ is its distance from the pixel being estimated, and k is a real-valued power factor between 0 and 1.
![]() | |
Ця функція є спеціалізованою функцією зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
Доступність: 2.1.0
WITH foo AS (
SELECT ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', NULL::double precision, -9999),
1, 1, 1, ARRAY[
[10, 10, 10],
[10, NULL, 20],
[20, 20, 20]
]::double precision[][]
) AS rast
)
SELECT ST_Value(
ST_MapAlgebra(
rast,
1,
'ST_InvDistWeight4ma(double precision[][][],integer[][],text[])'::regprocedure,
'32BF',
'FIRST',
NULL,
1,
1
),
2, 2
) AS interpolated_value
FROM foo;15
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 заміну значення для пікселів NODATA можна вказати, передавши це значення в userargs.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
SELECT
rid,
ST_Value(ST_MapAlgebraFctNgb(rast, 1, NULL, 1, 1, 'ST_Max4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2
)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+---------- 2 | 254 (1 row)
ST_Mean4ma — Функція обробки растру, яка обчислює середнє значення пікселя в оточенні.
float8 ST_Mean4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
double precision ST_Mean4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Обчислити середнє значення пікселя в оточенні пікселів.
Для варіанту 2 заміну значення для пікселів NODATA можна вказати, передавши це значення в userargs.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
Variant 1.
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)
Variant 2.
SELECT
rid,
ST_Value(
ST_MapAlgebra(rast, 1, 'ST_Mean4ma(double precision[][][], integer[][], text[])'::regprocedure, '32BF', 'FIRST', NULL, 1, 1),
2,
2)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+------------------ 2 | 253.222229003906 (1 row)
ST_Min4ma — Функція обробки растру, яка обчислює мінімальне значення пікселя в оточенні.
float8 ST_Min4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
double precision ST_Min4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Обчисліть мінімальне значення пікселя в оточенні пікселів.
Для варіанту 2 заміну значення для пікселів NODATA можна вказати, передавши це значення в userargs.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
SELECT
rid,
ST_Value(ST_MapAlgebraFctNgb(rast, 1, NULL, 1, 1, 'ST_Min4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2
)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+---------- 2 | 250 (1 row)
ST_MinDist4ma — Функція обробки растру, яка повертає мінімальну відстань (у пікселях) між пікселем, що цікавить, та сусіднім пікселем із значенням.
double precision ST_MinDist4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Повернути найкоротшу відстань (у пікселях) між пікселем, що цікавить, і найближчим пікселем із значенням у його околиці.
![]() | |
Мета цієї функції — надати інформативний пункт даних, який допомагає зробити висновок про корисність інтерпольованого значення пікселя, що цікавить, з ST_InvDistWeight4ma. Ця функція особливо корисна, коли оточення є малонаселеним. |
![]() | |
Ця функція є спеціалізованою функцією зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
Доступність: 2.1.0
WITH foo AS (
SELECT ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(3, 3, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', NULL::double precision, -9999),
1, 1, 1, ARRAY[
[10, 10, 10],
[10, NULL, 20],
[20, 20, 20]
]::double precision[][]
) AS rast
)
SELECT ST_Value(
ST_MapAlgebra(
rast,
1,
'ST_MinDist4ma(double precision[][][],integer[][],text[])'::regprocedure,
'32BF',
'FIRST',
NULL,
1,
1
),
2, 2
) AS min_distance
FROM foo;1
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 заміну значення для пікселів NODATA можна вказати, передавши це значення в userargs.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
SELECT
rid,
ST_Value(ST_MapAlgebraFctNgb(rast, 1, NULL, 1, 1, 'ST_Range4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2
)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+---------- 2 | 4 (1 row)
ST_StdDev4ma — Функція обробки растра, яка обчислює стандартне відхилення значень сусідніх пікселів.
float8 ST_StdDev4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
double precision ST_StdDev4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Обчисліть стандартне відхилення значень пікселів у сусідніх пікселях.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
SELECT
rid,
ST_Value(ST_MapAlgebraFctNgb(rast, 1, '32BF', 1, 1, 'ST_StdDev4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2
)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+------------------ 2 | 1.30170822143555 (1 row)
ST_Sum4ma — Функція обробки растру, яка обчислює суму всіх значень сусідніх пікселів.
float8 ST_Sum4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
double precision ST_Sum4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);
Обчисліть суму всіх значень пікселів у сусідніх пікселях.
Для варіанту 2 заміну значення для пікселів NODATA можна вказати, передавши це значення в userargs.
![]() | |
Варіант 1 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebraFctNgb. |
![]() | |
Варіант 2 — це спеціалізована функція зворотного виклику для використання як параметр зворотного виклику до ST_MapAlgebra (callback function version). |
![]() | |
Не рекомендується використовувати варіант 1, оскільки ST_MapAlgebraFctNgbбув визнаний застарілим у версії 2.1.0. |
Доступність: 2.0.0
Покращено: 2.1.0 Додано варіант 2
SELECT
rid,
ST_Value(ST_MapAlgebraFctNgb(rast, 1, '32BF', 1, 1, 'ST_Sum4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2
)
FROM dummy_rast
WHERE rid = 2;rid | st_value -----+---------- 2 | 2279 (1 row)
ST_Aspect — Повертає аспект (за замовчуванням у градусах) растрового каналу висоти. Корисно для аналізу рельєфу місцевості.
raster ST_Aspect(raster rast, integer band=1, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE);
raster ST_Aspect(raster rast, integer band, raster customextent, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE);
Повертає аспект (за замовчуванням у градусах) каналу растрового зображення висоти. Використовує алгебру карт і застосовує рівняння аспекту до сусідніх пікселів.
units вказує одиниці виміру аспекту. Можливі значення: RADIANS, DEGREES (за замовчуванням).
Коли units = RADIANS, значення знаходяться в діапазоні від 0 до 2 * pi радіан, виміряних за годинниковою стрілкою від півночі.
Коли units = DEGREES, значення знаходяться в діапазоні від 0 до 360 градусів, виміряних за годинниковою стрілкою від півночі.
Якщо поворот пікселя дорівнює нулю, аспект пікселя дорівнює -1.
![]() | |
Для отримання додаткової інформації про поворот, експозицію та тіньове затінення див. ESRI - Як працює тіньове затінення та Польовий посібник ERDAS - Зображення аспектів. |
Доступність: 2.0.0
Покращено: 2.1.0 Використовує ST_MapAlgebra() та додано опціональний параметр функції interpolate_nodata
Змінено: 2.1.0 У попередніх версіях значення повороту були в радіанах. Тепер значення повороту за замовчуванням в градусах
Variant 1.
This symmetric peak highlights the expected compass directions at the corners and the -1 aspect at the summit. The generated PNG shows the full aspect surface without relying on a manual illustration. The generated source raster is large enough for the PNG to show the directional field around the summit.
WITH pixels AS (
SELECT
x,
y,
(20 - greatest(abs(x - 9), abs(y - 9)))::double precision AS value
FROM generate_series(1, 17) AS y
CROSS JOIN generate_series(1, 17) AS x
), rows AS (
SELECT
y,
array_agg(value ORDER BY x) AS row_values
FROM pixels
GROUP BY y
), source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(17, 17, 0, 0, 1, -1, 0, 0, 0),
1, '32BF', 0, -9999
),
1, 1, 1,
array_agg(row_values ORDER BY y)::double precision[][]
) AS rast
FROM rows
), aspect AS (
SELECT ST_Aspect(rast, 1, '32BF') AS rast
FROM source
)
SELECT
round(ST_Value(rast, 1, 1, 1)::numeric, 3) AS northwest_degrees,
round(ST_Value(rast, 1, 9, 9)::numeric, 3) AS summit_degrees,
round(ST_Value(rast, 1, 17, 17)::numeric, 3) AS southeast_degrees,
ST_AsPNG(ST_ColorMap(rast, 1, 'bluered')) AS image
FROM aspect;northwest_degrees | summit_degrees | southeast_degrees | image
-------------------+----------------+-------------------+------------------------
315.000 | -1.000 | 135.000 | PNG image, 17 x 17 pixelsVariant 2.
Повний приклад плиток покриття.
WITH foo AS (
SELECT ST_Tile(ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0),
1, '32BF', 0, -9999
),
1, 1, 1, ARRAY[
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 2, 1],
[1, 2, 2, 3, 3, 1],
[1, 1, 3, 2, 1, 1],
[1, 2, 2, 1, 2, 1],
[1, 1, 1, 1, 1, 1]
]::double precision[]
),
2, 2
) AS rast
)
SELECT
t1.rast,
ST_Aspect(ST_Union(t2.rast), 1, t1.rast)
FROM foo t1
CROSS JOIN foo t2
WHERE ST_Intersects(t1.rast, t2.rast)
GROUP BY t1.rast;
ST_HillShade — Повертає гіпотетичне освітлення растрового каналу висоти за допомогою введених значень азимута, висоти, яскравості та масштабу.
raster ST_HillShade(raster rast, integer band=1, text pixeltype=32BF, double precision azimuth=315, double precision altitude=45, double precision max_bright=255, double precision scale=1.0, boolean interpolate_nodata=FALSE);
raster ST_HillShade(raster rast, integer band, raster customextent, text pixeltype=32BF, double precision azimuth=315, double precision altitude=45, double precision max_bright=255, double precision scale=1.0, boolean interpolate_nodata=FALSE);
Повертає гіпотетичне освітлення растрового каналу висоти за допомогою вхідних даних азимута, висоти, яскравості та масштабу. Використовує алгебру карт і застосовує рівняння затінення пагорбів до сусідніх пікселів. Значення пікселів, що повертаються, знаходяться в діапазоні від 0 до 255.
azimuth — це значення від 0 до 360 градусів, виміряне за годинниковою стрілкою від півночі.
altitude — це значення від 0 до 90 градусів, де 0 градусів відповідає горизонту, а 90 градусів — прямо над головою.
max_bright — це значення від 0 до 255, де 0 означає відсутність яскравості, а 255 — максимальну яскравість.
scale — це співвідношення вертикальних одиниць до горизонтальних. Для Feet:LatLon використовуйте scale=370400, для Meters:LatLon використовуйте scale=111120.
Якщо interpolate_nodata має значення TRUE, значення пікселів NODATA з вхідного растру будуть інтерпольовані за допомогою ST_InvDistWeight4maперед обчисленням освітлення тіньового рельєфу.
![]() | |
Для отримання додаткової інформації про Hillshade, будь ласка, зверніться до Як працює hillshade. |
Доступність: 2.0.0
Покращено: 2.1.0 Використовує ST_MapAlgebra() та додано опціональний параметр функції interpolate_nodata
Змінено: 2.1.0 У попередніх версіях азимут і висота виражалися в радіанах. Тепер азимут і висота виражаються в градусах
Variant 1.
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)Variant 2.
Повний приклад плиток покриття.
WITH foo AS (
SELECT ST_Tile(ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0),
1, '32BF', 0, -9999
),
1, 1, 1, ARRAY[
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 2, 1],
[1, 2, 2, 3, 3, 1],
[1, 1, 3, 2, 1, 1],
[1, 2, 2, 1, 2, 1],
[1, 1, 1, 1, 1, 1]
]::double precision[]
),
2, 2
) AS rast
)
SELECT
t1.rast,
ST_HillShade(ST_Union(t2.rast), 1, t1.rast)
FROM foo t1
CROSS JOIN foo t2
WHERE ST_Intersects(t1.rast, t2.rast)
GROUP BY t1.rast;
ST_Roughness — Повертає растр з обчисленою "шорсткістю" цифрової моделі рельєфу (DEM).
raster ST_Roughness(raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE );
Обчислює "шорсткість" цифрової моделі рельєфу (DEM), віднімаючи максимальне значення від мінімального для заданої області.
Доступність: 2.1.0
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, 2, 3, 3],
[1, 2, 4, 15, 3],
[2, 4, 10, 7, 5],
[3, 5, 7, 6, 4],
[3, 3, 5, 4, 4]
]::double precision[][]
) AS rast
)
SELECT ST_Value(ST_Roughness(rast, 1, '32BF'), 3, 3) AS roughness
FROM foo;13
ST_Slope — Повертає нахил (за замовчуванням у градусах) растрового діапазону висот. Корисно для аналізу рельєфу місцевості.
raster ST_Slope(raster rast, integer nband=1, text pixeltype=32BF, text units=DEGREES, double precision scale=1.0, boolean interpolate_nodata=FALSE);
raster ST_Slope(raster rast, integer nband, raster customextent, text pixeltype=32BF, text units=DEGREES, double precision scale=1.0, boolean interpolate_nodata=FALSE);
Повертає нахил (за замовчуванням у градусах) растрового діапазону висот. Використовує алгебру карт і застосовує рівняння нахилу до сусідніх пікселів.
units вказує одиниці виміру нахилу. Можливі значення: RADIANS, DEGREES (за замовчуванням), PERCENT.
scale — це співвідношення вертикальних одиниць до горизонтальних. Для Feet:LatLon використовуйте scale=370400, для Meters:LatLon використовуйте scale=111120.
Якщо interpolate_nodata має значення TRUE, значення пікселів NODATA з вхідного растру будуть інтерпольовані за допомогою ST_InvDistWeight4maперед обчисленням нахилу поверхні.
![]() | |
Для отримання додаткової інформації про нахил, експозицію та тіньове затінення див. ESRI - Як працює тіньове затінення та Польовий посібник ERDAS - Зображення схилів. |
Доступність: 2.0.0
Покращено: 2.1.0 Використовує ST_MapAlgebra() та додано опціональні параметри функції units, scale, interpolate_nodata
Змінено: 2.1.0 У попередніх версіях значення повороту були в радіанах. Тепер значення повороту за замовчуванням в градусах
Variant 1.
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)Variant 2.
Повний приклад плиток покриття.
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 );
Обчислює індекс топографічного положення, який визначається як фокальне середнє значення з радіусом, що дорівнює одиниці мінус центральна комірка.
![]() | |
Ця функція підтримує тільки фокальний середній радіус, рівний одиниці. |
Доступність: 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, 2, 3, 3],
[1, 2, 4, 15, 3],
[2, 4, 10, 7, 5],
[3, 5, 7, 6, 4],
[3, 3, 5, 4, 4]
]::double precision[][]
) AS rast
)
SELECT ST_Value(ST_TPI(rast, 1, '32BF'), 3, 3) AS tpi
FROM foo;3.75
ST_TRI — Повертає растр з обчисленим індексом нерівності рельєфу.
raster ST_TRI(raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE );
Індекс нерівності рельєфу розраховується шляхом порівняння центрального пікселя з сусідніми, вирахування абсолютних значень різниць і усереднення результату.
![]() | |
Ця функція підтримує тільки фокальний середній радіус, рівний одиниці. |
Доступність: 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, 2, 3, 3],
[1, 2, 4, 15, 3],
[2, 4, 10, 7, 5],
[3, 5, 7, 6, 4],
[3, 3, 5, 4, 4]
]::double precision[][]
) AS rast
)
SELECT ST_Value(ST_TRI(rast, 1, '32BF'), 3, 3) AS tri
FROM foo;5
ST_InterpolateRaster — Інтерполює поверхню сітки на основі вхідного набору 3-D точок, використовуючи значення X і Y для позиціонування точок на сітці, а значення Z точок — як висоту поверхні.
raster ST_InterpolateRaster(geometry input_points, text algorithm_options, raster template, integer template_band_num=1);
Інтерполює поверхню сітки на основі вхідного набору 3-вимірних точок, використовуючи значення X і Y для позиціонування точок на сітці, а значення Z точок — як висоту поверхні. Доступно п'ять алгоритмів інтерполяції: обернена відстань, обернена відстань найближчого сусіда, ковзна середня, найближчий сусід і лінійна інтерполяція. Більш детальну інформацію про алгоритми та їхні параметри див. у документації gdal_grid. Більше інформації про те, як обчислюються інтерполяції, див. посібник з роботи з сіткою GDAL.
Вхідні параметри:
input_pointsТочки для інтерполяції. Прийнятна будь-яка геометрія із значеннями Z, будуть використані всі точки у вхідних даних.
algorithm_optionsРядок, що визначає алгоритм та параметри алгоритму, у форматі, який використовується gdal_grid. Наприклад, для інтерполяції з оберненою відстанню та згладжуванням 2 слід використовувати "invdist:smoothing=2.0"
templateРастровий шаблон для управління геометрією вихідного растра. Ширина, висота, розмір пікселя, просторова протяжність і тип пікселя будуть зчитуватися з цього шаблону.
template_band_numЗа замовчуванням для керування вихідним растром використовується перший канал у шаблоні растра, але це можна налаштувати за допомогою цього параметра.
Доступність: 3.2.0
SELECT ST_InterpolateRaster('MULTIPOINT(10.5 9.5 1000,11.5 8.5 1000,10.5 8.5 500,11.5 9.5 500)'::geometry,
'invdist:smoothing:2.0',
ST_AddBand(ST_MakeEmptyRaster(200, 400, 10, 10, 0.01, -0.005, 0, 0), '16BSI')
)ST_Contour — Генерує набір векторних контурів із наданого растрового каналу, використовуючи алгоритм контурного відображення GDAL.
setof record ST_Contour(raster rast, integer bandnumber=1, double precision level_interval=100.0, double precision level_base=0.0, double precision[] fixed_levels=ARRAY[], boolean polygonize=false);
Генерує набір векторних контурів із наданого растрового rfyfke, використовуючи алгоритму контурного відображення GDAL.
Коли параметр fixed_levels є не порожнім масивом, параметри level_interval та level_base ігноруються.
Вхідні параметри:
rastРастр для створення контуру
bandnumberСмуга для формування контуру
level_intervalІнтервал висоти між створеними контурами
level_base"База", відносно якої застосовуються інтервали контурів, зазвичай дорівнює нулю, але може бути іншою. Щоб створити 10-метрові контури на 5, 15, 25, ... LEVEL_BASE дорівнюватиме 5.
fixed_levelsІнтервал висоти між створеними контурами
polygonizeЯкщо true, будуть створені контурні полігони, а не полігональні лінії.
Значення, що повертаються, — це набір записів із такими атрибутами:
geomГеометрія контурної лінії.
idУнікальний ідентифікатор, присвоєний контурній лінії GDAL.
valueРастрове значення, яке представляє лінія. Для вхідних даних DEM висоти це буде висота вихідного контуру.
Доступність: 3.2.0
WITH c AS ( SELECT (ST_Contour(rast, 1, fixed_levels => ARRAY[100.0, 200.0, 300.0])).* FROM dem_grid WHERE rid = 1 ) SELECT geom, id, value FROM c;
Box3D — Повертає 3D-представлення обмежувальної рамки растра.
box3d Box3D(raster rast);
Повертає поле, що представляє розмір растру.
Багатокутник визначається кутовими точками обмежувального прямокутника ((MINX, MINY), (MAXX, MAXY))
Змінено: 2.0.0 У версіях до 2.0 замість box3d використовувався box2d. Оскільки box2d є застарілим типом, його було змінено на box3d.
SELECT
rid,
Box3D(rast) AS rastbox
FROM dummy_rast;rid | rastbox ----+------------------------------------------------- 1 | BOX3D(0.5 0.5 0,20.5 60.5 0) 2 | BOX3D(3427927.75 5793243.5 0,3427928 5793244 0)
ST_ConvexHull — Повертає геометрію опуклої оболонки растра, включаючи значення пікселів, рівні BandNoDataValue. Для растрів правильної форми та без нахилу це дає той самий результат, що й ST_Envelope, тому корисно лише для растрів неправильної форми або з нахилом.
geometry ST_ConvexHull(raster rast);
Повертає геометрію опуклої оболонки растра, включаючи пікселі каналу NoDataBandValue. Для растрів правильної форми та без нахилу це дає приблизно той самий результат, що й ST_Envelope, тому корисно лише для растрів неправильної форми або з нахилом.
![]() | |
ST_Envelope округлює координати і, отже, додає невеликий буфер навколо растра, тому результат дещо відрізняється від ST_ConvexHull, який не округлює. |
See doc/development/internals/raster-affine.md for the scale, skew, and rotation terms that make the convex hull and envelope differ for skewed rasters.
For regular non-skewed rasters, the envelope and convex hull are more or less the same.
SELECT ST_ConvexHull(rast) As convhull, 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_ConvexHull(rast) As convhull, ST_Envelope(rast) As env
FROM (SELECT ST_SetRotation(rast, 0.1, 0.1) As rast
FROM dummy_rast WHERE rid=1) As foo;convhull | env --------------------------------------------------------+------------------------------------ POLYGON((0.5 0.5,20.5 1.5,22.5 61.5,2.5 60.5,0.5 0.5)) | POLYGON((0 0,22 0,22 61,0 61,0 0))
ST_DumpAsPolygons — Повертає набір рядків geomval (geom,val) із заданого растрового каналу. Якщо номер каналу не вказано, за замовчуванням використовується канал 1.
setof geomval ST_DumpAsPolygons(raster rast, integer band_num=1, boolean exclude_nodata_value=TRUE);
Це функція, що повертає набір (SRF). Вона повертає набір рядків geomval, сформованих геометрією (geom) та значенням піксельів каналу (val). Кожен багатокутник є об'єднанням усіх пікселів для ціього каналу, які мають однакове значення пікселя, позначене val.
ST_DumpAsPolygon корисний для полігонізації растрів. Він є зворотним до GROUP BY, оскільки створює нові рядки. Наприклад, його можна використовувати для розширення одного растра на кілька POLYGONS/MULTIPOLYGONS.
Змінено 3.3.0, перевірка та виправлення вимкнені для покращення продуктивності. Може призвести до недійсних геометрій.
Змінено 3.7.0, полігонізація враховує переривання PostgreSQL, тому скасування та тайм-аути операторів негайно зупиняють обробку.
Доступність: Потрібна версія GDAL 1.7 або вище.
![]() | |
Якщо для діапазону не встановлено значення даних, пікселі з цим значенням не будуть повертатися, за винятком випадків, коли exclude_nodata_value=false. |
![]() | |
Якщо вас цікавить лише кількість пікселів із заданим значенням у растрі, швидше буде використати ST_ValueCount. |
![]() | |
Це відрізняється від ST_PixelAsPolygons, де для кожного пікселя повертається одна геометрія, незалежно від значення пікселя. |
This syntax uses a LATERAL join.
SELECT val,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))geomval, ST_AsRasterAgg, ST_Value, ST_Polygon, ST_ValueCount
ST_Envelope — Повертає полігон, що відображає межі растру.
geometry ST_Envelope(raster rast);
Повертає полігональне представлення меж растра в одиницях просторових координат, визначених srid. Це мінімальна обмежувальна рамка float8, представлена у вигляді полігону.
Полігон визначається кутовими точками обмежувальної рамки ((MINX, MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY), (MINX, MINY))
SELECT rid, ST_Envelope(rast) As envgeomwkt FROM dummy_rast;
rid | envgeomwkt
-----+--------------------------------------------------------------------
1 | POLYGON((0 0,20 0,20 60,0 60,0 0))
2 | POLYGON((3427927 5793243,3427928 5793243,
3427928 5793244,3427927 5793244, 3427927 5793243))ST_MinConvexHull — Повернути геометрію опуклої оболонки растра, виключаючи пікселі NODATA.
geometry ST_MinConvexHull(raster rast, integer nband=NULL);
Повертає геометрію опуклої оболонки растра, виключаючи пікселі NODATA. Якщо nband дорівнює NULL, враховуються всі канали растра.
Доступність: 2.1.0
WITH foo AS (
SELECT
ST_SetValues(ST_SetValues(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(9, 9, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0), 2, '8BUI', 1, 0),
1, 1, 1,
ARRAY[
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]
]::double precision[][]
),
2, 1, 1,
ARRAY[
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0]
]::double precision[][]
) AS rast
)
SELECT title, geom AS geom
FROM foo
CROSS JOIN LATERAL (VALUES
('raster hull', ST_ConvexHull(rast)),
('all bands', ST_MinConvexHull(rast)),
('band 1', ST_MinConvexHull(rast, 1)),
('band 2', ST_MinConvexHull(rast, 2))
) AS variants(title, geom);title | geom -------------+--------------------------------------- raster hull | POLYGON((0 0,9 0,9 -9,0 -9,0 0)) all bands | POLYGON((0 -3,9 -3,9 -9,0 -9,0 -3)) band 1 | POLYGON((3 -3,9 -3,9 -6,3 -6,3 -3)) band 2 | 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 У попередніх версіях іноді повертався полігон, змінено на завжди повертати мультиполігон.
Compare polygonization of every pixel with polygonization after zero is assigned as the NODATA value. The latter preserves the gap formed by zero-valued cells.
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(4, 4, 0, 4, 1, -1, 0, 0, 0),
1, '8BUI', 1, NULL
),
1, 1, 1,
ARRAY[
[1, 1, 1, 1],
[1, 0, 0, 1],
[1, 1, 0, 1],
[1, 1, 1, 1]
]::double precision[][]
) AS rast
), variants AS (
SELECT 'all pixels' AS title, ST_Polygon(rast) AS geom
FROM source
UNION ALL
SELECT
'zero excluded',
ST_Polygon(ST_SetBandNoDataValue(rast, 1, 0))
FROM source
)
SELECT title, geom AS geom
FROM variants
ORDER BY CASE title
WHEN 'all pixels' THEN 1
ELSE 2
END;title | geom ---------------+---------------------------------------------------------------------- all pixels | MULTIPOLYGON(((0 4,4 4,4 0,0 0,0 4))) zero excluded | MULTIPOLYGON(((0 4,0 0,4 0,4 4,0 4),(1 3,3 3,3 1,2 1,2 2,1 2,1 3))) (2 rows)
ST_IntersectionFractions — Обчислює частку кожної растрової комірки, яка покрита заданою геометрією.
raster ST_IntersectionFractions(raster rast, geometry geom);
Обчислює частку кожної растрової комірки, яка покрита заданою геометрією. Перший аргумент — це растр, який визначає геометрію сітки, що використовується для обчислення. Розмір і розмір комірки зчитуються з параметра растра. Другий аргумент — це геометрія, яка накладається на сітку, і кожна комірка заповнюється на основі накладення геометрії на сітку. Для полігонів значення, що повертається для кожної комірки, є часткою її площі, яка покрита геометрією. Для лінійних об'єктів значення, що повертається для кожної комірки, є довжиною, що міститься в комірці.
Доступність: 3.6.0 Вимагає GEOS 3.14 або вище.
This rotated square polygon covers half of each cell in the raster.
CREATE TABLE raster_proportions_rast (
name text,
rast raster
);
INSERT INTO raster_proportions_rast (name, rast) VALUES (
'2x2 raster covering 0,0 to 10,10',
ST_MakeEmptyRaster(2, 2, -- raster width/height in pixels
0, 10, -- upper-left corner x/y coordinates
5, -5, -- pixel width/height in ground units
0, 0, -- skew x/y
0 -- SRID
));
SELECT name, ST_DumpValues(
ST_IntersectionFractions(
rast,
'POLYGON((5 0,0 5,5 10,10 5,5 0))'::geometry),
1)
FROM raster_proportions_rast;2x2 raster covering 0,0 to 10,10
---------------------------------
{{0.5,0.5},{0.5,0.5}}TRUE, якщо обмежувальна рамка A перетинається з обмежувальною рамкою B.TRUE, якщо обмежувальна рамка A знаходиться ліворуч від B.TRUE, якщо обмежувальна рамка A знаходиться праворуч від обмежувальної рамки B.TRUE, якщо обмежувальна рамка A збігається з обмежувальною рамкою B. Використовує обмежувальну рамку подвійної точності.TRUE, якщо обмежувальна рамка A міститься в обмежувальній рамці B. Використовує обмежувальну рамку подвійної точності.TRUE, якщо обмежувальна рамка A збігається з обмежувальною рамкою B.TRUE, якщо обмежувальна рамка A містить B. Використовує обмежувальну рамку подвійної точності.&& — Повертає TRUE, якщо обмежувальна рамка A перетинається з обмежувальною рамкою B.
boolean &&( raster A , raster B );
boolean &&( raster A , geometry B );
boolean &&( geometry B , raster A );
Оператор && повертає TRUE, якщо обмежувальна рамка растра/геометрії A перетинає обмежувальну рамку растра/геометрії B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
Доступність: 2.0.0
SELECT A.rid As a_rid, B.rid As b_rid, A.rast && B.rast As intersect FROM dummy_rast AS A CROSS JOIN dummy_rast AS B LIMIT 3;
a_rid | b_rid | intersect
-------+-------+---------
2 | 2 | t
2 | 3 | f
2 | 1 | f&< — Повертає TRUE, якщо обмежувальна рамка A знаходиться ліворуч від B.
boolean &<( raster A , raster B );
Оператор &< повертає TRUE, якщо обмежувальна рамка растру A перекриває або знаходиться ліворуч від обмежувальної рамки растру B, або, точніше, перекриває або НЕ знаходиться праворуч від обмежувальної рамки растру B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
SELECT A.rid As a_rid, B.rid As b_rid, A.rast &< B.rast As overleft FROM dummy_rast AS A CROSS JOIN dummy_rast AS B;
a_rid | b_rid | overleft
------+-------+----------
2 | 2 | t
2 | 3 | f
2 | 1 | f
3 | 2 | t
3 | 3 | t
3 | 1 | f
1 | 2 | t
1 | 3 | t
1 | 1 | t
&> — Повертає TRUE, якщо обмежувальна рамка A знаходиться праворуч від обмежувальної рамки B.
boolean &>( raster A , raster B );
Оператор &> повертає TRUE, якщо обмежувальна рамка растра A перекриває або знаходиться праворуч від обмежувальної рамки растра B, або, точніше, перекриває або НЕ знаходиться ліворуч від обмежувальної рамки растра B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні для геометрій. |
SELECT A.rid As a_rid, B.rid As b_rid, A.rast & > B.rast As overright FROM dummy_rast AS A CROSS JOIN dummy_rast AS B;
a_rid | b_rid | overright
-------+-------+----------
2 | 2 | t
2 | 3 | t
2 | 1 | t
3 | 2 | f
3 | 3 | t
3 | 1 | f
1 | 2 | f
1 | 3 | t
1 | 1 | t
= — Повертає 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.
![]() | |
Цей операнд буде використовувати просторові індекси на растрах. |
Доступність: 2.0.0 растр @ растр, растр @ геометрія введено
Доступність: 2.0.5 геометрія @ растр введена
~= — Повертає TRUE, якщо обмежувальна рамка A збігається з обмежувальною рамкою B.
boolean ~=( raster A , raster B );
Оператор ~= повертає TRUE, якщо обмежувальна рамка растра A збігається з обмежувальною рамкою растра B.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
Доступність: 2.0.0
Дуже корисним випадком використання є взяття двох наборів односмугових растрів, які є частиною одного і того ж фрагмента, але представляють різні теми, і створення багатоканального растра
SELECT ST_AddBand(prec.rast, alt.rast) As new_rast
FROM prec INNER JOIN alt ON (prec.rast ~= alt.rast);
~ — Повертає TRUE, якщо обмежувальна рамка A містить B. Використовує обмежувальну рамку подвійної точності.
boolean ~( raster A , raster B );
boolean ~( geometry A , raster B );
boolean ~( raster B , geometry A );
Оператор ~ повертає TRUE, якщо обмежувальна рамка растра/геометрії A містить обмежувальну рамку растра/геометрії B.
![]() | |
Цей операнд буде використовувати просторові індекси на растрах. |
Доступність: 2.0.0
ST_Contains — Повертає true, якщо жодна точка растра rastB не лежить зовні растра rastA і принаймні одна точка всередині rastB лежить всередині rastA.
boolean ST_Contains( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Contains( raster rastA , raster rastB );
Растр rastA містить rastB тоді і тільки тоді, коли жодна точка rastB не лежить зовні rastA і принаймні одна точка всередині rastB лежить всередині rastA. Якщо номер каналу не вказано (або встановлено на NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_Contains(ST_Polygon(raster), geometry) або ST_Contains(geometry, ST_Polygon(raster)). |
![]() | |
ST_Contains() є оберненою функцією до ST_Within(). Отже, ST_Contains(rastA, rastB) означає ST_Within(rastB, rastA). |
Доступність: 2.1.0
Specified band numbers.
SELECT r1.rid, r2.rid, ST_Contains(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 1;
NOTICE: The first raster provided has no bands rid | rid | st_contains -----+-----+------------- 1 | 1 | 1 | 2 | f
No band numbers specified.
SELECT r1.rid, r2.rid, ST_Contains(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 1;
rid | rid | st_contains -----+-----+------------- 1 | 1 | t 1 | 2 | f
ST_ContainsProperly — Повертає true, якщо rastB перетинає внутрішню частину rastA, але не межу або зовнішню частину rastA.
boolean ST_ContainsProperly( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_ContainsProperly( raster rastA , raster rastB );
Растр rastA містить rastB, якщо rastB перетинає внутрішню частину rastA, але не межу або зовнішню частину rastA. Якщо номер каналу не вказано (або встановлено на NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
Растр rastA не містить сам себе належним чином, але містить сам себе.
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_ContainsProperly(ST_Polygon(raster), geometry) або ST_ContainsProperly(geometry, ST_Polygon(raster)). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_ContainsProperly(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_containsproperly -----+-----+--------------------- 2 | 1 | f 2 | 2 | f
ST_Covers — Повертає true, якщо жодна точка растра rastB не лежить за межами растра rastA.
boolean ST_Covers( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Covers( raster rastA , raster rastB );
Растр rastA покриває rastB тоді і тільки тоді, коли жодна точка rastB не лежить за межами rastA. Якщо номер каналу не вказано (або встановлено NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_Covers(ST_Polygon(raster), geometry) або ST_Covers(geometry, ST_Polygon(raster)). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_Covers(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_covers -----+-----+----------- 2 | 1 | f 2 | 2 | t
ST_CoveredBy — Повертає true, якщо жодна точка растра rastA не лежить за межами растра rastB.
boolean ST_CoveredBy( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_CoveredBy( raster rastA , raster rastB );
Растр rastA покривається rastB тоді і тільки тоді, коли жодна точка rastA не лежить за межами rastB. Якщо номер каналу не вказано (або встановлено NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_CoveredBy(ST_Polygon(raster), geometry) або ST_CoveredBy(geometry, ST_Polygon(raster)). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_CoveredBy(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_coveredby -----+-----+-------------- 2 | 1 | f 2 | 2 | t
ST_Disjoint — Повертає true, якщо растр rastA не перетинається в просторі з rastB.
boolean ST_Disjoint( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Disjoint( raster rastA , raster rastB );
Растери rastA і rastB є роз'єднаними, якщо вони не мають спільного простору. Якщо номер каналу не вказано (або встановлено на NULL), у тесті враховується лише опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються лише ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція НЕ використовує жодних індексів. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_Disjoint(ST_Polygon(raster), geometry). |
Доступність: 2.1.0
Rid = 1 has no bands, hence the NOTICE and the NULL value for st_disjoint.
SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
NOTICE: The second raster provided has no bands rid | rid | st_disjoint -----+-----+------------- 2 | 1 | 2 | 2 | f
This time, without specifying band numbers.
SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_disjoint -----+-----+------------- 2 | 1 | t 2 | 2 | f
ST_Intersects — Повертає true, якщо растр rastA просторово перетинається з растром rastB.
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 );
Повертає true, якщо растр rastA просторово перетинає растр rastB. Якщо номер каналу не вказано (або встановлено NULL), у тесті враховується лише опукла оболонка растра. Якщо номер канал вказано, у тесті враховуються лише ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
Покращено: 2.0.0 додано підтримку растрових/растрових перетинів.
![]() | |
Змінено: 2.1.0 Поведінка варіантів ST_Intersects(raster, geometry) змінена, щоб відповідати поведінці ST_Intersects(geometry, raster). |
Different bands of same raster.
SELECT ST_Intersects(rast, 2, rast, 3) FROM dummy_rast WHERE rid = 2;
t
ST_Overlaps — Повертає true, якщо растри rastA і rastB перетинаються, але один не повністю містить інший.
boolean ST_Overlaps( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Overlaps( raster rastA , raster rastB );
Повертає true, якщо растр rastA просторово перекриває растр rastB. Це означає, що rastA і rastB перетинаються, але один не містить повністю інший. Якщо номер каналу не вказано (або встановлено NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_Overlaps(ST_Polygon(raster), geometry). |
Доступність: 2.1.0
Comparing different bands of same raster.
SELECT ST_Overlaps(rast, 1, rast, 2) FROM dummy_rast WHERE rid = 2;
f
ST_Touches — Повертає true, якщо растрові зображення rastA і rastB мають принаймні одну спільну точку, але їх внутрішні частини не перетинаються.
boolean ST_Touches( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Touches( raster rastA , raster rastB );
Повертає true, якщо растр rastA просторово торкається растра rastB. Це означає, що rastA і rastB мають принаймні одну спільну точку, але їх внутрішні частини не перетинаються. Якщо номер каналу не вказано (або встановлено на NULL), у тесті враховується лише опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються лише ті пікселі, які мають значення (не NODATA).
![]() | |
Ця функція буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_Touches(ST_Polygon(raster), geometry). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_Touches(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_touches -----+-----+------------ 2 | 1 | f 2 | 2 | f
ST_SameAlignment — Повертає значення true, якщо растри мають однаковий нахил, масштаб, просторову прив'язку та зміщення (пікселі можна розмістити на одній сітці без розрізання на пікселі), і false, якщо вони не відповідають цим критеріям, з повідомленням, що детально описує проблему.
boolean ST_SameAlignment( raster rastA , raster rastB );
boolean ST_SameAlignment( double precision ulx1 , double precision uly1 , double precision scalex1 , double precision scaley1 , double precision skewx1 , double precision skewy1 , double precision ulx2 , double precision uly2 , double precision scalex2 , double precision scaley2 , double precision skewx2 , double precision skewy2 );
boolean ST_SameAlignment( raster set rastfield );
Неагрегована версія (варіанти 1 і 2): Повертає значення true, якщо два растри (надані безпосередньо або створені з використанням значень upperleft, scale, skew і srid) мають однаковий масштаб, нахил, srid і принаймні один з чотирьох кутів будь-якого пікселя одного растра припадає на будь-який кут сітки іншого растра. Повертає false, якщо вони не мають, і ПОВІДОМЛЕННЯ з детальною інформацією про проблему вирівнювання.
Агрегатна версія (Варіант 3): З набору растрів повертає значення true, якщо всі растри в наборі вирівняні. Функція ST_SameAlignment() є "агрегатною" функцією в термінології PostgreSQL. Це означає, що вона оперує рядками даних так само, як функції SUM() і AVG().
Доступність: 2.0.0
Покращено: 2.1.0 додавання варіанту Aggregate
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;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 t f f f
ST_NotSameAlignmentReason — Повертає текст, що вказує, чи вирівняні растри, а якщо ні, то причину цього.
text ST_NotSameAlignmentReason(raster rastA, raster rastB);
Повертає текст, що вказує, чи растри вирівняні, а якщо ні, то причину цього.
![]() | |
Якщо існує кілька причин, через які растри не вирівняні, буде повернуто лише одну причину (перший тест, який не пройшов). |
Доступність: 2.1.0
SELECT
ST_SameAlignment(ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0)
),
ST_NotSameAlignmentReason(ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0)
)
;st_samealignment | st_notsamealignmentreason ------------------+------------------------------------------------- f | The rasters have different scales on the X axis (1 row)
ST_Within — Повертає true, якщо жодна точка растра rastA не лежить зовні растра rastB і принаймні одна точка всередині rastA лежить всередині rastB.
boolean ST_Within( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Within( raster rastA , raster rastB );
Растр rastA знаходиться в межах rastB тоді і тільки тоді, коли жодна точка rastA не лежить за межами rastB і принаймні одна точка внутрішньої області rastA лежить у внутрішній області rastB. Якщо номер каналу не вказано (або встановлено на NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_Within(ST_Polygon(raster), geometry) або ST_Within(geometry, ST_Polygon(raster)). |
![]() | |
ST_Within() є оберненою функцією до ST_Contains(). Отже, ST_Within(rastA, rastB) означає ST_Contains(rastB, rastA). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_Within(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_within -----+-----+----------- 2 | 1 | f 2 | 2 | t
ST_DWithin — Повертає true, якщо растри rastA і rastB знаходяться на заданій відстані один від одного.
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 );
Повертає true, якщо растри rastA і rastB знаходяться на заданій відстані один від одного. Якщо номер каналу не вказано (або встановлено NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
Відстань вказується в одиницях, визначених системою просторових координат растрів. Щоб ця функція мала сенс, вихідні растри повинні мати однакову проекцію координат і однаковий SRID.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_DWithin(ST_Polygon(raster), geometry). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_DWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_dwithin -----+-----+------------ 2 | 1 | f 2 | 2 | t
ST_DFullyWithin — Повертає значення true, якщо растри rastA і rastB повністю знаходяться на заданій відстані один від одного.
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 );
Повертає true, якщо растри rastA і rastB повністю знаходяться на заданій відстані один від одного. Якщо номер каналу не вказано (або встановлено NULL), у тесті враховується тільки опукла оболонка растра. Якщо номер каналу вказано, у тесті враховуються тільки ті пікселі, які мають значення (не NODATA).
Відстань вказується в одиницях, визначених системою просторових координат растрів. Щоб ця функція мала сенс, вихідні растри повинні мати однакову проекцію координат і однаковий SRID.
![]() | |
Цей операнд буде використовувати будь-які індекси, які можуть бути доступні на растрах. |
![]() | |
Щоб перевірити просторові відносини між растром і геометрією, використовуйте ST_Polygon на растрі, наприклад ST_DFullyWithin(ST_Polygon(raster), geometry). |
Доступність: 2.1.0
SELECT r1.rid, r2.rid, ST_DFullyWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_dfullywithin -----+-----+----------------- 2 | 1 | f 2 | 2 | t
У цьому розділі описано різні підводні камені та поради, пов'язані з PostGIS Raster.
Коли GDAL відкриває файл, GDAL ретельно сканує каталог цього файлу, щоб створити каталог інших файлів. Якщо цей каталог містить багато файлів (наприклад, тисячі, мільйони), відкриття цього файлу стає надзвичайно повільним (особливо якщо цей файл знаходиться на мережевому диску, такому як NFS).
Для контролю цієї поведінки GDAL надає наступну змінну середовища: GDAL_DISABLE_READDIR_ON_OPEN. Встановіть GDAL_DISABLE_READDIR_ON_OPEN на TRUE, щоб вимкнути сканування каталогів.
В Ubuntu (і якщо ви використовуєте пакети PostgreSQL для Ubuntu), GDAL_DISABLE_READDIR_ON_OPEN можна встановити в /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment (де POSTGRESQL_VERSION — це версія PostgreSQL, наприклад 9.6, а CLUSTER_NAME — це назва кластера, наприклад 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 один дійсний запит може легко перевищити цей ліміт (наприклад, набір даних за 10 років з одним растром для кожного дня, що містить мінімальні та максимальні температури, і ми хочемо знати абсолютне мінімальне та максимальне значення для пікселя в цьому наборі даних).
Найпростішою зміною є наступне налаштування PostgreSQL: max_files_per_process. За замовчуванням встановлено значення 1000, що є занадто низьким для Out-DB Rasters. Безпечним початковим значенням може бути 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 (і припускаючи, що ви використовуєте пакети PostgreSQL для Ubuntu), найпростіший спосіб змінити Soft Limit та Hard Limit — це відредагувати /etc/init.d/postgresql (SysV) або /lib/systemd/system/postgresql*.service (systemd).
Спочатку розглянемо випадок 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)
...
Тепер розглянемо випадок systemd Ubuntu. Ми додамо LimitNOFILE=131072 до кожного файлу /lib/systemd/system/postgresql*.service у розділі [Service].
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
Після внесення необхідних змін до systemd перезавантажте демон
systemctl daemon-reload
У цьому розділі описано функції, що містяться в папці extras архівів вихідного коду PostGIS та репозиторії вихідного коду. Вони не завжди входять до складу бінарних випусків PostGIS, але зазвичай є скриптами на основі PL/pgSQL або стандартними скриптами оболонки, які можна запускати без змін.
Нижче наведено просторові агрегатні функції, які використовуються так само, як і агрегатні функції SQL, такі як sum та average.
Наведені нижче функції є віконними просторовими функціями, які використовуються так само, як і віконні функції SQL, такі як row_number(), lead() та lag(). За ними має слідувати оператор OVER().
Наведені нижче функції є функціями PostGIS, які відповідають стандарту SQL/MM 3
Наведені нижче функції та оператори є функціями/операторами PostGIS, які приймають як вхідні дані або повертають як вихідні дані об'єкт типу даних geography.
![]() | |
Функції з (T) не є вбудованими геодезичними функціями і використовують виклик ST_Transform до та з геометрії для виконання операції. Як результат, вони можуть поводитися не так, як очікується, при перетині лінії зміни дати, полюсів, а також для великих геометрій або пар геометрій, що охоплюють більше однієї зони UTM. Базове перетворення - (віддаючи перевагу UTM, азимутальному проектуванню Ламберта (північ/південь) і, в гіршому випадку, проектуванню Меркатора) |
Наведені нижче функції та оператори є функціями/операторами PostGIS, які приймають як вхідні дані або повертають як вихідні дані об'єкт типу даних raster. Перелічені в алфавітному порядку.
Наведені нижче функції є функціями PostGIS, які приймають як вхідні дані або повертають як вихідні дані набір або окремий об'єкт типу даних geometry_dump або geomval.
Наведені нижче функції є функціями PostGIS, які приймають як вхідні дані або повертають як вихідні дані сімейство просторових типів PostGIS box*. Сімейство типів box складається з box2d та box3d
Наведені нижче функції є функціями PostGIS, які не відкидають Z-індекс.
Наведені нижче функції є функціями PostGIS, які можуть використовувати CIRCULARSTRING, CURVEPOLYGON та інші типи кривої геометрії
Наведені нижче функції є функціями PostGIS, які можуть використовувати геометрії POLYHEDRALSURFACE, POLYHEDRALSURFACEM
Нижче наведено алфавітний перелік просторових функцій у PostGIS та типи просторових даних, з якими вони працюють, або відповідність стандартам OGC/SQL, яких вони намагаються дотримуватися.
означає, що функція працює з типом або підтипом вбудовано.
означає, що це працює, але з вбудованим перетворенням за допомогою cast to geometry, перетворенням у просторове посилання "best srid", а потім зворотним перетворенням. Результати можуть не відповідати очікуваним для великих областей або областей на полюсах і можуть накопичувати сміття з плаваючою комою.
означає, що функція працює з типом завдяки автоматичному перетворенню в інший тип, наприклад box3d, а не завдяки прямій підтримці типу.
означає, що функція доступна тільки якщо PostGIS скомпільовано з підтримкою SFCGAL.
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.7
Functions enhanced in PostGIS 3.7
Functions changed in PostGIS 3.7
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.6
Functions enhanced in PostGIS 3.6
Functions changed in PostGIS 3.6
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.5
Functions enhanced in PostGIS 3.5
Functions changed in PostGIS 3.5
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.4
Functions enhanced in PostGIS 3.4
Functions changed in PostGIS 3.4
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.3
Functions enhanced in PostGIS 3.3
Functions changed in PostGIS 3.3
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.2
Functions enhanced in PostGIS 3.2
Functions changed in PostGIS 3.2
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.1
Functions enhanced in PostGIS 3.1
Functions changed in PostGIS 3.1
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 3.0
Functions enhanced in PostGIS 3.0
Functions changed in PostGIS 3.0
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 2.5
Functions enhanced in PostGIS 2.5
Functions changed in PostGIS 2.5
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 2.4
Functions enhanced in PostGIS 2.4
Functions changed in PostGIS 2.4
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 2.3
Functions enhanced in PostGIS 2.3
Functions changed in PostGIS 2.3
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 2.2
Functions enhanced in PostGIS 2.2
Functions changed in PostGIS 2.2
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 2.1
Functions enhanced in PostGIS 2.1
Functions changed in PostGIS 2.1
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 2.0
Functions enhanced in PostGIS 2.0
Functions changed in PostGIS 2.0
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 1.5
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 1.4
The functions given below are PostGIS functions that were added or enhanced.
Functions new in PostGIS 1.3
Reporting bugs effectively is a fundamental way to help PostGIS development. The most effective bug report is that enabling PostGIS developers to reproduce it, so it would ideally contain a script triggering it and every information regarding the environment in which it was detected. Good enough info can be extracted running SELECT postgis_full_version() [for PostGIS] and SELECT version() [for postgresql].
If you aren't using the latest release, it's worth taking a look at its release changelog first, to find out if your bug has already been fixed.
Using the PostGIS bug tracker will ensure your reports are not discarded, and will keep you informed on its handling process. Before reporting a new bug please query the database to see if it is a known one, and if it is please add any new information you have about it.
You might want to read Simon Tatham's paper about How to Report Bugs Effectively before filing a new report.
The documentation should accurately reflect the features and behavior of the software. If it doesn't, it could be because of a software bug or because the documentation is in error or deficient.
Documentation issues can also be reported to the PostGIS bug tracker.
If your revision is trivial, just describe it in a new bug tracker issue, being specific about its location in the documentation.
If your changes are more extensive, a patch is definitely preferred. This is a four step process on Unix (assuming you already have git installed):
Before editing or building the manual, read the repository's documentation development guide. It covers the executable example, generated figure, validation, HTML, and PDF workflows used by the manual.
Clone the PostGIS' git repository. On Unix, type:
git clone https://git.osgeo.org/gitea/postgis/postgis.git
This will be stored in the directory postgis
Make your changes to the documentation with your favorite text editor. On Unix, type (for example):
vim doc/postgis.xml
Note that the documentation is written in DocBook XML rather than HTML, so if you are not familiar with it please follow the example of the rest of the documentation.
Make a patch file containing the differences from the master copy of the documentation. On Unix, type:
git diff doc/postgis.xml > doc.patch
Attach the patch to a new issue in bug tracker.
PostGIS is built and sustained by a worldwide community. This chapter records the people, organizations, funders, and upstream projects that have contributed code, documentation, infrastructure, testing, support, and funding.
The PostGIS Project Steering Committee (PSC) coordinates the general direction, release cycles, documentation, and outreach efforts for the PostGIS project. In addition the PSC provides general user support, accepts and approves patches from the general PostGIS community and votes on miscellaneous issues involving PostGIS such as developer commit access, new PSC members or significant API changes.
CI and website maintenance, Windows production and experimental builds, documentation, alignment of PostGIS with PostgreSQL releases, X3D support, management functions.
Index improvements, bug fixing and geometry/geography function improvements, SFCGAL, raster, GitHub curation, and ci maintenance.
Co-founder of PostGIS project. General bug fixing, geography support, geography and geometry index support (2D, 3D, nD index and anything spatial index), underlying geometry internal structures, GEOS functionality integration and alignment with GEOS releases, alignment of PostGIS with PostgreSQL releases, loader/dumper, and Shapefile GUI loader.
Bug fixes and maintenance, ci maintenance, git mirror management, management functions, integration of new GEOS functionality and alignment with GEOS releases, topology support, and raster framework and low level API functions.
Distance function enhancements (including 3D distance and relationship functions) and additions, Tiny WKB (TWKB) output format and general user support
SFCGAL enhancements and maintenance and ci support
Geometry clustering function additions, other geometry algorithm enhancements, GEOS enhancements and general user support
GEOS enhancements and documentation
MapBox Vector Tile, GeoBuf, and Flatgeobuf functions. Gitea testing and GitLab experimentation.
Geometry Processing, PostgreSQL gist, general bug fixing
Bug fixes, maintenance, stability, and performance
Prior PSC Member, MVT support, Bug fixing, Performance and stability improvements, GitHub curation, alignment of PostGIS with PostgreSQL releases
Prior PSC Member. Raster development, integration with GDAL, raster loader, user support, general bug fixing, testing on various OS (Slackware, Mac, Windows, and more)
Prior PSC Member. Coordinated bug fixing and maintenance effort, spatial index selectivity and binding, loader/dumper, and Shapefile GUI Loader, integration of new and new function enhancements.
Raster development, GDAL driver support, loader
(Emeritus) Input/output XML (KML,GML)/GeoJSON functions, 3D support and bug fixes.
Prior PSC Member. General development, site and buildbot maintenance, OSGeo incubation management
CMake support for PostGIS, built original raster loader in python and low level raster API functions
Prior PSC Member. Documentation and documentation support tools, buildbot maintenance, advanced user support on PostGIS newsgroup, and PostGIS maintenance function enhancements.
The original developer/Co-founder of PostGIS. Dave wrote the server side objects, index bindings, and many of the server side analytical functions.
Original development of the Shapefile loader/dumper.
Ongoing maintenance and development of core functions. Enhanced curve support. Shapefile GUI loader.
Architect of PostGIS raster implementation. Raster overall architecture, prototyping, programming support
Raster development (mostly map algebra analytic functions)
| @amwps290 (GitHub user) | Fabrice Fontaine | Markus Wanner |
| @kannes (GitHub user: Hannes) | Florentin Drogeanu | Matt Amos |
| @sunhm89 (GitHub user) | Florian Weimer | Matt Bretl |
| @wewindy (GitHub user: Chen) | François Bonzon | Matthias Bay |
| Adrien Berchet | Frank Warmerdam | Maxim Kochetkov |
| Alex Bodnaru | George Silva | Maxime Guillaud |
| Alex Mayrhofer | Gerald Fenoy | Maxime van Noppen |
| Andrea Peri | Gino Lucrezi | Maxime Schoemans |
| Andreas Forø Tollefsen | Giovanni Zezza | Megan Ma |
| Andreas Neumann | Grant Hutchins | Michael Fuhr |
| Andreas Schild | Greg Troxel | Michal Páleník |
| Andrew Gierth | Guillaume Lelarge | Mike Toews |
| Andrew Harvey | Giuseppe Broccolo | Mitchell Henke |
| Anne Ghisla | Han Wang | Nathan Wagner |
| Antoine Bajolet | Hannes Janetzek | Nathaniel Clay |
| Ariel Mashraki | Hans Lemuet | Nicolas Roelandt |
| Arno Renevier | Haribabu Kommi | Nikita Shulga |
| Arthur Bazin | Harrissou Sant-anna | Nikolai Berkoff |
| Arthur Lesuisse | Havard Tveite | Norman Barker |
| Artur Zakirov | IIDA Tetsushi | Norman Vine |
| Ayo Adesugba | Ingvild Nystuen | Patricia Tozer |
| Barbara Phillipot | Jackie Leng | Paul Norman |
| Baris Ergun | James Addison | Paulo Cesar Coronado |
| Bas Couwenberg | James Marca | Pavel Seleznev |
| Ben Jubb | Jan Katins | Pawel Ostrowski |
| Benjamin Morel | Jan Tojnar | Peter Nguyen |
| Bernd Reiß | Jason Smith | Pierre Cardinal |
| Bernhard Reiter | Jean Felder | Rafal Magda |
| Bill Mill | Jeff Adams | Ralph Mason |
| Björn Esser | Jelte Fennema | Rémi Cura |
| Brian Hamlin | Jim Jones | Richard Greenwood |
| Bruce Rindahl | Joe Conway | Robert Coup |
| Bruno Wolff III | Jonne Savolainen | Rodrigo Smarzaro |
| Bryce L. Nordgren | Jorge Gustavo Rocha | Roger Crew |
| Carl Anderson | Jorge Sanz | Ron Mayer |
| Carlos López Quintanilla | Jose Carlos Martinez Llari | Sam Peters |
| Charles Karney | Jostein Leira | Sergei Shoulbakov |
| Charlie Savage | Jörg Habenicht | Sergey Fedoseev |
| Chris Mayo | Juan Sebastian Jimenez Aldana | Shinichi Sugiyama |
| Christian Schroeder | Juergen E. Fischer | Shoaib Burq |
| Christoph Berg | Julien Monticolo | Silvio Grosso |
| Christoph Moench-Tegeder | Julien Rouhaud | Stefan Corneliu Petrea |
| Dan Faudemer | Kashif Rasul | Steffen Macke |
| Dan Levy | Klaus Foerster | Stepan Kuzmin |
| Dane Springmeyer | Kris Jurka | Stephen Frost |
| Daniel Nylander | Kristian Thy | Stephen Woodbridge |
| Dapeng Wang | Lars Aksel Opsahl | Steven Ottens |
| Daryl Herzmann | Laurențiu Nicola | Talha Rizwan |
| Dave Fuhry | Laurenz Albe | Temuri Doghonadze |
| David G. Johnston | Lars Roessiger | Teramoto Ikuhiro |
| David Garnier | Lauri Kajan | Thomas Muguet |
| David Skea | Leo Hsu | Thomas Petazzoni |
| David Techer | Loic Dachary | Tobias Bussmann |
| Denys Kovshun | Louis Descoteaux | Tom Glancy |
| Devrim Gündüz | Luca Delucchi | Tom van Tilburg |
| Dian M Fay | Luca S. Percich | Victor Collod |
| Dmitry Vasilyev | Lucas C. Villa Real | Vincent Bre |
| Edouard Choinière | Ludovic Hirlimann | Vincent Mora |
| Eduin Carrillo | Maksim Korotkov | Vincent Picavet |
| Egor Ivkov | Manuel Morillo | Volf Tomáš |
| Esteban Zimanyi | Maria Arias de Reyna | Yoichi Kayama |
| Eugene Antimirov | Marc Ducobu | Yuri Astrakhan |
| Evan Si | Mark Sondheim | Zuo Chenwei |
| Even Rouault | Markus Schaber |
These are corporate entities that have contributed developer time, hosting, or direct monetary funding to the PostGIS project. In alphabetical order:
Crowd funding campaigns are campaigns we run to get badly wanted features funded that can service a large number of people. Each campaign is specifically focused on a particular feature or set of features. Each sponsor chips in a small fraction of the needed funding and with enough people/organizations contributing, we have the funds to pay for the work that will help many. If you have an idea for a feature you think many others would be willing to co-fund, please post to the PostGIS newsgroup your thoughts and together we can make it happen.
PostGIS has experimented with community fundraising for features in the past. We used PledgeBank and we got two successful campaigns out of it.
postgistopology - 10 plus sponsors each contributed $250 USD to build toTopoGeometry function and beef up topology support in 2.0.0. It happened.
postgis64windows - 20 someodd sponsors each contributed $100 USD to pay for the work needed to work out PostGIS 64-bit issues on windows. It happened.
PostgreSQL, the extensible database system on which PostGIS is built. PostgreSQL provides the SQL engine, transactions, query planner, extension framework, and index access methods used by PostGIS.
The GEOS geometry operations library.
The PROJ coordinate transformation and geodesic calculation library.
The GDAL Geospatial Data Abstraction Library used to power much of the raster functionality introduced in PostGIS 2. In kind, improvements needed in GDAL to support PostGIS are contributed back to the GDAL project.
LibXML2 for XML-based spatial formats, and JSON-C for GeoJSON input.
The GNU Multiple Precision Arithmetic Library (GMP) for precision-sensitive topology operations.
protobuf-c for Mapbox Vector Tile and Geobuf output.
The iconv API, supplied by the C library or GNU libiconv, for character encoding conversion in the shapefile loader.
SFCGAL for advanced 2D and 3D functions, together with the CGAL algorithms that SFCGAL exposes.
PostGIS ships selected source from FlatGeobuf and FlatBuffers to support FlatGeobuf input and output.
Wagyu and Mapbox Geometry provide polygon clipping and validation for Mapbox Vector Tile output.
Ryu provides round-trip-safe floating-point formatting, and uthash provides in-process hash tables.
The shapefile loader and dumper include code derived from ShapeLib, originally by Frank Warmerdam and Even Rouault. They also include public-domain getopt code from AT&T.
liblwgeom/lookup3.c contains the public-domain lookup3 hash function by Bob Jenkins.
This version requires GEOS 3.10+, PostgreSQL 14-19beta1, Proj 6.1+, libgmp. To take advantage of all features postgis extension features, GEOS 3.15+ is needed. To take advantage of all postgis_sfcgal extension features SFCGAL 2.3+ is needed.
#5688, [topology] topology building functions now interpret tolerance 0 (old default) to really mean 0 and want -1 (new default) to mean "use topology precision" (Sandro Santilli)
#6024, Remove support for PostgreSQL 12 and 13 (Regina Obe)
#6040, ST_GeoHash round trip through ST_GeomFromGeoHash (Paul Ramsey)
#6053, [address_standardizer] Extension removed and moved to https://github.com/postgis/address_standardizer (Paul Ramsey)
#6052, [tiger_geocoder] Extension removed and moved to https://git.osgeo.org/postgis/postgis_tiger_geocoder (Regina Obe)
#6079, Remove support for GEOS < 3.10 (Sandro Santilli)
#1793, Remove ST_MemCollect aggregate (Darafei Praliaskouski)
GH-848, CG_AlphaShape now returns a MultiPolygon (Jean Felder)
#1124, #2935, #3033, #4658, #4659, [loader] Rework loader arguments: shp2pgsql can create UNLOGGED tables and choose the feature id column name, shp2pgsql --drop-table can emit DROP TABLE before prepare output, raster2pgsql/shp2pgsql expose loader actions as long options, both loaders accept long aliases for existing options, and
-if-not-exists makes creation actions idempotent (Darafei Praliaskouski)
#4208, Add single-geometry variants of ST_MaxDistance and ST_LongestLine (Darafei Praliaskouski)
[topology] FindVertexSegmentPairsBelowDistance function (Sandro Santilli)
ST_CoverageEdges, returns MultiLinestring of distinct shared edges in polygonal coverage (Paul Ramsey)
ST_MinimumSpanningTree, window function to calculate MST (Paul Ramsey)
#5993, [topology] Add max_edges parameter to TopoGeo_AddLinestring (Sandro Santilli)
#6001, support MultiLineString in ST_MakeLine (Paul Ramsey)
#2858, ST_MMin and ST_MMax (Paul Ramsey)
#5941, [raster] Support GDT_Float16 pixel type (Darafei Praliaskouski)
#5992, Optimize GiST index for repeated edge subdivision in topology (Darafei Praliaskouski)
#5702, Allow the compiler to detect the parallelism -flto=auto (Darafei Praliaskouski)
#4798, ST_AsGeoJSON warns about duplicate property keys (Darafei Praliaskouski)
#5950, Document POSTGIS_REGRESS_DB_OWNER for sandboxed regression roles (Darafei Praliaskouski)
#4332, Clarify the scope of several Function Reference categories (Darafei Praliaskouski)
#4222, [raster] ST_DumpAsPolygons honours PostgreSQL interrupts (Darafei Praliaskouski)
#5109, Document the meaning of topology.next_left_edge and topology.next_right_edge links (Darafei Praliaskouski)
#5889, [topology] Include representative locations in topology build errors (Darafei Praliaskouski)
#2614, Use GEOSPreparedDistance and caching to accelerate ST_DWithin (Paul Ramsey)
#6022, Document ST_AsMVTGeom tile-coordinate simplification (Darafei Praliaskouski)
GH-839, ST_Multi support for TIN and surfaces (Loïc Bartoletti)
#4398, Add ST_CatmullSmoothing smoothes but retains original vertices (Paul Ramsey)
#4560, ST_3DInterpolatePoint for M interpolation from XYZ inputs (Paul Ramsey)
#1291, ST_MakePolygon support for curved rings (Darafei Praliaskouski)
GT-270, Add NURBSCurve (Loïc Bartoletti)
#2863, Add ST_XSize, ST_YSize, ST_ZSize, and ST_MSize dimension helpers (Darafei Praliaskouski)
[fuzzers] Centralize OSS-Fuzz build/dependency logic in PostGIS scripts, prefer requested CXX over pg_config --cc for internal C++ checks, and make fuzzer linking/runtime dependency packaging portable (Darafei Praliaskouski)
#2045, pgsql2shp query dumps no longer require temporary table privileges (Darafei Praliaskouski)
#1577, [loader] Report unsupported .zip archive input before trying to open shapefile sidecar files (Darafei Praliaskouski)
#3158, Move geometry and geography typmod bit helpers out of the public liblwgeom header (Darafei Praliaskouski)
#4678, [raster] Move st_sum4ma neighborhood callback to C (Darafei Praliaskouski)
#2116, [raster] Add ST_Value nearest-neighbor boundary options (Darafei Praliaskouski)
#2804, #4315, [raster] Support two-argument ST_MapAlgebra callbacks and pass callback call data as actual arguments (Darafei Praliaskouski)
#2898, Document SQL function cost tiers for contributors
#6062, [topology] Stop using recursive snapping, for improved robustness (Sandro Santilli)
#6065, Improved winding order computation robustness for rings having collapsed elements (Sandro Santilli)
#3743, #4385, [raster loader] Document raster2pgsql -s FROM_SRID:SRID reprojection support and clarify index creation timing for append loads (Darafei Praliaskouski)
#2137, [raster] Reuse matching source raster overviews in raster2pgsql -l (Darafei Praliaskouski)
#4749, Use point-in-polygon predicate fast paths for point-only GeometryCollections (Darafei Praliaskouski)
#5532, Validate the manual against DocBook XMLSchema in check-xml (Darafei Praliaskouski)
#6087, Add a repository-owned CI status checker and static dashboard generator (Darafei Praliaskouski)
#2807, [raster] Preserve missing NODATA values in ST_MapAlgebra outputs (Darafei Praliaskouski)
#2832, [raster] Avoid padding single-tile raster2pgsql overviews when padding is not requested (Darafei Praliaskouski)
#2623, Generate a pgsql2shp GID field when exporting geometry-only shapefiles (Darafei Praliaskouski)
#2850, Preserve pgsql2shp numeric precision and scale in DBF metadata (Darafei Praliaskouski)
#2386, Add raster2pgsql man page (Darafei Praliaskouski)
Build PostgreSQL extension modules with `-fno-semantic-interposition` when available so LTO can optimize same-DSO calls to exported PostGIS entry points directly instead of routing through the module PLT; in a local PostgreSQL 18 `pgbench` microbenchmark over 100k four-point groups this reduced `ST_Collect` aggregate latency by about 4% (Darafei Praliaskouski)
#5973, Install PostGIS utilities under `pg_config --bindir` by default and document `pg_config`-derived install paths more accurately (Darafei Praliaskouski)
#2808, Clarify postgis_full_version() output when installed component scripts are newer than core scripts (Darafei Praliaskouski)
#5593, Docs: render manual images with GraphicsMagick without temporary files, enabling parallel builds, keeping ImageMagick fallbacks working, and documenting the generator workflow for contributors (Darafei Praliaskouski)
#5645, Docs: keep code operators ("=>") intact in translated manuals by enforcing verbatim CSS (Darafei Praliaskouski)
#1408, Docs: flatten transparent manual images onto white backgrounds for PDF builds while keeping HTML images transparent (Darafei Praliaskouski)
#2838, Emit valid X3D Coordinate nodes for 2D polygon output (Darafei Praliaskouski)
#1705, Infer constraint metadata for direct view and materialized view geometry columns (Darafei Praliaskouski)
GH-899, [raster] Honor PostgreSQL interrupts in long-running GDAL progress callbacks (Darafei Praliaskouski)
#2583, Preserve Z/ZM dimensional qualifiers in ST_AsEWKT output for TIN (Darafei Praliaskouski)