PostGISは、オブジェクトRDBであるPostgreSQLの拡張で、GIS (地理情報システム)オブジェクトを格納することができます。PostGISは、GiSTベースのR木空間インデックスをサポートし、GISオブジェクトの解析および処理を行う機能を持ちます。
本マニュアルは、3.7.0beta1版のマニュアルです。
この作品はクリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています。好きなようにこの材料を使うことができますが、PostGIS Project のクレジット提示を求めます。また可能な限りhttp://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章データ管理 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章空間クエリ 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章ラスタデータの管理、クエリ、アプリケーション, 11章ラスタ リファレンス, or 8章SFCGAL 関数リファレンス.
Collect the versions reported by PostGIS_Full_Version and follow 14章問題を報告する. Check 付録A リリースノート 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をインストールした後は、利用したいデータベース個々内で利用可能にする (「空間データベースの作成」)か、アップグレード (「空間データベースのアップグレード」)する必要があります。
![]() | |
多くのOSで、ビルドされたPostgreSQL/PostGISパッケージがあります。多くの場合、コンパイルが必要なのは、最もひどい最先端の版が欲しい場合やパッケージメンテナンスを行う人ぐらいです。 本節では、一般的なコンパイル手順を示します。Windows用や他のOS用等にコンパイルするなら、PostGIS User contributed compile guidesやPostGIS Dev Wikiで、より詳細な助けが見つかるかも知れません。 多くのOS用のビルド済みパッケージの一覧はPostGIS Pre-built Packagesにあります。 Windowsユーザの場合は、スタックビルダか、PostGIS Windows download siteから安定版を得ることができます。また、週に1回か2回のビルドと刺激的なことがあった時の随時ビルドとを行っているvery bleeding-edge windows experimental buildsもあります。これらはPostGISの進行中のリリースでの試験に使用します。 |
PostGISモジュールは、PostgreSQLバックエンドサーバの拡張です。PostGIS 3.7.0beta1では、コンパイルのために、完全なPostgreSQLサーバヘッダが必要です。PostgreSQL 14 - 18の間でビルドできます。古い版のPostgreSQLはサポートされません。
PostgreSQLをインストールしていないならPostgreSQLインストールガイドを参照して下さい。http://www.postgresql.org/にあります。
![]() | |
GEOS機能を有効にするために、PostgreSQLをインストール時に明示的に標準C++ライブラリに対する明示的なリンクが必要になる場合があります。 |
LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE]
これは、古い開発ツールとインチキC++例外との対話のための応急処置です。怪しい問題 (望んでいないのにバックエンドが閉じたりそれに近い挙動を起こす)を経験したなら、このトリックを試してみて下さい。もちろん、これを行うにはPostgreSQLをはじめからコンパイルし直す必要があります。
次のステップでは、PostGISソースのコンフィギュレーションとコンパイルに概要を記述します。これらは、Linuxユーザ用に書いてありますので、WindowsやMacでは動作しません。
ダウンロードサイト 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、18。PostgreSQLの完全なインストール (サーバプログラムのヘッダファイルを含む)が必要です。PostgreSQLは https://www.postgresql.org にあります。
For current release-line support and end-of-life policy, see https://postgis.net/development/versions_eol/
GNU Cコンパイラ (gcc)。ANSI Cコンパイラの中には、PostGISをコンパイルできるものもありますが、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は現在、ST_GeomFromGeoJsonによるGeoJSONの取り込みに使われます。JSON-Cはhttps://github.com/json-c/json-c/releases/からダウンロード可能です。
GNU多倍長精度演算ライブラリー (Multiple Precision Arithmetic Library, libgmp)。PostGISトポロジーの数学演算の精度制御に使います。GMPはhttps://gmplib.org/からダウンロードできます。
GDAL バージョン3以上が推奨されます。ラスタ機能に必要です。https://gdal.org/download.htmlにあります。
PostgreSQL+JITでコンパイルする場合には、LLVM 6版以上が必要です。https://trac.osgeo.org/postgis/ticket/4125を参照して下さい。
オプション
GDAL (擬似的任意)。ラスターが必要ない場合に限り不要です。「ラスタ機能の設定」の説明に従って使用したいドライバーを有効にしてください。
GTK (GTK+2.0, 2.8+が必要)。シェープファイルのローダであるshp2pgsql-guiのコンパイル用です。http://www.gtk.org/にあります。
SFCGAL, 1.4.1以上が必要で、全ての機能が使用可能になるのは2.3以上が必要です。SFCGALは、PostGISに追加的な2次元、3次元の高度な解析機能を提供します。8章SFCGAL 関数リファレンスを参照して下さい。https://sfcgal.gitlab.io/sfcgal/。
ST_AsMVTを有効にするには、protobuf-cライブラリ (実行時)とprotoc-cコンパイラ (ビルド時)が必要です。protobuf-cの正しい最小版を確認するには、pkg-configが必要です。protobuf-cをご覧下さい。デフォルトでは、PostGISは、MVTポリゴンを高速に評価するためにWagyuを使用していますが、C++11コンパイラが必要です。CXXFLAGSを使って、PostgreSQLインストールに使ったのと同じコンパイラを使います。これを無効化してGEOSを代わりに使う場合には、コンフィギュレーション時に--without-wagyuを指定します。
CUnit (CUnit)。レグレッションテストに必要です。http://cunit.sourceforge.net/にあります。
DocBook (xsltproc)。文書のビルドに必要です。http://www.docbook.org/にあります。
DBLatex (dblatex)。文書をPDFでビルドするのに必要です。http://dblatex.sourcforge.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-versionPostGIS 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は、PostGISなどの拡張に対してPostgreSQLのインストール先ディレクトリを伝えるpg_configというユーティリティを持っています。PostGISの対象とする特定のPostgreSQLのインストール先を手動で指定する場合に、このパラメータ(--with-pgconfig=/path/to/pg_config)を使います。
--with-gdalconfig=FILE必須ライブラリであるGDALは、ラスタ機能に必要な機能を提供します。GDALには、インストール先ディレクトリをインストールスクリプトに伝えるgdal-configがあります。PostGISのビルドに使う特定のGDALを手動で指定する場合に、このパラメータ (--with-gdalconfig=/path/to/gdal-config)を使います。
--with-geosconfig=FILE必須のジオメトリライブラリであるGEOSには、ソフトウェアのインストール時にGEOSのインストール先ディレクトリを伝えるgeos-configというユーティリティがあります。PostGISのビルドに使う特定のGEOSを手動で指定する場合に、このパラメータ (--with-geosconfig=/path/to/geos-config)を使います。
--with-xml2config=FILELibXMLはGeomFromKML/GML処理を行うのに必須のライブラリです。通常はlibxmlをインストールしているなら発見されますが、発見できない場合や特定の版を使用したい場合は、xml2-configを指定してインストールスクリプトにLibXMLのインストール先ディレクトリを伝えます。PostGISのビルドに使う特定のLibXMLを手動で指定する場合に、このパラメータ (>--with-xml2config=/path/to/xml2-config)を使います。
--with-projdir=DIRProjはPostGISに必須の投影変換ライブラリです。PostGISのビルドに使う特定のProjのインストールディレクトリを手動で指定する場合は、このパラメータ (--with-projdir=/path/to/projdir)を使います。
--with-libiconv=DIRiconvのインストール先ディレクトリを指定します。
--with-jsondir=DIRJSON-Cは、MITライセンスのJSONライブラリで、PostGISのST_GeomFromJSONに必須です。PostGISのビルドに使う特定のJSON-Cを手動で指定する場合に、このパラメータ (--with-jsondir=/path/to/jsondir)を使います。
--with-guiデータインポートGUI (GTK+2.0が必要)をコンパイルします。このパラメータによって、shp2pgsql-guiという、shp2pgsqlのグラフィカルユーザインタフェースが作成されます。
--without-rasterラスタ機能なしでコンパイルします。
--without-topologyトポロジー機能なしでコンパイルします。
--with-gettext=noデフォルトでは、gettextの検出とこれを用いたコンパイルを試みますが、ローダ破損を引き起こす非互換性問題のもとで実行する場合には、このコマンドで無効にできます。これを使ったコンフィギュレーションによって解決する問題の例はhttp://trac.osgeo.org/postgis/ticket/748にあります。ご注意: これを切ることで多くの機能がなくなるわけではありません。まだ文書化されていなくて試験段階であるGUIローダにおける内部のヘルプ/ラベル機能に使われています。
--with-sfcgal=PATHデフォルトでは、このスイッチなしではSFCGAL対応でインストールされません。PATHは、sfcgal-configへのパスを指定することができる追加的な引数です。
--without-phony-revisionGitレポジトリの現在のHEADに一致するように、postgis_revision.hの更新を無効にします。
![]() | |
PostGISをコードレポジトリから得る場合には、はじめに次のスクリプトを実行します。 |
./autogen.sh
このスクリプトによってconfigureスクリプトが生成されます。これはPostGISのインストールに関するカスタマイズに使われます。
PostGISをアーカイブファイルで入手する場合には、configureが既に生成されているので./autogen.shは不要です。
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
make cheatsheetsターゲットで、HTMLのチートシートが生成されます。クイックリファレンスまたは学習用資料に適しています。これを作るにはxsltprocが必要です。docフォルダーに topology_cheatsheet.html、raster_cheatsheet.html、 postgis_cheatsheet.htmlの4ファイルが生成されます。
HTMLとPDFのビルド済みのものはPostGIS / PostgreSQL Study Guidesにあります。
make cheatsheets
PostGISエクステンションはPostgreSQLエクステンション機能が有効なら自動でビルド、インストールされます。
ソースレポジトリからビルドしている場合は、関数の記述を最初にビルドする必要があります。これらは、docbookがインストールされている時にビルドされます。手動でインストールするには次のようにします。
make comments
アーカイブファイルからのビルドの場合は、ビルド済みのものがあるので、コメントのビルドは必須ではありません。
PostgreSQL 9.1を対象にビルドしている場合は、エクステンションは自動的にmake install処理の一部としてビルドするべきです。必要ならextensionsフォルダからビルドできますし、他のサーバで必要ならファイルの複製ができます。
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
![]() | |
|
エクステンションファイルは、常に、OSに関係なく同じ版のPostGISでは同じです。PostGISバイナリを既にインストールしている限りは、エクステンションファイルをあるOSから別のものに複写して大丈夫です。
開発用と異なる別のサーバでエクステンションを手動でインストールしたい場合は、サーバにない時に必要となる通常のPostGISのバイナリだけでなく、次のファイルをextensionsフォルダからPostgreSQLインストール先のPostgreSQL / share / extensionフォルダに複写します。
指定されていない場合のインストールするエクステンションの版等の情報を示す制御ファイpostgis.control, postgis_topology.control。
エクステンションごとの/sqlフォルダにあるファイル全て。extensions/postgis/sql/*.sql, extensions/postgis_topology/sql/*.sqlはPostgreSQL share/extensionフォルダの最上位に複写する必要があることに注意して下さい。
以上を実行すると、PgAdmin -> extensionでpostgis, postgis_topologyが有効なエクステンションとして見えます。
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 EXTENSIONがインストールされていないことになります。PgAdmin III 1.14以上では、データベースブラウザツリーのextensionsセクションで提供されていて、右クリックでアップグレードまたアンインストールできます。
有効なエクステンションがある場合、pgAdminエクステンションインタフェースまたは次のSQLの実行によって、選択したデータベースにPostGISエクステンションをインストールできます。
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をインストールした場合には、それぞれのエクステンションが持つ関数をパッケージするためのコマンドを実行して、エクステンションに基づくように変更できます。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データベースに対して生成したライブラリを使用した、様々なチェックとレグレッションテストを行います。
![]() | |
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です。
postgis.sqlなどの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と同じ版のソースでコンパイルしているか、をチェックします。(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、Proj4ライブラリ、GEOSライブラリのインストール先を検出したかチェックして下さい。
コンフィギュアからの出力でpostgis_config.hファイルが作られます。POSTGIS_PGSQL_VERSION、POSTGIS_PROJ_VERSIONおよびPOSTGIS_GEOS_VERSION変数が正しくセットされたかをチェックして下さい。
PostGISの性能向上のための調整はPostgreSQLの作業量の調整と非常に似ています。追加して留意すべき点は、ジオメトリとラスタは重大きいのでメモリ関連の最適化は他のPostgreSQLクエリと比べて影響が大きいことだけです。
PostgreSQLの最適化に関する一般的な詳細は、 Tuning your PostgreSQL Serverをご覧ください。
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;
PostgreSQLの設定に加えて、PostGISには 「Grand Unified Custom変数 (GUC)」で挙げる独自設定があります。
次に示す設定はpostgresql.confにあります:
デフォルト: partition
これは一般的にテーブルのパーティショニングに使われます。デフォルトの"partition"では、テーブルが継承階層の中にある場合にはプランナーに制約を考慮するテーブル解析だけを強制し、他の場合にはプランナーペナルティを払うのを避けるようにします。
デフォルト: ~128MB
利用可能なRAMの25%から40%を設定します。Windowsでは高く設定することができないかも知れません。
max_worker_processesで有効なバックグラウンドプロセス数の最大値をサーバーに対して制御できます。間接的にパラレルクエリーに参加するワーカーの上限値も設定できると言えます。
デフォルト: 8
システムが対応できるバックグラウンドプロセスの最大値を設定します。このパラメータはサーバ起動時のみ設定できます。
work_mem - 並べ替えや複雑なクエリに使われるメモリのサイズの設定
デフォルト: 1-4MB
大きなデータベースの場合や、複雑なクエリの場合、RAMが多い場合は値を大きくするように調整します。
同時接続ユーザ数が多い場合や、RAMが少ない場合には値を小さくするように調整します。
たくさんのRAMを持ち、少数の開発者しかいない場合は次のようにします:
SET work_mem TO '256MB';
maintenance_work_mem (訳注: 日本語訳) - VACUUM, CREATE INDEX等で使われるメモリのサイズ
デフォルト: 16-64MB
一般的には低すぎます - メモリスワップの間、入出力が拘束され、オブジェクトがロックされます
たくさんのRAMを持つ本番サーバでは32MBから1GBが推奨ですが、同時接続ユーザ数に依存します。たくさんのRAMを持ち、少数の開発者しかいない場合は次のようにします:
SET maintenance_work_mem TO '1GB';
max_parallel_workers_per_gather
最近のPostgreSQLとPostGISのパラレルクエリー機能では、1回のプランで要求する可能性のあるワーカー数を決定するためにこの設定が使われます。0より大きい数を設定した場合には、これらの関係する ST_Intersects のような関係関数を含むクエリーが複数のプロセスを使うことができ、そうすると2倍を超える速度になります。多数の予備プロセスがあるなら、この値を持っているプロセス数まで上げるべきです。ただし、これにあわせてmax_worker_processesを少なくともこの数と同じまで増やすのを忘れないでください。
デフォルト: 0
単一のGatherノードが開始できるワーカの最大数を設定します。並列ワーカは、max_worker_processesで確立されたプロセスのプールから取得されます。要求したワーカ数は、実際には実行可能になっていない場合があることに注意して下さい。これが発生する場合には、想定より少ないワーカでプランが実行されることになり、場合によっては非効率になります。これの値を0 (デフォルト値)にすると、パラレルクエリ実行が無効になります。
ラスタ機能を有効にしたら、下に示す確実な設定方法を読んだ方がいいです。
データベース外ラスターとすべてのラスタードライバーはデフォルトでは無効です。有効にするには、サーバー側で環境変数 POSTGIS_GDAL_ENABLED_DRIVERSとPOSTGIS_ENABLE_OUTDB_RASTERS とを設定する必要があります。よりクロスプラットフォームな方法として、対応する「Grand Unified Custom変数 (GUC)」を設定することができます。
データベース外ラスタを有効にするには次のようにします:
POSTGIS_ENABLE_OUTDB_RASTERS=1
他の値を入れたり、値を入れない場合には、データベース外ラスタは無効になります。
インストールしたGDALで利用可能なドライバーの全てを有効にするには、次の環境変数を設定します:
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
一部のドライバーのみ有効にしたい場合には、環境変数を次のように設定します:
POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
![]() | |
Windows環境の場合には、ドライバーリストに引用符をつけないで下さい |
環境変数はOSによって変化します。UbuntuやDebian上でapt-postgresqlを介してPostgreSQLをインストールした場合には、/etc/postgresql/ (MAJROはメジャーバージョン、CLUSTERはクラスター名が入ります)を編集する方が良いです。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
![]() | |
これは、通常はPostgreSQLのエクステンションのディレクトリ内にPostGISをインストールできないか、したくない場合 (たとえばテスト中や開発中、または制限のある環境内)にのみ必要となります。 |
ビルドの際に指定した[prefix]/share/contrib内にある様々なSQLファイルをロードしてPostGISオブジェクトと関数の定義をデータベースに追加します。
中核のPostGISオブジェクト (ジオメトリ型とジオグラフィ型、これらに対応する関数)はpostgis.sqlスクリプトにあります。ラスタオブジェクトはrtpostgis.sqlスクリプトにあります。トポロジオブジェクトはtopology.sqlスクリプトにあります。
EPSG座標系定義IDの完全なテーブルを得るには、spatial_ref_sys.sql定義ファイルをロードしてspatial_ref_sysテーブルを生成して下さい。これによりジオメトリ関数ST_Transform()が実行できるようになります。
PostGIS関数にコメントを追加したい場合には、postgis_comments.sqlスクリプト内にコメントがあるのが分かると思います。コメントはpsqlのターミナルウィンドウから単に\dd [関数名]と打ち込むだけで見ることができます。
ターミナルで次のシェルコマンドを実行します:
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には、マイナーバージョンアップやバグフィクスリリースの場合に使うソフトアップグレードと、メジャーアップグレードで使うハードアップグレードが用意されています。
PostGISをアップグレードしようとする前にデータのバックアップを取ることは、常に価値のあるものです。pg_dumpで -Fc フラグを使うと、ハードアップグレードでダンプを常にリストアすることができます。
エクステンションを使ってデータベースをインストールした場合には、エクステンションモデルでアップグレードしなければなりません。 古いSQLスクリプトを使ってインストールした場合には、SQLスクリプトは既にサポートされていませんので、エクステンションに切り替えるべきです。
PostGISをエクステンションとして入れている場合には、アップグレードmのエクステンションを使う必要があります。エクステンションでのマイナーアップグレードではほとんど痛みは伴いません。
インストール済みのバージョンのうち最新バージョンにアップグレードするには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
この場合には、データベースをバックアップして、 「エクステンションを使って空間データベースを有効にする」 に記述されているように新しいデータベースを生成し、バックアップを新しいデータベースにリストアしなければなりません。
次のようなメッセージを得ることがあります:
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で利用可能なデータベースの完全なダンプ/リロードを意味します。PostGISオブジェクトの内部格納状態が変更される場合や、ソフトアップグレードができない場合に、ハードアップグレードが必要です。付録のリリースノートに、バージョンごとのダンプ/リロード (ハードアップグレード)の要否を記載しています。
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と呼ぶことにしましょう)の「カスタム書式」のダンプを、バイナリBLOBデータを含めたダンプを指定して (-b)、verboseモード (-v)で生成します。ユーザはデータベースのオーナーになることができ、PostgreSQLのスーパーユーザである必要はありません。
pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
新しいデータベースにPostGISを、PostGISが無い状態からインストールします。このデータベースをnewdbと呼ぶことにします。この作業に関する説明については「エクステンションを使わずに空間データベースを有効にする (お勧めしません)」と「エクステンションを使って空間データベースを有効にする」とを参照して下さい。
ダンプにあるspatial_ref_sysのエントリはリストアされますが、既にあるspatial_ref_sysのエントリを上書きしません。リストア対象のデータベースに公式データセットの訂正が確実に伝わるようにするためです。なんらかの理由で標準のエントリを上書きしたい場合には、newdbを生成する際にspaltial_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の間は内部利用のための予約領域ですが、SRID値 > 999999 の場合は、その値は一切使用できません。全ての不正なSRIDを持つ独自レコードは、SRID値 > 999999 の場合はに、予約領域に入るようSRID値が変更されたうえで保持されます。しかし、値を保持するために設定されているspatial_ref_sysテーブルのチェック制約が外れます。場合によっては (複数の不正なSRIDが同じ予約領域のSRID値に変換されるとき)、主キーも外れます。
これを修正するために、独自のSRSを妥当な値 (910000..910999の範囲)のSRIDに複写し、全てのテーブルを新しい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)
この場合には、次のステップを試すことができます。最初にpostgis_restoreから出たIGNをSQLから完全に破棄します。そのために次のコマンドを実行します:
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
Open Geospatial Consortium (OGC)は、地理空間データのモデルを提供するためにSimple Features Access (SFA)標準を開発しました。これは、ジオメトリ (Geometry)の基本的な空間タイプを、空間解析処理実行のための操作や変換といった演算に沿って定義します。PostGISは空間解析タスクを実現するためにOGCジオメトリモデル値をPostgreSQLデータ型のgeometry、geographyとして実装しています。
ジオメトリは抽象的なタイプです。ジオメトリ値は複数ある具体的なサブタイプの一つに属します。サブタイプは様々な種類の様々な次元のジオメトリの形状を表現するものです。これらには原子的なタイプであるポイント (Point)、ラインストリング (LineString)、リニアリング (LinearRing)、ポリゴン (Polygon)があります。また、コレクション (collection) (訳注: 「マルチ系」と書いている場合があります)タイプのマルチポイント (MultiPoint)、マルチラインストリング (MultiLineString)、マルチポリゴン (MultiPolygon)、ジオメトリコレクション (GeometryCollection)があります。 Simple Features Access - Part 1: Common architecture v1.2.1では多面体サーフェス (PolyhedralSurface)、三角形 (Triangle)、TINが追加されています。
ジオメトリは2次元デカルト平面上の形状をモデル化しています。多面体サーフェス、三角形、TINは3次元空間内の形状を表現することもできます。形状のサイズと位置は座標によって指定されます。それぞれの座標は、平面上で位置を判定するXとYの座標軸値を持っています。形状はポイントと線分から構築され、ポイントは単一の座標で定められ、線分は二つの座標値から定められます。
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.
ジオメトリ値は、そのジオメトリが組み込まれている座標系を示す空間参照系に関連付けられます。空間参照系はジオメトリのSRID番号で識別されます。X軸とY軸の単位は空間参照系によって決まります。平面参照系では伝統的にX座標値とY座標値が東、北をそれぞれ示します。地理参照系では、経度と緯度を表現しています。SRIDが0の場合には、軸の単位が無い、無限の直交平面を表します。「空間参照系」を参照して下さい。
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.
ジオメトリ値はemptyになることがあります。空値とは、非マルチ系ジオメトリの場合は頂点を持っていないという意味で、コレクションでは要素を持っていないという意味です。
ジオメトリ値の重要なプロパティは範囲 (extent)またはバウンディングボックス (bounding box)です。OGCモデルではエンベロープ (envelope)と呼ばれています。これは、ジオメトリの座標を囲む2次元または3次元のボックスです。ジオメトリの座標空間内の範囲を表現するための、また、二つのジオメトリの相互関係をチェックするための、効率の良い方法です。
The geometry model allows evaluating topological spatial relationships as described in 「次元拡張9交差モデル」. 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 「ジオメトリ検証」
ポイントは、座標空間内の一つの位置を表現する0次元ジオメトリです。
POINT (1 2) POINT Z (1 2 3) POINT ZM (1 2 3 4)
ラインストリングは連続する一連の線分で形成される1次元のラインです。線分はそれぞれ2点で定義付けられ、ある線分の終点は次の線分の始点を形成します。OGC妥当なラインストリングには、0または2以上のポイントがあります。ただしPostGISはラインストリングの一つのポイントを許容します。ラインストリングは、自身とクロスする場合があります (自己交差)。始端と終端とが同じ場合にはラインストリングは閉じたことになります。自己交差しない場合には、ラインストリングは単純です。
LINESTRING (1 2, 3 4, 5 6)
リニアリングは閉じていて、かつ単純なラインスリングです。始端と終端は同じでなければなりませんし、ラインは自己交差してはなりません。
LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
ポリゴンは2次元平面領域です。一つの外側の境界 (殻)と0個以上の内の境界 (穴)とで区切られています。それぞれの境界はリニアリングです。
POLYGON ((0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0), (1 1 0, 2 1 0, 2 2 0, 1 2 0, 1 1 0))
マルチポイントはポイントのコレクションです。
MULTIPOINT ( (0 0), (1 2) )
マルチラインストリングはラインストリングのコレクションです。各要素が閉じている場合には、そのマルチラインストリングは閉じています。
MULTILINESTRING ( (0 0, 1 1, 1 2), (2 3, 3 2, 5 4) )
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 「ジオメトリ検証」.
MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5)))
ジオメトリコレクションは、ジオメトリの異種 (混合)のコレクションです。
GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4))
多角形はサーフェスは、パッチまたはエッジを共有する面の隣接するコレクションです。それぞれのパッチは平面ポリゴンです。ポリゴンがZ値を持つ場合には、サーフェスは3次元になります。
POLYHEDRALSURFACE Z ( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
三角形は三つの異なる非共線頂点で定義されるポリゴンです。三角形はポリゴンですので、四つの座標で指定され、一つ目と四つ目は同じです。
TRIANGLE ((0 0, 0 9, 9 0, 0 0))
TINはTriangulated Irregular Networkを表現する、オーバラップしない三角形のコレクションです。
TIN Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
ISO/IEC 13249-3 SQL Multimedia - Spatial標準 (SQL/MM) は、OGC SFAを拡張して、曲線ジオメトリを含むサブタイプを定義しています。SQL/MMタイプはXYM, XYZ, XYZMに対応します。
![]() | |
SQL-MM実装での全ての浮動小数点数の比較では、所定の丸め誤差があります。現在は1E-8です。 |
曲線ストリングは、基本的な曲線タイプです。線形の世界のラインストリングに似ています。単一の円弧線分は、始点、終点 (1番目と3番目)、弧の他の点の三つの点で定義されます。閉じた円を指定するには、開始点と終了点を同じにし、中間点を対称点 (円弧の中心)に置きます。連続する円弧では、前の円弧の終端と次の円弧の始端とが同じです。よって曲線ストリングは1以上の奇数個のポイントを持つことになります。
CIRCULARSTRING(0 0, 1 1, 1 0) CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
複合曲線は、曲線区間と直線区間の両方を含むことができる単一の連続した曲線です。このことは、整形された要素を持つことに加えて、全ての要素の最後のポイントは次の要素の最初のポイントでなければならないことを意味します。
COMPOUNDCURVE( CIRCULARSTRING(0 0, 1 1, 1 0), (1 0, 0 1))
曲線ポリゴンは、外側の輪がひとつで0以上の内側のリングがある点はポリゴンに似ています。違いは、ポリゴンのリングはラインストリングですが曲線ポリゴンのリングは曲線ストリングまたは複合ストリングである点です。
PostGIS 1.4から、PostGISで曲線ポリゴンで複合曲線をサポートするようになりました。
CURVEPOLYGON( CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1) )
例: CIRCULARSTRINGとLINESTRINGからなるCOMPOUNDCURVEで定義される外殻を持ち、CIRCULARSTRINGで定義される穴を持つCURVEPOLYGON
CURVEPOLYGON(
COMPOUNDCURVE( CIRCULARSTRING(0 0, 2 0, 2 1, 2 3, 4 3),
(4 3, 4 5, 1 4, 0 0)),
CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )マルチ曲線は曲線のコレクションで、ラインストリング、曲線ストリング、複合曲線を含むことができます。
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4))
マルチサーフェスはサーフェスのコレクションです。サーフェスは(線形)ポリゴンまたは曲線ポリゴンとなることができます。
MULTISURFACE( CURVEPOLYGON( CIRCULARSTRING( 0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1)), ((10 10, 14 12, 11 10, 10 10), (11 11, 11.5 11, 11 11.5, 11 11)))
OGC SFA仕様では、ジオメトリ値を外部で使用するための表現として二つの標準書式が定義されています。Well-Known Text (WKT)とWell-Known Binary (WKB)です。WKTとWKBは両方ともそのオブジェクトを定義するタイプと座標に関する情報を含んでいます。
Well-Known Text (WKT)で空間データの標準的な文字表現が可能です。空間オブジェクトのWKT表現の例を次に挙げます。
POINT(0 0)
POINT Z (0 0 0)
POINT ZM (0 0 0 0)
POINT EMPTY
LINESTRING(0 0,1 1,1 2)
LINESTRING EMPTY
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT((0 0),(1 2))
MULTIPOINT Z ((0 0 0),(1 2 3))
MULTIPOINT EMPTY
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3), LINESTRING(2 3,3 4))
GEOMETRYCOLLECTION EMPTY
WKTの入出力は関数ST_AsTextとST_GeomFromTextによって提供されます。
text WKT = 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)は、空間データのバイナリデータ (バイト列)で、移植可能かつ正確な表現です。空間オブジェクトのWKB表現を次に挙げます。
WKT: POINT(1 1)
WKB: 0101000000000000000000F03F000000000000F03
WKT: LINESTRING (2 2, 9 9)
WKB: 0102000000020000000000000000000040000000000000004000000000000022400000000000002240
WKBの入出力は関数ST_AsBinaryとST_GeomFromWKBが提供されています。次のように使います。
bytea WKB = ST_AsBinary(geometry); geometry = ST_GeomFromWKB(bytea WKB, SRID);
たとえば、WKBから空間オブジェクトの生成、挿入は次のようにします。
INSERT INTO geotable ( geom, name )
VALUES ( ST_GeomFromWKB('\x0101000000000000000000f03f000000000000f03f', 312), 'A Place');PostGISは、geometryというPostgreSQLデータ型を定義して、OGC Simple Features model を実装しています。これで、内部タイプコード (GeometryTypeとST_GeometryType参照)で全てのジオメトリのサブタイプを表現します。これにより、 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は、空間関数にプリフィクス"ST_"を付けて、SFA標準に従っています。これは、"Spatial and Temporal (空間と時間)"を示していますが、標準の時間の部分はまだ開発していません。その代わりに"Spatial Type (空間タイプ)"と解釈できます。 |
SFA標準は、空間オブジェクトは空間参照系識別子 (SRID)を含むと規程しています。SRIDは、空間オブジェクトをデータベースに挿入するために生成した時に求められます (デフォルトとして0になるかも知れません)。ST_SRIDと「空間参照系」をご覧下さい。
ジオメトリのクエリを効率的にするため、PostGISでは様々な種類の空間インデックスを定義しています。詳細については「空間インデックス」と「空間インデックスを使う」をご覧下さい。
OGC SFA仕様は、まず2次元ジオメトリのみに対応しました。また、入出力表現にジオメトリのSRIDは取り入れていまません。OGC SFA仕様 1.2.1 (ISO 19125標準に準拠)では3次元 (XYZ)とM値 (XYMとXYZM)座標に対応するようになりましたが、SIRD値の取り込みは依然行われていません。
これらの制限のため、PostGISでは拡張書式であるEWKBとEWKTを定義しました。3次元 (XYZ, XYM)と4次元 (XYZN)座標系に対応し、SRID情報を取り込めるようにしました。すべてのジオメトリ情報を含めたので、PostGISはEWKBを格納用書式 (DUMPファイル等)として使えるようになりました。
PostGISデータオブジェクトの「カノニカルな形式」のためにEWKBとEWKTを使います。入力では、バイナリデータのカノニカルな形式はEWKB、テキストデータについてはEWKBかEWKTが受け付けられます。これにより、HEXEWKBまたはEWKTのテキスト値から::geometryを使用してキャストを行い、ジオメトリ値が生成できるようになりました。出力では、バイナリのカノニカルな形式はEWKBで、テキストはHEXEWKB (HEXエンコードを施したEWKB)です。
たとえば、この手続きでは、EWKTテキスト値からのキャストでジオメトリを生成して、HEXWKBのカノニカルな形式を使った出力を行います。
SELECT 'SRID=4;POINT(0 0)'::geometry;
geometry ---------------------------------------------------- 01010000200400000000000000000000000000000000000000
PostGIS EWKT出力はOGC WKTと次の通り相違点があります。
XYZジオメトリでZ修飾子が省略されます。
OGC: POINT Z (1 2 3)
EWKT: POINT (1 2 3)
M値を含むXYMジオメトリ:
OGC: POINT M (1 2 3)
EWKT: POINTM (1 2 3)
4次元ジオメトリでZM修飾子を省略:
OGC: POINT ZM (1 2 3 4)
EWKT: POINT (1 2 3 4)
EWKTは、次のようにOGC/ISO書式で発生しうる過剰次元と不整合を回避しています。
POINT ZM (1 1)
POINT ZM (1 1 1)
POINT (1 1 1 1)
![]() | |
PostGISの拡張書式はOGC書式の上位互換であり、全ての妥当なOGC WKB/WKTは妥当なEWKB/EWKTでもあります。しかし、OGCがPostGISの定義と衝突する方法で書式を拡張した場合には、将来的に書式を変更する可能性があります。ゆえに、この互換性に*頼るべきではありません*! |
空間オブジェクトのEWKTテキスト表現の例:
POINT(0 0 0) -- XYZ
SRID=32632;POINT(0 0) -- SRID付きXY
POINTM(0 0 0) -- XYM
POINT(0 0 0 0) -- XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- SRID付きXYM
MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))
GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
TRIANGLE ((0 0, 0 10, 10 0, 0 0))
TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
これらの書式を使う入出力は次の関数を使うと有効です。
bytea EWKB = ST_AsEWKB(geometry); text EWKT = geometry; geometry = ST_GeomFromEWKB(bytea EWKB); geometry = ST_GeomFromEWKT(text EWKT);
たとえば、EWKTを使ってPostGISの空間オブジェクトを作成し挿入するステートメントは次の通りです。
INSERT INTO geotable ( geom, name )
VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )geographyデータタイプによって地理座標 ("geographic", "geodetic", "lat/lon", "lon/lat"など)上の空間地物表現にネイティブに対応できます。地理座標系は角度 (度)単位で表現される球面座標系です。
PostGISジオメトリ型の基礎は平面です。平面上の2点間の最短経路は直線です。ジオメトリに関する関数 (面積、距離、長さ、インタセクション等)は直線ベクトルとデカルト平面を使って計算しています。これで実装が簡単になり実行速度も上がりますが、地球の球面の上にあるデータについては不正確になります。
PostGISジオグラフィというデータ型は球面モデルに基づいています。球面上の2点の最短経路は大円の弧にあたります。ジオグラフィの関数 (面積、距離、長さ、インタセクション等)は球面上の弧を使います。球面上の世界の形状を考慮に入れるので、より正確な結果が得られます。
基礎となる数学はより複雑になるため、ジオグラフィ型で定義された関数はジオメトリ型で定義された関数よりも少なくなります。時間が経つにつれて新しいアルゴリズムが追加されて、ジオグラフィの機能が拡大していきます。回避策として、ジオメトリ型とジオグラフィ型との相互変換が可能です。
ジオメトリー型のように、ジオグラフィデータは空間参照系識別子 (Spatial Reference System Identifier, SRID)を持っています。 spatial_ref_sysで定義されている地理座標系 (経度/緯度)の空間参照系で利用できます。独自の地理座標系の空間参照系を追加することもできます。「ユーザー定義空間参照系」を参照してください。
計測関数 (例 ST_Distance、ST_Length、ST_Perimeter、ST_Area)によって返されるものの単位と、ST_DWithinの引数で与えられる距離との、空間参照系の単位は、メートルです。
ジオグラフィデータを格納するテーブルは、SQLステートメントCREATE TABLEにgeography型のカラムを付けることで生成することができます。2次元ラインストリングをWGS84地理座標系 (SRID 4326)で保存するジオグラフィカラムを持つテーブルを生成する例を次に示します。
CREATE TABLE global_points ( id SERIAL PRIMARY KEY, name VARCHAR(64), location geography(POINT, 4326) );
二つの任意の型修飾子に対応するジオグラフィ型:
空間の型修飾子は、カラム内で許される形状の種類や次元を規制します。値によって空間型はPOINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTIONが可能です。ジオグラフィ型は曲線や三角形、多面体サーフェスに対応していません。型修飾子に後置詞Z、M、ZMを付けることで、座標次元の制約に対応しています。たとえば、'LINESTRINGM'は、3次元で3番目の軸はMであるラインストリングのみを許します。同様に'POINTZM'では4次元 (XYZM)データが求められます。
SRID修飾子は空間参照系(SRID)を特定の数値になるよう制約します。省略した場合には、デフォルトは4326 (WGS84地理座標系)となり、全ての計算はWGS84を使ったものになります。
ジオグラフィカラムを持つテーブルの生成の例を次に挙げます。
SRIDがデフォルトの4326 (WGS84 経度/緯度)である2次元ポイントジオグラフィを持つテーブルの生成:
CREATE TABLE ptgeogwgs(gid serial PRIMARY KEY, geog geography(POINT));
NAD83緯度/経度の2次元ポイントジオグラフィを持つテーブルの生成:
CREATE TABLE ptgeognad83(gid serial PRIMARY KEY, geog geography(POINT, 4269));
SRIDを4326で明示した3次元 (XYZ)ポイントジオグラフィを持つテーブルの生成:
CREATE TABLE ptzgeogwgs84(gid serial PRIMARY KEY, geog geography(POINTZ, 4326));
SRIDがデフォルトの4326である2次元ラインストリングジオグラフィを持つテーブルの生成:
CREATE TABLE lgeog(gid serial PRIMARY KEY, geog geography(LINESTRING));
SRIDがデ4326 (NAD 1927 経度/緯度)である2次元ポリゴンジオグラフィを持つテーブルの生成:
CREATE TABLE lgeognad27(gid serial PRIMARY KEY, geog geography(POLYGON, 4267));
ジオグラフィカラムはgeography_columnsシステムビューに登録されます。geography_columnsビューにクエリを出してテーブルを見るには、次の通りにします。
SELECT * FROM geography_columns;
空間インデックスはジオメトリカラムと同じように機能します。PostGISは、カラム型がジオグラフィであると通知したうえで、ジオメトリに使う通常の平面用インデックスでなく、球面を基にした適切なインデックスを生成します。
CREATE INDEX global_points_gix ON global_points USING GIST ( location );
ジオメトリと同じ方法でジオグラフィテーブルにデータを挿入できます。ジオメトリデータは、SRID 4326の場合には、ジオグラフィ型に自動キャストされます。EWKTとEWKB書式はジオグラフィ値を指定するために使うことができます。
INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)');
INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)');
INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');
spatial_ref_sysテーブルにある地理 (経度/緯度)参照系は、ジオグラフィのSRIDとして指定することができます。非地理座標系を使うとエラーが発生します。
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.
クエリと計測関数はメートル単位となります。そのため距離パラメータはメートル (面積の場合は平方メートル)単位となります。
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);
シアトルからロンドンへの (LINESTRING(-122.33 47.606, 0.0 51.5))大円航路を行く航空機がレイキャビク (POINT(-21.96 64.15)) にどれだけ近づくかを計算することで、ジオグラフィの力を見ことができます (航路の地図表示)。
ジオグラフィ型は、レイキャビクとシアトル-ロンドン間の大円航路との距離について、球面上で122.235 kmという本当の最短距離を計算します。
SELECT ST_Distance('LINESTRING(-122.33 47.606,0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography);st_distance ----------------- 122235.23815667
ジオメトリ型では、平面の世界地図上で見て、レイキャビクとシアトル-ロンドン間の直線とのデカルト距離が計算され、意味がありません。計算結果の名目上の単位は「度」ですが、点間の本当の角度差に応じるものではなく、「度」と呼ぶこと自体が不正確です。
SELECT ST_Distance('LINESTRING(-122.33 47.606,0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry);st_distance -------------------- 13.342271221453624
ジオグラフィ型によって、経度緯度座標でデータを格納できるようになりましたが、ジオグラフィで定義されている関数が、ジオメトリより少ないのと、実行にCPU時間がかかる、というところが犠牲になっています。
選択した型が、期待する領域から出ないことを、ジオメトリ型にして使用する条件とすべきです。使用するデータは地球全体か、大陸か、州か、自治体か?
データが小さいエリア内におさまるなら、適切な投影を選択してジオメトリを使うのが、効率面でも機能面でも最も良い方法です。
データが地球全体か大陸なら、ジオグラフィで投影法の細かい問題を気にせずにシステムを構築できるでしょう。経度/緯度のデータを保存して、ジオグラフィで定義された関数使います。
投影法を理解していなくて、学習したくもなくて、かつ、ジオグラフィで使える関数が限られていることを受け入れるのなら、ジオグラフィを使った方が簡単です。単純にデータを経度/緯度でロードして、そこから進めて下さい。
ジオグラフィとジオメトリ間のサポート状況の比較については「PostGIS関数対応マトリクス」をご覧下さい。ジオグラフィ関数の簡潔なリストと説明については「PostGISジオグラフィ対応関数」をご覧下さい。
4.3.4.1. | 球または回転楕円体のどちらで計算するのでしょうか? |
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. 全てのジオグラフィ関数には、最後の真偽パラメータを'FALSE'にすると球面を使った計算を行うというオプションがあります。これは、特にジオメトリが非常に単純である場合に計算を速くするためのものです。 | |
4.3.4.2. | 日付変更線や極に関してはどうなっていますか? |
全ての計算に日付変更線や極の概念がありません。座標は球 (経度/緯度)であるので、日付変更線とクロスする形状は、計算の観点からは、他のものと変わりありません。 | |
4.3.4.3. | 処理できる最も長い弧はどうなりますか? |
大圏の弧を2点の「補完線」として使用しています。任意の2点は、実際には2方向につながっていて、どちらの方向に行くかに依存します。PostGISの全てのコードは、大圏コースの2コースのうち*短い*方でつながっていると仮定しています。結果として、180度以上の弧を持つ形状は正しくモデル化されません。 | |
4.3.4.4. | なぜヨーロッパやロシアといった大きな範囲の面積計算はとても遅いのですか? |
ポリゴンがとんでもなく大きいからです。二つの理由から、大きなエリアは悪いです。一つは、バウンダリボックスが大きいため、どのようなクエリを走らせても、インデックスがフィーチャーを引っ張ってくる傾向にあるためです。もう一つは、頂点数が巨大で、テスト (距離、包含)関数では、少なくとも1回、通常はN (Nは、もう一方のフィーチャーの頂点数)回、頂点を横断しなければならないためです。 ジオメトリでは、大きなポリゴンを持っているけれども小さな範囲のクエリを実行する時、ジオメトリデータ情報を小片に「非正規化」します。これにより、インデックスが効果的にオブジェクトの一部を問い合わせるようになり、またクエリが常にオブジェクト全体を引っ張りこむようなことがないようになります。ST_Subdivideを参照して下さい。ヨーロッパ全体を一つのポリゴンに*格納できる*からといって、*そうすべき*だというわけではありません。 |
PostGISはOpen Geospatial Consortium (OGC)のSimple Feature Specificationに準拠しています。この標準では、単純なジオメトリと妥当なジオメトリの概念が定義されています。これらの定義によって、Simple Featureのジオメトリモデルが一貫性があって、かつ明確な方法で空間オブジェクトを表現することができ、効率的な計算を助けます (OGC Simple FeatureとSQL/MMとにおいては、単純性と妥当性について同じ定義です)。
単純なジオメトリは、自己交差や自己接触といった異常な幾何学上のポイントを持たないジオメトリです。
POINTは0次元ジオメトリオブジェクトとして常に単純です。
MULTIPOINTが単純になる条件は、任意の二つの座標 (POINT)が同じでないことです。
LINESTRINGは、同じポイントを二回通過しないものが単純です。単純なラインストリングの端点が同一の場合には、閉じているとされ、線形リングと呼ばれます。
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";MULTILINESTRINGは、要素が全て単純で、かつ、全ての要素同士のインタセクションが要素の境界上でのみ出現する場合には、単純です。
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";POLYGONは線形リングから形成されるので、妥当なポリゴンジオメトリは常に単純です。
一般的にPostGIS関数は引数ジオメトリの単純性を求めていません。単純性は主にジオメトリの妥当性を定義するための基礎として用いられます。空間データモデルによっては要件としていることもあります (たとえば、線形ネットワークはしばしばクロスを認めません)。マルチポイントと線形ジオメトリはST_UnaryUnionを使って単純にできます。
ジオメトリの妥当性は主に2次元ジオメトリ (POLYGONとMULTIPOLYGON)に適用されます。妥当性はポリゴンジオメトリが平面領域を明確にモデル化できる規則によって定義されます。
POLYGONは次の条件では妥当です。
ポリゴン境界リング (外側の殻リングと内側の穴リング)が単純 (交差も自己接触もしていない)であること。これによりポリゴンは切断線、トゲ、循環を持つことができなくなります。これは、ポリゴンの穴を外側のリングの自己接触 (いわゆる "inverted hole" (逆穴))でなく、内側のリングとして表現されなけれならないことを意味します。
境界リングがクロスしないこと
境界リングは点で接触したとしても接点として接触すること (線上にあってはなりません)
内側リングは外側リング内にあること
ポリゴン内部は単純に接続されていること (リングはポリゴンを複数に分割するように接触してはなりません)
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))
MULTIPOLYGONは次の条件では妥当です。
要素となるPOLYGONが妥当であること
要素がオーバラップしない (内部同士がインタセクトしない)こと
要素同士の接触が点でけである (線に沿って接触しない)こと
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)))
これらの規則は妥当なポリゴンジオメトリも単純であることも示しています。
線ジオメトリについては、LINESTRINGが少なくとも二つのポイントを持ち、長さが0でない (少なくとも二つの異なるポイントを持つことと同じ)、というのが唯一の妥当性規則です。単純でない (自己交差がある)ラインは妥当です。
SELECT
ST_IsValid('LINESTRING(0 0,1 1)') AS len_nonzero,
ST_IsValid('LINESTRING(0 0,0 0,0 0)') AS len_zero,
ST_IsValid('LINESTRING(10 10,150 150,180 50,20 130)') AS self_int;len_nonzero | len_zero | self_int -------------+----------+---------- t | f | t
POINTとMULTIPOINTは妥当性規則を持っていません。
PostGISは妥当なジオメトリも不正なジオメトリも、生成も格納もできます。このため、不正なジオメトリを検出し、フラグを付け、訂正することができます。OGC妥当性規則が求める規則 (長さが0のラインストリングや逆穴を持つポリゴン等)よりも厳格であることもあります。
PostGISが提供する関数の多くは、引数ジオメトリが妥当であるとの仮定によっています。たとえば、ポリゴンの外部に穴があるポリゴンの面積を計算しても意味がありませんし、単純でない境界線からポリゴンを形成するのも意味がありません。妥当なジオメトリ入力を仮定することで、トポロジ的に正しいことを確認する必要がなくなるので、関数がより効率的に動作することができます (例外として、長さ0のラインと反転したポリゴンは一般的に正しく取り扱われます)。また、ほとんどのPostGIS関数は、入力ジオメトリが妥当な場合には、妥当なジオメトリ出力を生成します。これにより、PostGIS関数を安全に連鎖させられます。
PostGIS関数を呼ぶときに予期しないエラーメッセージ ("GEOS Intersection() threw an error!"等)に遭遇する場合には、まず関数の引数が妥当かどうかを確認します。妥当でないなら、次に示す方法のいずれかによる、処理中のデータの妥当性の確認を検討して下さい。
![]() | |
関数が妥当な入力でエラーを報告する場合には、PostGISまたは使用しているライブラリの一つの中にエラーがあるのを発見することがありますが、その際はPostGISプロジェクトに報告して下さい。PostGIS関数が妥当な入力から不正なジオメトリを返す場合も同様です。 |
ジオメトリが妥当かをテストするにはST_IsValid関数を使います。次のようにします。
SELECT ST_IsValid('POLYGON ((20 180,180 180,180 20,20 20,20 180))');t
ジオメトリの不正性の性質と位置に関する情報はST_IsValidDetail関数で得られます。次のようにします。
SELECT valid, reason,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)
不正なジオメトリを自動的に訂正することが望ましいような状況があります。その際はST_MakeValid関数を使います (ST_MakeValidは不正な入力を許す特別な関数です)。
複雑なジオメトリの不正性テストには多大なCPU時間を取ることになるため、デフォルトでは、ジオメトリのロード時にPostGISは妥当性の確認をしません。データソースが信用できない場合には、チェック制約を使って、テーブル上で妥当性を強制的に確認することができます。次のようにします。
ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));
空間参照系 (Spatial Reference System, SRS) (座標参照系、Coordinate Reference System, CRSとも呼ばれます)は、ジオメトリが地表上の位置をどのように参照するかを定義しています。SRSには次の通り三種あります。
測地 (geodetic) 空間参照系は、地表に直接対応付けられる極座標系 (経度と緯度)を使います。
投影 (projected)空間参照系は、回転楕円体面を「平面にする」ための数学的な投影変換を使います。距離、面積、角度といった量を直接計測することが可能な位置座標系です。この座標系はデカルト座標系ですので、原点と二つの直交軸 (通常は来北と東方向)が定義されています。個々の投影座標系は、定まった距離単位 (通常はメートルかフィート)を使います。投影座標系は、歪みを避けて定義された座標範囲に納めるために、適応範囲を制限してもいいことになっています。
局所 (local)座標系は、地表への参照がないデカルト座標系です。PostGISではSRID値を0に指定します。
使用されている空間参照系には多数の相違点があります。一般的空間参照系は欧州石油調査グループ (European Petroleum Survey Group)のEPSG databaseで標準化されています。利便性向上のためPostGIS (と多くの空間系)はSRIDと呼ぶ整数を使って空間参照系の定義を参照します。
ジオメトリは、SRID値で空間参照系に関連付けられています。SRID値の取得にはST_SRIDを使います。ジオメトリのSRIDの設定にはST_SetSRIDを使います。ジオメトリ構築関数の中には、SRIDを与えられるものもあります (ST_PointやST_MakeEnvelope等)。EWKT書式はSRID=n;を前置することでSRIDに対応できます。
二つのジオメトリを処理する空間関数 (オーバレイ関数 、関係関数など)の入力ジオメトリは、同じ空間参照系である (同じSRIDを持つ)必要があります。ST_TransformやST_TransformPipelineを使うことで、ジオメトリデータを異なる空間参照系に変換できます。関数から返されるジオメトリは、入力ジオメトリと同じ空間参照系になります。
PostGISが使用するSPATIAL_REF_SYSテーブルは利用可能な空間参照系を定義するOGC準拠のデータベーステーブルです。このテーブルは、数値でSRIDを持ち、文字列で座標系の記述を持っています。
spatial_ref_sysの定義は次の通りです。
CREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256), auth_srid INTEGER, srtext VARCHAR(2048), proj4text VARCHAR(2048) )
カラムは次の通りです。
sridデータベース内のSpatial Reference System (SRS, 空間参照系)で一意に識別される整数コードです。
auth_nameこの参照系に引用されている標準の名前もしくは標準そのものです。たとえば「EPSG」は妥当なauth_nameです。
auth_srid空間参照系のIDはauth_nameに引用される機関によって定義されます。ここがEPSGの場合には、これはEPSGコードです。
srtext空間参照系のWell-Knownテキスト表現です。たとえば、WKT SRSの表現は、次のようになります。
PROJCS["NAD83 / UTM Zone 10N",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980", 6378137, 298.257222101]
],
PRIMEM["Greenwich", 0],
UNIT["degree", 0.0174532925199433]
],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin", 0],
PARAMETER["central_meridian", -123],
PARAMETER["scale_factor", 0.9996],
PARAMETER["false_easting", 500000],
PARAMETER["false_northing", 0],
UNIT["metre", 1]
]SRS WKTの詳細については、OGC標準のWell-known text representation of coordinate reference systemsをご覧下さい。
proj4textPostGISは座標変換機能を提供するためにProj4ライブラリを用いています。 proj4textカラムには、特定のSRIDを示すProj4座標定義文字列が入ります。たとえば次のようになります。
+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m
詳細情報についてはPROJウェブサイトをご覧下さい。spatial_ref_sys.sqlファイルには、全てのEPSG投影について、srtextとproj4textの定義があります。
投影変換で空間参照系の定義を使用する場合には、次の戦略を取ります。
auth_nameとauth_sridがある (NULLでない)場合には、これに基づいてPROJSRSを使います (存在する場合)。
srtextがある場合には、可能ならそれを使用してSRSを生成します。
proj4textがある場合には、可能ならこれを使用してSRSを生成します。
PostGISspatial_ref_sysテーブルにはPROJ投影ライブラリで処理される最も一般的な空間参照系定義3000件以上があります。しかし、そこに無い多くの座標系があります。空間参照系に関する必要な情報がある場合は、SRS定義をテーブルに追加できます。PROJに詳しいなら独自の空間参照系を定義することもできます。ほとんどの空間参照系は地域的なものであり、目的の範囲外で使用する場合は意味を持たない点に注意してください。
PostGISのコアセットに入っていない空間参照系を探すための素晴らしい資料が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.
米国の州では、州平面空間参照系 (メートルまたはフィート単位)を使用します。この空間参照系は州ごとに一つか二つ存在します。ほとんどのメートル単位のものはコアのセットに存在しますが、フィート単位の多数のものやESRIが作成したものはspatialreference.orgからロードする必要があります。
地球外の座標系でさえも定義することができます。たとえばMars 2000です。この火星の座標系は非平面 (回転楕円体の度)ですが、geography型で、度でなくメートル単位で長さや近接測定値を取得することができます。
割当外のSRIDとPROJ定義を使って米国中央のランベルト正角円錐図法の独自座標系をロードする例を次に示します。
INSERT INTO spatial_ref_sys (srid, proj4text) VALUES ( 990000, '+proj=lcc +lon_0=-95 +lat_0=25 +lat_1=25 +lat_2=25 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' );
geometry型のカラムを付けたCREATE TABLE SQLステートメントでジオメトリデータを保存するテーブルを生成することができます。次の例では、BC-アルベルス座標系 (SRID 3005)の2次元 (XY)ラインストリングを保存するジオメトリカラムを持つテーブルを生成します。
CREATE TABLE roads ( id SERIAL PRIMARY KEY, name VARCHAR(64), geom geometry(LINESTRING, 3005) );
geometry型は、次の通り、二つの任意指定型修飾子に対応しています。
空間タイプ修飾子はカラムで許される形状と次元の種類を制約するものです。値は、対応しているジオメトリタイプ (POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION等)なら全て可能です。空間タイプ修飾子は、後置詞 Z, M, ZMを付け加えることで座標次元の制約に対応します。例えば、`LINESTRINGM`修飾子では、3次元で3番目がM軸となるラインストリングだけを許します。同様に、'POINTZM'では4次元 (XYZM)データが求められます。
SRID修飾子は空間参照系のSRIDを特定の数値に制約します。省略した場合には、デフォルトは0となります。
ジオグラフィカラムを持つテーブルの生成の例を次に挙げます。
デフォルトSRIDであらゆる種類のジオメトリを保持するテーブルの生成:
CREATE TABLE geoms(gid serial PRIMARY KEY, geom geometry);
2次元ポイントでSRIDがデフォルトのテーブル作成:
CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINT));
3次元 (XYZ)ポイントでSRIDが3005のテーブル作成:
CREATE TABLE pts(gid serial PRIMARY KEY, geom geometry(POINTZ, 3005));
4次元 (XYZM)ラインストリングでSRIDがデフォルトのテーブル作成:
CREATE TABLE lines(gid serial PRIMARY KEY, geom geometry(LINESTRINGZM));
2次元ポリゴンでSRIDが4276 (NAD 1927地理座標系)のテーブル作成:
CREATE TABLE polys(gid serial PRIMARY KEY, geom geometry(POLYGON, 4267));
一つのテーブルが一つ以上のジオメトリカラムを持つことができます。テーブル生成時に指定するか、ALTER TABLE SQLステートメントを使って追加するかで実現できます。次に3次元ラインストリングを格納するカラムを追加する例を示します。
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ, 4326);
OGC Simple Features Specification for SQLは、ジオメトリテーブル構造を記述するためのGEOMETRY_COLUMNSメタデータテーブルを定義しています。PostGISではgeometry_columnsは、データベースのシステムカタログテーブルから読み取るビューです。これによって、空間メタデータ情報が常に現在定義されているテーブルやビューと矛盾しなくなります。
\d geometry_columns
View "public.geometry_columns"
Column | Type | Modifiers
-------------------+------------------------+-----------
f_table_catalog | character varying(256) |
f_table_schema | character varying(256) |
f_table_name | character varying(256) |
f_geometry_column | character varying(256) |
coord_dimension | integer |
srid | integer |
type | character varying(30) |カラムは次の通りです。
f_table_catalog, f_table_schema, f_table_nameジオメトリカラムを持っている地物テーブルの完全修飾名。PostgreSQLには"catalog"の類似カラムが無いので、このカラムは空白のままです。"schema"についてはPostgreSQLスキーマ名が使われます (デフォルトはpublicです)。
f_geometry_columnフィーチャーテーブル内のジオメトリカラムの名前。
coord_dimensionThe coordinate dimension (2, 3 or 4) of the column. The coordinate dimension is at least 2, representing X and Y coordinates.
sridこのテーブルのジオメトリの座標系として使用される座標系空間参照系のIDです。spatial_ref_sysテーブルを参照する外部キーです (「SPATIAL_REF_SYSテーブル」を参照して下さい)。
type空間オブジェクトの型。空間カラムを単一型に制限するには、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTIONのうちのいずれかを、また、XYMで使う場合には、LINESTRINGM、POLYGONM、MULTIPOINTM、MULTILINESTRINGM、MULTIPOLYGONM、GEOMETRYCOLLECTIONMのうちのいずれかを使います。複数の型が混合するコレクションの場合は"GEOMETRY"を型とすることができます。
これが必要になる事例に、SQLビューとバルクインサートの二つがあります。バルクインサートの場合には、カラムに制約を与えるか、ALTER TABLEを実行することで、geometry_columnsテーブル内の登録を訂正することができます。ビューの場合には、CAST演算を使用します。カラムが型修飾子に基づく場合には、生成処理によって正しく登録されるので、何も行う必要がありません。ジオメトリに適用する空間関数を持たないビューも、基礎となるテーブルのジオメトリカラムと同じように登録されます。
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)geometry_columnsでは、両方とも正しく登録されています。
SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'pois_ny';
f_table_name | f_geometry_column | srid | type -------------+-------------------+------+------- pois_ny | geom | 4326 | POINT pois_ny | geom_2160 | 2160 | POINT
しかし、次のようにビューを作ろうとします。
CREATE VIEW vw_pois_ny_parks AS
SELECT *
FROM pois_ny
WHERE cat='park';
SELECT f_table_name, f_geometry_column, srid, type
FROM geometry_columns
WHERE f_table_name = 'vw_pois_ny_parks';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
空間テーブルを作成したら、これでGISデータをデータベースにアップロードする準備ができたことになります。現在、PostGIS/PostgreSQLデータベースにデータをロードするには、SQLステートメントを使う、またはシェープファイルのローダ/ダンパを使う、という二つの方法があります。
空間データを文字表現 (WKTかWKB)に変換できたら、SQLを使うのがPostGISにデータを持たせる最も簡単です。SQLユーティリティのpsqlを使用して、SQLのINSERTステートメントのテキストファイルをロードすると、データをPostGIS/PostgreSQLに一括読み込みできます。
データアップロードファイル (たとえばroads.sql)は次のようになるでしょう。
BEGIN; INSERT INTO roads (road_id, roads_geom, road_name) VALUES (1, 'LINESTRING(191232 243118,191108 243242)', 'Jeff Rd'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (2, 'LINESTRING(189141 244158,189265 244817)', 'Geordie Rd'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (3, 'LINESTRING(192783 228138,192612 229814)', 'Paul St'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (4, 'LINESTRING(189412 252431,189631 259122)', 'Graeme Ave'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (5, 'LINESTRING(190131 224148,190871 228134)', 'Phil Tce'); INSERT INTO roads (road_id, roads_geom, road_name) VALUES (6, 'LINESTRING(198231 263418,198213 268322)', 'Dave Cres'); COMMIT;
SQLファイルのPostgreSQLへのロードはpsqlを使います。次のようにします。
psql -d [database] -f roads.sql
shp2pgsqlデータローダは、ESRIシェープファイルをPostGIS/PostgreSQLデータベースに、ジオメトリまたはジオグラフィとして挿入するための適切なSQLに変換します。ローダには、次に示すコマンドラインフラグによって区別される、いくつかの操作モードがあります。
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.
グラフィカルユーザーインタフェースを持つshp2pgsql-guiもあります。コマンドラインローダのオプションのほとんどが使えます。これは、スクリプト化されていない1回限りのロードの場合や、PostGIS初心者がロードする場合に、簡単に使用できます。PgAdminIIIのプラグインとすることもできます。
-c新しいテーブルの作成とシェープファイルからのデータの読み込みを行います。これがデフォルトモードです。
-aシェープファイルからデータベーステーブルにデータを追加します。複数のファイルをロードするためにこのオプションを使う場合は、これらのファイルは同じ属性と同じデータ型を持つ必要があります。
-dシェープファイルにあるデータを持つ新しいテーブルを作成する前にデータベーステーブルを削除します。
-pテーブル作成のSQLコードを生成するだけで、実際のデータは追加しません。このモードは、テーブル作成とデータロードとを完全に分けたい場合に使用します。
-?ヘルプ画面を表示します。
-D出力データにPostgreSQLのダンプ書式を用います。このモードは-a, -c, -dと組み合わせて利用します。デフォルトの"insert"によるSQL書式よりも、大変早くロードできます。大きなデータセットではこちらを使用して下さい。
-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>指定したSRIDを持つジオメトリテーブルの生成や追加を行います。FROM_SRIDが与えられた場合には、入力シェープファイルに、これを使います 。この場合には、ジオメトリは変更先SRIDに投影変換します。
-k識別子 (カラム、スキーマおよび属性)の大文字小文字を保持します。シェープファイルの属性は全て大文字であることに注意して下さい。
-i全ての整数を標準の32ビット整数に強制します。DBFヘッダではそれが正当であったとしても、64ビットのbigintを生成しません。
-IジオメトリカラムにGiSTインデックスを生成します。
-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
-Sマルチ系ジオメトリの替りに単一ジオメトリを生成します。全てのジオメトリが実際に単一である (たとえば単一の外環でなるMULTIPOLYGONや単一の頂点でなるMULTIPOINT)場合にのみ成功します。
-t <dimensionality>出力ジオメトリが特定の次元を持つよう強制します。次元は、2D, 3DZ, 3DM, 4Dの文字列を使います。
入力の次元が出力より小さい場合には、出力では0が入ります。入力の次元が大きい場合には、外されます。
-w出力書式をWKBでなくWKTにします。精度が低下して、座標変動が発生しうることに注意が必要です。
-eトランザクションを使わずに、ステートメントごとに実行するようにします。エラーの元となる不良なジオメトリがいくつか含んでいる時に、大半の良好なデータのロードが可能にするものです。ダンプ書式ではトランザクションを常に使うので、-Dフラグを指定している場合には使えません。
-W <encoding>入力データ (dbfファイル)のエンコーディングを指定します。全てのdbfの属性は指定されたエンコーディングからUTF8に変換されます。SQL出力結果には SET CLIENT_ENCODING to UTF8が含まれるようになり、バックエンドはUTF-8からデータベースが内部利用のために設定したエンコーディングに再変換できます。
-N <policy>NULLジオメトリ操作方針(insert*=挿入, skip=スキップ, abort=強制終了)を選択します。
-nDBFファイルのみインポートします。対応するシェープファイルを持っていない場合、 自動的にこのモードになり、DBFファイルのみロードします。 このフラグは、完全なシェープファイル群を持っていて、属性データだけが欲しくてジオメトリが欲しくない時のみ使用します。
-Gジオメトリ型のかわりに、ジオグラフィ型で、WGS84経度緯度 (SRID=4326)を使用します (経度緯度データが必要です)。
-T <tablespace>新しいテーブルのテーブル空間を指定します。 -Xパラメータが使われない場合には、インデックスはデフォルトのテーブル空間を使用します。PostgreSQL文書には、テーブル空間を用いるべき時に関する良い文書があります。
-X <tablespace>新しいテーブルのインデックスで使われるテーブル空間を指定します。 主キーインデックスに適用され、-Iが合わせて使われている場合にはGiST空間インデックスにも適用されます。
-Zこのフラグをこれを使う時、ANALYZE手続きの生成を防ぎます。-Zフラグが無い (デフォルトの振る舞い)場合には、ANALYZE手続きが生成されます。
ローダを使って入力ファイルを生成してアップロードするセッション例は次の通りです。
shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql psql -d roadsdb -f roads.sql
変換とアップロードはUNIXのパイプを使うと一回で実行できます。
shp2pgsql shaperoads.shp myschema.roadstable | psql -d roadsdb
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.
空間データはSQLかシェープファイルダンパを使うと抽出できます。SQLの節では空間テーブルで比較とクエリに使用できる関数を示します。
データベース外へのデータ抽出の最も簡単な方法は、抽出するデータセットを定義し、SELECT問い合わせを使って、結果カラムを解析可能なテキストファイルにダンプすることです。
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)返されるレコードの数を減らすためにある種の制限が必要になる場合があります。属性ベースで制限をかける場合には、非空間テーブルで使うのと同じSQL文を使います。空間に制限をかけるには次の関数を使います。
ST_Intersectsこの関数は、二つのジオメトリが空間を共有しているかどうかをテストします。
=この関数で、二つのジオメトリが幾何的に同一であるかを見ることができます。たとえば、'POLYGON((0 0,1 1,1 0,0 0))' は 'POLYGON((0 0,1 1,1 0,0 0))' と同じかを見ることができます (これは同じとなります)。
次に、これらの演算子をクエリで使うことができます。SQLコマンドラインからジオメトリとボックスの指定を行うときは、明示的に文字列表現をジオメトリに変換しなければならないことに注意して下さい。たとえば、次のようになります。ただし312は架空の空間参照系番号で、ここでのデータに合致しています。
SELECT road_id, road_name FROM roads WHERE roads_geom='SRID=312;LINESTRING(191232 243118,191108 243242)'::geometry;
上のクエリは"ROADS_GEOM"テーブルから、その値と等価である単一のレコードを返します。
道路がポリゴンで定義した面を通過するかどうかをチェックするには次のようにします。
SELECT road_id, road_name FROM roads WHERE ST_Intersects(roads_geom, 'SRID=312;POLYGON((...))');
最も一般的な空間クエリは「フレームベース」のクエリでしょう。これは、表示するためのデータの価値のある「マップフレーム」を取得するために、データブラウザやウェブマッパのようなクライアントソフトウェアに使われます。
"&&"演算子を使うとき、比較フィーチャーをBOX3DかGEOMETRYかに指定することができます。ただし、GEOMETRYを指定すると、それのバウンディングボックスが比較に使われます。
次に示すクエリのように、フレームにBOX3Dオブジェクトを使います。
SELECT roads_geom AS geom FROM roads WHERE roads_geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312);
エンベロープの投影を指定するためにSRID 312を使っていることに注意して下さい。
pgsql2shpテーブルダンパは、データベースに直接接続して、テーブル (あるいはクエリによって定義されたもの)をシェープファイルに変換するものです。基本的な文は次の通りです。
pgsql2shp [<options >] <database > [<schema >.]<table>
pgsql2shp [<options >] <database > <query>
コマンドラインオプションは次の通りです。
-f <filename>特定のファイル名に出力を書きこみます。
-h <host>接続先データベースのホスト名。
-p <port>接続先データベースのポート。
-P <password>データベースに接続するためのパスワード。
-u <user>データベースに接続する際のユーザー名。
-g <geometry column>複数のジオメトリカラムを持つテーブルの場合の、シェープファイルの出力に使用するジオメトリカラム。
-bバイナリカーソルを使います。これは、実行時間を短くしますが、テーブルの非ジオメトリ属性がテキストへのキャストを持っていない場合には、動作しません。
-rRawモード。gidフィールドを落としたり、カラム名をエスケープしてはいけません。
-m filename識別名を10文字名に再割り当てします。 ファイルの中身は、一つの空白で区切られ、前と後に空白が無い二つのシンボルの行からなります。VERYLONGSYMBOL SHORTONE ANOTHERVERYLONGSYMBOL SHORTER等となります。
インデックスによって巨大データセットの空間データベースの使用が可能となります。インデックス無しでは、地物の検索を行う際に、データベースの全てのレコードに対するシーケンシャルスキャンが必要となります。インデックスによって、レコード探索のために早く移動できる構造を構築するので、検索速度が向上します。
一般的に属性データに使われるインデックス手法でありB木は、空間データではあまり有用ではありません。1次元データの格納とクエリにだけしか対応していないためです。ジオメトリのような2次元以上の次元を持つデータでは、全ての次元の範囲を指定できるインデックス手法が求められます。PostgreSQLの空間データ処理に関する主要な利点の一つに、多次元データで上手く動作するGiST、BRIN、SP-GiSTの複数のインデックス手法を提供していることです。
GiST (Generalized Search Tree)インデックスは、データを「一方にあるもの」「オーバラップするもの」「内部にあるもの」に分解するもので、GISデータを含む幅広い範囲で使えます。PostGISはGiSTインデックス空間データをR木インデックス実装のベースにています。GiSTは最も一般的に使われ、多目的なインデックス手法で、非常に良好な問い合わせ効率を提供しています。
BRIN (Block Range Index)インデックスは、空間範囲を集計することで動作します。探索は範囲のスキャンを通して行われます。BRINは一部の種類 (空間的にソートされ、更新がほぼ無いか全く無い)のデータだけに適切です。しかし、インデックス生成時間は非所に早く、インデックスサイズは非常に小さくなります。
SP-GiST (Space-Partitioned Generalized Search Tree)は4分木、kd木、基数木 (トライ木)のような部分木探索に対応する一般的なインデックス手法です。
空間インデックスはジオメトリのバウンディングボックスだけを格納します。空間クエリはインデックスは初期フィルタとして使用して、クエリ条件に一致する可能性のあるジオメトリを早く求めます。ほとんどの空間クエリでは、空間述語関数を使って特定の空間条件をテストする二次フィルタが必要です。空間述語関数を使ったクエリの詳細情報については「空間インデックスを使う」をご覧下さい。
また、PostGIS Workshop section on spatial indexesとPostgreSQL manualもご覧下さい。
GiSTは「汎用検索木 (Generalized Search Tree)」の意味で、多次元データのインデックスの一般化された形式です。PostGISはGiST上で実装しているR木インデックスをを空間データのインデックスに使用しています。GiSTは最も一般的に使われ、多目的なインデックス手法で、クエリ能率を非常に良くします。他のGiSTの実装は、通常のB木インデックスに従わない全ての種類の不規則なデータ構造 (整数配列, スペクトラルデータ等)の検索速度を向上させるために使います。詳細情報についてはPostgreSQL manualをご覧ください。
GISデータテーブルが数千行を超えたら、空間検索の速度向上のためインデックスを構築したくなるでしょう (これは属性検索でない場合です。属性でしたら通常のインデックスを属性フィールドに追加します)。
GiSTインデックスをジオメトリカラムに追加するための文は次の通りです。
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield]);
上の文では常に2次元インデックスを構築します。n次元インデックスをジオメトリ型で使うには、次の文でインデックスを生成できます。
CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);
空間インデックスの構築は、計算量を集中させて行われます。また、この時には、テーブルへの書き込みアクセスがブロックされます。そのため、本番システムではより遅いCONCURRENTLYを選択するかも知れません。次のようにします。
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING GIST ( [geometryfield]);
インデックス構築後に、時々PostgreSQLにテーブルの統計情報を集めさせると助かります。クエリプランの最適化に使われます。
VACUUM ANALYZE [table_name] [(column_name)];
BRINは"Block Range Index"の意味です。PostgreSQLが提供する汎用インデックスです。BRINは不可逆インデックスですので、レコードが検索条件に合致するか確認する二次チェックが必要です (これは提供されているすべての空間インデックスと同じです)。BRINは、インデックス生成が非常に高速で、インデックスサイズが非常に小さく、読込み効率がそこそこ良いものです。これの主目的は、巨大テーブルに対してテーブル内の物理位置と相関するカラムの上にインデックスを生成することです。BRINは各種属性データ構造 (整数、配列など)の高速検索が可能です。詳細情報についてはPostgreSQL manualを参照してください。
空間テーブルが、ひとたび数千行を超えると、データの空間検索の速度向上にインデックスが必要と感じることになります。GiSTインデックスは、サイズがデータベースで使えるRAM容量を超えず、インデックスのストレージサイズに余裕があり、書き込み時のインデックス更新コストにも余裕があるなら、非常に高いパフォーマンスを発揮します。そうでない場合には、非常に大きなテーブルにおいては、BRINインデックスを代替に考えることができます。
BRINインデックスは、連続するテーブルブロックの集合 (ブロック範囲と言います)の全てのジオメトリを囲むバウンディングボックスを格納します。インデックスを使用した問い合わせを実行する時に、問い合わせ範囲とインタセクトするブロック範囲を見つけるためにスキャンします。これは、データが物理的に整列していて、ブロック範囲のバウンディングボックスのオーバラップが最小である (理想的には相互に排他的である)場合に限って効率的です。結果インデックスは非常に小さいサイズですが、通常、読み込み効率は、同じデータにおけるGiSTインデックスより悪くなります。
BRINインデックスの構築は、はGiSTインデックスと比べて、CPU集中を非常に減らします。BRINインデックスはGiSTインデックスよりも、同じデータに対して10倍速く構築するのが普通です。BRINインデックスはテーブルブロックの範囲ごとに一つのバウンディングボックスしか格納しないので、GiSTインデックスと比べて、ディスクスペースを1000倍少なくできます。
レンジ内で要約するブロック数を選択できます。この数字を減らすと、インデックスは大きくなりますが、効率向上の助けになる可能性があります。
BRINを効果的にするには、テーブルデータをブロック範囲のオーバラップの量を最小にするような物理的オーダーで格納します。データが既に適切に並び替えられているかも知れません (たとえば、既に空間オーダーで並び替えられているデータセットを他のデータベースからロードする場合)。そうでない場合には、一つの空間キーによるデータの並べ替えで実現できます。一つの方法として、ジオメトリ値で並べ替えた新しいテーブルを生成することです (最近のPostGISのバージョンで効果的なヒルベルト曲線オーダーが使われています)。
CREATE TABLE table_sorted AS SELECT * FROM table ORDER BY geom;
もしくは、データは、ジオハッシュを (一時的な)インデックスに使い、そのインデックスでクラスタリングを行うことによって適切に並べ替えることができます。
CREATE INDEX idx_temp_geohash ON table
USING btree (ST_GeoHash(ST_Transform(geom, 4326 ), 20));
CLUSTER table USING idx_temp_geohash;
BRINインデックスをジオメトリカラムに追加するための文は次の通りです。
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col]);
上の文で2次元インデックスを構築します。3次元インデックスをビルドするには、この文を使います。
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geome_col] brin_geometry_inclusion_ops_3d);
また、4次元演算子クラスを使う4次元インデックスを使うこともできます。
CREATE INDEX [indexname] ON [tablename] USING BRIN ([geome_col] brin_geometry_inclusion_ops_4d);
上記のコマンドでは、範囲のブロック数はデフォルトの128を使用しています。集計で範囲のブロック数を指定するには、この文を使います。
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geome_col] ) WITH (pages_per_range = [number]);
また、BRINインデックスは、多数の行で一つのインデックス値を格納することを心に留めておいて下さい。テーブルに違う次元のジオメトリを格納する場合には、インデックスの効率が悪くなります。この効率欠落を回避するには、格納したジオメトリの次元数の最小値となる演算子クラスを選択します。
geography型もBRINインデックスに対応しています。BRINインデックスをジオグラフィカラムに構築するための文は次の通りです:
CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geog_col]);
上の文では常に回転楕円体面上の地理空間オブジェクトの2次元インデックスを構築します。
現在のところは「包括対応」だけをここで考えています。これは、&&, ~, @の演算子だけが2次元で使われることを意味します (ジオメトリとジオグラフィの両方)。 &&&演算子は3次元ジオメトリで使えます。しばらくはKNN検索に対応しません。
BRINと他のインデックスとの重要な違いは、データベースがインデックスを動的に保守しないことです。テーブルの空間データを変更すると、単純にインデックスの末尾に追加しています。このためインデックス探索の能率が時間とともに低下します。インデックスはVACUUMか空間関数brin_summarize_new_values(regclass)を実行することで更新できます。このため、BRINは読み込み専用か、書き込みがほとんど発生しないよなデータでの利用では最も適切になりえます。詳細情報については、manualをご覧下さい。
空間データにBRINを使用して集計するには:
インデックス構築時間は非常に速く、インデックスサイズは非常に小さいです。
インデックスのクエリ時間はGiSTより遅いですが、十分許容できます。
テーブルデータを空間順序で並べ替える必要があります。
手動でインデックスの保守をする必要があります。
巨大なテーブルであって、オーバラップが少ないか無く (ポイントなど)、かつ静的か頻繁には変更しないようなものに、最も適しています。
比較的多数のデータレコードを返すクエリでの使用が、より効果的です。
SP-GiSTは、「空間分割された一般探索木」を表します。四分木、k次元木、基数木 (トライ木)のような分割探索木に対応するインデックスの総称的な形式です。このデータ構造の一般的な機能は、検索空間を反復して分割することですが、分割は等しいサイズである必要はありません。SP-GiSTは、GISインデックスだけでなく、電話回線のルーティングや、IPルーティング、部分文字列検索等といった、様々な種類のデータを探索する速度の向上に使われます。詳細情報についてはPostgreSQL manualをご覧下さい。
GiSTインデックスを利用しているので、空間オブジェクトを覆うバウンディングボックスを保存するという意味で、SP-GiSTインデックスは不可逆です。SP-GiSTインデックスは、GiSTインデックスの代替と考えることができます。
一度GISデータテーブルが数千行を超えると、データの空間探索の速度向上にSP-GiSTインデックスを使うと良いかも知れません。「ジオメトリ」カラムにSP-GiSTインデックスを構築するための文は次の通りです。
CREATE INDEX [indexname] ON [tablename] USING SPGIST ( [geometryfield]);
上の文では、2次元インデックスを構築します。ジオメトリ型の3次元インデックスは、次のように、3次元演算子クラスを使用して生成します。
CREATE INDEX [indexname] ON [tablename] USING SPGIST ([geometryfield] spgist_geometry_ops_3d);
空間インデックスの構築は、計算量を集中させて行われます。また、この時には、テーブルへの書き込みアクセスがブロックされます。そのため、本番システムでは、より遅いCONCURRENTLYを選択するかも知れません。次のようにします。
CREATE INDEX CONCURRENTLY [indexname] ON [tablename] USING SPGIST ( [geometryfield]);
インデックス構築後に、時々PostgreSQLにテーブルの統計情報を集めさせると助かります。クエリプランの最適化に使われます。
VACUUM ANALYZE [table_name] [(column_name)];
SP-GiSTインデックスは次の演算子を含むクエリの実行速度を向上させられます。
2次元インデックスについては <<, &<, &>, >>, <<|, &<|, |&>, |>>, &&, @>, <@, ~=です。
3次元インデックスについては &/&, ~==, @>>, and <<@ 。
現時点ではkNN探索に対応していません。
通常、インデックスは知らないうちにデータアクセスの速度を向上します。ひとたびインデックスを構築すれば、PostgreSQLクエリプランナは自動的にクエリの能率を向上させるために使うべきかどうかを決定します。しかし、プランナが既存のインデックスを選択せず、遅いシーケンシャルスキャンを使い続ける場合があります。
空間インデックスが使われていないのが分かった場合には、少しの行えることがあります。
クエリプランの試験とクエリの確認で、必要なものを計算できます。誤ったJOINや忘れ去られたテーブルや間違ったテーブルでは、予期しないテーブルレコード検索が複数回行われることがありえます。クエリプランを得るにはクエリの先頭にEXPLAINを付けて実行します。
テーブル内の値の数量と分布に関する統計情報を収集するとともに、クエリプランナにインデックス使用にかかる意思決定のための、より良い情報を与えるようにします。VACUUM ANALYZEは両方を計算します。
データベースに対する定期的なvacuumは常に実行するべきです。多くのPostgreSQLデータベースエージェントは、閑散時のcronジョブとして定期的にVACUUMを実行します。
VACUUMが役に立たない場合には、SET ENABLE_SEQSCAN TO OFF;コマンドを使用して、一時的にプランナにインデックス情報の使用を強制することができます。この方法で、プランナがインデックス使用を多くしたクエリプランを生成できるかどうかを確認できます。このコマンドはデバッグにのみ使用してください。一般的に言えば、プランナはインデックスを使用するタイミングをよく知っています。クエリを実行したらSET ENABLE_SEQSCAN TO ON;を実行して、他のクエリでは通常操作にすることを忘れないでください。
SET ENABLE_SEQSCAN TO OFF;でクエリ速度が向上する場合には、PostgreSQLのハードウェア関連のチューンが行われていないのかも知れません。プランナがシーケンシャル対インデックスのコストが誤っている場合には、RANDOM_PAGE_COST (postgresql.conf内にあります)の値を変更してみて下さい。またはSET RANDOM_PAGE_COST TO 1.1;とします。RANDOM_PAGE_COSTのデフォルト値は4.0です。1.1 (SSDの場合)または2.0 (高速磁気ディスクの場合)を試してみて下さい。値を小さくするほど、プランナがインデックススキャンをしやすくなります。
SET ENABLE_SEQSCAN TO OFF;がクエリの助けにならないなら、クエリはPostgreSQLプランナがまだ最適化できないSQL構成なのかも知れません。プランナが処理できるようにクエリを再記述できるかもしれません。例えば、インラインSELECTを持つ副問い合わせがあると、効果的なプランを作らないことがあり、LATERAL JOINを使うように書き換えることができます。
詳細情報についてはPostgreSQLマニュアルの問い合わせ計画節をご覧下さい。
空間データベースのレゾンデートルは、通常ならデスクトップGISの機能が必要なクエリをデータベース内で実行することです。PostGISを使うには、使用可能な空間関数は何かを知り、またクエリ内でどう使うかを知って、適切なインデックスで能率を向上させることが求められます。
空間関係は、二つのジオメトリについて、一方がもう一方にどのような相互関係になっているかを示すものです。ジオメトリのクエリにおける基本的な機能です。
OpenGIS Simple Features Implementation Specification for SQLによると「二つのジオメトリの比較の基本的なアプローチは、二つのジオメトリの内部、境界、外部のインタセクションの比較と、『インタセクション行列』の要素に基づく2ジオメトリの関係の分類です」。
点集合トポロジでは、2次元空間に埋め込まれたジオメトリの中にあるポイントは、次に示す三つの集合に分類されます。
ジオメトリの境界は、一次元低いジオメトリです。POINTでは、次元が0になり、境界は空集合です。LINESTRINGの境界は二つの端点です。POLYGONの境界は、外環と内環の線です。
ジオメトリの内部は、ジオメトリの境界以外のポイントです。POINTでは、内部はポイント自体です。LINESTRINGの内部は端点の間のポイントの集合です。POLYGONの内部は、ポリゴン内部の面です。
ジオメトリの外部はジオメトリが組み込まれた空間の残りです。言い換えると、ジオメトリの内部にも境界にもない点の全てです。これは2次元の閉じていない面になります。
次元拡張9交差モデル (Dimensionally Extended 9-Intersection Model, DE-9IM)は、二つのジオメトリの空間関係を九つの交差の次元を指定することで記述します。交差次元は3×3の交差行列で正式に表現することができます。
ジオメトリgに対する内部、境界、外部はI(g)、B(g)、E(g)と表記します。また、dim(s)はsの集合を{0,1,2,F}の値で示すます。
0 => 点
1 => 線
2 => 面
F => 空集合
この表記法を使うと、二つのジオメトリaとbの交差行列は次の通りです。
| 内部 (Interior) | 境界 (Boundary) | 外部 (Exterior) | |
|---|---|---|---|
| 内部 (Interior) | dim( I(a) ∩ I(b) ) | dim( I(a) ∩ B(b) ) | dim( I(a) ∩ E(b) ) |
| 境界 (Boundary) | dim( B(a) ∩ I(b) ) | dim( B(a) ∩ B(b) ) | dim( B(a) ∩ E(b) ) |
| 外部 (Exterior) | dim( E(a) ∩ I(b) ) | dim( E(a) ∩ B(b) ) | dim( E(a) ∩ E(b) ) |
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;左から右に、上から下に読みます。交差行列の文字列表現は'212101212'です。
詳細情報については次をご覧下さい。
共通の空間関係を簡単に決定できるように、PGC SFSは名前付き空間関係述語の集合を定義しています。PostGISではST_Contains、ST_Crosses、ST_Disjoint、ST_Equals、ST_Intersects、ST_Overlaps、ST_Touches、ST_Withinが提供されています。非標準の空間関係述語ST_Covers、ST_CoveredBy、ST_ContainsProperlyも定義されています。
空間述語は通常SQLのWHERE節やJOIN節内で条件に使用されます。名前付き空間述語は、インデックスが有効なら自動的に空間インデックスを使うので、バウンディングボックス演算子&&を使う必要はありません。例えば次のようになります。
SELECT city.name, state.name, city.geom FROM city JOIN state ON ST_Intersects(city.geom, state.geom);
詳細や図についてはPostGIS Workshopをご覧下さい。
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.
特定の空間関係をテストするには、交差行列パターンを使います。これは、追加シンボル{T,*}で拡張された行列表現です。
T => インタセクションの次元は空ではないという意味です。すなわち{0,1,2}のいずれかです。
* => 何でも良い
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)空間条件を使用するクエリを構築する時、最良の効果を得るには、空間インデックスが存在する場合に (「空間インデックス」参照)これを確実に使用することが重要です。そのためには、WHERE節やON節で、空間演算子またはインデックス対応関数を使用しなければなりません。
空間演算子には、バウンディングボックス演算子 (最もよく使われるのは&&です。「バウンディングボックス演算子」参照)、および近傍クエリで使用される距離演算子 (最もよく使われるのは<->です。「距離演算子」参照)が含まれます。
インデックス対応関数は、自動的にバウンディングボックス演算子を空間条件に追加します。インデックス対応関数は空間関係述語を含みます。空間関係述語には、ST_Contains, ST_ContainsProperly, ST_CoveredBy, ST_Covers, ST_Crosses, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within, ST_Within, ST_3DIntersectsがあり、距離述語にはST_DWithin, ST_DFullyWithin, ST_3DDFullyWithin, ST_3DDWithin があります。
ST_Distanceといった関数は、演算の最適化のためにはインデックスを使用しません。例えば、次のクエリは、大きなテーブルでは非常に遅くなります。
SELECT geom FROM geom_table WHERE ST_Distance(geom, 'SRID=312;POINT(100000 200000)') < 100
このクエリはgeom_tableテーブル内の、(100000, 200000)のポイントから100単位内にある全てのジオメトリを選択します。テーブル内の個々のポイントと指定したポイントとの距離を計算しているため、非常に遅くなります。すなわち、1回のST_Distance()の計算で、テーブルの全ての行について計算することになります。
インデックス対応関数ST_DWithinを使用すると、処理行数を実質的に減らすことができます。次のようにします。
SELECT geom FROM geom_table WHERE ST_DWithin(geom, 'SRID=312;POINT(100000 200000)', 100)
このクエリは、同じジオメトリを選択しますが、より効率的な方法を取ります。 ST_DWithin()が内部で&&演算子をクエリジオメトリのバウンディングボックスを拡大したボックスで使うことによって可能となります。geom上に空間インデックスが存在するなら、クエリプランナは距離計算の前に対象行数を減らすためにインデックスを使えることを認識します。空間インデックスによって、バウンディングボックスが拡張された範囲とオーバラップするジオメトリだけを検索して、そのため、求めようとする距離内にあるかも知れないジオメトリを検索することができます。その後で、結果集合内のレコードを含めるかどうかを確認するための実際の距離計算が行われます。
詳細情報と例についてはPostGIS Workshopをご覧下さい。
本節の例では、線の道路のテーブルとポリゴンの市区町村境界テーブルとを使います。bc_roadsテーブルの定義は次の通りです。
Column | Type | Description ----------+-------------------+------------------- gid | integer | Unique ID name | character varying | Road Name geom | geometry | Location Geometry (Linestring)
bc_municipalityテーブルの定義は次の通りです。
Column | Type | Description ---------+-------------------+------------------- gid | integer | Unique ID code | integer | Unique ID name | character varying | City / Town Name geom | geometry | Location Geometry (Polygon)
5.3.1. | 道路の総延長はkm表記でいくらになるでしょう? |
この問題は、次のようなとても単純なSQLで答えを得ることができます。 Code SELECT sum(ST_Length(geom))/1000 AS km_roads FROM bc_roads; 出力: km_roads ------------------ 70842.1243039643 | |
5.3.2. | プリンスジョージ市の大きさはha表記でいくらになるでしょう? |
このクエリでは、属性条件 (municipality name, 自治体名)に (ポリゴン面積の)空間計算を併用しています。 Code SELECT ST_Area(geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE'; 出力: hectares ------------------ 32657.9103824927 | |
5.3.3. | 県内で最も大きな面積となる自治体はどこでしょう? |
このクエリでは、順序付けの値に空間計測関数を使っています。この問題に対しては複数の方法がありますが、最も効果的な方法は次の通りです。 Code SELECT name, ST_Area(geom)/10000 AS hectares FROM bc_municipality ORDER BY hectares DESC LIMIT 1; 出力: name | hectares ---------------+----------------- TUMBLER RIDGE | 155020.02556131 このクエリの答えを出すためには、全てのポリゴンの面積を求める必要があることに注意して下さい。このクエリを多く実行する場合、性能向上のためにテーブルにareaカラムを追加して、別のインデックスを追加することができるようにするのは、意義のあることです。結果を距離について降順に並べ替え、PostgreSQLの"LIMIT"コマンドを用いることで、max()のような集約関数を使わずに、簡単に最も大きい値を集約関数を得ることができます。 | |
5.3.4. | 各自治体内に含まれる道路の総延長はいくらでしょう? |
これは、二つのテーブルからデータを持ち込んで (結合して)いるので「空間結合」の例です。しかし、結合の条件として共通キーの上で接続するという普通のリレーションのやり方でなく空間インタラクション条件 (「含む」)を使っています。 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 ... このクエリは、テーブル内の全ての道路の合計を最終結果 (この例での話ですが約250Kmの道です)にまとめられるので、少し時間がかかります。より小さいオーバレイ (数百の道路で数千のレコード)の場合、応答はもっと早くなりえます。 | |
5.3.5. | プリンスジョージ市内の全ての道路からなるテーブルを作ります。 |
これは「オーバレイ」の例です。つまり、二つのテーブルを取得して、空間的に切り取られた結果からなる新しいテーブルを出力します。上で示した「空間結合」と違い、このクエリは実際に新しいジオメトリを生成します。生成されたオーバレイはターボのかかった空間結合みたいなもので、より確かな解析作業に便利です。 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. | ビクトリア州の「ダグラス通り」の長さはkm表記でいくらになるでしょう? |
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. | 穴を持つ自治体ポリゴンのうち最も大きいのはどれでしょう? |
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性能メーリングリストのスレッド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;"をクエリの後に送信すべきです。
もう一つは、順に走査することをクエリプランナが考える程度に早くすることです。これは、バウンダリボックスの「キャッシュ」を行う追加カラムを作成し、このカラムにマッチさせるようにすることで達成することができます。ここでの例では次のようになります。
SELECT AddGeometryColumn('myschema', 'mytable', 'bbox', '4326', 'GEOMETRY', '2');
UPDATE mytable SET bbox = ST_Envelope(ST_Force2D(geom));そして、次のように、&&演算子をgeom_columnに対して行っていたものをbboxに変更します。
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
ときどき、テーブルで3次元、4次元のデータを持つのに、常にOpenGIS準拠のST_AsText()またはST_AsBinary()関数を使ってアクセスして 2次元ジオメトリを出力させるようなことが起きます。内部でST_Force_2d()関数を呼んでいるために発生しますが、これは、大きなジオメトリでは重大なオーバヘッドを誘引することになります。このオーバヘッドを回避するには、一度追加された次元を前もって落とし、かつこれを永続化するのが適当かも知れません。
UPDATE mytable SET geom = ST_Force2D(geom); VACUUM FULL ANALYZE mytable;
AddGeometryColumn()を使ってジオメトリカラムを追加した場合、ジオメトリの次元に関する制限があることに注意してください。この制限を迂回するには、制限の削除が必要になります。geometry_columnsテーブル内のエントリを更新して、その後で制限を再作成することを忘れないで下さい。
大きなテーブルの場合、WHERE節、およびプライマリキー若しくは他の適切な基準によってテーブルの一部へのUPDATEを制限させて、UPDATEの実行の間に単に"VACUUM;"と実行することで、UPDATEをより小さい塊に分割するのが賢いやり方かもしれません。これにより、テンポラリディスクスペースが劇的に減少します。さらに、次元混合のジオメトリを持つ場合、"WHERE dimension(the_geom)>2"によってUPDATEを制限することで、2次元で書かれているジオメトリの再書き込みをスキップさせることができます。
ここで示す関数はPostGISユーザが必要とすると思われる関数です。この他に、一般的なユーザが使わないPostGISオブジェクトに対して求められるサポート関数があります。
![]() | |
PostGISは、既存の名前付け方針からSQL-MM中心の方針への切り替えを開始しています。結果として、ユーザが知っていて愛用している関数の多くが標準空間型 (ST) プレフィクスを使うように名前変更されました。以前の関数はまだ有効ですが、更新された等価な関数があるものについては、この文書の一覧から外しています (訳注: 非推奨関数はPostGIS 2.0では基本的に外れています)。これらの関数は非推奨であり、将来のリリースでは削除されますので、*使わないでください*。 |
このセクションでは、空間データを表現するためにPostGISとともにインストールされたカスタムPostgreSQLデータ型の一覧を示します。
データ型ごとに、型キャストのふるまいが記述されています。型キャストによって、あるデータ型の値が他のデータ型に変換されます。PostgreSQLでは、型を変換するために使われる関数に加えて、ユーザー定義型のキャストのふるまいの定義が可能です。キャストは自動的なふるまいを持つことができ、それによって、関数の引数をその関数が対応する型に自動的に変換できます。
キャストには明示的なふるまいがあります。このふるまいは、キャストはCAST(myval As sometype)またはmyval::sometypeという書式で指定されます。与えられた型に対応していないオーバロード関数を使うときに発生するあいまいなキャストの問題は、明示的なキャストによって回避できます。例えば、関数はbox2dまたはbox3dを受け付けるがジオメトリを受け付けない場合です。ジオメトリはボックス型の両方への自動キャストが可能なため、「あいまいな関数」エラーが発生します。このエラーを防ぐには、求められるボックス型への明示的なキャストを使用します。
全てのデータ型はtextにキャストできます。このため、明示的に指定する必要はありません。
box2d — 2次元バウンディングボックスを表現する型。
box2dは、ジオメトリまたはジオメトリコレクションの、2次元の囲い込んでいるボックスを表現するために使われる空間データ型です。たとえば、集約関数ST_Extentはbox2dインスタンスを返します。
xmin, ymin, xmax, ymaxの値を含む表現。これらは、XとYの範囲の最小値と最大値を示しています。
box2dのテキスト表現はBOX(1 2,5 6)のようになります。
このテーブルでは、このデータ型で許容される明示的なキャストと自動キャストの一覧を挙げます。
| キャスト先 | ふるまい |
|---|---|
| box3d | 自動 |
| geometry | 自動 |
box3d — 3次元バウンディングボックスを表現する型。
box3dは、ジオメトリまたはジオメトリのコレクションを囲む3次元のボックスを表現するために使われる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次整数配列。パス配列は1始まりです (path[1]が最初の要素です)。
ST_Dump*系関数で複雑なジオメトリを構成部品に分解する出力型として使います。
geography — 地理座標系 (回転楕円体)座標系を持つ空間地物を表現する型です。
geographyは、地理座標系上で地物を表現するために使われる空間型です。地理座標系は回転楕円体で地球をモデル化します。
ジオグラフィ型を用いた空間演算によって、回転楕円体モデルを考慮するので、より精度の良い結果が得られます。
このテーブルでは、このデータ型で許容される明示的なキャストと自動キャストの一覧を挙げます。
| キャスト先 | ふるまい |
|---|---|
| geometry | 明示的なキャスト |
これらの関数は、ジオメトリカラムを含むテーブルの定義を支援します。
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'といった、ジオメトリタイプを示す文字でなければなりません。指定したスキーマが存在しない (または現在のsearch_pathからは見えない)場合、または指定したSRID、ジオメトリタイプもしくは次元が不正である場合はエラーが投げられます。
Changed: 2.0.0 geometry_columnsがシステムカタログを読むビューになったため、geometry_columnsを更新しないようになりました。デフォルトでは制約を生成せず、PostgreSQLの型修飾子を使います。この関数によるWGS 84のPOINTカラムの構築とALTER TABLE some_table ADD COLUMN geom geometry(Point,4326);とは等価です。
Changed: 2.0.0 制約を使う必要がある場合には、use_typmodをFALSEにします。
Changed: 2.0.0 ビューについては、geometry_columnsへの手動登録はできなくなりました。しかし、typmodテーブルジオメトリに対して構築されていて、かつラッパ関数が無いビューは、親テーブルカラムのtypmodの挙動を継承するので、正しく登録されます。他のジオメトリを出力するジオメトリ関数を使うビューについては、ビューのジオメトリカラムが正しく登録されるようにするため、typmodジオメトリへのキャストが必要です。「手動でジオメトリカラムをgeometry_columnsに登録する」を参照して下さい。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Enhanced: 2.0.0 use_typmod引数が導入されました。デフォルトでは制約を基にしたものでなくtypmodジオメトリカラムが生成されます。
この例ではデータを保持するスキーマーを生成します。
CREATE SCHEMA my_schema;
スキーマー内に単純なPostgreSQLテーブルを生成します。
CREATE TABLE my_schema.my_spatial_table (id serial);
テーブルの詳細情報でidカラムを出力します。
\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)空間ラカムをテーブルに追加します。
SELECT AddGeometryColumn('my_schema', 'my_spatial_table', 'geom', 4326, 'POINT', 2);古い制約を基にした手法でポイントを追加します。
SELECT AddGeometryColumn('my_schema', 'my_spatial_table', 'geom_c', 4326, 'POINT', 2, false);古い制約を基にした手法で曲線ポリゴンを追加します。
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
新しいカラムについてみるためにテーブルの詳細情報を見ます。
\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)geometry_columnsビューは新しいカラムを登録しています。
SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims FROM geometry_columns WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema';
col_name | type | srid | ndims ----------+--------------+------+------- geom | Point | 4326 | 2 geom_c | Point | 4326 | 2 geomcp_c | CurvePolygon | 4326 | 2
DropGeometryColumn — ジオメトリカラムを空間テーブルから除去します。
text DropGeometryColumn(varchar table_name, varchar column_name);
text DropGeometryColumn(varchar schema_name, varchar table_name, varchar column_name);
text DropGeometryColumn(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name);
ジオメトリカラムを空間テーブルから除去します。schema_nameはgeometry_columnsテーブルの該当行のf_table_schemaフィールドと一致しなければならないことにご注意ください。
![]() | |
|
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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の当該テーブルへの参照の全てを削除します。スキーマ対応版PostgreSQLではスキーマが与えられない場合はcurrent_schema()を使います。
![]() | |
|
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ビュー内で正しく登録されていることを確実にするために空間制約を持つようにします。デフォルトでは、型修飾子を持たないすべてのジオメトリカラムを型修飾子を持つカラムに変換します。
後方互換のためと、それぞれの子テーブルが異なるジオメトリタイプを持つテーブル継承といった空間テーブルにとって必要があるためとの二つの理由から、古いCHECK制約の挙動がなお有効になっています。古い挙動が必要な場合には、新しいオプション引数でuse_typmod=falseを渡す必要があります。これが実行されると、型修飾子なしのジオメトリカラムが生成され、三つの制約が定義されます。特に、これは、テーブルに属するすべてのジオメトリカラムが少なくとも三つの制約を持つことを意味します:
enforce_dims_the_geom - あらゆるジオメトリが同じ次元を持つことを確実にします (ST_NDimsをご覧下さい)
enforce_geotype_the_geom - あらゆるジオメトリが同じ型を持つことを確実にします (GeometryTypeをご覧下さい)
enforce_srid_the_geom - あらゆるジオメトリが同じ投影法になることを確実にします (ST_SRIDをご覧下さい)
テーブルにoidがある場合には、この関数はテーブルのジオメトリカラム全てについて、SRIDと次元とジオメトリタイプを判定して、必要に応じて制約を追加しようとします。 成功した場合には、geometry_columnsに適切な行が追加され、その他の場合には、例外が捕まえられ、問題を記述したエラーが通知されます。
ビューのoidがある場合、テーブルの場合と同じで、SIRDと次元とジオメトリタイプを判定して、適切なエントリをgeometry_columnsテーブルに挿入しますが、制約の追加はされません。
パラメーターの無い形式は、geometry_columnsの行を削除したうえで、全ての空間テーブルと空間ビューについて再挿入し、適切な空間制約をテーブルに追加する、パラメーター付きの形式の単純なラッパーです。パラメーターが無い形式は、検出したジオメトリーカラムの数の要約とgeometry_columnsに挿入された行の数とを返します。パラメーター付きの形式は単純にgeometry_columnsに挿入された行の数を返します。
Availability: 1.4.0
Changed: 2.0.0 デフォルトでは、ジオメトリタイプの制限について、制約を確認する代わりに型修飾子を使います。新しいuse_typmodをFALSEに設定して使うことで、制約確認を使用することができます。
Enhanced: 2.0.0 use_typmod任意引数が導入されました。カラムが型修飾子で生成されるか制約チェックで作られるかの制御ができます。
この例ではtypmodを使法手法でジオメトリーカラムにメタデータを投入します。これが動作するにはデータが存在する必要があります。
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)この例ではtypmodを使っていない場合や既に制約を設定している場合にジオメトリーカラムが制約を使うよう変更します。これが動作するにはデータが存在している必要があります。
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の参照を更新します。カラムが型定義で強制されているなら、型定義は変更されます。ご注意: スキーマ対応版PostgreSQLでは、スキーマが提供されていない場合には、current_schema()を使用します。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
ジオメトリを、EWKT書式を使って、SRIDを持つ道路テーブルに挿入します:
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手続き (訳注: DDLはData Definition Languageの略で、データ構造の操作を行う言語を指し、この場合は CREATE TABLEやALTER TABLE等が該当します)とは同じです:
ALTER TABLE roads ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326) USING ST_SetSRID(geom, 4326);
ロードしたデータの変換座標系が誤りである (またはunknownになっている)けれどもWebメルカトルに一度の処理で変換したい場合、DDLで実行可能ですが、PostGIS管理関数では一度の処理ですむ等価なものはありません。
ALTER TABLE roads ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 3857) USING ST_Transform(ST_SetSRID(geom, 4326), 3857) ;
これらの関数は、ジオメトリーまたはジオグラフィーの値を生成します。プリミティブ、座標値列、既存のジオメトリーを組み立てて、これに続く分析に使うのに適切な空間オブジェクトにします。
ST_Collect — ジオメトリの集合からジオメトリコレクションまたはマルチ系ジオメトリを生成します。
geometry ST_Collect(geometry g1, geometry g2);
geometry ST_Collect(geometry[] g1_array);
geometry ST_Collect(geometry set g1field);
ジオメトリを集めてジオメトリコレクションにします。結果はマルチ系ジオメトリかジオメトリコレクションかのいずれかで、この差は、入力ジオメトリのタイプが同じか異なるか(均質か不均質か)で決まります。入力ジオメトリはコレクション内で変更されることはありません。
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).
Availability: 1.4.0 - ST_Collect(geometry)が導入されました。ST_Collectがより多くのジオメトリをより早く扱えるよう強化されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Two-input variant.
2次元ポイントを収集します。
SELECT ST_Collect(
'POINT(1 2)',
'POINT(-2 3)' );MULTIPOINT((1 2),(-2 3))
2次元ポイントの収集
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 — マルチポイントジオメトリからラインストリングを生成します。
geometry ST_LineFromMultiPoint(geometry aMultiPoint);
マルチポイントジオメトリからラインストリングを生成します。
ポイントまたはラインストリングの入力からラインを生成するにはST_MakeLineを使います。
この関数は3次元に対応し、Z値を削除しません。
マルチポイントジオメトリからラインストリングを生成します。
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)が使われます。
Availability: 1.5
Enhanced: 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 — POINT、MULTIPOINT、LINESTRINGからLINESTRINGを生成します。
geometry ST_MakeLine(geometry geom1, geometry geom2);
geometry ST_MakeLine(geometry[] geoms_array);
geometry ST_MakeLine(geometry set geoms);
ポイント、マルチポイントまたはラインストリングのジオメトリの点を含むラインストリングを生成します。他のジオメトリではエラーが発生します。
1番目の形式: 二つの入力ジオメトリを受け付ける。
2番目の形式: ジオメトリの配列を受け付ける。
形式3: ジオメトリの行集合を受け付ける約関数。入力ジオメトリの順序を確実にするには、関数呼び出しでORDER BYを使うか、ORDER BY節を持つサブクエリを使います。
入力ラインストリングの開始位置で重複するノードはひとつのポイントに減らされます。ポイントとマルチポイントの入力での重複するポイントは減らされません。マルチラインストリングの要素は、コレクション内の出現順で処理されます。出力ラインストリングから重複ポイントを削除するにはST_RemoveRepeatedPointsが使えます。
この関数は3次元に対応し、Z値を削除しません。
Availability: 3.7.0 - マルチラインストリング入力要素への対応が導入されました
Availability: 2.3.0 - MULTIPOINT入力要素への対応が導入されました
Availability: 2.0.0 - LINESTRING入力要素への対応が導入されました
Availability: 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)
二つの3次元ポイントから3次元ラインを生成します。
SELECT ST_MakeLine(ST_MakePoint(1, 2, 3), ST_MakePoint(3, 4, 5));
LINESTRING(1 2 3,3 4 5)
二つの接続されていないラインストリングからラインを生成します。
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));
3次元ポイントの配列から3次元ラインを生成します。
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トラックの集合からポイントの時間ベースのシーケンスを問い合わせています。結果ジオメトリは、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_MakePoint — 2次元、3次元 (XYZ)、4次元のポイントを生成します。
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);
XY 2次元、XYZ 3次元、XYZM 4次元のポイントジオメトリを生成します。XYM座標のポイントを生成するには ST_MakePointM を使用します。
生成したポイントのSRIDを指定するにはST_SetSRIDを使います。
OGC準拠ではありませんが、ST_MakePointはST_GeomFromTextやST_PointFromTextより高速です。また、数値による座標値を使用できます。
![]() | |
地理座標系について、 |
![]() | |
ST_Point, ST_PointZ, ST_PointM, ST_PointZM関数を使用すると、与えられたSRIDを持つポイントを生成することができます。 |
この関数は3次元に対応し、Z値を削除しません。
この例ではSRID不明のポイントを生成します。
SELECT ST_MakePoint(-71.1043443253471, 42.3150676015829);
この例ではWGS 84地理座標系のCRSのポイントを生成します。
SELECT ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829), 4326);
この例ではZ値を持つ3次元ポイントを生成します。
SELECT ST_MakePoint(1, 2, 1.5);
この例ではポイントのZ値を返します。
SELECT ST_Z(ST_MakePoint(1, 2, 1.5));
1.5
ST_MakePointM — X, Y, M値からポイントを生成します。
geometry ST_MakePointM(float x, float y, float m);
X, Y, M座標値を持つポイントを生成します。XY, XYZ, XYZM座標のポイントを生成するにはST_MakePointを使います。
生成したポイントのSRIDを指定するにはST_SetSRIDを使います。
![]() | |
地理座標系について、 |
![]() | |
ST_PointM, ST_PointZM関数を使うと、与えられたSRIDを持ち、M値を持つポイントを生成することができます。 |
不明なSRIDでのポイントを生成します。
SELECT ST_MakePointM(-71.1043443253471, 42.3150676015829, 10);
POINTM(-71.1043443253471 42.3150676015829 10)
WGS 84地理座標系のM値を持つポイントの生成。
SELECT ST_SetSRID(ST_MakePointM(-71.104, 42.315, 10), 4326);
SRID=4326;POINTM(-71.104 42.315 10)
生成したポイントのM値を取得します。
SELECT ST_M(ST_MakePointM(-71.104, 42.315, 10));
10
ST_MakePolygon — 外殻と任意の穴リストとでポリゴンまたは曲線ポリゴンを生成します。
geometry ST_MakePolygon(geometry linestring);
geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);
外殻と任意の穴配列とでポリゴンまたは曲線ポリゴンを生成します。入力ジオメトリーは閉じたLINESTRING、CIRCULARSTRING、COMPOUNDCURVE、NURBSCURVEでなければなりません。いずれかのリングが曲線の場合には結果ジオメトリーはCURVEPOLYGONになります。
形式1: 一つの外側リングを受け付けます。
形式 2: 外側リングと内側リング (穴)の配列を受け付けます。ジオメトリーの配列はPostgreSQLのarray_agg()、ARRAY[]、ARRAY()のいずれかで構築できます。
![]() | |
この関数はマルチラインストリングを受け付けません。ラインストリングの生成にはST_LineMergeを使用します。また、ラインストリングを抽出するにはST_Dumpを使用します。 |
この関数は3次元に対応し、Z値を削除しません。
Enhanced: 3.7.0 - 曲線の入力リングへの対応が導入されました。
Single input variant.
2次元ラインストリングからポリゴンを生成します。
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;
3次元ラインストリングからポリゴンを生成します。
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))
M値を持つラインストリングからポリゴンを生成します。
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))
CURVEPOLYGONからCIRCULARSTRINGの外側リングを生成します。
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で単一のLINESTRINGに強制します(県が二つ以上の領域を持つか島を持つ場合には、不正なポリゴンを生成します)。LEFT JOINを使って、湖の無い県を含む全ての県が返ることを保証しています。
![]() | |
NULL配列をST_MakePolygonに渡すとNULLが返るので、CASE式を使っています。 |
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の座標値からポイントを返します。これは、XとYを取るSQL-MMのST_MakePointと同等です。
![]() | |
地理座標系について、 |
Enhanced: 3.2.0 SRID任意引数が追加されました。古いバージョンでは、ジオメトリにSRIDを与えるにはST_SetSRIDを併用しなければなりませんでした。
このメソッドはSQL/MM仕様の実装です。 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等)でない場合には、ジオグラフィにキャストする前に座標系変換を行う必要があります。この例では、ペンシルバニア州平面フィート (SRID 2273)上のポイントをWGS84 (SRID 4326)に座標系変換を行っています。
SELECT ST_Transform(ST_Point(3637510, 3014852, 2273), 4326)::geography;
ST_PointZ — X, Y, ZとSRIDの値からポイントを生成します。
geometry ST_PointZ(float x, float y, float z, integer srid=unknown);
与えたX,Y,Z座標値を持ち、与えた場合はSRID値も持つポイントを生成します。
Enhanced: 3.2.0 SRID任意引数が追加されました。古いバージョンでは、ジオメトリにSRIDを与えるにはST_SetSRIDを併用しなければなりませんでした。
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値も持つポイントを生成します。
Enhanced: 3.2.0 SRID任意引数が追加されました。古いバージョンでは、ジオメトリにSRIDを与えるにはST_SetSRIDを併用しなければなりませんでした。
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値も持つポイントを生成します。
Enhanced: 3.2.0 SRID任意引数が追加されました。古いバージョンでは、ジオメトリにSRIDを与えるにはST_SetSRIDを併用しなければなりませんでした。
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5, 4326)
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5, srid => 4326)
SELECT ST_PointZM(-71.104, 42.315, 3.4, 4.5)
ST_Polygon — ラインストリングから指定したSRIDを持つポリゴンを生成します。
geometry ST_Polygon(geometry lineString, integer srid);
与えられたラインストリングから構築し、sridから空間参照系を指定したポリゴンを返します。
ST_PolygonはST_MakePolygonの形式1の、SRIDの設定を追加したものに似ています。
穴を持つポリゴンを生成するには、ST_MakePolygonの形式2を使い、ST_SetSRIDを使います。
![]() | |
この関数はマルチラインストリングを受け付けません。ラインストリングの生成にはST_LineMergeを使用します。また、ラインストリングを抽出するにはST_Dumpを使用します。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.3.2
この関数は3次元に対応し、Z値を削除しません。
2次元ポリゴンを生成します。
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))
3次元ポリゴンを生成します。
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))
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 tile systemでのタイルの範囲を示す長方形ポリゴンを生成します。タイルはズームレベルを示すZと、そのレベルでのタイルインデックスを示すX, Yで指定します。ST_AsMVTGeomでジオメトリをMVTタイルの座標空間に変換のために必要なタイル境界を定義するために使います。
デフォルトでは、タイルエンベロープの座標系はWeb Mercator (SRID: 3857)で、標準的なウェブメルカトルの範囲 (-20037508.342789, 20037508.342789)を取ります。これがMVTタイルで使用される最も標準的な座標系です。任意パラメータboundsを使うと、あらゆる座標系のタイルを生成することができます。SRIDを持ち、ズームレベル0の時の、ジオメトリのXYZタイルシステムが内側に存在する矩形を示すジオメトリを与えます。
任意パラメータmarginは、タイルを与えられた割合だけ拡張するために使います。たとえばmargin=0.125と指定すると、12.5%拡張します。これは、ST_AsMVTGeomで使われている、タイルサイズが4096の時にbuffer=512と指定するのと等価です。タイル表示領域の外側にバッファを生成するために使いますが、この範囲はタイル描画に影響を与えます。たとえば、市名 (ポイント)を一つのタイルの端付近にあっても、そのラベルが二つのタイルで描画されるべきです。拡張したタイルをクエリで使うと、両方のタイルに市名のポイントが含まれることになります。負数を指定すると反対に縮小します。-0.5より小さい値は、タイルを完全に消すことになるので、許可されません。ST_AsMVTGeomと併用する時はマージンを指定しないでください。ST_AsMVTの例をご覧下さい。
Enhanced: 3.1.0 marginパラメータが追加されました。
Availability: 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です。
六角形の辺の長さを2倍または3倍にすることで、元のタイルに適合する新しい親タイルが生成されます。残念ながら子タイルが完全に親タイルの中に入るような親六角形タイルを生成することはできません。
Availability: 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_Hexagon — 与えられたエッジサイズと六角形グリッド空間内のセル座標を使って単一の六角形を返します。
geometry ST_Hexagon(float8 size, integer cell_i, integer cell_j, geometry origin);
ST_HexagonGridと同じ六角形タイルの概念を使いますが、求めるセルの座標に一つだけの六角形を生成します。任意でタイルの原点の座標を調整できます。デフォルトの原点座標は0,0です。
六角形はSRIDの設定なしで生成されるので、SRIDを期待する値に設定するためにST_SetSRIDを使います。
Availability: 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原点から始まり、一意の平面の正方形タイル(SRS, Size)が一つ存在します。この関数は、与えられたタイル(SRS, Size)内のグリッド内のどのタイルが与えられた境界とオーバラップするかという問題に答えを出します。
出力正方形のSRSは境界ジオメトリのSRSです。
正方形の2倍またはエッジサイズによって、新しい親タイルが生成されます。親タイルは完全に元のタイルに適合します。標準のウェブマップにおけるメルカトルのタイルは、メルカトル平面の2の累乗での正方形です。
Availability: 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_Square — 与えられたエッジサイズと六角形グリッド空間内のセル座標を使って単一の正方形を返します。
geometry ST_Square(float8 size, integer cell_i, integer cell_j, geometry origin='POINT(0 0)');
ST_SquareGridと同じ正方形タイルの概念を使っていますが、求めるセルの座標に一つだけの正方形を生成します。任意でタイルの原点の座標を調整できます。デフォルトの原点座標は0,0です。
与えられた原点のSRIDで正方形が生成されます。与える原点のSRIDが不明 (デフォルトのまま)の場合にはST_SetSRIDを使ってSRIDを設定します。
Availability: 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マッピングと、ディセンダからキャピタルまでの1000単位の高さを持つフォント形状のTWKBをbase64エンコードしたものを渡します。
テキストは、デフォルトでは原点に生成されるので、テキストの位置変更とサイズ変更とを行います。最初にST_Scale関数を適用し、その後ST_Translate関数を適用します。
Availability: 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 — 制御点からNURBS (非一様有理Bスプライン)曲線を生成します。任意で重みとノットベクトルを与えられます。
geometry ST_MakeNurbsCurve(integer degree, geometry control_points, float8[] weights, float8[] knots);
指定したパラメーターからNURBS (非一様有理Bスプライン)曲線ジオメトリを生成します。NURBS曲線は平滑化される媒介変数曲線で、制御点、重み、ノットベクトルで曲線形状を精密に制御できます。
degreeパラメーターで曲線の多項式次数を指定します (1と10の間でなければなりません)。最高次数で滑らかな曲線が作られます。
control_pointsは制御ポリゴンを定義するLINESTRINGでなければなりません。制御点の数は最低でもdegree + 1個が必要です。
任意パラメーターweights配列は制御点ごとの重みを割り当てるものです。全ての重みは正の数である必要があります。NULLまたは省略された場合には重みは一様に 1.0 が使われるので、非有理のBスプラインになります。
任意パラメーターknots配列はパラメーター空間を定義します。NULLまたは省略された場合には、クランプされた一様のノットベクトルが自動的に生成されます。ノットベクトルを与えた場合には、(npoints + degree + 1)を確実に持たなければならず、かつ降順であってはなりません。
Availability: 3.7.0
この例では次数2のNURBS曲線を一様の重みで生成しています。
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)))
この例では有理のNURBS曲線を独自の重みを指定して生成しています。
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 - このジオメトリインスタンスがメンバーになっているジオメトリのインスタンス化可能な派生タイプの名前を返します。インスタンス化可能な派生タイプの名前は、文字列として返されます。
![]() | |
この関数は、'POINTM'等が返るので、ジオメトリがM値を持っているかどうかも示します。 |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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);
ジオメトリの組み合わせ境界の閉包を返します (訳注: ラインストリングは端点、ポリゴンはエッジ、複合オブジェクトは境界のうち奇数番)。組み合わせ境界はOGC仕様の3.12.3.2節に記述されています。結果として出てくる境界は、OGC SPEC 3.12.2で議論されているように、ジオメトリプリミティブを使って表現できます。
GEOSモジュールで実現しています。
![]() | |
2.0.0より前の版では、この関数は |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 OGC SPEC s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 5.1.17
この関数は3次元に対応し、Z値を削除しません。
Enhanced: 2.1.0 三角対応が導入されました。
Changed: 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)
この例では3次元ポリゴンを使用しています。
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)
この例では3次元マルチラインストリングを使用しています。
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 EMPTYとなります。
fitsパラメータは、最良適合が必要かどうかを指定するものです。FALSEの場合には、幾分大きめなバウンディングボックスの対角線を受け付けることができます (多数の頂点からなるジオメトリの取得が早くなります)。いずれにしても返された対角線のバウンディングボックスは常に入力ジオメトリを含みます。
返されるラインストリングは常に、入力ジオメトリのSRIDと次元 (ZとMがあること)を維持します。
![]() | |
縮退した (入力の頂点が一つ)場合、返されるラインストリングは形式的に不正です (内部が無い)。トポロジ的には妥当です。 |
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
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)
この例では、ポイントをバッファーで広げたときのminimum X座標が返されます。
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値の座標次元を返します。
この関数はST_NDimsのMM対応の別名です。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.3
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 — ST_Geometry値の座標次元を返します。
integer ST_Dimension(geometry g);
ジオメトリの固有次元を返します。ジオメトリは座標次元以下でなければなりません。OGC SPEC s2.1.1.1 - 0ならPOINT、1ならLINESTRING、2ならPOLYGONで、GEOMETRYCOLLECTIONの場合は要素ごとの次元の最大値です。不明なジオメトリ (空のGEOMETRYCOLLECTION等)の場合はNULLが返ります。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.2
![]() | |
A |
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。空ジオメトリを与えた場合に例外を投げなくなりました。
![]() | |
2.0.0より前では、空ジオメトリを与えると例外を投げていました。 |
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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=Set-Returning Function)です。geometry_dump行の集合を返します。各要素はジオメトリ (geomフィールド)と整数配列 (pathフィールド)からなります。
非マルチ系ジオメトリタイプ (POINT,LINESTRING,POLYGON)では、path配列が空でgeomが入力ジオメトリと同じになる単一の行が返ります。コレクションまたはマルチ系ジオメトリでは、個々の要素と、コレクションの要素位置を示すpathとからなる行を返します。
ST_Dumpはジオメトリを展開するのに使います。ST_Collect/GROUP BYの逆で、この関数の中で新行を作成します。たとえば、MULTIPOLYGONをPOLYGONに展開するために使います。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Availability: PostGIS 1.0.0RC1。PostgreSQL 7.3以上が必要です。
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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)
この例では、多面体サーフェスをフェイスに分解します。
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))この例ではTINジオメトリーを使います。
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=Set-Returning Function)です。geometry_dump行の集合を返します。各要素はジオメトリ (geomフィールド)と整数配列 (pathフィールド)からなります。
geomフィールドには、与えられたジオメトリの座標を表現するPOINTが入ります。
pathフィールド (integer[])は、与えられたジオメトリの要素内の座標位置を列挙するインデックスです。インデックスは1始まりです。たとえば、LINESTRINGに対しては、LINESTRINGのn番目の座標をiとすると、{i}となります。POLYGONに対しては、iを環番号 (1が外環、続いて内環)、jを環の座標位置とすると、{i,j}となります。
座業を含む単一ジオメトリを取得するにはST_Pointsを使います。
Enhanced: 2.1.0 速度向上しました。C言語で実装しなおしました。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Availability: 1.5.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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))
この例では多面体サーフェスで表現した立方体を使います。
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)この例ではTRIANGLEジオメトリーを使います。
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)この例ではTINジオメトリーを使います。
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=Set-Returning Function)です。geometry_dump行の集合を返します。各要素はジオメトリ (geomフィールド)と整数配列 (pathフィールド)からなります。
geomフィールドのLINESTRINGは与えられたジオメトリの線分を表現し、CIRCULARSTRINGは円弧線分を表現します。
pathフィールド (integer[])は、与えられたジオメトリの要素内の辺の始点位置を列挙するインデックスです。インデックスは1始まりです。たとえば、LINESTRINGに対しては、LINESTRINGのn番目の辺をiとすると、{i}となります。POLYGONに対しては、iを環番号 (1が外環、続いて内環)、jを環の辺の始点位置とすると、{i,j}となります。
Availability: 3.2.0
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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)この例ではTRIANGLEジオメトリーを使います。
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)この例ではTINジオメトリーを使います。
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=Set-Returning Function)です。geometry_dump行の集合を返します。各要素はジオメトリ (geomフィールド)と整数配列 (pathフィールド)からなります。
geomフィールドは、各々のリングをPOLYGONとして持ります。pathフィールドはリングのインデックス番号を持つ配列長1の整数配列です。外側リング (外周)はインデックス番号が0番になります。内側リング (穴)は1以上になります。
![]() | |
これはPOLYGONジオメトリーでだけ動作します。MULTIPOLYGONでは動作しません。ポリゴン系ジオメトリーからポリゴン要素を抽出するにはST_Dumpを使います: |
Availability: PostGIS 1.1.3 PostgreSQL 7.3以上が必要です。
この関数は3次元に対応し、Z値を削除しません。
全てのリングのポリゴンとしての抽出。
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 — LINESTRING, CIRCULARLINESTRING, NURMSCURVE の最後のポイントを返します。
geometry ST_EndPoint(geometry g);
LINESTRING, CIRCULARLINESTRING, NURBSCURVE の最後のポイントをPOINTで返します。入力がLINESTRING, CIRCULARLINESTRING, NURBSCURVEのいずれでもない場合には NULLを返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.4
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Changed: 2.0.0 一つのジオメトリマルチラインストリングで動作しなくなりました。PostGIS の古いバージョンでは、この関数は一つのマルチラインストリングで動作し、終端ポイントを返します。2.0.0では、他のマルチラインストリングと同様にNULLを返します。古い動作は文書化されていない機能でしたが、データをLINESTRINGとして格納していると思われるユーザーは、2.0.0 でNULLが返されることを経験するかも知れません。
ラインストリングの終端ポイント
SELECT ST_EndPoint('LINESTRING(1 1,2 2,3 3)'::geometry);POINT(3 3)
ラインストリング以外の終端ポイントはNULL
SELECT ST_EndPoint('POINT(1 1)'::geometry) IS NULL AS is_null;t
3次元ラインストリングの終端ポイント
3次元終端。
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)
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を返します。
Availability: 1.5.0 挙動が変更され出力がfloat4からfloat8になりました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 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 — ポリゴンの外環を表現するラインストリングを返します。
geometry ST_ExteriorRing(geometry a_polygon);
POLYGONの外環を表現するLINESTRINGを返します。ジオメトリがポリゴンでない場合はNULLを返します。
![]() | |
この関数はマルチポリゴンでは動作しません。マルチポリゴンに対してはST_GeometryNまたはST_Dumpを併用して下さい。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 2.1.5.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.3, 8.3.3
この関数は3次元に対応し、Z値を削除しません。
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.
![]() | |
OGC仕様のため0.8.0版からインデックスを1始まりにしています。これより前の版では0始まりになっています。 |
![]() | |
ジオメトリの全ての要素を抽出するにはST_Dumpの方が効率的ですし、単一ジオメトリでも動作します。 |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Changed: 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.
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.1.5
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
3次元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'が付き、M値を持っているかを示しません。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.4
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
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を返します。
Availability: 1.2.3?
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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番目の内環を返します。ジオメトリがポリゴンでないかNが範囲外の場合はNULLを返します。
![]() | |
この関数はマルチポリゴンでは動作しません。マルチポリゴンに対してはST_GeometryNまたはST_Dumpを併用して下さい。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.6, 8.3.5
この関数は3次元に対応し、Z値を削除しません。
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 — 複合曲線内の曲線の数を返します。
integer ST_NumCurves(geometry a_compoundcurve);
複合曲線内の曲線の数を返します。入力が空の複合曲線の場合には0を返し、複合曲線でない場合にはNULLを返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.6, 8.3.5
この関数は3次元に対応し、Z値を削除しません。
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 — 複合曲線のN番目の曲線ジオメトリを返します。
geometry ST_CurveN(geometry a_compoundcurve, integer index);
複合曲線のN番目の曲線ジオメトリを返します。インデックスは1始まりです。ジオメトリが複合曲線でない場合やインデックスが範囲外の場合にはNULLを返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.6, 8.3.5
この関数は3次元に対応し、Z値を削除しません。
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_IsClosed — ラインストリングの始点と終点が一致しているかをテストします。多面体サーフェスについては閉じているか (立体であるか)をテストします。
boolean ST_IsClosed(geometry g);
LINESTRINGの始点と終点が一致する場合にTRUEを返します。多面体サーフェスについては、サーフェスが面 (開いている)か立体 (閉じている)かをテストします。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.5, 9.3.3
![]() | |
SQL-MMでは |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
この関数は多面体サーフェスに対応しています。
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
この例では立方体を使います。
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
この例では、同じ立方体だけれども一面が抜けているものを使います。
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を返します。コレクションは次の通りです。
ジオメトリコレクション
マルチポイント、マルチポリゴン、マルチラインストリング、マルチ曲線、マルチサーフェス
複合曲線
![]() | |
この関数はジオメトリのタイプを解析します。これは、空のコレクションである場合、または一つのエレメントを持つコレクションである場合には |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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を返します。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.7
このメソッドは曲線ストリングと曲線に対応しています。
Changed: 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を返します。
![]() | |
閉じたラインストリングはポリゴン要素とみなされません。単一の閉じたラインストリングを渡すと、右回り左回りにかかわらずTRUEが得られます。 |
![]() | |
ポリゴン要素の内環が逆回りになっていない (すなわち外環と同じ方向で回る内環が1個以上ある)場合には、ST_IsPolygonCWとST_IsPolygonCCW の両方ともにFALSEを返します。 |
Availability: 2.4.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
ST_IsPolygonCW — ポリゴンが時計回りの外環を持っていて、反時計回りの内環を持っているかをテストします。
boolean ST_IsPolygonCW(geometry geom);
入力ジオメトリの全てのポリゴン要素の外環については時計回りで、全ての内環については反時計回りである場合には、TRUEを返します。
ジオメトリがポリゴン要素を持っていない場合にはTRUEを返します。
![]() | |
閉じたラインストリングはポリゴン要素とみなされません。単一の閉じたラインストリングを渡すと、右回り左回りにかかわらずTRUEが得られます。 |
![]() | |
ポリゴン要素の内環が逆回りになっていない (すなわち外環と同じ方向で回る内環が1個以上ある)場合には、ST_IsPolygonCWとST_IsPolygonCCW の両方ともにFALSEを返します。 |
Availability: 2.4.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
ST_IsRing — ラインストリングが閉じていてかつ単純であるかをテストします。
boolean ST_IsRing(geometry g);
TRUEとなるのは LINESTRING がST_IsClosed (ST_StartPoint(g) ~= ST_EndPoint(g))かつ ST_IsSimple (事故接触していない)の場合です。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 2.1.5.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.6
![]() | |
SQL-MMでは |
SELECT ST_IsRing(geom), ST_IsClosed(geom), ST_IsSimple(geom) FROM (SELECT 'LINESTRING(0 0,0 1,1 1,1 0,0 0)'::geometry AS geom) AS foo;
st_isring | st_isclosed | st_issimple -----------+-------------+------------- t | t | t (1 row)
SELECT ST_IsRing(geom), ST_IsClosed(geom), ST_IsSimple(geom) FROM (SELECT 'LINESTRING(0 0,0 1,1 0,1 1,0 0)'::geometry AS geom) AS foo;
st_isring | st_isclosed | st_issimple -----------+-------------+------------- f | t | f (1 row)
ST_IsSimple — ジオメトリが自己インタセクトまたは自己接触となるポイントが無いかをテストします。
boolean ST_IsSimple(geometry geomA);
ジオメトリが自己インタセクションや自己接触のような異常な幾何学ポイントを持っていない場合にTRUEを返します。OGCのジオメトリ単純性と妥当性の定義に関する詳細情報については「ジオメトリのOpenGIS準拠を確実にする」をご覧ください。
![]() | |
SQL-MMでは、ST_IsSimple(NULL)は0を返しますが、PostGISではNULLを返します。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.8
この関数は3次元に対応し、Z値を削除しません。
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仕様に入っていませんが、ポイント座標抽出関数のリストを完全にするために挙げています。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。
この関数は3次元に対応し、Z値を削除しません。
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_Mem_Sizeより小さいバイト数が返ります。これはpg_relation_sizeがTOAST化されたテーブルの寄与を追加せず、TOASTテーブルに格納された大きなジオメトリを加えないためです。 pg_total_relation_size - テーブル、TOASTテーブル、インデックスを含みます。 pg_column_sizeは、ジオメトリがカラム内で取る領域がどれだけかを、圧縮を考慮して返します。そのため、ST_MemSizeより小さくなることがあります。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
Changed: 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 — ST_Geometry値の座標次元を返します。
integer ST_NDims(geometry g1);
ジオメトリの座標次元返します。PostGISでは、2 - (X,Y), 3 - (X,Y,Z), (X,Y,M), 4 - (X,Y,Z,M)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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);
ジオメトリのポイントの数を返します。全てのジオメトリに対して動作します。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
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と違い、外環も数えます。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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を返します。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Changed: 2.0.0 前の版では、ジオメトリがコレクション/マルチ系でない場合にはNULLを返しました。2.0.0以上では、POLYGON, LINESTRING, POINTといった単一ジオメトリについては1を返します。
Changed: 3.6.0 TIN and PolyhedralSurface are treated as unitary geometries and return 1; use ST_NumPatches to count faces.
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.1.4
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例では1を返します。前のバージョンでは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を返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.5
Changed: 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.
Availability: 2.0.0
この関数は3次元に対応し、Z値を削除しません。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM ISO/IEC 13249-3: 8.5
この関数は多面体サーフェスに対応しています。
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 — ラインストリングまたは曲線ストリングのポイント数を返します。
integer ST_NumPoints(geometry g1);
ST_LineStringまたはST_CircularStringのポイント数を返します。1.4より前は仕様通りにラインストリングにのみ対応していました。1.4以上ではラインストリングだけでなく頂点数を返すST_NPointsの別名です。多目的で多数のジオメトリタイプで動作するST_NPointsを使うことを考えて下さい。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 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が最も効率的です。 |
Availability: 2.0.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM ISO/IEC 13249-3: 8.5
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
多面体サーフェスの2番目のフェイスを抽出します。
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_PointN — ジオメトリの最初のラインストリングまたは曲線ストリングのN番目のポイントを返します。
geometry ST_PointN(geometry a_linestring, integer n);
ラインストリングまたは曲線ストリングのN番目の点を返します。負数はラインストリングの終端から逆方向に遡って数えます。-1は終端を指します。ジオメトリにラインストリングが無い場合には、NULLを返します。
![]() | |
OGC仕様では0.8.0版から要素番号は1始まりです。逆方向要素番号 (負の要素番号)はOGC仕様にはありません。前の版では0始まりで実装していました。 |
![]() | |
マルチラインストリング内のラインストリングのN番目のポイントを得るには、ST_Dumpを併用します。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.2.5, 7.3.5
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Changed: 2.0.0 単一ジオメトリのMULTILINESTRINGで動作しなくなりました。単一のラインストリングからなるMULTILINESTRINGについては幸運にも動いていて、最初のポイントを返していました。2.0.0では他のMULTILINESTRINGと同様にNULLを返すようになりました。
Changed: 2.3.0 : 負数インデックスが有効になりました (-1は終端を指します)
この例では一つのLINESTRINGから全てのPOINTジオメトリーを抽出します。
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)
この例ではCIRBULARSTRINGを使います。
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 — ジオメトリの全ての座標を含むマルチポイントを返します。
geometry ST_Points( geometry geom );
ジオメトリの全ての座標を含むマルチポイントを返します。リングジオメトリの始点と終点を含む重複ポイントは保存されます (重複ポイントの削除が必要ならST_RemoveRepeatedPointsを呼ぶと削除した結果が得られます)。
親ジオメトリの個々の座標のポイントに関する情報を取得するにはST_DumpPointsを使います。
M値とZ値が存在する場合には保持されます。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
Availability: 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 — LINESTRING, CIRCULARSTRING, NURBSCURVE の最初のポイントを返します。
geometry ST_StartPoint(geometry geomA);
LINESTRING, CIRCULARLINESTRING, NURBSCURVEジオメトリーの最初のポイントをPOINTで返します。他のジオメトリーを与えた場合には、座標の並び順で最初のポイントを返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.3
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Enhanced: 3.2.0 全てのジオメトリのポイントを返すようになりました。以前のバージョンではラインストリング以外ではNULLを返していました。
Changed: 2.0.0 一つのMULTILINESTRINGで動作しなくなりました。PostGIS の古いバージョンでは、この関数は、一つのラインストリングからなるMULTILINESTRINGについては幸運にも動いていて、始端ポイントを返していました。2.0.0では他のMULTILINESTRINGと同様にNULLを返すようになりました。古い動作は文書化されていない機能でしたが、データをLINESTRINGとして格納していると思われるユーザーは、2.0.0 でNULLが返されることを経験するかも知れません。
ラインストリングの始端ポイント
SELECT ST_StartPoint('LINESTRING(0 1,0 2)'::geometry);POINT(0 1)
ポイントの始端ポイントはそのポイント自体です
SELECT ST_StartPoint('POINT(0 1)'::geometry);POINT(0 1)
3次元ラインストリングの始端ポイント
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)
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 — LINESTRING, CIRCULARLINESTRING, NURBSCURVE の最初のポイントのM値を返します。
float8 ST_StartM(geometry geom);
LINESTRING, CIRCULARLINESTRING, NURBSCURVEジオメトリーの最初のポイントのM値を返します。入力ジオメトリーがM値を持っていないか、LINESTRING, CIRCULARLINESTRING, NURBSCURVEのいずれえでもない場合には、 NULLが返ります。
このメソッドは曲線ストリングと曲線に対応しています。
LINESTRINGの最初のM値
SELECT ST_StartM('LINESTRING M(0 0 10,1 1 20,2 0 30)'::geometry);10
CIRCULARSTRINGの最初のM値
SELECT ST_StartM('CIRCULARSTRING M(0 0 5,1 1 10,2 0 15)'::geometry);5
NURBSCURVEの最初のM値
SELECT ST_StartM('NURBSCURVE M(2, (0 0 100, 1 1 200, 2 0 300))'::geometry);100
M値を持たないジオメトリーについてはNULLを返します
SELECT ST_StartM('LINESTRING(0 0,1 1)'::geometry) IS NULL AS is_null;t
ST_EndM — LINESTRING, CIRCULARSTRING, NURBSCURVEの最後のポイントのM値を返します。
float8 ST_EndM(geometry geom);
LINESTRING, CIRCULARLINESTRING, NURBSCURVEジオメトリーの最後のポイントのM値を返します。M値を持たないか、LINESTRING, CIRCULARLINESTRING, NURBSCURVEのいずれでもない場合にはNULLを返します。
このメソッドは曲線ストリングと曲線に対応しています。
LINERSTRINGの終端のM値
SELECT ST_EndM('LINESTRING M(0 0 10,1 1 20,2 0 30)'::geometry);30
CIRCULARRSTRINGの終端のM値
SELECT ST_EndM('CIRCULARSTRING M(0 0 5,1 1 10,2 0 15)'::geometry);15
NURBSCURVEの終端のM値
SELECT ST_EndM('NURBSCURVE M(2, (0 0 100, 1 1 200, 2 0 300))'::geometry);300
M値を持たないジオメトリーについてはNULLを返します
SELECT ST_EndM('LINESTRING(0 0,1 1)'::geometry) IS NULL AS is_null;t
ST_SetStartM — LINESTRING, CIRCULARSTRING, NURBSCURVEの最初のポイントのM値を設定します。
geometry ST_SetStartM(geometry geom, float8 m);
LINESTRING, CIRCULARLINESTRING, NURBSCURVEの入力ジオメトリーに対して、最初のポイントに指定したM値を設定した複製を返します。入力ジオメトリーがM値を持っていない場合には、M軸を追加します。 入力ジオメトリーがLINESTRING, CIRCULARLINESTRING, NURBSCURVEでない場合には、NULLを返します。
このメソッドは曲線ストリングと曲線に対応しています。
LINESTRINGの始端のM値を設定します
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)
M軸を追加して始端にM値を設定します
SELECT ST_SetStartM('LINESTRING(0 0,1 1,2 0)'::geometry, 50);LINESTRING M (0 0 50,1 1 0,2 0 0)
CIRCULARSTRINGの始端のM値を設定します
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)
NURBSCURVEの始端のM値を設定します
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 — LINESTRING, CIRCULARSTRING, NURBSCURVEの終端のM値を設定します。
geometry ST_SetEndM(geometry geom, float8 m);
LINESTRING, CIRCULARLINESTRING, NURBSCURVEの入力ジオメトリーに対して、最後のポイントに指定したM値を設定した複製を返します。入力ジオメトリーがM値を持っていない場合には、M軸を追加します。 入力ジオメトリーがLINESTRING, CIRCULARLINESTRING, NURBSCURVEでない場合には、NULLを返します。
このメソッドは曲線ストリングと曲線に対応しています。
LINESTRINGの終端のM値を設定します
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)
M軸を追加して終端のM値を設定します
SELECT ST_SetEndM('LINESTRING(0 0,1 1,2 0)'::geometry, 75);LINESTRING M (0 0 0,1 1 0,2 0 75)
CIRCULARSTRINGの終端のM値を設定します
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)
NURBSCURVEの終端のM値を設定します
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: 空間参照系を持ちます
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
Availability: 1.2.2
Enhanced: 2.0.0でジオグラフィ対応が追加されました。
Enhanced: 2.1.0 空間参照系を持つかを示すSフラグが追加されました。
Enhanced: 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を返します。入力はポイントでなければなりません。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 6.1.3
この関数は3次元に対応し、Z値を削除しません。
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を返します。入力はポイントでなければなりません。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 6.1.4
この関数は3次元に対応し、Z値を削除しません。
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を返します。入力はポイントでなければなりません。
このメソッドはSQL/MM仕様の実装です。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_Z('POINT(1 2 3 4)');3
ST_ZMFlag — ジオメトリのZM座標次元を示す符号を返します。
smallint ST_ZMFlag(geometry geomA);
ジオメトリのZM座標次元を示す符号を返します。
値は 0=XY, 1=XYM, 2=XYZ, 3=XYZMとなります。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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値を持つジオメトリオブジェクトは3次元 (3D)ジオメトリを表現し、Z値を持たないものは2次元 (2D)ジオメトリとなります。
この関数はジオメトリが標高や高さに関する情報を持つかどうかを判断するのに使います。
Availability: 3.5.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
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次元を持つジオメトリオブジェクトは通常、空間地物に関連付けられた計測値または追加データを表現します。
この関数はジオメトリがM値に関する情報を持つかどうかを判断するのに使います。
Availability: 3.5.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
SELECT ST_HasM('POINTM(1 2 3)');t
SELECT ST_HasM('LINESTRING(0 0,1 1)');f
ST_ControlPoints — NURBS曲線から制御点をMULTIPOINTで返します。
geometry ST_ControlPoints(geometry nurbscurve);
NURBS曲線から制御点を抽出してMULTIPOINTで返します。制御点はNURMS曲線の形状に影響を与える制御ポリゴンを定義します。
入力がNURBS曲線でない場合にはエラーが発生します。入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例ではNURBS曲線から制御点を抽出します。
SELECT ST_ControlPoints('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);MULTIPOINT((0 0),(5 10),(10 0))
この例では制御点数を数えます。
SELECT ST_NPoints(ST_ControlPoints('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry));3
ST_Degree — NURBS曲線の多項式次数を返します。
integer ST_Degree(geometry nurbscurve);
NURBS曲線の多項式次数を整数で返します。次数で曲線の滑らかさと柔軟性が決まります。次数が高いほどより滑らかな曲線になりますが、より多くの制御点が必要となります。
入力がNURBS曲線でない場合にはエラーが発生します。入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例ではNURBS曲線の次数を返します。
SELECT ST_Degree('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);2
この例ではNURBS曲線が3次かどうかを調べます。
SELECT ST_Degree('NURBSCURVE(3, (0 0, 2 5, 5 8, 10 0))'::geometry) = 3;t
ST_Weights — 有理NURBS曲線の重み配列を返します。
float8[] ST_Weights(geometry nurbscurve);
有理NURBS曲線の重み値を倍精度浮動小数点数配列で返します。重みによって曲線上の制御点がそれぞれ与える影響を制御します。重みが大きいほど曲線が対応する制御点に近くなります。
曲線に重みが無い場合 (非有理Bスプラインである場合)にはNULLを返します。
Availability: 3.7.0
この例では有理NURBS曲線から重みを返します。
SELECT ST_Weights(ST_MakeNurbsCurve(2, 'LINESTRING(0 0,5 10,10 0)'::geometry, ARRAY[1.0, 2.0, 1.0]));
{1,2,1}この例では非有理曲線の重みを調べます。
SELECT ST_Weights('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);null
ST_Knots — NURBS曲線のノットベクトル (knot vector)を返します。
float8[] ST_Knots(geometry nurbscurve);
NURBS曲線のノットベクトル (knot vector)を倍精度浮動小数点数配列で返します。ノットベクトルはパラメーター空間を決め、制御点が曲線に影響を与える場所と強さを制御します。返り値は必ず (制御点数+次数+1)に等しい長さで、昇順になります。
曲線がデフォルトの開一様ノットベクトルを使う場合、または入力がNULLの場合にはNULLを返します。入力がNURBS曲線でない場合にはエラーが発生します。
Availability: 3.7.0
この例では独自のノットベクトルを持つNURBS曲線からノットベクトルを返します。
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}この例ではデフォルトのノットベクトルを使っている曲線のノットベクトルを調べます。
SELECT ST_Knots('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);null
ST_NumControlPoints — NURBS曲線内の制御点の数を返します。
integer ST_NumControlPoints(geometry nurbscurve);
NURBS曲線内の制御点の数を返します。妥当なNURBS曲線では制御点数は少なくとも (次数+1)個あります。
入力がNURBS曲線でない場合にはエラーが発生します。入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例では制御点数を返します。
SELECT ST_NumControlPoints('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);3
この例では曲線が次数に対して十分な制御点を持っているかを確認します。
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 — NURBS曲線が有理である (重みをもつ)かを調べます。
boolean ST_NurbsCurveIsRational(geometry nurbscurve);
NURBS曲線がその制御点に重みが割り当てられている場合にはTRUEを返します。一様の重みが使われている場合 (非有理Bスプラインの場合)にはFALSEを返します。
有理NURBS曲線は、曲線形状で可変の重み付けによって、より柔軟になります。非有理Bスプラインでは一様の重みを使うもので、NURBS曲線の特別な場合です。
入力がNURBS曲線でない場合にはエラーが発生します。入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例では曲線が有理であるかどうかを調べます。
SELECT ST_NurbsCurveIsRational(ST_MakeNurbsCurve(
2,
'LINESTRING(0 0,5 10,10 0)'::geometry,
ARRAY[1.0, 2.0, 1.0]));t
この例では非有利な曲線を調べます。
SELECT ST_NurbsCurveIsRational('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);f
ST_IsNurbsCurve — ジオメトリーがNURBS曲線であるかどうかを調べます。
boolean ST_IsNurbsCurve(geometry geom);
ジオメトリーがNURBS曲線である場合にはTRUEを返し、それ以外ではFALSEを返します。kの関数はNURBS専用関数を適用する前にジオメトリタイプを調べるのに使えます。
入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例ではジオメトリーがNURBS曲線かどうかを調べます。
SELECT ST_IsNurbsCurve('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry);t
この例では通常のLINESTRINGを調べます。
SELECT ST_IsNurbsCurve('LINESTRING(0 0,10 10)'::geometry);f
ST_Evaluate — NURBS曲線を指定したパラメーター値の位置で評価し、結果ポイントを返します。
geometry ST_Evaluate(geometry nurbscurve, float8 parameter);
NURBS曲線を指定したパラメーター値で評価し、曲線上の位置を表現するPOINTジオメトリーを返します。パラメーターは通常は 0.0 (曲線の始端)から1.0 (曲線の終端)の範囲になりますが、実際の範囲はノットベクトルに依存します。
入力がNURBS曲線でない場合や評価が失敗した場合にはエラーが発生します。入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例ではNURBS曲線の中央点を返します。
SELECT ST_Evaluate('NURBSCURVE(2, (0 0, 5 10, 10 0))'::geometry, 0.5);この例では曲線に沿った複数のポイントを出します。
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 — 一様抽出によってNURBS曲線をLINESTRINGに変換します。
geometry ST_NurbsToLineString(geometry nurbscurve, integer num_segments=32);
NURBS曲線を区分線形近似によってLINESTRINGに変換します。曲線は一様分布したパラメーター値でポイントを抽出して、結果ポイントを線分で結びます。
任意パラメーターnum_segmentsによって、出力の線分数を決定します (デフォルト: 32, 指定可能範囲: 2-10000)。この数値が大きくなるほど、近似ラインストリングの滑らかさが増しすがジオメトリーがより複雑になります。
入力がNURBS曲線でない場合にはエラーが発生します。入力がNULLの場合にはNULLを返します。
Availability: 3.7.0
この例ではNURBS曲線をデフォルト品質でLINESTRINGに変換します。
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)
この例では線分数64で高品質の近似を生成します。
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)
この例では線分数16で低品質の近似を生成します。
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 — ラインストリングにポイントを追加します。
geometry ST_AddPoint(geometry linestring, geometry point);
geometry ST_AddPoint(geometry linestring, geometry point, integer position = -1);
LINESTRINGのpositionの位置 (0はじまり)の前にポイントを追加します。positionパラメータが省略されるか-1の場合には、LINESTRINGの末尾に追加されます。
Availability: 1.1.0
この関数は3次元に対応し、Z値を削除しません。
3次元ラインの末尾へのポイントの追加
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"/>を使ってマルチ系ジオメトリに変換する必要があるならST_Multiを使います。
![]() | |
マルチポリゴンの結果は妥当性チェックを行いません。ポリゴン要素が隣接やオーバラップしている場合には、結果ジオメトリは不正となります (たとえば、この関数をST_Splitの結果に適用すると発生します)。この状況に陥っているかはST_IsValidで確認でき、ST_MakeValidで修復できます。 |
Availability: 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))
ポイントの抽出 (type 1 == POINT):
SELECT ST_CollectionExtract('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))',
1);MULTIPOINT((0 0))
ラインの抽出 (type 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で修復できます。 |
Availability: 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))
ネストしたタイプ混合のコレクションからフラットなジオメトリコレクションへの変換:
SELECT ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0), GEOMETRYCOLLECTION( LINESTRING(1 1,2 2)))');GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(1 1,2 2))
ポリゴンのコレクションから (不正な)マルチポリゴンへの変換:
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);
CIRCULARSTRINGをLINESTRINGに、CURVEPOLYGONをPOLYGONに、MULTISURFACEをMULTIPOLYGONに、それぞれ変換します。CIRCULARSTRINGジオメトリタイプに対応していないデバイスへの出力に使用します。
与えられたジオメトリを線型ジオメトリに変換します。それぞれの曲線ジオメトリまたは辺は、`tolerance` とオプションを使用して線形近似に変換します (デフォルトでは4分の1円ごとに32辺でオプションなしです)。
'tolerance_type'引数によって`tolerance`引数の解釈が決定されます。
0 (デフォルト): toleranceは4分の1円の最大辺数です。
1: toleranceは曲線からラインまでの最大差です。単位は入力ジオメトリの単位です。
2: toleranceは生成される半径がなす角度のラジアン単位の最大値です。
'flags'引数はビットフィールドです。デフォルトでは0です。次のビットに対応します。
1: 対称となる (方向独立)出力。
2: 角度維持。対称出力を生成する時に角度 (辺長)減少を避けます。対称フラグがOFFの時は何の効果もありません。
Availability: 1.3.0
Enhanced: 2.4.0 最大距離差による許容範囲と最大角度による許容範囲に対応し、対称出力に対応しました。
Enhanced: 3.0.0 線形化した弧ごとの最小線分数を実装しました。トポロジ的な崩壊を防ぐためです。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.7
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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)
この例では3次元入力を使っています。
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)
二つの曲線区間だけを使って四分円を近似します。
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で指定した頂点に変更します。
Availability: 3.2.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
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)で表現される座標値を持つジオメトリを修正するのに使います。
Availability: 2.0.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT ST_FlipCoordinates(GeomFromEWKT('POINT(1 2)'));POINT(2 1)
ST_Force2D — ジオメトリを2次元モードに強制します。
geometry ST_Force2D(geometry geomA);
ジオメトリを「2次元モード」に強制させます。全ての出力表現はXY座標値のみを持つことになります。OGC準拠の出力 (OGCは2次元ジオメトリのみ策定しています)に強制するために使われます。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
Changed: 2.1.0 2.0.xの間はST_Force_2Dと呼ばれていました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
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_Force_3DZの別名です。ジオメトリがZ値を持っていない場合はZvalueのZ値を追加します。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
Changed: 2.1.0 2.0.xの間はST_Force_3Dと呼ばれていました。
Changed: 3.1.0. 0でないZ値を指定できるようになりました。
この関数は多面体サーフェスに対応しています。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
既に3次元になっているジオメトリーでは何も起こりません。
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モードに強制します。これはST_Force_3DZの別名です。ジオメトリがZ値を持っていない場合はZvalueのZ値を追加します。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
Changed: 2.1.0 2.0.xの間はST_Force_3DZと呼ばれていました。
Changed: 3.1.0. 0でないZ値を指定できるようになりました。
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
既に3次元になっているジオメトリーでは何も起こりません。
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値は除去されます。
Changed: 2.1.0 2.0.xの間はST_Force_3DMと呼ばれていました。
Changed: 3.1.0. 0でないM値を指定できるようになりました。
このメソッドは曲線ストリングと曲線に対応しています。
既に3次元になっているジオメトリーでは何も起こりません。
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_Force4D — ジオメトリをXYZMモードに強制します。
geometry ST_Force4D(geometry geomA, float Zvalue = 0.0, float Mvalue = 0.0);
ジオメトリをXYZMモードに強制します。Z値やM値が無い場合はZvalueとMvalueを追加します。
Changed: 2.1.0 2.0.xの間はST_Force_4Dと呼ばれていました。
Changed: 3.1.0. 0でないZ値とM値を指定できるようになりました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
既に3次元になっているジオメトリーでは何も起こりません。
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 — ジオメトリをジオメトリコレクションに変換します。
geometry ST_ForceCollection(geometry geomA);
ジオメトリをジオメトリコレクションに変換します。これはWKB表現を単純化するのに便利です。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
Availability: 1.2.2 1.3.4より前は、曲線を含むジオメトリで使うとクラッシュしました。これは1.3.4以上では訂正されています。
Changed: 2.1.0 2.0.xの間はST_Force_Collectionと呼ばれていました。
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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))
この例では多面体サーフェスを使います。
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_ForceCurve — 該当する場合は、ジオメトリを曲線タイプに変換します。
geometry ST_ForceCurve(geometry g);
可能ならジオメトリを曲線表現に変更します。ラインは複合曲線になり、マルチラインはマルチ曲線になり、ポリゴンは曲線ポリゴンになり、マルチポリゴンはマルチサーフェスになります。入力ジオメトリが既に曲線表現であるなら、入力と同じ値が返されます。
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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);
(マルチ)ポリゴンに対して、外環を反時計回りに、内環を時計回りに強制します。ポリゴンでないジオメトリは、変更されずに返されます。
Availability: 2.4.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
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);
(マルチ)ポリゴンに対して、外環を時計回りに、内環を反時計回りに強制します。ポリゴンでないジオメトリは、変更されずに返されます。
Availability: 2.4.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
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.
Availability: 2.1.0
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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);
ポリゴンの頂点の方向はRight-Hand-Ruleに従います。この際、ポリゴンの領域は、境界線の右側になります。特に、外環は時計回りに強制され、内環は反時計回りに強制されます。この関数はST_ForcePolygonCWの別名です。
![]() | |
上のRHRの定義は、他の文脈で使われる場合の定義と矛盾します。これを解消するには、ST_ForcePolygonCWを使うことを推奨します。 |
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
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);
新しい始点 (と終点)を与えられた距離を取って追加することで、指定距離ぶん前後に延長されたラインを返します。距離を0にした場合には、ポイントは追加されません。非負の距離値のみ受け付けます。追加ポイントの方向は始点(と終点の二つの異なるポイントによって決定されます。重複ポイントは無視されます。
Availability: 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をCIRCULARSTRINGと曲線ポリゴンに変換します。等価の曲線を記述するのに必要なポイントが少なくなります。
![]() | |
入力ラインストリング/ポリゴンが、曲線をはっきりと表現するのには不十分な場合には、関数は入力ジオメトリと同じものを返します。 |
Availability: 1.3.0
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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 — マルチ系ジオメトリを返します。
geometry ST_Multi(geometry geom);
マルチ系ジオメトリを返します。ジオメトリが既にマルチ系なら変更せずに返します。
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);
正規化/標準化された形式のジオメトリを返します。ポリゴンの環における頂点の順序、ポリゴンにおける環の順序、複合ジオメトリにおける要素の順序が変更されることがあります。
ほとんどの場合、試験目的 (期待した結果と実際に得た結果との比較)でのみ使用します。
Availability: 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);
始点から測地線に沿って与えられた距離と方位で算出されたポイントを返します。測地問題と言われるものです。
2ポイント版は、方位を黙示的に定義するために一つ目のポイントから二つ目のポイントに向かう線を使い、距離は以前と同様に使います。
距離はメートルで与えます。負数に対応しています。
方位はラジアンで与えます。真北 (方位 0)から時計回りに増えます。 真北から時計回りに数えます。
北は方位ゼロ (0度)です
東は方位 π/2 (90度)です
南は方位 π (180度)です
西は方位 3π/2 (270度)です
負の方位値と2π (360度)を超える値に対応しています。
Availability: 2.0.0
Enhanced: 2.4.0 負の距離と非正規化方位を許容するようになりました。
Enhanced: 3.4.0 ジオメトリ引数と、azimuthを省略した2ポイント形式を許します。
SELECT ST_Project('POINT(0 0)'::geography, 100000, radians(45.0));POINT(0.635231029125537 0.639472334729198)
ST_QuantizeCoordinates — 座標値の最下位ビットを0にします。
geometry ST_QuantizeCoordinates(geometry g, int prec_x, int prec_y = NULL, int prec_z = NULL, int prec_m = NULL);
ST_QuantizeCoordinatesは、指定した小数点以下の桁数での座標値表現に必要なビット数 (N)を決定し、最大の有効ビット数N以外を0にします。結果の座標値は元の値を丸めますが、圧縮性が改善されます。これにより、ジオメトリカラムが compressible storage typeを使って、ディスク使用を劇的に減少させることができます。この関数によって、小数点以下の桁数の異なる指定が可能になります。指定されていない次元はx次元の精度を持つものとします。負の桁数は、小数点以上の桁数の参照と解釈されます (例: prec_x=-2は100付近の座標値を保存します)。
ST_QuantizeCoordinatesが生成する座標は、これらの座標を含むジオメトリや、ジオメトリ内のこれらの相対的な位置から独立しています。結果として、ジオメトリ間に存在するトポロジ関係は、この関数の使用によって影響を受けることはありません。この関数は、ジオメトリの内在的な精度より低い桁数では不正なジオメトリを生成する可能性があります。
Availability: 2.5.0
PostGIS はすべての座標値を倍精度浮動小数点数として格納し、15桁の有効桁数を確実に表すことができます。ただし、PostGISでは、本質的に15桁未満のデータの管理ができます。例としては、小数点以下6桁の精度の地理座標として提供されるTIGERデータがあります (故に、必要な有効桁数は、経度は9桁、緯度は8桁です)。
有効桁数が15の時、多数のありえる9桁の表現があります。倍精度浮動小数点数は52の明示的なビット数を座標の仮数部に使っています。有効桁数9桁では仮数部は30ビットだけ必要で、22ビットは有効ではありません。これらの値を好きなものにすることができ、結局は入力値を丸める数字となります。例えば、100.123456という値は100.123456000000, 100.123456000001および100.123456432199に近い数として表現されます。全ては等しく妥当で、これらの入力ではST_AsText(geom, 6)は同じ結果を返します。これらのビット数をあらゆる値にセットすることができるので、ST_QuantizeCoordinatesは無効ビットとなる22ビットに0をセットします。長い座標値のビット列では、連続的な0のブロックから、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);
ラインストリングからポイントを削除します。インデックスは0始まりです。閉じたリングを開いたラインストリングに変えるのに使います。
Enhanced: 3.2.0
Availability: 1.1.0
この関数は3次元に対応し、Z値を削除しません。
閉じたライン (リング)の終点を削除するとラインが閉じなくなることが保証されています。geomがLINESTRINGであると仮定するします。
UPDATE sometable
SET geom = ST_RemovePoint(geom, ST_NPoints(geom) - 1)
FROM sometable
WHERE ST_IsClosed(geom);
ST_RemoveRepeatedPoints — 重複ポイントを除いたジオメトリを返します。
geometry ST_RemoveRepeatedPoints(geometry geom, float8 tolerance = 0.0);
重複ポイントを除いたジオメトリを返します。この関数は(MULTI)LINESTRING、(MULTI)POLYGON、MULTIPOINTのみを処理しますが、全ての種類のジオメトリを与えることができます。GEOMETRYCOLLECTIONの要素は個別に処理されます。LINESTRINGの端点は保持されます。
ゼロでないtoleranceパラメータを与えた場合には、相互に許容範囲距離内の頂点は重複頂点とみなされます。距離は2次元 (XY平面)で計算されます。
Enhanced: 3.2.0
Availability: 2.2.0
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
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で修復することができます。 |
Availability: 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。
Availability: 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);
どのジオメトリでも使用可能です。頂点の順序を逆にします。
Enhanced: 2.4.0 曲線対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
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を超える長さの線分を持たないよう変更したジオメトリ/ジオグラフィを返します。長さは2次元で計算されます。線分は常に等長の線分に分割されます。
ジオメトリについては、最大長の単位は空間参照系の単位です。
ジオグラフィについては、最大長の単位はメートルです。距離は球面で計算します。追加される頂点は、線分の端点間で定まる球面の大円弧に沿うように作られます。
![]() | |
この関数は長い線分を短くするだけです。最大長より短い線分を長くすることはしません。 |
![]() | |
長い線分を含む入力では、比較的短い |
Availability: 1.2.2
Enhanced: 3.0.0 ジオメトリの分割において、現在は、同じ長さに分割しています
Enhanced: 2.3.0 ジオグラフィの分割において、現在は、同じ長さに分割しています
Enhanced: 2.1.0 ジオグラフィ対応が導入されました。
Changed: 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は末尾のポイントを指します。これは、頂点が一つ動いた時に接続のリレーションシップを維持しようとする場合のトリガに特に便利です。
Availability: 1.1.0
Updated 2.3.0 : 添え字の負数
この関数は3次元に対応し、Z値を削除しません。
始端点を (-1 3)から (-1 1)に変更します。
SELECT ST_SetPoint('LINESTRING(-1 2,-1 3)', 0, 'POINT(-1 1)');LINESTRING(-1 1,-1 3)
終端点を変更します (今回は3次元ラインストリングでやってみます)
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_ShiftLongitude — 経度座標値を-180度から180度の範囲と0度から360度の範囲との二つの範囲を行き来するようシフトします。
geometry ST_ShiftLongitude(geometry geom);
ジオメトリの全てのポイント/頂点を読み、経度値が-180度から0度の範囲にあるのを180度から360度の範囲にシフトして、180度から360度の範囲にあるのを-180度から0度の範囲にシフトします。この関数は対称となりますので、-180度から180度の範囲のデータを0度から360度の範囲の表現にし、0度から360度の範囲のデータを-180度から180度の範囲の表現にします。
![]() | |
この関数は、SRID 436 (WGS84地理座標系)のような緯度経度の座標値を持つデータの場合に限って使います。 |
![]() | |
1.3.4より前ではMULTIPOINTでは動作しないバグがありました。1.3.4以上ではMULTIPOINTでも動作します。 |
この関数は3次元に対応し、Z値を削除しません。
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
ご注意: この関数は2.0.0で"ST_Shift_Longitude"から名称変更しました。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例では一つのポイントを順方向に (180°~360°を-180°~0°に)シフトします。
SELECT ST_ShiftLongitude('SRID=4326;POINT(270 0)'::geometry)POINT(-90 0)
この例では一つのポイントを逆方向に (-180°~0°から180°~360°に)シフトします。
SELECT ST_ShiftLongitude('SRID=4326;POINT(-90 0)'::geometry)POINT(270 0)
この例ではLINESTRINGのうち必要な箇所のみをシフトさせています。
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);
入力ジオメトリを分割して、全ての結果要素が「回り込み ('wrap')」線から’move'パラメータで決められた方向、すなわち、右側 ('move'が負数)または左側 ('move'が正数)に全ての要素が落ちるように移動させ、最後に再結合します。
![]() | |
経度緯度入力を「再センタリング」して、対象地物が一方からもう一方に飛ばないようにするのに使えます。 |
Availability: 2.3.0 GEOSが必要です。
この関数は3次元に対応し、Z値を削除しません。
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で導入されました。入力ジオメトリの全てのポイントを原点 (第2引数で指定するもので、ポイントでなければなりません)とセルサイズを定めたグリッドにスナップします。グリッドにスナップしたくない次元についてはサイズに0を指定します。
![]() | |
返されるジオメトリは単純性が失われているかも知れません (ST_IsSimpleを参照してください)。 |
![]() | |
1.1.0版より前では、この関数は常に2次元ジオメトリを返しました。1.1.0版からは、返されるジオメトリの次元数は、入力値のうちで手のつけられていない最大の次元と同じになります。全てのグリッドの次元を定義するには、第2引数にジオメトリを取る形式を使って下さい。 |
Availability: 1.0.0RC1
Availability: 1.1.0 - Z値とM値に対応しました
この関数は3次元に対応し、Z値を削除しません。
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)
この例では4次元ジオメトリをスナップさせます。
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)
4次元ジオメトリーへの適用 - ST_SnapToGrid(geom,size)はX軸とY軸のみを操作して、M値とZ値は値を変更しません。
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 — 入力ジオメトリの辺と頂点を参照ジオメトリの頂点にスナップします。
geometry ST_Snap(geometry input, geometry reference, float tolerance);
ジオメトリの頂点と辺を、もう一つのジオメトリの頂点にスナップします。スナップが実行される位置を制御するにはスナップ距離許容値を使います。結果ジオメトリはスナップされた頂点を持つ入力ジオメトリです。スナップが発生しなかった場合には、入力ジオメトリが変更されずに返されます。
一つのジオメトリからもう一つへの変換によって、近傍エッジ (ノード生成とインタセクション計算で問題を引き起こします)を除くことになり、オーバレイ演算のロバスト性が改善されます。
あまりに多数のスナップを行った場合には、生成されるトポロジが不正になる可能性があります。いつスナップが安全かを判定するために、ヒューリスティックにスナップされた頂点の数と位置が決めるしかありません。しかし、省略された潜在的なスナップになりえます。
![]() | |
返されるジオメトリは単純性が失われているかも知れません (ST_IsSimpleを参照してください)し、妥当性が失われているかも知れません (ST_IsValidを参照して下さい)。 |
GEOSモジュールで実現しています。
Availability: 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が有効です。
Availability: 2.2.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例ではM値を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 — ジオメトリが2次元で整形されているかのテスト。
boolean ST_IsValid(geometry g);
boolean ST_IsValid(geometry g, integer flags);
ST_Geometry値が整形式であり、2次元で妥当かどうかをOGC規則に沿ってテストします。3次元と4次元のジオメトリでは、評価は2次元で行います。ジオメトリが不正なら、PostgreSQL NOTICEが出力され、不正である理由の詳細が示されます。
flagsパラメータを持つ版が対応する値についてはST_IsValidDetailで説明しています。
ジオメトリ評価に関する詳細情報については「ジオメトリ検証」を参照してください。
![]() | |
SQL-MMでは、ST_IsValid(NULL)は0を返しますが、PostGISではNULLを返します。 |
GEOSモジュールで実現しています。
フラグを受け付ける形式は、2.0.0から有効になりました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 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)、不正である理由を示す文字列 (reason)、不正である位置を指摘するジオメトリ (location)からなります。
不正ジオメトリの詳細報告の生成をするST_IsValidとST_IsValidReasonの組み合わせを改善するために使います。
任意パラメータflagsはビットフィールドです。次の値を持つことができます。
0: 通常のOGC SFS評価モデルを使用します。
1: ある種の自己接触リング (逆の外リングと逆の穴リング)を妥当とします。この評価モデルはこれらのツールで使われるため「ESRIフラグ」とも言われます。OGCモデルでは不正とされることに注意してください。
GEOSモジュールで実現しています。
Availability: 2.0.0
この例では5行が成功する試験から拒否された最初の3タプルを返します。
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 — ジオメトリが妥当か否かを示す文字列を返し、不正な場合は理由を返します。
text ST_IsValidReason(geometry geomA);
text ST_IsValidReason(geometry geomA, integer flags);
ジオメトリが妥当かどうか、不正な場合はその理由を示す文字列を返します。
不正なジオメトリと理由の詳細報告を生成するのに、ST_IsValidと併用します。
許されるflagsは、 ST_IsValidDetailにあります。
GEOSモジュールで実現しています。
Availability: 1.4
Availability: 2.0 フラグを取る形式。
この例では蝶ネクタイ型の不正ポリゴンを使います。
SELECT ST_IsValidReason(
'POLYGON ((100 200,100 100,200 200,
200 100,100 200))'::geometry) as validity_info;Self-intersection[150 150]
この例では5行が成功する試験から拒否された最初の3タプルを返します。
SELECT gid, ST_IsValidReason(geom) as validity_info
FROM
(SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As geom, gid
FROM (SELECT ST_Buffer(ST_Point(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid
FROM generate_series(-4,6) x1
CROSS JOIN generate_series(2,5) y1
CROSS JOIN generate_series(1,8) z1
WHERE x1
> y1*0.5 AND z1 < x1*y1) As e
INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_Point(x1*10,y1), z1)),y1*1, z1*2) As line
FROM generate_series(-3,6) x1
CROSS JOIN generate_series(2,5) y1
CROSS JOIN generate_series(1,10) z1
WHERE x1
> y1*0.75 AND z1 < x1*y1) As f
ON (ST_Area(e.buff)
> 78 AND ST_Contains(e.buff, f.line))
GROUP BY gid, e.buff) As quintuplet_experiment
WHERE ST_IsValid(geom) = false
ORDER BY gid
LIMIT 3;gid | validity_info ------+-------------------------- 5330 | Self-intersection [32 5] 5340 | Self-intersection [42 5] 5350 | Self-intersection [52 5]
Simple example.
SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020 150410)');st_isvalidreason ------------------ Valid Geometry
ST_MakeValid — 頂点を失うことなしに不正なジオメトリを妥当なジオメトリにしようと試みます。
geometry ST_MakeValid(geometry input);
geometry ST_MakeValid(geometry input, text params);
与えられた不正なジオメトリを、入力ジオメトリの頂点を捨てずに、妥当な表現で生成しようとします。妥当なジオメトリは変更せずに返します。
対応する入力はPOINTS, MULTIPOINTS, LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON, GEOMETRYCOLLECTIONおよびそれらの混交したものです。
完全または部分的な次元崩壊の場合には、出力ジオメトリは、同次元まはた低い次元のジオメトリのコレクションか、低い次元のジオメトリコレクションになります。
単一ポリゴンは、自己インタセクトがある場合には、マルチポリゴンになります。
params引数は、妥当なジオメトリを構築するために使うメソッドを選択するための任意文字列を与えるのに使えます。任意文字列は"method=linework|structure keepcollapsed=true|false"という書式に従います。"params"引数が無い場合には、"linework"アルゴリズムがデフォルトとして使われます。
"method"キーに対して取り得る値は二つあります。
"linework"はデフォルトのアルゴリズムで、最初に全てのラインを抽出して、そのラインを繋ぎ合わせ、最後に繋いだラインから値を出力します。頂点の欠落が無いことを求めているので、複雑なコレクションを出力として生成できます。
"structure"は内側リングと外側リングを区別します。外側リングを結合してジオメトリーを新規生成してから、全ての内側リングの領域を差し引きます。次元崩壊したラインは破棄されて結果が出力されるので、より直感的と言えるでしょう。
"keepcollapsed"キーは"structure"アルゴリズムの時だけ見られて、"true"または"false"を取ります。
"keepcollapsed"のデフォルト値は"false"です。頂点が1個のラインストリングなどの低い空間次元に崩壊するジオメトリーは削除されます。
"keepcollapsed"が"true"の場合には、低い空間次元に崩壊するジオメトリー要素も保持されます。
GEOSモジュールで実現しています。
Availability: 2.0.0
Enhanced: 2.0.1 速度の改善
Enhanced: 2.1.0 GEOMETRYCOLLECTIONとMULTIPOINTの対応の追加
Enhanced: 3.1.0 NaN値を持つ座標の削除が追加されました。
Enhanced: 3.2.0, アルゴリズムに関する任意パラメータ'linework'と'structure'が追加されました。GEOS 3.10.0以上が必要です。
この関数は3次元に対応し、Z値を削除しません。
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を参照して下さい。
Availability: 3.4.0
入力ジオメトリのSRIDは無視され、任意パラメータ to_srid から値が提供されていない場合には出力ジオメトリのSRIDは0に設定されます。ST_TransformPipelineを使うときには、パイプラインが順方向に実行されます。`ST_InverseTransformPipeline()`を使うと、パイプラインは逆方向に実行されます。
パイプラインを用いた変換はST_Transformの特別版です。ほとんどの場合、`ST_Transform`は、座標系間の変換において正しい演算子を選択します。こちらの方が推奨されます。
EPSG:16031変換を使ったWGS 84 経度緯度から UTM31Nへの変換
この例では逆方向に変換しています。
SELECT ST_InverseTransformPipeline(
'POINT(426857.9877165967 5427937.523342293)'::geometry,
'urn:ogc:def:coordinateOperation:EPSG::16031'
) AS wgs_geom;POINT(2 48.99999999999999)
GDA2020の例。
この例ではST_Transformが変換パイプラインの自動選択をしています。
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を使います。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドは曲線ストリングと曲線に対応しています。
ポイントをWGS 84経度/緯度となるようSRIDを設定します。
SELECT ST_SetSRID(ST_Point(-123.365556, 48.428611), 4326) AS wgs84long_lat;
SRID=4326;POINT(-123.365556 48.428611)
ポイントをWGS 84経度/緯度となるようSRIDを設定したうえでWebメルカトルに変換します。
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テーブルで定義されている空間参照系の識別番号を返します。「空間参照系」を参照して下さい。
![]() | |
spatial_ref_sysテーブルはPostGISが知る参照系の全てのカタログを作っていて、ある空間参照系から他の空間参照系に変換するために使われます。ジオメトリの変換を予定している場合は正しい空間参照系の識別番号を持っているか確認することは重要です。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.5
このメソッドは曲線ストリングと曲線に対応しています。
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文字列で定義された空間参照系を指定することができますが、最適化されません。変換先空間参照系がSRIDの代わりにPROJ.4文字列で表現されている場合には、出力ジオメトリのSRIDは0になります。from_projを使う場合には、入力ジオメトリは定義されたSRIDを持っていなければなりません。
ST_TransformはしばしばST_SetSRIDと混同されます。ST_Transformは実際にジオメトリの座標を、ある空間参照系から他のものに変換します。ST_SetSRIDは単にジオメトリのSRIDを変更するだけです。
ST_Transformは変換元空間参照系と変換先空間参照系に与える適切な変換パイプラインを自動的に選択します。特定の変換法を使用するにはST_TransformPipelineを使います。
![]() | |
PostGISはPROJ対応でコンパイルする必要があります。PROJ対応でコンパイルしたかを確認するにはPostGIS_Full_Versionを使います。 |
![]() | |
一つ以上の変換を行う場合は、インデックスの利点を得るために、使用する変換に関する関数インデックスを持つと便利です。 |
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
Enhanced: 2.3.0 直接のPROJ.4文字列への対応が導入されました。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.6
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
マサチューセッツ州平面座標系 (アメリカ測量フィート)をWGS84経度緯度に変更します。
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))
3次元曲線ストリングの例です。
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)
部分関数インデックスを作る例です。全てのジオメトリが入っているとは確信できないテーブルのためには、スペースの節約とインデックスを小さく効率的にするために、NULLジオメトリを無視する部分インデックスを使うのが最善です。
CREATE INDEX idx_geom_26986_parcels
ON parcels
USING gist
(ST_Transform(geom, 26986))
WHERE geom IS NOT NULL;
PROJ.4テキストを使って、独自の空間参照系に投影変換する例です。
独自の心射図法を使って北極付近二つのポリゴンのインターセクトしている部分を探索します。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はグリッドシフトファイルが無い場合はエラーを投げますが、この挙動は、PROJ.4 テキストのto_proj値の変更を試みたり、spatial_ref_sysテーブルのproj4text値を変更したりすることで、SRID毎の原則を設定することができます。
たとえば、proj4textパラメータ +datum=NAD87 は次に示す+nadgridsパラメータの短縮形です。
+nadgrids=@conus, @alaska, @ntv2_0.gsb, @ntv1_can.dat
接頭辞@は、ファイルが無くてもエラー報告をしないという意味ですが、適切だった (発見されてオーバラップした)ファイルがないままリストの終わりに達した場合はエラーが出ます。
逆に、少なくとも標準的なファイルが確実にあって欲しいけれども、該当が無いまま全てのファイルが走査された場合に、NULL変換としたいなら、次が使えます。
+nadgrids=@conus, @alaska, @ntv2_0.gsb, @ntv1_can.dat, null
NULLグリッドシフトファイルは、世界全体をカバーして、シフトを行わない、妥当なグリッドシフトファイルです。 完全な例のために、正しい範囲にないSRID 4267への変換でエラーが投げられないようPostGISを変えたいなら、次のようにします。
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文字列は座標操作を一意に識別できません。CRS定義に同じEPSGコードが使用できるためです。
PROJパイプライン文字列: +proj=pipeline ...。自動の軸正規化が適用されません。必要なら呼び出し元が追加のパイプライン段階を必要とします。もしくはaxisswap段階を削除する必要があります。
操作の連結: urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618。
Availability: 3.4.0
入力ジオメトリのSRIDは無視され、任意パラメータ to_srid から値が提供されていない場合には出力ジオメトリのSRIDは0に設定されます。`ST_TransformPipeline()`を使うときには、パイプラインが順方向に実行されます。ST_InverseTransformPipelineを使うと、パイプラインは逆方向に実行されます。
パイプラインを用いた変換はST_Transformの特別版です。ほとんどの場合、`ST_Transform`は、座標系間の変換において正しい演算子を選択します。こちらの方が推奨されます。
EPSG:16031変換を使ったWGS 84 経度緯度から UTM31Nへの変換
この例では順方向に変換します。
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)
この例では逆方向に変換しています。
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の例。
この例ではST_Transformが変換パイプラインの自動選択をしています。
SELECT ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844) AS gda2020_auto;POINT(143.00000635638918 -36.999986706128176)
定義済み変換を使います (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)
この例ではEPSG:8447に適合するPROJパプライン定義を使います。これはprojinfoコマンドから得ます。軸交換ステップはいずれも削除しなければなりません。
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_nameに関する全てのauth_sridの集合を返します。
Availability: 3.4.0
Proj 6以上
EPSG機関に関連付けられているコードの最初の10件の一覧を得ます。
SELECT * FROM postgis_srs_codes('EPSG') ORDER BY 1 LIMIT 10;10156 10157 10158 10160 10162 10163 10164 10165 10166 10167
postgis_srs — 求める機関と空間参照識別子に関するメタデータレコードを返します。
setof record postgis_srs(text auth_name, text auth_srid);
指定したauth_nameに関して求めるauth_sridのメタデータレコードを貸します。レコードにはauth_name, auth_srid, srname, srtext, proj4textと適用範囲の隅を示すpoint_swとpoint_neが含まれます。
Availability: 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が含まれます。
Availability: 3.4.0
Proj 6以上
Projデータベースから最初の10件のメタデータレコードを得ます。
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 — boundsパラメータを完全に含む適用範囲を持つ投影座標系のメタデータレコードを返します。
setof record postgis_srs_search(geometry bounds, text auth_name=EPSG);
boundsパラメータを完全に含む適用範囲を持つ投影座標系のメタデータレコードを返します。レコードにはauth_name, auth_srid, srname, srtext, proj4textと適用範囲の隅を示すpoint_swとpoint_neが含まれます。
この検索では、投影座標系のみが対象となります。お持ちのデータの範囲で動作しうる座標系を探索することを目的としています。
Availability: 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 — マルチラインストリングのWell-Known Text表現による、閉じたラインストリングの任意のコレクションからポリゴンを生成します。
geometry ST_BdPolyFromText(text WKT, integer srid);
マルチラインストリングのWell-Known Text表現による、閉じたラインストリングの任意のコレクションからポリゴンを構築します。
![]() | |
WKTがMULTILINESTRINGでない場合には、エラーが投げられます。出力がMULTIPOLYGONになる場合には、エラーが投げられますが、この場合はST_BdMPolyFromTextを使うかPostGIS独特のアプローチとしてST_BuildArea()をご覧ください。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
GEOSモジュールで実現しています。
Availability: 1.1.0
ST_BdMPolyFromText — マルチラインストリングのWell-Known Text表現による、閉じたラインストリングの任意のコレクションからマルチポリゴンを構築します。
geometry ST_BdMPolyFromText(text WKT, integer srid);
マルチラインストリングのWell-Known Text表現による、閉じたラインストリングの任意のコレクションからマルチポリゴンを構築します。
![]() | |
WKTがMULTILINESTRINGでない場合には、エラーが投げられます。出力が単一のポリゴンであってもマルチポリゴンに強制されます。単一のポリゴンが返って欲しい場合はST_BdPolyFromTextを使うかPostGIS独特のアプローチとしてST_BuildArea()をご覧ください。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
GEOSモジュールで実現しています。
Availability: 1.1.0
ST_GeogFromText — Well-Known Text表現または拡張WKTから指定したジオグラフィ値を返します。
geography ST_GeogFromText(text EWKT);
Well-Known Text表現または拡張WKTから指定したジオグラフィ値を返します。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);
Well-Known Text表現から指定したジオグラフィ値を返します。SRID 4326を仮定します。
ST_GeomCollFromText — WKT表現と与えられたSRIDからジオメトリのコレクションを生成します。SRIDが与えられていない場合は0とします。
geometry ST_GeomCollFromText(text WKT, integer srid);
geometry ST_GeomCollFromText(text WKT);
Well-Kown-Text (WKT)表現のコレクションと与えられたSRIDからジオメトリのコレクションを生成します。SRIDが与えられていない場合は0とします。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。
WKTがGEOMETRYCOLLECTIONでない場合には、NULLを返します。
![]() | |
全てのWKTジオメトリがジオメトリコレクションであると絶対的な確信を持てる場合は、この関数は使わないでください。付加的な評価ステップが追加されるのでST_GeomFromTextより遅いです。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。
SELECT ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(1 2), LINESTRING(1 2,3 4))');ST_GeomFromEWKT — 拡張Well-Known Text表現 (EWKT)から指定されたST_Geometry値を返します。
geometry ST_GeomFromEWKT(text EWKT);
拡張Well-Known Text表現 (EWKT)からPostGIS ST_Geometryオブジェクトを生成します。
![]() | |
EWKT書式はOGC標準ではなくPostGIS独特の書式で、空間参照系ID (SRID)を含みます。 |
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 );
この関数はMARC21/XMLデータからPostGISジオメトリを生成するものです。POINTまたはPOLYGONを含みます。同じMARC21/XMLデータで複数の地理データが存在する場合には、 MULTIPOINTまたはMULTIPOLYGON を返します。データにジオメトリタイプが混じっている場合には、GEOMETRYCOLLECTIONを返します。MARC21/XMLデータに地理データ (データフィールド:034)を含まない場合にはNULLを返します。
対応するLOC MARC21/XMLのバージョンは次の通りです。
Availability: 3.3.0 libxml2 2.6以上が必要です。
![]() | |
MARC21/XMLコード化地理数値データでは、今のところコード化した座標の空間参照系を記述する手段がないため、この関数は常に |
![]() | |
返される |
POINTを一つ含み hddd.ddddddでエンコードしたMARC21/XML地理データの変換
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)
POLYGONを一つ含み hdddmmssでエンコードしたMARC21/XML地理データの変換
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))
POLYGONとPOINTを含むMARC21/XML地理データの変換:
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.
Availability: 1.2.2
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.40
ST_GeomFromText — Well-Known Text表現 (WKT)から指定したST_Geometryを返します。
geometry ST_GeomFromText(text WKT);
geometry ST_GeomFromText(text WKT, integer srid);
OGC Well-Known Text表現からPostGIS ST_Geometryオブジェクトを生成します。
![]() | |
ST_GeomFromText関数には二つの形式があります。一つ目は、SRIDを取らず、空間参照系を持たない (SRID=0)ジオメトリを返すものです。二つ目は、SRIDを第2引数に取り、メタデータの一部としてSRIDを含むジオメトリを返すものです。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2 - 任意引数SRIDは仕様適合のためです。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.40
このメソッドは曲線ストリングと曲線に対応しています。
![]() | |
OGC非準拠ですが、ST_MakePointはST_GeomFromTextやST_PointFromTextより早いです。座標値に数値を使っている場合には簡単になるという利点もあります。他の選択肢としてST_Pointは、速度面ではST_MakePointと似ていて、かつOGC準拠ですが、2次元ポイントしか対応していません。 |
Changed: 2.0.0 前の版ではST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)')が許されていました。SQL/MM標準への適合のためPostGIS 2.0.0では不正とされます。今は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は仕様適合のためです。 |
![]() | |
全てのジオメトリがLINESTRINGであると知っている場合は、ST_GeomFromTextを使う方が効率的です。 この関数はST_GeomFromTextの呼び出しと、LINESTRINGを返すかどうかの評価とを行います。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.2.8
SELECT ST_LineFromText('LINESTRING(1 2,3 4)') AS aline,
ST_LineFromText('POINT(1 2)') IS NULL AS null_return;aline | null_return
------------------------------------
LINESTRING(1 2,3 4) | t
ST_MLineFromText — WKT表現から指定したST_MultiLineString値を返します。
geometry ST_MLineFromText(text WKT, integer srid);
geometry ST_MLineFromText(text WKT);
Well-Kown-Text (WKT)表現のコレクションと与えられたSRIDからジオメトリを生成します。SRIDが与えられていない場合は0 (不明)とします。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。
WKTがMULTILINESTRINGでない場合はNULLを返します。
![]() | |
全てのWKTジオメトリがマルチラインストリングであると絶対的な確信を持てる場合は、この関数は使わないでください。付加的な評価ステップが追加されるのでST_GeomFromTextより遅いです。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.4.4
SELECT ST_MLineFromText('MULTILINESTRING((1 2,3 4),(4 5,6 7))');ST_MPointFromText — Well-Known Text (WKT)表現と与えられたSRIDからジオメトリを生成します。SRIDを与えない場合は0 (不明)となります。
geometry ST_MPointFromText(text WKT, integer srid);
geometry ST_MPointFromText(text WKT);
Well-Known Text (WKT)表現と与えられたSRIDからジオメトリを生成します。SRIDが与えられていない場合は0 (不明)となります。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。
WKTがMULTIPOINTでない場合はNULLを返します。
![]() | |
全てのWKTジオメトリがマルチラインストリングであると絶対的な確信を持てる場合は、この関数は使わないでください。付加的な評価ステップが追加されるのでST_GeomFromTextより遅いです。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 3.2.6.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.2.4
SELECT ST_MPointFromText('MULTIPOINT((1 2),(3 4))');
SELECT ST_MPointFromText('MULTIPOINT((-70.9590 42.1180),(-70.9611 42.1223))', 4326);ST_MPolyFromText — Well-Known Text (WKT)表現と与えられたSRIDからマルチポリゴンを生成します。SRIDが与えられていない場合は0 (不明)となります。
geometry ST_MPolyFromText(text WKT, integer srid);
geometry ST_MPolyFromText(text WKT);
Well-Known Text (WKT)表現と与えられたSRIDからマルチポリゴンを生成します。SRIDが与えられていない場合は0 (不明)となります。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。
WKTがMULTIPOLYGONでない場合はエラーを投げます。
![]() | |
全てのWKTジオメトリがマルチポリゴンであると絶対的な確信を持てる場合は、この関数は使わないでください。付加的な評価ステップが追加されるのでST_GeomFromTextより遅いです。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。 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が与えられていない場合は0 (不明)とします。
geometry ST_PointFromText(text WKT);
geometry ST_PointFromText(text WKT, integer srid);
OGC Well-Known Text表現からPostGISのST_Geometryポイントオブジェクトを生成します。SRIDが与えられていない場合は不明 (現在は0)とします。ジオメトリがWKTポイント表現でない場合はNULLを返します。完全に不正なWKTならエラーが投げられます。
![]() | |
ST_PointFromTextには二つの形式があります。 一つ目は、SRIDを取らずに空間参照系を定義していないジオメトリを返すものです。 二つ目は、空間参照系識別番号を第2引数に取り、SRIDをメタデータの一部として含むST_Geometryを返すものです。SRIDはspatial_ref_sysテーブルで定義されていなければなりません。 |
![]() | |
全てのWKTジオメトリがジオメトリコレクションであると絶対的な確信を持てる場合は、この関数は使わないでください。付加的な評価ステップが追加されるのでST_GeomFromTextより遅いです。 経度緯度座標からポイントを生成していて、OGC対応よりもパフォーマンスと精度を重視する場合は、ST_MakePointか、OGC対応の別名であるST_Pointを使用して下さい。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2 - 任意引数SRIDは仕様適合のためです。
このメソッドはSQL/MM仕様の実装です。 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 — Well-Known Text (WKT)表現と与えられたSRIDからジオメトリを生成します。SRIDを与えない場合は0 (不明)となります。
geometry ST_PolygonFromText(text WKT);
geometry ST_PolygonFromText(text WKT, integer srid);
WKT表現と与えられたSRIDからジオメトリを生成します。SRIDが与えられていない場合は0 (不明)とします。WKTがポリゴンでない場合はNULLを返します。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。
![]() | |
全てのWKTジオメトリがポリゴンであると絶対的な確信を持てる場合は、この関数は使わないでください。付加的な評価ステップが追加されるのでST_GeomFromTextより遅いです。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。 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.
このメソッドはSQL/MM仕様の実装です。 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 — Well-Known Binaryジオメトリ表現(WKB)または拡張WKB(EWKB)からジオグラフィインスタンスを生成します。
geography ST_GeogFromWKB(bytea wkb);
ST_GeogFromWKBは、ジオメトリのWell-Known Binary表現 (WKB)またはPostGIS拡張WKBを得て、適切なジオグラフィ型のインスタンスを生成します。この関数はSQLのジオメトリファクトリの役割を果たします。
SRIDが指定されていない場合には、デフォルトは4326 (WGS 84経度緯度)となります。
このメソッドは曲線ストリングと曲線に対応しています。
bytea表現は単一の \ を含みますが、これらはテーブルに入れるときにエスケープする必要があります。
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 — 拡張Well-Known Binary表現 (EWKB)から指定したST_Geometry値を返します。
geometry ST_GeomFromEWKB(bytea EWKB);
Constructs a PostGIS geometry from an Extended Well-Known Binary (EWKB) representation.
![]() | |
EWKB書式はOGC標準ではなくPostGIS独特の書式で、空間参照系識別番号 (SRID)を含みます。 |
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 — Well-Knwon Binaryジオメトリ表現 (WKB)と任意パラメーターのSRIDからジオメトリインスタンスを生成します。
geometry ST_GeomFromWKB(bytea geom);
geometry ST_GeomFromWKB(bytea geom, integer srid);
ST_GeomFromWKBは、ジオメトリのWell-Known Binary表現と空間参照系識別番号 (SRID)を取り、適切なジオメトリタイプのインスタンスを生成します。この関数は、SQLのジオメトリファクトリの役割を果たします。これは、ST_WKBToSQLの代替名です。
SRIDが指定されていない場合、0 (不明)となります。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.7.2 - 任意引数SRIDは仕様適合のためです。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.41
このメソッドは曲線ストリングと曲線に対応しています。
bytea表現は単一の \ を含みますが、standard_conforming_stringsが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 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.2.9
SELECT ST_LineFromWKB(
ST_AsBinary(ST_GeomFromText('LINESTRING(1 2,3 4)'))
) AS aline,
ST_LineFromWKB(
ST_AsBinary(ST_GeomFromText('POINT(1 2)'))
) IS NULL AS null_return;aline | null_return
------------------------------------
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 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.6.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.2.9
SELECT ST_LinestringFromWKB(
ST_AsBinary(ST_GeomFromText('LINESTRING(1 2,3 4)'))
) AS aline,
ST_LinestringFromWKB(
ST_AsBinary(ST_GeomFromText('POINT(1 2)'))
) IS NULL AS null_return;aline | null_return ------------------------------------ LINESTRING(1 2,3 4) | t
ST_PointFromWKB — WKBと与えられたSRIDからジオメトリを生成します。
geometry ST_GeomFromWKB(bytea geom);
geometry ST_GeomFromWKB(bytea geom, integer srid);
ST_PointFromWKBは、ジオメトリのWell-Known Binary表現と空間参照系識別番号 (SRID)を取り、適切なジオメトリタイプのインスタンスを生成します。この場合、POINTジオメトリです。この関数はSQLのジオメトリファクトリの役割を果たします。
SRIDが指定されていない場合は0 (不明)となります。入力byteaがPOINTジオメトリを表現しないならNULLが返されます。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.7.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 6.1.9
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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.
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.36
ST_Box2dFromGeoHash — GeoHash文字列からBOX2Dを返します。
box2d ST_Box2dFromGeoHash(text geohash, integer precision=full_precision_of_geohash);
GeoHash文字列からBOX2Dを返します。
precisionが指定されない場合には、ST_Box2dFromGeoHashは、入力ジオハッシュ文字列の完全な精度に基づいたBOX2Dを返します。
precisionが指定されている場合には、ST_Box2dFromGeoHashは、BOX2Dを生成するために、GeoHashからの多数の文字を使用します。低い精度の値では大きなBOX2Dを返し、値が大きいほど精度が増します。
Availability: 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からの多数の文字を使います。
Availability: 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);
OGC GML表現からPostGIS ST_Geometryオブジェクトを生成します。
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をご覧下さい。
Availability: 1.5 libxml2 1.6+が必要です。
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
Enhanced: 2.0.0 SRID任意引数が追加されました。
Enhanced: 3.7.0 support for GML ArcString, curved Ring, and CurvePolygon geometries was introduced.
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
GMLは、複合次元 (たとえば、2次元と3次元が同じMultiGeometry内にある)を許します。PostGISジオメトリは許さないので、ST_GeomFromGMLは、Z次元が無いジオメトリを一つでも発見すると、ジオメトリ全体を2次元に変換します。
GMLは同じMultiGeometry内での複合SRSをサポートします。PostGISではサポートしないので、ST_GeomFromGMLは、この場合には、全てのサブジオメトリをルートノードのSRSに投影変換します。GMLのルートノードにsrsName属性が無い場合、関数はエラーを投げます。
ST_GeomFromGML関数は、明示的なGML名前空間について杓子定規ではありません。共通使用で名前空間の明示を避けることができます。ただし、GML内でXLink機能を使いたい場合は必要です。
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);
GeoJSON表現からPostGISジオメトリオブジェクトを生成します。
ST_GeomFromGeoJSONは、JSONのうちジオメトリ部分でのみ動作します。JSON文書全体を使おうとするとエラーが投げられます。
Enhanced: 3.0.0 パースされたジオメトリのデフォルトのSRIDは、他に指定していない場合には4326となります。
Enhanced: 2.5.0 JSONとJSONBの入力を受け付けるようになりました。
Availability: 2.0.0 JSON-C 0.9以上が必要です。
![]() | |
有効なJSON-Cが無い場合には、出力の替りに、エラー通知を得ます。JSON-Cを有効にするには--with-jsondir=/path/to/json-cをコンフィギュアで指定します。詳細については「コンフィギュレーション」をご覧下さい。 |
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}') AS wkt;POINT(-48.23456 20.12345)
この例では3次元ラインストリングを生成します。
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_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 Namespace
OGC KML標準についてはhttp://www.opengeospatial.org/standards/kmlをご覧ください。
Availability: 1.5 libxml2 2.6以上が必要です。
この関数は3次元に対応し、Z値を削除しません。
![]() | |
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")ジオメトリ表現を取り、適切なジオメトリタイプとなるインスタンスを生成します。
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.
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.50.
Availability: 1.5 libxml2 1.6+が必要です。
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
Enhanced: 2.0.0 SRID任意引数が追加されました。
Enhanced: 3.7.0 support for GML ArcString, curved Ring, and CurvePolygon geometries was introduced.
ST_LineFromEncodedPolyline — エンコード化ポリラインからラインストリングを生成します。
geometry ST_LineFromEncodedPolyline(text polyline, integer precision=5);
エンコード化ポリラインからラインストリングを生成します。
任意パラメータprecisionは、ポリライン符号化の際の桁数を決定するものです。符号化と復号とで同じ値であるべきで、異なる場合には座標が正しくなりません。
http://developers.google.com/maps/documentation/utilities/polylinealgorithmを参照して下さい。
Availability: 2.2.0
この例ではポリラインからラインストリングを生成します。
SELECT ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@');SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)
この例ではポリライン符号化の精度と違う精度を選択しています。
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は、ポイント生成のために、GeoHasoから多数の文字を使用します。
Availability: 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データ。
Availability: 3.2.0
ST_FromFlatGeobuf — FlatGeobufデータを読みます。
setof anyelement ST_FromFlatGeobuf(anyelement Table reference, bytea FlatGeobuf input data);
FlatGeobufデータを読みます (http://flatgeobuf.org)。 ご注意: PostgreSQLのbytea型は1GBを超えられません。
tabletype テーブルタイプへの参照。
data 入力FlatGeobufデータ。
Availability: 3.2.0
これらの関数は、ジオメトリオブジェクトを様々な文字列形式やバイナリ形式に変換するものです。
ST_AsEWKT — ジオメトリのSRIDメタデータが付いたWell-Known Text (WKT)表現を返します。
text ST_AsEWKT(geometry g1);
text ST_AsEWKT(geometry g1, integer maxdecimaldigits=15);
text ST_AsEWKT(geography g1);
text ST_AsEWKT(geography g1, integer maxdecimaldigits=15);
SRIDを前に置いたジオメトリのWell-Known Text表現を返します。任意引数maxdecimaldigitsで、出力で使用される小数点以下の最大桁数を減らすことができます (デフォルトは15です)。
EWKT表現をPostGISジオメトリに逆変換するにはST_GeomFromEWKTを使用します。
![]() | |
任意引数 |
![]() | |
WKT仕様はSRIDを含みません。OGC WKT書式を得るにはST_AsTextを使用します。 |
![]() | |
WKT書式は精度を維持しないので、切り捨てを防ぐには、データ転送にST_AsBinaryまたはST_AsEWKBを使用します。 |
Enhanced: 3.1.0 精度パラメータ (任意)に対応しました。
Enhanced: 2.0.0 ジオグラフィ対応、多面体サーフェス対応、三角形対応、TIN対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 — ジオメトリ/ジオグラフィのSRIDメタデータのないWell-Known Text (WKT)表現を返します。
text ST_AsText(geometry g1);
text ST_AsText(geometry g1, integer maxdecimaldigits = 15);
text ST_AsText(geography g1);
text ST_AsText(geography g1, integer maxdecimaldigits = 15);
ジオメトリ/ジオグラフィのWell-Known Text (WKT)表現を返します。任意引数maxdecimaldigitsは、出力で使われる小数点以下の最大桁数を制限するのに使います (デフォルトは15)。
WKT表現をPostGISジオメトリに逆変換するにはST_GeomFromTextを使います。
![]() | |
標準のOGC WKT表現はSRIDを含みません。出力表現にSRIDを持たせるには、非標準のPostGIS関数ST_AsEWKTを使います。 |
![]() | |
WKTにおける数字の文字表現では、完全な浮動小数点数の精度を維持しないことがあります。データ保存や転送で完全な精度を得るにはWell-Known Binary (WKB)書式を使用するのが最善です (ST_AsBinaryおよび |
![]() | |
任意引数 |
Availability: 1.5 - ジオグラフィ対応が導入されました。
Enhanced: 2.5 - 精度の任意引数が導入されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.25
このメソッドは曲線ストリングと曲線に対応しています。
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 — ジオメトリ/ジオグラフィの、SRIDメタデータを持たないOGC/ISO Well-Knownバイナリ (WKB)表現を返します。
bytea ST_AsBinary(geometry g1);
bytea ST_AsBinary(geometry g1, text NDR_or_XDR);
bytea ST_AsBinary(geography g1);
bytea ST_AsBinary(geography g1, text NDR_or_XDR);
ジオメトリのOGC/ISO Well-Known Binary (WKB)表現を返します。一つ目の形式はサーバ機のエンディアンをデフォルトとしてバイナリを生成するものです。二つ目の形式は、エンディアンを指定する文字列引数を取ります。リトルエンディアンは 'NDR'、ビッグエンディアンは'XDR'です。それ以外の値を与えると、リトルエンディアンで出力します。
WKB書式は、ジオメトリデータをデータベースから、完全な数値精度を維持して読み取るために使われます。これにより、WKT等のテキスト書式で発生する丸め誤差を回避できます。
WKB表現をPostGISジオメトリに逆変換するにはST_GeomFromWKBを使います。
![]() | |
OGC/ISO WKB書式はSRIDを持ちません。SRIDを含むEWKB書式を得るにはST_AsEWKBを使います。 |
![]() | |
デフォルトではPostgreSQLは16進エンコードがされた |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Enhanced: 2.0.0 高次元が導入されました。
Enhanced: 2.0.0 ジオグラフィでのエンディアン指定が導入されました。
Availability: 1.5.0 ジオグラフィが導入されました。
Changed: 2.0.0 この関数への入力は不明な型にすることができません。必ずジオメトリーでなければなりません。ST_AsBinary('POINT(1 2)')といった構築はもはや妥当ではなく、 n ST_AsBinary(unknown) is not unique errorを得ることになります。このようなコードはST_AsBinary('POINT(1 2)'::geometry);に変更する必要があります。これが不可能な場合にはlegacy.sqlをインストールして下さい。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.37
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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 — ジオメトリの、SRIDメタデータを持つExtended Well-Knownバイナリ (EWKB)表現を返します。
bytea ST_AsEWKB(geometry g1);
bytea ST_AsEWKB(geometry g1, text NDR_or_XDR);
SRIDメタデータを持つジオメトリの Extended Well-Known Binary (EWKB)表現を返します。一つ目の形式はサーバ機のエンディアンをデフォルトとしてバイナリを生成するものです。二つ目の形式は、エンディアンを指定する文字列引数を取ります。リトルエンディアンは 'NDR'、ビッグエンディアンは'XDR'です。それ以外の値を与えると、リトルエンディアンで出力します。
WKB書式は、ジオメトリデータをデータベースから、完全な数値精度を維持して読み取るために使われます。これにより、WKT等のテキスト書式で発生する丸め誤差を回避できます。
EWKB表現をPostGISジオメトリに逆変換するにはST_GeomFromEWKBを使います。
![]() | |
OGC/ISO WKB書式を得るにはST_AsBinaryを使います。OGC/ISO WKB書式はSRIDを持たないことに注意して下さい。 |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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表現を (文字列として)返します。リトルエンディアン (NDR)またはビッグエンディアン (XDR)のどちらかのエンコーディングを使います。
text ST_AsHEXEWKB(geometry g1, text NDRorXDR);
text ST_AsHEXEWKB(geometry g1);
ジオメトリのHEXEWKB表現を (文字列として)返します。リトルエンディアン (NDR)またはビッグエンディアン (XDR)のどちらかのエンコーディングを使います。エンコーディングを指定しない場合はNDRを使います。
Availability: 1.2.2
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_AsHEXEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326));0103000020E6100000010000000500 00000000000000000000000000000000 00000000000000000000000000000000F03F 000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000
次と同じ結果です:
SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326)::text;ST_AsEncodedPolyline — ラインストリングジオメトリから符号化したポリラインを返します。
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.
Availability: 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);
FeatureCollectionに対応する行の集合のFlatGeobuf表現 (http://flatgeobuf.org) を返します。ご注意: PostgreSQLのbytea型は1GBを超えられません。
row 少なくとも一つのジオメトリカラムを持つ行データ。
index 空間インデックスの生成の切り替え。デフォルトはFALSEです。
geom_name 行データにおけるジオメトリカラムのカラム名。NULLの場合には、最初に見つけたジオメトリカラムとします。
Availability: 3.2.0
ST_AsGeobuf — 行集合のGeobuf表現を返します。
bytea ST_AsGeobuf(anyelement set row);
bytea ST_AsGeobuf(anyelement row, text geom_name);
FeatureCollectionに対応する行集合のGeobuf表現 (https://github.com/mapbox/geobuf)を返します。最適な格納のために最大精度を決定しますが、そのために全ての入力ジオメトリは解析されます。現在の形式でのGeobufはストリーム化できないので、完全な出力はメモリ内で組み立てられることに注意して下さい。
row 少なくとも一つのジオメトリカラムを持つ行データ。
geom_name 行データにおけるジオメトリカラムのカラム名。NULLの場合には、最初に見つけたジオメトリカラムとします。
Availability: 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 specifications RFC 7946に準拠しますが、入力ジオメトリのCRSががWGS84経度緯度 (EPSG:4326, urn:ogc:def:crs:OGC::CRS84)以外の時は準拠しません。GeoJSONのgeometryオブジェクトに短いCRS SRID識別子がデフォルトで追加されます。2次元と3次元のジオメトリの両方に対応します。GeoJSONはSFS 1.1ジオメトリタイプにのみ対応します (たとえば曲線には対応していません)。
geom_columnパラメータは複数のジオメトリカラムを区別するために使われます。省略すると、レコードの最初のジオメトリカラムに決定されます。逆にパラメータを渡すとカラムの型の調査が省かれます。
maxdecimaldigits引数は、出力で使用される小数部の桁数の最大値を減らすために使われます (デフォルトでは9)。EPSG:4326を使っていて、表示専用でジオメトリを出力する場合には、maxdecimaldigits=6が、多くの地図で良い選択となります。
![]() | |
任意引数 |
options引数は、GeoJSON出力でBBOXまたはCRSを追加するために使われます。次のようにします。
0: オプションなし
1: GeoJSON BBOX
2: GeoJSON Short CRS (たとえば EPSG:4326)
4: GeoJSON Long CRS (たとえば urn:ogc:def:crs:EPSG:4326)
8: EPSG:4326でない場合にGeoJSON Short CRS (デフォルト)
id_columnパラメータは、返されるGeoJSONの地物の"id"メンバの値設定に使われます。GeoJSON RFCによると、これは、主キーのように地物が共通して使用する識別子を持つときは常に*使うべき*とされています。指定しない場合には、生成される地物に"id"メンバが入りません。ジオメトリ以外のカラムは、潜在的なキーも含めて、地物の"properties"メンバ内に入ります。
入力レコードのカラム名に重複があるとき、"properties"オブジェクトは重複キーを持つことになります。この場合にはST_AsGeoJSONは警告を出します。 PostgreSQLのjsonbは重複キーがあると最後の値だけをキープするためです。
GeoJSON仕様では右手系を使っていて、このポリゴンの向きが前提のクライアントもあります。これはST_ForcePolygonCCWを使うことでこの向きを確実にできます。またGeoJSON仕様ではジオメトリーはWGS84座標系 (SRID=4326)である必要があります。必要ならST_Transformを使うことでジオメトリーをWGS84に座標変換できます。ST_Transform(geom, 4326 )といったように使います。
GeoJSONはgeojson.ioと geojsonlint.comで、オンラインでのテストと表示が可能です。また、Webマッピングフレームワークで広く対応されています。
Availability: 1.3.4
Availability: 1.5.0 ジオグラフィが導入されました。
Changed: 2.0.0 デフォルト引数と名前付き引数に対応しました。
Changed: 3.0.0 レコードの入力に対応しました
Changed: 3.0.0 EPSG:4326以外の場合のSRID出力。
Changed: 3.5.0 地物のidを含むカラムを指定できるようになりました
Changed: 3.7.0 キー重複に関する警告の追加
この関数は3次元に対応し、Z値を削除しません。
FeatureCollectionの生成:
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"}}データをGeoJSON使用に準拠したWGS84経度緯度に変換するのを忘れないで下さい。
SELECT ST_AsGeoJSON(ST_Transform(geom, 4326)) FROM fe_edges LIMIT 1;
{"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000],
[-89.734955999999997,31.492237999999997]]]}
3次元ジオメトリへの対応:
SELECT ST_AsGeoJSON('LINESTRING(1 2 3,4 5 6)');{"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}Options引数は、GeoJSON出力でBBOXまたはCRSを追加するために使われます:
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);
Geography Markup Language (GML)要素としてジオメトリを返します。versionパラメータは、指定する場合には2か3になります。versionパラメータが無い場合には、デフォルトは2です。maxdecimaldigits引数は出力に使用する小数点以下桁数 (デフォルトは15です)の最大値を減らすために使えます。
![]() | |
任意引数 |
GML2では2.1.2版を参照し、GML3では3.1.1を参照します。
最後の'options'引数はビットフィールドです。GML出力のCRS出力型を定義するために、また緯度/経度でデータを宣言するために使います。
0: GML Short CRS (たとえば EPSG:4326)、デフォルト値
1: GML Long CRS (たとえば urn:ogc:def:crs:EPSG:4326)
2: GML 3のみ対応。srsDimension属性を出力から削除します。
4: GML 3のみ対応。線について<Curve>でなく<LineString>要素を使います。
16: データは緯度/経度 (すなわち SRID=4326)です。デフォルトではデータは平面上にあると仮定します。このオプションはGML 3.1.1による出力でのみ使われ、軸のオーダに関連します。これを設定すると、座標の順序を入れ替えるので、データベースの経度/緯度の順でなく緯度/経度の順になります。
32: ジオメトリのボックス (エンベロープ)を出力します。
'namespace prefix'引数は、カスタム名前空間のプリフィクスを指定したり、名前空間プリフィクスを指定しない (空にした場合)ために使用します。NULLを指定するか省略した場合には、'gml'プレフィクスを使用します。
Availability: 1.3.2
Availability: 1.5.0 ジオグラフィが導入されました。
Enhanced: 2.0.0 プレフィクスが導入されました。 GML 3用であるoptionsの4は、曲線のかわりにラインストリングを使えるようにするためのものです。GML 3の多面体サーフェスとTINが導入されました。optionsの32はボックスを出力するために導入されました。
Changed: 2.0.0 デフォルトの名前付き引数を使います。
Enhanced: 2.1.0 GML 3用にidが導入されました。
![]() | |
ST_AsGMLのGML 3版以上では多面体サーフェスとTINに対応しています。 |
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 17.2
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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.
X値とY値を入れ替えて空間参照系に関するオプションを (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 >
この例では多面体サーフェスを使います。
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 Markup Language (KML)要素として返します。デフォルトの最大の小数点以下の桁数は15で、デフォルトの名前空間はプリフィクス無しです。
![]() | |
任意引数 |
Availability: 1.2.2 - versionパラメータが付く形式は1.3.2からです。
Enhanced: 2.0.0 - プレフィクスの名前空間の追加、デフォルト値と名前付き引数の追加
Changed: 3.0.0 - "version"の付いた形式の削除
![]() | |
PostGISがProj対応でコンパイルされている必要があります。PostGIS_Full_Versionを使ってProj対応でコンパイルされているか確認して下さい。 |
![]() | |
AsKML出力はSRIDを持たないジオメトリでは動作しません。 |
この関数は3次元に対応し、Z値を削除しません。
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" (cardinal direction)が4方位 (NSEW)です。DMSトークンは、求める幅と精度で示すために、繰り返せます ("SSS.SSSS"では" 1.0023"になります)。
"M"と"S"と"C"は必須ではありません。"C"が省略された場合には、南または西の場合には"-"符号がついたうえで、指定した精度で、度が表示されます。"M"も省略された場合には、指定した精度の桁数で十進の度が表示されます。
書式文字列が省略された (または長さが0の)場合には、デフォルトの書式が使われます。
Availability: 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
4方位文字でなく符号で示された度。
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 — ジオメトリを、地理データフィールド (034)を持つMARC21/XMLデータとして返します。
text ST_AsMARC21 ( geometry geom , text format='hdddmmss' );
この関数は与えられたジオメトリのバウンディングボックスを表現するコード化地図数値データを持つMARC21/XMLのデータを返します。formatパラメータを使うと、MARC21/XMLが対応する全てのフォーマットにおける$d、$e、$f、$gサブフィールド内の座標を符号化できます。妥当なフォーマットは次の通りです。
経緯度識別値、度、分、秒 (デフォルト): hdddmmss
経緯度識別値付き十進の度: hddd.dddddd
経緯度識別値なし十進の度: ddd.dddddd
経緯度識別値付き十進の分: hdddmm.mmmm
経緯度識別値なし十進の分: dddmm.mmmm
経緯度識別値付き十進の秒: hdddmmss.sss
小数点はhdddmm,mmmmのようにカンマでも構いません。
10進数形式の精度は小数点以下の数字の数によって制限されます。十進の分でhdddmm.mmの場合には2桁の精度となります。
この関数はZ値とM値を無視します。
対応するLOC MARC21/XMLのバージョンは次の通りです。
Availability: 3.3.0
![]() | |
この関数は経度/緯度でないジオメトリには対応していません。MARC21/XML標準 (コード化地図数値データ)で対応していないためです。 |
![]() | |
MARC21/XML標準では、コード化地図数値データに空間参照系情報を与えることはできません。これはMARC21/XMLへの変換で空間参照系情報が失われることを意味します。 |
POINTのhdddmmss (デフォルト)を使ったMARC21/XMLへの変換
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)です。
この関数は、ジオメトリに妥当性を保持しようとし、必要なら修正します。これによって、結果ジオメトリが低い次元に落ちる可能性があります。
この関数は整数タイル座標空間に適切なジオメトリーの単純化を行います。タイル座標への変換の後、整数グリッドに座標値をスナップさせ、重複ポイントは除去され、直線上のポイントも除去されます。この関数は ST_Simplify.のような多目的、縮尺依存の単純化関数とは異なります。タイル変換前に細かい物を減らすには、ST_AsMVTGeomの前に地図の座標系のジオメトリーを単純化します。
対象地図の座標空間内のタイルを示す四角形の境界を与えなければなりません。ジオメトリが変換され、必要なら切り抜きます。境界はST_TileEnvelopeで生成できます。
この関数はジオメトリをST_AsMVTが求める座標空間に変換するために使います。
geomは変換するジオメトリで、対象地図の座標系です。
boundsは地図の座標空間内のタイルの四角形境界で、バッファはありません。
extentはMVT specificationで定義されるタイル座標空間でのタイルのサイズです。デフォルトは4096です。
bufferは、ジオメトリの切り抜きを行うためのタイル座標空間におけるバッファサイズです。デフォルトは256です。
clip_geomはジオメトリを切り抜くかそのままで符号化するかを制御する真偽値です。デフォルトはTRUEです。
Availability: 2.4.0
![]() | |
3.0からは、MVTポリゴンのクリップと検証にコンフィギュア時にWagyuを選択することができるようになりました。このライブラリは、デフォルトの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メルカトルのタイルの標準的な例です。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表現で返す集約関数です。行には地物ジオメトリとして符号化されるgeometryが必ずあります。ジオメトリはタイルの座標空間に存在しなければならず、MVT specificationとして妥当でなければなりません。ST_AsMVTGeomはジオメトリをタイルの座標空間に変換するのに使えます。他のカラムは地物の属性として符号化されます。
Mapbox Vector Tile書式は、様々な属性就業を持つ地物を格納することができます。この能力を使うには、JSONオブジェクトを1レベルの深さで持っている行データ内のJSONBカラムを提供します。JSONB値のキーと値は地物の属性として符号化されます。
この関数への複数の呼び出しを||やSTRING_AGGで繋げることで、複数レイヤのタイルを作ることができます。
![]() | |
|
row 少なくとも一つのジオメトリカラムを持つ行データ。
nameはレイヤ名です。デフォルトは"default"という文字列です。
extentは、仕様で定義されている画面空間内のタイル範囲です。NULLの場合には、4096をデフォルト値とします。
geom_nameは、行データ内のジオメトリカラム名です。デフォルトはジオメトリカラムのうちの先頭です。PostgreSQLはデフォルトでは自動的に引用符で括らない識別子は小文字になります。これは、ジオメトリカラムがカラム名が引用符で括られる("MyMVTGeom"等)ようになっていない場合には、このパラメータは小文字で渡さなければなりません。
feature_id_nameは行データの地物IDカラムの名前です。NULLまたは負数の場合には地物IDは設定されません。名前が合致し、妥当な型 (smallint, integer, bigint)である最初のカラムが地物IDに使われます。後続のカラムは全てプロパティとして追加されます。JSONプロパティには対応していません。
Enhanced: 3.0 - 地物IDへの対応を追加。
Enhanced: 2.5.0 - パラレルクエリへの対応の追加。
Availability: 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)としてジオメトリを返します。 第2引数に1を指定すると、相対移動によるパスデータ実装を返し、絶対移動の場合はデフォルト (または0)とします。第3引数は、出力の十進数の最大桁数を減らすために使います (デフォルトは15です)。ポイントジオメトリは、'rel'が0のときはポイントはcx/cyに、'rel'が1のときはx/yに、それぞれ出力されます。マルチポイントはコンマ (",")で区切られ、ジオメトリコレクションはセミコロン (";")で区切られます。
PostGIS SVG グラフィックを使うには、ST_AsSVGからの出力を操作するためのPL/pgSQL関数を提供するpg_svgライブラリをチェックアウトして下さい。
Enhanced: 3.4.0 全ての曲線タイプに対応しました
Changed: 2.0.0 - デフォルト引数と名前付き引数に対応しました。
Availability: 1.2.2. Availability: 1.4.0 PostGIS 1.4.0でhttp://www.w3.org/TR/SVG/paths.html#PathDataBNFに従うため、絶対パスにLコマンドが入りました。
このメソッドは曲線ストリングと曲線に対応しています。
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
曲線ストリング
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
マルチ曲線
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
マルチサーフェス
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は、出力サイズを最小化することに焦点を当てたcompressed binary format (圧縮バイナリ書式)です。
decimaldigitsパラメータによって、出力に持たせる精度を制御できます。デフォルトでは、符号化前に値は単位上の最近値に丸められます。精度が高いものを転送したいなら、これの数字を大きくします。たとえば、1の値は小数点の右に1桁の数字が保存されます。
include_sizesとinclude_bounding_boxesパラメータによって、符号化オブジェクトの長さに関する任意情報の有無やオブジェクトの境界の有無を制御できます。デフォルトでは、無しです。クライアントソフトウェアが、これらの情報を使用しないなら、このパラメータを有効にしないで下さい。空白が増える (しかも空白の抑制がTWKBのポイントである)ためです。
配列入力の形式は、ジオメトリのコレクションを変換して、一意の識別子をTWKBコレクションに持たせるためのものです。これは、コレクションを展開して、オブジェクト内部に関する情報にさらにアクセスするのに使えます。array_agg関数を使用して配列を生成できます。他のパラメータは、単純な形式のものと同じです。
![]() | |
書式仕様はhttps://github.com/TWKB/Specificationにあります。JavaScriptクライアントを構築するプログラムはhttps://github.com/TWKB/twkb.jsにあります。 |
Enhanced: 2.4.0 メモリと速度の改善。
Availability: 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_AsX3D — ジオメトリをX3Dノード要素書式 (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 2次元/3次元型からX3D型への対応付けを示します。 |
'options'引数はビットフィールドです。X3D GeoCoordinates Geospatialノードを表現するかどうか、また、X/Y軸を反対にするかどうかで使います。ST_AsX3Dは、デフォルトではデータベースの形式 (経度, 緯度またはX, Y)で出力しますが、X3Dのlat/lon, y/xのデフォルトが好まれることがあります。
0: データベース内のX/Y順 (経度/緯度=X, Yが標準です)とします。デフォルト値です。非空間座標 (一般的な古いCoordinate要素です)です。
1: XとYを反対にします。GeoCoordinate任意スイッチと併せて使用されると、出力は"latitude_first" (緯度が先)となり、座標が同じように反対になります。
2: GeoSpatial GeoCoordinates内への座標出力。WGS 84経度緯度 (SRID: 4326)でない場合にエラーが投げられます。現在はGeoCoordinate型のみ対応します。X3D specs specifying a spatial reference system.を参照して下さい。デフォルト出力はGeoCoordinate geoSystem='"GD" "WE" "longitude_first"'となります。X3DのデフォルトであるGeoCoordinate geoSystem='"GD" "WE" "latitude_first"'とするには、(2 + 1) = 3とします。
| PostGISタイプ | 2次元X3Dタイプ | 3次元X3Dタイプ |
|---|---|---|
| LINESTRING | 未実装 - PolyLine2Dの予定 | LineSet |
| MULTILINESTRING | 未実装 - PolyLine2Dの予定 | IndexedLineSet |
| MULTIPOINT | Polypoint2D | PointSet |
| POINT | 空白区切り座標値を出力 | 空白区切り座標値を出力 |
| (MULTI) POLYGON, POLYHEDRALSURFACE | 不正なX3Dマークアップ | IndexedFaceSet (内環は現在は他のfacesetとして出力) |
| TIN | TriangleSet2D (未実装) | IndexedTriangleSet |
![]() | |
2次元ジオメトリ対応はまだ不完全です。 内環は現在は分けられたポリゴンとして描画されるだけです。作業中です。 |
3次元空間については、特にX3D Integration with HTML5で大きな進歩があります。
また、描画されたジオメトリを閲覧するための素晴らしいオープンソースのX3Dビューアがあります。Free Wrl http://freewrl.sourceforge.net/のバイナリがMac, Linux, Windows用であります。ジオメトリを見るためのパッケージであるFreeWRL_Launcherを使います。
この関数とx3dDom html/js open source toolkitを用いたPostGIS minimalist X3D viewerを開いてみて下さい。
Availability: 2.0.0: ISO-IEC-19776-1.2-X3DEncodings-XML
Enhanced: 2.2.0: GeoCoordinatesと軸 (x/y, 経度/緯度)の反転に対応しました。詳細はoptionsを見て下さい。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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);
ジオメトリのジオハッシュ表現を計算します。ジオハッシュは地理座標系のポイントを、前置に基づいた文字列として符号化したもので、ソート可能かつ検索可能です。短いジオハッシュではポイントは低精度に表現されています。これは、ポイントを含むボックスと考えることができます。
0でない範囲を持つ、ポイントでないジオメトリ値はジオハッシュコードに対応付けできます。コードの精度はジオメトリの地理範囲に依存します。
maxcharsが指定されていない場合には、返されるジオハッシュコードは、入力ジオメトリを含む最も小さいセルです。ポイントでは、20文字の精度 (入力の完全な倍精度浮動小数点数の保持十分です)ジオハッシュを返します。他のジオメトリタイプでは、より低い精度のジオハッシュを返しますが、精度はジオメトリの範囲に依存します。大きいジオメトリは低い精度となり、小さいジオメトリは高い精度になります。ジオハッシュコードで決まるボックスは常に入力入力地物を含んでいます。
maxcharsが指定された場合には、この値は、返されるジオハッシュコードの最大文字数になります。入力ジオメトリは(おそらく)より低い精度で表現されます。ポイントでない場合には、計算の最初のポイントはジオメトリのバウンダリボックスの中心となります。
Availability: 1.4.0
![]() | |
ST_GeoHashの入力ジオメトリは、地理座標系 (経度/緯度)でなければなりません。 |
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_GeoHash(ST_Point(-126, 48));
c0w3hf1s70w3hf1s70w3
SELECT ST_GeoHash(ST_Point(-126, 48), 5);
c0w3h
この例ではポイントを含むラインのGeoHashはポイントをすべて含む最長のコードになることを示しています。
SELECT ST_GeoHash('LINESTRING(-126 48,-126.1 48.1)'::geometry);c0w3
ここではPostGISで定義されている空間演算子について記述しています。演算子はバウンディングボックスの相互作用および空間関係に関する簡潔な記号による述語で関数を補うものです。関連する関数と同じ処理ルールに従って動作しますが、SQL式での利用やインデックス対応のフィルタリングでの利用に最適化されています。
TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。TRUEを返します。&& — Aの2次元バウンディングボックスがBの2次元バウンディングボックスとインタセクトする場合にTRUEを返します。
boolean &&( geometry A , geometry B );
boolean &&( geography A , geography B );
&&演算子は、Aの2次元バウンディングボックスがBの2次元バウンディングボックスとインタセクトする場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
Availability: 1.5.0 ジオグラフィ対応が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT tbl1.column1, tbl2.column1, tbl1.column2 && tbl2.column2 AS overlaps
FROM ( VALUES
(1, 'LINESTRING(0 0, 3 3)'::geometry),
(2, 'LINESTRING(0 1, 0 5)'::geometry)) AS tbl1,
( VALUES
(3, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;
column1 | column1 | overlaps
---------+---------+----------
1 | 3 | t
2 | 3 | f
(2 rows)&&(geometry,box2df) — ジオメトリの (キャッシュされている)2次元バウンディングボックスが単精度浮動小数点数による2次元バウンディングボックスとインタセクトする場合にTRUEを返します。
boolean &&( geometry A , box2df B );
&&演算子は、ジオメトリAのキャッシュされた2次元バウンディングボックスが、2次元バウンディングボックスBとインタセクトする場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Bが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_Point(1,1) && ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) AS overlaps;
overlaps ---------- t (1 row)
&&(box2df,geometry) — 単精度浮動小数点数による2次元バウンディングボックスがジオメトリの (キャッシュされている)2次元バウンディングボックスとインタセクトする場合にTRUEを返します。
boolean &&( box2df A , geometry B );
&&演算子は、2次元バウンディングボックスAが、ジオメトリBのキャッシュされた2次元バウンディングボックスとインタセクトする場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Aが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_Point(1,1) AS overlaps;
overlaps ---------- t (1 row)
&&(box2df,box2df) — 二つの単精度浮動小数点数による2次元バウンディングボックス (BOX2DF)が相互にインタセクトする場合にTRUEを返します。
boolean &&( box2df A , box2df B );
&&演算子は、2次元バウンディングボックスAとBが相互にインタセクトする場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。AまたはBが倍精度浮動小数点数を使うbox2dである場合には、バウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_MakeBox2D(ST_Point(1,1), ST_Point(3,3)) AS overlaps;
overlaps ---------- t (1 row)
&&& — Aのn次元バウンディングボックスがBのn次元バウンディングボックスとインタセクトする場合にTRUEを返します。
boolean &&&( geometry A , geometry B );
&&&演算子は、Aのn次元バウンディングボックスがBのn次元バウンディングボックスとインタセクトする場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
Availability: 2.0.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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) — ジオメトリの (キャッシュされている)n次元バウンディングボックスが単精度浮動小数点数によるn次元バウンディングボックス (GIDX)とインタセクトする場合にTRUEを返します。
boolean &&&( geometry A , gidx B );
&&&演算子は、ジオメトリAのキャッシュされたn次元バウンディングボックスが、n次元バウンディングボックスBとインタセクトする場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Bが倍精度浮動小数点数を使うbox3dである場合には、単精度浮動小数点数による3次元バウンディングボックス (GIDX)に変換されることになります。
![]() | |
この演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_MakePoint(1,1,1) &&& ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) AS overlaps;
overlaps ---------- t (1 row)
&&&(gidx,geometry) — 単精度浮動小数点数によるn次元バウンディングボックス (GIDX)がジオメトリの (キャッシュされている)n次元バウンディングボックスとインタセクトする場合にTRUEを返します。
boolean &&&( gidx A , geometry B );
&&&演算子は、n次元バウンディングボックスAが、ジオメトリBのキャッシュされたn次元バウンディングボックスとインタセクトする場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Aが倍精度浮動小数点数を使うbox3dである場合には、単精度浮動小数点数による3次元バウンディングボックス (GIDX)に変換されることになります。
![]() | |
この演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_MakePoint(1,1,1) AS overlaps;
overlaps ---------- t (1 row)
&&&(gidx,gidx) — 二つの単精度浮動小数点数によるn次元バウンディングボックス (GIDX)が相互にインタセクトする場合にTRUEを返します。
boolean &&&( gidx A , gidx B );
&&&演算子は、n次元バウンディングボックスAとBが相互にインタセクトする場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。AまたはBが倍精度浮動小数点数を使うbox3dである場合には、単精度浮動小数点数による3次元バウンディングボックス (GIDX)に変換されることになります。
![]() | |
この演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_3DMakeBox(ST_MakePoint(1,1,1), ST_MakePoint(3,3,3)) AS overlaps;
overlaps ---------- t (1 row)
&< — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの左にある場合にTRUEを返します。
boolean &<( geometry A , geometry B );
&<演算子は、AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの左にある場合にTRUEを返します。条件についてより詳細に言うと、BのバウンディングボックスをオーバラップするかBのバウンディングボックスの右に*ない*場合です。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &< tbl2.column2 AS overleft
FROM
( VALUES
(1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2;
column1 | column1 | overleft
---------+---------+----------
1 | 2 | f
1 | 3 | f
1 | 4 | t
(3 rows)
&<| — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの下にある場合にTRUEを返します。
boolean &<|( geometry A , geometry B );
&<|演算子は、AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの下にある場合にTRUEを返します。条件についてより詳細に言うと、BのバウンディングボックスをオーバラップするかBのバウンディングボックスの上に*ない*場合です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &<| tbl2.column2 AS overbelow
FROM
( VALUES
(1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;
column1 | column1 | overbelow
---------+---------+-----------
1 | 2 | f
1 | 3 | t
1 | 4 | t
(3 rows)
&> — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの右にある場合にTRUEを返します。
boolean &>( geometry A , geometry B );
&>演算子は、AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの右にある場合にTRUEを返します。条件についてより詳細に言うと、BのバウンディングボックスをオーバラップするかBのバウンディングボックスの左に*ない*場合です。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &
> tbl2.column2 AS overright
FROM
( VALUES
(1, 'LINESTRING(1 2,4 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0,3 3)'::geometry),
(3, 'LINESTRING(0 1,0 5)'::geometry),
(4, 'LINESTRING(6 0,6 1)'::geometry)) AS tbl2;
column1 | column1 | overright
---------+---------+-----------
1 | 2 | t
1 | 3 | t
1 | 4 | f
(3 rows)
<< — Aのバウンダリボックスが、厳密にBのバウンダリボックスの左にある場合にTRUEを返します。
boolean <<( geometry A , geometry B );
<<演算子はAのバウンダリボックスが、厳密にBのバウンダリボックスの左にある場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 << tbl2.column2 AS left
FROM
( VALUES
(1, 'LINESTRING (1 2, 1 5)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0, 4 3)'::geometry),
(3, 'LINESTRING (6 0, 6 5)'::geometry),
(4, 'LINESTRING (2 2, 5 6)'::geometry)) AS tbl2;
column1 | column1 | left
---------+---------+------
1 | 2 | f
1 | 3 | t
1 | 4 | t
(3 rows)
<<| — Aのバウンダリボックスが、厳密にBのバウンダリボックスの下にある場合にTRUEを返します。
boolean <<|( geometry A , geometry B );
<<|演算子は、Aのバウンダリボックスが、厳密にBのバウンダリボックスの下にある場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 <<| tbl2.column2 AS below
FROM
( VALUES
(1, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (1 4, 1 7)'::geometry),
(3, 'LINESTRING (6 1, 6 5)'::geometry),
(4, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl2;
column1 | column1 | below
---------+---------+-------
1 | 2 | t
1 | 3 | f
1 | 4 | f
(3 rows)
= — ジオメトリ/ジオグラフィ Aの座標と座標の並び順がジオメトリ/ジオグラフィ Bと同じ場合にTRUEを返します。
boolean =( geometry A , geometry B );
boolean =( geography A , geography B );
=演算子は、ジオメトリ/ジオグラフィ Aの座標と座標の並び順がジオメトリ/ジオグラフィ Bと同じ場合にTRUEを返します。PostgreSQLは、ジオメトリの内部の順位付けと比較 (GROUP BYやORDER BY節などで使います)のために、ジオメトリ用に定義されている=, <および> 演算子を使います。
![]() | |
この演算子は、同じ座標値と並び順である、全ての点で確実に同じジオメトリ/ジオグラフィだけを同じと考えます。「空間的に等価」、つまり、並び順は無視し、異なる表現でも同じ空間領域を占めるかどうかをテストするには、ST_OrderingEqualsまたはST_Equalsを使います。 |
![]() | |
この演算子は、ジオメトリで有効なインデックスを一切*使いません*。インデックスを使った確実な等価性試験を行うには、=と&&を併用します。 |
Changed: 2.4.0, 以前の版では、ジオメトリ自体の等価性でなくバウンディングボックスが等価かどうかを見ていました。バウンディングボックスが等価かどうかを知る必要がある場合には、替わりに~=を使います。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
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)
>> — Aのバウンダリボックスが、厳密にBのバウンダリボックスの右にある場合にTRUEを返します。
boolean >>( geometry A , geometry B );
>>演算子は、Aのバウンダリボックスが、厳密にBのバウンダリボックスの右にある場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2
>
> tbl2.column2 AS right
FROM
( VALUES
(1, 'LINESTRING (2 3,5 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (1 4,1 7)'::geometry),
(3, 'LINESTRING (6 1,6 5)'::geometry),
(4, 'LINESTRING (0 0,4 3)'::geometry)) AS tbl2;
column1 | column1 | right
---------+---------+-------
1 | 2 | t
1 | 3 | f
1 | 4 | f
(3 rows)
@ — AのバウンダリボックスがBのバウンダリボックスに含まれている場合にTRUEを返します。
boolean @( geometry A , geometry B );
@演算子は、AのバウンダリボックスがBのバウンダリボックスに、完全に含まれている場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 @ tbl2.column2 AS contained
FROM
( VALUES
(1, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0, 4 4)'::geometry),
(3, 'LINESTRING (2 2, 4 4)'::geometry),
(4, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl2;
column1 | column1 | contained
---------+---------+-----------
1 | 2 | t
1 | 3 | f
1 | 4 | t
(3 rows)
@(geometry,box2df) — ジオメトリの2次元バウンディングボックスが単精度浮動小数点数による2次元バウンディングボックス (BOX2DF)に包含される場合にTRUEを返します。
boolean @( geometry A , box2df B );
@演算子は、ジオメトリAの2次元バウンディングボックスが、2次元バウンディングボックスBに包含される場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Bが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_Buffer('POINT(2 2)'::geometry, 1) @ ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) AS is_contained;t
@(box2df,geometry) — 単精度浮動小数点数による2次元バウンディングボックス (BOX2DF)がジオメトリの2次元バウンディングボックスに包含される場合にTRUEを返します。
boolean @( box2df A , geometry B );
@演算子は、2次元バウンディングボックスAが、ジオメトリBの2次元バウンディングボックスに包含される場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Aが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(2, 2), ST_Point(3, 3)) @ ST_Buffer('POINT(1 1)'::geometry, 10) AS is_contained;t
@(box2df,box2df) — 二つの単精度浮動小数点数によるn次元バウンディングボックス (GIDX)の一方がもう一方を包含する場合にTRUEを返します。
boolean @( box2df A , box2df B );
@演算子は、2次元バウンディングボックスAが2次元バウンディングボックスBに包含される場合には、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。AまたはBが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
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
|&> — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの上にある場合にTRUEを返します。
boolean |&>( geometry A , geometry B );
|&>演算子は、AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの上にある場合にTRUEを返します。条件についてより詳細に言うと、BのバウンディングボックスをオーバラップするかBのバウンディングボックスの下に*ない*場合です。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 |&
> tbl2.column2 AS overabove
FROM
( VALUES
(1, 'LINESTRING(6 0,6 4)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0,3 3)'::geometry),
(3, 'LINESTRING(0 1,0 5)'::geometry),
(4, 'LINESTRING(1 2,4 6)'::geometry)) AS tbl2;
column1 | column1 | overabove
---------+---------+-----------
1 | 2 | t
1 | 3 | f
1 | 4 | f
(3 rows)
|>> — Aのバウンダリボックスが、厳密にBのバウンダリボックスの上にある場合にTRUEを返します。
boolean |>>( geometry A , geometry B );
|>>演算子は、Aのバウンダリボックスが、厳密にBのバウンダリボックスの上にある場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 |>> tbl2.column2 AS above
FROM
( VALUES
(1, 'LINESTRING (1 4,1 7)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0,4 2)'::geometry),
(3, 'LINESTRING (6 1,6 5)'::geometry),
(4, 'LINESTRING (2 3,5 6)'::geometry)) AS tbl2;column1 | column1 | above
---------+---------+-------
1 | 2 | t
1 | 3 | f
1 | 4 | f
(3 rows)~ — AのバウンディングボックスがBのバウンディングボックスを含む場合にTRUEを返します。
boolean ~( geometry A , geometry B );
~演算子は、AのバウンディングボックスがBのバウンディングボックスを、完全に含む場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 ~ tbl2.column2 AS contains
FROM
( VALUES
(1, 'LINESTRING (0 0,3 3)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0,4 4)'::geometry),
(3, 'LINESTRING (1 1,2 2)'::geometry),
(4, 'LINESTRING (0 0,3 3)'::geometry)) AS tbl2;column1 | column1 | contains
---------+---------+----------
1 | 2 | f
1 | 3 | t
1 | 4 | t
(3 rows)~(geometry,box2df) — ジオメトリの (キャッシュされている)2次元バウンディングボックスが単精度浮動小数点数によるn次元バウンディングボックス (GIDX)を包含する場合にTRUEを返します。
boolean ~( geometry A , box2df B );
~演算子は、ジオメトリAの2次元バウンディングボックスが、2次元バウンディングボックスBを包含する場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Bが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_Buffer('POINT(1 1)'::geometry, 10) ~ ST_MakeBox2D(ST_Point(0, 0), ST_Point(2, 2)) AS contains;t
~(box2df,geometry) — 単精度浮動小数点数による2次元バウンディングボックス (BOX2DF)をジオメトリの (キャッシュされている)2次元バウンディングボックスが包含する場合にTRUEを返します。
boolean ~( box2df A , geometry B );
~演算子は、2次元バウンディングボックスAが、ジオメトリBの2次元バウンディングボックスを包含する場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。Aが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) ~ ST_Buffer('POINT(2 2)'::geometry, 1) AS contains;t
~(box2df,box2df) — 二つの単精度浮動小数点数による2次元バウンディングボックス (BOX2DF)の一方がもう一方を包含する場合にTRUEを返します。
boolean ~( box2df A , box2df B );
~演算子は、2次元バウンディングボックスAが、2次元バウンディングボックスBを包含する場合に、TRUEを返します。単精度浮動小数点数によるバウンディングボックスを使います。AまたはBが倍精度浮動小数点数を使うbox2dである場合には、単精度浮動小数点数によるバウンディングボックス (BOX2DF)に変換されることになります。
![]() | |
この被演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0, 0), ST_Point(5, 5)) ~ ST_MakeBox2D(ST_Point(2, 2), ST_Point(3, 3)) AS contains;
t
~= — AのバウンディングボックスがBのバウンディングボックスと同じ場合に TRUEを返します。
boolean ~=( geometry A , geometry B );
~=演算子はジオメトリ/ジオグラフィAのバウンディングボックスがジオメトリ/ジオグラフィBのバウンディングボックスと同じ場合にTRUEを返します。
![]() | |
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
Availability: 1.5.0 挙動が変更されました
この関数は多面体サーフェスに対応しています。
![]() | |
この演算子の挙動はPostGIS 1.5で、実際のジオメトリとしての等価性のテストから、バウンディングボックスの等価性のテストに変更されました。ハードアップグレードまたはソフトアップグレードを実行している場合は、データベースがどの挙動を持つかに動作が依存して、ややこしくなります。データベースがどの挙動を持つか判断するために、下のクエリを実行することができます。本当の等価性をチェックするにはST_OrderingEqualsまたは ST_Equalsを使用します。 |
SELECT 'LINESTRING(0 0,1 1)'::geometry ~= 'LINESTRING(0 1,1 0)'::geometry AS equality;
t
<-> — AとBの2次元距離を返します。
double precision <->( geometry A , geometry B );
double precision <->( geography A , geography B );
<->演算子は二つのジオメトリーの2次元距離を返します。"ORDER BY"句内で使われ、インデックスの援助を受けた近傍結果集合の結果を返します。ジオメトリーではデカルト距離を使い、ジオグラフィでは球面上の距離を計算します。
![]() | |
これのオペランドはジオメトリで利用できるインデックスを使用します。他の演算子との相違点は、ORDER BY句でのみインデックスが使用される点です。 |
![]() | |
ジオメトリのひとつが定数となる (副問い合わせ/共通テーブル式にない)場合 (a.geomでなく'SRID=3005;POINT(1011102 450541)'::geometry等となる場合)には、インデックスが有効になるだけです。 |
詳細な例についてはOpenGeo workshop: Nearest-Neighbour Searchingを参照して下さい。
Enhanced: 2.2.0 -- 真のKNN (k近傍法)のジオメトリーとジオグラフィーのふるまい。ジオグラフィーのKNNは回転楕円体でなく球面に基づきます。
Changed: 2.2.0 -- 真のKNNが有効になると、古いハイブリッド法による回避策は遅くなることがあります。下の例を見てください。
Availability: 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"を実行すると、二つ目で速度が改善したことが分かります。
プランで直接確実な距離を生成できない時には、真の近傍を見つけるには複合クエリーを追加居ます。まずインデックスを使ったKNNによるCTE (Common Table Expression, WITH句)クエリーを実行し、その後に正しい順序を得るための確実なクエリーを実施します。次のようにします:
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 );
|=|演算子は二つのトラジェクトリー (ST_IsValidTrajectory参照)の間の3次元距離を返します。ST_DistanceCPAと同じですが、この演算子はN次元インデックスを使った最近傍探索を行います。
![]() | |
この演算子は、ジオメトリで使用可能なND GiST (n次元GiST)インデックスを使用します。他の空間インデックスを使う演算子と違い、ORDER BY句でのみ空間インデックスを使います。 |
![]() | |
ジオメトリのひとつが定数となる (副問い合わせ/共通テーブル式にない)場合 (a.geomでなく'SRID=3005;LINESTRINGM(0 0 0,0 0 1)'::geometry等となる場合)には、インデックスが有効になるだけです。 |
Availability: 2.2.0.
この例では格納されているトラジェクトリーをリテラルのトラジェクトリーとの距離で並び替えます。
\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)<#> — AのバウンディングボックスとBのバウンディングボックスの2次元距離を返します。
double precision <#>( geometry A , geometry B );
<#>演算子は、二つの浮動小数点数型ボックスの間の距離を返します。場合によっては空間インデックスから読みます。最近傍の概算距離での並び替えに使えます。
![]() | |
これのオペランドはジオメトリで利用できるインデックスを使用します。他の演算子との相違点は、ORDER BY句でのみインデックスが使用される点です。 |
![]() | |
ジオメトリのひとつがg1.geom <#>と違って ORDER BY (ST_GeomFromText('POINT(1 2)') <#> geom)というように定数である場合には、インデックスが有効になるだけです。 |
Availability: 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)
<<->> — AとBの間またはそれらのバウンディングボックスの間のn次元距離を返します
double precision <<->>( geometry A , geometry B );
<<->>演算子は、二つのジオメトリのバウンディングボックスの重心のn次元 (ユークリッド)距離を返します。近傍の概ねの距離による並び替えに使います。
![]() | |
これのオペランドはジオメトリで利用できるインデックスを使用します。他の演算子との相違点は、ORDER BY句でのみインデックスが使用される点です。 |
![]() | |
ジオメトリのひとつが定数となる (副問い合わせ/共通テーブル式にない)場合 (a.geomでなく'SRID=3005;POINT(1011102 450541)'::geometry等となる場合)には、インデックスが有効になるだけです。 |
Availability: 2.2.0.
これらの関数は、ジオメトリ間の空間的な関係を判定します。
ST_3DIntersects — 二つのジオメトリが3次元空間において空間的にインタセクトするかどうかをテストします。ポイント、ラインストリング、ポリゴン、多面体サーフェス (面)についてのみ動作します。
boolean ST_3DIntersects( geometry geomA , geometry geomB );
オーバラップ、接触、包含は全て、ジオメトリがインタセクトしていることを意味しています。これらがTRUEを返す場合は、空間的にインタセクトしています。非接続は、空間インタセクトについてFALSEとなります。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
![]() | |
浮動小数点数のロバスト性の障害のため、ジオメトリ処理後に期待するようなインタセクトが常にあるわけではないことになります。たとえば、ジオメトリに対するラインストリング上の最接近点がラインストリング上に無いことがあります。インタセクトと考えたいのにセンチメートル程度の距離があると、この問題は発生しますが、この種の問題への対応には、ST_3DDWithinを使います。 |
Changed: 3.0.0 SFCGALバックエンドが削除され、GEOSバックエンドではTINに対応しました。
Availability: 2.0.0
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 5.1
SELECT ST_3DIntersects(pt, line), ST_Intersects(pt, line) FROM (SELECT 'POINT(0 0 2)'::geometry As pt, 'LINESTRING (0 0 1,0 2 3)'::geometry As line) As foo;
st_3dintersects | st_intersects -----------------+--------------- f | t (1 row)
SELECT ST_3DIntersects('TIN(((0 0 0,1 0 0,0 1 0,0 0 0)))'::geometry, 'POINT(.1 .1 0)'::geometry);t
ST_Contains — Bの全てのポイントがA内にあり、かつ、双方の内部に共有点が存在するかどうかをテストします。
boolean ST_Contains(geometry geomA, geometry geomB);
ジオメトリAがジオメトリBを含む場合にはTRUEを返します。AがBを含むというのは、Bのポイントの全てがAの内側 (つまりAの内部または境界)にあり (Aの外部にBのポイントが全くないとも言えます)、かつBの内部の少なくとも一つのポイントがAの内部にある場合に限ります。
数学用語では: 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)となります。
![]() | |
内部が必ず共通の点を持たなければならないので、定義の微妙な点は、ポリゴンとラインが境界であるラインとポイントを含まないことです。詳細については、Subtleties of OGC Covers, Contains, Withinをご覧下さい。ST_Covers述語は、より包括的な関係を提供します。 |
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
GEOSモジュールで実現しています。
Enhanced: 2.3.0 PIP short-circuit (ポリゴンとポイントに限定した高速判定)を少ないポイントからなるマルチポイントに対応することができるよう拡張しました。以前の版ではポリゴンとポイントの組み合わせにだけ対応していました。
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
![]() | |
この関数を不正なジオメトリで呼ばないでください。予期しない結果が返されます。 |
ご注意: これは論理値を返して整数を返さないのが「許される」版です。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 // s2.1.13.3 - within(geometry B, geometry A)と同じ
このメソッドはSQL/MM仕様の実装です。 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_CoversだとTRUEを返すのに)ST_ContainsはFALSEを返します。
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
この例ではある円がもう一つの円の中にあるかどうかをテストします。
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
この例ではST_ContainsとST_ContainsProperlyとの差異を示します。
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_ContainsProperly — Bの全てのポイントがAの内部にあるかをテストします。
boolean ST_ContainsProperly(geometry geomA, geometry geomB);
Bの全てのポイントがAの内部にある (もしくはBのポイントでAの外部にあるポイントが無い)場合にTRUEを返します。
数学用語では: ST_ContainsProperly(A, B) ⇔ Int(A) ⋂ B = B
二つのジオメトリのDE-9IM交差行列が[T**FF*FF*]に合致する場合には、AがBを完全に含みます。
Aは自身を正しく含むことはありませんが、自身を含みます。
大きいポリゴンジオメトリでのジオメトリの集合のインタセクションを計算する際にこの述語を使います。インタセクションはかなり遅いので、ContainsProperlyを使って、対象ジオメトリのうち全体が領域内にあるものを抜き出すことができ、効率的になります。これらの場面では、インタセクションは確実に元の対象ジオメトリであることが直感的に分かります。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
![]() | |
この関数は、個々のポイントでトポロジを計算する必要が無く、より効率的に計算できる点で、ST_ContainsとST_Intersectsより優れています。 |
GEOSモジュールで実現しています。
Availability: 1.4.0
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
![]() | |
この関数を不正なジオメトリで呼ばないでください。予期しない結果が返されます。 |
この例ではある円がもう一つの円の中にあるかどうかをテストします。
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
この例ではST_ContainsとST_ContainsProperlyとの差異を示します。
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_CoveredBy — Aの全てのポイントがB内にあるかをテストします。
boolean ST_CoveredBy(geometry geomA, geometry geomB);
boolean ST_CoveredBy(geography geogA, geography geogB);
ジオメトリ/ジオグラフィAの全ての点がジオメトリ/ジオグラフィBの内側にある (つまりBの境界か内部とインタセクトする)場合にTRUEを返します。AにBの外側にある (Bの外部にある)点が無いかどうかをテストする、と言い換えられます。
数学用語では: ST_CoveredBy(A, B) ⇔ A ⋂ B = A
ST_CoveredByはST_Coversの反対です。ST_CoveredBy(A,B) = ST_Covers(B,A)となります。
一般に、この関数はST_Withinの代わりに使います。「境界がジオメトリの内側に無い」という奇妙な言葉が定義に含まれないためです。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
![]() | |
この関数を不正なジオメトリで呼ばないでください。予期しない結果が返されます。 |
GEOSモジュールで実現しています。
Availability: 1.2.2
ご注意: これは論理値を返して整数を返さないのが「許される」版です。
これはOGC標準と違いますがOracleは持っています。
この例ではある円がもう一つの円に覆われているかどうかをテストします。
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);
ジオメトリ/ジオグラフィBの全てのポイントがジオメトリ/ジオグラフィAの内側にある (内部または境界とインタセクトする)場合にTRUEを返します。Aの外部にBの点が無いことと等価です。
数学用語では: ST_Covers(A, B) ⇔ A ⋂ B = B
ST_Covers はST_CoveredByの逆です。ST_Covers(A,B) = ST_CoveredBy(B,A)となります。
一般に、この関数はST_Containsの代わりに使われるべきものです。定義が「ジオメトリがその境界を含まない」という奇妙なものになっていないからです。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
![]() | |
この関数を不正なジオメトリで呼ばないでください。予期しない結果が返されます。 |
GEOSモジュールで実現しています。
Enhanced: 2.4.0 ジオグラフィ型を使う形式においてポリゴンの中のポリゴンとポリゴンの中のラインストリングへの対応を追加
Enhanced: 2.3.0 ジオメトリについて、PIP short-circuit (ポリゴンとポイントに限定した高速判定)を少ないポイントからなるマルチポイントに対応することができるよう拡張しました。以前の版ではポリゴンとポイントの組み合わせにだけ対応していました。
Availability: 1.5 - ジオグラフィ対応が導入されました。
Availability: 1.2.2
ご注意: これは論理値を返して整数を返さないのが「許される」版です。
これはOGC標準と違いますがOracleは持っています。
ジオメトリの例
この例ではある円がもう一つの円を覆っているかどうかをテストします。
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
この例ではあるポイントと、このポイントとは別のポイントの300mバッファーと比較して、このポイントの10mバッファーとも比較します。
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交差行列が次の通り合致するとジオメトリはクロスしています:
Point/Line, Point/Area, Line/Areaの場合にはT*T******
Line/Point, Area/Point, Area/Lineの場合にはT*****T**
Line/Lineの場合には0********
点/点の状況や面/面の状況では、結果はFALSEです
![]() | |
OpenGIS Simple Feature Specificationでは、この述語はPoint/Line, Point/Area, Line/Line, Line/Areaの場合についてのみ定義されています。JTS/GEOSでは、Line/Point, Area/Point, Area/Lineについて拡張しています。これによって関係が対称になっています。 |
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.13.3
このメソッドはSQL/MM仕様の実装です。 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
roads (道路)とhighways (高速道路)の2つのテーブルを持っている場面を考えます。
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) );
|
次のようなクエリを使って、highwayとクロスするroadsのリストを決定します。
SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.geom, highways.geom);
ST_Disjoint — 二つのジオメトリが共有点を持たないようになっているかテストします。
boolean ST_Disjoint( geometry A , geometry B );
二つのジオメトリが接続されていない場合にTRUEを返します。ジオメトリに共有点が全くない場合を指します。
二つのジオメトリが他の空間関係がTRUEである場合には接続されていない状況にはありません。接続されていない場合にあhST_IntersectsはFALSEを返します。
数学用語では: ST_Disjoint(A, B) ⇔ A ⋂ B = ∅
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
GEOSモジュールで実現しています。
![]() | |
この関数呼び出しはインデックスを使いません。ST_Intersectsの否定には、インデックスを使用する、より効率の良い選択肢を使うことができます: |
![]() | |
ご注意: これは論理値を返して整数を返さないのが「許される」版です。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 //s2.1.13.3 - a.Relate(b, 'FF*FF****')
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.26
SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);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)
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.24
Changed: 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で、全てのジオメトリがインタセクトしていないかどうかをテストすることになります。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
Changed: 3.0.0 SFCGAL版を削除し、2次元TINのネイティブ対応を追加しました。
Enhanced: 2.5.0 ジオメトリコレクションに対応しました。
Enhanced: 2.3.0 PIP short-circuit (ポリゴンとポイントに限定した高速判定)を少ないポイントからなるマルチポイントに対応することができるよう拡張しました。以前の版ではポリゴンとポイントの組み合わせにだけ対応していました。
ジオメトリについては、GEOSモジュールで実現しています。ジオグラフィについてはネイティブです。
Availability: 1.5 ジオグラフィ対応が導入されました。
![]() | |
ジオグラフィでは、この関数は0.00001メートルの距離許容を持ち、回転楕円体計算でなく球面を使います。 |
![]() | |
ご注意: これは論理値を返して整数を返さないのが「許される」版です。 |
このメソッドは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 ))
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.27
このメソッドは曲線ストリングと曲線に対応しています。
この関数は三角形と不規則三角網 (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
この例ではテーブル内の行を検索します。より早く検索するにはジオメトリーカラムにGiSTインデックスを持たせます。
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 — 二つのラインストリングがどのように交差しているかを示す数字を返します。
integer ST_LineCrossingDirection(geometry linestringA, geometry linestringB);
二つのラインストリングを与えると、-3から3までの整数が返ります。この整数は、どのようにクロスしているかを示すもので、0は交差無しを意味します。この関数はLINESTRINGにのみ対応しています。
交差の番号は次の通りです。
0: クロスが無い
-1: 左クロス
1: 右クロス
-2: 複数クロスで最後が左
2: 複数クロスで最後が右
-3: 複数クロスで開始終了ともに左
3: 複数クロスで開始終了ともに右
Availability: 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)を返します。
![]() | |
この関数は、SQL-MM仕様ではなくArcSDE SQL仕様に従って実装しています。http://edndoc.esri.com/arcsde/9.1/sql_api/sqlapi3.htm#ST_OrderingEqualsをご覧ください。 |
このメソッドはSQL/MM仕様の実装です。 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);
ジオメトリAとBが「空間的にオーバラップする」場合にTRUEを返します。ジオメトリが同じ次元で、内部のインタセクションも同じ次元で、少なくとも一つの点がもう一方の外側にある (一方がもう一方を覆っている状態でないのと等価です)と、二つのジオメトリがオーバラップしていると言います。オーバラップの関係は、対称性があり、無反射性があります。
数学用語では: ST_Overlaps(A, B) ⇔ ( dim(A) = dim(B) = dim( Int(A) ⋂ Int(B) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
GEOSモジュールで実現しています。
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
ご注意: これは論理値を返して整数を返さないのが「許される」版です。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 // s2.1.13.3
このメソッドはSQL/MM仕様の実装です。 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交差モデル (Dimensionally Extended 9-Intersection Model, DE-9IM)で定義される空間 (トポロジ)関係のテストと評価が可能になります。
DE-9IMは9要素の行列で、二つのジオメトリの内部、境界、外部のインタセクションの次元を示しています。'F', '0', '1', '2'の文字による9文字の文字列で表現します (例えば 'FF1FF0102')。
intersection matrix patternで、特定の種類の空間関係のテストができます。パターンでは追加の文字 'T' (「インタセクションが空でない」という意味)と '*' (「値はなんでもいい」という意味)を使うことができます。一般的な空間関係については、名前の付いた関数ST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Withinとして提供されます。明示的なパターンを使うことで、インタセクト、クロス等の複数のテストを一回でできるようになります。また、名前のある空間関係関数を持たない空間関係のテストも可能になります。たとえば、「内部インタセクション」という空間関係は、名前の付いた空間関係関数では評価できませんが、T********のDE-9IMで評価できます。
詳細情報については「空間関係の決定」をご覧下さい。
一つ目の形式: 二つのジオメトリが、与えられたintersectionMatrixPatternによる空間関係に合うかどうかを見ます。
![]() | |
他の名前の付いた空間関係述語の多くと異なり、この関数は自動ではインデックスの呼び出しを*行いません*。インタセクト*しない*ジオメトリでTRUEになる関係があるためです。インタセクションが求められる関係パターンを使用している場合には、関数呼び出しに&&を取り入れてください。 |
![]() | |
存在するなら、名前の追加空間関係関数を使う方が良いです。空間インデックスが存在するなら自動で使用してくれるからです。また、完全な関係評価では有効にならない能率最適化が実装されていることがあります。 |
二つ目の形式: 二つのジオメトリの空間関係のDE-9IM行列文字列を返します。行列文字列は、ST_RelateMatchを使ったDE-9IMパターンと合致するかテストさせることができます。
三つ目の形式: 二つ目の形式と同じですが、境界ノード規則の指定ができる点が異なります。この規則によって、マルチラインストリングの端点がDE-9IMの内部または境界上にあると判定されるかどうかを細かく制御できます。boundaryNodeRuleの値は次の通りです:
1: OGC-Mod2 - 線の端点が奇数回出現する場合に境界内にあるとします。これはOGC SFS標準で定義された規則で、ST_Relateのデフォルトです。
2: Endpoint - 全ての端点は境界上にあります。
3: MultivalentEndpoint - 端点が2回以上出現する場合に境界内にあるとします。言い換えると、境界は全ての「接続された」または「内部の」端点です (「接続していない」や「外部の」端点ではない)。
4: MonovalentEndpoint - 端点が1回だけ出現する場合に限って、境界内にあるとします。言い換えると境界は全ての「接続していない」または「外部の」端点です。
OGC仕様にはありませんが実装しました。s2.1.13.2をご覧下さい。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 // s2.1.13.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.25
GEOSモジュールで実現しています。
Enhanced: 2.0.0 - 境界ノード規則が追加されました。
Enhanced: 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
独自の空間関係パターンを問い合わせ条件としてテストします。空間インデックスの使用を有効にするために&&を使っています。
ポリゴンと確実にインターセクト (接触だけは除く)している (内部でインターセクトしている)ものを探索します。
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:bl]は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);
次元拡張9交差モデル (Dimensionally Extended 9-Intersection Model, DE-9IM) intersectionMatrixの値が intersectionMatrixPatternを満たすかどうかを見ます。交差行列値はST_Relateで計算します。
詳細情報については「空間関係の決定」をご覧下さい。
GEOSモジュールで実現しています。
Availability: 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);
AとBがインタセクトするがAの内部とBの内部がインタセクトしない場合にはTRUEを返します。AとBが少なくとも一つの共有点があり、共有点が少なくとも一つの境界の上にあることと同じです。ポイント/ポイント入力では、ポイントは境界を持たないため、常にFALSEを返します。
数学用語では: ST_Touches(A, B) ⇔ (Int(A) ⋂ Int(B) = ∅) ∧ (A ⋂ B ≠ ∅)
この関係は、二つのジオメトリのDE-9IM交差行列がどれか一つに合致すると、関係が保持されていることになります:
FT*******
F**T*****
F***T****
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 // s2.1.13.3
このメソッドはSQL/MM仕様の実装です。 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);
ジオメトリAがジオメトリB内にある場合にTRUEを返します。Aの全ての点がBの内側 (内部または境界)にあり、Aの内部とBの内部に少なくとも一つの共有点がある場合に限って、AはB内にあると言います。
渡すジオメトリが両方とも同じSRIDでなければ、この関数は意味がありません。
数学用語では: ST_Within(A, B) ⇔ (A ⋂ B = A) ∧ (Int(A) ⋂ Int(B) ≠ ∅)
内にある、という関係性には反射性があります。全てのジオメトリは、自分の内にあると言えます。また、非対称性を持ちます。ST_Within(A,B) = trueかつST_Within(B,A) = trueの場合には、二つのジオメトリは必ずトポロジ的に等価 (ST_Equals(A,B) = true)になります。
ST_WithinはST_Containsの反対です。ST_Within(A,B) = ST_Contains(B,A)となります。
![]() | |
内部が必ず共有点を持つので、定義は、ポリゴンまたはラインの境界上にあるラインまたはポイントはジオメトリの内にないという微妙なものになります。詳細については、Subtleties of OGC Covers, Contains, Withinをご覧下さい。ST_CoveredBy述語はより包括的な関係を提供します。 |
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
GEOSモジュールで実現しています。
Enhanced: 2.3.0 ジオメトリについて、PIP short-circuit (ポリゴンとポイントに限定した高速判定)を少ないポイントからなるマルチポイントに対応することができるよう拡張しました。以前の版ではポリゴンとポイントの組み合わせにだけ対応していました。
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
![]() | |
この関数を不正なジオメトリで呼ばないでください。予期しない結果が返されます。 |
ご注意: これは論理値を返して整数を返さないのが「許される」版です。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 // s2.1.13.3 - a.Relate(b, 'T*F**F***')
このメソッドはSQL/MM仕様の実装です。 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 — 二つの3次元ジオメトリが与えらえれた3次元距離内にあるかどうかをテストします。
boolean ST_3DDWithin(geometry g1, geometry g2, double precision distance_of_srid);
二つのジオメトリ値の3次元距離がdistance_of_srid以下ならTRUEを返します。距離の単位はジオメトリの空間参照系の単位です。この関数から意味のある結果を得るには、引数に使うジオメトリを同じ座標系 (同じSRIDを持つ)にしなければなりません。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
このメソッドはSQL/MM仕様の実装です。 SQL-MM ?
Availability: 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 — 二つの3次元ジオメトリが完全に与えらえれた3次元距離内にあるかどうかをテストします。
boolean ST_3DDFullyWithin(geometry g1, geometry g2, double precision distance);
3次元ジオメトリが他のジオメトリとの距離が、完全に指定した範囲内ならtrueを返します。距離の単位はジオメトリの空間参照系で定義されているものとされます。この関数が意味を持つためには、与えられるジオメトリは両方とも同じ座標系で同じSRIDを持つ必要があります。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
Availability: 2.0.0
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
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);
g2が完全にg1のdistanceで指定した距離内にある場合にTRUEを返します。見た目で言うと、g2がg1のdistanceぶん膨らませたバッファに含まれる場合にTRUEを返します。
![]() | |
この関数を実行すると、対象ジオメトリにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
Availability: 1.5.0
Changed: 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として球面で測定します。
![]() | |
3次元ジオメトリではST_3DDWithinを使います。 |
![]() | |
この関数の呼び出しによって、ジオメトリで使用可能なインデックスを使用したバウンディングボックスの比較が自動的に行われます。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
Availability: 1.5.0 ジオグラフィが導入されました。
Enhanced: 2.1.0 ジオグラフィ版の速度が改善しました。詳細についてはMaking Geography fasterをご覧下さい。
Enhanced: 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)
学校ごとに最も近い病院を探索します。学校から3000単位以内とします。ST_DWithinでインデックスを効かせた探索対象制限を行います。インデックスを使えないST_Distanceではこのような処理が必要です。空間参照系の単位がメートルの場合には、この例での距離の単位はメートルになります。
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);
ジオメトリが点であり、center_x,center_yの中心点とradiusの半径を持つ円の内側にある場合はTRUEを返します。
![]() | |
この関数は空間インデックスを使用しません。代わりにST_DWithinを使って下さい。 |
Availability: 1.2
Changed: 2.2.0 前のバージョンではST_Point_Inside_Circleと呼ばれていました。
SELECT ST_PointInsideCircle(ST_Point(1, 2), 0.5, 2, 3);
t
この関数は、距離、面積、角度の測定値を計算します。測定値から決定されるジオメトリ値を計算する関数もあります。
ST_Lengthの別名です。ST_Perimeterの別名です。ST_Area — ポリゴンジオメトリの面積を返します。
float ST_Area(geometry g1);
float ST_Area(geography geog, boolean use_spheroid = true);
ポリゴンジオメトリの面積を返します。ジオメトリ型では2次元のデカルト (平面)面積が、SRIDで指定した単位で計算されます。ジオグラフィ型では、デフォルトでは、面積は回転楕円体上にあるものとし、平方メートル単位で計算されます。より速いものの精度が落ちる計算のために、 ST_Area(geog,false)で球面モデルを使った計算ができます。
Enhanced: 2.0.0 - 2次元多面体サーフェス対応が導入されました。
Enhanced: 2.2.0 - 精度とロバスト性の向上のためにGeographicLibを使って回転楕円体面上での計測を行うようにしています。この新機能を使うには、Proj 4.9.0以上が必要です。
Changed: 3.0.0 - SFCGALに依存しなくなりました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.1.2, 9.5.3
この関数は多面体サーフェスに対応しています。
![]() | |
多面体サーフェスについて、2次元多面体サーフェスのみ対応します (2.5次元は対応しません)。2.5次元について、0でない答が与えられるかも知れませんが、完全に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
平方フィートの面積を返し、平方メートルを得るためにメートル単位マサチューセッツ州平面 (EPSG:26986) に変換します。一つ目はEPSG:2249でフィート単位マサチューセッツ州平面なので平方フィートとなり、二つ目は変換後はEPSG:26986でメートル単位マサチューセッツ州平面なので平方メートルになるので、注意して下さい。
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緯度経度のEPSG: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;ST_Azimuth — 北を基準とした2点間の線の方位角を返します。
float ST_Azimuth(geometry origin, geometry target);
float ST_Azimuth(geography origin, geography target);
原点から目標点に向いたラジアン単位の方位を返しますが、2点が一致する場合にはNULLを返します。方位角は、Y軸 (ジオメトリ)または子午線北向き (ジオグラフィ)から時計回りに増えていきます。すなわち、北は0、北東はπ/4、東はπ/2、南東は3π/4、南はπ、南西は5π/4、西は3π/2、北西は7π/4、となります。
ジオグラフィでは、方位角計算問題はinverse geodesic problemとして知られます。
方位角は参照ベクトルと一つのポイントとの間の角度と定義される数学的概念で、角度の単位はラジアンです。ラジアン単位の結果はPostgreSQL関数degrees()で度に変換できます。
For offsetting lines relative to their direction, use ST_OffsetCurve. For projecting a point by distance and bearing, use ST_Project.
Availability: 1.1.0
Enhanced: 2.0.0 ジオグラフィ対応が導入されました。
Enhanced: 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 — 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がなす角度を計算します。4番目のポイントが充てられた場合には、P1-P2とP3-P4がなす角度を計算します。
形式2: 入力ラインで定義される始端と終端ベクトルS1-E1とS2-E2の間の角度を計算します。
結果は正の角度で0と2πラジアンの間です。ラジアンはPostgreSQL関数degrees()で度に変換できます。
ST_Angle(P1,P2,P3) = ST_Angle(P2,P1,P2,P3)となることに注意して下さい。
Availability: 2.5.0
3点間の角度
SELECT degrees(ST_Angle('POINT(0 0)', 'POINT(10 10)', 'POINT(20 0)'));270
4点で定義されたベクタ間の角度
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 — g1上にある、g2と最近傍となる2次元ポイントを返します。これは、あるジオメトリから他のジオメトリへの最短ラインの一つ目のポイントです。
geometry ST_ClosestPoint(geometry geom1, geometry geom2);
geography ST_ClosestPoint(geography geom1, geography geom2, boolean use_spheroid = true);
geom2と最近傍となるgeom1上の2次元ポイントを返します。これは、ジオメトリ間の最短ライン (ST_ShortestLineで生成されるものと同じです)の一つ目のポイントです。
![]() | |
3次元ジオメトリの場合にはST_3DClosestPointの方が良いでしょう。 |
Enhanced: 3.4.0 - ジオグラフィに対応しました。
Availability: 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 — g1上の、g2に最も近い3次元ポイントを返します。これは3次元の最短ラインの始点です。
geometry ST_3DClosestPoint(geometry g1, geometry g2);
g1上の、g2に最も近い3次元ポイントを返します。3次元最短線の一つ目のポイントです。3次元最短線の長さは、3次元距離と同じです。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
Availability: 2.0.0
Changed: 2.2.0 - 二つの2次元ジオメトリが入力である場合には、2次元ポイントが返ります (古い挙動では、存在しないZの値について0を仮定していました)。2次元と3次元の場合には、もはや、存在しないZの値について0を仮定しません。
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_Distance — 二つのジオメトリ値またはジオグラフィ値間の距離を返します。
float ST_Distance(geometry g1, geometry g2);
float ST_Distance(geography geog1, geography geog2, boolean use_spheroid = true);
geometry型では、二つのジオメトリ間の2次元のデカルト (平面)距離の最小値を返します。単位は投影の単位 (空間参照系の単位)です。
geography型では、二つのジオグラフィ間の最小の測地距離を、メートル単位で返します。SRIDで決定される回転楕円体で計算します。use_spheroidがFALSEの場合には、球面が計算に使われます。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.23
このメソッドは曲線ストリングと曲線に対応しています。
Availability: 1.5.0 1.5でジオグラフィ対応が導入されました。大きいジオメトリや頂点の多いジオメトリについての速度が改善しました
Enhanced: 2.1.0 ジオグラフィ版の速度が改善しました。詳細についてはMaking Geography fasterをご覧下さい。
Enhanced: 2.1.0 - 曲線ジオメトリ対応が導入されました。
Enhanced: 2.2.0 - 精度とロバスト性の向上のためにGeographicLibを使って回転楕円体面上での計測を行うようにしています。この新機能を使うには、Proj 4.9.0以上が必要です。
Changed: 3.0.0 - SFCGALに依存しなくなりました。
ジオメトリの例 - 平面の単位で4326はWGS84経度緯度なので、単位は度。
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
ジオメトリの例 - メートル単位 (SIRD: 3857, 一般的なWebマップのピクセルに比例)。値は正しくありませんが、近傍の比較は正しくでき、KNNやKMeansなどのアルゴリズムに適しています。
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 3857) );167.441410065196
ジオメトリの例 - メートル単位 (SRID:3857, 上と同じですが、歪みを考慮してcos(lat)で修正しています)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 3857)
) * cosd(42.3521);123.742351254151
ジオメトリの例 - メートル単位 (SRID: 26986, マサチューセッツ州平面メートル) (マサチューセッツで最も精度が高い)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 26986),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 26986) );123.797937878454
ジオメトリの例 - メートル単位 (SRID: 2163, 米国ナショナルアトラス正積図法) (最も精度が低い)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 2163),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geometry, 2163) );126.664256056812
ジオメトリの例と同じですが、メートル単位である点に注意して下さい - 球面の使用で、わずかな速度向上と低精度の計算を行います。
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist
FROM (SELECT
'SRID=4326;POINT(-72.1235 42.3521)'::geography as gg1,
'SRID=4326;LINESTRING(-72.1260 42.45,-72.123 42.1546)'::geography as gg2
) As foo ;spheroid_dist | sphere_dist ------------------+------------------ 123.802076746848 | 123.475736916397
ST_3DDistance — 投影座標系の単位で、二つのジオメトリ間の3次元デカルト距離の最小値を返します (空間参照系に基づきます)。
float ST_3DDistance(geometry g1, geometry g2);
投影座標系の単位で、二つのジオメトリ間の3次元デカルト距離の最小値を返します (空間参照系に基づきます)。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
このメソッドはSQL/MM仕様の実装です。 SQL-MM ISO/IEC 13249-3
Availability: 2.0.0
Changed: 2.2.0 - 2次元と3次元の場合には、もはや、存在しないZの値について0を仮定しません。
Changed: 3.0.0 - SFCGAL版は削除されました
ジオメトリーの例 - メートル単位 (SRID: 2163 米国ナショナルアトラス正積図法)(3次元ポイントとラインと比較で2次元ポイントとライン)。現在は鉛直データムに対応していません。Z値は変換されず、かつ単位が同じであると仮定されるので注意して下さい。
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とPOLYGONで3次元距離と2次元距離を測ります。3次元最近ポイントの例と同じです。
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);
二つの経度緯度ジオメトリの間の最短距離をメートル単位で返します。SRIDで定義された回転楕円体に由来する半径となる球面を使います。ST_DistanceSpheroidより高速ですが、精度が悪くなります。PostGISの1.5より前の版ではポイント間の距離の計測だけを実装していました。
Availability: 1.5 - ポイント以外のジオメトリが導入されました。以前の版ではポイントでのみ動作しました。
Changed: 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 — 回転楕円体面の地球モデルを使って、二つの経度/緯度ジオメトリの最小距離を返します。
float ST_DistanceSpheroid(geometry geomlonlatA, geometry geomlonlatB, spheroid measurement_spheroid=WGS84);
与えられた回転楕円体面の、二つの経度/緯度ジオメトリの最小距離をメートル単位で返します。回転楕円体面の詳細についてはST_LengthSpheroidをご覧下さい。
![]() | |
この関数はジオメトリのSRIDを見ません。ジオメトリの座標は与えられた回転楕円体に基づくものと仮定します。 |
Availability: 1.5 - ポイント以外のジオメトリが導入されました。以前の版ではポイントでのみ動作しました。
Changed: 2.2.0 前の版ではこの関数はST_Distance_Sphereと呼ばれていました
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パラメータは辺の高密度化に使う比率を設定します。それぞれの辺は多数の等長の辺に分割され、分割辺長の合計長に対する比は与えた比率に近くなります。
単位はジオメトリの空間参照系の単位です。
![]() | |
現在の実装では、離散位置は、頂点のみに対応しています。任意の密度でポイントを使用することができるよう拡張されています。 |
![]() | |
densityFracに小さい値を指定すると、フレシェ距離の精度が増します。しかし、分割辺数の2乗に比例して計算時間とメモリ利用量が増大します。 |
GEOSモジュールで実現しています。
Availability: 2.4.0 - 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パラメータが指定された場合には、離散ハウスドルフ距離の計算の前に辺の密度を高くして、精度の高い結果が得られるようにします。個々の辺は、与えた割合に近い辺長で等分されます。
単位はジオメトリの空間参照系の単位です。
![]() | |
このアルゴリズムは標準的なハウスドルフ距離と等価では*ありません*。しかし、使用可能な場面の大部分で正しくなる近似計算がなされています。重要なものに、それぞれが概ね平行で概ね等しい長さのラインストリングがあります。これはラインのマッチングに使える基準です。 |
Availability: 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)
Example: 高密度化したうえで求めたハウスドルフ距離。
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 — 線系ジオメトリの2次元長を返します。
float ST_Length(geometry a_2dlinestring);
float ST_Length(geography geog, boolean use_spheroid = true);
ジオメトリ型: LINESTRING, MULTILINESTRING, ST_Curve, ST_MultiCurveの場合には2次元デカルト距離を返します。面ジオメトリでは0を返すのでST_Perimeterを代わりに使います。長さの単位はジオメトリの空間参照系で決まります。
ジオグラフィー型: 測地線の逆解法を用います。周囲長の単位はメートルです。回転楕円体はSRIDで指定されますが、SRIDが指定されていない場合にはWGS84が使われます。use_spheroid = falseの場合には回転楕円体面の代わりに球面で計算します。
現在は、ジオメトリに対してはST_Length2Dの別名ですが、高次元対応に変更されるかも知れません。
Changed: 2.0.0 大幅な変更 -- 以前の版ではジオグラフィのPOLYGONやMULTIPOLYGONへの適用によってPOLYGONやMULTIPOLYGONの周囲長を返しました。2.0.0版ではジオメトリの挙動に従うため0を返すように変更しました。ポリゴンの周囲長を求める場合は、ST_Perimeterを使います
![]() | |
ジオグラフィでは計算は回転楕円体面モデルを使用します。計算が速い反面精度が低い球面計算を使うには、 ST_Length(gg,false)とします。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.5.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.2, 9.3.4
Availability: 1.5.0 ジオグラフィt対応が導入されました。
ラインストリングのフィート単位の長さを返します。EPSG:2249はフィート単位のマサチューセッツ州平面なので、フィート単位になることに注意して下さい。
SELECT ST_Length(ST_GeomFromText( 'LINESTRING(743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416)', 2249));
122.63074400009504
この例ではWGS84 LINESTRINGからメートル単位のマサチューセッツ平面に変換しています。
SELECT ST_Length(ST_Transform(
'SRID=4326;LINESTRING(-72.1260 42.45,-72.1240 42.45666,-72.123 42.1546)'::geometry,
26986
)
);34309.4563576191
WGS84ジオグラフィのラインの長さを返します。
この例ではデフォルトの回転楕円体計算を使っています。
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 — LINESTRINGまたはMULTILINESTRINGに対して、ジオメトリの2次元長を返します。これはST_Lengthの別名です。
float ST_Length2D(geometry a_2dlinestring);
LINESTRINGまたはMULTILINESTRINGに対して、ジオメトリの2次元長を返します。これはST_Lengthの別名です。
ST_3DLength — 線ジオメトリの3次元長を返します。
float ST_3DLength(geometry a_3dlinestring);
LINESTRINGまたはMULTILINESTRINGの場合には、そのジオメトリの3次元長または2次元長を返します。2次元ラインでは2次元長を返します (ST_LengthとST_Length2Dと同じです)。
この関数は3次元に対応し、Z値を削除しません。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 7.1, 10.3
Changed: 2.0.0 以前の版ではST_Length3Dと呼ばれていました
3次元ケーブルの長さをフィート単位で返します。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 — 回転楕円体面上の経度緯度のジオメトリの2次元または3次元の長さ/周長を返します。
float ST_LengthSpheroid(geometry a_geometry, spheroid a_spheroid);
回転楕円体面のジオメトリーの周囲長を計算します。ジオメトリーの座標が経度/緯度で、投影せずに周囲長を求めたい場合に使います。回転楕円体面は次のようなテキスト値で指定します:
SPHEROID[<NAME>,<SEMI-MAJOR AXIS>,<INVERSE FLATTENING>]
例:
SPHEROID["GRS_1980",6378137,298.257222101]
Availability: 1.2.2
Changed: 2.2.0 これより前の版では、これはST_Length_Spheroidと呼ばれ、ST_3DLength_Spheroidという別名を持っていました。
この関数は3次元に対応し、Z値を削除しません。
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 — 二つのジオメトリ間の2次元最長ラインを返します。
geometry ST_LongestLine(geometry g);
geometry ST_LongestLine(geometry g1, geometry g2);
二つのジオメトリのポイントで作られる2次元の最長ラインを返します。ラインはg1上から始まり、g2上で終わります。
最長ラインは常に二つの頂点となります。一つ以上の最長ラインが発見された場合には、この関数は最初のものを返します。ラインの長さはST_MaxDistanceが返す距離と同じです。
一つのジオメトリーだけが与えられるか、g1とg2が同じジオメトリーである場合には、ジオメトリーで最も離れた二つの頂点からなるラインが返ります。ラインの端点は ST_MinimumBoundingCircleで計算される円の上になります。
Availability: 1.5.0
Enhanced: 3.7.0 - 単一ジオメトリー入力に対応しました。
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 — 二つのジオメトリ間の3次元最長ラインを返します。
geometry ST_3DLongestLine(geometry g1, geometry g2);
二つのジオメトリ間の3次元最長ラインを返します。該当が複数ある場合には最初の最長ラインを返します。返されるラインは、g1から始まりg2で終わります。ラインの3次元長はST_3DMaxDistanceが返す距離と同じです。
Availability: 2.0.0
Changed: 2.2.0 - 二つの2次元ジオメトリが入力である場合には、2次元ポイントが返ります (古い挙動では、存在しないZの値について0を仮定していました)。2次元と3次元の場合には、もはや、存在しないZの値について0を仮定しません。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
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 — 二つのジオメトリ間の2次元最長距離を空間参照系の単位で返します。
float ST_MaxDistance(geometry g);
float ST_MaxDistance(geometry g1, geometry g2);
二つのジオメトリの2次元最長距離を空間参照系の単位で返します。最長距離は常に二つの頂点間で発生します。これはST_LongestLineが返すラインの長さと同じです。
一つのジオメトリーだけが与えられるか、g1とg2が同じジオメトリーである場合には、ジオメトリーで最も離れた二つの頂点間の距離を返します。
Availability: 1.5.0
Enhanced: 3.7.0 - 単一ジオメトリー入力に対応しました。
ポイントとラインの最長距離。
SELECT ST_MaxDistance('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);2
SELECT ST_MaxDistance('POINT(0 0)'::geometry, 'LINESTRING ( 2 2,2 2 )'::geometry);2.82842712474619
一つのジオメトリ内の頂点間の最長距離。
SELECT ST_MaxDistance('POLYGON ((10 10,10 0,0 0,10 10))'::geometry);14.142135623730951
ST_3DMaxDistance — 二つのジオメトリ間の3次元最大デカルト距離 (空間参照系に基づく)を空間参照系の単位で返します。
float ST_3DMaxDistance(geometry g1, geometry g2);
二つのジオメトリ間の3次元の最大デカルト距離を空間参照系の単位で返します。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
Availability: 2.0.0
Changed: 2.2.0 - 2次元と3次元の場合には、もはや、存在しないZの値について0を仮定しません。
ジオメトリーの例 - メートル単位 (SRID: 2163 米国ナショナルアトラス正積図法)(3次元ポイントとラインと比較で2次元ポイントとライン)。現在は鉛直データムに対応していません。Z値は変換されず、かつ単位が同じであると仮定されるので注意して下さい。
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より近い頂点は存在しません。
ジオメトリのクリアランスの最小値が存在しない (単一POINT、要素が同じMULTIPOINT等)場合には、返り値はInfinityになります。
精度の損失による有効性の問題を回避するには、 ST_ReducePrecisionを使うと、ポリゴンジオメトリの妥当性を確実に維持しつつ座標値の精度を減らせられます。
Availability: 2.3.0
SELECT ST_MinimumClearance('POLYGON ((0 0,1 0,1 1,0.5 3.2e-4,0 0))');0.00032
ST_MinimumClearanceLine — ジオメトリの最小クリアランスを示す、2点のラインストリングを返します。
Geometry ST_MinimumClearanceLine(geometry g);
ジオメトリの最小クリアランスを示す、2点のラインストリングを返します。ジオメトリが最小クリアランスを持たない場合には、LINESTRING EMPTYが返ります。
GEOSモジュールで実現しています。
Availability: 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);
ジオメトリ/ジオグラフィがST_SrrfaceまたはST_MultiSurface (POLYGONまたはMULTIPOLYGON)の場合に、2次元周囲長を返します。面ジオメトリでない場合には0を返します。ラインストリングについてはST_Lengthを使います。ジオメトリに対しては、周囲長の計測単位は空間参照系によります。
ジオグラフィー型では、測地線の逆解法を用います。この際、周囲長の単位はメートルです。回転楕円体はSRIDで指定されますが、SRIDが指定されていない場合にはWGS84が使われます。use_spheroid = falseの場合には回転楕円体面の代わりに球面で近似します。
現在は、この関数はST_Perimeter2Dの別名ですが、高次元対応に変更されるかも知れません。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.5.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.1.3, 9.5.4
Availability: 2.0.0 ジオグラフィ対応が導入されました。
Geometry.
POLYGONとMULTIPOLYGONに対するフィート単位の周囲長を返します。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経度緯度)であることに注意して下さい。
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
この例では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 — ポリゴンジオメトリの2次元周長を返します。ST_Perimeterの別名です。
float ST_Perimeter2D(geometry geomA);
ポリゴンジオメトリの2次元周長を返します。
![]() | |
これは、現在はST_Perimeterの別名です。将来的に、ST_Perimeterがジオメトリの最大次元の周囲長を返すようになるかも知れません。これは、まだ考慮中です。 |
ST_3DPerimeter — ポリゴンジオメトリの3次元周長を返します。
float ST_3DPerimeter(geometry geomA);
POLYGONまたはMULTIPOLYGONジオメトリの場合には、3次元周囲長を返します。ジオメトリが2次元の場合には、2次元周囲長を返します。
この関数は3次元に対応し、Z値を削除しません。
このメソッドはSQL/MM仕様の実装です。 SQL-MM ISO/IEC 13249-3: 8.1, 10.5
Changed: 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 — 二つのジオメトリの3次元の最短ラインを返します。
geometry ST_ShortestLine(geometry geom1, geometry geom2);
geography ST_ShortestLine(geography geom1, geography geom2, boolean use_spheroid = true);
二つのジオメトリの間の2次元の最短ラインを返します。返されるラインはgeom1内から始まり、geom2内で終わります。geom1とgeom2がインタセクトしている場合には、結果はインタセクションするポイントを始点と終点にしたラインになります。ラインの長さはST_Distance でg1とg2を引数に取った時と同じになります。
Enhanced: 3.4.0 - ジオグラフィに対応しました。
Availability: 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_3DShortestLine — 二つのジオメトリの3次元の最短ラインを返します。
geometry ST_3DShortestLine(geometry g1, geometry g2);
二つのジオメトリの3次元長が最短となるラインを返します。見つかった最短線が複数ある場合は、最初のもののみ返します。g1とg2が1点のみでインタセクトする場合は、インタセクション点を開始点と終了点とします。g1とg2が1点より多くインタセクトする場合は、同じ点を開始点と終了点としますが、その点は不定です。返されるラインは常にg1側を始点、g2側を終点とします。この関数が返すラインの長さは、常にg1とg2を指定した場合のST_3DDistanceが返す値と同じになります。
Availability: 2.0.0
Changed: 2.2.0 - 二つの2次元ジオメトリが入力である場合には、2次元ポイントが返ります (古い挙動では、存在しないZの値について0を仮定していました)。2次元と3次元の場合には、もはや、存在しないZの値について0を仮定しません。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
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);
2次元ボックスでジオメトリを切り抜きます。高速ですが不正な方法になることもあります。トポロジ的に不正な入力ジオメトリでは例外が投げられ結果を返しません。出力ジオメトリの妥当性は保証されません (ポリゴンで自己インタセクションができるかも知れません)。
GEOSモジュールで実現しています。
Availability: 2.2.0
この例では第2パラメーターは、ジオメトリーからbox2dへの暗黙のキャストに頼っています。
SELECT ST_ClipByBox2D(geom, ST_MakeEnvelope(0, 0, 10, 10)) FROM mytab;
ST_Difference — ジオメトリBとインタセクトしていないジオメトリAの一部を表現するジオメトリを計算します。
geometry ST_Difference(geometry geomA, geometry geomB, float8 gridSize = -1);
ジオメトリBとインタセクトしていないジオメトリAの一部を表現するジオメトリを計算します。これは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モジュールで実現しています。
Enhanced: 3.1.0 gridSizeパラメータを受け付けるようになりました。
gridSizeパラメータを使うにはGEOS 3.9.0以上が必要です。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.20
この関数は3次元に対応し、Z値を削除しません。 ただし、結果はXYのみを使用して計算されます。結果のZ値は複写するか、平均値になるか、補間されます。
次では、2次元ラインストリングの差を求めます。
SELECT ST_Difference('LINESTRING(50 100,50 200)'::geometry,
'LINESTRING(50 50,50 150)'::geometry
);LINESTRING(50 150,50 200)
次では、3次元ラインストリングの差を求めます。
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_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_Intersectsと併用するST_Intersectionは、バウンディングボックス、バッファや、対象の国や領域の内部にあるジオメトリの部分のみが必要な場合に使う領域クエリといったようなジオメトリの切り抜きに使えます。
![]() | |
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モジュールで実現しています。
Enhanced: 3.1.0 gridSizeパラメータを受け付けるようになりました
gridSizeパラメータを使うにはGEOS 3.9.0以上が必要です
Changed: 3.0.0 SFCGAL非依存になりました。
Availability: 1.5 ジオグラフィ型が導入されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.18
この関数は3次元に対応し、Z値を削除しません。 ただし、結果は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)
国別に全てのライン (trains)を切り抜きます。 国のジオメトリはPOLYGONまたはMULTIPOLYGONであると仮定します。ご注意: ポイントだけを共有するtrailsは気にしないので、LINESTRINGまたはMULTILINESTRINGの結果となるインタセクションだけを保持しています。ジオメトリコレクションを個々のマルチ系ジオメトリの要素に分解するためにダンプが必要です。下の例は非常に汎用的で、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);
入力ジオメトリを結合してオーバラップをしない結果ジオメトリを生成する集約関数です。出力は単一ジオメトリ、マルチ系ジオメトリ、ジオメトリコレクションのいずれにかなる可能性があります。
![]() | |
ST_Unionと同じ結果を生成しますが、メモリ使用が少なく、処理時間が長くなります。この集約関数はジオメトリの逐次加算的結合で動作しています。これは、最初に配列を蓄積して高速アルゴリズムで結合するST_Union集約関数と反対です。 |
この関数は3次元に対応し、Z値を削除しません。 ただし、結果はXYのみを使用して計算されます。結果のZ値は複写するか、平均値になるか、補間されます。
SELECT id,
ST_MemUnion(geom) as singlegeom
FROM sometable f
GROUP BY id;
ST_Node — ラインストリングの集合にノードを作成します。
geometry ST_Node(geometry geom);
ラインストリングのコレクションに完全にノードが加えられたものを表現する(マルチ)ラインストリングを返します。全ての入力ノードを保存したうえで、可能な最低の数だけノードを加えています。結果の線はディゾルブされています (重複線が削除されます)。
これはST_Polygonizeへの入力に適した、完全にノードを加えた線を生成する良い方法です。
ST_UnaryUnion も、ラインのノード追加とディゾルブに使うことができます。gridSizeを指定する任意引数を与えると、より単純かつよりロバストな出力が得られます。集約関数版についてはST_Unionをご覧下さい。
この関数は3次元に対応し、Z値を削除しません。
GEOSモジュールで実現しています。
Availability: 2.0.0
Changed: 2.4.0 この関数は内部でGEOSUnaryUnionの替わりにGEOSNodeを使用しています。ラインストリングの並び順と方向が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);
この関数は(MULTI)POINT、(MULTI)LINESTRING、(MULTI)POLYGONの境界によるLINESTRINGの分割と、LINESTRINGによる(MULTI)POLYGONの分割に対応します。(MULTI)POLYGONを刃として使うとき、線要素 (境界)は入力の分割に使われます。結果ジオメトリは常にコレクションです。
この関数はST_Unionの逆のようなものです。返されるコレクションにST_Unionを与えると、理論的には元のジオメトリが得られます (丸め誤差のために確実に同じになるものではありません)。
![]() | |
入力と刃が数値の精度の問題でインタセクトしない場合には、入力が思ったように分割されない可能性があります。この状況を避けるには、先に、ST_Snapに小さい許容値を与えて、入力を刃にスナップする必要があるかも知れません。 |
Availability: 2.0.0 GEOSが必要です
Enhanced: 2.2.0 ライン分割をマルチライン、マルチポイントまたはポリゴンもしくはマルチポリゴンの境界で行えるようにしました。
Enhanced: 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)))
マルチラインストリングをポイントで分割します。ポイントは確実にラインストリングの要素の上に存在するようにします。
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)
)ラインストリングをライン上にないポイントで分割します。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以下の頂点になります。
閉じたボックスを表現するために必要なポイント数は5個ですから、max_verticesは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.
ポリゴン内のポイントと他の空間演算は、通常ではインデックスが付いた細分化されたデータセットの方が速くなります。通常は分割したジオメトリのバウンディングボックスは元ジオメトリのものよりも小さい領域になるので、インデックスのクエリで「当たり」となる場合が少なくなります。インデックスの再チェックによって実行される空間演算で処理されるポイント数が少なくなるので、「当たり」の場合は速度が速くなります。
![]() | |
分割したジオメトリーをジオグラフィーにキャストすると、得られるジオグラフィーは元のものと異なることになる場合があります。分割によって平面空間 (ジオメトリ)に頂点が追加されます。頂点が境界に沿って挿入される場合には、ジオグラフィー表現のエッジは測地線上の辺として補間されます。歪みを最小化するには、最初にST_Segmentizeを使って測地線上に頂点を追加してジオグラフィーを高密度化して、それから分割までの間にジオメトリーにキャストします。 |
![]() | |
これは集合を返す関数 (SRF)です。単一ジオメトリ値を含む行の集合を返します。SELECTリストまたはFROM節で、結果ジオメトリごとに一つのレコードとなる結果集合を生成できます。 |
GEOSモジュールで実現しています。
Availability: 2.2.0
Enhanced: 2.5.0 ポリゴン分割で存在するポイントを再利用して頂点数の最小値を8から5に変更。
Enhanced: 3.1.0 gridSizeパラメータを受け付けるようになりました。
gridSizeパラメータを使うにはGEOS 3.9.0以上が必要です
例: 個々のポリゴンが10頂点とならないようなポリゴンの分割と、個々に一意のIDの割り当て。
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_SymDifference — ジオメトリAとジオメトリBがインタセクトしていない部分を表現するジオメトリを返します。
geometry ST_SymDifference(geometry geomA, geometry geomB, float8 gridSize = -1);
ジオメトリAとジオメトリBがインタセクトしていない部分を表現するジオメトリを返します。この関数は、ST_Union(A,B) - ST_Intersection(A,B)と同じです。SymDifference (対象差)と呼ばれるのはST_Union(A,B) - ST_Intersection(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.
GEOSモジュールで実現しています。
Enhanced: 3.1.0 gridSizeパラメータを受け付けるようになりました。
gridSizeパラメータを使うにはGEOS 3.9.0以上が必要です
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.21
この関数は3次元に対応し、Z値を削除しません。 ただし、結果はXYのみを使用して計算されます。結果のZ値は複写するか、平均値になるか、補間されます。
この例では二つのラインストリングの違いを2次元では正しく動作するのを示しています。
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_UnaryUnion — 単一のジオメトリの要素の結合を計算します。
geometry ST_UnaryUnion(geometry geom, float8 gridSize = -1);
単一入力の形式のST_Unionです。入力は単一ジオメトリ、マルチ系ジオメトリ、ジオメトリコレクションが可能です。結合は、入力の個々のエレメントに適用されます。
この関数は要素間のオーバラップが原因で不正とされるマルチポリゴンを修正するのに使えます。しかしながら、入力の要素は妥当でなければなりません。蝶ネクタイポリゴンのような入力の個々の要素はエラーを引き起こすかも知れません。このため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.
この関数は3次元に対応し、Z値を削除しません。 ただし、結果はXYのみを使用して計算されます。結果のZ値は複写するか、平均値になるか、補間されます。
Enhanced: 3.1.0 gridSizeパラメータを受け付けるようになりました。
gridSizeパラメータを使うにはGEOS 3.9.0以上が必要です
Availability: 2.0.0
ST_Union — 入力ジオメトリのポイント集合の結合を表現するジオメトリを返します。
geometry ST_Union(geometry g1, geometry g2);
geometry ST_Union(geometry g1, geometry g2, float8 gridSize);
geometry ST_Union(geometry[] g1_array);
geometry ST_Union(geometry set g1field);
geometry ST_Union(geometry set g1field, float8 gridSize);
入力ジオメトリを結合してオーバラップをしない結果ジオメトリを生成します。出力は単一ジオメトリ、マルチ系ジオメトリ、ジオメトリコレクションのいずれにかなる可能性があります。次の通り複数の形式があります。
二入力形式: 二つの入力ジオメトリの結合のジオメトリを返します。いずれかの入力がNULLの場合にはNULLを返します。
配列形式: ジオメトリ配列を結合したジオメトリを返します。
集約関数形式: ジオメトリの集合を結合したジオメトリを返します。ST_Union()関数は、PostgreSQL用語で言うところの「集約関数」です。つまり、SUM()やMEAN()と同じ方法で複数のデータ行の操作を行い、他の集約関数と同じように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を生成し、新しいLINESTRINGを単一のLINESTRINGに縫い付けません。LINESTRINGに縫い付けるにはST_LineMergeを使用します。
ご注意: この関数は以前は、"Union"から名称変更してGeomUnion()と呼ばれていました。UNIONはSQLの予約語であるためです。
Enhanced: 3.1.0 gridSizeパラメータを受け付けるようになりました。
gridSizeパラメータを使うにはGEOS 3.9.0以上が必要です
Changed: 3.0.0 SFCGAL非依存になりました。
Availability: 1.4.0 - ST_Unionが機能強化されました。ST_Union(geomarray)が導入され、PostgreSQLの高速なコレクションの集約が導入されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
![]() | |
集約関数版は、OGC仕様に明示的に定義されていません。 |
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.19 ポリゴンが含まれる時、Z値 (標高)を持ちます。
この関数は3次元に対応し、Z値を削除しません。 ただし、結果は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)
3次元の例 - 3次元対応のです (そしてジオメトリータイプが混在します!)
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)))
この3次元の例では座標次元の混在はありません。
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)))
この例ではクエリーから構築された配列を結合しています。
SELECT ST_Union(ARRAY(SELECT geom FROM sometable));
この例ではラインストリングの配列を結合しています。
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を返します。ポイントとラインで負の距離を指定すると、常に空を返します。
ジオメトリの場合、指定される距離の単位は、ジオメトリの空間参照系の単位です。ジオグラフィの場合、指定される距離の単位はメートルです。
3番目のパラメータは任意で、バッファの精度とスタイルを扱います。バッファの円弧の精度は四分の一円の近似に使用される辺の数です (デフォルトは8)。バッファのスタイルは キー=値 のペアを空白区切りでリストにして指定します。キーは次の通りです。
'quad_segs=#' : 四分の一円近似に使う辺の数 (デフォルトは8)。
'endcap=round|flat|square' : 終端スタイル (デフォルトは "round")。'butt'は'flat'の同義語として受け付けます。
'join=round|mitre|bevel' : 接続スタイル (デフォルトは"round")。'miter'も'mitre'の同義語として受け付けます。
'mitre_limit=#.#' : マイター比 (訳注: 継ぎ目の内側と外側の距離と線幅との比)の最大値 (継ぎ目スタイルがmiterである場合のみ有効)。'miter_limit'は'mitre_limit'の同義語として受け付けます。
'side=both|left|right' : デフォルトは'both'です。'left'または'right'でジオメトリーの片側へのバッファーが行われますが、左右はラインの方向で決まります。これはLINESTRINGジオメトリーにのみ適用可能です。POINTまたはPOLYGONジオメトリに影響を与えません。'left'または'right'を指定した場合にはデフォルトの終端スタイルは正方形になります。
![]() | |
|
![]() | |
不正な入力を操作することができ、出力は常に妥当なポリゴンジオメトリです。距離 0によるバッファ生成は時々不正なポリゴンの修復方法として使われます。. ST_MakeValidの方がマルチポリゴンも扱えるので、この目的に使うのにより適切です。 |
![]() | |
バッファ作成は時々、距離内にある地物を検索する際に使われます。この使い方については、ST_DWithinの方が効率的です。 |
![]() | |
この関数はZ値を無視します。この関数を3次元ジオメトリ上で使用したとしても、常に2次元の結果となります。 |
Enhanced: 2.5.0 - ST_Bufferのジオメトリ対応版が強化され、バッファを施す側をside=both|left|rightで指定できるようになりました。
Availability: 1.5 - ST_Bufferが強化され、様々な終端と継ぎ目に対応するようになりました。たとえば、道路ラインストリングを道路ポリゴンに変換する際に終端を丸でなく平面や四角で処理したい場合などに使えます。ジオグラフィ用の薄いラッパが追加されました。
GEOSモジュールで実現しています。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
このメソッドはSQL/MM仕様の実装です。 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 (デフォルトの最大マイター比) 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 |
バッファーを施したポイントは近似円になります。ポイントに四分円ごとに二つのポイント (図を参照)の近似を行うようバッファーを施した場合には8辺のポリゴンになります (図を参照)。
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
四分円に2ポイントだけ使うようにすると、より軽くなるけど円が角張って八角形になります。
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が可能です。入力ラインワークがポリゴンを形成しない場合には、NULLが返ります。
ST_MakePolygonと違い、この関数は複数の線で形成されたリングを受け付け、任意の数量のポリゴンを形成できます。
この関数は内側リングを穴に変換します。内側リングもポリゴンに変換したい場合にはST_Polygonizeを使います。
![]() | |
この関数が確実に動作するためには、ラインワークに正しくノードが加えられていなければなりません。ラインにノードを加えるにはST_Nodeを使用します。 入力ラインワークがクロスする場合には、この関数は不正なポリゴンを生成します。ST_MakeValidで、出力を確実に妥当なものにすることができます。 |
Availability: 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]POINTに対しては、入力座標の算術平均として計算されます。 [MULTI]LINESTRINGに対しては、各辺の重み付き長さとして計算されます。 [MULTI]POLYGONに対しては、面積から計算されます。空ジオメトリが与えられた場合には、空のGEOMETRYCOLLECTIONが返されます。NULLが与えられた場合には、NULLが返されます。CIRCULARSTRINGまたはCOMPOUNDCURVEが与えられた場合には、まずCurveToLineで直線に変換されてから、LINESTRINGと同じ計算を行います。
入力が混合次元の場合には、結果は最大次元のジオメトリの重心と同じになります (低次元ジオメトリは重心に0の「重み」を与えるためです)。
ポリゴンジオメトリに対しては、重心は必ずしもポリゴンの内部にあるわけではないことに注意して下さい。たとえば、下図のCの形のポリゴンの重心をご覧下さい。ポリゴン内部にポイントがあることを保障するにはST_PointOnSurfaceを使います。
New in 2.3.0 : CIRCULARSTRINGとCOMPOUNDCURVEに対応するようになりました (CurveToLineを使います)。
Availability: 2.4.0 ジオグラフィが導入されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 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の場合には、ポリゴンの環の終端が平滑化されません。ラインストリングの終端は常に保存されます。
![]() | |
頂点数は繰り返し回数の2倍です。結果ジオメトリは入力ジオメトリより多くのポイントを含むことになります。ポイント数を減らすには、結果に対して単純化関数を実行します (ST_Simplify, ST_SimplifyPreserveTopology, ST_SimplifyVWを参照して下さい)。 |
結果には、Z値とM値が存在する場合には、これらの補間値が入ります。
この関数は3次元に対応し、Z値を削除しません。
Availability: 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 — Catmull-Romスプライン曲線を用いて平滑化されたジオメトリーを返します。
geometry ST_CatmullRomSmoothing(geometry geom, integer nSegments = 5);
Catmull-Romスプラインアルゴリズムを用いた、ラインまたはポリゴンジオメトリーの平滑化を行います。ST_ChaikinSmoothingと違い、これは補間 スプラインで、出力曲線は元の頂点の全てを通ります。連続する頂点の間にはnSegments - 1個の補間ポイントが挿入されます。
nSegmentsパラメーターで出力の密度を制御します。nSegments = 5 (デフォルト)では、スパンごとに5個の辺に分かれます (スパンごとに4個のポイントが新設されます)。最小値は2です。
平滑化には少なくとも4個の頂点が必要です。頂点数が少ないジオメトリーが与えられると変更せずに返します。ポイントとマルチポイントが与えられると、常に変更せずに返します。
![]() | |
出力曲線の頂点数は、閉じていないラインストリングの場合は |
結果には、Z値とM値が存在する場合には、これらの補間値が入ります。
この関数は3次元に対応し、Z値を削除しません。
Availability: 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);
凹包は (通常は)入力ジオメトリを包含する凹ジオメトリで、凹ジオメトリの頂点は入力頂点の部分集合です。一般的に凹包はポリゴンです。二つ以上の同一線上の点の凹包は2点のラインストリングです。一つ以上の同一点の凹包はポイントです。 param_allow_holes引数ににTRUEを与えない限りポリゴンは穴を持ちません。
凹包はジオメトリの集合を「真空パック」したジオメトリと考えることができます。輪ゴムで囲うのに似ている凸包と違います。凹包は一般的に面積が小さく、また入力ポイントからなる境界が自然になります。
param_pctconvexは計算される凹包の凹度を制御するためのものです。1では凸包になります。1から0に変化させると凹度が増加していきます。0では最大の凹度の凹包になります (ただし単一ポリゴンのままです)。適切な値は入力データ固有のものですが、多くの場合0.3と0.1の間が適正な結果となります。
![]() | |
技術的には |
ポイントとラインの入力では、凹包は入力ポイントをポイントとラインの入力では、凹包は全ての入力ポイントを包みます。ポリゴン入力では、凹包は全ての入力ポイントを含み、なおかつ入力ポリゴンが及ぶ全ての面を含みます。ポリゴン入力でもポイントとして計算した凹包が欲しい場合には、ST_Pointsを使って、まずポイントに変換して下さい。
これは集約関数ではありません。ジオメトリー集合の凹包を計算するにはST_Collectを使います (例: ST_ConcaveHull(ST_Collect(geom ), 0.80))。
Availability: 2.0.0
Enhanced: 3.3.0, GEOS 3.11からGEOSネイティブ実装が有効になりました
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の併用でジオメトリ集合の凹包の計算。
この例ではポイント観察から汚染領域を見積もっています。
SELECT disease_type,
ST_ConcaveHull(ST_Collect(obs_pnt), 0.3 ) AS geom
FROM disease_obs
GROUP BY disease_type;
ST_ConvexHull — ジオメトリの凸包を計算します。
geometry ST_ConvexHull(geometry geomA);
ジオメトリの凸包を計算します。凸包は、入力ジオメトリのすべてを囲む最小の凸ジオメトリです。
凸包は、ジオメトリの集合に輪ゴムをかけて得られるジオメトリと見ることができます。これは「真空パック」に似ている凹包と異なります。凸包は観察ポイントの集合に基づいて、響を受けた領域を決定するために、しばしば使われます。
凸包は一般的にポリゴンです。二つ以上の同一線上のポイントの凸包は、2点のラインストリングになります。一つ以上の同一ポイントの凸包はポイントです。
集約関数ではありません。ジオメトリ集合の凸包を計算するには、ジオメトリ集合をジオメトリコレクションに集約するST_Collectを使います (ST_ConvexHull(ST_Collect(geom))等)。
GEOSモジュールで実現しています。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 5.1.16
この関数は3次元に対応し、Z値を削除しません。
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を使ってジオメトリ集合の凸包を計算します。
この例ではポイント観察から感染領域の見積もりを返します。
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 - 三角形のPOLYGONからなるGEOMETRYCOLLECTION (デフォルト)
1 - 三角形の辺のMULTILINESTRING
2 - 三角形のTIN
GEOSモジュールで実現しています。
Availability: 2.1.0
この関数は3次元に対応し、Z値を削除しません。
この関数は三角形と不規則三角網 (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値に基づいた頂点ポイントのフィルタリングを行います。返されるジオメトリは最小値(min値)以上かつ最大値(max値)以下のM値を持つポイントだけでできています。最大値の引数が指定されていない場合には、最小値のみ考慮されます。第4引数が指定されていない場合には、M値は結果ジオメトリに存在しません。結果ジオメトリの頂点ポイントの数が、ジオメトリを構成するに必要な数に達しない場合には、空ジオメトリが返されます。ジオメトリコレクション内の、十分なポイントを持たないジオメトリ要素は消えます。
この関数は主にST_SetEffectiveAreaとの併用を意図しています。ST_SetEffectiveAreaは頂点の有効面積をM値に設定します。ST_FilterByMによるフィルタリングだけで、他の計算なしに簡略化されたジオメトリを得られます。
![]() | |
ポイント数が基準を満たすのに十分でない時のST_SimplifyVWの返り値とST_FilterByMの返り値とで違いがあります。ST_FilterByMは空ジオメトリを返し、ST_SimplifyVWは十分なポイントを持つジオメトリを返します。 |
![]() | |
返されるジオメトリは不正である場合があることに注意して下さい。 |
![]() | |
この関数は全ての次元を返し、Z値もM値も残ります。 |
Availability: 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を使います。この際、0より大きい数を指定します。
Availability: 2.3.0
Enhanced: 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 — マルチポイントの幾何学的中央値を返します。
geometry ST_GeometricMedian ( geometry geom, float8 tolerance = NULL, int max_iter = 10000, boolean fail_if_not_converged = false);
マルチポイントジオメトリの幾何中央値の近似値を、Weiszfeldアルゴリズムを使って計算します。幾何中央値は、入力ポイントとの距離の合計を最小にするポイントです。幾何中央値によって、重心よりもはみ出しにくい中心測定ができます。
このアルゴリズムでは、成功した回次の間の距離の変化が、toleranceパラメータよりも小さくなるまで繰り返します。max_iterations回を超えた場合には、関数はfail_if_not_convergedをFALSEに指定している (デフォルト)場合を除いて、エラーを生成して終了します。
tolerance値が渡されていない場合には、デフォルトの許容値は、入力ジオメトリの範囲を基に計算されます。
存在する場合には、入力ポイントのM値は相対的な重みに解釈されます。
Availability: 2.3.0
Enhanced: 2.5.0 ポイントの重みとしてのM値の対応が追加されました。
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
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);
MULTILINESTRINGの要素を結合して形成されたLINESTRINGまたはMULTILINESTRINGを返します。ラインは2方向交点の終端で結合します。ラインは3方向以上の交点では結合しません。
directedがTRUEの場合には、ST_LineMergeはラインストリグ内のポイントの順序を変更しないため、反対方向のラインはマージされません。
![]() | |
MULTILINESTRING/LINESTRINGでのみ使用します。他のジオメトリタイプでは空のGEMETRYCOLLECTIONを返します。 |
GEOSモジュールで実現しています。
Enhanced: 3.3.0 directedパラメータを付け付けるようになりました。
directedパラメータを使うにはGEOS 3.11.0以上が必要です。
Availability: 1.1.0
![]() | |
この関数はM値を取り除きます。 |
次数2のノードはマージされます。
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);
(MULTI)POLYGONに含まれるか、全てのラインとポイントをオーバラップしない最大の円を探します。返されるレコードには次のフィールドがあります。
center - 円の中心点
nearest - 中心に最も近い、ジオメトリ上のポイント
radius - 円の半径
ポリゴン系の入力の時は、内側のリングを境界として使用して、円は境界リングに内接します。ラインやポイントの入力の時は、入力ラインとポイントを境界に使用して、円は入力の凸包に内接します。
Availability: 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をご覧下さい。
Availability: 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);
入力ジオメトリを含む最小の円を返します。
![]() | |
円はポリゴンで近似されます。デフォルトでは、1周の4分の1で48辺です。このポリゴンは円の最小バウンディングボックスの近似であるので、入力ジオメトリのいくつかの点はポリゴンに入らない可能性があります。この近似は辺の数を増やすことによって改善され、辺の数を増やすことで得られる不利益は小さいです。ポリゴン近似が適切でない場合のアプリケーションにおいては、ST_MinimumBoundingRadiusを使います。 |
ジオメトリの集合の最小境界円を得るにはST_Collectと併用します。
最小円 (最大対角線)上の二つのポイントを計算するにはST_MinimumBoundingCircleを使います。
ポリゴンの面積を最小包含円の面積で割った比率は、 Reock コンパクト度スコアと呼ばれます。
GEOSモジュールで実現しています。
Availability: 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_MinimumBoundingCircleを使います。
Availability: 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 );
ジオメトリを囲む最小の回転四角形を返します。最小回転四角形が複数個存在することがあるので注意して下さい。入力が退化している場合には、ポイントまたはラインストリングを返すことがあります。
Availability: 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になることがあるので、注意して下さい。
任意指定の第3引数では、空白区切りのkey=valueペアの一覧を指定して、次のような操作をすることができます。
'quad_segs=#' : 4分の1円区分数に近づけるために使われる区分の数 (デフォルトは8)。
'join=round|mitre|bevel' : 接続スタイル (デフォルトは"round")。'miter'も'mitre'の同義語として受け付けます。
'mitre_limit=#.#' : マイターの割合制限 (接続スタイルがマイターである場合のみ影響が出ます)。'miter_limit'も'mitre_limit'の同義語として受け付けます。
GEOSモジュールで実現しています。
GEOS 3.11 では動作が変更され、正と負の両方のオフセットで、オフセット曲線が入力ラインと同じ方向になりました。
Availability: 2.0
Enhanced: 2.5 - GEOMETRYCOLLECTIONとULTILINESTRINGへの対応追加
![]() | |
この関数はZ値を無視します。この関数を3次元ジオメトリ上で使用したとしても、常に2次元の結果となります。 |
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);
サーフェス (POLYGON、MULTIPOLYGON、CURVEPOLYGON)の内部にあることを保証されたPOINTを返します。PostGISでは、この関数はラインジオメトリやポイントジオメトリでも動作します。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s3.2.14.2 // s3.2.18.2
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.1.5, 9.5.6. 仕様では、サーフェスジオメトリのみのST_PointOnSurfaceが定義されています。PostGISは、すべての一般的なジオメトリタイプに対応するよう拡張しています。他のデータベース (Oracle、DB2、ArcSDE)は、サーフェスに対してのみこの機能をサポートしているようです。SQL Server 2008では、すべての一般的なジオメトリタイプに対応しています。
この関数は3次元に対応し、Z値を削除しません。
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_Centroidで計算されたポイントはポリゴンの外になる場合があるのに対して、ST_PointOnSurfaceの結果はポリゴン内に存在することが保証されます。
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);
ジオメトリの集合のラインワークで形成されるポリゴンを含むジオメトリコレクションを生成します。入力ラインワークがポリゴンを形成しない場合には、空のジオメトリコレクションを返します。
この関数は、区切られた領域の全てを覆うポリゴンを生成します。結果が妥当なポリゴンジオメトリになるようにするには、ST_BuildAreaを使用して、穴が埋められないようにします。
![]() | |
この関数が正しく動作するには、入力ラインワークは正しくノードが追加されている必要があります。入力が正しくノードが追加されるようにするにはポリゴン化の前に入力ジオメトリに対してST_Nodeを使います。 |
![]() | |
ジオメトリコレクションは外部ツールで扱うのに難しいことがあります。ST_Dumpでポリゴン化された結果を分かれたポリゴンに変換します。 |
GEOSモジュールで実現しています。
Availability: 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))
ラインストリングのテーブルのポリゴン化:
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_ReducePrecision — 全ての与えられたグリッド許容値に丸められたポイントからなる妥当なジオメトリを返します。
geometry ST_ReducePrecision(geometry g, float8 gridsize);
全ての与えられたグリッド許容値に丸められたポイントからなる妥当なジオメトリを返します。許容値より下の地物は削除されます。
ST_SnapToGridと違い、返されるジオメトリは妥当で、自己交差の環や崩壊した要素を伴いません。
精度提言は次の場合に使います。
座標精度をデータ精度に合わせる
ジオメトリを表現するのに必要な座標の数を減らす
低精度書式 (出力桁数が制限されるWKT, GeoJSON, KML等のテキスト書式)への出力ジオメトリの妥当性の確保。
妥当なジオメトリの低精度や制度制限のあるシステム (SDE, Oracle許容値等)へのエクスポート
Availability: 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 — Douglas-Peukerアルゴリズムを使用して、簡略化したジオメトリを返します。
geometry ST_Simplify(geometry geom, float tolerance);
geometry ST_Simplify(geometry geom, float tolerance, boolean preserveCollapsed);
単純化したジオメトリの表現を計算します。Douglas-Peucker algorithm を使います。単純化の tolerance (許容値) は、距離の値で、単位は入力 SRS (空間参照系) の単位です。単純化によって、単純化された線の許容値距離内にある頂点は削除されます。入力が有効であっても結果が有効にならないことがあります。
この関数は、どの種類のジオメトリでも (GEOMETRYCOLLECTION であっても) 呼ぶことができますが、ライン要素とポリゴン要素だけが単純化されます。線ジオメトリの端点は保持されます。
preserveCollapsedフラグは、与えられた許容値では削除される小さいジオメトリを保持します。たとえば、10m許容値で1m長の線をたぬんかする場合にpreserveCollapsedがTRUEの場合には、このラインが消えることがありません。このフラグは、非常に小さい地物がマップから消えるのを防ぐために、地図描画目的の際に使います。
![]() | |
返されるジオメトリは単純性を喪失している場合があり (ST_IsSimple参照)、トポロジが保持されていないばあ外アリ、ポリゴンの結果が不正になる可能性があります (ST_IsValid参照)。トポロジを保全し、妥当性を確保するには、ST_SimplifyPreserveTopologyを使います。 |
![]() | |
この関数は、ポリゴン間で共有される境界は保持されません。保持するにはST_CoverageSimplifyを使います。 |
Availability: 1.2.2
中ぐらいの許容値で円を単純化すると八角形になり、許容値を大きくすると消えます。
SELECT ST_NPoints(geom) AS np_before,
ST_NPoints(ST_Simplify(geom, 0.1)) AS np01_notbadcircle,
ST_NPoints(ST_Simplify(geom, 0.5)) AS np05_notquitecircle,
ST_NPoints(ST_Simplify(geom, 1)) AS np1_octagon,
ST_NPoints(ST_Simplify(geom, 10)) AS np10_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))
MULTIPOLYGONの簡略化。ポリゴンの結果は不正になることがあります。
SELECT ST_Simplify('MULTIPOLYGON (((90 110,80 180,50 160,10 170,10 140,20 110,90 110)),((40 80,100 100,120 160,170 180,190 70,140 10,110 40,60 40,40 80),(180 70,170 110,142.5 128.5,128.5 77.5,90 60,180 70)))'::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 — Douglas-Peuckerアルゴリズムを使用して、単純化した妥当なジオメトリを返します。
geometry ST_SimplifyPreserveTopology(geometry geom, float tolerance);
Douglas-Peucker algorithmの一種を用いて単純化したジオメトリを計算します。結果のトポロジが入力と同じになるように単純化を制限します。簡略化のtolerance (許容値)は距離値で、単位は入力SRSの単位です。簡略化によって、トポロジが保持される限り、簡略化された線の許容距離値内の頂点が削除されます。入力が妥当かつ単純な場合には、結果は妥当かつ単純です。
この関数は、どの種類のジオメトリ (GEOMETRYCOLLECTIONも含む)を引数にとっても呼ぶことができますが、ラインとポリゴン要素だけを単純化します。結果はリングの数は同じで、入力が相互にインタセクトしていないなら結果も相互にインタセクトしません。線ジオメトリの端点は保持されます。
![]() | |
この関数は、ポリゴン間で共有される境界は保持されません。保持するにはST_CoverageSimplifyを使います。 |
GEOSモジュールで実現しています。
Availability: 1.3.3
ST_Simplifyの例と同じくST_SimplifyPreserveTopologyはジオメトリーの消滅を予防しています。
SELECT ST_NPoints(geom) AS np_before,
ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.1)) AS np01_notbadcircle,
ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.5)) AS np05_notquitecircle,
ST_NPoints(ST_SimplifyPreserveTopology(geom, 1)) AS np1_octagon,
ST_NPoints(ST_SimplifyPreserveTopology(geom, 10)) AS np10_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))
外側リングと内側リングのトポロジを保全したMULTIPOLYGONを単純化します。
SELECT ST_SimplifyPreserveTopology('MULTIPOLYGON (((90 110,80 180,50 160,10 170,10 140,20 110,90 110)),((40 80,100 100,120 160,170 180,190 70,140 10,110 40,60 40,40 80),(180 70,170 110,142.5 128.5,128.5 77.5,90 60,180 70)))'::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);
ポリゴンジオメトリに対してトポロジを保存した状態で簡略化した外側または内側の凹包を計算します。外側の凹包は入力ジオメトリを完全に覆います。内側の凹包は完全に入力ジオメトリに覆われます。返される結果は、入力ポリゴンの頂点の部分集合から形成されるポリゴンジオメトリです。MULTIPOLUGONと穴は処理され、結果は入力ジオメトリと同じ構造になります。
頂点数の減少はvertex_fractionパラメータで制御できます。0から1の範囲を取ります。小さい値では簡略化が進み、頂点数が減り、凹性が下がります。外側の凹包も内側の凹包も、vertex_fraction値が1.0では、元のジオメトリが生成されます。0.0では、外側の凹包については凸包 (単一ポリゴンの場合)が生成され、内側の凹包については三角形が生成されます。
単純化処理では、頂点数が目標に達するまで、最も少ない面積を持つ凹の角を徐々に削除しています。これによりエッジがクロスするのを防ぎ、常に妥当なポリゴンジオメトリを返します。
相対的に辺が長いジオメトリでより良い結果を得るには、次のように、辺の分割を行います。
GEOSモジュールで実現しています。
Availability: 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 — Visvalingam-Whyattアルゴリズムを使用して、入力ジオメトリを簡略化したジオメトリを返します。
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.
この関数は、どの種類のジオメトリでも (GEOMETRYCOLLECTION であっても) 呼ぶことができますが、ライン要素とポリゴン要素だけが単純化されます。線ジオメトリの端点は保持されます。
![]() | |
返されるジオメトリは単純性を喪失している場合があり (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を使います。
この関数は3次元を扱います。第3次元は結果に影響を与えます。
Availability: 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 — Visvalingam-Whyattアルゴリズムを使って有効範囲となる個々の頂点を置きます。
geometry ST_SetEffectiveArea(geometry geom, float threshold = 0, integer set_area = 1);
Visvalingam-Whyattアルゴリズムから有効範囲となる個々の頂点を置きます。有効範囲はジオメトリのM値として格納されます。任意引数である第2引数を使うと、しきい値以上の有効範囲となる頂点だけで構築されるジオメトリを返します。
この関数は、しきい値を使うことでサーバサイド簡略化に使えます。もう一つの任意引数はしきい値を0にする際に使用します。この場合、完全なジオメトリを得ますが、クライアントが非常に高速に簡略化するために使うM値として格納している有効範囲を持っています。
(MULTI)LINEと(MULTI)POLYGONとで実際に動作をしますが、どのような種類のジオメトリでも安全に呼ぶことができます。簡略化はオブジェクトごとに行われるので、ジオメトリコレクションでこの関数を呼ぶことができます。
![]() | |
返されるジオメトリは単純性 (ST_IsSimple参照)を失うことがあります。 |
![]() | |
トポロジは保存されているとは限らず、不正なジオメトリを返すことがあります。トポロジを保存するにはST_SimplifyPreserveTopologyを使います。 |
![]() | |
出力ジオメトリは、入力時に持っていたM値の情報の全てを失います。 |
![]() | |
この関数は3次元を扱います。第3次元は結果に影響を与えます。 |
Availability: 2.2.0
ラインストリングの有効範囲の計算。しきい値を0にしているので、入力ジオメトリの全ての頂点が返ります。
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);
ポリゴンの制約付きドロネー三角分割を計算します。穴やMULTIPOLYGONに対応しています。
ポリゴンの「制約付きドロネー三角分割」は、ポリゴンの頂点から形成された三角形の集合で、ポリゴンを確実に覆い、内角和が考えられる三角分割の中で最大になります。この関数によって、ポリゴンの「最高品質」の三角分割が得られます。
Availability: 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 );
与えられたジオメトリの頂点から2次元ボロノイ図を生成し、ボロノイ図のサイト間の境界をMULTILIESTRINGで返します。入力ジオメトリがNULLの場合にはNULLを返します。入力ジオメトリの頂点が一つの場合には空ジオメトリを返します。extend_toで作られるエンベロープの面積が0の場合には空ジオメトリを返します。
任意パラメータ:
tolerance: 複数の頂点を同一のものと捉える距離。0でない値を許容距離として与えるとアルゴリズムのロバスト性が改善します (デフォルトは0.0)。
extend_to: これが与えられている場合には、与えられたジオメトリのエンベロープを覆うように図が拡張されます。デフォルト値以上でないと有効ではありません (デフォルトはNULLで、デフォルトのエンベロープは入力ジオメトリのバウンディングボックスから50%拡張したものです)。
GEOSモジュールで実現しています。
Availability: 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 );
与えられたジオメトリの頂点から2次元ボロノイ図を生成します。結果はPOLYGONのGEOMETRYCOLLECTIONで、、入力の頂点の範囲以上のエンベロープを覆います。入力ジオメトリがNULLの場合にはNULLを返します。入力ジオメトリの頂点が一つの場合には空ジオメトリを返します。extend_toで作られるエンベロープの面積が0の場合には空ジオメトリを返します。
任意パラメータ:
tolerance: 複数の頂点を同一のものと捉える距離。0でない値を許容距離として与えるとアルゴリズムのロバスト性が改善します (デフォルトは0.0)。
extend_to: これが与えられている場合には、与えられたジオメトリのエンベロープを覆うように図が拡張されます。デフォルト値以上でないと有効ではありません (デフォルトはNULLで、デフォルトのエンベロープは入力ジオメトリのバウンディングボックスから50%拡張したものです)。
GEOSモジュールで実現しています。
Availability: 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);
ウィンドウパーティション内のポリゴンが妥当なポリゴンカバレッジを形成するかどうかチェックするウィンドウ関数です。個々のポリゴン内の不正なエッジの位置 (あるなら)を示す線形インジケータを返します。
次の条件を満たすなら妥当なポリゴンの集合は妥当なカバレッジです:
オーバラップなし - ポリゴン同士がオーバラップしない (ポリゴンの内部でインタセクトしない)
エッジ一致 - 共有エッジに沿った頂点が同一
ウィンドウ関数として、入力ポリゴンごとに値が返されます。妥当性条件の一つ以上に違反するポリゴンについては返り値は、問題のあるエッジを含むMULTILINESTRINGです。カバレッジ妥当なポリゴンに対してはNULLを返します。非ポリゴンや空ジオメトリに対してもNULL値が返ります。
この条件では、周囲のポリゴンがエッジ一致になっている限りは、妥当なカバレッジは穴 (ポリゴン間の隙間)を含むことができます。しかしながら、非常に小さい隙間は、望まれないものとされることがしばしばあります。toleranceパラメーターが0でない距離で指定されている場合には、小さい隙間を形成するエッジば不正なものとして返されます。
カバレッジ妥当性のチェックがなされたポリゴンも妥当なジオメトリです。ST_IsValidでチェックできます。
Availability: 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
この例ではテーブル全体のカバレッジ妥当性について調べます。
SELECT true = ALL (
SELECT ST_CoverageInvalidEdges(geom) OVER () IS NULL
FROM coverage
);
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が通り、カバレッジ処理関数の入力にすることができます。
![]() | |
最大隙間幅の判定を助けるために、 |
Availability: 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 algorithm版を使います。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を使います。 |
Availability: 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 — ポリゴンカバレッジの重複の無いエッジを計算します。
geometry ST_CoverageEdges(geometry geom, integer edgetype = 0);
geometry ST_CoverageEdges(geometry[] geoms, integer edgetype = 0);
ポリゴンカバレッジの重複の無いエッジをMULTILINESTRING表現で返します。ポリゴンカバレッジはオーバーラップが無いポリゴンの集合で、隣接するポリゴンは共有するエッジに沿って一致する頂点を持っています。
edgetypeパラメーターはどのエッジを返すかを選択するのに使われます。取りえる値は次の通りです:
0 (ALL) - 全ての重複の無いエッジ (デフォルト)
1 (EXTERIOR) - ポリゴンの外側のエッジのみ (非共有エッジ)
2 (INTERIOR) - ポリゴンの内側のエッジのみ (共有エッジ)
Availability: 3.7.0
GEOS >= 3.15.0 が必要です
この例ではカバレッジの全ての一意のエッジを返します。
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;この例ではカバレッジの内部の共有エッジだけを返します。
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を使います。 |
Availability: 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 — ジオメトリに3次元アフィン変換を適用します。
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);
3次元アフィン変換をジオメトリに適用して移動、回転、拡大縮小を一度に行います。
一つ目の形式では、次のように関数を呼んでいます。
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次元アフィン変換をジオメトリに適用します。次のように関数を呼んでいます。
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
このメソッドは上述の3次元メソッドの特異ケースです。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Availability: 1.1.2 AffineからST_Affineに名称変更しました。
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
3次元ラインをZ軸周りに180°回転させます。これは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)
3次元ラインをX軸回りZ軸回りとで180°回転させます。
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);
ジオメトリを原点について反時計回りにrotRadiasnぶん回転させます。原点はPOINTジオメトリか、xとyの座標値を指定します。原点を指定しない場合にはPOINT(0,0)について回転させます。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Enhanced: 2.0.0 回転の原点を指定するパラメーターを追加しました。
Availability: 1.1.2 RotateからST_Rotateに名称変更しました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例ではジオメトリーを180°回転させます。
SELECT ST_Rotate('LINESTRING (50 160,50 50,100 50)'::geometry, pi());LINESTRING(-50 -160,-50 -50,-100 -50)
この例ではジオメトリーをx=50, y=160を原点にして反時計回りで30°回転させます。
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)
この例ではジオメトリーを重心を原点として時計回りに60°回転させます。
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をX軸についてrotRadiansぶん回転させます。
![]() | |
|
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Availability: 1.1.2 1.2.2でRotateXからST_RotateXに名称変更しました。
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例ではラインをX軸周りに90度回転させます。
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をY軸についてrotRadiansぶん回転させます。
![]() | |
|
Availability: 1.1.2 1.2.2でRotateYからST_RotateYに名称変更しました。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例ではラインをY軸周りに90°回転させます。
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をZ軸についてrotRadiansぶん回転させます。
![]() | |
この関数はST_Rotateと同じです。 |
![]() | |
|
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Availability: 1.1.2 1.2.2でRotateZからST_RotateZに名称変更しました。
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この例ではラインをZ軸周りに90°回転させます。
SELECT ST_RotateZ('LINESTRING(1 2 3,1 1 1)', pi()/2);LINESTRING(-2 1 3,-1 1 1)
この例では曲線円をZ軸周りに回転させます。
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パラメータでジオメトリを取る形式では、2次元、3次元 (XYZ. XYM)、4次元のポイントで、全ての対応する次元のスケーリングの乗数を設定することができます。factorポイントの欠けた次元については、対応する次元は拡大縮小をしないのと等価になります。
三つのジオメトリを与える形式では、拡大縮小に「仮原点」を渡すことができます。これにより、たとえば、仮原点としてジオメトリの重心を使うといった、「適切な位置での拡大縮小」が可能となります。仮原点を使わない場合には、拡大縮小は実際の原点からの位置で行われるので、全ての座標は拡大縮小係数との積になります。
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
Availability: 1.1.0
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Enhanced: 2.2.0 全ての次元の拡大縮小 (factorパラメータ)への対応が導入されました。
Enhanced: 2.5.0 局所原点 (originパラメータ)を使った拡大縮小への対応を導入しました。
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数はM値に対応します。
この例ではX,Y,Z値を拡大縮小します。
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)
この例ではX,Y値を拡大縮小します。
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)
この例ではX,Y,Z,M値を拡大縮小します。
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)
この例では仮原点を使ってX,Y値を拡大縮小します。
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);
座標がX増分、Y増分、Z増分で変換した新しいジオメトリーを返します。単位はジオメトリーのSRID (空間参照系)の単位です。M値は保存されます。
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
Availability: 1.2.2
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数はM値に対応します。
ポイントを経度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)
3次元ポイントを移動させます。
SELECT ST_Translate(CAST('POINT(0 0 0)' AS geometry), 5, 12, 3);POINT(5 12 3)
M値を持つポイントを移動させます
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引数で拡大縮小させます。2次元でのみ動作します。
![]() | |
|
![]() | |
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
Availability: 1.1.0
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_TransScale('LINESTRING(1 2 3,1 1 1)', 0.5, 1, 1, 2);LINESTRING(1.5 6 3,1.5 4 1)
この例ではポイントにポイントへのバッファーで近似円を作り、曲線に変換して、1,2に移動させ、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);
2次元Density-based spatial clustering of applications with noise (DBSCAN)アルゴリズムを使って、入力ジオメトリ毎にクラスタ番号を返すウィンドウ関数です。ST_ClusterKMeansと違い、クラスタ数の指定は不要ですが、代わりに、クラスタを決定するために、期待する距離(eps)と密度(minpoints)のパラメータを使います。
入力ジオメトリは、次のいずれかの場合にはクラスタに追加されます:
境界ジオメトリは、複数のクラスタの核ジオメトリのeps距離内に存在する場合があることに注意して下さい。どちらに割り当てても正しいので、境界ジオメトリは有効なクラスタの一つに任意に割り当てられます。この状況では、正しいクラスタがminpointsジオメトリより少ないジオメトリで生成される可能性があります。境界ジオメトリの割当の決定性を確実にする (その結果、ST_ClusterDBSCANの呼び出しで同じ結果が生成される)には、ウィンドウ定義内でORDER BY節を使います。あいまいなクラスタ割当は他のDBSCAN実装とは異なるかも知れません。
![]() | |
どのクラスタとの結合の基準に合わないジオメトリは、NULLのクラスタ番号が割り当てられます。 |
Availability: 2.3.0
このメソッドは曲線ストリングと曲線に対応しています。
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);
入力ジオメトリから接続されたものをクラスタとし、クラスタ間は接続されていないように分割してGEOMETRYCOLLECTIONの配列を返す集約関数です。クラスタ内の個々のジオメトリは同一クラスタ内の他のジオメトリの少なくとも一つとインタセクトし、他のクラスタ内のいずれのジオメトリともインタセクトしません。
Availability: 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 — 入力ジオメトリごとに接続された集合にクラスタリングを行い、クラスタIDを返すウィンドウ関数です。
integer ST_ClusterIntersectingWin(geometry winset geom);
インタセクトするジオメトリの接続されたクラスタを構築するウィンドウ関数です。クラスタを離れることなく、クラスタ内の全てのジオメトリを走査することができます。返り値はジオメトリ引数が入っているクラスタの番号です。入力がNULLの場合にはNULLを返します。
Availability: 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 — ジオメトリーが接続するかどうかを判定する空間関係パターンを使って、入力ジオメトリーを接続されたジオメトリ集合にクラスタリングして、クラスター識別子を返すウィンドウ関数です。
integer ST_ClusterRelateWin(geometry winset geom, text relate_matrix);
交差するジオメトリの接続されたクラスターを構築するウィンドウ関数です。ジオメトリーは、クラスターの他のメンバーとのDE9IM空間関係行列が対で合致する場合には、クラスターに追加されます。この関数によって、境界同士が接触するすべてのオブジェクトのクラスターを構築できますが、単にオーバーラップするものは除外されます。
Availability: 3.7.0
このラインストリングのコレクションは ST_ClusterIntersectingWinを使って単一のクラスターを形成しますが、 ST_ClusterRelateWinを使うと、端点でのみ接続する三つのグループにクラスタリングできます。
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 — 最小全域木アルゴリズムを使って入力ジオメトリーを接続された木にクラスタリングを行い、入力ジオメトリーごとに木IDを返すウィンドウ関数です。
integer ST_MinimumSpanningTree(geometry winset geom);
入力ジオメトリの最小接続木 (Minimum Spanning Tree, MST)に基づいてラインストリングの接続グラフを構築するウィンドウ関数です。返り値は、引数のジオメトリーが参加しているクラスターの番号で、最小木を構成していない場合には0となります。
Minimum Spanning Tree (最小全域木)はウィンドウ区画にある全てのジオメトリーと接続していて、線長が最小となる木です。グラフが完全には接続されていない (例: ジオメトリ間が無限距離になっている)場合には、最小全域フォレストを生成します。これはそれぞれの接続要素に一意の木IDが付きます。
Availability: 3.7.0
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平均法アルゴリズムを使ってクラスタ番号を返すウィンドウ関数です。
integer ST_ClusterKMeans( geometry winset geom , integer k , float8 max_radius );
入力ジオメトリごとのK平均法のクラスタ番号を返します。クラスタリングに使われる距離は、2次元ジオメトリでは重心間の距離、3次元ジオメトリではバウンディングボックスの中心点間の距離です。POINT入力では、M値は入力の重みとして扱われ、0より大きくなければなりません。
max_radiusが設定されている場合には、ST_ClusterKMeansは、出力クラスタがmax_radiusより半径が大きいクラスタを作らなくなるので、kより多いクラスタを生成します。到達可能性分析に使います。
Enhanced: 3.2.0 max_radiusパラメータに対応しました
Enhanced: 3.1.0 3次元ジオメトリと重みに対応するようになりました
Availability: 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);
GEOMETRYCOLLECTIONの配列を返す集約関数で、個々の要素は入力ジオメトリを含むクラスタです。クラスタリングは入力ジオメトリを、それぞれのジオメトリが、同じクラスタ内の他のジオメトリのうち少なくとも一つとの距離がdistance以内となる集合に分割します。距離はSRIDの単位を取るデカルト距離です。
ST_ClusterWithin は、ST_ClusterDBSCAN を minpoints => 0 で実行するのと同じです。
Availability: 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_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 — 入力ジオメトリごとに分離距離を使ったクラスタリングを行い、クラスタIDを返すウィンドウ関数です。
integer ST_ClusterWithinWin(geometry winset geom, float8 distance);
入力ジオメトリ毎のクラスタ番号を返すウィンドウ関数です。クラスタリングはジオメトリを、それぞれのジオメトリが、同じクラスタ内の他のジオメトリのうち少なくとも一つとの距離がdistance以内となる集合に分割します。距離はSRIDの単位を取るデカルト距離です。
ST_ClusterWithinWin は、ST_ClusterDBSCAN を minpoints => 0 で実行するのと同じです。
Availability: 3.4.0
このメソッドは曲線ストリングと曲線に対応しています。
WITH testdata AS (
SELECT id, geom::geometry FROM (
VALUES (1, 'LINESTRING (0 0,1 1)'),
(2, 'LINESTRING (5 5,4 4)'),
(3, 'LINESTRING (6 6,7 7)'),
(4, 'LINESTRING (0 0,-1 -1)'),
(5, 'POLYGON ((0 0,4 0,4 4,0 4,0 0))')) AS t(id, geom)
)
SELECT id,
geom,
ST_ClusterWithinWin(geom, 1.4) OVER () AS cluster
FROM testdata;id | st_astext | cluster ----+--------------------------------+--------- 1 | LINESTRING(0 0,1 1) | 0 2 | LINESTRING(5 5,4 4) | 0 3 | LINESTRING(6 6,7 7) | 1 4 | LINESTRING(0 0,-1 -1) | 0 5 | POLYGON((0 0,4 0,4 4,0 4,0 0)) | 0
Box2D — ジオメトリの2次元範囲を表現するBOX2Dを返します。
box2d Box2D(geometry geom);
ジオメトリの2次元範囲を表現するbox2dを返します。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 — ジオメトリの3次元範囲を表現するBOX3Dを返します。
box3d Box3D(geometry geom);
ジオメトリの3次元範囲を表現するbox3dを返します。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
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より前では、代わりに例外が投げられていました。 |
![]() | |
テーブルや名前空間の名前のうち特殊文字や引用符をエスケープすると、特別な処理が必要になる可能性があります。あるユーザは「スキーマとテーブルでは、識別子エスケープ規則を使って、二重引用符を付けた文字列を生成して、その後最初と最後の二重引用符を削ります。ジオメトリカラムについてはそのまま渡します」 |
Availability: 1.0.0
Changed: 2.1.0 2.0.xまではST_Estimated_Extentと呼ばれていました。
このメソッドは曲線ストリングと曲線に対応しています。
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_Bufferではジオメトリを全ての方向に拡張するのに対して、ST_Expandはバウンディングボックスを各軸に沿って拡張する点が異なります。
![]() | |
1.3より前の版では、インデックス化可能な距離クエリではST_ExpandとST_Distanceとが組み合わせて使われていました。たとえば |
Availability: 1.5.0 出力をfloat4座標値から倍精度に変更しました。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Enhanced: 2.3.0 異なる次元の異なる量によるボックスの拡張に対応するようになりました。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
![]() | |
次に示す例では、メートル単位の投影法である米国ナショナルアトラス正積図法 (SRID=2163)を使っています。 |
10-meter expanded box around bbox of a linestring.
SELECT CAST(ST_Expand(ST_GeomFromText('LINESTRING(2312980 110676,2312923 110701,2312892 110714)', 2163), 10) As box2d);BOX(2312882 110666,2312990 110724)
この例では3次元ボックスを10m拡張します。
SELECT ST_Expand(CAST('BOX3D(778783 2951741 1,794875 2970042.61545891 10)' AS box3d), 10)BOX3D(778773 2951731 -9,794885 2970052.61545891 20)
この例ではポイントジオメトリーを10m拡張したボックスの文字表現を示します。
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はOracle Spatial/LocatorのSDO_AGGR_MBRと似た発想のものです。
![]() | |
ST_Extentは、3次元ジオメトリであってもX値とY値だけを持つボックスを返します。Z値も得たいならST_3DExtentを使います。 |
![]() | |
返された |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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
この例では範囲をジオメトリーに戻して、そのテキスト表現を表示します。
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 — ジオメトリの3次元バウンディングボックスを返す集約関数です。
box3d ST_3DExtent(geometry set geomfield);
ジオメトリ集合のbox3d (Z値を持つ)を返す集約関数です。
バウンディングボックスの座標は、入力ジオメトリの空間参照系に従います。
![]() | |
返された |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Changed: 2.0.0 以前の版ではST_Extent3Dと呼ばれていました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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)
この例では高さを持つCIRCULARSTRINGを複数生成してその範囲を返します。
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 — 二つの2次元のポイントジオメトリで定義されるBOX2Dを生成します。
box2d ST_MakeBox2D(geometry pointLowLeft, geometry pointUpRight);
二つのポイントジオメトリで定義されるbox2d を生成します。これは範囲のクエリを実行する時に便利です。
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 — 二つの3次元のポイントジオメトリで定義されるBOX3Dを生成します。
box3d ST_3DMakeBox(geometry point3DLowLeftBottom, geometry point3DUpRightTop);
二つの3次元ポイントジオメトリで定義されるbox3dが生成されます。
この関数は3次元に対応し、Z値を削除しません。
Changed: 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 — 2次元または3次元のバウンディングボックスまたはジオメトリのXの最大値を返します。
float ST_XMax(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリのXの最大値を返します。
![]() | |
この関数はbox3dだけをパラメータに取るよう定義されていますが、自動キャストを介してbox2dやジオメトリ値でも動作します。しかしながら、ジオメトリやbox2dの文字列表現は自動キャストを行わないため受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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
文字列から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 — 2次元または3次元のバウンディングボックスまたはジオメトリのXの最小値を返します。
float ST_XMin(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリのXの最小値を返します。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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
文字列から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 — 2次元または3次元のバウンディングボックスまたはジオメトリのYの最大値を返します。
float ST_YMax(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリのYの最大値を返します。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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
文字列から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 — 2次元または3次元のバウンディングボックスまたはジオメトリのYの最小値を返します。
float ST_YMin(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリのYの最小値を返します。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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
文字列から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 — 2次元または3次元のバウンディングボックスまたはジオメトリのZの最大値を返します。
float ST_ZMax(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリのZの最大値を返します。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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
文字列から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 — 2次元または3次元のバウンディングボックスまたはジオメトリのZの最小値を返します。
float ST_ZMin(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリのZの最小値を返します。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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
文字列から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 — 2次元または3次元のバウンディングボックスまたはジオメトリーのX方向のサイズを返します。
float ST_XSize(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリーのX方向のサイズを返します。 ST_XMax(aGeomorBox2DorBox3D) - ST_XMin(aGeomorBox2DorBox3D)を計算しています。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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 — 2次元または3次元のバウンディングボックスまたはジオメトリーのY方向のサイズを返します。
float ST_YSize(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリーのY方向のサイズを返します。 ST_YMax(aGeomorBox2DorBox3D) - ST_YMin(aGeomorBox2DorBox3D)を計算しています。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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 — 2次元または3次元のバウンディングボックスまたはジオメトリーのZ方向のサイズを返します。
float ST_ZSize(box3d aGeomorBox2DorBox3D);
2次元または3次元のバウンディングボックスまたはジオメトリーのZ方向のサイズを返します。ST_ZMax(aGeomorBox2DorBox3D) - ST_ZMin(aGeomorBox2DorBox3D)を計算しています。
![]() | |
この関数はBOX3Dに対してのみ定義されていますが、自動キャストによってBOX2Dやジオメトリ値でも動作します。しかしながら、ジオメトリまたはBOX2Dの文字列表現は、自動キャストを行わないため、受け付けません。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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);
M値の最小値を返します。M値が無い場合にはNULLを返します。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_MMin('POINT M (1 2 3)');3
ST_MMax — M値の最大値を返します。
float ST_MMax(geometry geom);
M値の最大値を返します。M値が無い場合にはNULLを返します。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_MMax('POINT M (1 2 3)');3
ST_MSize — ジオメトリーのM値のサイズを返します。
float ST_MSize(geometry geom);
ジオメトリーのM値のサイズを返します。ST_MMax(geom) - ST_MMin(geom)を計算しています。M値が無い場合にはNULLを返します。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
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を参照して下さい。
![]() | |
この関数は2次元のポイントとして計算して、Z値とM値は補間値を計算します。ST_3DLineInterpolatePointは3次元のポイントとして計算して、M値のみ補間値を計算します。 |
![]() | |
1.1.1から、この関数はM軸やZ軸の内挿点も (存在するなら)計算するようになりました。それより前の版では0.0となります。 |
Availability: 0.8.2 Z軸とM軸のサポートが1.1.1で追加されました
Changed: 2.1.0 2.0.xまでではST_Line_Interpolate_Pointと呼んでいました。
この関数は3次元に対応し、Z値を削除しません。
この例ではラインに沿って20%のポイントを返します。
SELECT ST_LineInterpolatePoint( 'LINESTRING(25 50,100 125,150 190)', 0.2);
POINT(51.5974135047432 76.5974135047432)
3次元ラインの中間点:
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 — 3次元ラインに沿って、割合で示された位置の補間ポイントを返します。
geometry ST_3DLineInterpolatePoint(geometry a_linestring, float8 a_fraction);
3次元ラインに沿って、割合で示された位置の補間ポイントを返します。一つ目の引数はLINESTRINGです。二つ目の引数は0から1の間の浮動小数点数で、ライン長に対するポイントの位置の割合を表現します。M値が存在する場合には補間計算を行います。
![]() | |
ST_LineInterpolatePoint 2次元ポイントの計算とZ値とM値の補間値を計算しますが、この関数は3次元ポイントを計算し、M値だけ補間計算を行います。 |
Availability: 3.0.0
この関数は3次元に対応し、Z値を削除しません。
3次元ラインに沿って20%のポイントを返します
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と同じです)。
結果が0以上のポイントを持つ場合にはPOINTが返ります。二つ以上のポイントを持つ場合にはMULTIPOINTが返ります。
Availability: 2.5.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
この例では2次元ラインに沿って20%ごとにポイントを生成して返します。
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);
ラインストリング上の、与えたポイントへの最短点を、2次元ラインストリングの総延長に対する割合として0から1の区間で返します。
返された位置は、ポイント(ST_LineInterpolatePoint)または、部分ラインストリング(ST_LineSubstring)の抽出に使用することができます。
この関数は、住所番号に近づくのに使えます (訳注: 道路方式の住居表示の場合)。
Availability: 1.1.0
Changed: 2.1.0 2.0.xまでではST_Line_Locate_Pointと呼んでいました。
この例ではストリートのラインに最も近いポイントの位置を得ることによって、家のストリート番号を近似しています。サブクエリーによってサンプルの家とストリートのデータが作られ、ST_DWithinによってストリートから十分に遠い家を除きます。
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
この例ではポイントや他のジオメトリから最も近いライン上のポイントを探索します。
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);
与えられた割合位置を開始点と終了点とした、入力ラインの一部を計算します。一つ目の引数はLINESTRINGでなければなりません。二つ目と三つ目の引数は[0, 1]の範囲内で、開始点と終了点の、ライン長に対する割合の位置です。ジオメトリー入力に対する割合は2次元長で計算されます。Z値とM値が存在する場合には、追加された端点に対して補間計算を行います。
startfractionとendfractionが同じ値である場合には、ST_LineInterpolatePointと同じになります。
![]() | |
この関数はLINESTRINGに対してのみ動作します。連続するMULTILINESTRINGで使うには、先にST_LineMergeで結合させます。 |
![]() | |
1.1.1リリースからは、この関数はM値とZ値を補間します。それより前のリリースでは、Z値とM値は不定値になります。 |
Enhanced: 3.4.0 ジオグラフィ対応が導入されました。
Changed: 2.1.0 2.0.xではST_Line_Substringと呼ばれていました。
Availability: 1.1.0 Z軸とM軸のサポートが1.1.1で追加されました
この関数は3次元に対応し、Z値を削除しません。
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)
開始点と終了点とが同じ場合には、結果はPOINTになります。
SELECT ST_LineSubstring( 'LINESTRING(25 50,100 125,150 190)', 0.333, 0.333);
POINT(69.28469348539744 94.28469348539744)
LINESTRINGを長さ100以下の断片に分解するクエリ。FORループと同等のものを生成するためにgenerate_series()とCROSS JOIN LATERALとを併用しています。
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;ジオメトリー入力の場合には、割合による位置はZ値を持っていてもラインの2次元長を基に計算します。結果のZ値は選択した2次元位置に沿って補間しています。
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 — M値に一致するジオメトリ上のポイントを返します。
geometry ST_LocateAlong(geometry geom_with_measure, float8 measure, float8 offset = 0);
M値を持つジオメトリに沿った位置を返します。結果はポイントまたはマルチポイントです。ポリゴン系入力には対応していません。
offsetが与えられた場合には、結果は、入力ラインの左または右に、指定された距離だけ移動します。正のオフセット値で左に、負の値で右にそれぞれ移動します。
![]() | |
この関数は、M要素を持つライン系ジオメトリでのみ使います。 |
ISO/IEC 13249-3 SQL/MM 空間標準で規定されているため、このような意味になります。
Availability: 1.1.0 それまではST_Locale_Along_Measureでした。
Changed: 2.0.0 以前の版ではST_Locate_Along_Measureと呼ばれていました。
この関数はM値に対応します。
このメソッドはSQL/MM仕様の実装です。 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 — M値の範囲に合致する部分ジオメトリを返します。
geometry ST_LocateBetween(geometry geom, float8 measure_start, float8 measure_end, float8 offset = 0);
指定された範囲のM値を持つ入力ジオメトリの部分ジオメトリとなるジオメトリ (コレクション)を全て返します。
offsetが与えられた場合には、結果は、入力ラインの左または右に、指定された距離だけ移動します。正のオフセット値で左に、負の値で右にそれぞれ移動します。
凸でないPOLYGONを抜き出すと不正なジオメトリを返すことがあります。
ISO/IEC 13249-3 SQL/MM 空間標準で規定されているため、このような意味になります。
Availability: 1.1.0 それより前はST_Locate_Between_Measuresでした。
Changed: 2.0.0 以前の版ではST_Locate_Between_Measuresと呼ばれていました。
Enhanced: 3.0.0 - POLYGON, TIN, TRIANGLEへの対応が追加されました。
この関数はM値に対応します。
このメソッドはSQL/MM仕様の実装です。 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値)範囲にある部分ジオメトリとなるジオメトリ (コレクション)を返します。
凸でないPOLYGONを抜き出すと不正なジオメトリを返すことがあります。
Availability: 1.4.0
Enhanced: 3.0.0 - POLYGON, TIN, TRIANGLEへの対応が追加されました。
この関数は3次元に対応し、Z値を削除しません。
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 — ジオメトリのポイントに最も近いポイント上の補間M値を返します。
float8 ST_InterpolatePoint(geometry linear_geom_with_measure, geometry point);
ライン系のM値を持つジオメトリについて、与えられたポイントに最も近い位置におけるM値の補間値を返します。
![]() | |
この関数は、M要素を持つライン系ジオメトリでのみ使います。 |
Availability: 2.0.0
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_InterpolatePoint( 'LINESTRING M (0 0 0,10 0 20)', 'POINT(5 5)');
10
ST_3DInterpolatePoint — 3次元で最も近いジオメトリの補間M値を返します。
float8 ST_3DInterpolatePoint(geometry linear_geom_with_measure, geometry point);
ライン系ZMジオメトリの、与えた点から最も近い位置の補間M値を返します。使用投影法の3次元 (XYZ)距離を使います。航空機の航跡のようにZ値の変化が重要となり、 Z値を無視するST_InterpolatePointでは間違った結果が得られるようなジオメトリに対してこの関数を使います。
![]() | |
ラインはZ値とM値を持っていなければなりません。ポイントはZ値をもっていなければなりません。 |
Availability: 3.7.0
この関数は3次元に対応し、Z値を削除しません。
この例ではZ値が斜めに上がっているラインの3次元の中間点での補間を行っています。
SELECT ST_3DInterpolatePoint( 'LINESTRING ZM (0 0 0 0,10 0 10 20)', 'POINT Z (5 0 5)');
10
この例ではXとYの幅がゼロの垂直ラインを使います。3次元上では動作し、2次元に投影すると動作しません。
SELECT ST_3DInterpolatePoint( 'LINESTRING ZM (0 0 0 0,0 0 10 100)', 'POINT Z (5 5 5)');
50
ST_AddMeasure — ラインに沿ったM値を補間します。
geometry ST_AddMeasure(geometry geom_mline, float8 measure_start, float8 measure_end);
開始点と終了点の間で線形補間したM値を持つ派生ジオメトリを返します。ジオメトリがM値を持たない場合にはM値が追加されます。ジオメトリがM値を持つ場合には新値に置き換えられます。LINESTRINGとMULTILINESTRINGだけに対応しています。
Availability: 1.5.0
この関数は3次元に対応し、Z値を削除しません。
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値が座標ごとに増加していく線形ジオメトリです。時空間データはM値を相対時間 (エポック等)としてモデル化できます。
ST_IsValidTrajectory — ジオメトリが妥当なトラジェクトリであるかどうかをテストします。
boolean ST_IsValidTrajectory(geometry line);
ジオメトリが妥当なトラジェクトリの符号化したものとなっているかをテストします。妥当なトラジェクトリは、M値 (Measure)を持つLINESTRINGで表現されます。M値は始点から順次増加していかなければなりません。
ST_ClosestPointOfApproach等の時空間関数は、妥当なトラジェクトリを入力値として期待します。
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
この例では妥当なトラジェクトリーを構築します。
SELECT ST_IsValidTrajectory(ST_MakeLine(ST_MakePointM(0, 0, 1), ST_MakePointM(0, 1, 2)));
t
この例では不正なトラジェクトリーを構築します。
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);
与えられたトラジェクトリに沿って補間された最小距離となる点のM値の最小値を返します。
妥当なトラジェクトリはST_IsValidTrajectoryで確認できます。トラジェクトリのM値の範囲が重ならない場合にはNULLが返ります。
計算されたM値で実際のポイントを得るにはST_LocateAlongを使います。
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
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_DistanceCPA — 二つのトラジェクトリの最接近する時の距離を返します。
float8 ST_DistanceCPA(geometry track1, geometry track2);
二つのトラジェクトリの最接近する時の (2次元)距離を返します。
妥当なトラジェクトリはST_IsValidTrajectoryで確認できます。トラジェクトリのM値の範囲が重ならない場合にはNULLが返ります。
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
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_CPAWithin — 二つのトラジェクトリの最接近時の距離が指定距離内であるかどうかをテストします。
boolean ST_CPAWithin(geometry track1, geometry track2, float8 dist);
二つの移動オブジェクトが指定距離より近づいているかどうかをテストします。
入力はST_IsValidTrajectoryで確認された妥当なトラジェクトリでなければなりません。トラジェクトリのM値の範囲が重ならない場合にはFALSEを返します。
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
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
これらの関数はPostGISのバージョンを報告したりアップグレードします。
PostGIS_Extensions_Upgrade — PostGISエクステンション (例: postgis_raster, postgis_topology, postgis_sfcgal)について、指定したバージョンまたは最新版にパッケージ化し、アップグレードします。
text PostGIS_Extensions_Upgrade(text target_version=null);
指定されたバージョンまたは最新バージョンへのPostGISエクステンションのパッケージ化とアップグレードを行います。そのデータベースにインストールしたエクステンションだけが必要に応じてパッケージ化とアップグレードとを実行されます。完全なPostGISバージョンを報告し、その後、ビルドコンフィギュレーション情報を報告します。PostGISエクステンションごとに行う複数のCREATE EXTENSION .. FROM unpackagedおよびALTER EXTENSION .. UPDATEの短縮形です。現在は、postgis, postgis_raster, postgis_sfcgal, postgis_topologyの四つのエクステンションのアップグレードのみを試みます。
Availability: 2.5.0
Changed: 3.4.0 target_version引数が追加されました。
Changed: 3.3.0 どのPostGISのバージョンからでもアップグレードできるようになりました。ただし全てのシステムで動作するわけではありません。
Changed: 3.0.0 緩いエクステンションを再パッケージし、また、postgis_rasterに対応しました。
SELECT PostGIS_Extensions_Upgrade();
NOTICE: Packaging extension postgis NOTICE: Packaging extension postgis_raster NOTICE: Packaging extension postgis_sfcgal NOTICE: Extension postgis_topology is not available or not packagable for some reason
PostGIS_Full_Version — 完全なPostGISのバージョン情報とコンフィギュレーション情報を報告します。
text PostGIS_Full_Version();
完全なPostGISのバージョン情報とコンフィギュレーション情報を報告します。ライブラリとスクリプトとの間の同期について情報を提供して、必要に応じてアップグレードの提案に関する情報を提供します。
Enhanced: 3.4.0 現在、外部PROJ設定のNETWORK_ENABLED、URL_ENDPOINT、proj.db位置のDATABASE_PATHがあります
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 — GEOSライブラリのバージョン番号を返します。
text PostGIS_GEOS_Version();
GEOSライブラリのバージョン番号を返します。GEOS対応が有効でない場合はNULLを返します。
SELECT PostGIS_GEOS_Version();
3.12.0dev-CAPI-1.18.0
PostGIS_GEOS_Compiled_Version — PostGISのビルドに使われたGEOSライブラリのバージョン番号を返します。
text PostGIS_GEOS_Compiled_Version();
GEOSライブラリのバージョン番号、またはPostGISのビルドに使ったバージョン番号を返します。
Availability: 3.4.0
SELECT PostGIS_GEOS_Compiled_Version();
3.12.0
PostGIS_Liblwgeom_Version — liblwgeomライブラリのバージョン番号を返します。PostGISのバージョンと同じになるべきものです。
text PostGIS_Liblwgeom_Version();
liblwgeomライブラリのバージョン番号を返します。
SELECT PostGIS_Liblwgeom_Version();
3.4.0dev 3.3.0rc2-993-g61bdf43a7
PostGIS_LibXML_Version — LibXML2ライブラリのバージョン番号を返します。
text PostGIS_LibXML_Version();
LibXML2ライブラリのバージョン番号を返します。
Availability: 1.5
SELECT PostGIS_LibXML_Version();
2.9.10
PostGIS_LibJSON_Version — libjson-cライブラリのバージョン番号を返します。
text PostGIS_LibJSON_Version();
LibJSON-Cライブラリのバージョン番号を返します。
SELECT PostGIS_LibJSON_Version();
0.17
PostGIS_Lib_Build_Date — PostGISライブラリのビルド日付を返します。
text PostGIS_Lib_Build_Date();
PostGISライブラリのビルド日付を返します。
SELECT PostGIS_Lib_Build_Date();
2023-06-22 03:56:11
PostGIS_Lib_Version — PostGISのバージョン番号を返します。
text PostGIS_Lib_Version();
PostGISのバージョン番号を返します。
SELECT PostGIS_Lib_Version();
3.4.0dev
PostGIS_PROJ_Version — PROJ4のバージョン番号を返します。
text PostGIS_PROJ_Version();
PROJライブラリのバージョン番号とProjの設定オプションを返します。
Enhanced: 3.4.0 現在、NETWORK_ENABLED、URL_ENDPOINT、proj.db位置のDATABASE_PATHがあります
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 — PostGISのビルドに使われたPROJライブラリのバージョン番号を返します。
text PostGIS_PROJ_Compiled_Version();
PROJライブラリのバージョンを返しますが、PostGISのビルドに使われたもののバージョン番号です。
Availability: 3.5.0
SELECT PostGIS_PROJ_Compiled_Version();
9.1.1
PostGIS_Wagyu_Version — 内部のWagyuライブラリのバージョン番号を返します。
text PostGIS_Wagyu_Version();
内部のWagyuライブラリのバージョン番号を返します。Wagyu対応が有効でない場合にはNULLを返します。
SELECT PostGIS_Wagyu_Version();
0.5.0 (Internal)
PostGIS_Scripts_Build_Date — PostGISスクリプトのビルド日付を返します。
text PostGIS_Scripts_Build_Date();
PostGISスクリプトのビルド日付を返します。
Availability: 1.0.0RC1
SELECT PostGIS_Scripts_Build_Date();
2023-06-22 03:56:11
PostGIS_Scripts_Installed — このデータベースにインストールしたPostGISスクリプトのバージョンを返します。
text PostGIS_Scripts_Installed();
このデータベースにインストールしたPostGISスクリプトのバージョンを返します。
![]() | |
この関数の出力とPostGIS_Scripts_Releasedとが合わない場合、既存のデータベースの確実なアップグレードに失敗しているかも知れません。詳細情報についてはUpgradingをご覧ください。 |
Availability: 0.9.0
SELECT PostGIS_Scripts_Installed();
3.4.0dev 3.3.0rc2-993-g61bdf43a7
PostGIS_Scripts_Released — インストールしたPostGISライブラリとともにリリースされたpostgis.sqlスクリプトのバージョン番号を返します。
text PostGIS_Scripts_Released();
インストールしたPostGISライブラリとともにリリースされたpostgis.sqlスクリプトのバージョン番号を返します。
![]() | |
1.1.0からこの関数はPostGIS_Lib_Versionと同じ値を返すようになりました。後方互換のためです。 |
Availability: 0.9.0
SELECT PostGIS_Scripts_Released();
3.4.0dev 3.3.0rc2-993-g61bdf43a7
PostGIS_Version — PostGISバージョン番号とコンパイルオプションを返します。
text PostGIS_Version();
PostGISバージョン番号とコンパイルオプションを返します。
SELECT PostGIS_Version();
3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
本節では、PostGIS GUC (Grand Unified Custom)変数の一覧を上げます。これらは、グローバル、データベースごと、セッションごと、またはトランザクションごとに設定できます。グローバルまたはデータベースごとの設定が最善です。
その他の使用例については SQL SETとSQL ALTER SYSTEMを参照して下さい
postgis.gdal_datapath — GDALのGDAL_DATAオプションの値を設定するためのコンフィギュレーションオプションです。設定しない場合には、GDAL_DATA環境変数が使われます。
GDALのGDAL_DATAオプションの値の設定に使うPostgreSQL GUC変数です。postgis.gdal_datapath値は完全にGDALのデータファイルへの物理的なパスになるべきものです。
コンフィギュレーションオプションは、GDALのデータファイルパスがハードコーディングされていないWindowsプラットフォームのためにほとんど使われます。このオプションは、GDALのデータファイルがGDALの期待されているパスに無いときに設定します。
![]() | |
このオプションは、PostgreSQLのコンフィギュレーションファイルpostgresql.confで設定できます。コネクションまたはトランザクションでも設定できます。 |
Availability: 2.2.0
![]() | |
GDAL_DATAに関する追加情報報は、GDALの Configuration Options.にあります。 |
postgis.gdal_datapathの設定とリセット。
SET postgis.gdal_datapath TO '/usr/local/share/gdal.hidden';
SET postgis.gdal_datapath TO default;
Windows上における特定のデータベース上で設定する場合は次の通りです。
ALTER DATABASE gisdb SET postgis.gdal_datapath = 'C:/Program Files/PostgreSQL/9.3/gdal-data';
postgis.gdal_enabled_drivers — PostGIS環境でGDALドライバーを有効にするコンフィギュレーションオプションです。GDALコンフィギュレーション変数GDAL_SKIPに影響を与えます。
PostGIS環境でGDALドライバーを有効にするコンフィギュレーションオプションです。GDALコンフィギュレーション変数GDAL_SKIPに影響を与えます。このオプションは、PostgreSQLのコンフィギュレーションファイルpostgresql.confで設定できます。コネクションまたはトランザクションでも設定できます。
postgis.gdal_enabled_driversの初期値は、PostgreSQL開始プロセスに渡される、有効とするドライバーの一覧からなる環境変数POSTGIS_GDAL_ENABLED_DRIVERSによって設定されます。
有効にするGDALドライバーは、ドライバーの短縮名またはコードで指定します。ドライバーの短縮名またはコードはGDAL Raster Formatsにあります。複数のドライバーを指定するには、ドライバーの間に一つの空白を置きます。
![]() | |
|
![]() | |
標準的なPostGISのインストールでは、 |
![]() | |
GDAL_SKIPに関する追加情報は、GDALのConfiguration Optionsにあります。 |
Availability: 2.2.0
現在のセッションでのpostgis.gdal_enabled_driversの設定と解除を行います。
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL';
SET postgis.gdal_enabled_drivers = default;
データベースへの新しい接続全てに特定のドライバーを設定します。
ALTER DATABASE mygisdb SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG';
データベースクラスター全体のデフォルトを全ドライバ利用可能に設定します。この操作にはスーパーユーザー権限が必要です。また、データベース設定、セッション設定、ユーザー設定の方がここで設定したものよりも優先されることに注意して下さい。
この例では設定をpostgres.auto.confに書き込みます。
ALTER SYSTEM SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
PostgreSQL設定を再読み込みして設定変更を適用します。
SELECT pg_reload_conf();
postgis.enable_outdb_rasters — データベース外ラスタのバンドにアクセスできるようにする、真偽型のコンフィギュレーションオプション。
データベース外ラスタのバンドにアクセスできるようにする、真偽型のコンフィギュレーションオプションです。このオプションは、PostgreSQLのコンフィギュレーションファイルpostgresql.confで設定できます。コネクションまたはトランザクションでも設定できます。
postgis.enable_outdb_rastersの初期値は、環境変数POSTGIS_ENABLE_OUTDB_RASTERSが0でない値で、PostgreSQL開始プロセスに渡されることでで設定されます。
![]() | |
|
![]() | |
標準的なPostGISのインストールでは、 |
Availability: 2.2.0
現在のセッションのpostgis.enable_outdb_rastersを設定したりリセットしたりします。
SET postgis.enable_outdb_rasters TO True;
SET postgis.enable_outdb_rasters = default;
SET postgis.enable_outdb_rasters = True;
SET postgis.enable_outdb_rasters = False;
特定のデータベースへの新規接続全てのデフォルトを設定します。
ALTER DATABASE gisdb SET postgis.enable_outdb_rasters = true;
データベースクラスター全体のデフォルトを設定します。この操作にはスーパーユーザー権限が必要です。また、データベース設定、セッション設定、ユーザー設定の方がここで設定したものよりも優先されることに注意して下さい。
この例では設定をpostgres.auto.confに書き込みます。
ALTER SYSTEM SET postgis.enable_outdb_rasters = true;
PostgreSQL設定を再読み込みして設定変更を適用します。
SELECT pg_reload_conf();
postgis.gdal_vsi_options — データベース外ラスタを操作する時に使用するオプションを設定するためのコンフィギュレーション。
データベース外ラスタを操作する時に使用するオプションを設定するためのコンフィギュレーション。Configuration optionsによって、どれだけGDALがローカルデータキャッシュを確保するか、オーバビューを読むかどうか、リモートのデータベース外データソースを使う際のアクセスキー等を制御します。
Availability: 3.2.0
現在のセッションでのpostgis.gdal_vsi_optionsの設定:
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy';
LOCALキーワードを使う現在のトランザクションのためのpostgis.gdal_vsi_optionsの設定:
SET LOCAL postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyy';
postgis.gdal_cpl_debug — GDALデバッグメッセージのログを取るか取らないかを設定する真偽値。
デフォルトでは、ログは標準エラー出力に印字され、低レベルのデバッグメッセージは一切出力されません。このGUCをTRUEに変更すると、GDALログがPostgreSQLログストリームに出力され、PostgreSQL GUCのclient_min_messageを変更することでメッセージ量を多くも少なくもできます。
Availability: 3.6.0
これらの関数はトラブルシューティングとジオメトリデータの修復を行うためのものです。ジオメトリデータが、通常の環境では発生しえない出来事によって破損している場合のみ有効です。
PostGIS_AddBBox — ジオメトリにバウンディングボックスを追加します。
geometry PostGIS_AddBBox(geometry geomA);
ジオメトリにバウンディングボックスを追加します。これにより、バウンディングボックスに基づく検索が早くなりますが、ジオメトリのサイズが大きくなります。
![]() | |
バウンディングボックスは自動的にジオメトリに追加されるので、通常はこの関数は不要ですが、生成されたバウンディングボックスが何らかの理由で破損するか、バウンディングボックスを欠く古い版をインストールしている場合に使われます。古いものを削除し、再追加する必要があります。 |
このメソッドは曲線ストリングと曲線に対応しています。
UPDATE sometable SET geom = PostGIS_AddBBox(geom) WHERE PostGIS_HasBBox(geom) = false;
PostGIS_DropBBox — ジオメトリからバウンディングボックスのキャッシュを削除します。
geometry PostGIS_DropBBox(geometry geomA);
ジオメトリからバウンディングボックスのキャッシュを削除します。これによりジオメトリのサイズは小さくなりますが、バウンディングボックスを基にした検索が遅くなります。破損したバウンディングボックスを削除する際にも使われます。ST_Intersectsや他の関係関数がジオメトリを正しくtrueを返すべきジオメトリを無視すると、それが、バウンディングボックスのキャッシュが破損したことを示す合図です。
![]() | |
バウンディングボックスは自動的にジオメトリに追加されるので、通常はこの関数は不要ですが、生成されたバウンディングボックスが何らかの理由で破損するか、バウンディングボックスを欠く古い版をインストールしている場合に使われます。古いものを削除し、再追加する必要があります。この種類の破損は8.3-8.3.6で観察されました。ジオメトリが変更された際に常にキャッシュされたバウンディングボックスが再計算されておらず、ダンプと再読み込みを行わずに新しい版へのアップグレードを行うと、既に破損したバウンディングボックスが訂正されないためです。次に示すように手動で収集してバウンディングボックスを再追加するか、ダンプとリロードを使います。 |
このメソッドは曲線ストリングと曲線に対応しています。
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を返し、他の場合にはFALSEを返します。
boolean PostGIS_HasBBox(geometry geomA);
ジオメトリのバウンディングボックスがキャッシュされている場合にはTRUEを返し、他の場合にはFALSEを返します。PostGIS_AddBBoxとPostGIS_DropBBoxでバウンディングボックスのキャッシュを制御します。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT geom FROM sometable WHERE PostGIS_HasBBox(geom) = false;
SFCGALはCGALのC++ラッパライブラリです。CGALは高度な2次元と3次元の空間関数を提供します。堅牢性のためにジオメトリ座標は正確な有理数表現を持ちます。
このライブラリのインストール手順はSFCGALサイト (http://www.sfcgal.org)にあります。機能を有効にするにはcreate extension postgis_sfcgalとします。
このセクションでは、SFCGALのバージョンとライブラリの依存関係を確認するための関数の一覧を示します。
postgis_sfcgal_version — 使用しているSFCGALのバージョンを返します
text postgis_sfcgal_version(void);
使用しているSFCGALのバージョンを返します
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
postgis_sfcgal_full_version — CGALとBoostのバージョンを含む、使用しているSFCGALの完全なバージョンを返します
text postgis_sfcgal_full_version(void);
CGALとBoostのバージョンを含む、使用しているSFCGALの完全なバージョンを返します
Availability: 3.3.0
このメソッドにはSFCGALバックエンドが必要です。
これらの関数はジオメトリのプロパティに対するアクセスと設定を行います。これらの関数が主に対応するジオメトリは、TIN と多面体サーフェスです。
CG_ForceLHR — LHR (Left Hand Rule)方向に強制します。
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.
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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.
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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.
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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.
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
CG_Orientation — サーフェスの方向を判定します。
integer CG_Orientation(geometry geom);
この関数はポリゴンのみ受け付けます。ポリゴンが反時計回りなら-1を返し、時計回りなら1を返します。
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
CG_Area — ジオメトリの面積を計算します
double precision CG_Area( geometry geom );
ジオメトリの面積を計算します。
SFCGALモジュールによって実行されます
![]() | |
ご注意: この関数は、面積を表現する倍精度浮動小数点数を返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
SELECT CG_Area('Polygon ((0 0,0 5,5 5,5 0,0 0),(1 1,2 1,2 2,1 2,1 1),(3 3,4 3,4 4,3 4,3 3))');23
CG_3DArea — 3次元の面ジオメトリの面積を計算します。立体の場合は0を返します。
floatCG_3DArea(geometry geom1);
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 8.1, 10.5
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
ご注意: デフォルトでは、WKTから生成されたPolyhedralSurfaceは面ジオメトリで、立体ではありません。サーフェス面を持ちます。立体に変換すると、面を持ちません。
SELECT CG_3DArea(geom) As cube_surface_area, CG_3DArea(CG_MakeSolid(geom)) As solid_surface_area FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)) )'::geometry) As f(geom);
cube_surface_area │ solid_surface_area ──────────────────┼──────────────────── 6 │ 0
CG_Volume — 3次元ジオメトリーの体積を計算します。閉じたサーフェスはゼロでない体積となります。
float CG_Volume(geometry geom1);
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 9.1 (CG_3DVolumeと同じ)
Closed surface geometries can have non-zero volume. Use CG_MakeSolid when the geometry value itself must carry the solid flag.
閉じた多面体サーフェスは体積を持ちます。CG_MakeSolidで明示的に立体にできます。
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モジュールによって実行されます
![]() | |
ご注意: この関数はインタセクトした部分を表現するジオメトリを返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
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モジュールによって実行されます
![]() | |
ご注意: これは論理値を返して整数を返さないのが「許される」版です。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は三角形と不規則三角網 (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 — 二つの3次元ジオメトリがインタセクトするかどうかをテストします
boolean CG_3DIntersects( geometry geomA , geometry geomB );
二つの3次元ジオメトリがインタセクトするかどうかをテストします。3次元空間で共通する点が存在するなら、3次元ジオメトリはインタセクトしています。
SFCGALモジュールによって実行されます
![]() | |
ご注意: これは論理値を返して整数を返さないのが「許される」版です。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT CG_3DIntersects('POINT(1.2 0.1 0)', 'POLYHEDRALSURFACE(((0 0 0,0.5 0.5 0,1 0 0,1 1 0,0 1 0,0 0 0)),((1 0 0,2 0 0,2 1 0,1 1 0,1 0 0),(1.2 0.2 0,1.2 0.8 0,1.8 0.8 0,1.8 0.2 0,1.2 0.2 0)))');t
CG_Difference — 二つのジオメトリの幾何学的な差を計算します
geometry CG_Difference( geometry geomA , geometry geomB );
二つのジオメトリの幾何学的な差を計算します。返されるジオメトリは、geomAに存在するがgeomBに存在しない点の集合です。
SFCGALモジュールによって実行されます
![]() | |
ご注意: この関数はジオメトリを返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は三角形と不規則三角網 (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 — 3次元の差分を計算します。
geometry CG_3DDifference(geometry geom1, geometry geom2);
geom2に含まれないgeom1の一部を返します。
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 5.1
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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モジュールによって実行されます
![]() | |
ご注意: この関数は、距離を表現する倍精度浮動小数点数を返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT CG_Distance('LINESTRING(0.0 0.0,-1.0 -1.0)', 'LINESTRING(3.0 4.0,4.0 5.0)');5
CG_3DDistance — 二つのジオメトリの最小3次元距離を返します
double precision CG_3DDistance( geometry geomA , geometry geomB );
二つのジオメトリの最小3次元距離を返します。
SFCGALモジュールによって実行されます
![]() | |
ご注意: この関数は、3次元距離を表現する倍精度浮動小数点数を返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT CG_3DDistance('LINESTRING(-1.0 0.0 2.0,1.0 0.0 3.0)', 'TRIANGLE((-4.0 0.0 1.0,4.0 0.0 1.0,0.0 4.0 1.0,-4.0 0.0 1.0))');1
CG_3DConvexHull — ジオメトリの3次元の凸包を計算します。
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.
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 — 3次元のインタセクトした (共有する)部分を計算します。
geometry CG_3DIntersection(geometry geom1, geometry geom2);
geom1とgeom2の間で共有される部分のジオメトリを返します。
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 5.1
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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モジュールによって実行されます
![]() | |
ご注意: この関数は結合を表現するジオメトリを返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
SELECT CG_Union('POINT(.5 0)', 'LINESTRING(-1 0,1 0)');LINESTRING(-1 0,0.5 0,1 0)
CG_3DUnion — postgis_sfcgalを使用して3次元結合を実行します。
geometry CG_3DUnion(geometry geom1, geometry geom2);
geometry CG_3DUnion(geometry set g1field);
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM IEC 13249-3: 5.1
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
集約関数形式: ジオメトリの行集合を結合した3次元ジオメトリを返します。CG_3DUnion()関数は、PostgreSQL用語で言うところの「集約関数」です。つまり、SUM()やMEAN()と同じ方法で複数のデータ行の操作を行い、他のほとんどの集約関数と同じように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実装に従うと、α値は、アルファシェイプアルゴリズムで、入力ジオメトリのドロネー三角形を侵食するために使われる円の半径の2乗です。詳細情報についてはCGAL Alpha-Shapesをご覧下さい。元のアルファシェイプの定義と違います。元はα値を侵食円の半径と定義しています。 |
計算されたシェイプはallow_holesをTRUEに設定しない限りは穴を持ちません。
この関数はジオメトリの凹包をST_ConcaveHullと似た方法で効率的に計算しますが、CGALや異なるアルゴリズムを使います。
Availability: 3.5.0 - SFCGAL >= 1.4.1 が必要です。
このメソッドにはSFCGALバックエンドが必要です。
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は単調分割を使います。両方の関数は、凸分割の要素数について最適数の4倍を超えないことを保証しますが、実行時の複雑さが異なります。三角形ベースの近似アルゴリズムでは、しばしば、凸要素が少なくなりますが、常にそうなるとは限りません。 |
Availability: 3.5.0 - SFCGAL >= 1.5.0が必要です。
SFCGAL >= 1.5.0 が必要
このメソッドにはSFCGALバックエンドが必要です。
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);
ストレートスケルトンを基に、実際の入力の近似的な中心軸を返します。可能な版(1.2.0以上)でビルドするとSFCGAL独自APIを使います。そうでない場合には、CG_StraightSkeleton (遅い)関数をラッピングした関数となります。
projectedがtrueの場合には、中心軸の自由端点がポリゴン境界に届くよう延長されます (投影中心軸)。SFCGAL 2.3.0以上が必要です。古いバージョンのSFCGALでビルドされている場合には、通知が出され、非投影の結果が返されます。
Availability: 3.5.0
Availability: 3.7.0 - projectedパラメーター。投影された結果を得るには SFCGAL >= 2.3.0 が必要。古いバージョンでは通知が出力され、非投影の結果になります。
![]() | |
この関数はZ値を無視します。この関数を3次元ジオメトリ上で使用したとしても、常に2次元の結果となります。 |
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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))
この例ではポリゴン境界に延長された自由端を持つ投影中心軸を計算します。
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 — 接地部ポリゴンから平らな (箱の)屋根を生成します。
geometry CG_GenerateFlatRoof(geometry geom, float8 height);
2次元接地部ポリゴンから平らな (箱状の)屋根を3次元 PolyhedralSurface Zで生成します。屋根の高さは地平面から heightで指定した値です (デフォルト 3.0)。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
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 — 接地部ポリゴンから寄棟屋根を生成する。
geometry CG_GenerateHippedRoof(geometry geom, float8 height);
2次元接地部ポリゴンから寄棟屋根を3次元 PolyhedralSurface Zで生成します。全側面の傾斜は頂部が合うように上がります。屋根の高さは地平面から heightで指定した値です (デフォルト 3.0)。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
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 — 接地部ポリゴンから切妻屋根を生成します。
geometry CG_GenerateGableRoof(geometry geom, float8 height, float8 slope_angle);
2次元接地部ポリゴンから切妻屋根を3次元 PolyhedralSurface Zで生成します。一方の対辺は棟に対して垂直になっている終端です。もう一方の対辺は棟に平行に上がっていきます。屋根の高さは地平面から heightで指定した値です (デフォルト 3.0)。slope_angleで仰角を度単位で指定します (デフォルト 30.0)。入力ジオメトリーのSRIDは保存されます。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
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 — 水平面に投影したポリゴンから片流れ屋根 (一方に傾斜する屋根)を生成します。
geometry CG_GenerateSkillionRoof(geometry geom, float8 height, float8 slope_angle, integer primary_edge_index);
水平面に投影した2次元ポリゴンから片流れ屋根 (一方に傾斜する屋根)を3次元 PolyhedralSurface Zとして生成します。屋根表面の傾斜は一方向です。heightで屋根の棟の高さを指定します (デフォルトは3.0)。slope_angleで傾斜角を度単位で指定します (デフォルトは30)。primary_edge_indexでポリゴンのどの辺を高い側にするかを指定します (0始まり、デフォルトは0)。
heightとslope_angleの組合せで面が消える (傾斜面が指定高さになる前に対辺に到達する)時、その面は省略されます。このため出力パッチ数がパラメーターに依存することになります。奥行に比べて指定高さが低いと、高く急な斜面より面が多くなります。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
高さ2.0で6面が生成されます (側壁は全てあります)。高さ4.0ではフェイスが5面になります (斜面が指定高さになる前に対辺に到達したので面が一つ消えました)。
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 — 接地部ポリゴンから求める形式の屋根を生成します。
geometry CG_GenerateRoof(geometry geom, text roof_type, float8 height, float8 slope_angle, integer primary_edge_index);
2次元接地ポリゴンから屋根を3次元PolyhedralSurface Zで生成します。roof_typeパラメーターで屋根の形式を選択します。形式は次の通りです (デフォルトは'HIPPED'):
FLAT — 平屋根。
HIPPED — 寄棟造 (全辺から頂点に上がる)。
GABLE — 切妻屋根 (2面が傾斜面で、他2面が垂直面)。
SKILLION — 片流れ屋根。
heightで屋根の高さを指定します (デフォルトは3.0)。slope_angleで傾斜角を度単位で指定します (デフォルトは30.0)。primary_edge_indexでどの辺を片流れ屋根の高い側にするかを指定します (default 0)。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
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 — 不正なPOLYGONまたはMULTIPOLYGONを修復します。
geometry CG_PolygonRepair(geometry geom, text rule);
CGALの2次元ポリゴン修復アルゴリズムを用いて不正なPOLYGONまたはMULTIPOLYGONを修復します。MultiPolygonを返します。
ruleパラメーターで修復戦略を制御します。次の通りです:
EVEN_ODD (デフォルト) — 重なり回数が奇数の領域が保持されます。CGAL 6.0以上で有効です。
NON_ZERO — 回転数が0でない領域が保持されます。CGAL 6.1以上が必要です。
UNION —全ての入力ポリゴンの結合。CGAL 6.1以上が必要です。
INTERSECTION — 全ての入力ポリゴンの共有部。CGAL 6.1以上が必要です。
Availability: 3.7.0 - SFCGAL >= 2.3.0と CGAL >= 6.0が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は多面体サーフェスに対応しています。
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);
入力ジオメトリの周りの制約付きドロネー三角形 (Constrained Delaunay triangulation)を返します。出力はTINです。
このメソッドにはSFCGALバックエンドが必要です。
Availability: 3.0.0
この関数は3次元に対応し、Z値を削除しません。
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.
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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);
ポリゴンジオメトリの最大高での押出しを計算します。
![]() | |
ストレートスケルトンの (歴史上の)最初の使用例は、おそらく、ポリゴンの屋根を与えて、ストレートスケルトンでテントの配置を得るというものだったでしょう。スケルトンの個々のエッジは平面からオフセット距離分引き上げられ、水が、屋根のどこに落ちるか関係なく、常に輪郭のエッジ (屋根の境界線)に落ちるという点で、結果の屋根は「正しい」ものになります。この関数はこのポリゴンの押出し、別名「屋根」を計算します。引数のbody_height が body_height > 0 となる場合には、ポリゴンはCG_Extrude(polygon, 0, 0, body_height)で押し出されるようになります。結果はこれらの多面体サーフェスの結合となります。 |
Availability: 3.5.0 - SFCGAL >= 1.5.0が必要です。
SFCGAL >= 1.5.0 が必要
このメソッドにはSFCGALバックエンドが必要です。
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は単調分割を使います。両方の関数は、凸分割の要素数について最適数の4倍を超えないことを保証しますが、実行時の複雑さが異なります。三角形ベースの近似アルゴリズムでは、しばしば、凸要素が少なくなりますが、常にそうなるとは限りません。 |
Availability: 3.5.0 - SFCGAL >= 1.5.0が必要です。
SFCGAL >= 1.5.0 が必要
このメソッドにはSFCGALバックエンドが必要です。
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);
ポリゴンと、ポイント、ライン、ポリゴンのいずれかとの2次元のミンコフスキー和を計算します。
二つのジオメトリAとBのミンコフスキー和はAとBのあらゆるポイントの和の集合です。ミンコフスキー和は、しばしば動作計画とCADで使われます。より詳細な情報についてWikipedia Minkowski additionをご覧ください。
一つ目の引数は2次元ジオメトリ (ポイント、ラインストリング、ポリゴン)とすることができます。3次元ジオメトリを渡すと、Zを0とした2次元に強制され、この場合は無効と考えられます。二つ目の引数は2次元ポリゴンでなければなりません。
CGAL 2D Minkowskisumを利用して実装しています。
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
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が設定されていない限りは、結果には穴が含まれません。
Availability: 3.5.0 - SFCGAL >= 1.4.1 が必要です。
このメソッドにはSFCGALバックエンドが必要です。
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は、分割要素数について最適な分割を生成します。 |
Availability: 3.5.0 - SFCGAL >= 1.5.0が必要です。
SFCGAL >= 1.5.0 が必要
このメソッドにはSFCGALバックエンドが必要です。
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 — ジオメトリからストレートスケルトンを計算します。
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.
Availability: 3.5.0
任意引数use_distance_as_mを使用するにはSFCGAL >= 1.3.8が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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))
リング同士が1点で接触する妥当な入力ではエラーが発生することに注意してください。
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の代わりにジオメトリコレクションを返す点と2次元ジオメトリだけで機能する点とは除きます。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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モジュールによって実行されます
![]() | |
ご注意: この関数は三角形化した結果を表現するジオメトリを返します。 |
Availability: 3.5.0
このメソッドにはSFCGALバックエンドが必要です。
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.
Availability: 3.5.0 - SFCGAL >= 1.5.0が必要です。
SFCGAL >= 1.5.0 が必要
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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の二つのチェーンに、水平線がどちらかのチェーンに、たかだか1回インタセクトするようになるように分割することができるポリゴンです。このアルゴリズムは、最適なポリゴン数に対して生成されるポリゴン数の限度を保証しません。 |
Availability: 3.5.0 - SFCGAL >= 1.5.0が必要です。
SFCGAL >= 1.5.0 が必要
このメソッドにはSFCGALバックエンドが必要です。
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に指定した場合には、この関数は正しい結果が得られるように入力ポリゴンの向きを自動的に調整します。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です。
このメソッドにはSFCGALバックエンドが必要です。
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 — ジオメトリの周りの3次元バッファを計算します。
geometry CG_3DBuffer(geometry geom, float8 radius, integer segments, integer buffer_type);
入力ジオメトリgeom まわりにradiusで指定した3次元バッファを生成します。バッファは3次元空間に構築され、ジオメトリの周囲の立体表現を生成します。 segmentsパラメータでバッファの曲線の近似に使われる辺の数を決めます。4辺分割が最低値として必要です。buffer_typeで生成バッファのタイプを指定します。0: 円バッファ (デフォルト) 1: 平面バッファ 2: 正方形バッファ
入力ジオメトリはPOINTまたはLINESTRINGでなければなりません。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
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を (0,0)を中心にangleラジアンで回転させます。回転は2次元空間で行います。Z値は変更されません。正の角度では反時計回りに回転させます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
SELECT CG_Rotate('LINESTRING(1 0,0 1)', pi()/2);LINESTRING(6.123233995736766e-17 1,-1 6.123233995736766e-17)
CG_2DRotate — ジオメトリを指定した2次元ポイントを中心に指定した角度で回転させます。
geometry CG_2DRotate(geometry geom, float8 angle, float8 cx, float8 cy);
入力ジオメトリgeomをポイント (cx, cy)を中心にangleラジアンで回転させます。回転は2次元空間で行います。Z値は削除されます。正の角度では反時計回りに回転させます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
SELECT CG_2DRotate('POINT(1 0)', pi()/2, 1, 1);POINT(2 1)
CG_3DRotate — ジオメトリを指定したベクトルを軸に3次元空間で回転させます。
geometry CG_3DRotate(geometry geom, float8 angle, float8 ax, float8 ay, float8 az);
入力ジオメトリgeomを (0,0)と (ax, ay, az) とを結ぶベクトルを軸にangleラジアンで3次元空間で回転させます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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をX軸を軸にangleラジアンで回転させます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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をY軸を軸にangleラジアンで回転させます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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をZ軸を軸にangleラジアンで回転させます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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を全ての次元 (X,Y,Z)で与えられた係数factorで均一に拡大縮小します。拡大縮小は (0,0,0)を基準に実行します。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
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)を基準に実行します。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
SELECT CG_3DScale('POINT(1 1 1)', 2, 3, 4);POINT Z (2 3 4)
CG_3DScaleAroundCenter — ジオメトリを3次元空間で指定した点を中心として拡大縮小します。
geometry CG_3DScaleAroundCenter(geometry geom, float8 factorX, float8 factorY, float8 factorZ, float8 centerX, float8 centerY, float8 centerZ);
入力ジオメトリgeomをX,Y,Z軸に沿って個別の係数で、点 (centerX, centerY, centerZ)を中心に拡大縮小します。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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 — ジオメトリを与えたオフセットで2次元で移動させます。
geometry CG_Translate(geometry geom, float8 deltaX, float8 deltaY);
入力ジオメトリgeomを、 X値にdeltaXを、Y値にdeltaYを、それぞれ足します。Z値は削除されます。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
SELECT CG_Translate('LINESTRING(1 1,2 2)', 1, -1);LINESTRING(2 0,3 1)
CG_3DTranslate — ジオメトリを与えたオフセットで3元で移動させます。
geometry CG_3DTranslate(geometry geom, float8 deltaX, float8 deltaY, float8 deltaZ);
入力ジオメトリgeomを、 X値にdeltaXを、Y値にdeltaYを、Z値にdeltaZを、それぞれ足します。
Availability: 3.6.0 - SFCGAL >= 2.0.0が必要です
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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値の保存もします。
アルゴリズムは制約付き三角分割を基にしていて、Z値とM値の保存のための追加操作を持つCGAL Polyline Simplification 2ライブラリを使っています。トポロジが保存され、ジオメトリどうしがインタセクトしているとき、Z値とM値はインタセクトしているポイントで補間されます。
この関数は3次元地形のようなジオメトリ (2.5次元)で動作しますが、壁のような垂直なサーフェス向けには作られていません。
Availability: 3.6.0 - SFCGAL >= 2.1.0が必要
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
geom入力ジオメトリ
threshold単純化に関する最大距離のしきい値 (ジオメトリの単位)。この値が大きいほど結果ジオメトリが単純になります。
preserveTopologyTRUEに設定すると、この関数はジオメトリのトポロジを確実に保存します。このモードでジオメトリがインタセクとするとき、インタセクとするポイントにおけるZ値とM値は補完値になります。デフォルト値はFALSEです。
Z値とM値を保存した単純化されたジオメトリが返ります。
この例ではポリゴンをしきい値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 — 厳密にジオメトリを囲む3次元アルファラッピングを計算します。
geometry CG_3DAlphaWrapping(geometry geom, integer relative_alpha, integer relative_offset);
ジオメトリのポイントから3Dアルファラッピングを計算します。アルファラッピングは、入力を厳密に囲む水漏れのない方向つきサーフェスメッシュです。アルファシェイプの拡張または改良とみることができます。
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.
Availability: 3.6.0 - SFCGAL >= 2.1.0が必要
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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 — 全ての与えられたデータのポイントを通る補間NURBS曲線を生成します。
geometry CG_NurbsCurveInterpolate(geometry data_points, integer degree);
与えられたデータのポイント全てを通るNURBS曲線を生成します。得られる曲線は確実に入力ジオメトリーの各ポイントを通ります。
パラメーター:
data_points - 補間用ポイントを持つLINESTRINGジオメトリー。
degree - NURBS曲線の次数 (通常は 2 か 3)。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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 — データポイントに許容値範囲内で近似するNURBS曲線を生成します。
geometry CG_NurbsCurveApproximate(geometry data_points, integer degree, float8 tolerance, integer max_control_points=100);
与えたデータポイントを指定した許容値内に収まるようにNURBS曲線を生成します。補間と違い、この曲線は必ずしも全てのポイントを通りませんが、少ない制御点で滑らかに近似します。
パラメーター:
data_points - 近似用ポイントを持つLINESTRINGジオメトリー。
degree - NURBS曲線の次数。
tolerance - 曲線とデータポイントとの最大許容距離。
max_control_points - 任意パラメーター。制御点の最大数 (デフォルト: 100)。曲線の複雑さを制限します。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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 — 与えたパラメーターのNURBS曲線の導関数 (正接、曲率)を計算します。
geometry CG_NurbsCurveDerivative(geometry nurbscurve, float8 parameter, integer derivative_order);
指定したパラメーター値のNURBS曲線の導関数を計算します。導関数は指定したポイントの変化率を表現します:
1階: 正接ベクトル (方向と速度)
2階: 曲率ベクトル (正接の変更)
3階: 3階の導関数 (対応する最大階数)
パラメーター:
nurbscurve - NURBS曲線ジオメトリー。
parameter - 評価用パラメーター値 (通常は0.0から1.0)。
derivative_order - 導関数計算の階数(1、2、3).
指定したパラメーターにおける導関数ベクトルを表現するPOINTジオメトリーを返します。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
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
このメソッドにはSFCGALバックエンドが必要です。
ST_3DDifference — Deprecated alias for CG_3DDifference.
geometry ST_3DDifference(geometry geom1, geometry geom2);
![]() | |
|
Availability: 2.2.0
このメソッドにはSFCGALバックエンドが必要です。
ST_3DUnion — Deprecated alias for CG_3DUnion.
geometry ST_3DUnion(geometry geom1, geometry geom2);
geometry ST_3DUnion(geometry set g1field);
![]() | |
|
Availability: 2.2.0
このメソッドにはSFCGALバックエンドが必要です。
ST_Tesselate — Deprecated alias for CG_Tesselate.
geometry ST_Tesselate(geometry geom);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_3DArea — Deprecated alias for CG_3DArea.
floatST_3DArea(geometry geom1);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_Extrude — Deprecated alias for CG_Extrude.
geometry ST_Extrude(geometry geom, float x, float y, float z);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_ForceLHR — Deprecated alias for CG_ForceLHR.
geometry ST_ForceLHR(geometry geom);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_Orientation — Deprecated alias for CG_Orientation.
integer ST_Orientation(geometry geom);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_MinkowskiSum — Deprecated alias for CG_MinkowskiSum.
geometry ST_MinkowskiSum(geometry geom1, geometry geom2);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_StraightSkeleton — Deprecated alias for CG_StraightSkeleton.
geometry ST_StraightSkeleton(geometry geom);
![]() | |
|
Availability: 2.1.0
このメソッドにはSFCGALバックエンドが必要です。
ST_ApproximateMedialAxis — Deprecated alias for CG_ApproximateMedialAxis.
geometry ST_ApproximateMedialAxis(geometry geom);
![]() | |
|
Availability: 2.2.0
このメソッドにはSFCGALバックエンドが必要です。
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.
このメソッドにはSFCGALバックエンドが必要です。
ST_Volume — Deprecated alias for CG_Volume.
float ST_Volume(geometry geom1);
![]() | |
|
Availability: 2.2.0
このメソッドにはSFCGALバックエンドが必要です。
ST_MakeSolid — Deprecated alias for CG_MakeSolid.
geometry ST_MakeSolid(geometry geom1);
![]() | |
|
Availability: 2.2.0
このメソッドにはSFCGALバックエンドが必要です。
ST_IsSolid — Deprecated alias for CG_IsSolid.
boolean ST_IsSolid(geometry geom1);
![]() | |
|
Availability: 2.2.0
このメソッドにはSFCGALバックエンドが必要です。
ST_ConstrainedDelaunayTriangles — Deprecated alias for CG_ConstrainedDelaunayTriangles.
geometry ST_ConstrainedDelaunayTriangles(geometry g1);
![]() | |
|
Availability: 3.0.0
このメソッドにはSFCGALバックエンドが必要です。
ST_3DConvexHull — Deprecated alias for CG_3DConvexHull.
geometry ST_3DConvexHull(geometry geom1);
![]() | |
|
Availability: 3.3.0
このメソッドにはSFCGALバックエンドが必要です。
ST_AlphaShape — Deprecated alias for CG_AlphaShape.
geometry ST_AlphaShape(geometry geom,
float
alpha
,
boolean
allow_holes = false
);
![]() | |
|
このメソッドにはSFCGALバックエンドが必要です。
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.
このメソッドにはSFCGALバックエンドが必要です。
PostGISトポロジ型と関数は、フェイス、エッジ、ノード等のトロポジオブジェクトを管理するために使います。
PostGIS Day Paris 2011におけるSandro Santilliさんの講演が、PostGISトポロジの概略説明として良いです。Topology with PostGIS 2.0 slide deckにあります。
Vincent Picavetさんはトポロジとは何か、どのように使われるか、および、対応するFOSS4Gツールに関する良い概略説明を PostGIS Topology PGConf EU 2012で出しています。
トポロジーベースのGISデータベースの例にUS Census Topologically Integrated Geographic Encoding and Referencing System (TIGER)データベースがあります。PostGISトポロジーの実験でデータが必要となる場合に使って下さい。
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特有の関数はこのプリフィクスを持ちません。
トポロジー機能はデフォルトでビルドされます。2章PostGISインストールで説明されている通り、ビルド時のコンフィギュアオプション --without-topology を指定することで、無効にできます。
あらゆるトポロジーの中核的なプリミティブはedge_data、 node、faceテーブルに格納されます。これらのテーブルはCreateTopologyで生成されたスキーマ内にあります。edge_dataの各タプルは有向エッジを表現しています。start_nodeからend_nodeへの有向曲線と、その曲線の進行方向左側にあるフェイスの識別番号 (left_face)と右側のもの (right_face)とを併せて記録しています。このため、ジオメトリ線分が2個のフェイスに属するとき、同じ線分が2度 (方向ごとに1度ずつ)出現することがあります。
next_left_edgeカラムとnext_right_edgeカラムはフェイスを辿る方法をエンコードしてこの方向情報を完全にしています。正負符号付整数を格納していて、絶対値は進行方向を向いた時の次のエッジを示し、正負符号で次のエッジが順方向化逆方向かを決定しています。正式には、次の規則があります (エッジを eとします):
abs(next_left_edge)はeの左にあるフェイスを辿る場合に次に到達するエッジの識別番号です。値が正数の場合にはeの終端ノードから次のエッジの格納されている通りの方向に進みます。負数の場合には次のエッジは逆向きに辿ることになるので、共有するフェイスは辿っている者から見たら左側にあります。
abs(next_right_edge)はeの右にあるフェイスを辿る場合に次に到達するエッジの識別番号です。値が正数の場合には次のエッジがeの終端ノードから始まり次のエッジの格納されている通りの方向に進みます。負数の場合には次のエッジは逆向きにたどることになるので、共有するフェイスは辿っている者から見たら左側にあります。負数の場合には次のエッジを逆方向で辿る、すなわちエッジの終端から始めることになり、右側のフェイスが保存されます。
ゼロは対応する側でエッジがぶら下がっていることを示します (たとえば接続するフェイスが 0のユニバーサルフェイスになっている孤立エッジ)。 edgeビューにあるabs_next_left_edgeカラムとabs_next_right_edgeカラムは絶対値にして扱いすくしたものです。
この表現は二重連結辺リストの異種で、多数のトポロジールーチンで利用されます。 GetRingEdgesやValidateTopologyといった関数によるフェイス境界の再構築や矛盾の診断に使われます。したがって評価時に「不正なnext_left_edge」と「不正なnext_right_edge」診断が報告されます。 AddEdgeのようなコンストラクターはnext_*属性を普通の自己参照で初期化します。ST_AddEdgeModFaceとST_RemEdgeModFaceを含む編集ルーチンは、エッジが挿入されるか削除されると同時にリンクを更新します。他の大量処理 (たとえばPolygonize)は意図的にカラムに値を設定しないことがあり、文書ではふるまいに関する注意を明示的に出しています。
本節では、PostGISトポロジでインストールされるPostgreSQLデータ型の一覧を挙げます。独自に関数をデザインする際に特に重要となる、キャストでの挙動を記述していることにご注意ください。
ValidateTopologyが返す型です。getfaceedges_returntype — 順序番号とエッジ番号で構成される複合型。
順序番号とエッジ番号で構成される複合型。これはST_GetFaceEdgesとGetNodeEdgesの返り値の型です。
sequence (整数): トポロジスキーマとSRIDを定義するtopology.topologyテーブルで定義されるトポロジへの参照です。
edge (整数): エッジの識別番号です。
TopoGeometry — トポロジとして定義されたジオメトリを表現する型です。
特定のトポロジレイヤ内のトポロジジオメトリを参照する複合型で、特定のタイプと特定のIDを持ちます。TopoGeometryの要素はtopology_id, layer_id, id integer, type integerの各属性です。
topology_id (整数): トポロジスキーマとSRIDを定義するtopology.topologyテーブルで定義されているトポロジへの参照です。
layer_id (整数): TopoGeometryが属するlayersテーブルにおけるlayer_idです。topology_idとlayer_idとの組み合わせで、topology.layersテーブルを一意に参照できます。
id (整数): それぞれのトポロジでTopoGeometryを一意にするための順序整数で、自動生成されます。
type (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. |
本節では、PostGISトポロジでインストールされるPostgreSQLドメインの一覧を挙げます。ドメインは、オブジェクト型のように扱え、関数やテーブルカラムのオブジェクトを返します。ドメインは存在するチェック制約を持つ既存の型である点で、型とは違います。
TopoElement — 二つの整数の配列で、通常TopoGeometry要素を識別するために使われます。
二つの整数の配列で、単純または階層を持つTopoGeometryの一つのコンポーネントを表現するために使われます。
単純なTopoGeometryの場合は、配列の最初の要素がトポロジのプリミティブの識別を表現し、二つ目の要素がタイプ (1:ノード 2:エッジ, 3:フェイス)を表現します。階層的なTopoGeometryの場合は、一つ目の要素が子のTopoGeometryの識別子を表現し、二つ目の要素はレイヤ識別子を表現します。
![]() | |
階層的なTopoGeometryについては、全ての子のTopoGeometry要素は同じ子レイヤから来ます。子レイヤは、定義されたTopoGeometryのレイヤのtopology.layerレコード内で指定されます。 |
SELECT te[1] AS id, te[2] AS type FROM ( SELECT ARRAY[1, 2]::topology.topoelement AS te ) f;
id | type
----+------
1 | 2
SELECT ARRAY[1, 2]::topology.topoelement;
te
-------
{1,2}
この例では3要素配列を topology.topoelementへのキャストで発生することを示しています。ここでは2要素配列が求められるので次元チェックに失敗します。
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}}次に、等価だけれどもより冗長なものを示します。
SELECT ARRAY[ARRAY[1, 2], ARRAY[4, 3]]::topology.topoelementarray AS tea;
{{1,2},{4,3}}この例ではトポロジーに入っている配列集約関数を使っています。
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カラムの管理のためのトポロジ関数の一覧を挙げます。
schema_nameで指定されたスキーマ内にあるtable_nameで指定されたテーブルからTopoGeometryカラムを削除し、topology.layerテーブルにある登録を解除します。AddTopoGeometryColumn — 既存のテーブルにTopoGeometryカラムを追加し、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オブジェクト生成の前に、トポロジレイヤの生成が必要です。トポロジレイヤは地物テーブルとトポロジとで組織されます。また、タイプと階層の情報を持ちます。レイヤの生成にはAddTopoGeometryColumn()を使います。
この関数は、リクエストされたカラムをテーブルに追加し、topology.layerテーブルに、与えられた全ての情報のレコードを追加します。
[child_layer]を指定しない (またはNULLを指定する)場合、このレイヤは、基本的なTopoGeometry (プリミティブなトポロジ要素で構成)を含みます。指定する場合、このレイヤは階層的なTopoGeometry (child_layerからのTopoGeometryで構成)を持ちます。
レイヤが生成される (これの識別番号は、AddTopoGeometryColumn関数が返します)と、TopoGeometryオブジェクトをこの中に構築する準備ができます。
妥当なfeature_type: POINT, MULTIPOINT, LINE, MULTILINE, POLYGON, MULTIPOLYGON, COLLECTION
Availability: 1.1
この例では、ma_topoの新しいテーブルを生成しています。異なるスキーマでテーブルを作ることができ、この場合、topology_nameとschema_name は異なります。
CREATE SCHEMA ma;
CREATE TABLE ma.parcels(gid serial, parcel_id varchar(20) PRIMARY KEY, address text);
SELECT topology.AddTopoGeometryColumn('ma_topo', 'ma', 'parcels', 'topo', 'POLYGON');CREATE SCHEMA ri;
CREATE TABLE ri.roads(gid serial PRIMARY KEY, road_name text);
SELECT topology.AddTopoGeometryColumn('ri_topo', 'ri', 'roads', 'topo', 'LINE');
RenameTopoGeometryColumn — TopoGeometryカラムの名前を変更します
topology.layer RenameTopoGeometryColumn(regclass layer_table, name feature_column, name new_name);
この関数は存在するTopoGeometryカラムの名前を変更します。この際、メタデータ情報が適切に更新されるようにします。
Availability: 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テーブルから削除対象スキーマ内のテーブルへの参照を削除します。この関数は *十分に注意してご使用下さい*。残しておきたかったデータが破壊される可能性があります。スキーマが存在しない場合、スキーマへの参照に関するエントリの削除だけを行います。
Availability: 1.1
ma_topoスキーマをカスケード削除し、topology.topologyにある参照のうち関係するものを全て削除します。
SELECT topology.DropTopology('ma_topo');RenameTopology — トポロジ名を変更します
varchar RenameTopology(varchar old_name, varchar new_name);
トポロジスキーマの名前を変更し、topology.topologyテーブルに格納されているメタデータを更新します。
Availability: 3.4.0
topo_stageからtopo_prodにトポロジ名を変更します。
SELECT topology.RenameTopology('topo_stage', 'topo_prod');DropTopoGeometryColumn — schema_nameで指定されたスキーマ内にあるtable_nameで指定されたテーブルからTopoGeometryカラムを削除し、topology.layerテーブルにある登録を解除します。
text DropTopoGeometryColumn(varchar schema_name, varchar table_name, varchar column_name);
schema_nameで指定されたスキーマ内にあるtable_nameで指定されたテーブルからTopoGeometryカラムを削除し、topology.layerテーブルにある登録を解除します。削除の概要報告を返します。ご注意: この関数は、参照整合性チェックをすり抜けるために、まずNULL値に上書きしてから削除します。
Availability: 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以上にアップグレードする時、トポジオメトリーカラムの定義が変更されました。このためアップグレード前に作られたトポジオメトリーで間違いが発生します。この関数は影響を受けるテーブルの該当する間違いを1修正します。
The function refuses to process tables with expression or partial indexes; drop or rebuild those indexes manually around the repair.
Availability: 3.6.1
全てのトポロジーカラムの修正
SELECT topology.FixCorruptTopoGeometryColumn(schema_name, table_name, feature_column)
FROM topology.layer;
Populate_Topology_Layer — テーブルからメタデータを読み、topology.layerテーブルに不足しているものを追加します。
setof record Populate_Topology_Layer();
テーブルの制約を読み、topology.layerテーブルに不足しているものを追加します。トポロジデータをスキーマに格納した後に、トポロジカタログで抜けているものを訂正するのに使います。
生成されたもののリストを返します。返されるカラムは schema_name, table_name, feature_columnです。
Availability: 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)弧のクエリーでは、地物が既に登録されているのでレコードが返りません。
SELECT * FROM topology.Populate_Topology_Layer();
(0 rows)
トポロジーのレイヤーのカタログを再構築します。
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);
トポロジ名を取り、トポロジ内のオブジェクトの型に関する概要の全体を提供します。
Availability: 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 — トポロジの問題についての詳細を示すvalidatetopology_returntypeの集合を返します。
setof validatetopology_returntype ValidateTopology(varchar toponame, geometry bbox);
トポロジの問題の詳細説明に関するvalidatetopology_returntypeオブジェクトを返します。任意にbboxパラメータで指定された範囲に確認を制限します。
エラーの一覧を示します。可能性のある、意味することろ、返されるid表現は次の通りです:
| Error | id1 | id2 | 意味 |
|---|---|---|---|
| coincident nodes (訳注: 重複ノード) | 最初のノードの識別子。 | 2番目のノードの識別子。 | 二つのノードは同じジオメトリを持ちます。 |
| edge crosses node (訳注: エッジとノードのクロス) | エッジの識別子。 | ノードの識別子。 | エッジが内部にノードを持っています。ST_Relateを参照して下さい。 |
| invalid edge (訳注: 不正なエッジ) | エッジの識別子。 | エッジジオメトリが不正です。ST_IsValidをご覧下さい。 | |
| edge not simple (訳注: 単純でないエッジ) | エッジの識別子。 | エッジジオメトリが自己交差しています。ST_IsSimpleを参照して下さい。 | |
| edge crosses edge (訳注: エッジとエッジのクロス) | 最初のエッジの識別子。 | 2番目のエッジの識別子。 | 二つのエッジが内部でインタセクトしています。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 (訳注: 孤立ノードがcontaining_faceを持っています) | はっきりしないノードの識別子。 | どのエッジの境界上にもないと報告されるノードが、それを含むフェイスが無いことを示しています。 | |
| isolated node has wrong containing_face (訳注: この孤立ノードを含んでいるフェイスが不正) | 不正確なノードの識別子。 | どのエッジの境界上にもないと報告されるノードが、そのノードを実際に含むフェイスではないフェイスに含まれていることを示しています。GetFaceContainingPointを参照して下さい。 | |
| invalid next_right_edge (訳注: 不正なnext_right_edge) | 不正確なエッジの識別子。 | 符号付き識別子で次の右エッジを示します。 | エッジの右側を進んで遭遇する次のエッジが間違っていることを示しています。 |
| invalid next_left_edge (訳注: 不正なnext_left_edge) | 不正確なエッジの識別子。 | 符号付き識別子で次の左エッジを示します。 | エッジの左側を進んで遭遇する次のエッジが間違っていることを示しています。 |
| mixed face labeling in ring (訳注: リング内のフェイスのラベルの矛盾) | リングを識別する符号付きのエッジ識別子。GetRingEdgesを参照して下さい。 | リング内のエッジが、進む側にあるフェイスが矛盾していることを示しています。これは「サイドロケーションの矛盾」とも言われます。 | |
| non-closed ring (訳注: 閉じていないリング) | リングを識別する符号付きのエッジ識別子。GetRingEdgesを参照して下さい。 | 続くnext_left_edge/next_right_edge属性で形成されるエッジのリングの始点と終点が異なります。 | |
| face has multiple shells (訳注: 複数の外殻を持つフェイス) | 競合するフェイスの識別子。 | リングを識別する符号付きのエッジ識別子。GetRingEdgesを参照して下さい。 | 複数のエッジのリングがその内部で同じフェイスを示しています。 |
Availability: 1.0.0
Enhanced: 2.0.0では、より効果的なエッジ交差検出が可能になり、以前の版で残っていた偽陽性を解決しています。
Changed: 2.2.0 エラーの記述と矛盾しないように'edge crosses node'のid1とid2の値が入れ替わっています。
Changed: 3.2.0 任意パラメータbboxを追加し、フェイスラベルとエッジリンクのチェックを追加しました。
SELECT * FROM topology.ValidateTopology('ma_topo');error | id1 | id2 -------------------+-----+----- face without edges | 1 |
ValidateTopologyRelation — 不正なトポロジ関係の行に関する情報を返します。
setof record ValidateTopologyRelation(varchar toponame);
トポロジの関係テーブルの不正点に関する情報を提供するレコードの集合を返します。
Availability: 3.2.0
ValidateTopologyPrecision — トポロジ内の低精度の頂点を返します。
geometry ValidateTopologyPrecision(name toponame, geometry bbox, float8 gridSize);
トポロジまたは与えられたgridSizeに丸められた頂点のすべてを点ジオメトリで返します。任意で、確認範囲をbboxパラメータで指定される範囲に制限できます。
Availability: 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パラメータで指定した領域とインタセクとするものだけを処理することもできます。
最小エッジ範囲より大きいgridSizeを使うと、エッジが空ジオメトリに縮退するのでなく例外が発生します。これにより、精密なスナップ処理の際にプリミティブを完全に削除しないようにすることで、隣接するトポロジー関係を保護します。
![]() | |
スナップによってトポロジが不正になることがありえるので、処理の結果をValidateTopologyで確認することを推奨します。 |
Availability: 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);
トポロジ識別子またはトポロジ関連オブジェクトの識別しを取り、topology.topologyレコードを返します。
Availability: 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.topologyレコードを返します。
Availability: 3.2.0
SELECT layer_id(FindLayer('features.land_parcels', 'feature'));1
TotalTopologySize — 指定したトポロジが使用するディスク容量の総量を得ます。インデックスやTOASTデータも含みます。
int8 TotalTopologySize(name toponame);
トポロジ名から、そのトポロジのすべてのテーブルのディスク容量の総量を返します。インデックスとTOASTデータも含みます。
Availability: 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 — 指定したトポロジーに対して、トポロジーIDとプリミティブIDが大きな数 (int8)に対応するようアップグレードします。
void UpgradeTopology(name toponame);
トポロジー名を取って、トポロジーIDとプリミティブIDが大きな数 (int8)に対応するようアップグレードします。この関数は次のアップグレードを行います: フェイス (face_idカラムをint4からint8に、face_id_seqをint4からint8に) - ノード (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に設定)
Availability: 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)は、このスキーマ内に生成されます。トポロジのIDを返します。
sridはトポロジーの空間参照系 のSRIDです。SRIDを指定していない場合のデフォルトは-1 (不明)です。
許容値precは空間参照系の単位で計測されます。許容値はデフォルトでは0.0です。
haszを指定しない場合のデフォルトはFALSEです。
topoid 任意パラメータ、明示的な識別子 (トポロジーIDの割当を決定しますが一意である必要があります)
useslargeids 任意パラメータで、デフォルトはFALSEです。TRUEの場合には、このトポロジーのトポロジーIDとプリミティブIDは大きな数のID (int8) に対応します。
これはSQL/MMのST_InitTopoGeoに似ていますが、より高機能です。
Availability: 1.1
Enhanced: 2.0 hasZ対応の追加。
Enhanced: 3.6.0 topoidとusesLargeIDsパラメーターの追加。
ma_topoという名前のトポロジスキーマを生成します。これはマサチューセッツ州メートル平面 (SRID 26986)でエッジとノードを保存することとします。空間参照系の単位がメートルなので、許容値は0.5メートルとなります。
SELECT topology.CreateTopology('ma_topo', 26986, 0.5);ri_topoという名前の、空間参照系をフィート平面 (SRID = 3438)としたロードアイランドのトポロジの生成
SELECT topology.CreateTopology('ri_topo', 3438) AS topoid;2
CopyTopology — トポロジ (ノード、エッジ、フェイス、レイヤとTopoGeometry)の新しいスキーマに複写します。
integer CopyTopology(varchar existing_topology_name, varchar new_name);
new_nameという名前のトポロジを作成しますが、SRIDと精度はexisting_topology_nameから複写します。existing_topology_nameのノード、エッジ、フェイスと、レイヤとそれに関連付けられたTopoGeometryは、新しいトポロジに複写されます。
![]() | |
|
Availability: 2.0.0
ma_topoという名前のトポロジのバックアップを作成します。
SELECT topology.CopyTopology('ma_topo', 'ma_topo_backup');ST_InitTopoGeo — 新しいトポロジスキーマを生成し、topology.topologyテーブルに登録します。
text ST_InitTopoGeo(varchar topology_schema_name);
CreateTopologyのSQL/MM相当の関数です。空間参照系と許容値の任意引数がありません。トポロジIDでなくトポロジ生成の文字列による説明が返されます。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: 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);
空のトポロジにジオメトリのコレクションを追加し、成否を示すメッセージを返します。
空トポロジの追加に使えます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.18
トポロジーを投入します。
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 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);
既存のトポロジにポイントを追加し、その識別番号を返します。指定されたポイントは、許容差の範囲内で既存のノードまたはエッジにスナップします。既存のエッジはスナップされたポイントで分割されることがあります。
Availability: 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をご覧下さい。 |
Availability: 2.0.0
Enhanced: 3.2.0 符号付き識別子を返す機能が追加されました。
Enhanced: 3.7.0 トポロジー内で生成されるエッジ数の制限機能の追加。
TopoGeo_AddPolygon — 許容差を使って既存のトポロジにラインストリングを追加し、可能ならエッジ/フェイスを分割します。エッジ識別番号を返します。
SETOF bigint TopoGeo_AddPolygon(varchar atopology, geometry apoly, float8 tolerance);
既存のトポロジにポリゴンを追加し、これを構成するフェイスの識別番号の集合を返します。指定されたポリゴンの境界線は、許容差の範囲内で既存のノードまたはエッジにスナップします。既存のエッジとフェイスはポリゴンの境界線で分割されることがあります。
![]() | |
この関数を介してロードされたトポロジの統計情報の更新は呼び出し元次第です。maintaining statistics during topology editing and populationをご覧下さい。 |
Availability: 2.0.0
TopoGeo_LoadGeometry — ジオメトリを既存のトポロジにロードし、必要に応じてスナップと分割を実行します。
void TopoGeo_LoadGeometry(varchar atopology, geometry ageom, float8 tolerance);
ジオメトリを既存のトポロジにロードします。与えられたジオメトリは、与えられた許容値の範囲内で、既存のノードまたはエッジにスナップします。既存のエッジとフェイスはロードの結果分割される場合があります。
![]() | |
この関数を介してロードされたトポロジの統計情報の更新は呼び出し元次第です。maintaining statistics during topology editing and populationをご覧下さい。 |
Availability: 3.5.0
本節では、エッジ、フェイス、ノードの追加、移動、削除、分割に関する関数を挙げます。本節の関数はすべてISO SQL/MMで定義されています。
anodeとanothernodeで指定される二つの既存孤立ノードを接続するトポロジに、ジオメトリalinestringで定義される孤立エッジを追加し、新しいエッジの識別番号を返します。apointジオメトリがノードとして存在しているなら、エラーが投げられます。移動に関する説明を返します。ST_AddIsoNode — フェイスに孤立ノードを追加し、新しいノードの識別番号を返します。フェイスがNULLの場合でもノードは生成されます。
bigint ST_AddIsoNode(varchar atopology, bigint aface, geometry apoint);
atopologyで指定されたトポロジのafaceの識別番号で示された既存のフェイスに対して、apointで示された位置に孤立ノードを追加します。
ポイントジオメトリの空間参照系 (SRID)がトポロジと同じでない場合、apointがポイントジオメトリでない場合、ポイントがNULLである場合、または、ポイントが既存のエッジ (境界も含む)とインタセクトする場合には、例外が投げられます。また、ポイントが既にノードとして存在する場合、例外が投げられます。
afaceがNULLでなく、かつapointがフェイス内に無い場合には、例外が投げられます。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X 3.1
ST_AddIsoEdge — anodeとanothernodeで指定される二つの既存孤立ノードを接続するトポロジに、ジオメトリalinestringで定義される孤立エッジを追加し、新しいエッジの識別番号を返します。
bigint ST_AddIsoEdge(varchar atopology, bigint anode, bigint anothernode, geometry alinestring);
anodeとanothernodeで指定される二つの既存孤立ノードを接続するトポロジに、ジオメトリalinestringで定義される孤立エッジを追加し、新しいエッジの識別番号を返します。
alinestringジオメトリとトポロジとで空間参照系 (SRID)が異なる場合、引数がNULLである場合、ノードが一つ以上のフェイスに含まれている場合には、二つのノードが既存エッジの始端または終端である場合には、例外が投げられます。
alinestringがanodeとanothernodeに属するフェイス内に無い場合には、例外が投げられます。
anodeとanothernodeが、alinestringの始端と終端でない場合には、例外が投げられます。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.4
ST_AddEdgeNewFaces — 新しいエッジを追加します。新しいエッジがフェイスを分割する場合には、もとのフェイスを削除して、分割した二つのフェイスに置き換えます。
bigint ST_AddEdgeNewFaces(varchar atopology, bigint anode, bigint anothernode, geometry acurve);
新しいエッジを追加します。新しいエッジがフェイスを分割する場合には、もとのフェイスを削除して、分割した二つのフェイスに置き換えます。新しいエッジの識別番号を返します。
この関数によって、既存の接続されているエッジとリレーションシップが更新されます。
引数がNULLの場合、与えられたノードが不明な場合(トポロジスキーマのnodeテーブル内に既に存在していなければなりません)、acurveがLINESTRINGでない場合、anodeとanothernodeがacurveの始端、終端でない場合には、例外が投げられます。
acurveジオメトリの空間参照系 (SRID) がトポロジと同じでない場合、例外が投げられます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.12
ST_AddEdgeModFace — 新しいエッジを追加します。新しいエッジがフェイスを分割する場合には、もとのフェイスを編集し、一つのフェイスを追加します。
bigint ST_AddEdgeModFace(varchar atopology, bigint anode, bigint anothernode, geometry acurve);
新しいエッジを追加します。新しいエッジがフェイスを分割する場合には、もとのフェイスを編集し、一つのフェイスを追加します。
![]() | |
可能なら、新しいフェイスは新しいエッジの左側に作られます。左側のフェイスがユニバースフェイス (境界がない)でなければならない場合には、可能ではありません。 |
新しく追加されたエッジの識別番号を返します。
この関数によって、既存の接続されているエッジとリレーションシップが更新されます。
引数がNULLの場合、与えられたノードが不明な場合(トポロジスキーマのnodeテーブル内に既に存在していなければなりません)、acurveがLINESTRINGでない場合、anodeとanothernodeがacurveの始端、終端でない場合には、例外が投げられます。
acurveジオメトリの空間参照系 (SRID) がトポロジと同じでない場合、例外が投げられます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.13
ST_RemEdgeNewFace — エッジを削除し、消去対象エッジでフェイスが二つに分割されているなら元の二つのフェイスを削除し、一つの新しいフェイスに置き換えます。
bigint ST_RemEdgeNewFace(varchar atopology, bigint anedge);
エッジを削除し、消去対象エッジでフェイスが二つに分割されているなら元の二つのフェイスを削除し、一つの新しいフェイスに置き換えます。
新しく作成されたフェイスの識別番号を返します。新しいフェイスが生成されない場合にはNULLを返します。削除対象エッジがダングルである (訳注: 「ぶらさがる」状態、すなわち一方の端が孤立ノードでなく、かつもう一方が孤立ノード)場合か、孤立している場合か、 ユニバースフェイスとの境界になっている (おそらく反対側のフェイスにユニバースが侵入します)場合には、フェイスは生成されません。
この関数によって、既存の接続されているエッジとリレーションシップが更新されます。
既存のTopoGeometryの定義に入り込んでいるエッジは削除を拒絶されます。TopoGeometryが二つのフェイスのうちひとつだけで定義されている (かつ他方は定義に使われていない)場合、二つのフェイスの修復は拒絶されます。
引数がNULLである場合、与えられたエッジが不明である場合 (トポロジスキーマのedgeテーブル内に既に存在していなければなりません)、トポロジ名が不正である場合、例外が投げられます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.14
ST_RemEdgeModFace — エッジを削除します。削除されるエッジが二つのフェイスを分割していたなら、一方のフェイスを削除し、もう一方のフェイスを両方の空間を覆うように編集します。
bigint ST_RemEdgeModFace(varchar atopology, bigint anedge);
エッジを削除します。削除されるエッジが二つのフェイスを分割していたなら、一方のフェイスを削除し、もう一方のフェイスを両方の空間を覆うように編集します。右側のフェイスを優先的に保持します。これはST_AddEdgeModFaceと一致します。残ったフェイスのIDを返します。
この関数によって、既存の接続されているエッジとリレーションシップが更新されます。
既存のTopoGeometryの定義に入り込んでいるエッジは削除を拒絶されます。TopoGeometryが二つのフェイスのうちひとつだけで定義されている (かつ他方は定義に使われていない)場合、二つのフェイスの修復は拒絶されます。
引数がNULLである場合、与えられたエッジが不明である場合 (トポロジスキーマのedgeテーブル内に既に存在していなければなりません)、トポロジ名が不正である場合、例外が投げられます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.15
ST_ChangeEdgeGeom — トポロジ構造に影響を与えることなくエッジの形状を変更します。
text ST_ChangeEdgeGeom(varchar atopology, bigint anedge, geometry acurve);
トポロジ構造に影響を与えることなくエッジの形状を変更します。
全ての引数がNULLであるか、与えられたエッジがtopologyスキーマのedgeテーブルにないか、acurveがLINESTRINGでないか、変更で基になるトポロジが変わるか、のいずれかの場合には、エラーが投げられます。
acurveジオメトリの空間参照系 (SRID) がトポロジと同じでない場合、例外が投げられます。
新しいacurveが単純でない場合には、エラーが投げられます。
古い位置から新しい位置へのエッジ移動で障害物にあたった場合はエラーが投げられます。
Availability: 1.1.0
Enhanced: 2.0.0 トポロジ整合性の強制を追加しました。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 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);
既存のエッジに沿って新しいノードを生成してエッジを分割します。もとのエッジは変更され、新しいエッジが一つ追加されます。この関数によって、既存の接続されているエッジとリレーションシップが更新されます。新しく追加されたノードの識別番号が返ります。
Availability: 1.1
Changed: 2.0 - 以前の版では名前を間違えてST_ModEdgesSplitになっていました。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.9
分割するためのエッジを追加します。
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227592 893910,227600 893910)', 26986)) AS edgeid;3
新しいノードでエッジを分割します。
SELECT topology.ST_ModEdgeSplit('ma_topo', 3, ST_SetSRID(ST_Point(227594, 893910), 26986)) AS node_id;7
ST_ModEdgeHeal — 二つのエッジについて、接続しているノードを削除して修復します。1番目のエッジを編集して、2番目のエッジを削除します。削除されたノードの識別番号を返します。
bigint ST_ModEdgeHeal(varchar atopology, bigint anedge, bigint anotheredge);
二つのエッジについて、接続しているノードを削除して修復します。1番目のエッジを編集して、2番目のエッジを削除します。削除されたノードの識別番号を返します。この関数によって、既存の接続されているエッジとリレーションシップが更新されます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.9
ST_NewEdgeHeal — 二つのエッジについて、接続しているノードを削除して修復します。両方のエッジを削除し、1番目のエッジと同じ方向のエッジに置き換えます。
bigint ST_NewEdgeHeal(varchar atopology, bigint anedge, bigint anotheredge);
二つのエッジについて、接続しているノードを削除して修復します。両方のエッジを削除し、1番目のエッジと同じ方向のエッジに置き換えます。 修復されたエッジに置き換えられた新しいエッジの識別番号を返します。 この関数によって、既存の接続されているエッジとリレーションシップが更新されます。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.9
ST_MoveIsoNode — トポロジ内の孤立ノードを別の位置に移動させます。新しいapointジオメトリがノードとして存在しているなら、エラーが投げられます。移動に関する説明を返します。
text ST_MoveIsoNode(varchar atopology, bigint anode, geometry apoint);
トポロジ内の孤立ノードを別の位置に移動させます。新しいapointジオメトリがノードとして存在しているなら、エラーが投げられます。
引数がNULLの場合、apointがポイントでない場合、既存のノードが孤立していない (既存のエッジの始端か終端になっている)場合、新しいノード位置が既存のエッジとインタセクトする場合 (終端であっても)、新しい位置が異なるフェイス内にある場合 (3.2.0以降)のいずれかの場合には、例外が投げられます。
ポイントジオメトリの空間参照系 (SRID)がトポロジと異なる場合には、例外が投げられます。
Availability: 2.0.0
Enhanced: 3.2.0 ノードが異なるフェイスに移動しないことを保証
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.2
フェイスに属さない孤立ノードを追加します。
SELECT topology.ST_AddIsoNode('ma_topo', NULL, ST_GeomFromText('POINT(227579 893916)', 26986)) AS nodeid;7
新しいノードを異動させます。
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がポイントジオメトリでない場合、ポイントがNULLの場合、ポイントが既にノードとして存在する場合、エッジが既存のエッジと一致しない場合、ポイントがエッジ内にない場合、例外が投げられます。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.8
分割するためのエッジを追加します。
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227575 893917,227592 893900)', 26986)) AS edgeid;2
新しいエッジを分割します。
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);
孤立ノードを削除し、実行結果が返されます。ノードが孤立していない (エッジの始端または終端である)場合には、例外が投げられます。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.3
フェイスに属していない孤立ノードを削除します。
SELECT topology.ST_RemoveIsoNode('ma_topo', 7) AS result;Isolated node 7 removed
ST_RemoveIsoEdge — 孤立エッジを削除し、実行結果の記述を返します。エッジが孤立していない場合には、例外が投げられます。
text ST_RemoveIsoEdge(varchar atopology, bigint anedge);
孤立エッジを削除し、実行結果の記述を返します。エッジが孤立していない場合には、例外が投げられます。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.3
フェイスに属さない孤立エッジを削除します。
SELECT topology.ST_RemoveIsoEdge('ma_topo', 7) AS result;Isolated edge 7 removed
afaceの境界となる、整列したエッジの集合を返します。GetEdgeByPoint — 与えられたポイントにインタセクトするエッジの識別番号を探索します。
bigint GetEdgeByPoint(varchar atopology, geometry apoint, float8 tol1);
与えられたポイントにインタセクトするエッジの識別番号を探索します。
この関数は、トポロジ、ポイント、許容差を引数にして、整数 (エッジの識別番号)を返します。許容差が0の場合、ポイントはエッジとインタセクトしていなければなりません。
apointがエッジとインタセクトしない場合には、0を返します。
許容差 > 0 として、ポイント付近のエッジが一つより多い場合には、例外が投げられます。
![]() | |
許容差が0の場合には、ST_Intersectsを使い、それ以外では、ST_DWinthinを使います。 |
GEOSモジュールで実現しています。
Availability: 2.0.0
本例ではAddEdgeで作ったエッジを使います。
SELECT topology.GetEdgeByPoint('ma_topo', geom, 1) As with1mtol, topology.GetEdgeByPoint('ma_topo', geom, 0) As withnotol
FROM ST_GeomFromEWKT('SRID=26986;POINT(227622.6 893843)') As geom;with1mtol | withnotol
-----------+-----------
2 | 0このクエリーは二つ以上のエッジが発見されるのでエラーになります。
SELECT topology.GetEdgeByPoint('ma_topo', geom, 1) As nearnode
FROM ST_GeomFromEWKT('SRID=26986;POINT(227591.9 893900.4)') As geom;ERROR: Two or more edges found
GetFaceByPoint — 与えたポイントとインタセクトするフェイスを見つけます。
bigint GetFaceByPoint(varchar atopology, geometry apoint, float8 tol1);
ポイントと与えた許容値で参照されるフェイスを見つけます。
この関数は、ポイントを中心に持ち半径が許容値となる円とインタセクトするフェイスを効率的に探します。
与えられたクエリ位置とインタセクトするフェイスが無い場合には、0を返します (ユニバーサルフェイス)。
1以上のフェイスがクエリ位置とインタセクトする場合には例外が投げられます。
Availability: 2.0.0
Enhanced: 3.2.0 より効率的な実装とより明確な短縮、不正なトポロジでの動作停止。
SELECT topology.GetFaceByPoint('ma_topo', geom, 10) As with1mtol, topology.GetFaceByPoint('ma_topo', geom, 0) As withnotol
FROM ST_GeomFromEWKT('POINT(234604.6 899382.0)') As geom;with1mtol | withnotol
-----------+-----------
1 | 0このクエリーは二つ以上のフェイスが発見されるのでエラーになります。
SELECT topology.GetFaceByPoint('ma_topo', geom, 1) As nearnode
FROM ST_GeomFromEWKT('POINT(227591.9 893900.4)') As geom;ERROR: Two or more faces found
GetFaceContainingPoint — ポイントを含むフェイスを見つけます。
bigint GetFaceContainingPoint(text atopology, geometry apoint);
ポイントを含むフェイスのIDを返します。
ポイントがフェイスの境界に落ちた場合には例外が投げられます。
![]() | |
この関数は妥当なトポロジが前提であり、エッジリンクとフェイスラベルを使用して動作します。 |
Availability: 3.2.0
GetNodeByPoint — ポイント位置にあるノードの識別番号を探索します。
bigint GetNodeByPoint(varchar atopology, geometry apoint, float8 tol1);
ポイント位置にあるノードの識別番号を探索します。
トポロジ、POINT、許容値が与えられ、整数 (ノード識別番号)が返ります。tolerance = 0 の場合には、確実にインタセクトするノードを取得し、そうでない場合には、指定した間隔の中からノードを取得します。
apointがノードとインタセクトしない場合には、0を返します。
許容差 > 0 として、ポイント付近のノードが一つより多い場合には、例外が投げられます。
![]() | |
許容差が0の場合には、ST_Intersectsを使い、それ以外では、ST_DWinthinを使います。 |
GEOSモジュールで実現しています。
Availability: 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
このクエリーは二つ以上のノードが許容範囲内にあるのでエラーになります。
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テーブル内にあるトポロジの識別番号を返します。
Availability: 1.1
SELECT topology.GetTopologyID('ma_topo') AS topo_id;1
GetTopologySRID — トポロジ名からtopology.topologyテーブル内にあるトポロジのSRIDを返します。
integer GetTopologyID(varchar toponame);
与えられたトポロジ名からtopology.topologyテーブル内のトポロジの空間参照系識別番号を返します。
Availability: 2.0.0
SELECT topology.GetTopologySRID('ma_topo') AS srid;4326
GetTopologyName — 識別番号からトポロジ (スキーマ)の名前を返します。
varchar GetTopologyName(integer topology_id);
識別番号からトポロジ (スキーマ)の名前を返します。
Availability: 1.1
SELECT topology.GetTopologyName(1) AS topo_name;
ma_topo
ST_GetFaceEdges — 順序番号を含む、afaceの境界となる、整列したエッジの集合を返します。
getfaceedges_returntype ST_GetFaceEdges(varchar atopology, bigint aface);
順序番号を含む、afaceの境界となる、整列したエッジの集合を返します。それぞれの出力は、順序番号とエッジ識別番号からなります。順序番号は1から始まります。
各リングエッジの列挙は、識別番号が最も小さいものから始まります。エッジの順序は左手の法則に従います (境界フェイスは各有向辺の左側にあるようにします)。
Availability: 2.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.5
このクエリーは1番フェイスの境界となるエッジ群を返します。
SELECT (topology.ST_GetFaceEdges('tt', 1)).*;sequence | edge
----------+------
1 | -4
2 | 5
3 | 7
4 | -6
5 | 1
6 | 2
7 | 3このクエリーは、1番フェイスの境界となる順序番号、エッジ識別子、エッジのジオメトリーを返します。ジオメトリーと順序番号だけが必要な場合にはST_GetFaceGeometryを使います。
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt', 1) As t(seq, edge)
INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;
ST_GetFaceGeometry — 指定されたトポロジの中の、フェイス識別番号で指定されたポリゴンを返します。
geometry ST_GetFaceGeometry(varchar atopology, bigint aface);
指定されたトポロジの中の、フェイス識別番号で指定されたポリゴンを返します。フェイスを作るエッジからポリゴンを構築します。
Availability: 1.1
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3 トポロジ-ジオメトリ および トポロジ-ネットワーク 3: ルーチン詳細: X.3.16
このクエリーは AddFaceで追加したポリゴンのWKTを返します。
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がNULLでな場合には、返されるレコードを超えることはありません。これは、不正なトポロジを扱うときの安全確保のためのパラメータであることを意味します。
![]() | |
この関数はメタデータとリンクするエッジ環を使います。 |
Availability: 2.0.0
GetNodeEdges — 与えられたノードに付随するエッジの集合を整列して返します。
getfaceedges_returntype GetNodeEdges(varchar atopology, bigint anode);
与えられたノードに付随するエッジの集合を整列して返します。 出力は、連続する、正負符号を持つエッジ識別番号からなります。順序番号は1から始まります。 正のエッジは与えられたノードから始まるものです。 負のエッジは与えられたノードで終わるものです。 閉じたエッジは2回現れます (正と負になります)。 並び順は北側から時計回りになります。
![]() | |
この関数は、並び順を計算していて、メタデータからのデータを使わないので、 連結しているエッジ環を構築するのに使えます。 |
Availability: 2.0
FindVertexSegmentPairsBelowDistance — 許容距離内にあるトポロジーの頂点/辺の組を検索します。
setof record FindVertexSegmentPairsBelowDistance(varchar atopology, float8 tolerance);
個々のタプルが頂点/辺の組合せで、頂点は辺の終端でなく、かつ頂点と辺の間の距離が指定した許容値より小さくなるリレーションを返します。
Availability: 3.7
本節では、非標準の手法でのトポロジ処理の関数を挙げます。
Polygonize — トポロジエッジで定義される全てのフェイスを探索し、追加します。
text Polygonize(varchar toponame);
トポロジエッジプリミティブで構築することができる全てのフェイスを登録します。
対象トポロジは自己インタセクトするエッジが無いと仮定しています。
![]() | |
既に登録されているフェイスは認識されているので、同じトポロジに対してPolygonizeを複数回呼んでも問題ありません。 |
![]() | |
この関数はエッジテーブルのnext_left_edgeとnext_right_edgeフィールドの読み書きを行いません。 |
Availability: 2.0.0
AddNode — 指定したトポロジスキーマのノードテーブルにポイントノードを追加し、新しいノードの識別番号を返します。指定したポイントに既にノードがある場合は既存のノード識別番号を返します。
bigint AddNode(varchar toponame, geometry apoint, boolean allowEdgeSplitting=false, boolean computeContainingFace=false);
指定したトポロジスキーマのノードテーブルにポイントノードを追加します。 AddEdge関数は、呼ばれると自動的にエッジの始端と終端のポイントを追加するので、明示的にエッジのノードを追加する必要はあまりありません。
ノードとクロスするエッジが発見された場合は、例外が発生するか、エッジが分割されます。allowEdgeSplittingパラメータの値に依存します。
computeContainingFaceがtrueの場合には、新しく追加されたノードによって、ノードを含む正しいフェイスが計算されます。
![]() | |
|
Availability: 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スキーマのノードテーブルにノードを追加し、新しいまたは既存のレコードのエッジ識別番号を返します。ラインストリングエッジをエッジテーブルに追加し、指定したトポロジスキーマの始点終点をポイントノードテーブルに追加し、新規または既存のエッジの識別番号を返します。新しく追加されたエッジは両側にユニバースフェイスを持ち、自分自身にリンクしています。
![]() | |
|
![]() | |
|
GEOSモジュールで実現しています。
![]() | |
AddEdge は3.5.0では非推奨です。TopoGeo_AddLineStringを代わりに使います。 |
Availability: 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
このクエリーはエッジが既存のエッジと終端以外の場所でインタセクトするためエラーになります。
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 (デフォルト)なら既存フェイスのフェイスIDを返し、force_new がTRUEなら新しいIDが新規登録されたフェイスに割り当てられます。
![]() | |
既存フェイスの新規登録が実行される時(force_new=true)、そのエッジ内の既存のフェイスへの参照のダングルを解決しません。また、関連テーブルのノードと既存フェイスのレコードのMBR(訳注: 最小境界矩形)フィールドの更新も行いません。これに対応するのは、この関数を呼び出した側です。 |
![]() | |
|
Availability: 2.0.0
まずgenerate_seriesを使って内側リングとしてエッジを追加します。このクエリーは generate_seriesの最大値である10000より小さいポイント数のポリゴンでだけ動作します。
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
その後、フェイスを追加します。
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モジュールで実現しています。
Availability: 2.1.0
ST_Simplify (ジオメトリ), ST_IsSimple, ST_IsValid, ST_ModEdgeSplit
RemoveUnusedPrimitives — 存在するTopoGeometryオブジェクトを定義するのに必要でないトポロジプリミティブを削除します。
bigint RemoveUnusedPrimitives(text topology_name, geometry bbox);
存在するTopoGeometryオブジェクトを表現するのに厳密には必要でない全てのプリミティブ (nodes, edges, faces)を見つけ、これらを削除し、トポロジの妥当性 (エッジのリンク、フェイスのラベル)を維持します。
新しいプリミティブ識別子が作られませんが、既存のプリミティブはフェイスのマージ (エッジの削除のため)や修復されたエッジ (ノードの削除のため)を含むために拡張されます。
Availability: 3.3.0
本節では、新しいTopoGeometryを生成するトポロジ関数を挙げます。
topoelementarrayを返します。CreateTopoGeom — 新しいTopoGeometryオブジェクトをtopoエレメント配列から生成します - 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で示されたレイヤでTopoGeometryオブジェクトを生成し、toponameスキーマの関連テーブルに登録します。
tg_typeは次の整数値とします: 1:[multi]point (点), 2:[multi]line (線), 3:[multi]poly (面), 4:collection。layer_idは、topology.layerテーブル内のレイヤ識別番号です。
点レイヤはノードの集合から形成され、線レイヤはエッジの集合から形成され、面レイヤはフェイスの集合から形成され、コレクションはノード、エッジ、フェイスの混合から形成されます。
要素の配列を省略した場合、空のTopoGeometryオブジェクトが生成されます。
Availability: 1.1
Form from existing edges.
ri_topoスキーマ内 (ST_CreateTopoGeoの例でロードしてあります)で、ラインタイプ (整数値で2)の、layer_idが2のレイヤ (ri_roads)の最初のエッジからTopoGeometryを生成します。
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.
フェイスのコレクションから形成されるジオメトリがあるとします。blockgroupsテーブルがあり、それぞれの区画群のTopoGeometryを知りたいとします。データが完全に整列しているなら、次のようにできます。
トポジオメトリーカラムを追加します。
SELECT topology.AddTopoGeometryColumn( 'topo_boston', 'boston', 'blockgroups', 'topo', 'POLYGON');
1
全てが完全にエッジに沿っていると仮定されるカラムの更新。
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;世界が完璧であることはほぼありません。そこで誤差が許されるものを示します。50%が期待したブロックグループ境界に落ちる場合には数えるようにしています。
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;エッジやフェイスに沿ったトポジオメトリーをトポジオメトリーでないジオメトリーに戻すには、トポジオメトリーをジオメトリーにキャストします。結果ジオメトリーはTIGERのストリートの中心線に沿います。
UPDATE boston.blockgroups SET new_geom = topo::geometry;
toTopoGeom — 単純なジオメトリからTopoGeometryを生成します。
topogeometry toTopoGeom(geometry geom, varchar toponame, integer layer_id, float8 tolerance=-1);
topogeometry toTopoGeom(geometry geom, topogeometry topogeom, float8 tolerance=-1);
単純なジオメトリからTopoGeometryを生成します。
入力ジオメトリを表現するために必要なトポロジプリミティブが、下位にあるトポロジに追加されます。既存のものを分割することもあります。relationテーブル内のTopoGeometryの出力に紐づきます。
既存のTopoGeometryオブジェクトは形状を維持します (topogeomが与えられている場合には、それが例外となる可能性があります)。
toleranceが与えられた場合には、入力ジオメトリを既存のプリミティブにスナップします。特別な値である -1 (デフォルト)ではトポロジーの精度を許容値として使うことになります。
1番目の形式では、新しいTopoGeometryは、与えられたトポロジ (toponame)の与えられたレイヤ (layer_id)に作られます。
2番目の形式では、変換結果のプリミティブが、既存のTopoGeometry (topogeom)に追加されます。また、最終の形状にスペースを追加することがあります。新しい形状を完全に持つには、古いものを入れ替えます。clearTopoGeomを参照して下さい。
Availability: 2.0
Enhanced: 2.1.0版では、既存のTopoGeometryを取る形式が追加されました。
Changed: 3.7.0 許容値 0を実際の 0として扱い、-1 (新デフォルト値)をそのトポロジーの精度を使うよう求めるように変更されました。
これは完全に全て揃ったワークフローです。
許容値を許さないトポロジーを生成します。
SELECT topology.CreateTopology('topo_boston_test', 2249);新しいテーブルを生成します。
CREATE TABLE nei_topo(gid serial primary key, nei varchar(30));
新しいテーブルにトポジオメトリーカラムを追加します。
SELECT topology.AddTopoGeometryColumn('topo_boston_test', 'public', 'nei_topo', 'topo', 'MULTIPOLYGON') AS new_layer_id;1
新しいレイヤーの識別子を使ってトポジオメトリーカラムを投入します。
INSERT INTO nei_topo(nei, topo) SELECT nei, topology.toTopoGeom(geom, 'topo_boston_test', 1) FROM neighborhoods WHERE gid BETWEEN 1 and 15;
何が起こったかを確認します。
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
全てのTopoGeometryポリゴンを10メートル後退させます。
UPDATE nei_topo SET topo = toTopoGeom(ST_Buffer(topo, -10), clearTopoGeom(topo), 0);
後退処理後にTopoGeometry参照が全くないフェイスを探索します。
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 — element_idとタイプの配列 (topoelements)からなるtopoelementarrayを返します。
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 — TopoGeometryをTopoElementに変換します。
topoelement TopoElement(topogeometry topo);
これは完全に全て揃ったワークフローです。
個々のトポジオメトリーのTopoElement表現を返します。
SELECT TopoElement(topo) FROM neighborhoods;
キャストを使ってトポジオメトリをTopoElementArrayに集約します。
SELECT topology.TopoElementArray_Agg(topo::topoelement) FROM neighborhoods GROUP BY city;
本節では、既存のTopoGeometryを編集する関数を挙げます。
clearTopoGeom — TopoGeometryの中身を消去します。
topogeometry clearTopoGeom(topogeometry topogeom);
TopoGeometryの中身を消去し、空にします。toTopoGeomと併用して、既存オブジェクトと上位にある依存オブジェクトの形状の置換に、だいたい便利です。
Availability: 2.1
全てのTopoGeometryポリゴンを10メートル後退させます。
UPDATE nei_topo SET topo = toTopoGeom(ST_Buffer(topo, -10), clearTopoGeom(topo), 0);
TopoGeom_addElement — TopoGeometryの定義に要素を追加します。
topogeometry TopoGeom_addElement(topogeometry tg, topoelement el);
5番エッジをTopoGeometry tgに追加します。
UPDATE mylayer SET tg = TopoGeom_addElement(tg, '{5,2}');TopoGeom_remElement — TopoGeometryの定義から要素を削除します。
topogeometry TopoGeom_remElement(topogeometry tg, topoelement el);
43番フェイスを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オブジェクトは*同じ*トポロジに対して定義されている必要があります。また、階層的な定義がある場合には、同じ子レイヤの要素で構成されている必要があります。
Availability: 3.2
指定したトポジオメトリー値の全ての要素から構成されるよう全体のトポジオメトリー値を設定する。
UPDATE mylayer SET tg_overall = TopoGeom_addTopoGeom(
TopoGeom_addTopoGeom(
clearTopoGeom(tg_overall),
tg_specific1
),
tg_specific2
);
topoelementarray (topoelementの配列)を返します。topoelementオブジェクトの集合を返します。GetTopoGeomElementArray — 与えられたTopoGeometry (プリミティブ要素)のトポロジ要素とタイプを含むtopoelementarray (topoelementの配列)を返します。
topoelementarray GetTopoGeomElementArray(varchar toponame, integer layer_id, bigint tg_id);
topoelementarray GetTopoGeomElementArray(topogeometry tg);
トポロジ要素と与えられたTopoGeometry (プリミティブ要素)のタイプを含むTopoElementArrayを返します。GetTopoGeomElementsに近いですが、これは、要素群をデータセットでなく配列で返しています。
tg_idは、topology.layerテーブル内のlayer_idで指定されたレイヤのトポロジにおけるTopoGeometryオブジェクトの識別番号です。
Availability: 1.1
GetTopoGeomElements — 与えられたTopoGeometry (プリミティブ要素)の、トポロジのelement_idとelement_typeを含むtopoelementオブジェクトの集合を返します。
setof topoelement GetTopoGeomElements(varchar toponame, integer layer_id, bigint tg_id);
setof topoelement GetTopoGeomElements(topogeometry tg);
toponameスキーマ内で与えられたTopoGeometryオブジェクトを形成するプリミティブなトポロジ要素 TopoElement (1:ノード、2:エッジ、3:フェイス)に対応したelement_id, element_type (topoelements)の集合を返します。
tg_idは、topology.layerテーブル内のlayer_idで指定されたレイヤのトポロジにおけるTopoGeometryオブジェクトの識別番号です。
Availability: 2.0.0
ST_SRID — TopoGeometryの空間参照識別子を返します。
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 「空間参照系」.
Availability: 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 — TopoGeometryのGML表現を返します。
text AsGML(topogeometry tg);
text AsGML(topogeometry tg, text nsprefix_in);
text AsGML(topogeometry tg, regclass visitedTable);
text AsGML(topogeometry tg, regclass visitedTable, text nsprefix);
text AsGML(topogeometry tg, text nsprefix_in, integer precision, integer options);
text AsGML(topogeometry tg, text nsprefix_in, integer precision, integer options, regclass visitedTable);
text AsGML(topogeometry tg, text nsprefix_in, integer precision, integer options, regclass visitedTable, text idprefix);
text AsGML(topogeometry tg, text nsprefix_in, integer precision, integer options, regclass visitedTable, text idprefix, int gmlversion);
GML3の書式でTopoGeometryのGML表現を返します。nsprefix_inが指定されていない場合には、gmlが使われます。非修飾名前空間を得るにはnsprefixに空文字列を渡します。精度 (デフォルトは15)とoptions (デフォルトは1)パラメーターは、与えられた場合には、裏で呼んでいるST_AsGMLにそのまま渡します。
visitedTableパラメーターは、与えられた場合には、訪問したノード要素とエッジ要素のトラックを保持するために使われ、重複定義になるところで相互参照 (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です。
Availability: 2.0.0
ここではCreateTopoGeomで生成したTopoGeometryを使用しています。
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 — opoGeometryのTopoJSON表現を返します。
text AsTopoJSON(topogeometry tg, regclass edgeMapTable);
TopoGeometryのTopoJSON表現を返します。edgeMapTableがNULLでない場合には、エッジ識別番号とアーク添え字のルックアップと格納のマッピングに使われます。これは、最終的な文書内のコンパクトな"arcs"配列ができるようにするためです。
このテーブルは、与えられた場合には、"serial"型の"arc_id"カラムと整数型の"edge_id"とを持つことが期待されます。関数はこのテーブルに"edge_id"を問い合わせるので、このカラムにインデックスを追加することが推奨されます。
![]() | |
TopoJSONでのアークのインデックスは0始まりですが、"edgeMapTable"テーブルでは1始まりです。 |
完全なTopoJSON文書は、この関数が返すスニペットだけでなく、実際のarcsメンバと、いくつかのヘッダを含む必要があります。 TopoJSON specificationをご覧ください。
Availability: 2.1.0
Enhanced: 2.2.1 点入力に対応するようになりました
TopoJSON出力用に一時的なエッジ地図を生成します。
CREATE TEMP TABLE edgemap(arc_id serial, edge_id int unique);
TopoJSONのヘッダー、オブジェクト、アーク、フッターを構築します。
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]]
]}
本節ではTopoGeometryとトポロジプリミティブとの間の関係を見るトポロジ関数の一覧を挙げます。
Equals — 二つのTopoGeometryが同じトポロジプリミティブで成っている場合にtrueを返します。
boolean Equals(topogeometry tg1, topogeometry tg2);
二つTopoGeometryが同じトポロジプリミティブで成っている場合にtrueを返します。
![]() | |
この関数はジオメトリコレクションのTopoGeometryに対応していません。異なるトポロジからなるTopoGeometryとの比較もできません。 |
Availability: 1.1.0
この関数は3次元に対応し、Z値を削除しません。
次の例ではnei_topoを使っていますが、このテーブルは toTopoGeomの例で作られています。
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 — 二つのTopoGeometryからのプリミティブの組がインタセクトする場合にtrueを返します。
boolean Intersects(topogeometry tg1, topogeometry tg2);
二つのTopoGeometryからのプリミティブがインタセクトする場合にtrueを返します。
![]() | |
この関数はジオメトリコレクションのTopoGeometryに対応していません。異なるトポロジからなるTopoGeometryとの比較もできません。また、現在のところ、階層TopoGeometry (他のTopoGeometryからなるTopoGeometry)に対応していません。 |
Availability: 1.1.0
この関数は3次元に対応し、Z値を削除しません。
次の例ではnei_topoを使っていますが、このテーブルは toTopoGeomの例で作られています。
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
トポロジを生成したり、場合によってはトポロジレイヤに関連付けると、バックアップや他のデータベースへの転送のために、ファイルに出力するフォーマットでエクスポートした方がいいでしょう。
トポロジはテーブルの集合 (プリミティブで4テーブル、レイヤで任意数)と、メタデータテーブルのレコード (topology.topologyとtopology.layer)になっているため、PostgreSQLの標準的なダンプ/レストアのツールでは問題があります。さらに、トポロジの識別子はデータベース間で同じではないため、トポロジのパラメータはレストア時に変更する必要があります。
トポロジのエクスポート/レストアを簡単化するために、二つの実行可能ファイルが提供されています。pgtopo_exportとpgtopo_importです。使用例は次の通りです。
pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db
pgtopo_exportスクリプトはデータベース名とトポロジ名を取り、トポロジ (と関連するレイヤ)を新しいデータベースにインポートするために使うことができるダンプファイルを出力します。
デフォルトではpgtopo_exportはダンプファイルを標準出力に書くので、pgtopo_importにパイプで繋げたり、ファイルにリダイレクトする (端末への出力を止める)ことができます。出力ファイル名をコマンドラインスイッチ-fで指定することもできます。
デフォルトではpgtopo_exportは、指定されたトポロジに対して定義されたレイヤの全てのダンプが含まれます。これは、必要なデータより多い場合もありますし、動作しない場合もあり (レイヤテーブルが複雑な依存関係を持っている場合)、この場合には--skip-layersスイッチでレイヤをスキップし、別々に処理することができます。
pgtopo_exportを--help (または短縮の-h)スイッチで実行すると、常に短い使用法文字列を印字します。
ダンプファイルフォーマットは、少なくともフォーマットバージョン情報を持つpgtopo_dump_versionファイルを含むpgtopo_exportディレクトリの圧縮されたtarアーカイブです。バージョン1では、ディレクトリにはトポロジのプリミティブテーブル (node, edge_data, face, relation)と、プリミティブと関連付けられたトポロジとレイヤとを持つタブ区切りCSVファイルが含まれ、(--skip-layersが与えられない場合)与えられたトポロジのレイヤとして報告されたテーブルのPostgrfeSQLダンプのカスタムフォーマットも含まれます。
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以降)。
raster2pgsqlラスタローダを使ってPostGISラスタを既存のラスタファイルからロードするのは、最もよく行われます。
raster2pgsqlは、GDALがサポートするラスタ書式をPostGISラスタテーブルにロードするのに適切なSQLにする実行ファイルです。ラスタのオーバビューの生成だけでなく、ラスタファイルのフォルダのロードも可能です。
かなり多くの場合、(ご自分のGDALライブラリをコンパイルしない限り) raster2pgsqlはPostGISの一部としてコンパイルされるので、実行ファイルがサポートするラスタタイプはGDALの依存ライブラリでコンパイルされたものと同じになります。お手持ちのraster2pgsqlがサポートするラスタタイプの一覧は、-Gスイッチで見ることができます。
![]() | |
同じアラインメントを持つラスタの集合から特定の要素のオーバビューを生成する時、オーバビューが同じアラインメントを持たないことがあります。オーバビューが同じアラインメントを持たない例についてはhttp://trac.osgeo.org/postgis/ticket/1764をご覧下さい。 |
ローダを用いて入力ファイルを100x100のタイルで生成して、データベースにアップロードする例は、次の通りです。
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
![]() | |
対象テーブル名の一部としてスキーマを指定しない場合には、テーブルはデータベースのデフォルトスキーマ内かユーザーが接続しているスキーマ内に作られます。 |
変換とアップロードはUNIXのパイプを使うと一回で実行できます。
raster2pgsql -s 4326 -I -C -M -F -t 100x100 \ *.tif public.demelevation | psql -d gisdb
マサチューセッツ州平面のメートル単位の空中写真タイルをaerialという名前のスキーマにロードします。 元の画像と2, 4レベルのオーバビューのテーブルとを生成します。 データ格納にCOPYを使用し (データベースに仲介ファイルなくまっすぐ入ります)、-eでトランザクションを指定しないようにします (待たずにテーブルのデータを見たい場合には良いです)。ラスタを128x128ピクセルのタイルに分解してラスタ制約を適用します。INSERTモードでなくCOPYモードを使用します。-Fで、カラム名をタイル切り出し元ファイルのファイル名にします。
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.
-?, --helpヘルプを表示します。引数を全く指定しない場合にも表示されます。
-G, --gdal-formatsサポートされているラスタ書式を印字します。
-c新しいテーブルを生成し、ラスタを入れます。これがデフォルトモードです。
-a既存のテーブルにラスタを追加します。
-dテーブルを削除し、新しいテーブルを生成し、ラスタを入れます。
-p準備モード、テーブルを作るだけです。
--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-constraintsSRIDやピクセルサイズ等のラスタ制約を適用して、raster_columnsビューで適切な登録ができるようにします。
-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 BANDラスタから抽出するバンドのインデックス (1始まり)。1より多いバンドを抽出するには、コンマ(,)で区切ります。指定しない場合、全てのバンドが抽出されます。
-t, --tile-size TILE_SIZE行毎に挿入するラスタを切断します。TILE_SIZEは、「幅x高さ」で表現しますが、"auto"を指定すると、最初のラスタを使って適切なタイルサイズが計算され、全てのラスタに適用されます。
-P, --pad全てのタイルが同じ幅と高さを持つことを保証するために、右端、下端のタイルに詰め物を施します。
-R, --registerファイルシステム (データベース外)ラスタとして、ラスタを登録します。
データベースには、ラスタのメタデータとラスタのファイルパスのみ格納されます (ピクセルは格納されません)。
-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値を持たないバンドで使用するNODATA値を設定します。
-f, --raster-column COLUMN出力先ラスタカラムの名前を指定します。デフォルトは'rast'です。
-F, --filenameファイル名でカラムを追加します。
-n, --filename-column COLUMNファイル名カラムの名前を指定します。-Fを暗に含みます。
-q, --quotePostgreSQL識別子に引用符を付けます。
-IAlias for --create-index.
--create-indexこのraster2pgsqlの実行が終わる時にラスターカラムのGiSTインデックスを生成します。-aによる追加実行を繰り返しても、最後の実行またはロード後にインデックスを生成します。 --if-not-existsでインデックスの存在を許容します。
-Mラスタテーブルにvacuum analyzeを行います。
-k, --skip-nodata-check空タイルを保持してラスタバンドごとのNODATA値のチェックを省きます。チェック時間を抑えることになりますが、データベース内の不要な行がずっと増えて、これらの行が空タイルとされないことに注意して下さい。
-T, --tablespace tablespace生成されるテーブルのテーブルスペースを指定します。-Xフラグを併用しない場合には、インデックス (主キーを含む)はデフォルトのテーブルスペースを使用することにご注意ください。
-X, --index-tablespace tablespaceテーブルの新しいインデックスに使うテーブル空間を指定します。主キーに適用され、-Iフラグがある場合においては空間インデックスにも適用されます。
-Y, --copy [MAX_ROWS_PER_COPY]COPYステートメントを使い、INSERTを使いません。任意でmax_rows_per_copyを指定します。指定しない場合のデフォルト値は50です。
-e, --no-transactionステートメント毎に実行して、トランザクションを使用しないようにします。
-E, --endian ENDIAN生成されるラスタのバイナリ出力のエンディアンを制御します。XDR (訳注: ビッグエンディアン)の場合は0を、NDR (訳注:リトルエンディアン)の場合は1を、それぞれ指定します。デフォルトは1です。現時点ではNDR出力のみサポートします。
-V, --wkb-version version出力書式の版を指定します。デフォルトは0です。現時点では0のみサポートします。
データベース内でラスタやラスタテーブルを生成したい場合が多くあります。これを行うための関数が多数あります。一般的な手順は次の通りです。
新しいラスタ行を保持するためのラスタカラムを持つテーブルを生成します:
CREATE TABLE myrasters(rid serial primary key, rast raster);
この目標で助けとなる関数は多数あります。他のラスタの派生でないラスタを生成する場合、ST_MakeEmptyRasterとST_AddBandを順次実行して作業を開始します
ジオメトリからラスタを生成することもできます。ST_AsRasterを使います。ST_UnionやST_MapAlgebraFctや、地図解析関数群等といった、他の関数を組み合わせる場合もあります。
既存テーブルから新しいラスタテーブルを生成するための多数の選択肢があります。たとえば、ST_Transformを使って、既存テーブルから異なる投影法のラスタテーブルを生成します
はじめにテーブルにデータを入れたら、ラスタカラムに空間インデックスを生成したくなるでしょう:
CREATE INDEX myrasters_rast_st_convexhull_idx ON myrasters USING gist(ST_ConvexHull(rast));
ST_ConvexHullを使用していることに注意して下さい。多くのラスタ演算子はラスタの凸包を元にしています。
![]() | |
2.0より前の PostGIS ラスタは、エンベロープを基本にして、凸包ではありませんでした。空間インデックスを適切に働かせるには、エンベロープを基本にしたインデックスを削除して、凸包を元にしたインデックスに置き換えます。 |
AddRasterConstraintsを用いてラスタ制約を適用します
raster2pgsqlツールはGDALを使用してラスタデータにアクセスします。また、クラウドの「オブジェクト保存」 (AWS S3やGoogle Cloud Storage等)にリモート格納されたラスタを読む能力という、重要なGDAL機能の利点を享受することができます。
クラウドストレージの効率的な仕様には、「クラウド最適化」された書式の使用が必要です。最も知られて幅広く使われているものは、 "cloud optimized GeoTIFF"です。JPEGや非タイル化TIFFなどの非クラウド書式を使うと、発揮される能力は非常に貧弱になります。システムがラスタの一部分にアクセスする必要に迫られるたびに全体をダウンロードするためです。
まず、ラスタをあなたが選択したクラウドストレージに保存します。保存したら、アクセスに使うURIが得られます。"http"URIか、時々特別なサービスを示すURI ( "s3://bucket/object"等)です。非公開バケットにアクセスするには、接続認証のためのGDALコンフィギュレーションオプションが必要になります。このコマンドはクラウドラスタから読み、データベースに書きます。
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx \ AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ raster2pgsql \ -s 990000 \ -t 256x256 \ -I \ -R \ /vsis3/your.bucket.com/your_file.tif \ your_table \ | psql your_db
テーブルがロードされたら、データベースにリモートラスタらか読むためのアクセス許可を与えます。postgis.enable_outdb_rastersとpostgis.gdal_enabled_driversの、二つのアクセス許可を設定します。
SET postgis.enable_outdb_rasters = true;
SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
確実に変更するには、データベースに直接設定します。新しい設定を使うには再接続が必要です。
ALTER DATABASE your_db SET postgis.enable_outdb_rasters = true;
ALTER DATABASE your_db SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';
非公開ラスタの場合、クラウドラスタから読み取るアクセスキーを与えなければならない場合があります。raster2pgsqlの書き込みに使用したのと同じキーを、データベース内でpostgis.gdal_vsi_options設定と共に使用するように設定できます。key=valueペアをスペースで区切ることで、複数のオプションを設定できることに注意してください。
SET postgis.gdal_vsi_options = 'AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
データをロードし、パーミッションが設定されると、ラスタテーブルは他のラスタテーブルとおなじように、同じ関数を使って、対話的処理が可能となります。データベースは、ピクセルデータの読み取りが必要なら、クラウドへの接続の全てを扱います。
PostGISが生成する、二つのラスタカタログのビューがあります。両方ともラスタテーブルの制約の中に埋め込まれる情報を用いています。結果として、カタログビューは、テーブル内のラスタデータに制約が働くため、常にラスタデータとの矛盾がありません。
raster_columns ラスタタイプのデータベースにおける全てのラスタテーブルカラムのカタログです。
raster_overviews データベース内の、より詳細なテーブルのためのオーバビューを提供するラスタテーブルのカラム全てのカタログです。この種のテーブルは、ロード時に-lを指定した時に生成されます。
raster_columnsは、ラスタタイプのデータベースにおける全てのラスタテーブルカラムのカタログです。テーブルの制約を使ったビューなので、他のデータベースのバックアップからラスタテーブルをリストアしたとしても、情報は常に矛盾がありません。raster_columnsカタログには次のカラムがあります。
ローダを使わずにテーブルを生成したり、ロード時に-C フラグを忘れたりした場合には、事後にAddRasterConstraintsで制約を強制でき、raster_columnsカタログは、ラスタタイルの共通の情報を登録します。
r_table_catalog テーブルが存在するデータベースです。これは常に現在のデータベースを読みます。
r_table_schema ラスタテーブルが属するデータベーススキーマです。
r_table_name ラスタテーブルです。
r_raster_column ラスタタイプであるr_table_nameテーブルのカラムです。PostGISには、一つのテーブルに複数のラスタカラムを持つことを妨げません。異なるラスタカラムを持つラスタテーブルが、ラスタカラム毎に複数回出現するテーブルを持つことができます。
srid ラスタの空間参照系識別番号です。「空間参照系」にあるエントリであるべきです。
scale_x 地理空間座標とピクセルの間の拡大縮小係数です。これは、ラスタカラムのすべてのタイルが同じscale_xを持ち、制約が適用されている場合のみ出現します。詳細情報についてはST_ScaleXを参照してください。
scale_y 地理空間座標とピクセルの間の拡大縮小係数です。これは、ラスタカラムのすべてのタイルが同じscale_yを持ち、scale_yの制約が適用されている場合のみ出現します。詳細情報についてはST_ScaleYを参照してください。
blocksize_x ラスタタイルごとの幅 (横方向のピクセル数)です。詳細情報についてはST_Widthを参照してください。
blocksize_y ラスタタイルごとの高さ (縦方向のピクセル数)です。詳細情報についてはST_Heightを参照してください。
same_alignment 全てのラスタタイルが同じアラインメントを持っているかを示す真偽値です。詳細情報についてはST_SameAlignmentを参照してください。
regular_blocking ラスタカラムが空間的に一意かつカバレッジタイルの制約を持つなら、TRUEとなります。その他の場合はFALSEになります。。
num_bands ラスタ集合のタイルごとのバンド数。これと同じ情報が得られる関数は ST_NumBands
pixel_types バンドごとのピクセルタイプを定義する配列です。この配列の要素数はバンド数と同じです。pixel_typesは、ST_BandPixelTypeで定義されるピクセルタイプの一つを取ります。
nodata_values バンド毎のnodata_valueを示す倍精度浮動小数点数の配列です。バンド数と同じ配列数となります。これらの値は、バンド毎のほとんどの処理で無視されるべきピクセル値の定義です。これはST_BandNoDataValueで得られる情報と似ています。
out_db ラスタバンドデータがデータベース外で維持されているかを示す真偽値の配列です。この配列の添え字はバンド番号と同じです。
extent ラスタ集合における全てのラスタ行の範囲です。集合の範囲を変更するデータを別途ロードする予定である場合、ロード前にDropRasterConstraints関数を実行して、ロード後にAddRasterConstraintsで制約を再適用します。
spatial_index 空間インデックスを持っているかどうかを示す真偽値です。
raster_overviewsは、オーバビューで使われるラスタテーブルカラムに関する情報のカタログで、オーバビューを用いる際に知っておくと便利な情報も持ちます。オーバビューテーブルはraster_columnsとraster_overviewsの両方のカタログに入れられます。オーバビューもラスタの一つであるのは確かですが、より高い解像度テーブルの解像度を落としたカリカチュアになるという特殊な目的を満たすためでもあるからです。ラスタをロードする際に-lスイッチを使うと、オーバビューが主ラスタテーブルと一緒に生成されます。もしくは、AddOverviewConstraintsを使うと手動で生成できます。
オーバビューテーブルには、他のラスタテーブルと同じ制約と、オーバビュー特有の制約となる追加情報があります。
![]() | |
|
オーバビューの主たる理由は次の二つです。
ズームアウトした際の地図表示を早くするために、元のテーブルの低解像度表現が一般的に使われます。
レコード数が少なく、ピクセル毎の適用範囲が広いため、高解像度の元テーブルより計算が一般的に早くなります。計算は高解像度テーブルより精度は落ちますが、大まかな計算には十分でありえます。
raster_overviewsカタログには、次の情報のカラムがあります。
o_table_catalog オーバビューテーブルが存在するデータベースです。常に現在のデータベースを読みます。
o_table_schema オーバビューラスタテーブルが属するデータベーススキーマです。
o_table_name ラスタオーバビューテーブル名です。
o_raster_column オーバビューテーブル内のラスタカラムです。
r_table_catalog このオーバビューの元となるラスタテーブルのデータベースです。常に現在のデータベースを読みます。
r_table_schema このオーバビューの元となるラスタテーブルが属するデータベーススキーマです。
r_table_name このオーバビューの元となるラスタテーブルです。
r_raster_column このオーバビューの元となるラスタカラムです。
overview_factor - オーバビューテーブルのピラミッドレベルです。高い数字ほど解像度が低くなります。raster2pgsqlは、画像のフォルダを渡された場合は、分割して、イメージファイルのオーバビューの計算とロードを行います。レベル1は元ファイルと同じです。レベル2は、元ファイルの4分の1になります。たとえば、5000x5000ピクセルの画像ファイルのフォルダがあるとして、125x125に分ける場合、画像ファイルごとに(5000*5000)/(125*125) = 1600行のレコードを持ち、o_2テーブル (レベル2)はceiling(1600/Power(2,2)) = 400行、o_3(レベル3)ではceiling(1600/Power(2,3) ) = 200行のレコードを持ちます。ピクセルがタイルサイズで割り切れない場合、スクラップタイル (完全には値が入っていない)が得られます。raster2pgsqlによって生成される個々のオーバビュータイルは、元となるラスタと同じピクセル数を持ち、個々のピクセルの表現範囲 (オリジナルの Power(2,overview_factor)ピクセル分)が低い解像度になっている点に注意して下さい。
PostGISラスタに知られている画像書式でラスタをレンダリングするためのSQL関数があります。このことから多数のレンダリングの選択肢が使えます。たとえば、OpenOffice/LibreOfficeを使ってレンダリングが可能で、Rendering PostGIS Raster graphics with LibreOffice Base Reportsにデモンストレーションがあります。さらに、本節で示す通り、多種多様な言語を使用できます。
本節では、PHPのPostgreSQLドライバーとST_AsGDALRaster等の関数を使って、HTML imgタグに埋め込むことができるPHPリクエストストリームにラスターの1、2、3バンドを出力する方法を示します。
サンプルクエリでは、 指定したWGS84バウンディングボックスにインタセクトするタイルを取って、 ST_Unionでインタセクトしたタイルを結合して全てのバンドを返し、ST_Transformでユーザー指定投影法に変換し、ST_AsPNGを使ってPNGで結果を出力するためのラスタ関数群全体をまとめる方法を示します。
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.
この例ではNpgsql .NET PostgreSQLドライバーが必要です。最新版はhttp://npgsql.projects.postgresql.org/にあります。最新版をダウンロードして、ASP.NET の binフォルダに入れるだけでうまくいきます。
サンプルクエリでは、 指定したWGS84バウンディングボックスにインタセクトするタイルを取って、 ST_Unionでインタセクトしたタイルを結合して全てのバンドを返し、ST_Transformでユーザー指定投影法に変換し、ST_AsPNGを使ってPNGで結果を出力するためのラスタ関数群全体をまとめる方法を示します。
この例はC#で実装している点を除いては「ST_AsPNG を他の関数とあわせて使った PHP 出力例」と同じです。
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;
}
}
これは、一つの画像を返すクエリを取り、指定したファイルに出力する、簡単なJavaコンソールアプリケーションです。
最新のPostgreSQL JDBCドライバーは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);
}
}
}これは、サーバディレクトリ内でレコードごとにファイルを生成するPythonストアド関数です。plpythonが必要です。plpythonuとplpython3uの両方が正しく動作します。
CREATE OR REPLACE FUNCTION write_file (param_bytes bytea, param_filepath text) RETURNS text AS $$ f = open(param_filepath, 'wb+') f.write(param_bytes) return param_filepath $$ LANGUAGE plpythonu;
Write out 5 images to the PostgreSQL server in varying sizes. 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.
この方法はPythonの場合と違い、ローカル機にファイルが生成されます。
SELECT
oid,
lowrite(lo_open(oid, 131072), png) AS num_bytes
FROM (VALUES (
lo_create(0),
ST_AsPNG((SELECT rast FROM aerials.boston WHERE rid = 1))
)) AS v(oid, png);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型です。
ラスタファイルからラスタをロードするには「ラスタのロードと生成」を参照して下さい。
このリファレンスで使うダミーデータのラスタテーブルの作り方は次の通りです:
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ラスタのユーザにとって必要そうなものです。他にも一般的なユーザにとって興味のないラスタ対応関数があります。
本節では、ラスタ機能をサポートするために作られたPostgreSQLデータ型の一覧を挙げます。
geomval — geom (ジオメトリオブジェクトを保持)とval (ラスタバンドからのピクセル値を倍精度浮動小数点数で保持)の2フィールドからなるデータ型。
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 — ラスタ空間データ型。
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 | NODATAとして扱う値。透過が可能な画像出力では、この値は空白になります。 |
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関数の出力として使う複合型です。
統計情報で使ったピクセルの数。
統計情報で使ったピクセルの値の合計。
統計情報で使ったピクセルの値の平均。
統計情報で使ったピクセルの値の標準偏差。
統計情報で使ったピクセルの値の最小値。
統計情報で使ったピクセルの値の最大値。
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はこの関数を使ってラスタテーブルを登録します。
渡すのに妥当な制約名は次の通りです。詳細情報については「ラスタカラムカタログ」を参照して下さい。
blocksize ブロックのXとY両方のサイズを指定します
blocksize_x Xタイル(タイル毎のピクセル幅)を設定します
blocksize_y Yタイル(タイル毎のピクセル幅)を設定します
extent テーブル全体の範囲を計算し、全てのラスタがこの範囲内にある制約を適用します
num_bands バンド数
pixel_types バンドごとにピクセルタイプを読み、全てのバンドが同じピクセルタイプであることを確認します。
regular_blocking 空間的に一意 (二つのラスタが空間的に同じにならない)であり、カバレッジタイル (ラスタがカバレッジに整列する)制約であるようにします。
same_alignment 同じアラインメントを持つようにします。任意の2タイルについて比較するとtrueを返すという意味です。ST_SameAlignmentを参照して下さい。
srid 全て同じSRIDを持っていることを確認するためのものです。
その他 -- 上の関数への入力で一覧が挙げられています。
![]() | |
この関数はテーブル内に存在するデータから制約を推論します。動作させるには、まずラスタカラムを生成し、その後にデータをロードする必要があります。 |
![]() | |
制約を適用した後にデータをさらにロードする必要がある場合には、データ範囲が変わるならDropRasterConstraintsを使います。 |
Availability: 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);
AddRasterConstraintsで追加された、ラスタテーブルカラムを参照するPostGISラスタ制約を削除します。データの追加ロードやラスタカラムデータの更新で使えます。ラスタテーブルまたはラスタカラムのridを取得したい場合には使う必要がありません。
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カタログに残ります。ただし、カラム名とテーブルからの内部に関する他の情報は存在しません。
Availability: 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を走査して発見した最初のテーブルを使います。
Availability: 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を走査して発見した最初のテーブルを使います。
Availability: 2.0.0
PostGIS_GDAL_Version — PostGISで使っているGDALライブラリの版を報告します。
text PostGIS_GDAL_Version();
PostGISで使っているGDALライブラリの版を報告します。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 — 使用している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);
使用しているGDALライブラリが対応するラスタ書式のshort_name, long_nameと作成オプションの一覧を返します。short_nameは、ST_AsGDALRasterのformatパラメーターに使います。オプションはGDALライブラリのコンパイルに使ったドライバーに依存します。create_optionsは、XML形式のCretionOptionList/Optionの集合で、ドライバーごとの生成オプションごとに、名前を持ち、追加情報のtype, descriptionとVALUEの集合を持ちます。
Changed: 2.5.0 - can_readカラムとcan_writeカラムを追加。
Changed: 2.0.6, 2.1.3 - GUC (訳注: Grand Unified Configurationの略で、動的に変更できるPostgreSQLパラメーター)または環境変数gdal_enabled_driversが設定されていないデフォルトではドライバーが全て無効になりました。
Availability: 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.
JPEGのカラムの生成オプションのXMLカラムをテーブルとして出力します。この生成オプションはST_AsGDALRasterのoptions引数で使用できます。
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を変更します。この関数は全ての適切なカラム制約 (extent, alignment, SRID)を削除してから、指定したカラムのラスタのSRIDを変更します。
![]() | |
この関数はラスタのデータ (バンドピクセル値)を触りません。ラスタのメタデータのみ変更します。 |
Availability: 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 resampling methodsをご覧ください。
Availability: 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);
指定した位置(index)に、指定したタイプの、指定した初期値を持ち、指定したNODATA値を持つ、追加された新しいバンドを持つラスタを返します。インデックス位置を指定していない場合には、バンドは末尾に追加されます。frombandが指定されない場合には、1番バンドと仮定します。ピクセルタイプはST_BandPixelTypeで指定されているピクセルタイプの文字列表現です。既存のインデックスが指定された場合には、バンドのインデックス >= 指定インデックス となるバンドのインデックスは1ずつ足されます。初期値としてピクセルタイプの最大値を超えた値が指定された場合には、初期値にピクセルタイプの許容最大値が指定されます。
addbandargの配列を取る版 (一つ目の版)では、指定したaddbandargのインデックス値は、addbandargで示されるバンドがラスタに追加される時のラスタとの相対値です。下の複数バンドの例を参照してください。
ラスタの配列を取る版 (五つ目の版)では、torastがNULLなら、配列内のラスタごとのfrombandのバンドが新しいラスタに集約されます。
outdbfileを取る版 (六つ目と七つ目の版)では、値はラスタファイルへのフルパスを含まなければなりません。また、ファイルはPostgreSQLサーバプロセスがアクセス可能でなければなりません。
Enhanced: 2.1.0 addbandarg対応が追加されました。
Enhanced: 2.1.0 out-dbバンドが追加されました。
Single New Band.
この例では8ビット符号なし整数のバンドを初期値200で追加します。
UPDATE dummy_rast
SET rast = ST_AddBand(rast, '8BUI'::text, 200)
WHERE rid = 1;
100x100単位で、左上の座標値を原点とした空のラスターを生成し、2バンド (1番バンドは 0/1の2値で、2番バンドは0-15の値が利用可能)を追加します。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 |
この例ではラスターのメタデータを出力しています。
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 | null複数ラスターのようなテーブルの1番バンドを単一ラスターに集約します。test_typesと同じ数のバンドがあり、ネズミと同じ数の行 (新ラスター)があります。ORDER BY test_type節は集約の ORDER BY対応に依っています。結果ラスターはtest_typeごとにバンドを持ちます。マウス好きの方へ: この例ではマウスは傷つきませんでした。
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ラスタに変換します。多数の形式がありますが、結果ラスタのアラインメントとピクセルサイズを設定する三つの考えられる類型に分かれます。
一つ目の群は、最初の2形式です。 アラインメント (scalex, scaley, gridx, gridy)、ピクセルタイプ、NODATA値が提供される参照ラスタと同じとなるラスタを生成します。一般的にこの参照ラスタは、ジオメトリを含むテーブルを参照ラスタを含むテーブルに結合して渡します。
二つ目の群は、4形式あります。ピクセルサイズ (scalex & scaleyとskewx & skewy)の引数を渡してラスタのピクセル範囲を設定します。結果ラスタのwidth & heightはジオメトリの範囲にあわせて調整されます。ほとんどの場合、PostgreSQLが正しい形式を選択するために、scalex & scaleyの整数引数を倍精度浮動小数点数にキャストしなければなりません。
三つ目の群は、4形式あります。ラスタのピクセル範囲 (width & height)を渡してラスタのピクセル範囲を固定するものです。結果ラスタのピクセルサイズ(scalex & scaleyとskewx & skewy)の引数はジオメトリの範囲にあわせて調整されます。
二つ目の群と三つ目の群の群内前半2形式は、アラインメントグリッド (gridx & gridy)の適切な隅でアラインメントを特定します。群内後半2形式は左上隅 (upperleftx & upperlefty)を取ります。
これらの群のそれぞれによって、1バンドまたは複数バンドのラスタを生成することができます。複数バンドのラスタを生成するには、ピクセルタイプ配列 (pixeltype[])、初期値配列 (value)、NODATA値配列 (nodataval)を渡す必要があります。ピクセルタイプが渡されていない場合には、デフォルトは8BUIになり、初期値については1、NODATA値については0になります。
出力ラスタは元のジオメトリと同じ空間参照系になります。参照ラスタを使う形式は例外で、結果ラスタは参照ラスタと同じSRIDになります。
任意引数touchedは、デフォルトではFALSEになります。GDALのALL_TOUCHEDラスタ化オプションに相当し、ラインまたはポリゴンに接触するピクセルが描画されます。ライン上にあるか中心点がポリゴン内部にあるピクセルが描画されるだけではありません。
これは特にジオメトリをデータベースからST_AsPNGやST_AsGDALRaster系の関数を併用して直接JPEGやPNGに描画する際に使えます。
Availability: 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
この例ではバンドをRGBチャンネルに割り当ててティール色 (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_AsRasterAgg — 集約関数です。PostGISジオメトリを新しいラスタに変換します。
raster ST_AsRasterAgg(geometry geom, double precision val, raster ref, text pixeltype, double precision nodataval, text uniontype, boolean touched);
入力ジオメトリとそれに関連付けた値を使ってラスタに変換したもの全てを持つ単一バンドのラスタを返します。
Availability: 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=,);
既存のラスタの、一つ以上のバンドを新しいラスタとして返します。既存ラスタから新しいラスタを構築したり、ラスタの選択したバンドのみを出力したり、バンドの並びを改める際に使えます。バンドが指定されない場合や指定したバンドがラスタに存在しない場合には、全てのバンドを返します。バンド削除等の様々な関数を補助する関数として使われています。
![]() | |
|
Availability: 2.0.0
この例では二つのラスターを生成します: 一つはdummy_rastとうバンドを一つもつもので、もう一つは二つの2BUIで再分類したバンドを持つものです。
SELECT ST_NumBands(rast1) As numb1, ST_BandPixelType(rast1) As pix1,
ST_NumBands(rast2) As numb2, ST_BandPixelType(rast2) As pix2
FROM (
SELECT ST_Band(rast) As rast1, ST_Reclass(ST_Band(rast, 3), '100-200):1, [200-254:2', '2BUI') As rast2
FROM dummy_rast
WHERE rid = 2) As foo;numb1 | pix1 | numb2 | pix2
-------+------+-------+------
1 | 8BUI | 1 | 2BUI配列へのキャストの書き方を使って2番バンドと3番バンドを返します。
SELECT ST_NumBands(ST_Band(rast, '{2,3}'::int[])) As num_bands
FROM dummy_rast WHERE rid=2;
2
配列を使って2番バンドと3番バンドを返します。
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_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は大きな値になります。 |
Availability: 2.4.0
WGS84で左上が(22, 27)で右下が(55, 53)となる範囲の4x4グリッドの16タイルを生成します。
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 — 与えられたピクセル範囲 (width & height)、左上の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);
与えられたピクセル範囲 (width & height)を持ち、かつ、左上隅の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で指定することができます。
![]() | |
入力ラスタの指定したバンドがデータベース外ラスタの場合には、出力ラスタ内の対応するバンドもデータベース外になります。 |
Availability: 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 resampling methodsをご覧ください。
Availability: 2.2.0
ST_FromGDALRaster — 対応するGDALラスタファイルからラスタを返します。
raster ST_FromGDALRaster(bytea gdaldata, integer srid=NULL);
対応するGDALラスタファイルからラスタを返します。gdaldataはbytea型で、GDALラスタファイルの中身です。
sridがNULLの場合には、この関数は、GDALラスタから自動的にSRIDを設定しようとします。sridが与えられている場合には、与えられた値が自動的に設定したSRIDを上書きします。
Availability: 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書式または一般的にworld file (英語版WikiPedia)でみられるESRI書式の地理参照メタデータを返します。書式を指定したいない場合のデフォルトはGDALです。書式は'GDAL'または'ESRI'の文字列です。
書式の表現の違いは次の通りです。
GDAL:
scalex skewy skewx scaley upperleftx upperlefty
ESRI:
scalex skewy skewx scaley upperleftx + scalex*0.5 upperlefty + scaley*0.5
SELECT
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 — ラスタが空 (幅が0で高さが0)の場合にはTRUEを返します。他の場合には、FALSEを返します。
boolean ST_IsEmpty(raster rast);
ラスタが空 (幅が0で高さが0)の場合にはTRUEを返します。他の場合には、FALSEを返します。
Availability: 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_clumn_size, pg_size_pretty, pg_relation_size, pg_total_relation_sizeへのすばらしい賛辞です。
![]() | |
テーブルのバイト単位のサイズを得るpg_relation_sizeはST_MemSizeよりも小さい値を返すことがあります。pg_relation_sizeはTOASTテーブルの寄与分を追加せず、大きなジオメトリはTOASTテーブルに格納されるためです。pg_column_sizeは圧縮後のサイズを返すので、小さくなることがあります。 pg_total_relation_size - テーブル、TOASTテーブル、インデックスを含みます。 |
Availability: 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);
ピクセルサイズ、回転 (skew)、左上隅位置等のラスタオブジェクトに関する基本的なメタデータを返します。返されるカラムは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 (英語版WikiPedia)をご覧ください。
Changed: 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 (英語版WikiPedia)をご覧ください。
Changed: 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始まりですが、引数に0、負数またはラスタのピクセル範囲を超える値が渡されている場合には、ラスタのグリッドがラスタ範囲外に適用できると仮定して、範囲外の座標を返します。
Availability: 2.1.0
この例ではスキューなしのラスターを使っています。
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
この例ではスキューのかかったラスターを使っています。
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列のみ与えた場合にはエラーが発生します。 |
Changed: 2.1.0 以前の版ではST_Raster2WorldCoordXと呼ばれていました。
この例ではカラムの提供がスキューなしラスターにとっては十分であることを示しています。
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
試しにスキューをかけてみましょう。
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行のみ与えた場合にはエラーが発生します。 |
Changed: 2.1.0 以前の版ではST_Raster2WorldCoordYと呼ばれていました。
行を提供するスキューなしラスターは十分です。
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
試しにスキューをかけてみましょう。
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 (英語版WikiPedia)を参照して下さい。
SELECT rid, ST_Rotation(ST_SetScale(ST_SetSkew(rast, sqrt(2)), sqrt(2))) AS rot FROM dummy_rast;
rid | rot -----+------------------- 1 | 0.785398163397448 2 | 0.785398163397448
ST_SkewX — 空間参照のXスキュー (回転パラメータ)を返します。
float8 ST_SkewX(raster rast);
空間参照のXスキュー (回転パラメータ)を返します。詳細についてはWorld File (英語版WikiPedia)を参照して下さい。
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スキュー (回転パラメータ)を返します。
float8 ST_SkewY(raster rast);
空間参照のYスキュー (回転パラメータ)を返します。詳細についてはWorld File (英語版WikiPedia)を参照して下さい。
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);
ラスタの中身の概要が文字列で返されます。
Availability: 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値はラスタの空間参照系で表現しなければなりません。
Availability: 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を指定すれば十分です。ワールド座標系はラスタの空間参照系です。
Changed: 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の両方かが必要です。ラスタがスキューされていない場合には、ywを指定すれば十分です。ワールド座標系はラスタの空間参照系です。
Changed: 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, filedizeおよびfiletimestampはNULLです。outdbのアクセスが禁止されているなら、filesizeとfiletimestampがNULLになります。 |
Enhanced: 2.5.0 outdbラスタにoutdbbandnum, filesizeとfiletimestampを取り入れました。
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 — 指定したバンドがNODATA値だけで満たされている場合には、TRUEを返します。
boolean ST_BandIsNoData(raster rast, integer band, boolean forceChecking=false);
boolean ST_BandIsNoData(raster rast, boolean forceChecking=false);
指定したバンドがNODATA値だけで満たされている場合には、TRUEを返します。バンド番号を指定しない場合には、1番と仮定します。最後の引数がTRUEの場合には、全バンドについてピクセル毎に調べます。他の場合には、isnodataフラグの値を返すだけです。この引数を指定しない場合のデフォルト値はFALSEです。
Availability: 2.0.0
![]() | |
フラグが汚れている (最後の引数をTRUEにした場合としない場合とで結果が違う)場合には、ST_SetBandIsNoData()または、最後の引数をTRUEにしたST_SetBandNoDataValue()を使って、このフラグにTRUEを設定するためにラスタを更新するべきです。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);
バンドへのシステムファイルパスを返します。データベース内に格納されているバンドでこの関数を呼んだ場合にはエラーが投げられます。
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);
ファイルシステムに格納されているバンドのファイルサイズを返します。データベース内バンドを与えるか、データベース外バンドにアクセスできない場合にはエラーが投げられます。
この関数は一般的にST_BandPath()とST_BandFileTimestamp()とを併用して、データベース外ラスタのファイル名が、この関数から見えるものとサーバから見えるものと同じかどうかを判断することができます。
Availability: 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);
ファイルシステムに保存されているバンドのファイルタイムスタンプを返します (UTC 1970年1月1日 0時0分0秒からの秒数)。データベース内バンドの場合またはデータベース外ラスタへのアクセスが無効な場合にはエラーが投げられます。
この関数は通常、ST_BandPath() および ST_BandFileSize() と組み合わせて使用されるため、クライアントは、outdb ラスタのファイル名がサーバーによって見られるものと同じであるかどうかを判断できます。
Availability: 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番と仮定します。
Availability: 2.0.0
SELECT rid, ST_HasNoBand(rast) As hb1, ST_HasNoBand(rast, 2) as hb2, ST_HasNoBand(rast, 4) as hb4, ST_NumBands(rast) As numbands FROM dummy_rast;
rid | hb1 | hb2 | hb4 | numbands -----+-----+-----+-----+---------- 1 | t | t | t | 0 2 | f | f | t | 3
exclude_nodata_valueがFALSEに設定された場合には、NODATA ピクセルを含む全てのピクセルがインタセクトするかが考慮され、値を返します。exclude_nodata_valueを渡さない場合には、ラスタのメタデータから読みます。NODATAでない値を返します。 NODATAでない2次元倍精度浮動小数点数配列を返します。 ST_PixelAsPolygon — 指定した行と列のピクセルの境界となるジオメトリを返します。
geometry ST_PixelAsPolygon(raster rast, integer columnx, integer rowy);
指定した行と列のピクセルの境界となるジオメトリを返します。
Availability: 2.0.0
この例ではラスターピクセルのポリゴンを返します。
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 |
Availability: 2.0.0
Enhanced: 2.1.0 任意引数exclude_nodata_valueが追加されました。
Changed: 2.1.1 exclude_nodata_valueの挙動を変更しました。
この例ではラスターピクセルのポリゴンを返します。
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);
ピクセルの左上隅のポイントジオメトリを返します。
Availability: 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 (整数型)です。
![]() | |
|
Availability: 2.1.0
Changed: 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);
ピクセルで表現される面の重心 (ポイントジオメトリ)を返します。
Enhanced: 3.2.0 C言語による、より高速な実装。
Availability: 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 (整数型)です。
![]() | |
|
Enhanced: 3.2.0 C言語による、より高速な実装。
Changed: 2.1.1 exclude_nodata_valueの挙動を変更しました。
Availability: 2.1.0
この例ではLATERAL書式を使います。
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 — 指定したバンドにおけるcolumnx, rowyで指定したピクセルまたは指定したジオメトリポイントに対応するピクセルの値を返します。 バンド番号は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);
与えたバンドの、与えた列番号、行番号のピクセル、または与えたジオメトリのポイントにおける値を返します。バンド番号は1始まりで、指定しない場合には、1番と仮定します。
exclude_nodata_valueがTRUEの場合には、nodata値でないピクセルだけを考慮します。exclude_nodata_valueがFALSEの場合には、全てのピクセルが考慮されます。
resampleパラメーターに指定できる値はデフォルトの最近傍補間を行う"nearest"、バイリニア補間を行う"bilinear"です。これらはピクセル中心間の値の見積もりに使います。また、最近傍補間の境界オプション"nearest-UL"、"nearest-UR"、"nearest-LL"、"nearest-LR"を指定します。境界オプションは、ポイントと角を含む水平または垂直の境界線上のポイントとがインターセクトする時にどのピクセルを返すかを選択するためのものです。
Enhanced: 3.7.0 最近傍補間の境界オプション"nearest-UL"、"nearest-UR"、"nearest-LL"、"nearest-LR"を受け付けるようになりました。
Enhanced: 3.2.0 任意引数resampleが追加されました。
Enhanced: 2.0.0 任意引数exclude_nodata_valueが追加されました。
特定のPostGISジオメトリーのポイントにおけるラスターの値を得ます、ジオメトリーのSRIDはラスターのSRIDと同じであるべきです。
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
1番バンド、2番バンド、3番バンドのそれぞれのピクセルの値を全て得ます。
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 : :
上と同じように1番バンド、2番バンド、3番バンドの全ての値を得ますが、ピクセルの左上のポイントの値を返します。
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)))
大きなラスタータイルの全てのピクセルを調べるには長い時間がかかります。generate_seriesの任意パラメーターstepを使ったサンプリングによって、精度の低下はありますが、劇的に改善できます。この次の例では上と同じですが、4 (2x2)ピクセルごとに1回調べ、調べたピクセル値を続く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 — 与えられたバンドの、columnxとrowyで指定されるか、またはラスタと同じ空間参照系で表現されたポイントで指定されたピクセルに最も近いNODATAでない値を返します。
double precision ST_NearestValue(raster rast, integer bandnum, geometry pt, boolean exclude_nodata_value=true);
double precision ST_NearestValue(raster rast, geometry pt, boolean exclude_nodata_value=true);
double precision ST_NearestValue(raster rast, integer bandnum, integer columnx, integer rowy, boolean exclude_nodata_value=true);
double precision ST_NearestValue(raster rast, integer columnx, integer rowy, boolean exclude_nodata_value=true);
与えられたバンドの、columnxとrowyで指定されるか、またはラスタと同じ空間参照系で表現されたポイントで指定されたピクセルに最も近いNODATAでない値を返します。columnx, rowyピクセルまたは指定したジオメトリポイントのピクセルがNODATAである場合には、この関数は、columnx, rowyピクセルかジオメトリポイントのピクセルから最も近いNODATA.でないピクセルを探索します。
バンド番号は1始まりで、bandnumが指定されていない場合には、1番と仮定します。exclude_nodata_valueがFALSEに設定された場合には、NODATAピクセルを含む全てのピクセルがインタセクトするかが考慮され、値を返します。exclude_nodata_valueを渡さない場合には、ラスタのメタデータから読みます。
Availability: 2.1.0
![]() | |
ST_NearestValueはST_Valueと交換可能です。 |
この例では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 | 1この例では2x3ピクセルからNODATA値を読みます。
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"、バイリニア補間 (WikiPedia 英語版)を行う"bilinear"です。近隣セルも考慮に入れた値を計算するためのものです。
Availability: 3.2.0
値が10 50. 40 20.となる2x2テストラスター。
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"、バイリニア補間 (WikiPedia 英語版)を行う"bilinear"です。近隣セルも考慮に入れた値を計算するためのものです。
Availability: 3.2.0
値が10 50. 40 20.となる2x2テストラスター。
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 — 与えられたバンドのcolumnX, columnYか、ラスタと同じ空間参照系のジオメトリポイントで指定されたピクセルの周囲にある、NODATAでない2次元倍精度浮動小数点数配列を返します。
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);
与えられたバンドのcolumnX, columnYか、ラスタと同じ空間参照系のジオメトリポイントで指定されたピクセルの周囲にある、NODATAでない2次元倍精度浮動小数点数配列を返します。distanceXとdistanceY引数は、たとえば、対象ピクセルからX軸に沿って3ピクセルとしてY軸に沿って2ピクセルというふうに、指定したピクセルの周囲のピクセル数を、それぞれX方向とY方向に定義します。2次元配列の中心の値はcolumnX, columnYまたはジオメトリポイントで指定したピクセルの値です。
バンド番号は1始まりで、bandnumが指定されていない場合には、1番と仮定します。exclude_nodata_valueがFALSEに設定された場合には、NODATAピクセルを含む全てのピクセルがインタセクトするかが考慮され、値を返します。exclude_nodata_valueを渡さない場合には、ラスタのメタデータから読みます。
![]() | |
返される2次元配列の各軸の要素数は2 * ( |
![]() | |
2次元配列の出力はST_Min4ma, ST_Sum4ma, ST_Mean4maといったあらゆるラスタ処理関数に渡すことができます。 |
Availability: 2.1.0
この例では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}}この例では2x3ピクセルからNODATA値を読みます。
SELECT
ST_Neighborhood(rast, 2, 3, 1, 1)
FROM (
SELECT
ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(5, 5, -2, 2, 1, -1, 0, 0, 0),
'8BUI'::text, 1, 0
),
1, 1, 1, ARRAY[
[0, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 0, 1, 1]
]::double precision[],
1
) AS rast
) AS foo{{1,1,1},{1,NULL,1},{1,1,1}}3x3ピクセルに値があります。 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_SetValue — 与えられたバンドのcolumnX, columnYか、ラスタと同じ空間参照系のジオメトリポイントで指定されたピクセルの値または指定したジオメトリとインタセクトするピクセル群の値を設定することから得られる、変更されたラスタを返します。バンド番号は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番と仮定します。
Enhanced: 2.1.0 ST_SetValueでジオメトリを用いる形式が、ポイントだけでなくあらゆるジオメトリタイプに対応するようになりました。ジオメトリを用いる形式はST_SetValuesのgeomval[]を用いる形式をラップしたものです。
この例ではジオメトリー入力を使います。
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 ...
この例では変更されたラスターを格納します。
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に一致する値に設定しません。
一つ目の形式では、設定するピクセルをcolumnx, rowyのピクセル座標で決定し、 範囲をnewvalueset配列で決定します。nosetによって、ピクセルをnewvalueset内にある値で、一部を設定されないようにすることができます (PostgreSQLは不調和配列、ジャグ配列を許さないため)。一つ目の形式の例をご覧ください。
二つ目の形式では、一つ目の形式と似ていますが、倍精度浮動小数点数のスカラ値であるnosetvalueをnoset配列の代わりに使う点が違います。nosetvalueの値になるnewvalueset内の要素の設定は行いません。二つ目の形式の例をご覧下さい。
三つ目の形式では、設定するピクセルをcolumnx, rowyのピクセル座標とwidth, height.で決定します。三つ目の形式の例をご覧ください。
四つ目の形式では、rastの1番バンドのピクセルを設定すると仮定する点を除いては、三つ目の形式と同じです。
五つ目の形式では、設定するピクセルをgeomvalの配列で決定します。配列内の全てのジオメトリのタイプがPOINTまたはMULTIPOINTである場合には、ポイントごとの経度と緯度がピクセルの設定に直接使うためのショートカットに使われます。他の場合には、ジオメトリはラスタに変換され一つずつ渡されます。五つ目の形式の例をご覧下さい。
Availability: 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 — 指定したバンドの値を2次元で得ます。
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 );
指定したバンドの値を2次元で得ます (一つ目の添え字で行、二つ目の添え字で列に、それぞれ対応します)。nbandがNULLまたは指定されていない場合には、全てのラスタバンドが処理されます。
Availability: 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番と仮定します。
Availability: 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パラメーターが与えられない場合には、NULLを返します。
書式の表現の違いは次の通りです。
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
![]() | |
ラスタがデータベース外のバンドを持っている場合には、地理参照の変更によって、バンドの外部保存されているデータに正しくアクセスできなくなることがあります。 |
Enhanced: 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_SetRotation — ラスタの回転をラジアン単位で設定します。
raster ST_SetRotation(raster rast, float8 rotation);
ラスタを回転させます。回転はラジアン単位です。詳細についてはWorld File (英語版WikiPedia)をご覧下さい。
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_Rescaleは、入力ラスタの地理範囲に合わせて計算された幅、高さを持つラスタを返します。ST_SetScaleはラスタの幅も高さも変更しません。 |
Changed: 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 (英語版WikiPedia)をご覧下さい。
これが最初の例です。
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)
これが二つ目の例で、両方の値に同じ数字を設定します。
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を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);
指定したリサンプリングアルゴリズム、新しいピクセル範囲 (width & height)、グリッド隅 (gridx & gridy)、定義するか他のラスタから借りてきた地理参照属性 (scalex, scaley, skewx, skewy)を使ってリサンプリングを行います。参照ラスタを使用する場合には、二つのラスタは同じSRIDでなければなりません。
新しいピクセル値は次のリサンプリングアルゴリズムの一つを使って計算されます:
NearestNeighbor (最近傍補間、英語又は米式綴り方)
Bilinear (双線形補間)
Cubic (3次補完)
CubicSpline (3次スプライン補完)
Lanczos (ランチョス補間)
Max (最大)
Min (最小)
デフォルトはNearestNeighbor (最近傍補間)です。最も実行速度が速いですが、結果の補間が最も悪くなります。
maxerrが指定されていない場合には0.125とします。
![]() | |
詳細については GDAL Warp resampling methodsをご覧下さい。 |
Availability: 2.0.0 GDAL 1.6.1以上が必要です。
Enhanced: 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')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間 ('Lanczos')を用います。デフォルトは最近傍補間です。
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 (3次補完)
CubicSpline (3次スプライン補完)
Lanczos (ランチョス補間)
Max (最大)
Min (最小)
デフォルトはNearestNeighbor (最近傍補間)です。最も実行速度が速いですが、結果の補間が最も悪くなります。
scalexとscaleyで、新しいピクセルサイズを定義します。ラスタを正しい方向にするには、scaleyは負数でなければならないことがしばしばあります。
新しいscalexまたはscaleyがラスタのwidthまたはheightの除数でない時、結果ラスタの範囲は元のラスタの範囲を含むために拡大されます。ST_Resizeをご覧ください。
maxerrは、リサンプリングアルゴリズムで変換を行う際に近似を行うかどうかを決めるしきい値です (ピクセル単位)。maxerrを設定しない場合には、デフォルトの0.125が使用され、この値はGDALのgdalwarpユーティリティで使われる値と同じです。0に設定した場合には、近似は行われません。
![]() | |
詳細については GDAL Warp resampling methodsをご覧下さい。 |
![]() | |
ST_Recalcは、ST_SetScaleはラスタ範囲に合わせるためのリサンプリングをしない点で、ST_SetScaleと異なります。ST_SetScaleは根本的に誤った設定を行ったのを訂正するためにラスタのメタデータ (地理参照)を変更するだけです。ST_Rescaleは、入力ラスタの地理範囲に合わせて計算された幅、高さを持つラスタを返します。ST_SetScaleはラスタの幅も高さも変更しません。 |
Availability: 2.0.0 GDAL 1.6.1以上が必要です。
Enhanced: 3.4.0 リサンプリング選択肢に最大と最小を追加
Changed: 2.1.0 SRIDなしのラスタで動作するようになりました。
ラスタのピクセルサイズを0.001度から0.0015度にスケール再設定を行う例です。
この例では元のラスターのピクセルサイズを返します。
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
この例ではスケール再設定後のラスターのピクセルサイズを返します。
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_Reskew — キュー (回転パラメーター)だけを調整するリサンプリングを行います。新しいピクセル値のリサンプリングアルゴリズムとして最近傍補間 ('NearestNeighbor' (米式綴り方))、双線形補間 ('Bilinear')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間 ('Lanczos')を用います。デフォルトは最近傍補間です。
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')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間 ('Lanczos')を用います。デフォルトは最も早いですが最も悪い内挿を行う最近傍補間です。
skewxとskewyによって新しいスキューが定義されます。
新しいラスタの範囲は元のラスタの範囲を含みます。
maxerrが指定されていない場合には0.125とします。
![]() | |
詳細については GDAL Warp resampling methodsをご覧下さい。 |
![]() | |
ST_Reskewは、ST_SetSkewがラスタの範囲をあわせるためのリサンプリングをしない点でST_SetSkewと異なります。根本的に誤った設定を行ったのを訂正するためにラスタのメタデータ (地理参照)を変更するだけです。ST_Reskewは、入力ラスタの地理範囲に合わせて計算された幅、高さを持つラスタを返します。ST_SetSkewはラスタの幅も高さも変更しません。 |
Availability: 2.0.0 GDAL 1.6.1以上が必要です。
Changed: 2.1.0 SRIDなしのラスタで動作するようになりました。
スキューを0.0から0.0015に再設定する簡単な例です。
この例では元の回転していないラスターを使います。
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_SnapToGrid — グリッドにスナップすることでラスタをリサンプリングします。新しいピクセル値のリサンプリングアルゴリズムとして最近傍補間 ('NearestNeighbor' (米式綴り方))、双線形補間 ('Bilinear')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間('Lanczos')を用います。デフォルトは最近傍補間です。
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')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間 ('Lanczos')を用います。デフォルトは最も早いですが最も悪い内挿を行う最近傍補間です。
gridxとgridyは、新しいグリッドの任意のピクセル隅を定義します。これは新しいラスタの左上隅に必ずなるものではありません。新しいラスタ範囲の内部または境界である必要はありません。
任意引数として、新しいグリッドのピクセルサイズをscalexとscaleyで指定することができます。
新しいラスタの範囲は元のラスタの範囲を含みます。
maxerrが指定されていない場合には0.125とします。
![]() | |
詳細については GDAL Warp resampling methodsをご覧下さい。 |
![]() | |
グリッドパラメーターより多くの制御が必要な場合には、ST_Resampleを使います。 |
Availability: 2.0.0 GDAL 1.6.1以上が必要です。
Changed: 2.1.0 SRIDなしのラスタで動作するようになりました。
ラスタをわずかに異なるグリッドにスナップさせる簡単な例です。
この例では元のラスターの左上のX座標値を返します。
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')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間 ('Lanczos')を用います。デフォルトは最も早いですが最も悪い内挿を行う最近傍補間です。
一つ目の形式では、出力ラスタの実際の幅、高さを予定しています。
二つ目の形式では、0から1の間の値で、入力ラスタの幅、高さに対する比率を指定しています。
三つ目の形式では、出力ラスタの実際の幅、高さを取るか、文字列による入力ラスタの幅、高さに対する百分率 ("20%")を取ります。
Availability: 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')、3次補間 ('Cubic')、3次スプライン補間 ('CubicSpline')、ランチョス補間 ('Lanczos')を用います。デフォルトは最近傍補間です。
raster ST_Transform(raster rast, integer srid, text algorithm=NearestNeighbor, double precision maxerr=0.125, double precision scalex, double precision scaley);
raster ST_Transform(raster rast, integer srid, double precision scalex, double precision scaley, text algorithm=NearestNeighbor, double precision maxerr=0.125);
raster ST_Transform(raster rast, raster alignto, text algorithm=NearestNeighbor, double precision maxerr=0.125);
ラスタを既知の空間参照系から他の既知の空間参照系に、指定したリサンプリングアルゴリズムで投影変換します。algorithmが指定されていない場合には'NearestNeighbor'とし、maxerrorが指定されていない場合には0.125とします。
アルゴリズム指定オプションは'NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline', 'Lanczos'です。詳細についてはGDAL Warp resampling methodsをご覧ください。
ST_TransformはしばしばST_SetSRIDと混同されます。ST_Transformは、ある空間参照系から別の空間参照系に変更する際に、実際にラスタの座標を変更します (かつピクセル値のリサンプリングを行います)が、ST_SetSRIDは単にラスタの空間参照系識別子を変更するだけです。
三つ目の形式は、他の形式と違い、aligntoとして参照ラスタが求められます。投影変換したラスタは参照ラスタの空間参照系 (SRID)に投影変換して、参照ラスタと同じアラインメントを持つようにします (ST_SameAlignmentがTRUEになるようにします)。
![]() | |
変換しようとしてうまくいかない場合には、環境変数PROJSOを使用しているPostGISのビルドが使用している投影ライブラリに設定する必要があるかも知れません。ファイル名を指定します。Windowsではコントロールパネル -> システム -> システムの詳細設定 -> 詳細設定タブ -> 環境変数 で |
![]() | |
タイルのカバレッジを変換する時には、ほとんどの場合で、「例: 三つ目の形式」で示す通り、同じアラインメントになり、かつタイル内に隙間がなくなるようにするために、参照ラスタを使用したくなります。 |
Availability: 2.0.0 GDAL 1.6.1以上が必要です。
Enhanced: 2.1.0 ST_Tranfrorm(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 — 指定したバンドにNODATAを表現する値を設定します。バンドを指定しない場合には、1番と仮定します。NODATA値を持たないようにするには、nodatavalueにNULLを指定します。
raster ST_SetBandNoDataValue(raster rast, double precision nodatavalue);
raster ST_SetBandNoDataValue(raster rast, integer band, double precision nodatavalue, boolean forcechecking=false);
指定したバンドにNODATAを表現する値を設定します。バンドを指定しない場合には、1番と仮定します。この関数はST_Polygon, ST_DumpAsPolygons, ST_PixelAs系関数群からの結果に影響を与えます。
この例では1番バンドのNODATA値だけを変更します。
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番と仮定します。isnodataフラグが汚れている場合にのみ呼ぶべきものです。ST_BandIsNoDataの、最後の引数にTRUEを設定した場合の結果と指定しない場合の結果とで異なっている時です。
Availability: 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 — データベース外バンドの外部パスとバンド番号を更新します。
raster ST_SetBandPath(raster rast, integer band, text outdbpath, integer outdbindex, boolean force=false);
データベース外バンドの外部パスと外部バンド番号を更新します。
![]() | |
|
Availability: 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 — データベース外バンドの外部バンド番号の更新
raster ST_SetBandIndex(raster rast, integer band, integer outdbindex, boolean force=false);
データベース外バンドの外部バンド番号を更新します。データベース外バンドと関連する外部ラスタファイルには触れません。
![]() | |
|
![]() | |
内部的には、このメソッドは、存在するパス情報を更新する替わりに、PostGISラスタの |
Availability: 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番と仮定します。
![]() | |
|
Changed: 3.1.0 - ST_Count(rastertable, rastercolumn, ...) の形式は削除されました。代わりにST_CountAggを使用します。
Availability: 2.0.0
249でない全てのピクセル数を数えたものと全てのピクセル数を数えたもの。
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の間で設定します。
Availability: 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番と仮定します。
![]() | |
デフォルトでは、 |
widthカテゴリ/ビン毎の幅を示す配列です。ビン数の指定がwidth要素数を超える場合には、widthを繰り返します。
例: ビン9個、widthが[a, b, c]では、[a, b, c, a, b, c, a, b, c]が出力されます。
bins取り出し数 -- 関数から戻そうとするレコード数です。指定しない場合には、自動計算されます。
rightヒストグラムを右から計算します (デフォルトは左からです)。値の評価の優先順位が、X軸について[a, b)から(a, b]に変わります。
Changed: 3.1.0 ST_Histogram(table_name, column_name) の形式は削除されました。
Availability: 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)前の例と同じですが、ビンごとのピクセル値の範囲を明示的に制御しています。
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%にあるかを調べることができます。
![]() | |
|
Changed: 3.1.0 ST_Quantile(table_name, column_name) の形式は削除されました。
Availability: 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
実際の例。2番バンドのうちジオメトリーとインタセクトしているピクセル全ての分位数。
SELECT rid, (ST_Quantile(rast, 2)).* As pvc
FROM o_4_boston
WHERE ST_Intersects(
rast,
ST_GeomFromText('POLYGON((224486 892151,224486 892200,224706 892200,224706 892151,224486 892151))', 26986)
)
ORDER BY value, quantile, rid
;rid | quantile | value -----+----------+------- 1 | 0 | 0 2 | 0 | 0 14 | 0 | 1 15 | 0 | 2 14 | 0.25 | 37 1 | 0.25 | 42 15 | 0.25 | 47 2 | 0.25 | 50 14 | 0.5 | 56 1 | 0.5 | 64 15 | 0.5 | 66 2 | 0.5 | 77 14 | 0.75 | 81 15 | 0.75 | 87 1 | 0.75 | 94 2 | 0.75 | 106 14 | 1 | 199 1 | 1 | 244 2 | 1 | 255 15 | 1 | 255
ST_SummaryStats — 与えられたラスターのバンドまたはラスターカバレッジのcount, sum, mean, stddev, min, maxからなる統計情報のサマリーです。バンドを指定しない場合には、1番と仮定します。
summarystats ST_SummaryStats(raster rast, boolean exclude_nodata_value);
summarystats ST_SummaryStats(raster rast, integer nband, boolean exclude_nodata_value);
ラスタまたはラスタカバレッジの指定したバンドについて、ピクセル数、合計値、平均値、標準偏差、最小値、最大値からなるsummarystatsによる統計情報の概要を返します。nbandでバンドを指定しない場合には、1番と仮定します。
![]() | |
デフォルトでは、 |
![]() | |
デフォルトでは、全てのピクセルを見ます。より早い応答を得るには、 |
Changed: 3.1.0 ST_SummaryStats(rastertable, rastercolumn, ...) の形式は削除されました。代わりにST_SummaryStatsAggを使用します。
Availability: 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.
この例ではバンドごとの統計情報を返します。
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 — 集約関数。与えられたラスターのバンドの集合のcount, sum, mean, stddev, min, maxからなる統計情報のサマリーです。バンドを指定しない場合には、1番と仮定します。
summarystats ST_SummaryStatsAgg(raster rast, integer nband, boolean exclude_nodata_value, double precision sample_percent);
summarystats ST_SummaryStatsAgg(raster rast, boolean exclude_nodata_value, double precision sample_percent);
summarystats ST_SummaryStatsAgg(raster rast, integer nband, boolean exclude_nodata_value);
ラスタまたはラスタカバレッジの指定したバンドについて、ピクセル数、合計値、平均値、標準偏差、最小値、最大値からなるsummarystatsによる統計情報の概要を返します。nbandでバンドを指定しない場合には、1番と仮定します。
![]() | |
デフォルトでは、 |
![]() | |
デフォルトでは全てのピクセルを見ます。よりい早い応答を得るには、 |
Availability: 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が指定されていない場合には、ラスタまたはラスタカバレッジで発見した全てのピクセル値が返ります。searchvalueを一つ指定した場合には、指定したピクセルバンド値を持つピクセルの数を示すレコードでなく、整数を返します。
![]() | |
|
Availability: 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
249を含む1番バンドの全てのピクセル数を数える例です。
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
2番バンドのNODATAでない値を持つピクセルだけを数える例です。
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
:
実際の例です。ジオメトリーとインターセクトするラスタータイルの2番バンドの全ての値ごとのピクセル数を数え、個数が500を超えるバンド値だけを返します。
SELECT (pvc).value, SUM((pvc).count) As total
FROM (SELECT ST_ValueCount(rast, 2) As pvc
FROM o_4_boston
WHERE ST_Intersects(
rast,
ST_GeomFromText('POLYGON((224486 892151,224486 892200,224706 892200,224706 892151,224486 892151))', 26986)
)
) As foo
GROUP BY (pvc).value
HAVING SUM((pvc).count) > 500
ORDER BY (pvc).value;value | total
-------+-----
51 | 502
54 | 521テーブルについて -- サンプリング割合を100%未満にすると速度が向上します。25%にすると解を得るのが非常に早くなりました。
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)ラスタが与えられると、ラスタを返します。
Availability: 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_RastFromHexWKB — Well-Knownバイナリ (WKB)ラスタの16進数表現からラスタを返します。
raster ST_RastFromHexWKB(text wkb);
Well-Known Binary (WKB)ラスタが16進数表現で与えられると、ラスタを返します。
Availability: 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_AsBinary/ST_AsWKB — ラスタのWell-Known Binary (WKB)表現を返します。
bytea ST_AsBinary(raster rast, boolean outasin=FALSE);
bytea ST_AsWKB(raster rast, boolean outasin=FALSE);
ラスタのバイナリ表現を返します。outasinがTRUEの場合には、データベース外のバンドがデータベース内のバンドとして扱われます。表現の詳細については、PostGISソースフォルダにあるraster/doc/RFC2-WellKnownBinaryFormatをご覧下さい。
データを文字列表現に変換せずにデータベース外に引き出すためのバイナリカーソルに使えます。
![]() | |
デフォルトでは、WKB出力には、データベース外のバンドの外部ファイルパスを含みます。クライアントがデータベース外にあるラスタファイルにアクセスできない場合には、 |
Enhanced: 2.1.0 outasinの追加
Enhanced: 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 — Well-Known Binary (WKB)ラスタを16進数表現で返します。
bytea ST_AsHexWKB(raster rast, boolean outasin=FALSE);
ラスタのバイナリの16進数表現を返します。outasinがTRUEの場合には、データベース外のバンドがデータベース内のバンドとして扱われます。表現の詳細については、PostGISソースフォルダにあるraster/doc/RFC2-WellKnownBinaryFormatをご覧下さい。
![]() | |
デフォルトでは、WKB出力には、データベース外のバンドの外部ファイルパスを含みます。クライアントがデータベース外バンドを持っているラスタファイルにアクセスできない場合には、 |
Availability: 2.5.0
SELECT ST_AsHexWKB(rast) AS rastbin FROM dummy_rast WHERE rid=1;
010000000000000000000000400000000000000840000000000000E03F000000000000E03F000000000000000000000000000000000A0000000A001400
ST_AsGDALRaster — 指定されたGDALラスタ書式でラスタタイルを返します。ラスタ書式はコンパイルしたライブラリが対応するものです。ライブラリが対応する書式の一覧を得るにはST_GDALRasters()を使います。
bytea ST_AsGDALRaster(raster rast, text format, text[] options=NULL, integer srid=sameassource);
指定された書式でラスタタイルを返します。引数は次の通りです。
format 出力書式です。libgdalライブラリでコンパイルしたドライバーに依存します。一般的には'JPEG', 'GTIff', 'PNG'が有効になっています。ライブラリが対応する形式の一覧を得るにはST_GDALDriversを使います。
options GDALオプションの文字列配列です。妥当なオプションは書式に依存します。詳細についてはGDAL Raster format optionsをご覧下さい。
srid the spatial reference identifier to embed in the output raster
Availability: 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より多いバンドがある場合には、1番バンドを使用します。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 (JPEG)画像として返します。 より一般でないラスタタイプで出力する必要がある場合には、ST_AsGDALRasterを使います。バンドを指定せず、1バンドか3より多いバンドがある場合には、1番バンドを使用します。3バンドのみ指定した場合には、3バンドを使用します。この関数には多数の任意引数が付くさまざまな形式があります。引数については次の通りです。
nband 単一バンド出力のためのものです。
nbands 出力バンドの配列 (JPEGでは3要素が最大です)で、バンドの並び順はRGBです。たとえばARRAY[3,2,1]は、3番バンドを赤、2番バンドを緑、1番バンドを青にそれぞれ対応させます。
quality 0から100の数値です。高いほどしっかりした画像になります。
options JPEGのために定義するGDALオプションの文字列配列です (ST_GDALDriversのcreate_optionsを見てください)。JPEGの妥当なパラメーターは PROGRESSIVEの'ON'または'OFF'と、QUALITYの0から100までの数 (デフォルトは75)です。詳細については GDAL Raster format optionsをご覧下さい。
Availability: 2.0.0 - GDAL 1.6.0以上が必要です。
最初の3バンドを75%品質で出力します。
SELECT ST_AsJPEG(rast) As rastjpg FROM dummy_rast WHERE rid=2;
最初のバンドだけを90%品質で出力します。
SELECT ST_AsJPEG(rast, 1, 90) As rastjpg FROM dummy_rast WHERE rid=2;
先頭から3バンドを、2番バンドは赤に、1番バンドは緑に、3番バンドは青に、それぞれ割り当て、プログレッシブを使用した90%品質で出力します。
SELECT ST_AsJPEG(rast, ARRAY[2, 1, 3], ARRAY['QUALITY=90', 'PROGRESSIVE=ON']) As rastjpg FROM dummy_rast WHERE rid=2;
ST_AsPNG — ラスタの選択されたバンドを、単一のportable network graphics (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 (PNG)画像として返します。より一般でないラスタタイプで出力する必要がある場合には、ST_AsGDALRasterを使います。バンドを指定しない場合には、前から3バンドを出力します。この関数には多数の任意引数が付くさまざまな形式があります。sridが指定されない場合には、sridはラスタが使用しているSRIDを指定します。引数の一覧は次の通りです。
nband 単一バンド出力のためのものです。
nbands 出力バンドの配列 (PNGでは4要素が最大です)で、バンドの並び順はRGBAです。たとえばARRAY[3,2,1]は、3番バンドを赤、2番バンドを緑、1番バンドを青にそれぞれ対応させます。
compression 1から9の数を指定します。大きいほど圧縮効率が上がります。
options PNGのために定義するGDALオプションの文字列配列です (ST_GDALDriversのcreate_optionsを見てください)。PNGの妥当なパラメーターはZLEVEL (圧縮に費やす時間の合計で、デフォルトは6)です。ARRAY['ZLEVEL=9']というようにします。この関数が二つの出力を行う必要があるため、ワールドファイルはPNGでは許されません。詳細についてはGDAL Raster format optionsをご覧下さい。
Availability: 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);
ラスタの選択されたバンドを、単一のTagged Image File Format (TIFF)画像として返します。バンドを指定しない場合には、全てのバンドの使用を試みます。この関数はST_AsGDALRasterのラッパです。より一般でないラスタタイプで出力する必要がある場合には、ST_AsGDALRasterを使います。この関数には多数の任意引数が付くさまざまな形式があります。空間参照系 (SRS)の文字列表現が指定されていない場合には、ラスタの空間参照系を使います。引数については次の通りです。
nbands 出力バンドの配列 (PNGでは3要素が最大です)で、バンドの並び順はRGBです。たとえばARRAY[3,2,1]は、3番バンドを赤、2番バンドを緑、1番バンドを青にそれぞれ対応させます。
compression 圧縮式 -- JPEG90 (または他のパーセント値), LZW, JPEG, DEFLATE9のいずれかです。
options GTiffを定義するGDALオプションの文字列配列です (ST_GDALDriversのGTiff用のcreate_optionsを見てください)。詳細についてはGDAL Raster format optionsをご覧下さい。
srid ラスタのspatial_ref_sysのSRIDです。地理参照情報を登録するために使われます。
Availability: 2.0.0 - GDAL 1.6.0以上が必要です。
SELECT ST_AsTIFF(rast, 'JPEG90') As rasttiff
FROM dummy_rast WHERE rid=2;
cropが指定されていなかったりTRUE となっている場合には、出力ラスタは切り取られます。touchedがTRUEの場合には、接触するピクセルは取り込まれ、TRUEでない場合には、中心がジオメトリ内にあるピクセルだけが取り込まれます。ST_Clip — 入力ジオメトリで切り取ったラスタを返します。バンドが指定されていない場合には、全てのバンドが処理されます。cropが指定されていなかったりTRUE となっている場合には、出力ラスタは切り取られます。touchedがTRUEの場合には、接触するピクセルは取り込まれ、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値を持たない場合には、結果ラスタのNODATA値はST_MinPossibleValue(ST_BandPixelType(rast, band))に設定されます。配列におけるNODATA値の要素数がバンド数より小さい場合には、配列の最後の要素が残りのバンドに適用されます。NODATA値の要素数がバンド数より多い場合には、超過分は無視されます。全てのNODATA値配列を受け付ける形式では、バンド毎に適用される単一値も受け付けます。
crop が指定されていない場合には、TRUE として扱われ、出力ラスタは geom と rast の範囲の共有領域で切り取ります。crop が FALSE に指定されている場合には、新しいラスタは rast と同じ範囲になります。touched が TRUE に指定されている場合には、ジオメトリとインタセクトする rast 内の全てのピクセルが選択されます。
![]() | |
デフォルトの振る舞いは touched=false で、中心がジオメトリに含まれているピクセルを選択するだけです。 |
Enhanced: 3.5.0 - 引数 touched を追加。
Availability: 2.0.0
Enhanced: 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 — 元のラスタと指定したバンドから4個までの8BUIバンド (grayscale, RGB, RGBA)からなる新しいラスタを生成します。
raster ST_ColorMap(raster rast, integer nband=1, text colormap=grayscale, text method=INTERPOLATE);
raster ST_ColorMap(raster rast, text colormap, text method=INTERPOLATE);
rastのnbandで示されるバンドにcolormapを適用し、4個までの8BUIバンドからなる新しいラスタを返します。新しいラスタの8BUIバンドの数はcolormapで定義された色要素の数で決まります。
nbandが指定されていない場合には、1番と仮定します。
colormapは事前定義された色マップまたは値を定義する行の集合と色要素のキーワードです。
妥当な事前定義されたcolormapキーワードは次の通りです。
grayscaleまたはgreyscale 1個の8BUIバンドからなるラスタで、グレーの陰影です。
pseudocolor 4個の8BUIバンド (RGBA)からなるラスタで、青から緑、赤に移るものです。
fire 4個の8BUIバンド (RGBA)からなるラスタで、黒から赤、淡黄色に移るものです。
bluered 4個の8BUIバンド (RGBA)からなるラスタで、青からペールホワイト、赤に移るものです。
カスタムカラーマップを指定するためにエントリ (1行1エントリ)の集合をcolormapに渡すことができます。それぞれのエントリは一般的に、ピクセル値、ピクセル値と対応する赤、緑、青、アルファ要素(0から255の間の色要素)からなる5個の値を持ちます。ピクセル値の替わりに百分率値を使うことができ、0%がラスタバンドでの最小値、100%が最大値になります。値はコンマ('.')、タブ、コロン(':')、空白で区切られます。NODATA値に対しては、ピクセル値をnv, null, 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値が入りません。NODATA値が必要な場合には、 ST_SetBandNoDataValueを使ってNODATA値をセットします。 |
Availability: 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に |
Availability: 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の集合を返すもので、ベクタ空間で動作します。ラスタは初めにgeomval行の集合にベクトル化されます (ST_DumpAsPolygonsを使用)。これらの行はPostGIS関数のST_Intersection(geometry, geometry)を使ってジオメトリとインタセクトさせます。NODATA値の領域とだけインタセクトするジオメトリについては空ジオメトリを返します。通常はWHERE節でST_Intersectsを使って結果から確実に排除します。
丸括弧でくくって式の末尾に'.geom'や'.val'をつけることにより、geomvalの結果集合のジオメトリや値の部分にアクセスすることができます。たとえば(ST_Intersection(rast, geom)).geom等とします。
他の形式は、ラスタを引数に取り、ラスタを返します。ST_MapAlgebraExprの二つのラスタを取る形式を使って、インタセクトしている部分を取得します。
結果ラスタの範囲は、二つのラスタの範囲についてインタセクトしている部分です。結果ラスタは、returnband引数として渡されたものにあわせられた'BAND1','BAND2','BOTH'バンドを含みます。どのバンドでもNODATA値の領域は、結果ラスタの全てのバンドのNODATA値領域に現れます。言い換えると、あらゆるNODATA値ピクセルとインタセクトしているピクセルは、結果ラスタではNODATA値ピクセルになります。
インタセクトしなかった領域にNODATA値を入れるために、ST_Intersectionからの結果ラスタは、NODATA値を持たなければなりません。結果ラスタのどのバンドにも、一つか二つのNODATA値を持つnodataval[]配列を与えることでNODATA値を定義したり置き換えたりできます。この配列は、引数で与えた'BAND1','BAND2','BOTH'バンドに依存します。 配列の一つ目の値は、一つ目のバンドのNODATA値を入れ替えるものです。二つ目の値は二つ目のバンドのNODATA値を入れ替えるものです。入力バンドの一つがNODATA値を持っておらず、かつ配列を渡さなかった場合には、ST_MinPossibleValue関数を使ってNODATA値が選ばれます。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. |
Enhanced: 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
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によって、多数のラスタと多数のバンドにおいて地図代数処理が使用できます。一つ目の形式の例を見て下さい。
nband, nband1, nband2処理を行うラスタのバンド番号です。nbandはバンドを示す整数スカラまたは整数配列です。2ラスタ/2バンドの場合では、nband1はrast1のバンド、nband2はrast2のバンドです。
callbackfunccallbackfunc引数は、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;
callbackfuncは、二つまたは三つの引数を持たなければなりません: 3次元倍精度浮動小数点数配列、2次元整数配列、VARIADICの1次元文字列配列です。一つ目の引数valueは、全ての入力ラスタからの値 (倍精度浮動小数点数)の配列です。3次元 (1始まり)は、ラスタ番号、行、列です。二つ目の引数positionは、出力ラスタと入力ラスタからのピクセル位置の集合です。一つ目の次元の添え字 (0はじまりです)はラスター番号です。一つ目の次元の添え字が0の場合に指される位置は、出力ラスタのピクセル位置です。二つ目の次元はXとYからなる二つの要素を持ちます。三つ目の引数userargsは任意引数でユーザ定義関数特有の引数としてそのまま渡されます。
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は近隣セル値をNODATAとして扱うべきであることを示し、1はデータとして扱うべきであることをそれぞれ意味します。weightがTRUEに指定されいる場合には、この配列の値は、近隣セルのピクセル値に対して掛け算を行うための数になります。
weightedマスク値に重みづけを施す (元の値に対して乗算を行う)か、施さない (マスク処理だけを行う)かを示す真偽値です。
pixeltypepixeltypeを渡した場合には、新しいラスタの一つのバンドが、そのピクセルタイプになります。pixeltypeにNULLを渡したり指定しなかった場合には、新しいラスタのピクセルタイプは、一つ目のラスタ (extenttypeがINTERSECTION, UNION, FIRST, CUSTOMの場合)か、適切なラスタ (extenttypeがSECOND, LASTの場合)の指定したバンドと同じピクセルタイプになります。疑問を感じたら常にpixeltypeを渡します。
出力ラスタのピクセルタイプは、必ずST_BandPixelTypeに挙げられたものの一つになるか、省略されるか、NULLに設定されます。
extenttypeINTERSECTION (デフォルト), UNION, FIRST (一つのラスタを取る形式でのデフォルト), SECOND, LAST, CUSTOMのいずれかになります。
customextentextentypeがCUSTOMである場合には、ラスタはcustomextentで提供されます。一つ目の形式の例4をご覧下さい。
distancex参照セルからのピクセル単位の距離です。結果として得られる行列の幅は2*distancex + 1となります。指定しない場合には、参照セルだけが対象となります (0の距離の近隣ピクセル)。
distancey参照セルからのピクセル単位の距離です。結果として得られる行列の高さは2*distancey + 1となります。指定しない場合には、参照セルが対象となります (0の距離の近隣ピクセル)。
userargscallbackfuncが第3引数を宣言している場合には、第3引数はvariadic text配列です。全ての引き渡されるテキスト引数は指定したcallbackfuncに渡され、userargs引数に含まれます。
![]() | |
VARIADICキーワードに関する詳細情報については、PostgreSQL文書とQuery Language (SQL) Functions (訳注: 日本語版は「問い合わせ言語 (SQL)関数」です)の"SQL Functions with Variable Numbers of Arguments" (訳注: 日本語版は「可変長引数を取るSQL関数」)節を参照して下さい。 |
一つ目の形式では、多数のラスタやバンドで地図代数演算が使えるようになるためのrastbandarg配列を受け付けます。一つ目の形式の例をご覧下さい。
二つ目と三つ目の形式では、一つのラスタにおける一つ以上のバンドについて演算を行います。二つ目の形式と三つ目の形式の例をご覧下さい。
四つ目の形式では、二つのラスタにおいて、それぞれ一つずつのバンドについて演算を行います。四つ目の形式の例をご覧下さい。
Availability: 2.2.0: マスクが追加されました。
Availability: 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式から一つのバンドを持つラスタを返します。
Availability: 2.1.0
expressionで定義された妥当なPostgreSQL代数演算を入力ラスタ (rast)に適用して、一つのバンドを持つラスタを生成します。nbandが指定されない場合には、1番バンドと仮定します。新しいラスタは、元のラスタと同じ地理参照、幅、高さになりますが、バンドは一つだけとなります。
pixeltypeが渡された場合には、新しいラスタのバンドは、そのピクセルタイプになります。pixeltypeにNULLが渡された場合には、新しいラスタは入力rastのバンドのピクセルタイプと同じになります。
expressionのキーワードは次の通りです。
[rast] - 演算対象ピクセルの値
[rast.val] - 演算対象ピクセルの値
[rast.x] - 演算対象ピクセルの列 (1始まり)
[rast.y] - 演算対象ピクセルの行 (1始まり)
expressionで定義された妥当な二つのバンドへのPostgreSQL代数演算を入力ラスタ rast1, (rast2)に適用して、一つのバンドを持つラスタを生成します。band1, band2が指定されない場合には、1番バンドと仮定します。新しいラスタは、一つ目のラスタと同じアラインメント (スケール、スキュー、ピクセル隅)を持ちます。新しいラスタは、extenttype引数で定義される範囲になります。
expression二つのラスタとPostgreSQL定義済み関数/演算子を含むPostgreSQL代数式です。関数と演算子は、二つのピクセルがインタセクトするピクセルの値を定めます。たとえば(([rast1] + [rast2])/2.0)::integerといったふうになります。
pixeltype出力ラスタのピクセルタイプです。必ずST_BandPixelTypeに挙げられたものの一つになるか、省略されるか、NULLに設定されます。引数として渡されないかNULLが渡された場合には、一つ目のラスタのピクセルタイプになります。
extenttype新しいラスタの範囲を制御します。
INTERSECTION - 新しいラスタの範囲は二つのラスタのインタセクトした領域です。これがデフォルトです。
UNION - 新しいラスタの範囲は二つのラスタの結合です。
FIRST - 新しいラスタの範囲は一つ目のラスタと同じです。
SECOND - 新しいラスタの範囲は二つ目のラスタと同じです。
nodata1exprrast1がNODATA値で、特にrast2ピクセルに値がある時に、rast2だけを返すか返すべき値を定義する定数を含む代数式です。
nodata2exprrast2がNODATA値で、特にrast2ピクセルに値がある時に、rast1だけを返すか返すべき値を定義する定数を含む代数式です。
nodatanodatavalrast1とrast2のピクセルの両方がNOADTA値になる場合に返すべき定数です。
有効なexpression, nodata1expr, nodata2exprのキーワードは次の通りです。
[rast1] - rast1の演算対象ピクセルの値
[rast1.val] - rast1の演算対象ピクセルの値
[rast1.x] - rast1の演算対象ピクセルの列 (1始まり)
[rast1.y] - rast1の演算対象ピクセルの行 (1始まり)
[rast2] - rast2の演算対象ピクセルの値
[rast2.val] - rast2の演算対象ピクセルの値
[rast2.x] - rast2の演算対象ピクセルの列 (1始まり)
[rast2.y] - rast2の演算対象ピクセルの行 (1始まり)
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バンドラスタを生成します。バンドを指定しない場合には、1番を仮定します。
raster ST_MapAlgebraExpr(raster rast, integer band, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebraExpr(raster rast, text pixeltype, text expression, double precision nodataval=NULL);
![]() | |
ST_MapAlgebraExpr は2.1.0で非推奨になりました。代わりにST_MapAlgebra (expression version) を使います。 |
入力ラスタ (rast)に対してexpressionで定義される妥当なPostgreSQL代数演算で形成されるラスタを返します。生成されるラスタは指定したピクセルタイプとなる1バンドラスタです。bandを指定しない場合には、1番と仮定します。新しいラスタは、元のラスタと同じ地理参照、幅、高さを持ちますが、一つのバンドしか持ちません。
pixeltypeが渡された場合には、新しいラスタのバンドは、そのピクセルタイプになります。pixeltypeにNULLが渡された場合には、新しいラスタは入力rastのバンドのピクセルタイプと同じになります。
数式の中では、[rast]で元のバンドのピクセル値を、[rast.x]で1始まりの列番号、[rast.y]で1始まりの行番号を、それぞれ参照することができます。
Availability: 2.0.0
元のラスタから1バンドラスタを生成します。元のラスタバンドの値について2で割った余りが入ります。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
UPDATE dummy_rast SET map_rast = ST_MapAlgebraExpr(rast, NULL, 'mod([rast]::numeric,2)') WHERE rid = 2;
SELECT
ST_Value(rast, 1, i, j) As origval,
ST_Value(map_rast, 1, i, j) As mapval
FROM dummy_rast
CROSS JOIN generate_series(1, 3) AS i
CROSS JOIN generate_series(1, 3) AS j
WHERE rid = 2;origval | mapval
---------+--------
253 | 1
254 | 0
253 | 1
253 | 1
254 | 0
254 | 0
250 | 0
254 | 0
254 | 0ピクセルタイプが2BUIの1バンドラスタを生成します。元のラスタに対して再分類を行った値が入り、NODATA値を0に設定します。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
UPDATE dummy_rast SET
map_rast2 = ST_MapAlgebraExpr(rast, '2BUI'::text, 'CASE WHEN [rast] BETWEEN 100 and 250 THEN 1 WHEN [rast] = 252 THEN 2 WHEN [rast] BETWEEN 253 and 254 THEN 3 ELSE 0 END'::text, '0')
WHERE rid = 2;
SELECT DISTINCT
ST_Value(rast, 1, i, j) As origval,
ST_Value(map_rast2, 1, i, j) As mapval
FROM dummy_rast
CROSS JOIN generate_series(1, 5) AS i
CROSS JOIN generate_series(1, 5) AS j
WHERE rid = 2;origval | mapval
---------+--------
249 | 1
250 | 1
251 |
252 | 2
253 | 3
254 | 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 |
新しいバンドを三つ持つラスタを生成します。元のバンドを三つ持つラスタと同じピクセルタイプです。1番バンドは地図代数関数によって変更され、残りの二つのバンドは値が代わりません。
SELECT
ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(rast_view),
ST_MapAlgebraExpr(rast_view, 1, NULL, 'tan([rast])*[rast]')
),
ST_Band(rast_view, 2)
),
ST_Band(rast_view, 3)
) As rast_view_ma
FROM wind
WHERE rid=167;
ST_MapAlgebraExpr — 2バンド版: 二つの入力バンドに対する妥当なPostgreSQL代数演算で形成された、指定したピクセルタイプとなる1バンドラスタを生成します。バンドを指定しない場合には、どちらも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) を使います。 |
expressionで定義された妥当な二つのバンドへのPostgreSQL代数演算を入力ラスタ rast1, (rast2)に適用して、一つのバンドを持つラスタを生成します。band1, band2が指定されない場合には、1番バンドと仮定します。新しいラスタは、一つ目のラスタと同じアラインメント (スケール、スキュー、ピクセル隅)を持ちます。新しいラスタは、extenttype引数で定義される範囲になります。
expression二つのラスタとPostgreSQL定義済み関数/演算子を含むPostgreSQL代数式です。関数と演算子は、二つのピクセルがインタセクトするピクセルの値を定めます。たとえば(([rast1] + [rast2])/2.0)::integerといったふうになります。
pixeltype出力ラスタのピクセルタイプです。必ずST_BandPixelTypeに挙げられたものの一つになるか、省略されるか、NULLに設定されます。引数として渡されないかNULLが渡された場合には、一つ目のラスタのピクセルタイプになります。
extenttype新しいラスタの範囲を制御します。
INTERSECTION - 新しいラスタの範囲は二つのラスタのインタセクトした領域です。これがデフォルトです。
UNION - 新しいラスタの範囲は二つのラスタの結合です。
FIRST - 新しいラスタの範囲は一つ目のラスタと同じです。
SECOND - 新しいラスタの範囲は二つ目のラスタと同じです。
nodata1exprrast1がNODATA値で、特にrast2ピクセルに値がある時に、rast2だけを返すか返すべき値を定義する定数を含む代数式です。
nodata2exprrast2がNODATA値で、特にrast2ピクセルに値がある時に、rast1だけを返すか返すべき値を定義する定数を含む代数式です。
nodatanodatavalrast1とrast2のピクセルの両方がNOADTA値になる場合に返すべき定数です。
pixeltypeが渡された場合には、新しいラスタは、指定されたピクセルタイプのバンドを持ちます。pixeltypeとしてNULLが渡されたりピクセルタイプを指定しない場合には、新しいラスタはrast1と同じピクセルタイプになります。
数式の中で使える語は、元バンドのピクセル値を参照する [rast1.val], [rast2.val]、1始まりの列/行インデックスを参照する[rast1.x], [rast1.y]などです。
Availability: 2.0.0
2 Band Intersection and Union.
元のラスタから1バンドラスタを生成します。元のラスタバンドの値について2で割った余りが入ります。
ラスターのいかした集合を生成します。
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バンドラスタを生成します。バンドを指定しない場合には、1番と仮定します。
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
![]() | |
ST_MapAlgebraFct は2.1.0で非推奨になりました。代わりにST_MapAlgebra (callback function version)を使います。 |
入力ラスタ (rast)に対してonerasteruserfuncで指定される妥当なPostgreSQL関数で形成されたラスタを返します。生成されるラスタは指定したピクセルタイプとなる1バンドラスタです。bandを指定しない場合には、1番と仮定します。新しいラスタは、元のラスタと同じ地理参照、幅、高さを持ちますが、一つのバンドしか持ちません。
pixeltypeが渡された場合には、新しいラスタのバンドは、そのピクセルタイプになります。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は、2または3の引数を受け付けます。すなわち、float8値、任意引数の整数配列、VARIADIC文字列配列です。第1引数はラスタセルごとの値です (ラスタのデータ型に関係なく)。第2引数は現在の処理セルの位置で、'{x,y}'であらわされます。第3引数は、ST_MapAlgebraFctへのパラメータの残っているもの全てがuserfunctionに渡されることを示します。
regprocedure引数をSQL関数に渡す場合には、渡し先の完全な関数シグネチャが必要で、さらにregprocedureにキャストします。上の例のPL/pgSQL関数を引数として渡すには、引数のSQLは次のようになります:
'simple_function(float,integer[],text[])'::regprocedure
引数には関数名が含まれ、関数引数の型、関数名と引数型を引用符で括ったもの、regprocedureへのキャストが存在することに注意して下さい。
userfunctionの第3引数はvariadic text配列です。どのST_MapAlgebraFctにもついてくる全ての文字列引数は、指定されたuserfunctionに、そのまま渡されて、args引数内に入ります。
![]() | |
VARIADICキーワードに関する詳細情報については、PostgreSQL文書とQuery Language (SQL) Functions (訳注: 日本語版は「問い合わせ言語 (SQL)関数」です)の"SQL Functions with Variable Numbers of Arguments" (訳注: 日本語版は「可変長引数を取るSQL関数」)節を参照して下さい。 |
![]() | |
text[]引数は、ユーザ関数 |
Availability: 2.0.0
元のラスタから1バンドラスタを生成します。元のラスタバンドの値について2で割った余りが入ります。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
CREATE FUNCTION mod_fct(pixel float, pos integer[], variadic args text[])
RETURNS float
AS $$
BEGIN
RETURN pixel::integer % 2;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
UPDATE dummy_rast SET map_rast = ST_MapAlgebraFct(rast, NULL, 'mod_fct(float,integer[],text[])'::regprocedure) WHERE rid = 2;
SELECT ST_Value(rast, 1, i, j) As origval, ST_Value(map_rast, 1, i, j) As mapval
FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1, 3) AS j
WHERE rid = 2;origval | mapval
---------+--------
253 | 1
254 | 0
253 | 1
253 | 1
254 | 0
254 | 0
250 | 0
254 | 0
254 | 0ピクセルタイプが2BUIの1バンドラスタを生成します。元のラスタに対して再分類を行った値が入り、NODATA値をユーザ関数に渡される引数の値 (0)に設定します。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
CREATE FUNCTION classify_fct(pixel float, pos integer[], variadic args text[])
RETURNS float
AS
$$
DECLARE
nodata float := 0;
BEGIN
IF NOT args[1] IS NULL THEN
nodata := args[1];
END IF;
IF pixel < 251 THEN
RETURN 1;
ELSIF pixel = 252 THEN
RETURN 2;
ELSIF pixel
> 252 THEN
RETURN 3;
ELSE
RETURN nodata;
END IF;
END;
$$
LANGUAGE 'plpgsql';
UPDATE dummy_rast SET map_rast2 = ST_MapAlgebraFct(rast,'2BUI','classify_fct(float,integer[],text[])'::regprocedure, '0') WHERE rid = 2;
SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1, i, j) As mapval
FROM dummy_rast CROSS JOIN generate_series(1, 5) AS i CROSS JOIN generate_series(1,5) AS j
WHERE rid = 2; origval | mapval
---------+--------
249 | 1
250 | 1
251 |
252 | 2
253 | 3
254 | 3SELECT ST_BandPixelType(map_rast2) As b1pixtyp FROM dummy_rast WHERE rid = 2;
b1pixtyp ---------- 2BUI
新しいバンドを三つ持つラスタを生成します。元のバンドを三つ持つラスタと同じピクセルタイプです。1番バンドは地図代数関数によって変更され、残りの二つのバンドは値が代わりません。
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_MapAlgebraFct — 2バンド版 - 二つの入力バンドに対する妥当なPostgreSQL関数で形成された、指定したピクセルタイプとなる1バンドラスタを生成します。バンドを指定しない場合には、1番と仮定します。"extenttype"のデフォルトはINTERSECTIONです。
raster ST_MapAlgebraFct(raster rast1, raster rast2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);
raster ST_MapAlgebraFct(raster rast1, integer band1, raster rast2, integer band2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);
![]() | |
ST_MapAlgebraFct は2.1.0で非推奨になりました。代わりにST_MapAlgebra (callback function version)を使います。 |
二つの入力ラスタ (rast1, rast2)に対してtworastuserfuncで指定される妥当なPostgreSQL関数で形成されるラスタを返します。band1またはband2が指定されていない場合には、1番と仮定します。新しいラスタは、元のラスタと同じ地理参照、幅、高さを持ちますが、一つのバンドしか持ちません。
pixeltypeが渡された場合には、新しいラスタはそのピクセルタイプのバンドを持ちます。pixelteypeとして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は3または4の引数を受け付けます。すなわち、一つ目の倍精度浮動小数点数、二つ目の倍精度浮動小数点数、任意引数の整列配列、VARIADIC文字列配列です。第1引数はrast1のラスタセルごとの値です (ラスタのデータ型に関係なく)。第1引数はrast2のラスタセルごとの値です。第3引数は現在の処理セルの位置で、'{x,y}'であらわされます。第4引数はST_MapAlgebraFctへのパラメータの残っているもの全てがtworastuserfuncに渡されることを示します。
regprocedure引数をSQL関数に渡す場合には、渡し先の完全な関数シグネチャが必要で、さらにregprocedureにキャストします。上の例のPL/pgSQL関数を引数として渡すには、引数のSQLは次のようになります:
'simple_function(double precision, double precision, integer[], text[])'::regprocedure
引数には関数名が含まれ、関数引数の型、関数名と引数型を引用符で括ったもの、regprocedureへのキャストが存在することに注意して下さい。
tworastuserfunc引数は variadic text配列です。どのST_MapAlgebraFctにもついてくる全ての文字列引数は、指定されたtworastuserfuncに、そのまま渡されて、userargs引数内に入ります。
![]() | |
VARIADICキーワードに関する詳細情報については、PostgreSQL文書とQuery Language (SQL) Functions (訳注: 日本語版は「問い合わせ言語 (SQL)関数」です)の"SQL Functions with Variable Numbers of Arguments" (訳注: 日本語版は「可変長引数を取るSQL関数」)節を参照して下さい。 |
![]() | |
text[]引数は、ユーザ関数 |
Availability: 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
ユーザー定義関数を定義します。
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_MapAlgebraFctNgb — 1バンド版: ユーザ定義PostgreSQL関数を使用する最近傍地図代数関数です。入力ラスタバンドの近傍の値を与えたPL/pgSQLユーザ定義関数の結果からなるラスタを返します。
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)を使います。 |
(1バンド版) 入力ラスタバンドの近傍の値を与えたPL/pgSQLユーザ定義関数の結果からなるラスタを返します。ユーザ定義関数は近傍のピクセル値を数の配列として取り、ピクセル毎に、ユーザ定義関数からの結果を返し、現在の対象ピクセルのピクセル値を関数の返り値に置き換えます。
rastユーザ定義関数が評価されるラスタです。
band評価されるラスタのバンド番号です。デフォルトは1です。
pixeltype出力ラスタのピクセルタイプです。ST_BandPixelTypeの一覧にあるものか、指定しないか、NULLを指定します。指定しないかNULLを指定した場合には、rastのピクセルタイプがデフォルトになります。結果ピクセル値がピクセルタイプが許容する範囲を超える場合には、切り詰められます。
ngbwidthセル単位の近傍の幅です。
ngbheightセル単位の近傍の高さです。
onerastngbuserfuncラスタの単一バンドの近傍ピクセルに適用されるPL/pgSQLユーザ定義関数です。一つ目の要素は、近傍ピクセルの四角形を表現する数値の2次元配列です。
nodatamodeNODATAまたはNULLとなる近傍ピクセルにおける関数に渡す値を定義します。
'ignore': 近傍で遭遇したNODATA値全てが計算から除外されます。ユーザ定義関数に必ず送られ、ユーザ定義関数が対処方法を決定します。
'NULL': 近傍で遭遇したNODATA値全てが結果をNULLとします。この場合はユーザ定義関数が呼び出されません。
'value': 近傍で遭遇したNODATA値全てが参照ピクセル (近傍の中心にあるピクセル)の値に置き換えられます。この値がNODATAになった場合には、'NULL'と同じ挙動を取ります (影響のある近傍について)。
argsユーザ定義関数に渡される引数です。
Availability: 2.0.0
単一タイルとしてロードされたカトリーナのラスタを使った例です。https://gdal.org/user/drivers/raster/postgisraster.htmlに説明があります。また、ST_Rescaleの例で準備を行っています
単純な'callback'として隣接ピクセルの値を全て平均する関数を使います。
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.
![]() ラスタの1番バンド | ![]() 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 は対象バンドのピクセルタイプを定義します。指定しないバンドは変更されずに返ります。
Availability: 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にそれぞれ変換して再分類します。再分類の識別番号 (理論的には元ラスタと同数のバンド)を入力するために取るVARIADIC reclassarg 引数を使っています。
UPDATE dummy_rast SET reclass_rast =
ST_Reclass(
rast,
ROW(2, '0-87]:1-10, (87-100]:11-15, (101-254]:0-0', '4BUI', NULL)::reclassarg,
ROW(1, '0-253]:1, 254:0', '1BB', NULL)::reclassarg,
ROW(3, '0-70]:1, (70-86:2, [86-150):3, [150-255:4', '4BUI', NULL)::reclassarg
) WHERE rid = 2;
SELECT i as col, j as row, ST_Value(rast, 1, i, j) As ov1, ST_Value(reclass_rast, 1, i, j) As rv1,
ST_Value(rast, 2, i, j) As ov2, ST_Value(reclass_rast, 2, i, j) As rv2,
ST_Value(rast, 3, i, j) As ov3, ST_Value(reclass_rast, 3, i, j) As rv3
FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1, 3) AS j
WHERE rid = 2;col | row | ov1 | rv1 | ov2 | rv2 | ov3 | rv3 ----+-----+-----+-----+-----+-----+-----+----- 1 | 1 | 253 | 1 | 78 | 9 | 70 | 1 2 | 1 | 254 | 0 | 98 | 14 | 86 | 3 3 | 1 | 253 | 1 | 122 | 0 | 100 | 3 1 | 2 | 253 | 1 | 96 | 14 | 80 | 2 2 | 2 | 254 | 0 | 118 | 0 | 108 | 3 3 | 2 | 254 | 0 | 180 | 0 | 162 | 4 1 | 3 | 250 | 1 | 99 | 15 | 90 | 3 2 | 3 | 254 | 0 | 112 | 0 | 108 | 3 3 | 3 | 254 | 0 | 169 | 0 | 175 | 4
Advanced Map a single band 32BF raster to multiple viewable bands.
32BFバンドを一つ持つだけのラスタから三つのバンド (8BUI, 8BUI, 8BUI可視ラスタ)を生成します
ALTER TABLE wind ADD COLUMN rast_view raster;
UPDATE wind
set rast_view = ST_AddBand(
NULL,
ARRAY[
ST_Reclass(rast, 1, '0.1-10]:1-10,9-10]:11,(11-33:0'::text, '8BUI'::text, 0),
ST_Reclass(rast, 1, '11-33):0-255,[0-32:0,(34-1000:0'::text, '8BUI'::text, 0),
ST_Reclass(rast, 1, '0-32]:0,(32-100:100-255'::text, '8BUI'::text, 0)
]
);
ST_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にマップされます。
出力ピクセルタイプのデフォルトは浮動小数点数ですが、 pixeltypeパラメータで指定できます。bandnumberを指定しな場合には、1番を仮定します。
新しいラスターは元ラスターと同じジオリファレンス、同じ幅、同じ高さを持ちます。指定されていないバンドは変更されずに返ります。
Availability: 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);
ラスタタイルの集合を結合して少なくとも一つのバンドからなる単一ラスタを返します。結果ラスタの範囲は集合全体の範囲です。インタセクトする場合には、結果値は、LAST (デフォルト), FIRST, MIN, MAX, COUNT, SUM, MEAN, RANGEのいずれかとなるuniontypeで定義されます。
![]() | |
ラスタを結合するには、全てが同じアラインメントを持たなくてはなりません。ST_SameAlignmentとST_NotSameAlignmentReasonで詳細情報や助けとなる情報が得られます。アラインメント問題を修正する一つの方法として、ST_Resampleを使い、アラインメントの同じ参照ラスタを使います。 |
Availability: 2.0.0
Enhanced: 2.1.0 速度が改善されました (完全にC言語で記述しました)。
Availability: 2.1.0 ST_Union(rast, unionarg)の形式が導入されました。
Enhanced: 2.1.0 ST_Union(rast) (一つ目の形式)で、全ての入力ラスタの全てのバンドを結合するようになりました。以前の版のPostGISでは、一つ目のバンドと仮定していました。
Enhanced: 2.1.0 ST_Union(rast, uniontype) (四つ目の形式)で、全ての入力ラスタの全てのバンドを結合するようになりました。
Reconstitute a single band chunked raster tile.
ラスタータイルの1番バンドから単一のバンドを生成します。元のファイルシステムのタイルを形成します。
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.
ここではラインにインターセクトする全てのタイルを集めたマルチバンドラスターを生成します。2.0では、単一バンドラスターを返します。新しい結合はデフォルトで全てのバンドで動作します。これは 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.
バンドの部分集合が欲しいだけの場合や、バンドの並び順を変更したい場合には、より長い書き方にします。
ラインとインターセクトするタイルの全てを集めたマルチバンドラスターを生成します。
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);
近隣のピクセル値のうち一意となるものを数えます。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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);
近隣のピクセル値の逆距離加重法 (IDW=Inverse Distance Weighted method)による内挿補間を行います。
userargsに渡される、二つの任意引数があります。一つ目は、逆距離加重法の式に与える0から1の間を取る冪数 (下の式の変数k)です。指定しない場合には、デフォルトは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)へのコールバック引数として使用する専用コールバック関数です。 |
Availability: 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);
近隣のピクセル値の最大値を計算します。
二つ目の形式では、userargsに渡す値でNODATAピクセルに代入する値を指定できます。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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);
近隣のピクセル値の平均値を計算します。
二つ目の形式では、userargsに渡す値でNODATAピクセルに代入する値を指定できます。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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);
近隣のピクセル値の最小値を計算します。
二つ目の形式では、userargsに渡す値でNODATAピクセルに代入する値を指定できます。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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)へのコールバック引数として使用する専用コールバック関数です。 |
Availability: 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);
近隣のピクセル値の範囲を計算します。
二つ目の形式では、userargsに渡す値でNODATAピクセルに代入する値を指定できます。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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);
近隣のピクセル値の標準偏差を計算します。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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);
近隣のピクセル値の合計を計算します。
二つ目の形式では、userargsに渡す値でNODATAピクセルに代入する値を指定できます。
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbへのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
二つ目の形式は、ST_MapAlgebra (callback function version)へのコールバック引数として使用する専用コールバック関数です。 |
![]() | |
一つ目の形式は、ST_MapAlgebraFctNgbが2.1.0で非推奨となったので、使用しないようになります。 |
Availability: 2.0.0
Enhanced: 2.1.0 二つ目の形式の追加
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πラジアンの間で、北から時計回りに計ります。
unitsがDEGREESの時、値は0から360度の間で、北から時計回りに計ります。
ピクセルの傾斜角が0の場合には、傾斜方向は-1とします。
![]() | |
傾斜角、傾斜方および陰影起伏に関する詳細情報については、ESRI - How hillshade worksおよびERDAS Field Guide - Aspect Imagesを参照して下さい。 |
Availability: 2.0.0
Enhanced: 2.1.0 ST_MapAlgebra()を使用するようにし、interpolate_nodata任意引数を追加しました。
Changed: 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は鉛直単位と水平単位との比です。フィート:経度緯度ではscale=370400となり、メートル:経度緯度ではscale=111120となります。
interpolate_nodataがTRUEの場合には、入力ラスタのNODATAピクセルの値は陰影図を計算する前にST_InvDistWeight4maを使って内挿を行います。
![]() | |
陰影図に関する詳細情報については How hillshade worksをご覧下さい。 |
Availability: 2.0.0
Enhanced: 2.1.0 ST_MapAlgebra()を使用するようにし、interpolate_nodata任意引数を追加しました。
Changed: 2.1.0 以前の版ではazimuthとaltitudeはラジアン単位で表現しました。現在はazimuthとaltitudeは度単位で表現します。
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の「粗度」を計算したラスタを返します。
Availability: 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は鉛直単位と水平単位との比です。フィート:経度緯度ではscale=370400となり、メートル:経度緯度ではscale=111120となります。
interpolate_nodataがTRUEの場合には、入力ラスタのNODATAピクセルの値は表面傾斜角を計算する前にST_InvDistWeight4maを使って内挿を行います。
![]() | |
傾斜角、傾斜方および陰影起伏に関する詳細情報については、ESRI - How hillshade worksおよびERDAS Field Guide - Slope Imagesを参照して下さい。 |
Availability: 2.0.0
Enhanced: 2.1.0 ST_MapAlgebra()を使用するようにし、units, scale, interpolate_nodata任意引数を追加しました。
Changed: 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 );
地形的位置指数 (TPI=Topographic Position Index)を計算します。地形的位置指数は、半径1における近傍平均値から中心セルの値を引いたものです。
![]() | |
この関数は、近傍平均値半径が1についてのみ対応しています。 |
Availability: 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 );
起伏指標 (TRI=Terrain Ruggedness Index)は、中心ピクセルと隣接ピクセルを、差の絶対値の平均を取って比較することで計算されます。
![]() | |
この関数は、近傍平均値半径が1についてのみ対応しています。 |
Availability: 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 — X値とY値を使用してグリッド上のポイントを配置し、ポイントのZ値をサーフェス標高として配置し、3次元ポイントの入力セットに基づいてグリッドサーフェスを補間します。
raster ST_InterpolateRaster(geometry input_points, text algorithm_options, raster template, integer template_band_num=1);
X値とY値を使用してグリッド上のポイントを配置し、ポイントのZ値をサーフェス標高として配置し、3次元ポイントの入力セットに基づいてグリッドサーフェスを補間します。逆距離、逆距離最近傍、移動平均、最近傍、線形補間の五つの補間アルゴリズムが使用できます。アルゴリズムとそれらのパラメータに関する詳細情報についてはgdal_grid documentationを参照して下さい。どのように補間計算が行われているかの詳細情報についてはGDAL grid tutorialをご覧下さい。
入力パラメータは次の通りです:
input_points補間を駆動するポイント。Z値を持つジオメトリなら全て受け付けられ、全ての入力ポイントが使用されます。
algorithm_optionsアルゴリズムとそのオプションを定義する文字列で、gdal_gridで使われる書式で記述します。たとえば、逆距離補間
template出力ラスタのジオメトリを駆動するためのラスタテンプレート。幅、高さ、ピクセルyサイズ、空間範囲、ピクセルタイプがこのテンプレートから読み込まれます。
template_band_numデフォルトではテンプレートラスタの最初のバンドが出力ラスタの駆動に使われますが、このパラメータで調整できます。
Availability: 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);
与えられたラスタバンドから等高線ベクタを生成します。GDAL等高線生成アルゴリズムを使います。
fixed_levelsパラメータが空でない配列である時、level_intervalとlevel_baseとは無視されます。
入力パラメータは次の通りです:
rast等高線を生成するラスタ
bandnumber等高線を生成するバンド
level_interval生成する等高線の標高間隔
level_base等高線の標高間隔に適用される相対値の「基礎値」です。通常は0ですが、そうでない場合もあります。10m等高線であって、5, 15, 25 ...で等高線を生成する場合には、LEVEL_BASEは5になります。
fixed_levels生成する等高線の標高間隔
polygonizetrue の場合には、等高線ポリゴンが作られます。ラインストリングではありません。
返り値は次に示す属性を持つ行の集合です。
geom等高線のジオメトリ。
idGDALが等高線に与える一意の識別子。
valueラインが表現するラスタ値。標高DEM入力の場合、出力等高線の標高となります。
Availability: 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 — ラスタを囲むボックスのbox3d表現を返します。
box3d Box3D(raster rast);
ラスタの範囲を表現するボックスを返します。
ポリゴンは、バウンディングボックス ((MINX, MINY), (MAXX, MAXY))の4隅のポイントにより定義されます。
Changed: 2.0.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);
NoDataValue値のピクセルを含むラスタの凸包ジオメトリを返します。一般的な形状でスキューのないラスタでは、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))
ラスターにスキューを施しています。凸包とエンベロープでどれぐらい異なるかに注意して下さい。
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=set-returning function)です。geomval行の集合を返します。geomvalはジオメトリ (geom)とピクセルバンド値 (val)からなります。それぞれのポリゴンは、指定したバンドの、valで示される値と同じピクセル値を持っている全てのピクセルの結合です。
ST_DumpAsPolygonはラスタのポリゴン化に使えます。新しい行を生成するのでGROUP BYの逆です。たとえば、単一ラスタを複数のPOLYGON/MULTIPOLYGONに展開できます。
Changed 3.3.0, 能率向上のため評価と修正が無効になりました。不正なジオメトリを返すことがあります。
Changed 3.7.0, PostgreSQLの処理中断を尊重して、キャンセルや手続時間切れによる処理の停止を即座に行うようになりました。
Availability: GDAL 1.7以上が必要です。
![]() | |
バンドにNODATA値が設定されている場合には、exclude_nodata_value=falseが設定されている場合を除いて、NODATA値を持つピクセルは返りません。 |
![]() | |
ラスタ内の与えられた値を持つピクセルの数にのみ注意する場合にはST_ValueCountを使う方が速いです。 |
![]() | |
これは、ピクセル値にかかわらずピクセルごとに一つのジオメトリを返すST_PixelAsPolygonsと違います。 |
この記述ではLATERAL結合を使っています。
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))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の場合には、ラスタの全てのバンドが考慮されます。
Availability: 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 — NODATA値でないピクセル値を持つピクセルの結合で形成されるマルチポリゴンジオメトリを返します。バンドを指定しない場合のデフォルトは1です。
geometry ST_Polygon(raster rast, integer band_num=1);
Changed 3.3.0, 能率向上のため評価と修正が無効になりました。不正なジオメトリを返すことがあります。
Availability: 0.1.6 GDAL 1.7以上が必要です。
Enhanced: 2.1.0 速度を改善し (完全にC言語で記述しました)、確実に妥当なマルチポリゴンを返すようにしました。
Changed: 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);
ラスタ上の個々のセルのうち与えられたジオメトリで覆われている割合を計算します。一つ目の引数はラスタで、計算に使うジオメトリグリッドを定義します。範囲とセルサイズはこのラスタから読みます。二つ目の引数はジオメトリです。グリッドを覆っていて、個々のグリッドの値は、ジオメトリが覆うグリッドに基づいて設定されます。ポリゴンについては、個々のセルについて返される値は、ジオメトリに覆われた領域の割合です。ラインストリングについては、個々のセルから返される値はセルに含まれる長さです。
Availability: 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を返します。TRUEを返します。TRUE を返します。TRUEを返します。倍精度浮動小数点数のバウンディングボックスを使います。TRUEを返します。倍精度浮動小数点数のバウンディングボックスを使います。TRUEを返します。TRUEを返します。倍精度浮動小数点数のバウンディングボックスを使います。&& — AのバウンディングボックスがBのバウンディングボックスとインタセクトする場合にTRUEを返します。
boolean &&( raster A , raster B );
boolean &&( raster A , geometry B );
boolean &&( geometry B , raster A );
&&演算子は、AのバウンディングボックスがBのバウンディングボックスにインタセクトする場合に TRUEを返します。
![]() | |
これのオペランドは、ラスタで使用できるインデックスを使用します。 |
Availability: 2.0.0
SELECT A.rid As a_rid, B.rid As b_rid, A.rast && B.rast As intersect FROM dummy_rast AS A CROSS JOIN dummy_rast AS B LIMIT 3;
a_rid | b_rid | intersect
-------+-------+---------
2 | 2 | t
2 | 3 | f
2 | 1 | f&< — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの左にある場合にTRUEを返します。
boolean &<( raster A , raster B );
&<演算子は、AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの左にある場合にTRUEを返します。条件についてより詳細に言うと、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
&> — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの右にある場合に TRUE を返します。
boolean &>( raster A , raster B );
&>演算子は、AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、Bのバウンディングボックスの右にある場合にTRUEを返します。条件についてより詳細に言うと、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
= — AのバウンディングボックスがBのバウンディングボックスと同じ場合にTRUEを返します。倍精度浮動小数点数のバウンディングボックスを使います。
boolean =( raster A , raster B );
=演算子は、AのバウンディングボックスがBのバウンディングボックスと同じ場合に TRUE を返します。PostgreSQLは内部でラスタの順序決定や比較 (GROUP BY節やORDER BY節など)を行うためにラスタ用として定義している=, <, >演算子を使用します。
![]() | |
これのオペランドは、ラスタで利用できるインデックスを使いません。代わりに~=を使います。この演算子はラスタカラムのGROUP BYに使うのがほとんどです。 |
Availability: 2.1.0
@ — AのバウンディングボックスがBのバウンディングボックスに含まれる場合にTRUEを返します。倍精度浮動小数点数のバウンディングボックスを使います。
boolean @( raster A , raster B );
boolean @( geometry A , raster B );
boolean @( raster B , geometry A );
@は、ラスタまたはジオメトリであるAのバウンディングボックスが、ラスタまたはジオメトリであるBのバウンディングボックスに含まれる場合にTRUEを返します。
![]() | |
これのオペランドは、ラスタのインデックスを使用します。 |
Availability: 2.0.0 raster @ raster, raster @ geometry が導入されました。
Availability: 2.0.5 geometry @ raster が導入されました。
~= — AのバウンディングボックスがBのバウンディングボックスと同じ場合に TRUEを返します。
boolean ~=( raster A , raster B );
~=演算子は、AのバウンディングボックスがBのバウンディングボックスと同じ場合にTRUEを返します。
![]() | |
これのオペランドは、ラスタで使用できるインデックスを使用します。 |
Availability: 2.0.0
大変便利な利用局面として、単一バンドを持つラスタ集合が二つあって、これらは同じデータなのに異なる主題を表現する場合で、これらを取って複数バンドのラスタを生成する局面です。
SELECT ST_AddBand(prec.rast, alt.rast) As new_rast
FROM prec INNER JOIN alt ON (prec.rast ~= alt.rast);
~ — AのバウンディングボックスがBのバウンディングボックスを含む場合にTRUEを返します。倍精度浮動小数点数のバウンディングボックスを使います。
boolean ~( raster A , raster B );
boolean ~( geometry A , raster B );
boolean ~( raster B , geometry A );
~演算子は、ラスタまたはジオメトリであるAのバウンディングボックスがラスタまたはジオメトリであるBのバウンディングボックスを含む場合にTRUEを返します。
![]() | |
これのオペランドは、ラスタのインデックスを使用します。 |
Availability: 2.0.0
ST_Contains — rastAの外にrastBの点が無く、rastAの内部にrastBの内部の点が一つ以上ある場合にTRUEを返します。
boolean ST_Contains( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Contains( raster rastA , raster rastB );
rastAの外にrastBの点が無く、rastAの内部にrastBの内部の点が一つ以上ある場合に限って、rastAはrastBを包含しています。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_Contains(ST_Polygon(raster), geometry)またはST_Contains(geometry, ST_Polygon(raster))というふうに、ラスタにST_Polygonを使います。 |
![]() | |
ST_Contains()はST_Within()の逆です。ST_Contains(rastA, rastB)はST_Within(rastB, rastA)を示します。 |
Availability: 2.1.0
バンド番号を指定した場合。
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
バンド番号を指定しなかった場合。
SELECT r1.rid, r2.rid, ST_Contains(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 1;
rid | rid | st_contains -----+-----+------------- 1 | 1 | t 1 | 2 | f
ST_ContainsProperly — rastBがrastAの内部でインタセクトし、かつrastAの境界とも外部ともインタセクトしない場合にTRUEを返します。
boolean ST_ContainsProperly( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_ContainsProperly( raster rastA , raster rastB );
rastBがrastAの内部でインタセクトし、かつrastAの境界とも外部ともインタセクトしない場合には、rastAはrastBに対してContainsProperly (確実に包含している)です。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
rastAは自身にはContainsProperlyではありませんが、Containsです。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_ContainsProperly(ST_Polygon(raster), geometry)またはST_ContainsProperly(geometry, ST_Polygon(raster))というふうに、ラスタにST_Polygonを使います。 |
Availability: 2.1.0
SELECT r1.rid, r2.rid, ST_ContainsProperly(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_containsproperly -----+-----+--------------------- 2 | 1 | f 2 | 2 | f
ST_Covers — rastBがrastAの外部に点を持たない場合にTRUEを返します。
boolean ST_Covers( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Covers( raster rastA , raster rastB );
rastAの外部にrastBの点が無い場合には、rastAはrastBに対してCoversです。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_Covers(ST_Polygon(raster), geometry)またはST_Covers(geometry, ST_Polygon(raster))というふうに、ラスタにST_Polygonを使います。 |
Availability: 2.1.0
SELECT r1.rid, r2.rid, ST_Covers(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_covers -----+-----+----------- 2 | 1 | f 2 | 2 | t
ST_CoveredBy — rastAがrastBの外部に点を持たない場合にTRUEを返します。
boolean ST_CoveredBy( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_CoveredBy( raster rastA , raster rastB );
rastAがrastBの外部に点を持たない場合には、rastAはrastBに対してCoveredByです。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_CoveredBy(ST_Polygon(raster), geometry)またはST_CoveredBy(geometry, ST_Polygon(raster))というふうに、ラスタにST_Polygonを使います。 |
Availability: 2.1.0
SELECT r1.rid, r2.rid, ST_CoveredBy(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_coveredby -----+-----+-------------- 2 | 1 | f 2 | 2 | t
ST_Disjoint — rastAがrastBとインタセクトしない場合にTRUEを返します。
boolean ST_Disjoint( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Disjoint( raster rastA , raster rastB );
rastAがrastBとインタセクトしない場合には、rastAとrastBはDisjointです。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はインデックスを*使いません*。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_Disjoint(ST_Polygon(raster), geometry)というふうに、ラスタにST_Polygonを使います。 |
Availability: 2.1.0
Rid = 1 にバンドが無く、したがってST_DisjointはNOTICEを出してNULL値を返します。
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
今度はバンド番号の指定をしません。
SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_disjoint -----+-----+------------- 2 | 1 | t 2 | 2 | f
ST_Intersects — rastAがrastBとインタセクトする場合にTRUEを返します。
boolean ST_Intersects( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Intersects( raster rastA , raster rastB );
boolean ST_Intersects( raster rast , integer nband , geometry geommin );
boolean ST_Intersects( raster rast , geometry geommin , integer nband=NULL );
boolean ST_Intersects( geometry geommin , raster rast , integer nband=NULL );
rastAがrastBとインタセクトする場合にTRUEを返します。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
Enhanced: 2.0.0 ラスタ/ラスタのインタセクト対応が導入されました。
![]() | |
Changed: 2.1.0 ST_Intersects(raster, geometry)形式の挙動が ST_Intersects(geometry, raster)とあうように変更されました。 |
同じラスターの異なるバンド。
SELECT ST_Intersects(rast, 2, rast, 3) FROM dummy_rast WHERE rid = 2;
t
ST_Overlaps — rastAとrastBがインタセクトして、かつ一方がもう一方に完全には包含されない場合にはTRUEを返します。
boolean ST_Overlaps( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Overlaps( raster rastA , raster rastB );
rastAがrastBをオーバラップする場合にTRUEを返します。rastAとrastBがインタセクトして、かつ一方がもう一方に完全には包含されない場合にはいう意味です。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_Overlaps(ST_Polygon(raster), geometry)というふうに、ラスタにST_Polygonを使います。 |
Availability: 2.1.0
同じラスターの異なるバンドの比較です。
SELECT ST_Overlaps(rast, 1, rast, 2) FROM dummy_rast WHERE rid = 2;
f
ST_Touches — rastAとrastBが少なくとも一つの共通の点を持ち、かつ二つのラスタの内部同士がインタセクトしない場合にTRUEを返します。
boolean ST_Touches( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Touches( raster rastA , raster rastB );
rastAがrastBに接触する場合にTRUEを返します。rastAとrastBが少なくとも一つの共通の点を持ち、かつ二つのラスタの内部同士がインタセクトしないという意味です。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
この関数はラスタで利用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_Touches(ST_Polygon(raster), geometry)というふうに、ラスタにST_Polygonを使います。 |
Availability: 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 );
非集計版 (一つ目と二つ目の形式): 二つのラスタ (直接与えたラスタでも左上隅、スケール、スキュー、SRIDを使って作ったものでも)が同じスキュー、スケール、空間参照系、を持ち、少なくとも4隅の一つがもう一方のラスタのグリッド隅に落ちる場合にTRUEを返します。そうでない場合には、問題に言及した警告を出します。
集約関数版 (三つ目の形式): ラスタ集合から、全てのラスタが同じアラインメントを持つ場合にTRUEを返します。ST_SameAlignment()関数はPostgreSQLの用語で言うところの「集約」関数です。SUM()やAVG()といった複数のデータ行での操作を意味します。
Availability: 2.0.0
Enhanced: 2.1.0 集約関数版の追加
SELECT ST_SameAlignment(ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0)
) as sm;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);
ラスタが同じアラインメントを持つかどうか、また、持たない場合にはその理由を示す文字列を返します。
![]() | |
ラスタが同じアラインメントを持たない理由が複数ある場合には、一つだけ (最初のテストで失敗した)理由を返します。 |
Availability: 2.1.0
SELECT
ST_SameAlignment(ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0)
),
ST_NotSameAlignmentReason(ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0)
)
;st_samealignment | st_notsamealignmentreason ------------------+------------------------------------------------- f | The rasters have different scales on the X axis (1 row)
ST_Within — rastAがrastBの外部に点を持たず、rastAの内部の少なくとも一つの点がrastBの内部にある場合にTRUEを返します。
boolean ST_Within( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Within( raster rastA , raster rastB );
rastAがrastBの外部に点を持たず、rastAの内部の少なくとも一つの点がrastBの内部にある場合にrastAはrastBに対してWithinです。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
![]() | |
これのオペランドは、ラスタで使用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_Within(ST_Polygon(raster), geometry)またはST_Within(geometry, ST_Polygon(raster))というふうに、ラスタにST_Polygonを使います。 |
![]() | |
ST_Within()はST_Contains()の逆です。ST_Within(rastA, rastB)はST_Contains(rastB, rastA)を示します。 |
Availability: 2.1.0
SELECT r1.rid, r2.rid, ST_Within(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_within -----+-----+----------- 2 | 1 | f 2 | 2 | t
ST_DWithin — rastAとrastBが指定した距離内にある場合にTRUEを返します。
boolean ST_DWithin( raster rastA , integer nbandA , raster rastB , integer nbandB , double precision distance_of_srid );
boolean ST_DWithin( raster rastA , raster rastB , double precision distance_of_srid );
rastAとrastBが指定した距離内にある場合にTRUEを返します。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
distanceはラスタの空間参照系で定義される単位です。この関数が意味あるものにするには、元のラスタが両方とも同じ空間参照系である、つまり同じSRIDを持たなければなりません。
![]() | |
これのオペランドは、ラスタで使用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_DWithin(ST_Polygon(raster), geometry)というふうに、ラスタにST_Polygonを使います。 |
Availability: 2.1.0
SELECT r1.rid, r2.rid, ST_DWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1 CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;
rid | rid | st_dwithin -----+-----+------------ 2 | 1 | f 2 | 2 | t
ST_DFullyWithin — rastAとrastBが指定した距離内に完全に収まる場合にTRUEを返します。
boolean ST_DFullyWithin( raster rastA , integer nbandA , raster rastB , integer nbandB , double precision distance_of_srid );
boolean ST_DFullyWithin( raster rastA , raster rastB , double precision distance_of_srid );
rastAとrastBが指定した距離内に完全に収まる場合にTRUEを返します。バンド番号が指定されていないかNULLに指定されている場合には、ラスタの凸包のみを考慮してテストします。バンド番号が指定されている場合には、値を持つ (NODATAでない)ピクセルについてテストします。
distanceはラスタの空間参照系で定義される単位です。この関数が意味あるものにするには、元のラスタが両方とも同じ空間参照系である、つまり同じSRIDを持たなければなりません。
![]() | |
これのオペランドは、ラスタで使用できるインデックスを使用します。 |
![]() | |
ラスタとジオメトリの空間関係をテストするには、ST_DFullyWithin(ST_Polygon(raster), geometry)というふうに、ラスタにST_Polygonを使います。 |
Availability: 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ラスタに関連する様々な落とし穴や技法について説明します。
GDALはファイルを開く時に、そのファイルのディレクトリを熱心にスキャンして、他のファイルのカタログを構築します。このディレクトリに多数のファイル (千とか万とか)あるとします。一つのファイルを開くと動作が非常に遅くなります (特にNFSのようなネットワークドライブの場合)。
この振る舞いを制御するために、GDALにはGDAL_DISABLE_READDIR_ON_OPENという環境変数があります。GDAL_DISABLE_READDIR_ON_OPENをTRUEに設定すると、ディレクトリのスキャンを無効にします。
Ubuntuでは (Ubuntu用PostgreSQLのパッケージを使っていると仮定します)、GDAL_DISABLE_READDIR_ON_OPENが/etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment内で設定できます (POSTGRESQL_VERSIONは9.6等のPostgreSQLのバージョンで、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ファイルです)。システムは人間のユーザが使用するという仮定に立っているからです。データベース外ラスタは、一つの妥当なクエリで簡単に制限超過させることができます (例えば、10年分のラスタからなるデータセットで、個々のラスタは日別最低気温、最大気温を持っていて、データセット内の最大値と最小値を得たい場合などです)。
最も簡単な変更方法は、PostgreSQL設定max_files_per_processです。デフォルトとして1000が設定されていますが、データベース外ラスタとしては非常に低い値です。安全な開始値は65536でしょう。ただし、実際には、これはデータベースとデータベースに対して実行されるクエリに依存します。サーバ開始時のみ、かつPostgreSQLコンフィギュレーションファイル (例: Ubuntu環境では/etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/postgresql.conf)内のみで設定できます。
...
# - Kernel Resource Usage -
max_files_per_process = 65536 # min 25
# (change requires restart)
...
主な変更はLinuxカーネルのファイルを開く制限です。次の通り、二つに分かれます:
システム全体で開くことができるファイルの最大数
プロセスごとに開くことができるファイルの最大数
次の例で、システム全体の、現在の開くことができるファイルの最大値を調べることができます:
$ sysctl -a | grep fs.file-max
fs.file-max = 131072
返された値が十分には大きくない場合には、次に示す例に従って、/etc/sysctl.d/にファイルを追加します。
$ echo "fs.file-max = 6145324" >> /etc/sysctl.d/fs.conf
$ cat /etc/sysctl.d/fs.conf
fs.file-max = 6145324
$ sysctl -p --system
* Applying /etc/sysctl.d/fs.conf ...
fs.file-max = 2097152
* Applying /etc/sysctl.conf ...
$ sysctl -a | grep fs.file-max
fs.file-max = 6145324
PostgreSQLのサーバプロセスごとに開けるファイルの最大数を増やす必要があります。
現在のPostgreSQLサービスのプロセスは開くことができるファイルの最大数を使っていて、次の例のようになっています (PostgreSQLが実行されていることを確認して下さい)。
$ ps aux | grep postgres
postgres 31713 0.0 0.4 179012 17564 pts/0 S Dec26 0:03 /home/dustymugs/devel/postgresql/sandbox/10/usr/local/bin/postgres -D /home/dustymugs/devel/postgresql/sandbox/10/pgdata postgres 31716 0.0 0.8 179776 33632 ? Ss Dec26 0:01 postgres: checkpointer process postgres 31717 0.0 0.2 179144 9416 ? Ss Dec26 0:05 postgres: writer process postgres 31718 0.0 0.2 179012 8708 ? Ss Dec26 0:06 postgres: wal writer process postgres 31719 0.0 0.1 179568 7252 ? Ss Dec26 0:03 postgres: autovacuum launcher process postgres 31720 0.0 0.1 34228 4124 ? Ss Dec26 0:09 postgres: stats collector process postgres 31721 0.0 0.1 179308 6052 ? Ss Dec26 0:00 postgres: bgworker: logical replication launcher
$ cat /proc/31718/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 15738 15738 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 15738 15738 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
上の例では、プロセスに対する開くことができるファイルの制限が31718になっています。どのプロセスがどうするかは問題ではありません。関心を持っている応答はMax open filesです。
Max open filesのSoft LimitとHard LimitをPostgreSQLの設定で指定したmax_files_per_processよりも多くなるようにしたいと思っています。この例では、max_files_per_processを65536にしています。
Ubuntu (かつ、Ubuntu用PostgreSQLパッケージを使用しているものとします)では、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)
...
Ubuntuのsystemdを扱います。LimitNOFILE=131072を/lib/systemd/system/postgresql*.serviceの各ファイルの[Service]セクション内に記述します。
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
必要なシステムの変更を行った後、デーモンのリロードを必ず行ってください。
systemctl daemon-reload
本章では、PostGISのソースアーカイブとソースレポジトリのextrasフォルダにある機能を記述します。 これらは必ずPostGISバイナリ版に同梱されているものではありませんが、通常は実行可能なPL/pgSQLベースのものまたは標準的なシェルスクリプトです。
次に示す関数は、PostGISが提供する空間集約関数です。sumやaverageといった他のSQL集約関数のように使います。
次に示す関数は、PostGISが提供する空間ウィンドウ関数です。row_number(), lead(), lag()等のような他のSQLウィンドウ関数のように使います。全ての関数で、SQLのOVER()句が必要です。
次に示す関数は、SQL/MM 3標準に準拠したPostGIS関数です。
次に示す関数と演算子は、ジオグラフィデータ型を入力または出力に取るPostGIS関数/演算子です。
![]() | |
(T)の付いた関数はネイティブなジオグラフィ関数ではなく、実行時にST_Transformを使ってジオメトリとの変換を行います。結果として、日付変更線や極を超えたり、ひとつのUTMゾーンではカバーできない巨大なジオメトリを使用する場合に、予期しない挙動になることがあります。基本的な変換としては、UTMが望ましいですが、ランベルト正積方位図法(北/南)、最悪のシナリオでメルカトルに頼ります。 |
次に示す関数と演算子は、rasterデータ型を入力または出力に取るPostGIS関数/演算子です。アルファベット順に示します。
次に示す関数は、geometry_dumpまたはgeomvalデータ型の集合または単一データを入力または出力に取るPostGIS関数です。
次に示す関数は、PostGIS空間型のbox系の型を入力または出力に取るPostGIS関数です。ボックス系にはbox2dとbox3dがあります。
次に示す関数は、Zインデックスを放り出さないPostGIS関数です。
次に示す関数は、CIRCULARSTRING, CURVEDPOLYGON等の曲線ジオメトリ型が使えるPostGIS関数です。
次に示す関数は、POLYHEDRALSURFACE, POLYHEDRALSURFACEMジオメトリが使えるPostGIS関数です。
次に示す表は、アルファベット順に並べたPostGIS空間関数と、動作する空間タイプの種類、対応しようとしているOGC/SQL準拠を示しています。
は、ネイティブで、その型と派生型とに対応しています。
は、動作しますが、ジオメトリにキャストして「最善のSRID」に投影変換したうえでジオグラフィに戻す、組み込み変換キャストを使います。大きな面積の領域や、極にある領域については、予期しない結果になることがありますし、浮動小数点数のごみを蓄積することがあります。
は、直接的な対応でなくbox3dへの変換といった他からの自動キャストで動作します。
は、PostGISをSFCGAL対応でコンパイルした場合にのみ利用可能な関数です。
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.7 で新規作成された関数
PostGIS 3.7 で機能強化された関数
PostGIS 3.7 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.6 で新規作成された関数
PostGIS 3.6 で機能強化された関数
PostGIS 3.6 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.5 で新規作成された関数
PostGIS 3.5 で機能強化された関数
PostGIS 3.5 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.4 で新規作成された関数
PostGIS 3.4 で機能強化された関数
PostGIS 3.4 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.3 で新規作成された関数
PostGIS 3.3 で機能強化された関数
PostGIS 3.3 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.2 で新規作成された関数
PostGIS 3.2 で機能強化された関数
PostGIS 3.2 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.1 で新規作成された関数
PostGIS 3.1 で機能強化された関数
PostGIS 3.1 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 3.0 で新規作成された関数
PostGIS 3.0 で機能強化された関数
PostGIS 3.0 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 2.5 で新規作成された関数
PostGIS 2.5 で機能強化された関数
PostGIS 2.5 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 2.4 で新規作成された関数
PostGIS 2.4 で機能強化された関数
PostGIS 2.4 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 2.3 で新規作成された関数
PostGIS 2.3 で機能強化された関数
PostGIS 2.3 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 2.2 で新規作成された関数
PostGIS 2.2 で機能強化された関数
PostGIS 2.2 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 2.1 で新規作成された関数
PostGIS 2.1 で機能強化された関数
PostGIS 2.1 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 2.0 で新規作成された関数
PostGIS 2.0 で機能強化された関数
PostGIS 2.0 で変更された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 1.5 で新規作成された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 1.4 で新規作成された関数
次に示す関数は、新規作成または機能強化されたPostGIS関数です。
PostGIS 1.3 で新規作成された関数
効率的なバグの報告はPostGISの開発を助ける本質的な方法です。最も効率的なバグ報告は、PostGIS開発者がそれを再現できるようにすることで、それの引き金となったスクリプトと検出された環境に沿った全ての情報を含んでいるのが理想です。SELECT postgis_full_version() [PostGIS]とSELECT version() [PostgreSQL]とを実行することで十分に良い情報を得ることができます。
最新版を使っていない場合にはrelease changelogをまず見て、既にバグフィクスされていないかを探すのは価値のあることです。
PostGIS bug trackerを使うと、レポートが捨てられず、それの対応プロセスが通知されることを保証します。新しいバグを報告する前にデータベースに問い合わせて、既知のバグかどうかを見て下さい。既知のものでしたら、それに関して持っているあらゆる新しい情報を追加して下さい。
新しいレポートを記入する前にSimon TathamさんのHow to Report Bugs Effectivelyに関するページを読むと良いでしょう。
文書は、ソフトウェアの機能と挙動を正確に反映するべきものです。正確でない場合は、ソフトウェアのバグがあるか、または文書に誤り若しくは不十分な箇所があることが考えられます。
文書の問題もPostGIS bug trackerに報告することができます。
訂正が小さいものなら、バグトラッカの新しい問題の中に、文書内の位置を特定して記述して下さい。
変更が大きい場合は、パッチが確実に好まれます。Unix上で次の4ステップの処理を行います (既にgitをインストールしていると仮定します)。
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.
PostGISのgitリポジトリを複製します。UNIXでは次のように入力します。
git clone https://git.osgeo.org/gitea/postgis/postgis.git
これでpostgisディレクトリに格納されます
お使いのテキストエディタで文書に変更を加えます。Unixでは、たとえば次のようにします。
vim doc/postgis.xml
文書はHTMLでなくDocBook XMLで書かれていますので、慣れていないなら、残りの文書の例にならって下さい。
文書のマスタコピーからパッチファイルを作成します。Unixでは次のように入力します。
git diff doc/postgis.xml > doc.patch
バグトラッカ内の新しい問題にパッチが取り付けられます。
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.
このバージョンではGEOS 3.10以上、PostgreSQL 14-19beta1、Proj 6.1以上、libgmpが必要です。PostGISエクステンションの全ての機能を活用するには、GEOS 3.15以上が必要です。全てのpostgis_sfcgal エクステンションの機能を活用するにはSFCGAL 2.3以上が必要です。
#5688, [topology] トポロジー構築関数が許容値0 (以前のデフォルト値)を実際の0にして、-1 (新しいデフォルト値)が「トポロジーの精度」にするようにしました (Sandro Santilliさん)
#6024, PostgreSQL 12と13とへの対応を削除 (Regina Obeさん)
#6040, ST_GeoHashとST_GeomFromGeoHashとの往復 (Paul Ramseyさん)
#6053, [address_standardizer] エクステンションの削除とhttps://github.com/postgis/address_standardizerへの移動 (Paul Ramseyさん)
#6052, [tiger_geocoder] エクステンションの削除とhttps://git.osgeo.org/postgis/postgis_tiger_geocoderへの移動 (Regina Obeさん)
#6079, GEOS < 3.10対応を削除 (Sandro Santilliさん)
#1793, 集約関数ST_MemCollectを削除 (Darafei Praliaskouskiさん)
GH-848, CG_AlphaShapeはマルチポリゴンを返すようになりました (Jean Felderさん)
#1124, #2935, #3033, #4658, #4659, [loader] ローダー引数の手直し: shp2pgsqlはUNLOGGEDテーブルを作ることができ、地物IDカラム名を選択することができます。shp2pgsql --drop-tableは準備より前にDROP TABLEを吐くことができます。raster2pgsql/shp2pgsqlはローダーのどうさタイプを長いオプション名で指定できます。両方のローダー共に既存オプションの長い別名を受け付けることができます。また、
-if-not-existsでべき等アクションを生成します (Darafei Praliaskouskiさん)
#4208, ST_MaxDistanceとST_LongestLineにおいて単一ジオメトリーに対応する形式を追加しました。
[topology] FindVertexSegmentPairsBelowDistance関数 (Sandro Santilliさん)
ポリゴンカバレッジの明確にエッジを共有しているマルチラインストリングを返すST_CoverageEdges (Paul Ramseyさん)
最小接続木を計算するウィンドウ関数ST_MinimumSpanningTree (Paul Ramseyさん)
#5993, [topology] TopoGeo_AddLinestringへのmax_edgesパラメーターの追加 (Sandro Santilliさん)
#6001, ST_MakeLineのマルチラインストリング対応 (Paul Ramseyさん)
#2858, ST_MMinとST_MMax (Paul Ramseyさん)
#5941, [raster] GDALピクセルタイプGDT_Float16対応 (Darafei Praliaskouskiさん)
#5992, トポロジーでのエッジ分割の繰返しでのGiSTインデックス最適化 (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の曲線リング対応 (Darafei Praliaskouskiさん)
GT-270, NURBS曲線の追加 (Loïc Bartolettiさん)
#2863, 次元補助ST_XSize, ST_YSize, ST_ZSize, ST_MSizeの追加 (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)