PostGISは、オブジェクトRDBであるPostgreSQLの拡張で、GIS (地理情報システム)オブジェクトを格納することができます。PostGISは、GiSTベースのR木空間インデクスをサポートし、GISオブジェクトの解析および処理を行う機能を持ちます。
本マニュアルは、3.5.1dev版のマニュアルです。
この作品はクリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています。好きなようにこの材料を使うことができますが、PostGIS Project のクレジット提示を求めます。また可能な限りhttp://postgis.netへのリンクを求めます。
PostGISは、PostgreSQLリレーショナルデータベースの空間拡張です。Refractions Research Incが、空間データベース技術の研究プロジェクトとして作成しました。Refractionsはカナダ・ブリティッシュコロンビア州・ビクトリアにある、データインテグレーションとカスタムソフトウェア開発に特化した、GISとデータベースのコンサルティング会社です。
PostGISは、現在ではOSGeo財団のプロジェクトです。多数のFOSS4G開発者とPostGISの機能と多彩さから大きな利益を得る世界中の企業が、PostGISの開発と資金提供を行っています。
PostGISプロジェクトの開発グループは、PostGISが、OGCとSQL/MM空間標準の領域における重要なGIS機能、高度なトポロジ構築 (カバレッジ、サーフェス、ネットワーク)、GISデータの表示と編集を行うデスクトップユーザインタフェースツールのデータソース、およびウェブベースのアクセスツールのためのデータソースに、より良く対応するよう、サポートと機能強化を行う予定です。
PostGISプロジェクト運営委員会 (PostGIS Project Steering Committee, PSC)は、総合的な指示、リリースサイクル、ドキュメンテーション、支援活動に関する調整を行っています。また、委員会は、全体的なユーザサポート、PostGISコミュニティからのパッチの受け付けと適用、 開発者のコミットのアクセス、新しい委員、APIの重要な変更といった、PostGISを含む雑多な問題に関する投票を行っています。
MVT機能、誤り修正、パフォーマンスと安定性の向上、GitHubキュレーション、PostGISとPostgreSQLのリリースの調整
継続的インテグレーションとウェブサイトのメンテナンス、Windows版と試験版のビルド、ドキュメンテーション、PostgreSQLとの調整、X3D対応、Tiger Geocoder機能、関数管理。
インデックス改善、誤り修正とジオメトリ/ジオグラフィ関数の改善、SFCGAL、ラスタ、GitHubキュレーション、継続的インテグレーション対応。
PostGISプロジェクトの副創始者。総合的なバグフィクス、ジオグラフィ機能、ジオグラフィとジオメトリのインデックス機能 (2次元,、3次元、n次元インデクスとあらゆる空間インデクス)、ジオメトリ内部構造、GEOS機能の統合とGEOSリリースとの調整、PostgreSQLのリリースとの調整、ローダ/ダンパ、シェープファイルGUIローダ。
誤り修正とメンテナンス、継続的インテグレーション対応、gitミラーの管理、関数管理、GEOSの新機能の統合、GEOSリリースとの調整、トポロジ機能、ラスタフレームワークと低水準API関数。
距離関数の強化 (3次元距離、関係関数を含む)と追加、Tiny WKB出力書式(TWKB)と一般的なユーザサポート。
SFCGAL機能強化とメインテナンスと継続的インテグレーション対応
ジオメトリクラスタリング関数の追加、他のジオメトリアルゴリズムの強化、GEOSの強化、および全体のユーザ対応
GEOS機能強化と文書
MapBoxベクタタイル関数、GeoBuf関数、Flatgeobuf 関数。Giteaの試験とGitLabの実験。
ジオメトリ処理、PostgreSQL GiST、共通部の誤り修正
以前のPSCメンバ。ラスタ開あh津、GDALとの統合、ラスタローダ、ユーザ対応、共通部の誤り修正、様々なOS (Slackware、Mac、Windows等多数)での試験
以前のPSCメンバ。誤り修正とメンテナンスの活動、空間インデックス選択性とバインディング、ローダ/ダンパ、およびシェープファイルGUIローダの調整、新機能の統合と強化。
ラスタ開発、GDALドライバ機能、ローダ。
(名誉) XML (KML, GML)/GeoJSON入出力関数と3次元対応と誤り修正。
以前のPSCメンバ。一般的な開発、サイトとBuildbotのメンテナンス、OSGeoインキュベーション管理。
CMakeのPostGISへの対応、Python版のオリジナルのラスタローダと低級ラスタAPI関数の構築。
以前のPSCメンバ。文書と文書補助ツール、Buildbotのメンテナンス、PostGISニュースグループでの高度なユーザサポート、PostGISメンテナンス機能の強化。
PostGISのオリジナルの開発/副創始者。サーバサイドのオブジェクト、インデクスのバインディングや多数のサーバサイドの解析機能を記述。
シェープファイルのローダ/ダンパのオリジナル開発者。
中核機能の、継続的なメンテナンスと開発。曲線機能の強化。シェープファイルGUIローダ。
PostGISラスタ実装の設計。ラスタ全体のアーキテクチャ、プロトタイプ作成、プログラミング補助
ラスタ開発 (ほとんど地図代数解析関数)。
Alex Bodnaru | Gino Lucrezi | Maxime Guillaud |
Alex Mayrhofer | Greg Troxel | Maxime van Noppen |
Andrea Peri | Guillaume Lelarge | Maxime Schoemans |
Andreas Forø Tollefsen | Giuseppe Broccolo | Michael Fuhr |
Andreas Neumann | Han Wang | Mike Toews |
Andrew Gierth | Hans Lemuet | Nathan Wagner |
Anne Ghisla | Haribabu Kommi | Nathaniel Clay |
Antoine Bajolet | Havard Tveite | Nikita Shulga |
Arthur Lesuisse | IIDA Tetsushi | Norman Vine |
Artur Zakirov | Ingvild Nystuen | Patricia Tozer |
Barbara Phillipot | Jackie Leng | Rafal Magda |
Ben Jubb | James Addison | Ralph Mason |
Bernhard Reiter | James Marca | Rémi Cura |
Björn Esser | Jan Katins | Richard Greenwood |
Brian Hamlin | Jan Tojnar | Robert Coup |
Bruce Rindahl | Jason Smith | Roger Crew |
Bruno Wolff III | Jeff Adams | Ron Mayer |
Bryce L. Nordgren | Jelte Fennema | Sam Peters |
Carl Anderson | Jim Jones | Sebastiaan Couwenberg |
Charlie Savage | Joe Conway | Sergei Shoulbakov |
Chris Mayo | Jonne Savolainen | Sergey Fedoseev |
Christian Schroeder | Jose Carlos Martinez Llari | Shinichi Sugiyama |
Christoph Berg | Jörg Habenicht | Shoaib Burq |
Christoph Moench-Tegeder | Julien Rouhaud | Silvio Grosso |
Dane Springmeyer | Kashif Rasul | Stefan Corneliu Petrea |
Dapeng Wang | Klaus Foerster | Steffen Macke |
Daryl Herzmann | Kris Jurka | Stepan Kuzmin |
Dave Fuhry | Laurenz Albe | Stephen Frost |
David Garnier | Lars Roessiger | Steven Ottens |
David Skea | Leo Hsu | Talha Rizwan |
David Techer | Loic Dachary | Teramoto Ikuhiro |
Dian M Fay | Luca S. Percich | Tom Glancy |
Dmitry Vasilyev | Lucas C. Villa Real | Tom van Tilburg |
Eduin Carrillo | Maria Arias de Reyna | Victor Collod |
Esteban Zimanyi | Marc Ducobu | Vincent Bre |
Eugene Antimirov | Mark Sondheim | Vincent Mora |
Even Rouault | Markus Schaber | Vincent Picavet |
Florian Weimer | Markus Wanner | Volf Tomáš |
Frank Warmerdam | Matt Amos | Zuo Chenwei |
George Silva | Matt Bretl | |
Gerald Fenoy | Matthias Bay |
これらは、PostGISプロジェクトに開発者の時間、ホスティング、または直接の資金提供のいずれかの貢献をした企業です。アルファベット順:
クラウドファンディングキャンペーンは、PostGIS開発チームが走らせているキャンペーンです。欲しくて仕方ない機能に資金を与えて、多数の人々にサービスを提供できるようにするためのものです。それぞれのキャンペーンでは、特定の機能または機能の集合に焦点があてられます。それぞれのスポンサーは、必要な資金提供のうち少しだけを提供し、十分な人/組織の寄付で、たくさんの助けになる作業に支払う基金を持ちます。他の多くの人が寄付に協力してくれそうな機能に関するアイデアがありましたら、PostGIS newsgroupに、その考えを投稿して下さい。一緒に実現できます。
PostGIS 2.0.0はこの戦略を実施する最初のリリースです。PledgeBankを使い、2件のキャンペーンが成功しました。
postgistopology - 10以上のスポンサーがTopoGeometry機能の構築と2.0.0でのトポロジ対応強化とのために、それぞれ250米ドルを寄付しました。
postgis64windows - 20のスポンサーが、Windows上でのPostGIS 64ビット版に必要な作業のために、それぞれ100米ドルを寄付しました。
ジオメトリ演算ライブラ GEOS
地理空間データ抽象化ライブラリGDALは、PostGIS 2で導入されたラスタ機能の多くに使われています。また、GDALのPostGIS対応に必要な改善でGDALプロジェクトに貢献しています。
地図投影ライブラリPROJ
最後ですがおろそかにできないのがPostgreSQLです。PostGISはこの巨人に立っています。PostGISの速度と柔軟性は、PostgreSQLが提供する拡張性、優れたクエリプランナ、GiSTインデックス、多数のSQL機能があって初めて成り立ちます。
本章では、PostGISのインストールに必要な手順について説明します。
全ての依存がパスに入っているとする場合、次のようにコンパイルします。
tar -xvzf postgis-3.5.1dev.tar.gz cd postgis-3.5.1dev ./configure make make install
PostGISをインストールした後は、利用したいデータベース個々内で利用可能にする (Section 3.3, “空間データベースの作成”)か、アップグレード (Section 3.4, “空間データベースのアップグレード”)する必要があります。
多くの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.5.1devでは、コンパイルのために、完全なPostgreSQLサーバヘッダが必要です。PostgreSQL 12 - 17の間でビルドできます。古い版のPostgreSQLはサポートされません。
PostgreSQLをインストールしていないならPostgreSQLインストールガイドを参照して下さい。http://www.postgresql.org/にあります。
GEOS機能を有効にするために、PostgreSQLをインストール時に明示的に標準C++ライブラリに対する明示的なリンクが必要になる場合があります。 LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE] これは、古い開発ツールとインチキC++例外との対話のための応急処置です。怪しい問題 (望んでいないのにバックエンドが閉じたりそれに近い挙動を起こす)を経験したなら、このトリックを試してみて下さい。もちろん、これを行うにはPostgreSQLをはじめからコンパイルし直す必要があります。 |
次のステップでは、PostGISソースのコンフィギュレーションとコンパイルに概要を記述します。これらは、Linuxユーザ用に書いてありますので、WindowsやMacでは動作しません。
ダウンロードサイト https://postgis.net/stuff/postgis-3.5.1dev.tar.gz からソースのアーカイブを入手します。
wget https://postgis.net/stuff/postgis-3.5.1dev.tar.gz tar -xvzf postgis-3.5.1dev.tar.gz cd postgis-3.5.1dev
これで、カレントディレクトリの下にpostgis-3.5.1dev
ができます。
もしくは 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 12 - 17。PostgreSQLの完全なインストール (サーバヘッダを含む)が必要です。PostgreSQLは http://www.postgresql.org/にあります。
完全なPosgreSQL/PostGIS対応表とPostGIS/GEOS対応表についてはhttp://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGISをご覧ください。
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.12以上が必要です。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/からダウンロード可能です。
GDAL バージョン3以上が推奨されます。ラスタ機能に必要です。https://gdal.org/download.htmlにあります。
PostgreSQL+JITでコンパイルする場合には、LLVM 6版以上が必要です。https://trac.osgeo.org/postgis/ticket/4125を参照して下さい。
オプション
GDAL (擬似的任意)。ラスタが必要ない場合に限り不要です。Section 3.2, “ラスタ機能の設定”の説明に従って使用したいドライバを有効にしてください。
GTK (GTK+2.0, 2.8+が必要)。シェープファイルのローダであるshp2pgsql-guiのコンパイル用です。http://www.gtk.org/にあります。
SFCGAL 1.4.1 以上が必要ですが、全ての機能を使用できるようにするためには、1.5.0以上が必要です。SFCGALは、Chapter 8, SFCGAL 関数リファレンスのような、追加の2次元、3次元の高度な解析機能をPostGISに提供するために使います。また、両方のバックエンドから提供されている2次元関数 (ST_IntersectionやST_Areaなど)に、GEOSでなくSFCGALを使用することができるようになります。PostgreSQLのコンフィギュレーション変数であるpostgis.backend
によって、SFCGALがインストールされている場合にエンドユーザがどのバックエンドを使うかを制御することができるようになります (デフォルトはGEOS)。ご注意: SFCGAL 1.2は少なくともCGAL 4.3とBoost 1.54 が必要です (https://sfcgal.org/ 参照) https://gitlab.com/sfcgal/SFCGAL/。
Section 12.1, “住所標準化”をビルドするには、PCRE http://www.pcre.org (通常はnixシステムにはインストールされています)も必要です。PCREライブラリを検出したらSection 12.1, “住所標準化”は自動でビルドされます。もしくは、コンフィギュアの際に有効な--with-pcre-dir=/path/to/pcre
を指定します。
ST_AsMVTを有効にするには、protobuf-cライブラリ (実行時)とprotoc-cコンパイラ (ビルド時)が必要です。protobuf-cの正しい最小版を確認するには、pkg-configが必要です。protobuf-cをご覧下さい。デフォルトでは、PostGISは、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/にあります。
ImageMagick (convert
)。文書で使う画像を生成するのに必要です。http://www.imagemagick.org/にあります。
ほとんどのLinuxのインストールと同様に、最初のステップでは、ソースコードのビルドに使われるMakefileを生成します。これは、シェルスクリプトが行います。
./configure
パラメータを付けない場合には、このコマンドは自動で、PostGISのソースコードのビルドを行うのに必要なコンポーネントやライブラリをシステム上で探します。./configureとするのが一般的な使い方ですが、標準的でない位置に必要なライブラリやプログラムを置いてある場合のために、いくつかのパラメータを受け付けます。
次のリストで、共通して使われるパラメータを示します。 完全なリストについては、--helpまたは--help=shortパラメータを使って下さい。
--with-library-minor-version
PostGIS 3.0以降では、デフォルトではライブラリファイルのファイル名にマイナーバージョンが入らなくなりました。PostGIS 3のライブラリはpostgis-3
で終わります。pg_upgradeを簡単にするために実施された変更ですが、サーバにPostGIS 3シリーズは一つのマイナーバージョンのものだけしかインストールできません。postgis-3.0
といったようにマイナーバージョンをファイル名に含む古い振る舞いにしたいなら、コンフィギュレーション実行の際に次のスイッチを追加します。
--prefix=PREFIX
PostGISライブラリとSQLスクリプトのインストール先を指定します。デフォルトでは、検出されたPostgreSQLのインストール先と同じになります。
このパラメータは現在のところ壊れていて、PostgreSQLのインストール先にしかインストールされません。このバグのトラックについてはhttp://trac.osgeo.org/postgis/ticket/635をご覧ください。 |
--with-pgconfig=FILE
PostgreSQLは、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=FILE
LibXMLはGeomFromKML/GML処理を行うのに必須のライブラリです。通常はlibxmlをインストールしているなら発見されますが、発見できない場合や特定の版を使用したい場合は、xml2-config
を指定してインストールスクリプトにLibXMLのインストール先ディレクトリを伝えます。PostGISのビルドに使う特定のLibXMLを手動で指定する場合に、このパラメータ (>--with-xml2config=/path/to/xml2-config)を使います。
--with-projdir=DIR
ProjはPostGISに必須の投影変換ライブラリです。PostGISのビルドに使う特定のProjのインストールディレクトリを手動で指定する場合は、このパラメータ (--with-projdir=/path/to/projdir)を使います。
--with-libiconv=DIR
iconvのインストール先ディレクトリを指定します。
--with-jsondir=DIR
JSON-Cは、MITライセンスのJSONライブラリで、PostGISのST_GeomFromJSONに必須です。PostGISのビルドに使う特定のJSON-Cを手動で指定する場合に、このパラメータ (--with-jsondir=/path/to/jsondir)を使います。
--with-pcredir=DIR
PCREは、BSDライセンスのPerl互換正規表現ライブラリです。住所標準化エクステンションに必須です。PostGISのビルド対象としている特定のPCREを手動で指定する場合に、このパラメータ (--with-pcredir=/path/to/pcredir)を使います。
--with-gui
データインポートGUI (GTK+2.0が必要)をコンパイルします。このパラメータによって、shp2pgsql-guiという、shp2pgsqlのグラフィカルユーザインタフェースが作成されます。
--without-raster
ラスタ機能なしでコンパイルします。
--without-topology
トポロジ対応を無くしてコンパイルします。トポロジに必要なロジックは全てpostgis-3.5.1devライブラリ内に作られるので、関連ライブラリはありません。
--with-gettext=no
デフォルトでは、gettextの検出とこれを用いたコンパイルを試みますが、ローダ破損を引き起こす非互換性問題のもとで実行する場合には、このコマンドで無効にできます。これを使ったコンフィギュレーションによって解決する問題の例はhttp://trac.osgeo.org/postgis/ticket/748にあります。ご注意: これを切ることで多くの機能がなくなるわけではありません。まだ文書化されていなくて試験段階であるGUIローダにおける内部のヘルプ/ラベル機能に使われています。
--with-sfcgal=PATH
デフォルトでは、このスイッチなしではSFCGAL対応でインストールされません。PATH
は、sfcgal-configへのパスを指定することができる追加的な引数です。
--without-phony-revision
Gitレポジトリの現在のHEADに一致するように、postgis_revision.hの更新を無効にします。
PostGISをコードレポジトリから得る場合には、はじめに次のスクリプトを実行します。 ./autogen.sh このスクリプトによってconfigureスクリプトが生成されます。これはPostGISのインストールに関するカスタマイズに使われます。 PostGISをアーカイブファイルで入手する場合には、configureが既に生成されているので./autogen.shは不要です。 |
Makefileが生成されたら、PostGISのビルドは、次のコマンドを実行するだけです。
make
出力の最後の行に"PostGIS was built successfully. Ready to install.
"と出れば終わりです。
PostGIS 1.4.0版からは、全ての関数に文書から生成されるコメントが付きます。これらのコメントを後からインストールするには、次のコマンドを実行しますが、docbookが必要です。アーカイブファイルからインストールする場合は、postgis_comments.sql, raster_comments.sql, topology_comments.sqlは、docフォルダにあるので、コメントを作成する必要はありません。コメントはCREATE EXTENSIONによるインストールの一部として取り込まれます。
make comments
PostGIS 2.0で導入されました。早見表にも、また学習中の方のハンドアウトにも適しているHTMLチートシートを生成します。xsltprocが必要で、topology_cheatsheet.html
, tiger_geocoder_cheatsheet.html
, raster_cheatsheet.html
, postgis_cheatsheet.html
の4ファイルが生成されます。
HTMLとPDFのビルド済みのものはPostGIS / PostgreSQL Study Guidesにあります。
make cheatsheets
PostgreSQL 9.1以上を使用している場合は、PostGISエクステンションが自動的にビルド、インストールされます。
ソースレポジトリからビルドしている場合は、関数の記述を最初にビルドする必要があります。これらは、docbookがインストールされている時にビルドされます。手動でインストールするには次のようにします。
make comments
アーカイブファイルからのビルドの場合は、ビルド済みのものがあるので、コメントのビルドは必須ではありません。
PostgreSQL 9.1を対象にビルドしている場合は、エクステンションは自動的にmake install処理の一部としてビルドするべきです。必要ならextensionsフォルダからビルドできますし、他のサーバで必要ならファイルの複製ができます。
cd extensions cd postgis make clean make export PGUSER=postgres #overwrite psql variables make check #to test before install make install # to test extensions make check RUNTESTFLAGS=--extension
|
エクステンションファイルは、常に、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%' or name LIKE 'address%'; name | default_version | installed_version ------------------------------+-----------------+------------------- address_standardizer | 3.5.1dev | 3.5.1dev address_standardizer_data_us | 3.5.1dev | 3.5.1dev postgis | 3.5.1dev | 3.5.1dev postgis_raster | 3.5.1dev | 3.5.1dev postgis_sfcgal | 3.5.1dev | postgis_tiger_geocoder | 3.5.1dev | 3.5.1dev postgis_topology | 3.5.1dev | (6 rows)
クエリを行ったデータベースにエクステンションがインストールされている場合は、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 fuzzystrmatch; --needed for postgis_tiger_geocoder --optional used by postgis_tiger_geocoder, or can be used standalone CREATE EXTENSION address_standardizer; CREATE EXTENSION address_standardizer_data_us; CREATE EXTENSION postgis_tiger_geocoder; CREATE EXTENSION postgis_topology;
psqlでは、どの版が、どのスキーマにインストールされているかを見ることができます。
\connect mygisdb \x \dx postgis*
List of installed extensions -[ RECORD 1 ]------------------------------------------------- Name | postgis Version | 3.5.1dev Schema | public Description | PostGIS geometry, geography, and raster spat.. -[ RECORD 2 ]------------------------------------------------- Name | postgis_raster Version | 3.0.0dev Schema | public Description | PostGIS raster types and functions -[ RECORD 3 ]------------------------------------------------- Name | postgis_tiger_geocoder Version | 3.5.1dev Schema | tiger Description | PostGIS tiger geocoder and reverse geocoder -[ RECORD 4 ]------------------------------------------------- Name | postgis_topology Version | 3.5.1dev Schema | topology Description | PostGIS topology spatial types and functions
エクステンションのテーブル |
素晴らしいエクステンション機構を使わずに3.5.1devをインストールした場合には、それぞれのエクステンションが持つ関数をパッケージするためのコマンドを実行して、エクステンションに基づくように変更できます。PostgreSQL 13では、パッケージしない方法でのインストールは削除されましたので、PostgreSQL 13にアップグレードする前にエクステンションをビルドするように変更するべきです。
CREATE EXTENSION postgis FROM unpackaged; CREATE EXTENSION postgis_raster FROM unpackaged; CREATE EXTENSION postgis_topology FROM unpackaged; CREATE EXTENSION postgis_tiger_geocoder FROM unpackaged;
PostGISのテストを行うには、次のコマンドを実行します。
make check
このコマンドで、実際のPostgreSQLデータベースに対して生成したライブラリを使用した、様々なチェックとレグレッションテストを行います。
PostgreSQL, GEOS または Proj を標準の位置にインストールしていない場合には、環境変数 |
現在のところmake checkは、チェックを行う際に 環境変数 |
成功したなら、make checkで約500個のテストを生成します。結果は次のようなかんじになります (かなりの行を省略しています)。
CUnit - A unit testing framework for C - Version 2.1-3 http://cunit.sourceforge.net/ . . . Run Summary: Type Total Ran Passed Failed Inactive suites 44 44 n/a 0 0 tests 300 300 300 0 0 asserts 4215 4215 4215 0 n/a Elapsed time = 0.229 seconds . . . Running tests . . . Run tests: 134 Failed: 0 -- if you build with SFCGAL . . . Running tests . . . Run tests: 13 Failed: 0 -- if you built with raster support . . . Run Summary: Type Total Ran Passed Failed Inactive suites 12 12 n/a 0 0 tests 65 65 65 0 0 asserts 45896 45896 45896 0 n/a . . . Running tests . . . Run tests: 101 Failed: 0 -- topology regress . . . Running tests . . . Run tests: 51 Failed: 0 -- if you built --with-gui, you should see this too CUnit - A unit testing framework for C - Version 2.1-2 http://cunit.sourceforge.net/ . . . Run Summary: Type Total Ran Passed Failed Inactive suites 2 2 n/a 0 0 tests 4 4 4 0 0 asserts 4 4 4 0 n/a
postgis_tiger_geocoder
とaddress_standardizer
エクステンションは、現在は、標準的なPostgreSQLインストールチェックにのみ対応しています。これらをテストするには、次のようにします。ご注意: PostGISコードフォルダのルートでmake installを既に行っている場合には、make installは重要ではありません。
address_standardizer用:
cd extensions/address_standardizer make install make installcheck
出力は次のようなかんじになります。
============== dropping database "contrib_regression" ============== DROP DATABASE ============== creating database "contrib_regression" ============== CREATE DATABASE ALTER DATABASE ============== running regression test queries ============== test test-init-extensions ... ok test test-parseaddress ... ok test test-standardize_address_1 ... ok test test-standardize_address_2 ... ok ===================== All 4 tests passed. =====================
Tiger Geocodeを使う場合には、使用するPostgreSQLインスタンス内にPostGISとfuzzystrmatchのエクステンションが必要です。PostGISをaddress_standardizer機能付きでビルドした場合は、address_standardizerのテストも行います。
cd extensions/postgis_tiger_geocoder make install make installcheck
出力は次のようなかんじになります。
============== dropping database "contrib_regression" ============== DROP DATABASE ============== creating database "contrib_regression" ============== CREATE DATABASE ALTER DATABASE ============== installing fuzzystrmatch ============== CREATE EXTENSION ============== installing postgis ============== CREATE EXTENSION ============== installing postgis_tiger_geocoder ============== CREATE EXTENSION ============== installing address_standardizer ============== CREATE EXTENSION ============== running regression test queries ============== test test-normalize_address ... ok test test-pagc_normalize_address ... ok ===================== All 2 tests passed. =====================
PostGISをインストールするには、次のコマンドを実行します。
make install
これにより、PostGISのインストールファイルが、--prefixパラメータで指定した、適切なサブディレクトリに複写されます。次に特筆すべきサブディレクトリを示します。
ローダとダンパのバイナリのインストール先は[prefix]/bin
です。
postgis.sql
などのSQLファイルのインストール先は[prefix]/share/contrib
です。
PostGISライブラリのインストール先は[prefix]/lib
です。
先にmake commentsを実行してpostgis_comments.sql
, raster_comments.sql
を生成していた場合は、次のコマンドを実行すると、これらのSQLファイルがインストールされます。
make comments-install
|
address_standardizer
エクステンションは、別途ダウンロードする必要がある別パッケージとしていました。PostGIS 2.2からは同梱されています。address_standardizeの追加情報、できること、および、コンフィギュレーション方法については、Section 12.1, “住所標準化”をご覧下さい。
標準化エクステンションは、Normalize_Addressの後継で、PostGISに入っているTigerジオコーダエクステンションに使うことができます。この場合の使い方についてはSection 2.4.2, “TigerジオコーダをPostGISデータベースで有効にする: エクステンションを使用”を参照して下さい。また、ユーザ自身がつくるジオコーダの要素として使用したり、住所の比較を簡単にするために住所を標準化するために使うことができます。
住所標準化エクステンションはPCREに依存しています。PCREは多くのUNIX系システムにインストールされていますが、http://www.pcre.orgから最新版をダウンロードできます。Section 2.2.3, “コンフィギュレーション”の際にPCREを発見すると、住所標準化エクステンションが自動的にビルドされます。使用したいPCREのインストールが独自なものである場合は、configureに--with-pcredir=/path/to/pcre
を渡します。/path/to/pcre
は、PCREのincludeとlibのあるルートフォルダです。
Windowsでは、PostGIS 2.1以上に住所標準化エクステンションが同梱されているので、コンパイルを行わずに、すぐにCREATE EXTENSION
に行くことができます。
インストールしたら、対象データベースに接続して次のSQLが実行できます。
CREATE EXTENSION address_standardizer;
次のテストでは、rules, gaz, lexテーブルは必要ありません。
SELECT num, street, city, state, zip FROM parse_address('1 Devonshire Place PH301, Boston, MA 02109');
出力は次のようになります。
num | street | city | state | zip -----+------------------------+--------+-------+------- 1 | Devonshire Place PH301 | Boston | MA | 02109
Tigerジオコーダのような拡張機能はPostGISディストリビューションに同梱されていません。Tigerジオコーダエクステンションが無かったり、インストールしているものより新しい版のものが欲しい場合には、Windows Unreleased VersionsでPostgreSQLの版に合ったパッケージにあるshare/extension/postgis_tiger_geocoder.*
ファイルを使います。これらのパッケージはWindows用ですが、postgis_tige_geocoderエクステンションファイルは、SQLとPL/pgSQLだけですので、他のOSでも動作します。
ここの説明では、お手持ちのPostgreSQLにpostgis_tiger_geocoderエクステンションがインストールされていると仮定します。
psql、pgAdminまたは他のツールでデータベースに接続して、次のSQLコマンドを実行します。既にPostGISを持っているデータベースにインストールする場合は、一つ目の手順は不要です。fuzzystrmatch
エクステンションが既にインストールされている場合は、二つ目の手順は不要です。
CREATE EXTENSION postgis; CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION postgis_tiger_geocoder; --this one is optional if you want to use the rules based standardizer (pagc_normalize_address) CREATE EXTENSION address_standardizer;
既にpostgis_tiger_geocoderエクステンションをインストールしていて、最新版に更新するだけの場合には、次を実行します。
ALTER EXTENSION postgis UPDATE; ALTER EXTENSION postgis_tiger_geocoder UPDATE;
独自のエントリを生成した場合や、tiger.loader_platform
とtiger.loader_variables
に変更を加えた場合には、これらをアップデートしなければならないことがあります。
正しくインストールされたかを確認するために、インストール対象データベース内で次のSQLを実行します。
SELECT na.address, na.streetname,na.streettypeabbrev, na.zip FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;
出力は次のようになります。
address | streetname | streettypeabbrev | zip ---------+------------+------------------+------- 1 | Devonshire | Pl | 02109
tiger.loader_platform
テーブルの、実行ファイルやサーバのパスを持つ新しいレコードを生成します。
sh
コンベンションのあとにdebbieというプロファイルを生成する例として、次のコマンドを実行します。
INSERT INTO tiger.loader_platform(os, declare_sect, pgbin, wget, unzip_command, psql, path_sep, loader, environ_set_command, county_process_command) SELECT 'debbie', declare_sect, pgbin, wget, unzip_command, psql, path_sep, loader, environ_set_command, county_process_command FROM tiger.loader_platform WHERE os = 'sh';
それから、declare_sectカラム内のパスを編集して、Debbieのpg, unzip, shp2pgsql, psql他のパス位置に適応するようにします。
loader_platform
テーブルを編集しない場合は、一般的なアイテムの位置を持っているので、スクリプトが生成された後で、スクリプトを編集しなければなりません。
PostGIS 2.4.1からは、ZTCA5
(Zip Code 5 digit Tabulation Area)のロード手順が変更され、有効になった時にLoader_Generate_Nation_Scriptの一部として現在のZCTA5データをロードするようになりました。デフォルトでは切られています。ロードにかなりの時間 (20から60分)が取られ、かなりのディスクスペースを占有するのに、そんなに頻繁には使わないためです。
有効にするには、次のようにします。
UPDATE tiger.loader_lookuptables SET load = true WHERE table_name = 'zcta520';
境界のフィルタが追加され、ちょうど境界内のZIPに制限された場合に、Geocode関数は、ZCTA5が存在するなら使います。Reverse_Geocode関数は、返された住所にZIPコードが無い場合に (しばしば高速道路での逆ジオコーディングで発生します)、これを使います。
サーバまたはローカル (サーバへのネットワーク接続が早い場合)のルートにgisdata
というフォルダを作成します。このフォルダはTigerファイルがダウンロードされ、処理される場所です。サーバのルートにフォルダを作ると不幸になる場合や、単に他のフォルダに移したい場合には、tiger.loader_variables
テーブルのstaging_fold
フィールドを編集します。
gisdata
フォルダ内にtempというフォルダを作成します。もしくは、staging_fold
で示されたフォルダを作成します。ローダがダウンロードしたTigerデータを展開する場所です。
そして、SQL関数Loader_Generate_Nation_Scriptを実行して、独自のプロファイルの名前を使うか確認し、.shまたは.batファイルにスクリプトを複写します。たとえば、新しいプロファイルで国のロードを行う場合には、次のようにします。
psql -c "SELECT Loader_Generate_Nation_Script('debbie')" -d geocoder -tA > /gisdata/nation_script_load.sh
生成された国データをロードするコマンドラインスクリプトを実行します。
cd /gisdata sh nation_script_load.sh
国スクリプトを実行した後、tiger_data
スキーマに三つのテーブルが作られ、データが格納されています。次のクエリをpsqlかpgAdminから実行して、確認します。
SELECT count(*) FROM tiger_data.county_all;
count ------- 3235 (1 row)
SELECT count(*) FROM tiger_data.state_all;
count ------- 56 (1 row)
これはロードするzcta5に印を付けたデータだけが含まれます
SELECT count(*) FROM tiger_data.zcta5_all;
count ------- 33931 (1 row)
デフォルトではbg
, tract
, tabblock20
に対応するテーブルはロードされません。ジオコーダはこれらのテーブルを使いませんが、一般に、人口統計に使います。州データのロードの一部としてロードするには、次の手続きを実行して有効にします。
UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock20');
もしくは、Loader_Generate_Census_Scriptを使って州のデータをロードした後に、これらのテーブルだけをロードできます。
データをロードしたい州ごとに、Loader_Generate_Scriptで州スクリプトを作ります。
国データのロードを完了する前に*州スクリプトを作ってはなりません*。州スクリプトは国スクリプトでロードされる国リストを利用するためです。 |
psql -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'debbie')" -d geocoder -tA > /gisdata/ma_load.sh
生成されたコマンドラインスクリプトを実行します。
cd /gisdata sh ma_load.sh
全てのデータのロードが完了するか中断ポイントに達した後に、全てのtigerテーブルに対してanalyzeを実行して、(継承されたものも含めて)状態を更新するのは良いことです。
SELECT install_missing_indexes(); vacuum (analyze, verbose) tiger.addr; vacuum (analyze, verbose) tiger.edges; vacuum (analyze, verbose) tiger.faces; vacuum (analyze, verbose) tiger.featnames; vacuum (analyze, verbose) tiger.place; vacuum (analyze, verbose) tiger.cousub; vacuum (analyze, verbose) tiger.county; vacuum (analyze, verbose) tiger.state; vacuum (analyze, verbose) tiger.zcta5; vacuum (analyze, verbose) tiger.zip_lookup_base; vacuum (analyze, verbose) tiger.zip_state; vacuum (analyze, verbose) tiger.zip_state_loc;
皆さんが問題と思われるの多くのことのひとつに、ジオコーディング前の準備に住所を正規化する関数Normalize_Addressがあります。住所正規化は万全と言うにはほど遠く、パッチをあてようとすると膨大な資源を費やします。よって、より良い住所標準化エンジンを持つ他のプロジェクトに統合しました。この新しい住所標準化を使うには、Section 2.3, “PAGC住所標準化ツールのインストールと使用”で記述するようにエクステンションをコンパイルし、使用するデータベースにインストールします。
このエクステンションをpostgis_tiger_geocoder
をインストールしているデータベースにインストールすると、Pagc_Normalize_Addressを、Normalize_Addressの代わりに使うことができます。このエクステンションはTigerジオコーダからは見えないので、国際的な住所といった他のデータソースでも使えます。Tigerジオコーダエクステンションは、その版のrules table (tiger.pagc_rules
), gaz table (tiger.pagc_gaz
), lex table (tiger.pagc_lex
)を同梱しています。これらは、必要に応じて標準化の改善のために追加や更新ができます。
ロードプロセスによって、米センサスウェブサイトから個々の国ファイル、リクエストされた州のデータをダウンロードし、ファイルを展開し、個別の州をそれぞれの州テーブルの集合にロードします。各州のテーブルは、tiger
スキーマで定義されたテーブルを継承しているので、これらのテーブルに対して全てのデータにアクセスするためのクエリを出すことができますし、州の再読み込みが必要となったり、州が必要ない場合には、Drop_State_Tables_Generate_Scriptで、いつでも州テーブルの集合を削除するクエリを出すことができます。
データのロードを可能にするためには次のツールが必要です。
センサスウェブサイトから取得するZIPファイルを展開するツール。
Unix系システムでは、unzip
実行ファイルです。通常は、ほとんどのUnix系プラットフォームで既にインストールされています。
Windowsでは7-zipです。http://www.7-zip.org/からダウンロードできる無償の圧縮解凍ツールです。
shp2pgsql
コマンド。PostGISインストール時にデフォルトでインストールされます。
wget
コマンド。通常はほとんどのUnix/Linuxシステムにインストールされている、ウェブ取得ツールです。
Windows用については、コンパイル済みのバイナリをhttp://gnuwin32.sourceforge.net/packages/wget.htmから取得できます。
tiger_2010からアップグレードする場合には、最初にDrop_Nation_Tables_Generate_Scriptを生成、実行する必要があります。どの州データもロードする前に、Loader_Generate_Nation_Scriptで全国的なデータをロードする必要があります。これによりローダスクリプトが生成されます。(以前の年のTiger国勢調査データからの)アップグレードや新規インストールで行うLoader_Generate_Nation_Scriptの回数は1回です。
州データをロードするには、Loader_Generate_Scriptを参照して、手持ちのプラットフォームで動作する、求める州データをロードするデータロードスクリプトを生成します。州データはひとつずつダウンロードできることに注意して下さい。一度に必要な州の全てについてデータをロードする必要はありません。必要なだけダウンロードできます。
求める州データをロードした後は、Install_Missing_Indexesに示すように、
SELECT install_missing_indexes();
を実行するようにして下さい。
行うべきことができたかをテストするために、Geocodeを使用する州の中の住所についてジオコーダを実行してみます。
まずpostgis_tiger_geocoderエクステンションを次のようにアップグレードします。
ALTER EXTENSION postgis_tiger_geocoder UPDATE;
次に、全ての国テーブルを削除し、新しい国テーブルをロードします。Drop_Nation_Tables_Generate_Scriptに詳細がある通り、このSQLステートメントを使った削除スクリプトを生成します。
SELECT drop_nation_tables_generate_script();
生成した削除SQLステートメントを実行します。
Loader_Generate_Nation_Scriptに詳細がある通り、このSELECTステートメントを使った削除スクリプトを生成します。
Windows向け
SELECT loader_generate_nation_script('windows');
Unix/Linux向け
SELECT loader_generate_nation_script('sh');
生成スクリプトの実行方法に関する説明は、Section 2.4.1, “TigerジオコーダをPostGISデータベースで有効にする”を参照して下さい。これは一度だけ実行する必要があります。
州テーブルで複数年分が混ざっていてもよく、また州ごとに分割してアップグレードできます。一つの州をアップグレードする前に、Drop_State_Tables_Generate_Scriptを使って、以前の年の州テーブルを削除する必要があります。 |
インストールやアップグレードが思うようにいかない時にチェックすることがいくつかあります。
PostgreSQL 12以上をインストールしているか、実行中のPostgreSQLと同じ版のソースでコンパイルしているか、をチェックします。(Linuxの)ディストリビューションによって既にPostgreSQLがインストールされている時や、 PostgreSQLを以前にインストールして忘れた場合に、 混乱が発生することがあります。PostGISはPostgreSQL 12以上で動作します。古い版のものを使った場合には、おかしな予想外のエラーメッセージが表示されます。実行中のPostgreSQLの版をチェックするには、psqlを使ってデータベースを接続して、次のクエリを実行して下さい。
SELECT version();
RPMベースのディストリビューションを実行している場合、 プリインストールされたパッケージが存在するかのチェックは、rpm コマンドを使ってrpm -qa | grep postgresqlでチェックできます。
アップグレードに失敗する場合、既にPostGISがインストールされているデータベースにリストアしているか確認して下さい。
SELECT postgis_full_version();
また、コンフィギュアが正しくPostgreSQL、Proj4ライブラリ、GEOSライブラリのインストール先を検出したかチェックして下さい。
コンフィギュアからの出力でpostgis_config.h
ファイルが作られます。POSTGIS_PGSQL_VERSION
、POSTGIS_PROJ_VERSION
およびPOSTGIS_GEOS_VERSION
変数が正しくセットされたかをチェックして下さい。
PostGISの調整はPostgreSQLの作業量の調整と非常に似ています。ジオメトリとラスタは重く、メモリ関連の最適化は他のPostgreSQLクエリと比べて影響が大きい点だけは留意して下さい。
PostgreSQLの最適化に関する一般的な詳細は、 Tuning your PostgreSQL Serverをご覧ください。
PostgreSQL 9.4以上では、ALTER SYSTEM
を使うことで、postgresql.conf
やpostgresql.auto.conf
を触ることなくサーバレベルで設定できます。
ALTER SYSTEM SET work_mem = '256MB'; -- this forces non-startup configs to take effect for new connections SELECT pg_reload_conf(); -- show current setting value -- use SHOW ALL to see all settings SHOW work_mem;
PostgreSQLの設定に加えて、PostGISには Section 7.22, “Grand Unified Custom変数 (GUC)”で挙げる独自設定があります。
次に示す設定はpostgresql.conf
にあります:
デフォルト: partition
一般的にテーブルのパーティショニングに使われます。デフォルトとして"partition"に設定されています。継承階層内にあり、プランナにペナルティ以外を払わないなら、クエリプランナにテーブルの制約条件の解析だけを行わせるので、PostgreSQL 8.4以上ではこれが理想的です。
デフォルト: PostgreSQL 9.6では128MB以下
利用可能なRAMの25%から40%を設定します。Windowsでは高く設定することができないかも知れません。
max_worker_processes これは、PostgreSQL 9.4以上で有効です。PostgreSQL 9.6以上では、パラレルクエリ処理に使うプロセス数の最大値の制御で、さらに重要なものとなっています。
デフォルト: 8
システムが対応できるバックグラウンドプロセスの最大値を設定します。このパラメータはサーバ起動時のみ設定できます。
work_mem - 並べ替えや複雑なクエリに使われるメモリのサイズの設定
デフォルト: 1-4MB
大きなデータベースの場合や、複雑なクエリの場合、RAMが多い場合は値を大きくするように調整します。
同時接続ユーザ数が多い場合や、RAMが少ない場合には値を小さくするように調整します。
たくさんのRAMを持ち、少数の開発者しかいない場合は次のようにします。
SET work_mem TO '256MB';
maintenance_work_mem - VACUUM, CREATE INDEX等で使われるメモリのサイズ
デフォルト: 16-64MB
一般的には低すぎます - メモリスワップの間、入出力が拘束され、オブジェクトがロックされます
たくさんのRAMを持つ本番サーバでは32MBから1GBが推奨ですが、同時接続ユーザ数に依存します。たくさんのRAMを持ち、少数の開発者しかいない場合は次のようにします:
SET maintenance_work_mem TO '1GB';
max_parallel_workers_per_gather
この設定はPostgreSQL 9.6以上で使用でき、並列クエリに対応しているPostGIS 2.3以上に影響は限られます。0より大きい値に設定すると、ST_Intersects
といった関係関数を含むクエリで、複数プロセッサが使われるようにできます。その時、2倍を超える速度が出る可能性があります。予備のプロセッサが多数ある場合には、この値をプロセッサ数に変更するべきです。また、max_worker_processes
をこの値と同じにするようにします。
デフォルト: 0
単一のGather
ノードが開始できるワーカの最大数を設定します。並列ワーカは、max_worker_processes
で確立されたプロセスのプールから取得されます。要求したワーカ数は、実際には実行可能になっていない場合があることに注意して下さい。これが発生する場合には、想定より少ないワーカでプランが実行され、非効率になります。これの値を0 (デフォルト値)にすると、パラレルクエリ実行が無効になります。
ラスタ機能を有効にしたら、下に示す確実な設定方法を読んだ方がいいです。
PostGIS 2.1.3以降では、データベース外ラスタと全てのラスタドライバは、デフォルトでは無効になっています。これらを有効にするには、サーバ上で、環境変数 POSTGIS_GDAL_ENABLED_DRIVERS
とPOSTGIS_ENABLE_OUTDB_RASTERS
を設定します。PostGIS 2.2では、Section 7.22, “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/
を編集するのが好ましい方法です。 ここで、10はPostgreSQLのバージョンを指し、mainはクラスタを指します。10
/main
/environment
Windowsでサービスとして実行している場合には、システム変数で設定します。Windows 7では、コンピュータを右クリックしてプロパティをクリックするか、エクスプローラの検索バーにコントロール パネル\すべてのコントロール パネル項目\システム
を指定します。 それから、システムの詳細設定 -> 詳細設定 -> 環境変数 を順にクリックして、新しいシステム環境変数を追加します。
環境変数を設定した後は、設定を反映させるために、PostgreSQLサービスの再起動が必要です。
PostgreSQL 9.1以上を使っていて、エクステンションのPostGISモジュールをコンパイル、インストールしている場合には、エクステンションというメカニズムを使用して、データベースを空間データベースに切り替えることができます。
中核となる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.4/ # Core objects psql -d ${DB} -f ${SCRIPTSDIR}/postgis.sql psql -d ${DB} -f ${SCRIPTSDIR}/spatial_ref_sys.sql psql -d ${DB} -f ${SCRIPTSDIR}/postgis_comments.sql # OPTIONAL # Raster support (OPTIONAL) psql -d ${DB} -f ${SCRIPTSDIR}/rtpostgis.sql psql -d ${DB} -f ${SCRIPTSDIR}/raster_comments.sql # OPTIONAL # Topology support (OPTIONAL) psql -d ${DB} -f ${SCRIPTSDIR}/topology.sql psql -d ${DB} -f ${SCRIPTSDIR}/topology_comments.sql # OPTIONAL
既存の空間データベースのアップグレードは、新しいPostGISオブジェクト定義の置き換えや導入を必要とするとき、慎重を要することがあります。
不幸なことに、定義の全てが実行中のデータベース内で簡単には置き換えられるわけではないので、ダンプ/リロードが最善策となることがあります。
PostGISには、マイナーバージョンアップやバグフィクスリリースの場合に使うソフトアップグレードと、メジャーアップグレードで使うハードアップグレードが用意されています。
PostGISをアップグレードしようとする前にデータのバックアップを取ることは、常に価値のあるものです。pg_dumpで -Fc フラグを使うと、ハードアップグレードによってダンプを常にリストアすることができます。
エクステンションを使ってデータベースをインストールした場合には、エクステンションモデルでアップグレードしなければなりません。 古いSQLスクリプトを使ってインストールした場合には、SQLスクリプトは既にサポートされていませんので、エクステンションに切り替えるべきです。
エクステンションを使ってPostGISをインストールした場合には、エクステンションを使ってアップグレードする必要があります。エクステンションを使ったマイナーアップグレードはかなり楽です。
PostGIS 3以上を実行している場合には、PostGIS_Extensions_Upgrade関数を使ってインストールしているもののうち最新の版にアップグレードすべきです。
SELECT postgis_extensions_upgrade();
PostGIS 2.5以前を実行している場合には、次のようにします:
ALTER EXTENSION postgis UPDATE; SELECT postgis_extensions_upgrade(); -- This second call is needed to rebundle postgis_raster extension SELECT postgis_extensions_upgrade();
インストールされたPostGISに複数のバージョンがあり、最新版にアップグレードしたくない場合には、明示的なバージョンの指定ができます。次のようにします:
ALTER EXTENSION postgis UPDATE TO "3.5.1dev"; ALTER EXTENSION postgis_topology UPDATE TO "3.5.1dev";
次のようなエラー通知が表示されることがあります。
No migration path defined for … to 3.5.1dev
この場合は、データベースをバックアップして、 Section 3.3.1, “エクステンションを使って空間データベースを有効にする” に記述されているように新しいデータベースを生成し、バックアップを新しいデータベースにリストアしなければなりません。
次のようなメッセージを得ることがあります:
Version "3.5.1dev" of extension "postgis" is already installed
この場合は、全てアップデートされていて、安全に無視できます。SVN版から次版 (新しい版番号を得ていないもの)にアップグレードしようとしない限り、"next"を版文字列に追加できますが、次回に"next"を削除する必要があります:
ALTER EXTENSION postgis UPDATE TO "3.5.1devnext"; ALTER EXTENSION postgis_topology UPDATE TO "3.5.1devnext";
PostGISをバージョン指定なしにインストールした場合には、 しばしば再格納の前のPostGIS EXTENSIONの再インストールをとばすことができます。 バックアップは |
PostGISエクステンションを3.0.0より前からアップグレードする場合には、ラスタ機能が不要なら、安全に削除できる新しい postgis_rasterエクステンションを持つことになります。次のようにします: DROP EXTENSION postgis_raster; |
PostGISをエクステンションを使わずにインストールした人向けです。エクステンションを使っていてこの方法を使うと、次のようなメッセージが現れます:
can't drop … because postgis extension depends on it
ご注意: PostGIS 1.*またはr7429以前のPostGIS 2.*へ移行する場合には、この手続きを使うことができませんが、ハードアップグレードを実行する必要があります。
コンパイルとインストール (make install)の実行後に、インストール先フォルダ内にある*_upgrade.sql
のファイルの集合を見つけておくべきです。次のコマンドで一覧を得られます:
ls `pg_config --sharedir`/contrib/postgis-3.5.1dev/*_upgrade.sql
postgis_upgrade.sql
から順番に全てをロードします。
psql -f postgis_upgrade.sql -d your_spatial_database
同じ手続きをラスタ、トポロジ、SFCGALエクステンションに適用します。それぞれのファイル名はrtpostgis_upgrade.sql
, topology_upgrade.sql
, sfcgal_upgrade.sql
になります。必要な場合は次のように実行します:
psql -f rtpostgis_upgrade.sql -d your_spatial_database
psql -f topology_upgrade.sql -d your_spatial_database
psql -f sfcgal_upgrade.sql -d your_spatial_database
エクステンションによるインストールに変更した方が良いです。次のようにします:
psql -c "SELECT postgis_extensions_upgrade();"
求める版へのアップグレードに使う特定の |
PostGIS_Full_Version関数の"procs need upgrade"というメッセージで、この種のアップグレードを実行する必要性についての情報が得られます。
ハードアップグレードとは、PostGISで利用可能なデータの完全なダンプ/リロードを意味します。PostGISオブジェクトの内部格納状態が変更される場合や、ソフトアップグレードができない場合に、ハードアップグレードが必要です。付録のリリースノートに、版ごとについて、ダンプ/リロード (ハードアップグレード)の要否を記載しています。
ダンプ/リロード作業はpostgis_restoreスクリプトが補助します。このスクリプトは、PostGIS (古いものを含む)に属する定義を全て飛ばします。また、重複シンボルエラーや非推奨オブジェクトを持越すことなく、スキーマとデータをPostGISをインストールしたデータベースにリストアできます 。
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
と呼ぶことにします。この作業に関する説明についてはSection 3.3.2, “エクステンションを使わずに空間データベースを有効にする (お勧めできません)”とSection 3.3.1, “エクステンションを使って空間データベースを有効にする”とを参照して下さい。
ダンプにある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 の場合は予約領域に移動して、保持されます。しかし、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
その後、新しいデータベースを生成し、必要なPostGISエクステンションを有効化して、このスクリプトで確実にフランスIGNの系を挿入します。これらの処理の後、次のようにデータのインポートを行います:
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の座標軸値を持っています。形状はポイントと線分から構築され、ポイントは単一の座標で定められ、線分は二つの座標値から定められます。
座標は任意軸ZとMを持つことができます。Z軸はしばしば標高を示すために使われます。M軸は計測値が入りますが、計測値は時間であったり距離であったりします。Z値またはM値はジオメトリ値の中にあり、ジオメトリの各ポイントで定義されているものです。ジオメトリがZ値またはM値を持っている場合には座標次元は三次元です。Z値とM値の両方を持っている場合には四次元です。
ジオメトリ値は、そのジオメトリが組み込まれている座標系を示す空間参照系に関連付けられます。空間参照系はジオメトリのSRID番号で識別されます。X軸とY軸の単位は空間参照系によって決まります。平面参照系では伝統的にX座標値とY座標値が東、北をそれぞれ示します。地理参照系では、経度と緯度を表現しています。SRIDが0の場合には、軸の単位が無い、無限の直交平面を表します。Section 4.5, “空間参照系”を参照して下さい。
ジオメトリの次元は、ジオメトリタイプのプロパティです。ポイントタイプは0次元、ラインタイプは1次元、ポリゴンタイプは2次元、コレクションは要素の次元の最大値、となります。
ジオメトリ値はemptyになることがあります。空値とは、非マルチ系ジオメトリの場合は頂点を持っていないという意味で、コレクションでは要素を持っていないという意味です。
ジオメトリ値の重要なプロパティは範囲 (extent)またはバウンディングボックス (bounding box)です。OGCモデルではエンベロープ (envelope)と呼ばれています。これは、ジオメトリの座標を囲む2次元または3次元のボックスです。ジオメトリの座標空間内の範囲を表現するための、また、二つのジオメトリの相互関係をチェックするための、効率の良い方法です。
ジオメトリモデルでは、Section 5.1.1, “次元拡張9交差モデル”に示されている通り、トポロジ空間関係を評価することができます。これに対応するために、内部 (interior)、境界 (boundary)、外部 (exterior)の概念が、ジオメトリタイプ毎に定義されます。ジオメトリはトポロジ的に閉じていて、常に境界を持っています。境界の次元はジオメトリの次元より1小さくなります。
OGCジオメトリモデルは、ジオメトリタイプ毎に妥当性規則が定義されています。これらの規則によって、ジオメトリ値が現実的な状況を示すようになります (たとえば、外部に穴を持つポリゴンを指定できますが、ジオメトリ的に無意味であり、よって不正とします)。PostGISは不正なジオメトリ値を格納、操作することができます。これによって、必要なら修正できることになります。Section 4.4, “ジオメトリ検証”を参照して下さい。
ポイントは、座標空間内の一つの位置を表現する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) )
マルチポリゴンは相互にオーバラップも隣接もしていないポリゴンのコレクションです。コレクション内のポリゴンの接触は有限数のポイントでのみ可能です。
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 = ST_AsText(geometry); geometry = ST_GeomFromText(text WKT, SRID);
例えば、WKTとSRIDからの空間オブジェクトの生成と挿入のステートメントは次の通りです。
INSERT INTO geotable ( geom, name ) VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');
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
というPostgreSQIデータ型を定義して、OGC Simple Features model を実装しています。これで、内部タイプコード (GeometryTypeとST_GeometryType参照)で全てのジオメトリのサブタイプを表現します。これにより、カラム型で定義されたテーブルの行として、空間地物をモデリングすることが可能となります。
geometry
データ型は透過です。ジオメトリ値に関する関数から全てにアクセスできることを意味します。関数によって、ジオメトリオブジェクトの生成、全ての内部フィールドへのアクセスと更新、新しいジオメトリ値の計算が可能です。PostGISは、OGC Simple feature access - Part 2: SQL option (SFS)仕様で定義されている全ての関数に、他の多数の関数とあわせて対応しています。関数の完全な一覧はChapter 7, PostGISリファレンスをご覧下さい。
PostGISは、空間関数にプリフィクス"ST_"を付けて、SFA標準に従っています。これは、"Spatial and Temporal (空間と時間)"を示していますが、標準の時間の部分はまだ開発していません。その代わりに"Spatial Type (空間タイプ)"と解釈できます。 |
SFA標準は、空間オブジェクトは空間参照系識別子 (SRID)を含むと規程しています。SRIDは、空間オブジェクトをデータベースに挿入するために生成した時に求められます (デフォルトとして0になるかも知れません)。ST_SRIDとSection 4.5, “空間参照系”をご覧下さい。
ジオメトリのクエリを効率的にするため、PostGISでは様々な種類の空間インデクスを定義しています。詳細についてはSection 4.9, “空間インデックス”とSection 5.2, “空間インデックスを使う”をご覧下さい。
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 = ST_AsEWKT(geometry); geometry = ST_GeomFromEWKB(bytea EWKB); geometry = ST_GeomFromEWKT(text EWKT);
たとえば、EWKTを使ってPostGISの空間オブジェクトを作成し挿入するステートメントは次の通りです。
INSERT INTO geotable ( geom, name ) VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )
geography
データタイプによって地理座標 ("geographic", "geodetic", "lat/lon", "lon/lat"など)上の空間地物表現にネイティブに対応できます。地理座標系は角度 (度)単位で表現される球面座標系です。
PostGISジオメトリ型の基礎は平面です。平面上の2点間の最短経路は直線です。ジオメトリに関する関数 (面積、距離、長さ、インタセクション等)は直線ベクトルとデカルト平面を使って計算しています。これで実装が簡単になり実行速度も上がりますが、地球の球面の上にあるデータについては不正確になります。
PostGISジオグラフィというデータ型は球面モデルに基づいています。球面上の2点の最短経路は大円の弧にあたります。ジオグラフィの関数 (面積、距離、長さ、インタセクション等)は球面上の弧を使います。球面上の世界の形状を考慮に入れるので、より正確な結果が得られます。
基礎となる数学はより複雑になるため、ジオグラフィ型で定義された関数はジオメトリ型で定義された関数よりも少なくなります。時間が経つにつれて新しいアルゴリズムが追加されて、ジオグラフィの機能が拡大していきます。回避策として、ジオメトリ型とジオグラフィ型との相互変換が可能です。
ジオグラフィ型は、ジオメトリ型のように、空間参照系識別子 (SRID)を介して空間参照系と関連付けられます。spatial_ref_sys
テーブルで定義されているあらゆる地理空間参照系 (経度/緯度を使う)が使えます (PostGIS 2.2より前ではジオグラフィ型はWGS 84地理座標系 (SRID:4326)にのみ対応していました)。Section 4.5.2, “ユーザ定義空間参照系”に書いている通り、独自の空間参照系を追加することもできます。
計測関数 (例 ST_Distance、ST_Length、ST_Perimeter、ST_Area)によって返されるものの単位と、ST_DWithinの引数で与えられる距離との、空間参照系の単位は、メートルです。
ジオグラフィデータを格納するテーブルは、SQLステートメント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は、カラム型がジオグラフィであると通知したうえで、ジオメトリに使う通常の平面用インデックスでなく、球面を基にした適切なインデックスを生成します。
-- Index the test table with a spherical index CREATE INDEX global_points_gix ON global_points USING GIST ( location );
ジオメトリと同じ方法でジオグラフィテーブルにデータを挿入できます。ジオメトリデータは、SRID 4326の場合には、ジオグラフィ型に自動キャストされます。EWKTとEWKB書式はジオグラフィ値を指定するために使うことができます。
-- Add some data into the test table INSERT INTO global_points (name, location) VALUES ('Town', 'SRID=4326;POINT(-110 30)'); INSERT INTO global_points (name, location) VALUES ('Forest', 'SRID=4326;POINT(-109 29)'); INSERT INTO global_points (name, location) VALUES ('London', 'SRID=4326;POINT(0 49)');
spatial_ref_sys
テーブルにある地理 (経度/緯度)参照系は、ジオグラフィのSRIDとして指定することができます。非地理座標系を使うとエラーが発生します。
-- NAD 83 lon/lat SELECT 'SRID=4269;POINT(-123 34)'::geography; geography ---------------------------------------------------- 0101000020AD1000000000000000C05EC00000000000004140
-- NAD27 lon/lat SELECT 'SRID=4267;POINT(-123 34)'::geography; geography ---------------------------------------------------- 0101000020AB1000000000000000C05EC00000000000004140
-- NAD83 UTM zone meters - gives an error since it is a meter-based planar projection SELECT 'SRID=26910;POINT(-123 34)'::geography; ERROR: Only lon/lat coordinate systems are supported in geography.
クエリと計測関数はメートル単位となります。そのため距離パラメータはメートル (面積の場合は平方メートル)単位となります。
-- A distance query using a 1000km tolerance SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);
シアトルからロンドンへの (LINESTRING(-122.33 47.606, 0.0 51.5))大円航路を行く航空機がレイキャビク (POINT(-21.96 64.15)) にどれだけ近づくかを計算することで、ジオグラフィの力を見ことができます (航路の地図表示)。
ジオグラフィ型は、レイキャビクとシアトル-ロンドン間の大円航路との距離について、球面上で122.235 kmという本当の最短距離を計算します。
-- Distance calculation using GEOGRAPHY SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)'::geography); st_distance ----------------- 122235.23815667
ジオメトリ型では、平面の世界地図上で見て、レイキャビクとシアトル-ロンドン間の直線とのデカルト距離が計算され、意味がありません。計算結果の名目上の単位は「度」ですが、点間の本当の角度差に応じるものではなく、「度」と呼ぶこと自体が不正確です。
-- Distance calculation using GEOMETRY SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)'::geometry); st_distance -------------------- 13.342271221453624
ジオグラフィ型によって、経度緯度座標でデータを格納できるようになりましたが、ジオグラフィで定義されている関数が、ジオメトリより少ないのと、実行にCPU時間がかかる、というところが犠牲になっています。
選択した型が、期待する領域から出ないことを、ジオメトリ型にして使用する条件とすべきです。使用するデータは地球全体か、大陸か、州か、自治体か?
データが小さいエリア内におさまるなら、適切な投影を選択してジオメトリを使うのが、効率面でも機能面でも最も良い方法です。
データが地球全体か大陸なら、ジオグラフィで投影法の細かい問題を気にせずにシステムを構築できるでしょう。経度/緯度のデータを保存して、ジオグラフィで定義された関数使います。
投影法を理解していなくて、学習したくもなくて、かつ、ジオグラフィで使える関数が限られていることを受け入れるのなら、ジオグラフィを使った方が簡単です。単純にデータを経度/緯度でロードして、そこから進めて下さい。
ジオグラフィとジオメトリ間のサポート状況の比較についてはSection 13.11, “PostGIS関数対応マトリクス”をご覧下さい。ジオグラフィ関数の簡潔なリストと説明についてはSection 13.4, “PostGISジオグラフィ対応関数”をご覧下さい。
4.3.4.1. | 球または回転楕円体のどちらで計算するのでしょうか? |
デフォルトでは、全ての距離と面積の計算は回転楕円体で行います。局所的なエリアでの計算結果と良好な投影を施した平面での結果と比較して下さい。大きなエリアの場合は、回転楕円体計算は、投影平面上でのどの計算よりも精度が高くなります。 全てのジオグラフィ関数には、最後の真偽パラメータを'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
は、同じポイントを二回通過しないものが単純です。単純なラインストリングの端点が同一の場合には、閉じているとされ、線形リングと呼ばれます。
(a)と(c)は単純な |
MULTILINESTRING
は、要素が全て単純で、かつ、全ての要素同士のインタセクションが要素の境界上でのみ出現する場合には、単純です。
(e)と(f)は単純な |
POLYGON
は線形リングから形成されるので、妥当なポリゴンジオメトリは常に単純です。
ジオメトリが単純かどうかを試すにはST_IsSimple関数を使います。次のようにします。
SELECT ST_IsSimple('LINESTRING(0 0, 100 100)') AS straight, ST_IsSimple('LINESTRING(0 0, 100 100, 100 0, 0 100)') AS crossing; straight | crossing ----------+---------- t | f
一般的にPostGIS関数は引数ジオメトリの単純性を求めていません。単純性は主にジオメトリの妥当性を定義するための基礎として用いられます。空間データモデルによっては要件としていることもあります (たとえば、線形ネットワークはしばしばクロスを認めません)。マルチポイントと線形ジオメトリはST_UnaryUnionを使って単純にできます。
ジオメトリの妥当性は主に2次元ジオメトリ (POLYGON
とMULTIPOLYGON
)に適用されます。妥当性はポリゴンジオメトリが平面領域を明確にモデル化できる規則によって定義されます。
POLYGON
は次の条件では妥当です。
ポリゴン境界リング (外側の殻リングと内側の穴リング)が単純 (交差も自己接触もしていない)であること。これによりポリゴンは切断線、トゲ、循環を持つことができなくなります。これは、ポリゴンの穴を外側のリングの自己接触 (いわゆる "inverted hole" (逆穴))でなく、内側のリングとして表現されなけれならないことを意味します。
境界リングがクロスしないこと
境界リングは点で接触したとしても接点として接触すること (線上にあってはなりません)
内側リングは外側リング内にあること
ポリゴン内部は単純に接続されていること (リングはポリゴンを複数に分割するように接触してはなりません)
(h)と(i)は妥当な |
MULTIPOLYGON
は次の条件では妥当です。
要素となるPOLYGON
が妥当であること
要素がオーバラップしない (内部同士がインタセクトしない)こと
要素同士の接触が点でけである (線に沿って接触しない)こと
(n)は妥当な |
これらの規則は妥当なポリゴンジオメトリも単純であることも示しています。
線ジオメトリについては、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, ST_AsText(location) AS location FROM ST_IsValidDetail('POLYGON ((20 20, 120 190, 50 190, 170 50, 20 20))') AS t; valid | reason | location -------+-------------------+--------------------------------------------- f | Self-intersection | POINT(91.51162790697674 141.56976744186045)
不正なジオメトリを自動的に訂正することが望ましいような状況があります。その際はST_MakeValid関数を使います (ST_MakeValid
は不正な入力を許す特別な関数です)。
複雑なジオメトリの不正性テストには多大なCPU時間を取ることになるため、デフォルトでは、ジオメトリのロード時にPostGISは妥当性の確認をしません。データソースが信用できない場合には、チェック制約を使って、テーブル上で妥当性を強制的に確認することができます。次のようにします。
ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));
空間参照系 (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をご覧下さい。
proj4text
PostGISは座標変換機能を提供するために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/にあります。
一般的に使用される空間参照系には4326 - WGS 84経度緯度、4269 - NAD 83 経度緯度、3395 - WGS 84 メルカトル、2163 - 米国ナショナルアトラス正積図法、60個のWGS84 UTMゾーンがあります。UTMゾーンは計測に最適ですが、6度 (訳注: 経度)の領域のみをカバーします (対象地域に使用するUTMゾーンを決定するにはutmzone PostGIS plpgsql helper functionを参照してください)。
米国の州では、州平面空間参照系 (メートルまたはフィート単位)を使用します。この空間参照系は州ごとに一つか二つ存在します。ほとんどのメートル単位のものはコアのセットに存在しますが、フィート単位の多数のものや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_dimension
カラムの座標次元 (2, 3, 4)。
srid
このテーブルのジオメトリの座標系として使用される座標系空間参照系のIDです。spatial_ref_sys
テーブルを参照する外部キーです (Section 4.5.1, “SPATIAL_REF_SYSテーブル”を参照して下さい)。
type
空間オブジェクトの型。空間カラムを単一型に制限するには、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTIONのうちのいずれかを、また、XYMで使う場合には、LINESTRINGM、POLYGONM、MULTIPOINTM、MULTILINESTRINGM、MULTIPOLYGONM、GEOMETRYCOLLECTIONMのうちのいずれかを使います。複数の型が混合するコレクションの場合は"GEOMETRY"を型とすることができます。
これが必要になる事例に、SQLビューとバルクインサートの二つがあります。バルクインサートの場合には、カラムに制約を与えるか、ALTER TABLEを実行することで、geometry_columnsテーブル内の登録を訂正することができます。ビューの場合には、CAST演算を使用します。カラムが型修飾子に基づく場合には、生成処理によって正しく登録されるので、何も行う必要がありません。ジオメトリに適用する空間関数を持たないビューも、基礎となるテーブルのジオメトリカラムと同じように登録されます。
-- Lets say you have a view created like this CREATE VIEW public.vwmytablemercator AS SELECT gid, ST_Transform(geom, 3395) As geom, f_name FROM public.mytable; -- For it to register correctly -- You need to cast the geometry -- DROP VIEW public.vwmytablemercator; CREATE VIEW public.vwmytablemercator AS SELECT gid, ST_Transform(geom, 3395)::geometry(Geometry, 3395) As geom, f_name FROM public.mytable; -- If you know the geometry type for sure is a 2D POLYGON then you could do DROP VIEW public.vwmytablemercator; CREATE VIEW public.vwmytablemercator AS SELECT gid, ST_Transform(geom,3395)::geometry(Polygon, 3395) As geom, f_name FROM public.mytable;
--Lets say you created a derivative table by doing a bulk insert SELECT poi.gid, poi.geom, citybounds.city_name INTO myschema.my_special_pois FROM poi INNER JOIN citybounds ON ST_Intersects(citybounds.geom, poi.geom); -- Create 2D index on new table CREATE INDEX idx_myschema_myspecialpois_geom_gist ON myschema.my_special_pois USING gist(geom); -- If your points are 3D points or 3M points, -- then you might want to create an nd index instead of a 2D index CREATE INDEX my_special_pois_geom_gist_nd ON my_special_pois USING gist(geom gist_geometry_ops_nd); -- To manually register this new table's geometry column in geometry_columns. -- Note it will also change the underlying structure of the table to -- to make the column typmod based. SELECT populate_geometry_columns('myschema.my_special_pois'::regclass); -- If you are using PostGIS 2.0 and for whatever reason, you -- you need the constraint based definition behavior -- (such as case of inherited tables where all children do not have the same type and srid) -- set optional use_typmod argument to false SELECT populate_geometry_columns('myschema.my_special_pois'::regclass, false);
古い制約を基にした手法は現在も対応していますが、制約を基にしたジオメトリカラムで直接的にビューで使われている場合は、型修飾子のようには正しくgeometry_columnsに登録されません。次の例では、型修飾子を使ったカラム定義と、制約に基づくカラムの定義とを行っています。
CREATE TABLE pois_ny(gid SERIAL PRIMARY KEY, poi_name text, cat text, geom geometry(POINT,4326)); SELECT AddGeometryColumn('pois_ny', 'geom_2160', 2160, 'POINT', 2, false);
psqlで次を実行します。
\d pois_ny;
型修飾子と制約に基づくのとでは異なった定義になっているのが見えます。
Table "public.pois_ny" Column | Type | Modifiers -----------+-----------------------+------------------------------------------------------ gid | integer | not null default nextval('pois_ny_gid_seq'::regclass) poi_name | text | cat | character varying(20) | geom | geometry(Point,4326) | geom_2160 | geometry | Indexes: "pois_ny_pkey" PRIMARY KEY, btree (gid) Check constraints: "enforce_dims_geom_2160" CHECK (st_ndims(geom_2160) = 2) "enforce_geotype_geom_2160" CHECK (geometrytype(geom_2160) = 'POINT'::text OR geom_2160 IS NULL) "enforce_srid_geom_2160" CHECK (st_srid(geom_2160) = 2160)
geometry_columnsでは、両方とも正しく登録されています。
SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'pois_ny';
f_table_name | f_geometry_column | srid | type -------------+-------------------+------+------- pois_ny | geom | 4326 | POINT pois_ny | geom_2160 | 2160 | POINT
しかし、次のようにビューを作ろうとします。
CREATE VIEW vw_pois_ny_parks AS SELECT * FROM pois_ny WHERE cat='park'; SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'vw_pois_ny_parks';
型修飾子によるgeomのビューカラムは正しく登録されますが、制約に基づくものは正しく登録されません。
f_table_name | f_geometry_column | srid | type ------------------+-------------------+------+---------- vw_pois_ny_parks | geom | 4326 | POINT vw_pois_ny_parks | geom_2160 | 0 | GEOMETRY
これは、将来的にPostGISの版で変更されるかもしれませんが、今のところは、制約に基づくビューカラムを正しく登録させるには、次のようにします。
DROP VIEW vw_pois_ny_parks; CREATE VIEW vw_pois_ny_parks AS SELECT gid, poi_name, cat, geom, geom_2160::geometry(POINT,2160) As geom_2160 FROM pois_ny WHERE cat = 'park'; SELECT f_table_name, f_geometry_column, srid, type FROM geometry_columns WHERE f_table_name = 'vw_pois_ny_parks';
f_table_name | f_geometry_column | srid | type ------------------+-------------------+------+------- vw_pois_ny_parks | geom | 4326 | POINT vw_pois_ny_parks | geom_2160 | 2160 | POINT
空間テーブルを作成したら、これで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に変換します。ローダには、次に示すコマンドラインフラグによって区別される、いくつかの操作モードがあります。
グラフィカルユーザインタフェースを持つshp2pgsql-gui
もあります。コマンドラインローダのオプションのほとんどが使えます。これは、スクリプト化されていない1回限りのロードの場合や、PostGIS初心者がロードする場合に、簡単に使用できます。PgAdminIIIのプラグインとすることもできます。
-c
新しいテーブルの作成とシェープファイルからのデータの読み込みを行います。これがデフォルトモードです。
-a
シェープファイルからデータベーステーブルにデータを追加します。複数のファイルをロードするためにこのオプションを使う場合は、これらのファイルは同じ属性と同じデータ型を持つ必要があります。
-d
シェープファイルにあるデータを持つ新しいテーブルを作成する前にデータベーステーブルを削除します。
-p
テーブル作成のSQLコードを生成するだけで、実際のデータは追加しません。このモードは、テーブル作成とデータロードとを完全に分けたい場合に使用します。
-?
ヘルプ画面を表示します。
-D
出力データにPostgreSQLのダンプ書式を用います。このモードは-a, -c, -dと組み合わせて利用します。デフォルトの"insert"によるSQL書式よりも、大変早くロードできます。大きなデータセットではこちらを使用して下さい。
-s [<FROM_SRID>:]<SRID>
指定したSRIDを持つジオメトリテーブルの生成や追加を行います。FROM_SRIDが与えられた場合には、入力シェープファイルに、これを使います 。この場合には、ジオメトリは変更先SRIDに投影変換します。
-k
識別子 (カラム、スキーマおよび属性)の大文字小文字を保持します。シェープファイルの属性は全て大文字であることに注意して下さい。
-i
全ての整数を標準の32ビット整数に強制します。DBFヘッダではそれが正当であったとしても、64ビットのbigintを生成しません。
-I
ジオメトリカラムにGiSTインデックスを生成します。
-m
-m a_file_name
で、長いカラム名を10文字のDBFカラム名に対応付けるファイルを指定します。ファイルは、1以上の行を持ちます。各行は空白区切りで二つの名前を持ち、行頭行末に空白を入れません。例を次に示します。
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=強制終了)を選択します。
-n
DBFファイルのみインポートします。対応するシェープファイルを持っていない場合、 自動的にこのモードになり、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
空間データはSQLかシェープファイルダンパを使うと抽出できます。SQLの節では空間テーブルで比較とクエリに使用できる関数を示します。
データベース外へのデータ抽出の最も簡単な方法は、抽出するデータセットを定義し、SELECT
問い合わせを使って、結果カラムを解析可能なテキストファイルにダンプすることです。
db=# SELECT road_id, ST_AsText(road_geom) AS geom, road_name FROM roads; road_id | geom | road_name --------+-----------------------------------------+----------- 1 | LINESTRING(191232 243118,191108 243242) | Jeff Rd 2 | LINESTRING(189141 244158,189265 244817) | Geordie Rd 3 | LINESTRING(192783 228138,192612 229814) | Paul St 4 | LINESTRING(189412 252431,189631 259122) | Graeme Ave 5 | LINESTRING(190131 224148,190871 228134) | Phil Tce 6 | LINESTRING(198231 263418,198213 268322) | Dave Cres 7 | LINESTRING(218421 284121,224123 241231) | Chris Way (6 rows)
返されるレコードの数を減らすためにある種の制限が必要になる場合があります。属性ベースで制限をかける場合には、非空間テーブルで使うのと同じSQL文を使います。空間に制限をかけるには次の関数を使います。
ST_Intersects
この関数は、二つのジオメトリが空間を共有しているかどうかをテストします。
=
この関数で、二つのジオメトリが幾何的に同一であるかを見ることができます。たとえば、'POLYGON((0 0,1 1,1 0,0 0))' は 'POLYGON((0 0,1 1,1 0,0 0))' と同じかを見ることができます (これは同じとなります)。
次に、これらの演算子をクエリで使うことができます。SQLコマンドラインからジオメトリとボックスの指定を行うときは、明示的に文字列表現をジオメトリに変換しなければならないことに注意して下さい。たとえば、次のようになります。ただし312は架空の空間参照系番号で、ここでのデータに合致しています。
SELECT road_id, road_name FROM roads WHERE roads_geom='SRID=312;LINESTRING(191232 243118,191108 243242)'::geometry;
上のクエリは"ROADS_GEOM"テーブルから、その値と等価である単一のレコードを返します。
道路がポリゴンで定義した面を通過するかどうかをチェックするには次のようにします。
SELECT road_id, road_name FROM roads WHERE ST_Intersects(roads_geom, 'SRID=312;POLYGON((...))');
最も一般的な空間クエリは「フレームベース」のクエリでしょう。これは、表示するためのデータの価値のある「マップフレーム」を取得するために、データブラウザやウェブマッパのようなクライアントソフトウェアに使われます。
"&&"演算子を使うとき、比較フィーチャーをBOX3DかGEOMETRYかに指定することができます。ただし、GEOMETRYを指定すると、それのバウンディングボックスが比較に使われます。
次に示すクエリのように、フレームにBOX3Dオブジェクトを使います。
SELECT ST_AsText(roads_geom) AS geom FROM roads WHERE roads_geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312);
エンベロープの投影を指定するためにSRID 312を使っていることに注意して下さい。
pgsql2shp
テーブルダンパは、データベースに直接接続して、テーブル (あるいはクエリによって定義されたもの)をシェープファイルに変換するものです。基本的な文は次の通りです。
pgsql2shp [<options >] <database > [<schema >.]<table>
pgsql2shp [<options >] <database > <query>
コマンドラインオプションは次の通りです。
-f <filename>
特定のファイル名に出力を書きこみます。
-h <host>
接続先データベースのホスト名。
-p <port>
接続先データベースのポート。
-P <password>
データベースに接続するためのパスワード。
-u <user>
データベースに接続する際のユーザ名。
-g <geometry column>
複数のジオメトリカラムを持つテーブルの場合の、シェープファイルの出力に使用するジオメトリカラム。
-b
バイナリカーソルを使います。これは、実行時間を短くしますが、テーブルの非ジオメトリ属性がテキストへのキャストを持っていない場合には、動作しません。
-r
Rawモード。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木、基数木 (トライ木)のような部分木探索に対応する一般的なインデックス手法です。
空間インデックスはジオメトリのバウンディングボックスだけを格納します。空間クエリはインデックスは初期フィルタとして使用して、クエリ条件に一致する可能性のあるジオメトリを早く求めます。ほとんどの空間クエリでは、空間述語関数を使って特定の空間条件をテストする二次フィルタが必要です。空間述語関数を使ったクエリの詳細情報についてはSection 5.2, “空間インデックスを使う”をご覧下さい。
また、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 9.5で導入された汎用インデックス手法です。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インデックスは、多数の行で一つのインデックス値を格納することを心に留めておいて下さい。テーブルに違う次元のジオメトリを格納する場合には、インデックスの効率が悪くなります。この効率欠落を回避するには、格納したジオメトリの次元数の最小値となる演算子クラスを選択します。
「ジオグラフィ」型もまた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のハードウェア関連のチューンが行われていないのかも知れません。プランナがシーケンシャル対インデックスのコストが誤っている場合には、postgresql.conf
内にあるRANDOM_PAGE_COST
の値を変更してみて下さい。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) ) |
二つのオーバラップするポリゴンについて可視化すると、次のようになります。
|
左から右に、上から下に読みます。交差行列の文字列表現は'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をご覧下さい。
名前付き空間関係が求める空間フィルタ条件を与えるのに不十分となる場合があります。
例えば、道路ネットワークを表現する線データセットを考えてみます。点でなく線で交差する全ての道路の辺を識別しなければならないことがあります (ビジネスルールの検証のためならありえます)。この場合、ST_Crossesでは、点で交差する場合しか 2ステップ解決法を示します。まず、空間的にインタセクトしている同路線の二本を抜き出し (ST_Intersects)、実際にインタセクトしている部分を計算 (ST_Intersection)します。次いで、インタセクトしている部分のST_GeometryTypeが 明らかに、より単純でより速い解法が望ましいです。 |
二つ目の例では、湖の境界とインタセクトし、かつ終端が岸に上がっている波止場を見つけます。言い換えると、波止場が湖に含まれるが完全には含まれず、湖の境界線とインタセクトして、波止場の終端が確実に湖内または境界にある場合を指します。空間述語を併用すると求める地物を見つけることができます。
|
この要件は完全なDE-9IM交差行列の計算で満たすことができます。PostGISは、これを行うST_Relate関数を提供しています。次のようにします:
SELECT ST_Relate( 'LINESTRING (1 1, 5 5)', 'POLYGON ((3 3, 3 7, 7 7, 7 3, 3 3))' ); st_relate ----------- 1010F0212
特定の空間関係をテストするには、交差行列パターンを使います。これは、追加シンボル{T,*}
で拡張された行列表現です。
T
=> インタセクションの次元は空ではないという意味です。すなわち{0,1,2}
のいずれかです。
*
=> 何でも良い
交差行列パターンを使って、特定の空間関係の評価がより簡潔な方法で可能です。交差行列パターンのテストにST_RelateとST_RelateMatchを使うことができます。上に挙げた一つ目の例では、二つのラインがライン内部でインタセクトする交差行列パターンは'1*1***1**'となります。
-- Find road segments that intersect in a line SELECT a.id FROM roads a, roads b WHERE a.id != b.id AND a.geom && b.geom AND ST_Relate(a.geom, b.geom, '1*1***1**');
二つ目の例です。一本のラインが部分的にポリゴン内部とポリゴン外部とにある場合の交差行列パターンは '102101FF2'となります。
-- Find wharves partly on a lake's shoreline SELECT a.lake_id, b.wharf_id FROM lakes a, wharfs b WHERE a.geom && b.geom AND ST_Relate(a.geom, b.geom, '102101FF2');
空間条件を使用するクエリを構築する時、最良の効果を得るには、空間インデックスが存在する場合に (Section 4.9, “空間インデックス”参照)これを確実に使用することが重要です。そのためには、WHERE
節やON
節で、空間演算子またはインデックス対応関数を使用しなければなりません。
空間演算子には、バウンディングボックス演算子 (最もよく使われるのは&&です。Section 7.10.1, “バウンディングボックス演算子”参照)、および近傍クエリで使用される距離演算子 (最もよく使われるのは<->です。Section 7.10.2, “距離演算子”参照)が含まれます。
インデックス対応関数は、自動的にバウンディングボックス演算子を空間条件に追加します。インデックス対応関数は空間関係述語を含みます。空間関係述語には、ST_Contains, ST_ContainsProperly, ST_CoveredBy, ST_Covers, ST_Crosses, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within, ST_Within, ST_3DIntersectsがあり、距離述語にはST_DWithin, ST_DFullyWithin, ST_3DDFullyWithin, ST_3DDWithin があります。
ST_Distanceといった関数は、演算の最適化のためにはインデックスを使用しません。例えば、次のクエリは、大きなテーブルでは非常に遅くなります。
SELECT geom FROM geom_table WHERE ST_Distance( geom, 'SRID=312;POINT(100000 200000)' ) < 100
このクエリはgeom_table
テーブル内の、(100000, 200000)のポイントから100単位内にある全てのジオメトリを選択します。テーブル内の個々のポイントと指定したポイントとの距離を計算しているため、非常に遅くなります。すなわち、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で答えを得ることができます。 SELECT sum(ST_Length(geom))/1000 AS km_roads FROM bc_roads; km_roads ------------------ 70842.1243039643 | |
5.3.2. | プリンスジョージ市の大きさはha表記でいくらになるでしょう? |
このクエリでは、属性条件 (municipality name, 自治体名)に (ポリゴン面積の)空間計算を併用しています。 SELECT ST_Area(geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE'; hectares ------------------ 32657.9103824927 | |
5.3.3. | 県内で最も大きな面積となる自治体はどこでしょう? |
このクエリでは、順序付けの値に空間計測関数を使っています。この問題に対しては複数の方法がありますが、最も効果的な方法は次の通りです。 SELECT name, ST_Area(geom)/10000 AS hectares FROM bc_municipality ORDER BY hectares DESC LIMIT 1; name | hectares ---------------+----------------- TUMBLER RIDGE | 155020.02556131 このクエリの答えを出すためには、全てのポリゴンの面積を求める必要があることに注意して下さい。このクエリを多く実行する場合、性能向上のためにテーブルにareaカラムを追加して、別のインデックスを追加することができるようにするのは、意義のあることです。結果を距離について降順に並べ替え、PostgreSQLの"LIMIT"コマンドを用いることで、max()のような集約関数を使わずに、簡単に最も大きい値を集約関数を得ることができます。 | |
5.3.4. | 各自治体内に含まれる道路の総延長はいくらでしょう? |
これは、二つのテーブルからデータを持ち込んで (結合して)いるので「空間結合」の例です。しかし、結合の条件として共通キーの上で接続するという普通のリレーションのやり方でなく空間インタラクション条件 (「含む」)を使っています。 SELECT m.name, sum(ST_Length(r.geom))/1000 as roads_km FROM bc_roads AS r JOIN bc_municipality AS m ON ST_Contains(m.geom, r.geom) GROUP BY m.name ORDER BY roads_km; name | roads_km ----------------------------+------------------ SURREY | 1539.47553551242 VANCOUVER | 1450.33093486576 LANGLEY DISTRICT | 833.793392535662 BURNABY | 773.769091404338 PRINCE GEORGE | 694.37554369147 ... このクエリは、テーブル内の全ての道路の合計を最終結果 (この例での話ですが約250Kmの道です)にまとめられるので、少し時間がかかります。より小さいオーバレイ (数百の道路で数千のレコード)の場合、応答はもっと早くなりえます。 | |
5.3.5. | プリンスジョージ市内の全ての道路からなるテーブルを作ります。 |
これは「オーバレイ」の例です。つまり、二つのテーブルを取得して、空間的に切り取られた結果からなる新しいテーブルを出力します。上で示した「空間結合」と違い、このクエリは実際に新しいジオメトリを生成します。生成されたオーバレイはターボのかかった空間結合みたいなもので、より確かな解析作業に便利です。 CREATE TABLE pg_roads as SELECT ST_Intersection(r.geom, m.geom) AS intersection_geom, ST_Length(r.geom) AS rd_orig_length, r.* FROM bc_roads AS r JOIN bc_municipality AS m ON ST_Intersects(r.geom, m.geom) WHERE m.name = 'PRINCE GEORGE'; | |
5.3.6. | ビクトリア州の「ダグラス通り」の長さはkm表記でいくらになるでしょう? |
SELECT sum(ST_Length(r.geom))/1000 AS kilometers FROM bc_roads r JOIN bc_municipality m ON ST_Intersects(m.geom, r.geom WHERE r.name = 'Douglas St' AND m.name = 'VICTORIA'; kilometers ------------------ 4.89151904172838 | |
5.3.7. | 穴を持つ自治体ポリゴンのうち最も大きいのはどれでしょう? |
SELECT gid, name, ST_Area(geom) AS area FROM bc_municipality WHERE ST_NRings(geom) > 1 ORDER BY area DESC LIMIT 1; gid | name | area -----+--------------+------------------ 12 | SPALLUMCHEEN | 257374619.430216 |
現版のPostgreSQL (9.6を含む)では、TOASTテーブルに従うクエリオプティマイザの弱さに苦しみます。 TOASTテーブルは、(長いテキスト、イメージ、多数の頂点を持つ複合ジオメトリといった)通常のデータページに適合しない、(データサイズという意味では)巨大な値を納めるための「拡張部屋」の一種です。詳細情報は the PostgreSQL Documentation for 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クエリを実行するかでも対応できます。
読み込むことがほとんどで、かつほとんどのクエリでひとつのインデックスを使うようなテーブルのために、PostgreSQLはCLUSTERコマンドを提供しています。このコマンドは、全てのデータ行を、インデックス基準にあわせて物理的に再整理するので、二つの性能の利点を生みます。一つは、インデックスの範囲走査のために、データテーブルのシーク回数が劇的に減少することです。もう一つは、いくつかの小さなインデックス間隔に集中する場合には、データ行が分布するデータページがより少なくなることで、より効率的なキャッシュを持つことです (この点は、PostgreSQLマニュアルのCLUSTERコマンドのドキュメントを読むように仕向けられていると感じて下さい)。
しかし、GiSTインデックスは単純にNULL値を無視するため現在のところPostGISのGiSTインデックスのクラスタリングはできず、次のようなエラーメッセージを得ます。
lwgeom=# CLUSTER my_geom_index ON my_table; ERROR: cannot cluster when index access method does not handle null values HINT: You may be able to work around this by marking column "geom" NOT NULL.
ヒントメッセージにある通り、テーブルに"not null"制限を追加することで、この欠陥にとりあえず対応できます。例を示します。
lwgeom=# ALTER TABLE my_table ALTER COLUMN geom SET not null; ALTER TABLE
もちろん、ジオメトリカラムで実際にNULL値が必要な場合、この対応はできません。さらには、制限を追加するには上の方法を使わなければならず、"ALTER TABLE blubb ADD CHECK (geometry is not null);"のようなCHECK制限は使えません。
ときどき、テーブルで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カラムの構築と Changed: 2.0.0 制約を使う必要がある場合には、 |
Changed: 2.0.0 ビューについては、geometry_columnsへの手動登録はできなくなりました。しかし、typmodテーブルジオメトリに対して構築されていて、かつラッパ関数が無いビューは、親テーブルカラムのtypmodの挙動を継承するので、正しく登録されます。他のジオメトリを出力するジオメトリ関数を使うビューについては、ビューのジオメトリカラムが正しく登録されるようにするため、typmodジオメトリへのキャストが必要です。Section 4.6.3, “手動でジオメトリカラムをgeometry_columnsに登録する”を参照して下さい。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Enhanced: 2.0.0 use_typmod引数が導入されました。デフォルトでは制約を基にしたものでなくtypmodジオメトリカラムが生成されます。
-- Create schema to hold data CREATE SCHEMA my_schema; -- Create a new simple PostgreSQL table CREATE TABLE my_schema.my_spatial_table (id serial); -- Describing the table shows a simple table with a single "id" column. postgis=# \d my_schema.my_spatial_table Table "my_schema.my_spatial_table" Column | Type | Modifiers --------+---------+------------------------------------------------------------------------- id | integer | not null default nextval('my_schema.my_spatial_table_id_seq'::regclass) -- Add a spatial column to the table SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom',4326,'POINT',2); -- Add a point using the old constraint based behavior SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom_c',4326,'POINT',2, false); --Add a curvepolygon using old constraint behavior SELECT AddGeometryColumn ('my_schema','my_spatial_table','geomcp_c',4326,'CURVEPOLYGON',2, false); -- Describe the table again reveals the addition of a new geometry columns. \d my_schema.my_spatial_table addgeometrycolumn ------------------------------------------------------------------------- my_schema.my_spatial_table.geomcp_c SRID:4326 TYPE:CURVEPOLYGON DIMS:2 (1 row) Table "my_schema.my_spatial_table" Column | Type | Modifiers ----------+----------------------+------------------------------------------------------------------------- id | integer | not null default nextval('my_schema.my_spatial_table_id_seq'::regclass) geom | geometry(Point,4326) | geom_c | geometry | geomcp_c | geometry | Check constraints: "enforce_dims_geom_c" CHECK (st_ndims(geom_c) = 2) "enforce_dims_geomcp_c" CHECK (st_ndims(geomcp_c) = 2) "enforce_geotype_geom_c" CHECK (geometrytype(geom_c) = 'POINT'::text OR geom_c IS NULL) "enforce_geotype_geomcp_c" CHECK (geometrytype(geomcp_c) = 'CURVEPOLYGON'::text OR geomcp_c IS NULL) "enforce_srid_geom_c" CHECK (st_srid(geom_c) = 4326) "enforce_srid_geomcp_c" CHECK (st_srid(geomcp_c) = 4326) -- geometry_columns view also registers the new columns -- SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims FROM geometry_columns WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema'; col_name | type | srid | ndims ----------+--------------+------+------- geom | Point | 4326 | 2 geom_c | Point | 4326 | 2 geomcp_c | CurvePolygon | 4326 | 2
DropGeometryColumn — ジオメトリカラムを空間テーブルから除去します。
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 この関数は後方互換のためのものです。geometry_columnsは現在はシステムカタログに対するビューですので、他のテーブルのカラムと同じように |
SELECT DropGeometryColumn ('my_schema','my_spatial_table','geom'); ----RESULT output --- dropgeometrycolumn ------------------------------------------------------ my_schema.my_spatial_table.geom effectively removed. -- In PostGIS 2.0+ the above is also equivalent to the standard -- the standard alter table. Both will deregister from geometry_columns ALTER TABLE my_schema.my_spatial_table DROP column geom;
DropGeometryTable — テーブルとgeometry_columnsの当該テーブルへの参照の全てを削除します。
boolean DropGeometryTable(
varchar table_name)
;
boolean DropGeometryTable(
varchar schema_name, varchar table_name)
;
boolean DropGeometryTable(
varchar catalog_name, varchar schema_name, varchar table_name)
;
テーブルとgeometry_columnsの当該テーブルへの参照の全てを削除します。スキーマ対応版PostgreSQLではスキーマが与えられない場合はcurrent_schema()を使います。
Changed: 2.0.0で この関数は後方互換のためのものです。geometry_columnsは現在はシステムカタログに対するビューですので、他のテーブルのカラムと同じように |
SELECT DropGeometryTable ('my_schema','my_spatial_table'); ----RESULT output --- my_schema.my_spatial_table dropped. -- The above is now equivalent to -- DROP TABLE my_schema.my_spatial_table;
Find_SRID — ジオメトリカラムで定義されている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'); find_srid ---------- 4269
Populate_Geometry_Columns — ジオメトリカラムが型修飾子で定義されるか、適切な空間制約を持つようにします。
text Populate_Geometry_Columns(
boolean use_typmod=true)
;
int Populate_Geometry_Columns(
oid relation_oid, boolean use_typmod=true)
;
ジオメトリカラムが適切な型修飾子を持つか、geometry_columns
ビュー内で正しく登録されていることを確実にするために空間制約を持つようにします。デフォルトでは、型修飾子を持たないすべてのジオメトリカラムを型修飾子を持つカラムに変換します。
後方互換のためと、それぞれの子テーブルが異なるジオメトリタイプを持つテーブル継承といった空間テーブルにとって必要があるためとの二つの理由から、古い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
任意引数が導入されました。カラムが型修飾子で生成されるか制約チェックで作られるかの制御ができます。
CREATE TABLE public.myspatial_table(gid serial, geom geometry); INSERT INTO myspatial_table(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) ); -- This will now use typ modifiers. For this to work, there must exist data SELECT Populate_Geometry_Columns('public.myspatial_table'::regclass); populate_geometry_columns -------------------------- 1 \d myspatial_table Table "public.myspatial_table" Column | Type | Modifiers --------+---------------------------+--------------------------------------------------------------- gid | integer | not null default nextval('myspatial_table_gid_seq'::regclass) geom | geometry(LineString,4326) |
-- This will change the geometry columns to use constraints if they are not typmod or have constraints already. --For this to work, there must exist data CREATE TABLE public.myspatial_table_cs(gid serial, geom geometry); INSERT INTO myspatial_table_cs(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) ); SELECT Populate_Geometry_Columns('public.myspatial_table_cs'::regclass, false); populate_geometry_columns -------------------------- 1 \d myspatial_table_cs Table "public.myspatial_table_cs" Column | Type | Modifiers --------+----------+------------------------------------------------------------------ gid | integer | not null default nextval('myspatial_table_cs_gid_seq'::regclass) geom | geometry | Check constraints: "enforce_dims_geom" CHECK (st_ndims(geom) = 2) "enforce_geotype_geom" CHECK (geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL) "enforce_srid_geom" CHECK (st_srid(geom) = 4326)
UpdateGeometrySRID — ジオメトリカラム内の全ての地物のSRIDを更新し、テーブルのメタデータを更新します。
text UpdateGeometrySRID(
varchar table_name, varchar column_name, integer srid)
;
text UpdateGeometrySRID(
varchar schema_name, varchar table_name, varchar column_name, integer srid)
;
text UpdateGeometrySRID(
varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid)
;
ジオメトリカラム内の全ての地物のSRIDを更新し、制約を更新し、geometry_columnsの参照を更新します。カラムが型定義で強制されているなら、型定義は変更されます。ご注意: スキーマ対応版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番目の形式: ジオメトリの行集合を受け付ける集約関数。
入力ジオメトリのいずれかがコレクション (マルチ系ジオメトリまたはジオメトリコレクション)の場合には、ST_Collectはジオメトリコレクションを返します (入れ子になったコレクションを含む唯一のタイプであるため)。これを避けるには、サブクエリでST_Dump を使い、入力コレクションを分解できない要素にまで分解します (下に例があります)。 |
ST_CollectとST_Unionは似ているように見えますが、実際には全く異なる処理を行います。ST_Collectは入力ジオメトリを変更せずにコレクションにする集約関数です。ST_Unionは、オーバラップしている時は幾何学的に併合し、インタセクトするところでラインストリングを分割します。境界をディゾルブするときには単一のジオメトリを返す可能性があります。 |
Availability: 1.4.0 - ST_Collect(geometry)が導入されました。ST_Collectがより多くのジオメトリをより早く扱えるよう強化されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
2次元ポイントを収集します。
SELECT ST_AsText( ST_Collect( ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(-2 3)') )); st_astext ---------- MULTIPOINT((1 2),(-2 3))
2次元ポイントの収集
SELECT ST_AsEWKT( ST_Collect( ST_GeomFromEWKT('POINT(1 2 3)'), ST_GeomFromEWKT('POINT(1 2 4)') ) ); st_asewkt ------------------------- MULTIPOINT(1 2 3,1 2 4)
曲線を収集します。
SELECT ST_AsText( ST_Collect( 'CIRCULARSTRING(220268 150415,220227 150505,220227 150406)', 'CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)')); st_astext ------------------------------------------------------------------------------------ MULTICURVE(CIRCULARSTRING(220268 150415,220227 150505,220227 150406), CIRCULARSTRING(220227 150406,2220227 150407,220227 150406))
サブクエリから配列を生成するコンストラクタの使用。
SELECT ST_Collect( ARRAY( SELECT geom FROM sometable ) );
値から配列を生成するコンストラクタの使用。
SELECT ST_AsText( ST_Collect( ARRAY[ ST_GeomFromText('LINESTRING(1 2, 3 4)'), ST_GeomFromText('LINESTRING(3 4, 4 5)') ] )) As wktcollect; --wkt collect -- MULTILINESTRING((1 2,3 4),(3 4,4 5))
テーブル内のジオメトリのグループ化による複数コレクションを生成します。
SELECT stusps, ST_Collect(f.geom) as geom FROM (SELECT stusps, (ST_Dump(geom)).geom As geom FROM somestatetable ) As f GROUP BY stusps
ST_LineFromMultiPoint — マルチポイントジオメトリからラインストリングを生成します。
geometry ST_LineFromMultiPoint(
geometry aMultiPoint)
;
マルチポイントジオメトリからラインストリングを生成します。
ポイントまたはラインストリングの入力からラインを生成するにはST_MakeLineを使います。
この関数は3次元に対応し、Z値を削除しません。
マルチポイントジオメトリからラインストリングを生成します。
SELECT ST_AsEWKT( ST_LineFromMultiPoint('MULTIPOINT(1 2 3, 4 5 6, 7 8 9)') )); --result-- LINESTRING(1 2 3,4 5 6,7 8 9)
ST_MakeEnvelope — 座標値の最小値と最大値から矩形ポリゴンを生成します。
geometry ST_MakeEnvelope(
float xmin, float ymin, float xmax, float ymax, integer srid=unknown)
;
XとYの最小値と最大値から矩形ポリゴンを生成します。入力値はSRIDで指定された空間参照系に合わせなければなりません。SRIDが指定されていない場合には、不明な空間参照系 (SRID 0)が使われます。
Availability: 1.5
Enhanced: 2.0 SRID指定なしでエンベロープを指定できるようになりました。
SELECT ST_AsText( ST_MakeEnvelope(10, 10, 11, 11, 4326) ); st_asewkt ----------- POLYGON((10 10, 10 11, 11 11, 11 10, 10 10))
ST_MakeLine — POINT、MULTIPOINT、LINESTRINGから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: 2.3.0 - MULTIPOINT入力要素への対応が導入されました
Availability: 2.0.0 - LINESTRING入力要素への対応が導入されました
Availability: 1.4.0 - ST_MakeLine(geomarray)が導入されました。ST_MakeLine集約関数はより多くのポイントをより早く扱うための強化が施されています。
二つのポイントで構成されるラインを生成します。
SELECT ST_AsText( ST_MakeLine(ST_Point(1,2), ST_Point(3,4)) ); st_astext --------------------- LINESTRING(1 2,3 4)
二つの3次元ポイントから3次元ラインを生成します。
SELECT ST_AsEWKT( ST_MakeLine(ST_MakePoint(1,2,3), ST_MakePoint(3,4,5) )); st_asewkt ------------------------- LINESTRING(1 2 3,3 4 5)
二つの接続されていないラインストリングからラインを生成します。
select ST_AsText( ST_MakeLine( 'LINESTRING(0 0, 1 1)', 'LINESTRING(2 2, 3 3)' ) ); st_astext ----------------------------- LINESTRING(0 0,1 1,2 2,3 3)
並べ替えを伴うサブクエリで作られた配列からラインを生成します。
SELECT ST_MakeLine( ARRAY( SELECT ST_Centroid(geom) FROM visit_locations ORDER BY visit_time) );
3次元ポイントの配列から3次元ラインを生成します。
SELECT ST_AsEWKT( ST_MakeLine( ARRAY[ ST_MakePoint(1,2,3), ST_MakePoint(3,4,5), ST_MakePoint(6,6,6) ] )); st_asewkt ------------------------- LINESTRING(1 2 3,3 4 5,6 6 6)
この例ではGPSトラックの集合からポイントの時間ベースのシーケンスを問い合わせています。結果ジオメトリは、GPSトラックの移動順ポイントで構成されるラインストリングです。
ORDER BY
節を使うことで、正しい順序のLINESTRINGが生成できます。
SELECT gps.track_id, ST_MakeLine(gps.geom ORDER BY gps_time) As geom FROM gps_points As gps GROUP BY track_id;
PostgreSQL 9より前の版では、サブクエリでの順序付けを使うことができます。ただし、クエリプランでサブクエリの並び順が尊重されない場合があります。
SELECT gps.track_id, ST_MakeLine(gps.geom) As geom FROM ( SELECT track_id, gps_time, geom FROM gps_points ORDER BY track_id, gps_time ) As gps GROUP BY track_id;
ST_MakePoint — 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値を削除しません。
-- Create a point with unknown SRID SELECT ST_MakePoint(-71.1043443253471, 42.3150676015829); -- Create a point in the WGS 84 geodetic CRS SELECT ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829),4326); -- Create a 3D point (e.g. has altitude) SELECT ST_MakePoint(1, 2,1.5); -- Get z of point SELECT ST_Z(ST_MakePoint(1, 2,1.5)); result ------- 1.5
ST_MakePointM — X, Y, M値からポイントを生成します。
geometry ST_MakePointM(
float x, float y, float m)
;
X, Y, M座標値を持つポイントを生成します。XY, XYZ, XYZM座標のポイントを生成するにはST_MakePointを使います。
生成したポイントのSRIDを指定するにはST_SetSRIDを使います。
地理座標系について、 |
ST_PointM, ST_PointZM関数を使うと、与えられたSRIDを持ち、M値を持つポイントを生成することができます。 |
不明なSRIDでのポイントを生成します。
SELECT ST_AsEWKT( ST_MakePointM(-71.1043443253471, 42.3150676015829, 10) ); st_asewkt ----------------------------------------------- POINTM(-71.1043443253471 42.3150676015829 10)
WGS 84地理座標系のM値を持つポイントの生成。
SELECT ST_AsEWKT( ST_SetSRID( ST_MakePointM(-71.104, 42.315, 10), 4326)); st_asewkt --------------------------------------------------------- SRID=4326;POINTM(-71.104 42.315 10)
生成したポイントのM値を取得します。
SELECT ST_M( ST_MakePointM(-71.104, 42.315, 10) ); result ------- 10
ST_MakePolygon — 外殻と穴のリストからポリゴンを生成します。
geometry ST_MakePolygon(
geometry linestring)
;
geometry ST_MakePolygon(
geometry outerlinestring, geometry[] interiorlinestrings)
;
与えられた外殻と任意指定の穴の配列で掲載されるポリゴンを生成します。入力ジオメトリは閉じたラインストリング (リング)でなければなりません。
形式1: 一つの外殻のラインストリングを受け付けます。
形式2: 外殻のラインストリングと内部 (穴)のラインストリングの配列とを受け付けます。ジオメトリ配列はPostgreSQLのarray_agg(), ARRAY[], ARRAY()コンストラクタを使います。
この関数はマルチラインストリングを受け付けません。ラインストリングの生成にはST_LineMergeを使用します。また、ラインストリングを抽出するにはST_Dumpを使用します。 |
この関数は3次元に対応し、Z値を削除しません。
2次元ラインストリングからポリゴンを生成します。
SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)'));
開いたラインストリングを閉じるためにST_StartPointとST_AddPointを使用したうえでポリゴンを生成します。
SELECT ST_MakePolygon( ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line)) ) FROM ( SELECT ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)') As open_line) As foo;
3次元ラインストリングからポリゴンを生成します。
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)')); st_asewkt ----------- POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
M値を持つラインストリングからポリゴンを生成します。
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)' )); st_asewkt ---------- POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
余分な穴を持つドーナツポリゴンを生成します。
SELECT ST_MakePolygon( ST_ExteriorRing( ST_Buffer(ring.line,10)), ARRAY[ ST_Translate(ring.line, 1, 1), ST_ExteriorRing(ST_Buffer(ST_Point(20,20),1)) ] ) FROM (SELECT ST_ExteriorRing( ST_Buffer(ST_Point(10,10),10,10)) AS line ) AS ring;
湖を表現する穴を持つ県の境界の集合を生成します。入力は県ポリゴン/マルチポリゴンのテーブルと水涯線のラインストリングのテーブルです。湖を構成するラインはST_IsClosedで判定します。県を示すラインはST_Boundaryで抽出します。ST_MakePolygon
が必要ですので、境界をST_LineMergeで単一のLINESTRINGに強制します(県が二つ以上の領域を持つか島を持つ場合には、不正なポリゴンを生成します)。LEFT JOINを使って、湖の無い県を含む全ての県が返ることを保証しています。
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 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
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_AsText( ST_Polygon('LINESTRING(75 29, 77 29, 77 29, 75 29)'::geometry, 4326) ); -- result -- POLYGON((75 29, 77 29, 77 29, 75 29))
3次元ポリゴンを生成します。
SELECT ST_AsEWKT( ST_Polygon( ST_GeomFromEWKT('LINESTRING(75 29 1, 77 29 2, 77 29 3, 75 29 1)'), 4326) ); -- result -- SRID=4326;POLYGON((75 29 1, 77 29 2, 77 29 3, 75 29 1))
geometry ST_TileEnvelope(
integer tileZoom, integer tileX, integer tileY, geometry bounds=SRID=3857;LINESTRING(-20037508.342789 -20037508.342789,20037508.342789 20037508.342789), float margin=0.0)
;
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
SELECT ST_AsText( ST_TileEnvelope(2, 1, 1) ); st_astext ------------------------------ POLYGON((-10018754.1713945 0,-10018754.1713945 10018754.1713945,0 10018754.1713945,0 0,-10018754.1713945 0)) SELECT ST_AsText( ST_TileEnvelope(3, 1, 1, ST_MakeEnvelope(-180, -90, 180, 90, 4326) ) ); st_astext ------------------------------------------------------ POLYGON((-135 45,-135 67.5,-90 67.5,-90 45,-135 45))
ST_HexagonGrid — 引数ジオメトリの境界を完全にカバーする六角形とセルインデックスを返します。
setof record ST_HexagonGrid(
float8 size, geometry bounds)
;
平面の六角形タイルの概念から始まります。(地球の六角形タイルではなくH3タイルスキーマではありません)。平面 SRS とエッジサイズを与えると、SRS の原点から始まり、平面の一意な六角形のタイル、すなわち Tiling(SRS, Size)が一つ存在します。この関数は、指定されたTiling(SRS, Size)内の六角形が指定された境界を覆っているかどうかという質問に答えます。
出力六角形のSRSは境界ジオメトリのSRSです。
六角形の辺の長さを2倍または3倍にすることで、元のタイルに適合する新しい親タイルが生成されます。残念ながら子タイルが完全に親タイルの中に入るような親六角形タイルを生成することはできません。
Availability: 3.1.0
六角形タイリングに対してポイントをまとめるには、ポイントの範囲を境界として使って六角形グリッドを生成し、グリッドに空間的に結合します。
SELECT COUNT(*), hexes.geom FROM ST_HexagonGrid( 10000, ST_SetSRID(ST_EstimatedExtent('pointtable', 'geom'), 3857) ) AS hexes INNER JOIN pointtable AS pts ON ST_Intersects(pts.geom, hexes.geom) GROUP BY hexes.geom;
ポリゴン境界ごとに六角形の集合を生成し、六角形とインタセクトしないものを除外すると、ポリゴンごとのタイルとなります。
州のタイルは、それぞれの州の六角形のカバレッジとなり、複数の六角形が州境界で重なります。
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
SELECT ST_AsText(ST_SetSRID(ST_Hexagon(1.0, 0, 0), 3857)); POLYGON((-1 0,-0.5 -0.866025403784439,0.5 -0.866025403784439,1 0,0.5 0.866025403784439,-0.5 0.866025403784439,-1 0))
ST_SquareGrid — 引数ジオメトリの境界を完全にカバーするグリッド正方形とセルインデックスを返します。
setof record ST_SquareGrid(
float8 size, geometry bounds)
;
平面の正方形タイルの概念から始まります。与えられた平面SRSとエッジサイズに対して、SRS原点から始まり、一意の平面の正方形タイル(SRS, Size)が一つ存在します。この関数は、与えられたタイル(SRS, Size)内のグリッド内のどのタイルが与えられた境界とオーバラップするかという問題に答えを出します。
出力正方形のSRSは境界ジオメトリのSRSです。
正方形の2倍またはエッジサイズによって、新しい親タイルが生成されます。親タイルは完全に元のタイルに適合します。標準のウェブマップにおけるメルカトルのタイルは、メルカトル平面の2の累乗での正方形です。
Availability: 3.1.0
グリッドは国の境界全体を埋めます。国に接触する四角形が欲しい場合には、ST_Intersects後にフィルタリングする必要があります。
WITH grid AS ( SELECT (ST_SquareGrid(1, ST_Transform(geom,4326))).* FROM admin0 WHERE name = 'Canada' ) SELEcT ST_AsText(geom) FROM grid
正方形タイルのポイントのサマリを行うには、境界としてポイントの拡張を使った正方形グリッドを生成し、グリッドに空間的に結合します。推定範囲は実際の範囲と異なる場合があるのでご注意下さい。慎重に取り扱うようにし、最低でも確実にテーブルを解析して下さい。
SELECT COUNT(*), squares.geom FROM pointtable AS pts INNER JOIN ST_SquareGrid( 1000, ST_SetSRID(ST_EstimatedExtent('pointtable', 'geom'), 3857) ) AS squares ON ST_Intersects(pts.geom, squares.geom) GROUP BY squares.geom
これは最初の例と同じ結果になりますが、ポイント数が多くなると遅くなります。
SELECT COUNT(*), squares.geom FROM pointtable AS pts INNER JOIN ST_SquareGrid( 1000, pts.geom ) AS squares ON ST_Intersects(pts.geom, squares.geom) GROUP BY squares.geom
ST_Square — 与えられたエッジサイズと六角形グリッド空間内のセル座標を使って単一の正方形を返します。
geometry ST_Square(
float8 size, integer cell_i, integer cell_j, geometry origin)
;
ST_SquareGridと同じ正方形タイルの概念を使っていますが、求めるセルの座標に一つだけの正方形を生成します。任意でタイルの原点の座標を調整できます。デフォルトの原点座標は0,0です。
四角形はSRIDの設定なしで生成されるので、SRIDを期待する値に設定するためにST_SetSRIDを使います。
Availability: 3.1.0
SELECT ST_AsText(ST_SetSRID(ST_Square(1.0, 0, 0), 3857)); POLYGON((0 0,0 1,1 1,1 0,0 0))
ST_Letters — デフォルトの開始位置を原点とし、デフォルトの高さを100とする、ジオメトリとして描画された文字を返します。
geometry ST_Letters(
text letters, json font)
;
組込みフォントを使って、出力文字列をマルチポリゴンとして描画します。ディセンダからキャピタルまでの文字高さは100.0です。デフォルトのベースラインの開始位置は原点に置かれます。フォントのオーバライドは文字をキーとしたJSONマッピングと、ディセンダからキャピタルまでの1000単位の高さを持つフォント形状のTWKBをbase64エンコードしたものを渡します。
テキストは、デフォルトでは原点に生成されるので、テキストの位置変更とサイズ変更とを行います。最初にST_Scale
関数を適用し、その後ST_Translate
関数を適用します。
Availability: 3.3.0
SELECT ST_AsText(ST_Letters('Yo'), 1);
SELECT ST_Translate(ST_Scale(ST_Letters('Yo'), 10, 10), 100,100);
geometry_dump
行の集合を返します。geometry_dump
行の集合を返します。geometry_dump
行の集合を返します。geometry_dump
行の集合を返します。GeometryType — ジオメトリのタイプを文字列で返します。
text GeometryType(
geometry geomA)
;
ジオメトリ型を'LINESTRING', 'POLYGON', 'MULTIPOINT'などの文字列で返します。
OGC SPEC s2.1.1.1 - このジオメトリインスタンスがメンバーになっているジオメトリのインスタンス化可能な派生タイプの名前を返します。インスタンス化可能な派生タイプの名前は、文字列として返されます。
この関数は、'POINTM'等が返るので、ジオメトリがM値を持っているかどうかも示します。 |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); geometrytype -------------- LINESTRING
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result POLYHEDRALSURFACE
SELECT GeometryType(geom) as result FROM (SELECT ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') AS geom ) AS g; result -------- TIN
ST_Boundary — ジオメトリの境界を返します。
geometry ST_Boundary(
geometry geomA)
;
ジオメトリの組み合わせ境界の閉包を返します (訳注: ラインストリングは端点、ポリゴンはエッジ、複合オブジェクトは境界のうち奇数番)。組み合わせ境界はOGC仕様の3.12.3.2節に記述されています。結果として出てくる境界は、OGC 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を使いません。曲線を線形化しません。
SELECT ST_Boundary(geom) FROM (SELECT 'LINESTRING(100 150,50 60, 70 80, 160 170)'::geometry As geom) As f;
ST_AsText output
MULTIPOINT((100 150),(160 170))
|
SELECT ST_Boundary(geom) FROM (SELECT 'POLYGON (( 10 130, 50 190, 110 190, 140 150, 150 80, 100 10, 20 40, 10 130 ), ( 70 40, 100 50, 120 80, 80 110, 50 90, 70 40 ))'::geometry As geom) As f;
ST_AsText output
MULTILINESTRING((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130),
(70 40,100 50,120 80,80 110,50 90,70 40))
|
SELECT ST_AsText(ST_Boundary(ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)'))); st_astext ----------- MULTIPOINT((1 1),(-1 1)) SELECT ST_AsText(ST_Boundary(ST_GeomFromText('POLYGON((1 1,0 0, -1 1, 1 1))'))); st_astext ---------- LINESTRING(1 1,0 0,-1 1,1 1) --Using a 3d polygon SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromEWKT('POLYGON((1 1 1,0 0 1, -1 1 1, 1 1 1))'))); st_asewkt ----------------------------------- LINESTRING(1 1 1,0 0 1,-1 1 1,1 1 1) --Using a 3d multilinestring SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromEWKT('MULTILINESTRING((1 1 1,0 0 0.5, -1 1 1),(1 1 0.5,0 0 0.5, -1 1 0.5, 1 1 0.5) )'))); st_asewkt ---------- MULTIPOINT((-1 1 1),(1 1 0.75))
ST_BoundingDiagonal — ジオメトリのバウンディングボックスの対角線を返します。
geometry ST_BoundingDiagonal(
geometry geom, boolean fits=false)
;
与えられたジオメトリのバウンディングボックスの対角線をラインストリングで返します。最小値のポイントを始点とし、最大値のポイントを終点とする、二つのポイントからなるラインストリングになります。入力ジオメトリが空の場合には、対角線はLINESTRING EMPTYとなります。
fits
パラメータは、最良適合が必要かどうかを指定するものです。FALSEの場合には、幾分大きめなバウンディングボックスの対角線を受け付けることができます (多数の頂点からなるジオメトリの取得が早くなります)。いずれにしても返された対角線のバウンディングボックスは常に入力ジオメトリを含みます。
返されるラインストリングは常に、入力ジオメトリのSRIDと次元 (ZとMがあること)を維持します。
縮退した (入力の頂点が一つ)場合、返されるラインストリングは形式的に不正です (内部が無い)。トポロジ的には妥当です。 |
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
-- Get the minimum X in a buffer around a point SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal( ST_Buffer(ST_Point(0,0),10) ))); st_x ------ -10
ST_StartPoint, ST_EndPoint, ST_X, ST_Y, ST_Z, ST_M, ST_Envelope
ST_CoordDim — ジオメトリの座標次元を返します。
integer ST_CoordDim(
geometry geomA)
;
ST_Geometry値の座標次元を返します。
この関数はST_NDimsのMM対応の別名です。
このメソッドは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)'); ---result-- 3 SELECT ST_CoordDim(ST_Point(1,2)); --result-- 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
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。空ジオメトリを与えた場合に例外を投げなくなりました。
2.0.0より前では、空ジオメトリを与えると例外を投げていました。 |
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT ST_Dimension('GEOMETRYCOLLECTION(LINESTRING(1 1,0 0),POINT(0 0))'); ST_Dimension ----------- 1
ST_Dump — ジオメトリの要素となるgeometry_dump
行の集合を返します。
geometry_dump[] ST_Dump(
geometry g1)
;
ジオメトリ要素を抽出する、集合を返す関数 (SRF=Set-Returning Function)です。ジオメトリ (geom
フィールド)と整数配列 (path
フィールド)からなるgeometry_dump行の集合を返します。
非マルチ系ジオメトリタイプ (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値を削除しません。
SELECT sometable.field1, sometable.field1, (ST_Dump(sometable.geom)).geom AS geom FROM sometable; -- Break a compound curve into its constituent linestrings and circularstrings SELECT ST_AsEWKT(a.geom), ST_HasArc(a.geom) FROM ( SELECT (ST_Dump(p_geom)).geom AS geom FROM (SELECT ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))') AS p_geom) AS b ) AS a; st_asewkt | st_hasarc -----------------------------+---------- CIRCULARSTRING(0 0,1 1,1 0) | t LINESTRING(1 0,0 1) | f (2 rows)
-- Polyhedral surface example -- Break a Polyhedral surface into its faces SELECT (a.p_geom).path[1] As path, ST_AsEWKT((a.p_geom).geom) As geom_ewkt FROM (SELECT ST_Dump(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )') ) AS p_geom ) AS a; path | geom_ewkt ------+------------------------------------------ 1 | POLYGON((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)) 2 | POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)) 3 | POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)) 4 | POLYGON((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)) 5 | POLYGON((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)) 6 | POLYGON((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1))
-- TIN -- SELECT (g.gdump).path, ST_AsEWKT((g.gdump).geom) as wkt FROM (SELECT ST_Dump( ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') ) AS gdump ) AS g; -- result -- path | wkt ------+------------------------------------- {1} | TRIANGLE((0 0 0,0 0 1,0 1 0,0 0 0)) {2} | TRIANGLE((0 0 0,0 1 0,1 1 0,0 0 0))
ST_DumpPoints — ジオメトリ内の座標の行であるgeometry_dump
行の集合を返します。
geometry_dump[] ST_DumpPoints(
geometry geom)
;
ジオメトリの座標 (頂点)を抽出する、集合を返す関数 (SRF=Set-Returning Function)です。ジオメトリ (geom
フィールド)と整数配列 (path
フィールド)からなるgeometry_dump行の集合を返します。
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値を削除しません。
SELECT edge_id, (dp).path[1] As index, ST_AsText((dp).geom) As wktnode FROM (SELECT 1 As edge_id , ST_DumpPoints(ST_GeomFromText('LINESTRING(1 2, 3 4, 10 10)')) AS dp UNION ALL SELECT 2 As edge_id , ST_DumpPoints(ST_GeomFromText('LINESTRING(3 5, 5 6, 9 10)')) AS dp ) As foo; edge_id | index | wktnode ---------+-------+-------------- 1 | 1 | POINT(1 2) 1 | 2 | POINT(3 4) 1 | 3 | POINT(10 10) 2 | 1 | POINT(3 5) 2 | 2 | POINT(5 6) 2 | 3 | POINT(9 10)
SELECT path, ST_AsText(geom) FROM ( SELECT (ST_DumpPoints(g.geom)).* FROM (SELECT 'GEOMETRYCOLLECTION( POINT ( 0 1 ), LINESTRING ( 0 3, 3 4 ), POLYGON (( 2 0, 2 3, 0 2, 2 0 )), POLYGON (( 3 0, 3 3, 6 3, 6 0, 3 0 ), ( 5 1, 4 2, 5 2, 5 1 )), MULTIPOLYGON ( (( 0 5, 0 8, 4 8, 4 5, 0 5 ), ( 1 6, 3 6, 2 7, 1 6 )), (( 5 4, 5 8, 6 7, 5 4 )) ) )'::geometry AS geom ) AS g ) j; path | st_astext -----------+------------ {1,1} | POINT(0 1) {2,1} | POINT(0 3) {2,2} | POINT(3 4) {3,1,1} | POINT(2 0) {3,1,2} | POINT(2 3) {3,1,3} | POINT(0 2) {3,1,4} | POINT(2 0) {4,1,1} | POINT(3 0) {4,1,2} | POINT(3 3) {4,1,3} | POINT(6 3) {4,1,4} | POINT(6 0) {4,1,5} | POINT(3 0) {4,2,1} | POINT(5 1) {4,2,2} | POINT(4 2) {4,2,3} | POINT(5 2) {4,2,4} | POINT(5 1) {5,1,1,1} | POINT(0 5) {5,1,1,2} | POINT(0 8) {5,1,1,3} | POINT(4 8) {5,1,1,4} | POINT(4 5) {5,1,1,5} | POINT(0 5) {5,1,2,1} | POINT(1 6) {5,1,2,2} | POINT(3 6) {5,1,2,3} | POINT(2 7) {5,1,2,4} | POINT(1 6) {5,2,1,1} | POINT(5 4) {5,2,1,2} | POINT(5 8) {5,2,1,3} | POINT(6 7) {5,2,1,4} | POINT(5 4) (29 rows)
-- Polyhedral surface cube -- SELECT (g.gdump).path, ST_AsEWKT((g.gdump).geom) as wkt FROM (SELECT ST_DumpPoints(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )') ) AS gdump ) AS g; -- result -- path | wkt ---------+-------------- {1,1,1} | POINT(0 0 0) {1,1,2} | POINT(0 0 1) {1,1,3} | POINT(0 1 1) {1,1,4} | POINT(0 1 0) {1,1,5} | POINT(0 0 0) {2,1,1} | POINT(0 0 0) {2,1,2} | POINT(0 1 0) {2,1,3} | POINT(1 1 0) {2,1,4} | POINT(1 0 0) {2,1,5} | POINT(0 0 0) {3,1,1} | POINT(0 0 0) {3,1,2} | POINT(1 0 0) {3,1,3} | POINT(1 0 1) {3,1,4} | POINT(0 0 1) {3,1,5} | POINT(0 0 0) {4,1,1} | POINT(1 1 0) {4,1,2} | POINT(1 1 1) {4,1,3} | POINT(1 0 1) {4,1,4} | POINT(1 0 0) {4,1,5} | POINT(1 1 0) {5,1,1} | POINT(0 1 0) {5,1,2} | POINT(0 1 1) {5,1,3} | POINT(1 1 1) {5,1,4} | POINT(1 1 0) {5,1,5} | POINT(0 1 0) {6,1,1} | POINT(0 0 1) {6,1,2} | POINT(1 0 1) {6,1,3} | POINT(1 1 1) {6,1,4} | POINT(0 1 1) {6,1,5} | POINT(0 0 1) (30 rows)
-- Triangle -- SELECT (g.gdump).path, ST_AsText((g.gdump).geom) as wkt FROM (SELECT ST_DumpPoints( ST_GeomFromEWKT('TRIANGLE (( 0 0, 0 9, 9 0, 0 0 ))') ) AS gdump ) AS g; -- result -- path | wkt ------+------------ {1} | POINT(0 0) {2} | POINT(0 9) {3} | POINT(9 0) {4} | POINT(0 0)
-- TIN -- SELECT (g.gdump).path, ST_AsEWKT((g.gdump).geom) as wkt FROM (SELECT ST_DumpPoints( ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') ) AS gdump ) AS g; -- result -- path | wkt ---------+-------------- {1,1,1} | POINT(0 0 0) {1,1,2} | POINT(0 0 1) {1,1,3} | POINT(0 1 0) {1,1,4} | POINT(0 0 0) {2,1,1} | POINT(0 0 0) {2,1,2} | POINT(0 1 0) {2,1,3} | POINT(1 1 0) {2,1,4} | POINT(0 0 0) (8 rows)
ST_DumpSegments — ジオメトリ内の辺の行であるgeometry_dump
行の集合を返します。
geometry_dump[] ST_DumpSegments(
geometry geom)
;
ジオメトリの辺を抽出する、集合を返す関数 (SRF=Set-Returning Function)です。ジオメトリ (geom
フィールド)と整数配列 (path
フィールド)からなるgeometry_dump行の集合を返します。
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, ST_AsText(geom) FROM ( SELECT (ST_DumpSegments(g.geom)).* FROM (SELECT 'GEOMETRYCOLLECTION( LINESTRING(1 1, 3 3, 4 4), POLYGON((5 5, 6 6, 7 7, 5 5)) )'::geometry AS geom ) AS g ) j; path │ st_astext --------------------------------- {1,1} │ LINESTRING(1 1,3 3) {1,2} │ LINESTRING(3 3,4 4) {2,1,1} │ LINESTRING(5 5,6 6) {2,1,2} │ LINESTRING(6 6,7 7) {2,1,3} │ LINESTRING(7 7,5 5) (5 rows)
-- Triangle -- SELECT path, ST_AsText(geom) FROM ( SELECT (ST_DumpSegments(g.geom)).* FROM (SELECT 'TRIANGLE(( 0 0, 0 9, 9 0, 0 0 ))'::geometry AS geom ) AS g ) j; path │ st_astext --------------------------------- {1,1} │ LINESTRING(0 0,0 9) {1,2} │ LINESTRING(0 9,9 0) {1,3} │ LINESTRING(9 0,0 0) (3 rows)
-- TIN -- SELECT path, ST_AsEWKT(geom) FROM ( SELECT (ST_DumpSegments(g.geom)).* FROM (SELECT 'TIN((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )'::geometry AS geom ) AS g ) j; path │ st_asewkt --------------------------------- {1,1,1} │ LINESTRING(0 0 0,0 0 1) {1,1,2} │ LINESTRING(0 0 1,0 1 0) {1,1,3} │ LINESTRING(0 1 0,0 0 0) {2,1,1} │ LINESTRING(0 0 0,0 1 0) {2,1,2} │ LINESTRING(0 1 0,1 1 0) {2,1,3} │ LINESTRING(1 1 0,0 0 0) (6 rows)
ST_DumpRings — ポリゴンのリングごとのgeometry_dump
行の集合を返します。
geometry_dump[] ST_DumpRings(
geometry a_polygon)
;
ジオメトリ要素を抽出する、集合を返す関数 (SRF=Set-Returning Function)です。ジオメトリ (geom
フィールド)と整数配列 (path
フィールド)からなるgeometry_dump行の集合を返します。
ジオメトリ要素を抽出する、集合を返す関数 (SRF=Set-Returning Function)です。ジオメトリ (geom
フィールド)と整数配列 (path
フィールド)からなるgeometry_dump行の集合を返します。
POLYGONジオメトリでのみ動作します。MULTIPOLYGONでは動作しません。 |
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, ST_AsEWKT(geom) As geom FROM ST_DumpRings( ST_GeomFromEWKT('POLYGON((-8149064 5133092 1,-8149064 5132986 1,-8148996 5132839 1,-8148972 5132767 1,-8148958 5132508 1,-8148941 5132466 1,-8148924 5132394 1, -8148903 5132210 1,-8148930 5131967 1,-8148992 5131978 1,-8149237 5132093 1,-8149404 5132211 1,-8149647 5132310 1,-8149757 5132394 1, -8150305 5132788 1,-8149064 5133092 1), (-8149362 5132394 1,-8149446 5132501 1,-8149548 5132597 1,-8149695 5132675 1,-8149362 5132394 1))') ) as foo; path | geom ---------------------------------------------------------------------------------------------------------------- {0} | POLYGON((-8149064 5133092 1,-8149064 5132986 1,-8148996 5132839 1,-8148972 5132767 1,-8148958 5132508 1, | -8148941 5132466 1,-8148924 5132394 1, | -8148903 5132210 1,-8148930 5131967 1, | -8148992 5131978 1,-8149237 5132093 1, | -8149404 5132211 1,-8149647 5132310 1,-8149757 5132394 1,-8150305 5132788 1,-8149064 5133092 1)) {1} | POLYGON((-8149362 5132394 1,-8149446 5132501 1, | -8149548 5132597 1,-8149695 5132675 1,-8149362 5132394 1))
ST_EndPoint — LINESTRINGまたはCIRCULARLINESTRINGの終端のポイントを返します。
geometry ST_EndPoint(
geometry g)
;
LINESTRING
またはCIRCULARLINESTRING
ジオメトリの、最後のポイントをPOINT
で返します。入力パラメータがLINESTRING
でもCIRCULARLINESTRING
でもない場合には、NULL
を返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 7.1.4
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
Changed: 2.0.0 一つのジオメトリマルチラインストリングで動作しなくなりました。PostGIS の古いバージョンでは、この関数は一つのマルチラインストリングで動作し、終端ポイントを返します。2.0.0では、他のマルチラインストリングと同様にNULLを返します。古い動作は文書化されていない機能でしたが、データをLINESTRINGとして格納していると思われるユーザーは、2.0.0 でNULLが返されることを経験するかも知れません。 |
ラインストリングの終端ポイント
postgis=# SELECT ST_AsText(ST_EndPoint('LINESTRING(1 1, 2 2, 3 3)'::geometry)); st_astext ------------ POINT(3 3)
ラインストリング以外の終端ポイントはNULL
SELECT ST_EndPoint('POINT(1 1)'::geometry) IS NULL AS is_null; is_null ---------- t
3次元ラインストリングの終端ポイント
--3d endpoint SELECT ST_AsEWKT(ST_EndPoint('LINESTRING(1 1 2, 1 2 3, 0 0 5)')); st_asewkt -------------- POINT(0 0 5)
CIRCULARSTRINGの終端ポイント
SELECT ST_AsText(ST_EndPoint('CIRCULARSTRING(5 2,-3 1.999999, -2 1, -4 2, 6 3)'::geometry)); st_astext ------------ POINT(6 3)
ST_Envelope — ジオメトリのバウンディングボックスを表現するジオメトリを返します。
geometry ST_Envelope(
geometry g1)
;
与えられたジオメトリの倍精度浮動小数点数 (float8)の最小バウンディングボックスをジオメトリで返します。ポリゴンはバウンディングボックスの角のポイントで定義されます ((MINX
, MINY
), (MINX
, MAXY
), (MAXX
, MAXY
), (MAXX
, MINY
), (MINX
, MINY
))。(PostGISはZMIN
/ZMAX
も追加します).
縮退する場合 (縦のライン、ポイント)はPOLYGON
より低い次元のジオメトリ、すなわちPOINT
またはLINESTRING
を返します。
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_AsText(ST_Envelope('POINT(1 3)'::geometry)); st_astext ------------ POINT(1 3) (1 row) SELECT ST_AsText(ST_Envelope('LINESTRING(0 0, 1 3)'::geometry)); st_astext -------------------------------- POLYGON((0 0,0 3,1 3,1 0,0 0)) (1 row) SELECT ST_AsText(ST_Envelope('POLYGON((0 0, 0 1, 1.0000001 1, 1.0000001 0, 0 0))'::geometry)); st_astext -------------------------------------------------------------- POLYGON((0 0,0 1,1.00000011920929 1,1.00000011920929 0,0 0)) (1 row) SELECT ST_AsText(ST_Envelope('POLYGON((0 0, 0 1, 1.0000000001 1, 1.0000000001 0, 0 0))'::geometry)); st_astext -------------------------------------------------------------- POLYGON((0 0,0 1,1.00000011920929 1,1.00000011920929 0,0 0)) (1 row) SELECT Box3D(geom), Box2D(geom), ST_AsText(ST_Envelope(geom)) As envelopewkt FROM (SELECT 'POLYGON((0 0, 0 1000012333334.34545678, 1.0000001 1, 1.0000001 0, 0 0))'::geometry As geom) As foo;
SELECT ST_AsText(ST_Envelope( ST_Collect( ST_GeomFromText('LINESTRING(55 75,125 150)'), ST_Point(20, 80)) )) As wktenv; wktenv ----------- POLYGON((20 75,20 150,125 150,125 75,20 75))
ST_ExteriorRing — ポリゴンの外環を表現するラインストリングを返します。
geometry ST_ExteriorRing(
geometry a_polygon)
;
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値を削除しません。
--If you have a table of polygons SELECT gid, ST_ExteriorRing(geom) AS ering FROM sometable; --If you have a table of MULTIPOLYGONs --and want to return a MULTILINESTRING composed of the exterior rings of each polygon SELECT gid, ST_Collect(ST_ExteriorRing(geom)) AS erings FROM (SELECT gid, (ST_Dump(geom)).geom As geom FROM sometable) As foo GROUP BY gid; --3d Example SELECT ST_AsEWKT( ST_ExteriorRing( ST_GeomFromEWKT('POLYGON((0 0 1, 1 1 1, 1 2 1, 1 1 1, 0 0 1))') ) ); st_asewkt --------- LINESTRING(0 0 1,1 1 1,1 2 1,1 1 1,0 0 1)
ST_GeometryN — ジオメトリコレクションの要素を一つ返します。
geometry ST_GeometryN(
geometry geomA, integer n)
;
GEOMETRYCOLLECTION, MULTIPOINT, MULTILINESTRING, MULTICURVE, MULTIPOLYGON, POLYHEDRALSURFACEの入力ジオメトリの、1始まりでN番目の要素を返します。他の場合にはNULLを返します。
OGC仕様のため0.8.0版からインデクスを1始まりにしています。これより前の版では0始まりになっています。 |
ジオメトリの全ての要素を抽出するにはST_Dumpの方が効率的ですし、単一ジオメトリでも動作します。 |
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Changed: 2.0.0 以前の版では非マルチのジオメトリではNULLが返りました。ST_GeometryN(..,1)の場合にはジオメトリを返すよう変更されました。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.1.5
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
--Extracting a subset of points from a 3d multipoint SELECT n, ST_AsEWKT(ST_GeometryN(geom, n)) As geomewkt FROM ( VALUES (ST_GeomFromEWKT('MULTIPOINT((1 2 7), (3 4 7), (5 6 7), (8 9 10))') ), ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') ) )As foo(geom) CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(geom); n | geomewkt ---+----------------------------------------- 1 | POINT(1 2 7) 2 | POINT(3 4 7) 3 | POINT(5 6 7) 4 | POINT(8 9 10) 1 | CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5) 2 | LINESTRING(10 11,12 11) --Extracting all geometries (useful when you want to assign an id) SELECT gid, n, ST_GeometryN(geom, n) FROM sometable CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(geom);
-- Polyhedral surface example -- Break a Polyhedral surface into its faces SELECT ST_AsEWKT(ST_GeometryN(p_geom,3)) As geom_ewkt FROM (SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )') AS p_geom ) AS a; geom_ewkt ------------------------------------------ POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0))
-- TIN -- SELECT ST_AsEWKT(ST_GeometryN(geom,2)) as wkt FROM (SELECT ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') AS geom ) AS g; -- result -- wkt ------------------------------------- TRIANGLE((0 0 0,0 1 0,1 1 0,0 0 0))
ST_GeometryType — ジオメトリのSQL-MM型を文字列で返します。
text ST_GeometryType(
geometry g1)
;
ジオメトリ型を'ST_LineString', 'ST_Polygon', 'ST_MultiPolygon'等の文字列で返します。この関数はGeometryType(geometry)とは異なり、先頭に'ST'が付き、M値を持っているかを示しません。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.4
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
SELECT ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result ST_LineString
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result ST_PolyhedralSurface
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result ST_PolyhedralSurface
SELECT ST_GeometryType(geom) as result FROM (SELECT ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )') AS geom ) AS g; result -------- ST_Tin
ST_HasArc — ジオメトリに円弧が含まれているかどうかテストします。
boolean ST_HasArc(
geometry geomA)
;
ジオメトリまたはジオメトリコレクションに曲線ラインストリングが含まれている場合にTRUEを返します。
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)')); st_hasarc -------- 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値を削除しません。
SELECT ST_AsText(ST_InteriorRingN(geom, 1)) As geom FROM (SELECT ST_BuildArea( ST_Collect(ST_Buffer(ST_Point(1,2), 20,3), ST_Buffer(ST_Point(1, 2), 10,3))) As geom ) as foo;
ST_NumCurves — 複合曲線内の曲線の数を返します。
integer ST_NumCurves(
geometry a_compoundcurve)
;
複合曲線内の曲線の数を返します。入力が空の複合曲線の場合には0を返し、複合曲線でない場合にはNULLを返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.6, 8.3.5
この関数は3次元に対応し、Z値を削除しません。
-- Returns 3 SELECT ST_NumCurves('COMPOUNDCURVE( (2 2, 2.5 2.5), CIRCULARSTRING(2.5 2.5, 4.5 2.5, 3.5 3.5), (3.5 3.5, 2.5 4.5, 3 5, 2 2) )'); -- Returns 0 SELECT ST_NumCurves('COMPOUNDCURVE EMPTY');
ST_CurveN — 複合曲線の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値を削除しません。
SELECT ST_AsText(ST_CurveN('COMPOUNDCURVE( (2 2, 2.5 2.5), CIRCULARSTRING(2.5 2.5, 4.5 2.5, 3.5 3.5), (3.5 3.5, 2.5 4.5, 3 5, 2 2) )', 1));
ST_IsClosed — ラインストリングの始点と終点が一致しているかをテストします。多面体サーフェスについては閉じているか (立体であるか)をテストします。
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 多面体サーフェス対応が導入されました。
この関数は多面体サーフェスに対応しています。
postgis=# SELECT ST_IsClosed('LINESTRING(0 0, 1 1)'::geometry); st_isclosed ------------- f (1 row) postgis=# SELECT ST_IsClosed('LINESTRING(0 0, 0 1, 1 1, 0 0)'::geometry); st_isclosed ------------- t (1 row) postgis=# SELECT ST_IsClosed('MULTILINESTRING((0 0, 0 1, 1 1, 0 0),(0 0, 1 1))'::geometry); st_isclosed ------------- f (1 row) postgis=# SELECT ST_IsClosed('POINT(0 0)'::geometry); st_isclosed ------------- t (1 row) postgis=# SELECT ST_IsClosed('MULTIPOINT((0 0), (1 1))'::geometry); st_isclosed ------------- t (1 row)
-- A cube -- SELECT ST_IsClosed(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); st_isclosed ------------- t -- Same as cube but missing a side -- SELECT ST_IsClosed(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)) )')); st_isclosed ------------- f
ST_IsCollection — ジオメトリのタイプがジオメトリコレクションかをテストします。
boolean ST_IsCollection(
geometry g)
;
ジオメトリのタイプがジオメトリコレクションである場合にTRUE
を返します。コレクションは次の通りです。
ジオメトリコレクション
マルチポイント、マルチポリゴン、マルチラインストリング、マルチ曲線、マルチサーフェス
複合曲線
この関数はジオメトリのタイプを解析します。これは、空のコレクションである場合、または一つのエレメントを持つコレクションである場合には |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
postgis=# SELECT ST_IsCollection('LINESTRING(0 0, 1 1)'::geometry); st_iscollection ------------- f (1 row) postgis=# SELECT ST_IsCollection('MULTIPOINT EMPTY'::geometry); st_iscollection ------------- t (1 row) postgis=# SELECT ST_IsCollection('MULTIPOINT((0 0))'::geometry); st_iscollection ------------- t (1 row) postgis=# SELECT ST_IsCollection('MULTIPOINT((0 0), (42 42))'::geometry); st_iscollection ------------- t (1 row) postgis=# SELECT ST_IsCollection('GEOMETRYCOLLECTION(POINT(0 0))'::geometry); st_iscollection ------------- t (1 row)
ST_IsEmpty — ジオメトリが空かをテストします。
boolean ST_IsEmpty(
geometry geomA)
;
ジオメトリが空ジオメトリの場合にtrueを返します。 trueの場合には、このジオメトリは、空のジオメトリコレクション、ポリゴン、ポイント等です。
SQL-MMでは、ST_IsEmpty(NULL)は0を返しますが、PostGISではNULLを返します。 |
このメソッドは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(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY')); st_isempty ------------ t (1 row) SELECT ST_IsEmpty(ST_GeomFromText('POLYGON EMPTY')); st_isempty ------------ t (1 row) SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')); st_isempty ------------ f (1 row) SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')) = false; ?column? ---------- t (1 row) SELECT ST_IsEmpty(ST_GeomFromText('CIRCULARSTRING EMPTY')); st_isempty ------------ t (1 row)
ST_IsPolygonCCW — ポリゴンが反時計回りの外環を持っていて、時計回りの内環を持っているかをテストします。
boolean ST_IsPolygonCCW (
geometry geom )
;
入力ジオメトリの全てのポリゴン要素の外環については反時計回りで、全ての内環については時計回りである場合には、TRUEを返します。
ジオメトリがポリゴン要素を持っていない場合にはTRUEを返します。
閉じたラインストリングはポリゴン要素とみなされません。単一の閉じたラインストリングを渡すと、右回り左回りにかかわらずTRUEが得られます。 |
ポリゴン要素の内環が逆回りになっていない (すなわち外環と同じ方向で回る内環が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)
;
このLINESTRING
がST_IsClosed(ST_StartPoint(g) ~= ST_Endpoint(g)
)かつST_IsSimple(自己交差していない)場合にはTRUE
を返します。
このメソッドは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(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')); st_issimple ------------- f (1 row) SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)')); st_issimple ------------- f (1 row)
ST_M — ポイントのM値を返します。
float ST_M(
geometry a_point)
;
ポイントのM座標値を返し、有効でないならNULLを返します。入力はポイントでなければなりません。
これは (いまだに)OGC仕様に入っていませんが、ポイント座標抽出関数のリストを完全にするために挙げています。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_M(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_m ------ 4 (1 row)
ST_MemSize — ジオメトリが取るメモリ空間の合計を返します。
integer ST_MemSize(
geometry geomA)
;
ジオメトリが取るメモリ空間の合計をバイト単位で返します。
この関数は、PostgreSQLビルトインデータベースオブジェクト管理関数のpg_column_size, pg_size_pretty, pg_relation_size, pg_total_relation_sizeを補完します。
テーブルのバイト単位のサイズを与えるpg_relation_sizeはST_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に変更しました。
--Return how much byte space Boston takes up in our Mass data set SELECT pg_size_pretty(SUM(ST_MemSize(geom))) as totgeomsum, pg_size_pretty(SUM(CASE WHEN town = 'BOSTON' THEN ST_MemSize(geom) ELSE 0 END)) As bossum, CAST(SUM(CASE WHEN town = 'BOSTON' THEN ST_MemSize(geom) ELSE 0 END)*1.00 / SUM(ST_MemSize(geom))*100 As numeric(10,2)) As perbos FROM towns; totgeomsum bossum perbos ---------- ------ ------ 1522 kB 30 kB 1.99 SELECT ST_MemSize(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')); --- 73 --What percentage of our table is taken up by just the geometry SELECT pg_total_relation_size('public.neighborhoods') As fulltable_size, sum(ST_MemSize(geom)) As geomsize, sum(ST_MemSize(geom))*1.00/pg_total_relation_size('public.neighborhoods')*100 As pergeom FROM neighborhoods; fulltable_size geomsize pergeom ------------------------------------------------ 262144 96238 36.71188354492187500000
ST_NDims — 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(ST_GeomFromText('POINT(1 1)')) As d2point, ST_NDims(ST_GeomFromEWKT('POINT(1 1 2)')) As d3point, ST_NDims(ST_GeomFromEWKT('POINTM(1 1 0.5)')) As d2pointm; d2point | d3point | d2pointm ---------+---------+---------- 2 | 3 | 3
ST_NPoints — ジオメトリのポイント (頂点)の数を返します。
integer ST_NPoints(
geometry g1)
;
ジオメトリのポイントの数を返します。全てのジオメトリに対して動作します。
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。 |
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_NPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result 4 --Polygon in 3D space SELECT ST_NPoints(ST_GeomFromEWKT('LINESTRING(77.29 29.07 1,77.42 29.26 0,77.27 29.31 -1,77.29 29.07 3)')) --result 4
ST_NRings — ポリゴンジオメトリのリング数を返します。
integer ST_NRings(
geometry geomA)
;
ジオメトリがポリゴンまたはマルチポリゴンの場合、リング数を返します。NumInteriorRingsと違い、外環も数えます。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_NRings(geom) As Nrings, ST_NumInteriorRings(geom) As ninterrings FROM (SELECT ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))') As geom) As foo; nrings | ninterrings --------+------------- 1 | 0 (1 row)
ST_NumGeometries — ジオメトリコレクションの要素数を返します。
integer ST_NumGeometries(
geometry geom)
;
ジオメトリコレクション等(GEOMETRYCOLLECTIONやMULTI系)の要素数を返します。空ジオメトリでなく、ジオメトリコレクション等でもないジオメトリに対しては1を返します。空ジオメトリに対しては0を返します。
Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。
Changed: 2.0.0 前の版では、ジオメトリがコレクション/マルチ系でない場合にはNULLを返しました。2.0.0以上では、POLYGON, LINESTRING, POINTといった単一ジオメトリについては1を返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.1.4
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
--Prior versions would have returned NULL for this -- in 2.0.0 this returns 1 SELECT ST_NumGeometries(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result 1 --Geometry Collection Example - multis count as one geom in a collection SELECT ST_NumGeometries(ST_GeomFromEWKT('GEOMETRYCOLLECTION(MULTIPOINT((-2 3),(-2 2)), LINESTRING(5 5 ,10 10), POLYGON((-7 4.2,-7.1 5,-7.1 4.3,-7 4.2)))')); --result 3
ST_NumInteriorRings — ポリゴンの内環 (穴)の数を返します。
integer ST_NumInteriorRings(
geometry a_polygon)
;
ポリゴンジオメトリの内環の数を返します。ジオメトリがポリゴンでない場合には、NULLを返します。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 8.2.5
Changed: 2.0.0 - 以前の版では、MULTIPOLYGONを渡して最初のPOLYGONの内環の数を返すことができました。
--If you have a regular polygon SELECT gid, field1, field2, ST_NumInteriorRings(geom) AS numholes FROM sometable; --If you have multipolygons --And you want to know the total number of interior rings in the MULTIPOLYGON SELECT gid, field1, field2, SUM(ST_NumInteriorRings(geom)) AS numholes FROM (SELECT gid, field1, field2, (ST_Dump(geom)).geom As geom FROM sometable) As foo GROUP BY gid, field1,field2;
ST_NumInteriorRing — ポリゴンの内環 (穴)の数を返します。ST_NumInteriorRingsの別名です。
integer ST_NumInteriorRing(
geometry a_polygon)
;
ST_NumPatches — 多面体サーフェスのフェイス数を返します。多面体でないジオメトリの場合にはNULLを返します。
integer ST_NumPatches(
geometry g1)
;
多面体サーフェスのフェイス数を返します。多面体でないジオメトリの場合にはNULLを返します。ST_NumGeometriesの別名で、MMの名前付けに対応するためのものです。MM規約を気にしない場合はST_NumGeometriesの方が速いです。
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(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); --result 6
ST_NumPoints — ラインストリングまたは曲線ストリングのポイント数を返します。
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(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')); --result 4
ST_PatchN — 多面体サーフェスのN番目のジオメトリ (フェイス)を返します。
geometry ST_PatchN(
geometry geomA, integer n)
;
ジオメトリがPOLYHEDRALSURFACEかPOLYHEDRALSURFACEMの場合には、1始まりでN番目のジオメトリ (フェイス)を返します。それ以外の場合には、NULLを返します。多面体サーフェスを引数にとるST_GeometryNと同じ答えが返ります。ST_GeometryNの方が速いです。
インデクスは1始まりです。 |
ジオメトリの全ての要素を抽出するにはST_Dumpが最も効率的です。 |
Availability: 2.0.0
このメソッドはSQL/MM仕様の実装です。 SQL-MM ISO/IEC 13249-3: 8.5
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
--Extract the 2nd face of the polyhedral surface SELECT ST_AsEWKT(ST_PatchN(geom, 2)) As geomewkt FROM ( VALUES (ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')) ) As foo(geom); geomewkt ---+----------------------------------------- POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0))
ST_PointN — ジオメトリの最初のラインストリングまたは曲線ストリングのN番目のポイントを返します。
geometry ST_PointN(
geometry a_linestring, integer n)
;
ラインストリングまたは曲線ストリングのN番目の点を返します。負数はラインストリングの終端から逆方向に遡って数えます。-1は終端を指します。ジオメトリにラインストリングが無い場合には、NULLを返します。
OGC仕様のため0.8.0版からインデックスを1始まりにしています。これより前の版では0はじまりになっています。後方インデックス (負数インデックス)はOGC仕様ではありません。 |
マルチラインストリング内のラインストリングの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は終端を指します) |
-- Extract all POINTs from a LINESTRING SELECT ST_AsText( ST_PointN( column1, generate_series(1, ST_NPoints(column1)) )) FROM ( VALUES ('LINESTRING(0 0, 1 1, 2 2)'::geometry) ) AS foo; st_astext ------------ POINT(0 0) POINT(1 1) POINT(2 2) (3 rows) --Example circular string SELECT ST_AsText(ST_PointN(ST_GeomFromText('CIRCULARSTRING(1 2, 3 2, 1 2)'), 2)); st_astext ------------ POINT(3 2) (1 row) SELECT ST_AsText(f) FROM ST_GeomFromText('LINESTRING(0 0 0, 1 1 1, 2 2 2)') AS g ,ST_PointN(g, -2) AS f; -- 1 based index st_astext ----------------- POINT Z (1 1 1) (1 row)
ST_Points — ジオメトリの全ての座標を含むマルチポイントを返します。
geometry ST_Points(
geometry geom )
;
ジオメトリの全ての座標を含むマルチポイントを返します。リングジオメトリの始点と終点を含む重複ポイントは保存されます (重複ポイントの削除が必要ならST_RemoveRepeatedPointsを呼ぶと削除した結果が得られます)。
親ジオメトリの個々の座標のポイントに関する情報を取得するにはST_DumpPointsを使います。
M値とZ値が存在する場合には保持されます。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
Availability: 2.3.0
SELECT ST_AsText(ST_Points('POLYGON Z ((30 10 4,10 30 5,40 40 6, 30 10))')); --result MULTIPOINT Z ((30 10 4),(10 30 5),(40 40 6),(30 10 4))
ST_StartPoint — ラインストリングの始点を返します。
geometry ST_StartPoint(
geometry geomA)
;
LINESTRING
またはCIRCULARLINESTRING
ジオメトリの、最初のポイントをPOINT
で返します。入力パラメータがLINESTRING
でもCIRCULARLINESTRING
でもない場合には、NULL
を返します。
このメソッドは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_AsText(ST_StartPoint('LINESTRING(0 1, 0 2)'::geometry)); st_astext ------------ POINT(0 1)
ラインストリングでないものの始端ポイントはNULL
SELECT ST_StartPoint('POINT(0 1)'::geometry) IS NULL AS is_null; is_null ---------- t
3次元ラインストリングの始端ポイント
SELECT ST_AsEWKT(ST_StartPoint('LINESTRING(0 1 1, 0 2 2)'::geometry)); st_asewkt ------------ POINT(0 1 1)
CIRCULARSTRINGの始端ポイント
SELECT ST_AsText(ST_StartPoint('CIRCULARSTRING(5 2,-3 1.999999, -2 1, -4 2, 6 3)'::geometry)); st_astext ------------ POINT(5 2)
ST_Summary — ジオメトリについての要約文を返します。
text ST_Summary(
geometry g)
;
text ST_Summary(
geography g)
;
ジオメトリについての要約文を返します。
ジオメトリ型の後の角括弧で示されたフラグには次の意味があります。
M: M軸を持ちます
Z: Z軸を持ちます
B: バウンディングボックスを持ちます
G: 測地座標系 (ジオグラフィ)です
S: 空間参照系を持ちます
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
Availability: 1.2.2
Enhanced: 2.0.0でジオグラフィ対応が追加されました。
Enhanced: 2.1.0 空間参照系を持つかを示すSフラグが追加されました。
Enhanced: 2.2.0 TINと曲線の対応が追加されました。
=# SELECT ST_Summary(ST_GeomFromText('LINESTRING(0 0, 1 1)')) as geom, ST_Summary(ST_GeogFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) geog; geom | geog -----------------------------+-------------------------- LineString[B] with 2 points | Polygon[BGS] with 1 rings | ring 0 has 5 points : (1 row) =# SELECT ST_Summary(ST_GeogFromText('LINESTRING(0 0 1, 1 1 1)')) As geog_line, ST_Summary(ST_GeomFromText('SRID=4326;POLYGON((0 0 1, 1 1 2, 1 2 3, 1 1 1, 0 0 1))')) As geom_poly; ; geog_line | geom_poly -------------------------------- +-------------------------- LineString[ZBGS] with 2 points | Polygon[ZBS] with 1 rings : ring 0 has 5 points : (1 row)
ST_X — ポイントのX値を返します。
float ST_X(
geometry a_point)
;
ポイントのX座標値を返し、有効でないならNULLを返します。入力はポイントでなければなりません。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 6.1.3
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_X(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_x ------ 1 (1 row) SELECT ST_Y(ST_Centroid(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'))); st_y ------ 1.5 (1 row)
ST_Centroid, ST_GeomFromEWKT, ST_M, ST_XMax, ST_XMin, ST_Y, ST_Z
ST_Y — ポイントのY値を返します。
float ST_Y(
geometry a_point)
;
ポイントのY座標値を返し、有効でないならNULLを返します。入力はポイントでなければなりません。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 6.1.4
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_Y(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_y ------ 2 (1 row) SELECT ST_Y(ST_Centroid(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'))); st_y ------ 1.5 (1 row)
ST_Centroid, ST_GeomFromEWKT, ST_M, ST_X, ST_YMax, ST_YMin, ST_Z
ST_Z — ポイントのZ値を返します。
float ST_Z(
geometry a_point)
;
ポイントのZ座標値を返し、有効でないならNULLを返します。入力はポイントでなければなりません。
このメソッドはSQL/MM仕様の実装です。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_Z(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_z ------ 3 (1 row)
ST_Zmflag — ジオメトリのZM座標次元を示す符号を返します。
smallint ST_Zmflag(
geometry geomA)
;
ジオメトリのZM座標次元を示す符号を返します。
値は 0=XY, 1=XYM, 2=XYZ, 3=XYZMとなります。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_Zmflag(ST_GeomFromEWKT('LINESTRING(1 2, 3 4)')); st_zmflag ----------- 0 SELECT ST_Zmflag(ST_GeomFromEWKT('LINESTRINGM(1 2 3, 3 4 3)')); st_zmflag ----------- 1 SELECT ST_Zmflag(ST_GeomFromEWKT('CIRCULARSTRING(1 2 3, 3 4 3, 5 6 3)')); st_zmflag ----------- 2 SELECT ST_Zmflag(ST_GeomFromEWKT('POINT(1 2 3 4)')); st_zmflag ----------- 3
ST_HasZ — ジオメトリがZ値を持っているかどうかを確認します。
boolean ST_HasZ(
geometry geom)
;
入力ジオメトリがZ値を持っているかどうかを確認して、真偽値を返します。ジオメトリがZ値を持っている場合にはTRUEを返し、そうでない場合にはFALSEを返します。
通常は、Z値を持つジオメトリオブジェクトは3次元 (3D)ジオメトリを表現し、Z値を持たないものは2次元 (2D)ジオメトリとなります。
この関数はジオメトリが標高や高さに関する情報を持つかどうかを判断するのに使います。
Availability: 3.5.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
SELECT ST_HasZ(ST_GeomFromText('POINT(1 2 3)')); --result true
SELECT ST_HasZ(ST_GeomFromText('LINESTRING(0 0, 1 1)')); --result false
ST_HasM — ジオメトリがM値をもっているかどうかを確認します。
boolean ST_HasM(
geometry geom)
;
入力ジオメトリがM値を持っているかどうかを確認して、真偽値を返します。ジオメトリがM値を持っている場合にはTRUEを返し、そうでない場合にはFALSEを返します。
M次元を持つジオメトリオブジェクトは通常、空間地物に関連付けられた計測値または追加データを表現します。
この関数はジオメトリがM値に関する情報を持つかどうかを判断するのに使います。
Availability: 3.5.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
SELECT ST_HasM(ST_GeomFromText('POINTM(1 2 3)')); --result true
SELECT ST_HasM(ST_GeomFromText('LINESTRING(0 0, 1 1)')); --result false
これらの関数は、タイプ、構造または頂点の変更によって編集されたジオメトリを生成します。
ST_AddPoint — ラインストリングにポイントを追加します。
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_AsEWKT(ST_AddPoint('LINESTRING(0 0 1, 1 1 1)', ST_MakePoint(1, 2, 3))); st_asewkt ---------- LINESTRING(0 0 1,1 1 1,1 2 3)
テーブル内の全てのラインについて、閉じていないラインにだけ始端を末尾に追加することで、閉じていることを保証します。
UPDATE sometable SET geom = ST_AddPoint(geom, ST_StartPoint(geom)) FROM sometable WHERE ST_IsClosed(geom) = false;
ST_CollectionExtract — ジオメトリコレクションを与えると、指定されたタイプの要素だけからなるマルチジオメトリを返します。
geometry ST_CollectionExtract(
geometry collection)
;
geometry ST_CollectionExtract(
geometry collection, integer type)
;
ジオメトリコレクションを指定すると、要素のタイプが統一されたマルチジオメトリを返します。
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_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION( POINT(0 0), LINESTRING(1 1, 2 2) )')); st_astext --------------- MULTILINESTRING((1 1, 2 2))
ポイントの抽出 (type 1 == POINT):
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))', 1 )); st_astext --------------- MULTIPOINT((0 0))
ラインの抽出 (type 2 == LINESTRING):
SELECT ST_AsText(ST_CollectionExtract( 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(LINESTRING(0 0, 1 1)),LINESTRING(2 2, 3 3))', 2 )); st_astext --------------- MULTILINESTRING((0 0, 1 1), (2 2, 3 3))
ST_CollectionHomogenize — ジオメトリコレクションを与えると、最も単純な表現を返します。
geometry ST_CollectionHomogenize(
geometry collection)
;
ジオメトリコレクションを与えると、「最も単純な」表現を返します。
同種の要素からなるコレクションが適切なマルチ系ジオメトリとして返されます。
タイプ混合のコレクションはフラットな単一のGEOMETRYCOLLECTIONに変換されます。
単一の非マルチジオメトリ要素からなるコレクションはその要素が返されます。
非マルチジオメトリは変更されずに返ります。マルチジオメトリへの変換が必要ならST_Multiを使います。
この関数は結果ジオメトリの妥当性を保証されず、隣接やオーバラップする複数ポリゴンからは不正なMULTIPOLYGONが生成されます。この状況に陥っているかはST_IsValidで確認でき、ST_MakeValidで修復できます。 |
Availability: 2.0.0
単一要素のコレクションから非マルチジオメトリへの変換
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0))')); st_astext ------------ POINT(0 0)
ネスト下単一要素のコレクションから非マルチジオメトリへの変換:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(MULTIPOINT((0 0)))')); st_astext ------------ POINT(0 0)
コレクションからマルチ系ジオメトリへの変換:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0),POINT(1 1))')); st_astext --------------------- MULTIPOINT((0 0),(1 1))
ネストしたタイプ混合のコレクションからフラットなジオメトリコレクションへの変換:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0), GEOMETRYCOLLECTION( LINESTRING(1 1, 2 2)))')); st_astext --------------------- GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(1 1,2 2))
ポリゴンのコレクションから (不正な)マルチポリゴンへの変換:
SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION (POLYGON ((10 50, 50 50, 50 10, 10 10, 10 50)), POLYGON ((90 50, 90 10, 50 10, 50 50, 90 50)))')); st_astext --------------------- MULTIPOLYGON(((10 50,50 50,50 10,10 10,10 50)),((90 50,90 10,50 10,50 50,90 50)))
ST_CurveToLine — 曲線を含むジオメトリを線ジオメトリに変換します。
geometry ST_CurveToLine(
geometry curveGeom, float tolerance, integer tolerance_type, integer flags)
;
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_AsText(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'))); --Result -- LINESTRING(220268 150415,220269.95064912 150416.539364228,220271.823415575 150418.17258804,220273.613787707 150419.895736857, 220275.317452352 150421.704659462,220276.930305234 150423.594998003,220278.448460847 150425.562198489, 220279.868261823 150427.60152176,220281.186287736 150429.708054909,220282.399363347 150431.876723113, 220283.50456625 150434.10230186,220284.499233914 150436.379429536,220285.380970099 150438.702620341,220286.147650624 150441.066277505, 220286.797428488 150443.464706771,220287.328738321 150445.892130112,220287.740300149 150448.342699654, 220288.031122486 150450.810511759,220288.200504713 150453.289621251,220288.248038775 150455.77405574, 220288.173610157 150458.257830005,220287.977398166 150460.734960415,220287.659875492 150463.199479347, 220287.221807076 150465.64544956,220286.664248262 150468.066978495,220285.988542259 150470.458232479,220285.196316903 150472.81345077, 220284.289480732 150475.126959442,220283.270218395 150477.39318505,220282.140985384 150479.606668057, 220280.90450212 150481.762075989,220279.5637474 150483.85421628,220278.12195122 150485.87804878, 220276.582586992 150487.828697901,220274.949363179 150489.701464356,220273.226214362 150491.491836488, 220271.417291757 150493.195501133,220269.526953216 150494.808354014,220267.559752731 150496.326509628, 220265.520429459 150497.746310603,220263.41389631 150499.064336517,220261.245228106 150500.277412127, 220259.019649359 150501.38261503,220256.742521683 150502.377282695,220254.419330878 150503.259018879, 220252.055673714 150504.025699404,220249.657244448 150504.675477269,220247.229821107 150505.206787101, 220244.779251566 150505.61834893,220242.311439461 150505.909171266,220239.832329968 150506.078553494, 220237.347895479 150506.126087555,220234.864121215 150506.051658938,220232.386990804 150505.855446946, 220229.922471872 150505.537924272,220227.47650166 150505.099855856,220225.054972724 150504.542297043, 220222.663718741 150503.86659104,220220.308500449 150503.074365683, 220217.994991777 150502.167529512,220215.72876617 150501.148267175, 220213.515283163 150500.019034164,220211.35987523 150498.7825509, 220209.267734939 150497.441796181,220207.243902439 150496, 220205.293253319 150494.460635772,220203.420486864 150492.82741196,220201.630114732 150491.104263143, 220199.926450087 150489.295340538,220198.313597205 150487.405001997,220196.795441592 150485.437801511, 220195.375640616 150483.39847824,220194.057614703 150481.291945091,220192.844539092 150479.123276887,220191.739336189 150476.89769814, 220190.744668525 150474.620570464,220189.86293234 150472.297379659,220189.096251815 150469.933722495, 220188.446473951 150467.535293229,220187.915164118 150465.107869888,220187.50360229 150462.657300346, 220187.212779953 150460.189488241,220187.043397726 150457.710378749,220186.995863664 150455.22594426, 220187.070292282 150452.742169995,220187.266504273 150450.265039585,220187.584026947 150447.800520653, 220188.022095363 150445.35455044,220188.579654177 150442.933021505,220189.25536018 150440.541767521, 220190.047585536 150438.18654923,220190.954421707 150435.873040558,220191.973684044 150433.60681495, 220193.102917055 150431.393331943,220194.339400319 150429.237924011,220195.680155039 150427.14578372,220197.12195122 150425.12195122, 220198.661315447 150423.171302099,220200.29453926 150421.298535644,220202.017688077 150419.508163512,220203.826610682 150417.804498867, 220205.716949223 150416.191645986,220207.684149708 150414.673490372,220209.72347298 150413.253689397,220211.830006129 150411.935663483, 220213.998674333 150410.722587873,220216.22425308 150409.61738497,220218.501380756 150408.622717305,220220.824571561 150407.740981121, 220223.188228725 150406.974300596,220225.586657991 150406.324522731,220227 150406) --3d example SELECT ST_AsEWKT(ST_CurveToLine(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'))); Output ------ LINESTRING(220268 150415 1,220269.95064912 150416.539364228 1.0181172856673, 220271.823415575 150418.17258804 1.03623457133459,220273.613787707 150419.895736857 1.05435185700189,....AD INFINITUM .... 220225.586657991 150406.324522731 1.32611114201132,220227 150406 3) --use only 2 segments to approximate quarter circle SELECT ST_AsText(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'),2)); st_astext ------------------------------ LINESTRING(220268 150415,220287.740300149 150448.342699654,220278.12195122 150485.87804878, 220244.779251566 150505.61834893,220207.243902439 150496,220187.50360229 150462.657300346, 220197.12195122 150425.12195122,220227 150406) -- Ensure approximated line is no further than 20 units away from -- original curve, and make the result direction-neutral SELECT ST_AsText(ST_CurveToLine( 'CIRCULARSTRING(0 0,100 -100,200 0)'::geometry, 20, -- Tolerance 1, -- Above is max distance between curve and line 1 -- Symmetric flag )); st_astext ------------------------------------------------------------------------------------------- LINESTRING(0 0,50 -86.6025403784438,150 -86.6025403784439,200 -1.1331077795296e-13,200 0)
ST_Scroll — 閉じたLINESTRINGの開始点を変更する。
geometry ST_Scroll(
geometry linestring, geometry point)
;
閉じたLINESTRINGの開始/終了点を point
で指定した頂点に変更します。
Availability: 3.2.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
閉じたラインの3番目の頂点を開始点にする
SELECT ST_AsEWKT(ST_Scroll('SRID=4326;LINESTRING(0 0 0 1, 10 0 2 0, 5 5 4 2,0 0 0 1)', 'POINT(5 5 4 2)')); st_asewkt ---------- SRID=4326;LINESTRING(5 5 4 2,0 0 0 1,10 0 2 0,5 5 4 2)
ST_FlipCoordinates — X値とY値を入れ替えたジオメトリを返します。
geometry ST_FlipCoordinates(
geometry geom)
;
与えられたジオメトリのX値とY値を入れ替えたものを返します。緯度経度 (Y,X)で表現される座標値を持つジオメトリを修正するのに使います。
Availability: 2.0.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
SELECT ST_AsEWKT(ST_FlipCoordinates(GeomFromEWKT('POINT(1 2)'))); st_asewkt ------------ 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_AsEWKT(ST_Force2D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ------------------------------------- CIRCULARSTRING(1 1,2 3,4 5,6 7,5 6) SELECT ST_AsEWKT(ST_Force2D('POLYGON((0 0 2,0 5 2,5 0 2,0 0 2),(1 1 2,3 1 2,1 3 2,1 1 2))')); st_asewkt ---------------------------------------------- POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))
ST_Force3D — ジオメトリをXYZモードに強制します。これはST_Force3DZの別名です。
geometry ST_Force3D(
geometry geomA, float Zvalue = 0.0)
;
ジオメトリをXYZモードに強制します。これはST_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値を削除しません。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force3D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ----------------------------------------------- CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2) SELECT ST_AsEWKT(ST_Force3D('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))')); st_asewkt -------------------------------------------------------------- POLYGON((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
ST_Force3DZ — ジオメトリをXYZモードに強制します。
geometry ST_Force3DZ(
geometry geomA, float Zvalue = 0.0)
;
ジオメトリをXYZモードに強制します。これは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値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force3DZ(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ----------------------------------------------- CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2) SELECT ST_AsEWKT(ST_Force3DZ('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))')); st_asewkt -------------------------------------------------------------- POLYGON((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
ST_Force3DM — ジオメトリをXYMモードに強制します。
geometry ST_Force3DM(
geometry geomA, float Mvalue = 0.0)
;
ジオメトリをXYMモードに強制します。ジオメトリがM値を持っていない場合はMvalue
のM値を追加します。Z値を持っている場合はZ値は除去されます。
Changed: 2.1.0 2.0.xの間はST_Force_3DMと呼ばれていました。
Changed: 3.1.0. 0でないM値を指定できるようになりました。
このメソッドは曲線ストリングと曲線に対応しています。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force3DM(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt ------------------------------------------------ CIRCULARSTRINGM(1 1 0,2 3 0,4 5 0,6 7 0,5 6 0) SELECT ST_AsEWKT(ST_Force3DM('POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))')); st_asewkt --------------------------------------------------------------- POLYGONM((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
ST_Force4D — ジオメトリをXYZMモードに強制します。
geometry ST_Force4D(
geometry geomA, float Zvalue = 0.0, float Mvalue = 0.0)
;
ジオメトリをXYZMモードに強制します。Z値やM値が無い場合はZvalue
とMvalue
を追加します。
Changed: 2.1.0 2.0.xの間はST_Force_4Dと呼ばれていました。
Changed: 3.1.0. 0でないZ値とM値を指定できるようになりました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
--Nothing happens to an already 3D geometry SELECT ST_AsEWKT(ST_Force4D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)'))); st_asewkt --------------------------------------------------------- CIRCULARSTRING(1 1 2 0,2 3 2 0,4 5 2 0,6 7 2 0,5 6 2 0) SELECT ST_AsEWKT(ST_Force4D('MULTILINESTRINGM((0 0 1,0 5 2,5 0 3,0 0 4),(1 1 1,3 1 1,1 3 1,1 1 1))')); st_asewkt -------------------------------------------------------------------------------------- MULTILINESTRING((0 0 0 1,0 5 0 2,5 0 0 3,0 0 0 4),(1 1 0 1,3 1 0 1,1 3 0 1,1 1 0 1))
ST_ForceCollection — ジオメトリをジオメトリコレクションに変換します。
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_AsEWKT(ST_ForceCollection('POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))')); st_asewkt ---------------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))) SELECT ST_AsText(ST_ForceCollection('CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)')); st_astext -------------------------------------------------------------------------------- GEOMETRYCOLLECTION(CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)) (1 row)
-- POLYHEDRAL example -- SELECT ST_AsEWKT(ST_ForceCollection('POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))')) st_asewkt ---------------------------------------------------------------------------------- GEOMETRYCOLLECTION( POLYGON((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), POLYGON((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), POLYGON((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), POLYGON((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)) )
ST_ForceCurve — 該当する場合は、ジオメトリを曲線タイプに変換します。
geometry ST_ForceCurve(
geometry g)
;
可能ならジオメトリを曲線表現に変更します。ラインは複合曲線になり、マルチラインはマルチ曲線になり、ポリゴンは曲線ポリゴンになり、マルチポリゴンはマルチサーフェスになります。入力ジオメトリが既に曲線表現であるなら、入力と同じ値が返されます。
Availability: 2.2.0
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_AsText( ST_ForceCurve( 'POLYGON((0 0 2, 5 0 2, 0 5 2, 0 0 2),(1 1 2, 1 3 2, 3 1 2, 1 1 2))'::geometry ) ); st_astext ---------------------------------------------------------------------- CURVEPOLYGON Z ((0 0 2,5 0 2,0 5 2,0 0 2),(1 1 2,1 3 2,3 1 2,1 1 2)) (1 row)
ST_ForcePolygonCCW — 全ての外環を反時計回りに、全ての内環を時計回りに、それぞれ強制します。
geometry ST_ForcePolygonCCW (
geometry geom )
;
(マルチ)ポリゴンに対して、外環を反時計回りに、内環を時計回りに強制します。ポリゴンでないジオメトリは、変更されずに返されます。
Availability: 2.4.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
ST_ForcePolygonCW — 全ての外環を時計回りに、全ての内環を反時計回りに、それぞれ強制します。
geometry ST_ForcePolygonCW (
geometry geom )
;
(マルチ)ポリゴンに対して、外環を時計回りに、内環を反時計回りに強制します。ポリゴンでないジオメトリは、変更されずに返されます。
Availability: 2.4.0
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
ST_ForceSFS — SFS 1.1ジオメトリタイプのみ使うようジオメトリに強制します。
geometry ST_ForceSFS(
geometry geomA)
;
geometry ST_ForceSFS(
geometry geomA, text version)
;
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
ST_ForceRHR — ポリゴンの頂点の方向を右回りに強制します。
geometry ST_ForceRHR(
geometry g)
;
ポリゴンの頂点の方向はRight-Hand-Ruleに従います。この際、ポリゴンの領域は、境界線の右側になります。特に、外環は時計回りに強制され、内環は反時計回りに強制されます。この関数はST_ForcePolygonCW の別名です。
上のRHRの定義は、他の文脈で使われる場合の定義と矛盾します。これを解消するには、ST_ForcePolygonCWを使うことを推奨します。 |
Enhanced: 2.0.0 多面体サーフェス対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
SELECT ST_AsEWKT( ST_ForceRHR( 'POLYGON((0 0 2, 5 0 2, 0 5 2, 0 0 2),(1 1 2, 1 3 2, 3 1 2, 1 1 2))' ) ); st_asewkt -------------------------------------------------------------- POLYGON((0 0 2,0 5 2,5 0 2,0 0 2),(1 1 2,3 1 2,1 3 2,1 1 2)) (1 row)
ST_LineExtend — 指定距離ぶん前後に延長されたラインを返します。
geometry ST_LineExtend(
geometry line, float distance_forward, float distance_backward=0.0)
;
新しい始点 (と終点)を与えられた距離を取って追加することで、指定距離ぶん前後に延長されたラインを返します。距離を0にした場合には、ポイントは追加されません。非負の距離値のみ受け付けます。追加ポイントの方向は始点(と終点の二つの異なるポイントによって決定されます。重複ポイントは無視されます。
Availability: 3.4.0
SELECT ST_AsText(ST_LineExtend('LINESTRING(0 0, 0 10)'::geometry, 5, 6)); -------------------------------------------- LINESTRING(0 -6,0 0,0 10,0 15)
ST_LineToCurve — 曲線を含むジオメトリを線ジオメトリに変換します。
geometry ST_LineToCurve(
geometry geomANoncircular)
;
LINESTRING/POLYGONをCIRCULARSTRINGと曲線ポリゴンに変換します。等価の曲線を記述するのに必要なポイントが少なくなります。
入力ラインストリング/ポリゴンが、曲線をはっきりと表現するのには不十分な場合には、関数は入力ジオメトリと同じものを返します。 |
Availability: 1.3.0
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
-- 2D Example SELECT ST_AsText(ST_LineToCurve(foo.geom)) As curvedastext,ST_AsText(foo.geom) As non_curvedastext FROM (SELECT ST_Buffer('POINT(1 3)'::geometry, 3) As geom) As foo; curvedatext non_curvedastext --------------------------------------------------------------------|----------------------------------------------------------------- CURVEPOLYGON(CIRCULARSTRING(4 3,3.12132034355964 0.878679656440359, | POLYGON((4 3,3.94235584120969 2.41472903395162,3.77163859753386 1.85194970290473, 1 0,-1.12132034355965 5.12132034355963,4 3)) | 3.49440883690764 1.33328930094119,3.12132034355964 0.878679656440359, | 2.66671069905881 0.505591163092366,2.14805029709527 0.228361402466141, | 1.58527096604839 0.0576441587903094,1 0, | 0.414729033951621 0.0576441587903077,-0.148050297095264 0.228361402466137, | -0.666710699058802 0.505591163092361,-1.12132034355964 0.878679656440353, | -1.49440883690763 1.33328930094119,-1.77163859753386 1.85194970290472 | --ETC-- ,3.94235584120969 3.58527096604839,4 3)) --3D example SELECT ST_AsText(ST_LineToCurve(geom)) As curved, ST_AsText(geom) AS not_curved FROM (SELECT ST_Translate(ST_Force3D(ST_Boundary(ST_Buffer(ST_Point(1,3), 2,2))),0,0,3) AS geom) AS foo; curved | not_curved ------------------------------------------------------+--------------------------------------------------------------------- CIRCULARSTRING Z (3 3 3,-1 2.99999999999999 3,3 3 3) | LINESTRING Z (3 3 3,2.4142135623731 1.58578643762691 3,1 1 3, | -0.414213562373092 1.5857864376269 3,-1 2.99999999999999 3, | -0.414213562373101 4.41421356237309 3, | 0.999999999999991 5 3,2.41421356237309 4.4142135623731 3,3 3 3) (1 row)
ST_Multi — マルチ系ジオメトリを返します。
geometry ST_Multi(
geometry geom)
;
マルチ系ジオメトリを返します。ジオメトリが既にマルチ系なら変更せずに返します。
SELECT ST_AsText(ST_Multi('POLYGON ((10 30, 30 30, 30 10, 10 10, 10 30))')); st_astext ------------------------------------------------- MULTIPOLYGON(((10 30,30 30,30 10,10 10,10 30)))
ST_Normalize — 標準的な形式に変えたジオメトリを返します。
geometry ST_Normalize(
geometry geom)
;
正規化/標準化された形式のジオメトリを返します。ポリゴンの環における頂点の順序、ポリゴンにおける環の順序、複合ジオメトリにおける要素の順序が変更されることがあります。
ほとんどの場合、試験目的 (期待した結果と実際に得た結果との比較)でのみ使用します。
Availability: 2.3.0
SELECT ST_AsText(ST_Normalize(ST_GeomFromText( 'GEOMETRYCOLLECTION( POINT(2 3), MULTILINESTRING((0 0, 1 1),(2 2, 3 3)), POLYGON( (0 10,0 0,10 0,10 10,0 10), (4 2,2 2,2 4,4 4,4 2), (6 8,8 8,8 6,6 6,6 8) ) )' ))); st_astext ---------------------------------------------------------------------------------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0),(6 6,8 6,8 8,6 8,6 6),(2 2,4 2,4 4,2 4,2 2)),MULTILINESTRING((2 2,3 3),(0 0,1 1)),POINT(2 3)) (1 row)
ST_Project — 始点から距離と方位で算出されたポイントを返します。
geometry ST_Project(
geometry g1, float distance, float azimuth)
;
geometry ST_Project(
geometry g1, geometry g2, float distance)
;
geography ST_Project(
geography g1, float distance, float azimuth)
;
geography ST_Project(
geography g1, geography g2, float distance)
;
始点から測地線に沿って与えられた距離と方位で算出されたポイントを返します。測地問題と言われるものです。
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_AsText(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 , int prec_z , int prec_m )
;
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_AsText(ST_QuantizeCoordinates('POINT (100.123456 0)'::geometry, 4)); st_astext ------------------------- POINT(100.123455047607 0)
WITH test AS (SELECT 'POINT (123.456789123456 123.456789123456)'::geometry AS geom) SELECT digits, encode(ST_QuantizeCoordinates(geom, digits), 'hex'), ST_AsText(ST_QuantizeCoordinates(geom, digits)) FROM test, generate_series(15, -15, -1) AS digits; digits | encode | st_astext --------+--------------------------------------------+------------------------------------------ 15 | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 14 | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 13 | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 12 | 01010000005c9a72083cdd5e405c9a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 11 | 0101000000409a72083cdd5e40409a72083cdd5e40 | POINT(123.456789123456 123.456789123456) 10 | 0101000000009a72083cdd5e40009a72083cdd5e40 | POINT(123.456789123455 123.456789123455) 9 | 0101000000009072083cdd5e40009072083cdd5e40 | POINT(123.456789123418 123.456789123418) 8 | 0101000000008072083cdd5e40008072083cdd5e40 | POINT(123.45678912336 123.45678912336) 7 | 0101000000000070083cdd5e40000070083cdd5e40 | POINT(123.456789121032 123.456789121032) 6 | 0101000000000040083cdd5e40000040083cdd5e40 | POINT(123.456789076328 123.456789076328) 5 | 0101000000000000083cdd5e40000000083cdd5e40 | POINT(123.456789016724 123.456789016724) 4 | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375) 3 | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375) 2 | 01010000000000000038dd5e400000000038dd5e40 | POINT(123.45654296875 123.45654296875) 1 | 01010000000000000000dd5e400000000000dd5e40 | POINT(123.453125 123.453125) 0 | 01010000000000000000dc5e400000000000dc5e40 | POINT(123.4375 123.4375) -1 | 01010000000000000000c05e400000000000c05e40 | POINT(123 123) -2 | 01010000000000000000005e400000000000005e40 | POINT(120 120) -3 | 010100000000000000000058400000000000005840 | POINT(96 96) -4 | 010100000000000000000058400000000000005840 | POINT(96 96) -5 | 010100000000000000000058400000000000005840 | POINT(96 96) -6 | 010100000000000000000058400000000000005840 | POINT(96 96) -7 | 010100000000000000000058400000000000005840 | POINT(96 96) -8 | 010100000000000000000058400000000000005840 | POINT(96 96) -9 | 010100000000000000000058400000000000005840 | POINT(96 96) -10 | 010100000000000000000058400000000000005840 | POINT(96 96) -11 | 010100000000000000000058400000000000005840 | POINT(96 96) -12 | 010100000000000000000058400000000000005840 | POINT(96 96) -13 | 010100000000000000000058400000000000005840 | POINT(96 96) -14 | 010100000000000000000058400000000000005840 | POINT(96 96) -15 | 010100000000000000000058400000000000005840 | POINT(96 96)
ST_RemovePoint — ラインストリングからポイントを削除します。
geometry ST_RemovePoint(
geometry linestring, integer offset)
;
ラインストリングからポイントを削除します。インデックスは0始まりです。閉じたリングを開いたラインストリングに変えるのに使います。
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)
;
重複ポイントを除いたジオメトリを返します。この関数は(MULTI)LINESTRING、(MULTI)POLYGON、MULTIPOINTのみを処理しますが、全ての種類のジオメトリを与えることができます。GEOMETRYCOLLECTIONの要素は個別に処理されます。LINESTRINGの端点は保持されます。
tolerance
を指定した場合には、他の頂点との距離が許容距離内にある頂点は重複しているとみなされます。
Enhanced: 3.2.0
Availability: 2.2.0
この関数は多面体サーフェスに対応しています。
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'MULTIPOINT ((1 1), (2 2), (3 3), (2 2))')); ------------------------- MULTIPOINT(1 1,2 2,3 3)
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'LINESTRING (0 0, 0 0, 1 1, 0 0, 1 1, 2 2)')); --------------------------------- LINESTRING(0 0,1 1,0 0,1 1,2 2)
例: ジオメトリコレクションの要素は個別に処理されます。
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'GEOMETRYCOLLECTION (LINESTRING (1 1, 2 2, 2 2, 3 3), POINT (4 4), POINT (4 4), POINT (5 5))')); ------------------------------------------------------------------------------ GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),POINT(4 4),POINT(4 4),POINT(5 5))
例: 許容距離内にある繰り返しポイントの削除。
SELECT ST_AsText( ST_RemoveRepeatedPoints( 'LINESTRING (0 0, 0 0, 1 1, 5 5, 1 1, 2 2)', 2)); ------------------------- LINESTRING(0 0,5 5,2 2)
ST_RemoveIrrelevantPointsForView — 指定した矩形表示範囲での描画に関係のないジオメトリのポイントを削除します。
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
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('MULTIPOLYGON(((10 10, 20 10, 30 10, 40 10, 20 20, 10 20, 10 10)),((10 10, 20 10, 20 20, 10 20, 10 10)))'), ST_MakeEnvelope(12,12,18,18), true)); st_astext --------- MULTIPOLYGON(((10 10,40 10,20 20,10 20,10 10)),((10 10,20 10,20 20,10 20,10 10)))
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('MULTILINESTRING((0 0, 10 0,20 0,30 0), (0 15, 5 15, 10 15, 15 15, 20 15, 25 15, 30 15, 40 15), (13 13,15 15,17 17))'), ST_MakeEnvelope(12,12,18,18), true)); st_astext --------- MULTILINESTRING((10 15,15 15,20 15),(13 13,15 15,17 17))
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('LINESTRING(0 0, 10 0,20 0,30 0)'), ST_MakeEnvelope(12,12,18,18), true)); st_astext --------- LINESTRING EMPTY
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('POLYGON((0 30, 15 30, 30 30, 30 0, 0 0, 0 30))'), ST_MakeEnvelope(12,12,18,18), true)); st_astext --------- POLYGON((15 30,30 0,0 0,15 30))
SELECT ST_AsText( ST_RemoveIrrelevantPointsForView( ST_GeomFromText('POLYGON((0 30, 15 30, 30 30, 30 0, 0 0, 0 30))'), ST_MakeEnvelope(12,12,18,18))); st_astext --------- POLYGON((0 30,30 30,30 0,0 0,0 30))
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_AsText( ST_RemoveSmallParts( ST_GeomFromText('MULTIPOLYGON( ((60 160, 120 160, 120 220, 60 220, 60 160), (70 170, 70 210, 110 210, 110 170, 70 170)), ((85 75, 155 75, 155 145, 85 145, 85 75)), ((50 110, 70 110, 70 130, 50 130, 50 110)))'), 50, 50)); st_astext --------- MULTIPOLYGON(((60 160,120 160,120 220,60 220,60 160)),((85 75,155 75,155 145,85 145,85 75)))
SELECT ST_AsText( ST_RemoveSmallParts( ST_GeomFromText('LINESTRING(10 10, 20 20)'), 50, 50)); st_astext --------- LINESTRING EMPTY
ST_Reverse — 頂点の順序を逆にしたジオメトリを返します。
geometry ST_Reverse(
geometry g1)
;
どのジオメトリでも使用可能です。頂点の順序を逆にします。
Enhanced: 2.4.0 曲線対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
この関数は多面体サーフェスに対応しています。
SELECT ST_AsText(geom) as line, ST_AsText(ST_Reverse(geom)) As reverseline FROM (SELECT ST_MakeLine(ST_Point(1,2), ST_Point(1,10)) As geom) as foo; --result line | reverseline ---------------------+---------------------- LINESTRING(1 2,1 10) | LINESTRING(1 10,1 2)
ST_Segmentize — 与えた長さを超える線分を持たないよう変更したジオメトリ/ジオグラフィを返します。
geometry ST_Segmentize(
geometry geom, float max_segment_length)
;
geography ST_Segmentize(
geography geog, float max_segment_length)
;
max_segment_length
を超える長さの線分を持たないよう変更したジオメトリ/ジオグラフィを返します。長さは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_AsText(ST_Segmentize( 'MULTILINESTRING((0 0, 0 1, 0 9),(1 10, 1 18))'::geometry, 5 ) ); --------------------------------------------------- MULTILINESTRING((0 0,0 1,0 5,0 9),(1 10,1 14,1 18))
ポリゴンの分割:
SELECT ST_AsText( ST_Segmentize(('POLYGON((0 0, 0 8, 30 0, 0 0))'::geometry), 10)); ------------------------------------------------------- POLYGON((0 0,0 8,7.5 6,15 4,22.5 2,30 0,20 0,10 0,0 0))
2000キロメートルの最大線分長を使ったジオグラフィのラインの分割。頂点は、端点間をつなぐ大円弧に沿って追加されます。
SELECT ST_AsText( ST_Segmentize(('LINESTRING (0 0, 60 60)'::geography), 2000000)); ------------------------------------------------------------- LINESTRING(0 0,4.252632294621186 8.43596525986862,8.69579947419404 16.824093489701564,13.550465473227048 25.107950473646188,19.1066053508691 33.21091076089908,25.779290201459894 41.01711439406505,34.188839517966954 48.337222885886,45.238153936612264 54.84733442373889,60 60)
ST_SetPoint — ラインストリングのポイントを与えられたポイントに置き換えます。
geometry ST_SetPoint(
geometry linestring, integer zerobasedposition, geometry point)
;
ラインストリングのN番目を与えられたポイントに置き換えます。インデクスは0はじまりです。負のインデックス値を与えると末尾から数えます。-1は末尾のポイントを指します。これは、頂点が一つ動いた時に接続のリレーションシップを維持しようとする場合のトリガに特に便利です。
Availability: 1.1.0
Updated 2.3.0 : 添え字の負数
この関数は3次元に対応し、Z値を削除しません。
--Change first point in line string from -1 3 to -1 1 SELECT ST_AsText(ST_SetPoint('LINESTRING(-1 2,-1 3)', 0, 'POINT(-1 1)')); st_astext ----------------------- LINESTRING(-1 1,-1 3) ---Change last point in a line string (lets play with 3d linestring this time) SELECT ST_AsEWKT(ST_SetPoint(foo.geom, ST_NumPoints(foo.geom) - 1, ST_GeomFromEWKT('POINT(-1 1 3)'))) FROM (SELECT ST_GeomFromEWKT('LINESTRING(-1 2 3,-1 3 4, 5 6 7)') As geom) As foo; st_asewkt ----------------------- LINESTRING(-1 2 3,-1 3 4,-1 1 3) SELECT ST_AsText(ST_SetPoint(g, -3, p)) FROM ST_GEomFromText('LINESTRING(0 0, 1 1, 2 2, 3 3, 4 4)') AS g , ST_PointN(g,1) as p; st_astext ----------------------- LINESTRING(0 0,1 1,0 0,3 3,4 4)
ST_ShiftLongitude — 経度座標値を-180度から180度の範囲と0度から360度の範囲との二つの範囲を行き来するようシフトします。
geometry ST_ShiftLongitude(
geometry geom)
;
ジオメトリの全てのポイント/頂点を読み、経度値が-180度から0度の範囲にあるのを180度から360度の範囲にシフトして、180度から360度の範囲にあるのを-180度から0度の範囲にシフトします。この関数は対称となりますので、-180度から180度の範囲のデータを0度から360度の範囲の表現にし、0度から360度の範囲のデータを-180度から180度の範囲の表現にします。
この関数は、SRID 436 (WGS84地理座標系)のような緯度経度の座標値を持つデータの場合に限って使います。 |
1.3.4より前ではMULTIPOINTでは動作しないバグがありました。1.3.4以上ではMULTIPOINTでも動作します。 |
この関数は3次元に対応し、Z値を削除しません。
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
ご注意: この関数は2.0.0で"ST_Shift_Longitude"から名称変更しました。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
--single point forward transformation SELECT ST_AsText(ST_ShiftLongitude('SRID=4326;POINT(270 0)'::geometry)) st_astext ---------- POINT(-90 0) --single point reverse transformation SELECT ST_AsText(ST_ShiftLongitude('SRID=4326;POINT(-90 0)'::geometry)) st_astext ---------- POINT(270 0) --for linestrings the functions affects only to the sufficient coordinates SELECT ST_AsText(ST_ShiftLongitude('SRID=4326;LINESTRING(174 12, 182 13)'::geometry)) st_astext ---------- LINESTRING(174 12,-178 13)
ST_WrapX — ジオメトリをX値で回り込ませます。
geometry ST_WrapX(
geometry geom, float8 wrap, float8 move)
;
入力ジオメトリを分割して、全ての結果要素が「回り込み ('wrap')」線から’move'パラメータで決められた方向、すなわち、右側 ('move'が負数)または左側 ('move'が正数)に全ての要素が落ちるように移動させ、最後に再結合します。
経度緯度入力を「再センタリング」して、対象地物が一方からもう一方に飛ばないようにするのに使えます。 |
Availability: 2.3.0 GEOSが必要です。
この関数は3次元に対応し、Z値を削除しません。
-- Move all components of the given geometries whose bounding box -- falls completely on the left of x=0 to +360 select ST_WrapX(geom, 0, 360); -- Move all components of the given geometries whose bounding box -- falls completely on the left of x=-30 to +360 select ST_WrapX(geom, -30, 360);
ST_SnapToGrid — 入力ジオメトリの全ての点を規則的なグリッドにスナップします。
geometry ST_SnapToGrid(
geometry geomA, float originX, float originY, float sizeX, float sizeY)
;
geometry ST_SnapToGrid(
geometry geomA, float sizeX, float sizeY)
;
geometry ST_SnapToGrid(
geometry geomA, float size)
;
geometry ST_SnapToGrid(
geometry geomA, geometry pointOrigin, float sizeX, float sizeY, float sizeZ, float sizeM)
;
1, 2, 3番目の形式では、入力ジオメトリの全てのポイントを原点とセルサイズを定めたグリッドにスナップします。同じセルに落ちた、連続するポイントを削除します。引数ジオメトリのジオメトリタイプを定義できないポイントしか残らなかった場合は、NULLを返します。コレクション内で崩壊したジオメトリはそこから削除されます。精度を落とすのに使います。
4番目の形式は、1.1.0で導入されました。入力ジオメトリの全てのポイントを原点 (第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 your geometries to a precision grid of 10^-3 UPDATE mytable SET geom = ST_SnapToGrid(geom, 0.001); SELECT ST_AsText(ST_SnapToGrid( ST_GeomFromText('LINESTRING(1.1115678 2.123, 4.111111 3.2374897, 4.11112 3.23748667)'), 0.001) ); st_astext ------------------------------------- LINESTRING(1.112 2.123,4.111 3.237) --Snap a 4d geometry SELECT ST_AsEWKT(ST_SnapToGrid( ST_GeomFromEWKT('LINESTRING(-1.1115678 2.123 2.3456 1.11111, 4.111111 3.2374897 3.1234 1.1111, -1.11111112 2.123 2.3456 1.1111112)'), ST_GeomFromEWKT('POINT(1.12 2.22 3.2 4.4444)'), 0.1, 0.1, 0.1, 0.01) ); st_asewkt ------------------------------------------------------------------------------ LINESTRING(-1.08 2.12 2.3 1.1144,4.12 3.22 3.1 1.1144,-1.08 2.12 2.3 1.1144) --With a 4d geometry - the ST_SnapToGrid(geom,size) only touches x and y coords but keeps m and z the same SELECT ST_AsEWKT(ST_SnapToGrid(ST_GeomFromEWKT('LINESTRING(-1.1115678 2.123 3 2.3456, 4.111111 3.2374897 3.1234 1.1111)'), 0.01) ); st_asewkt --------------------------------------------------------- LINESTRING(-1.11 2.12 3 2.3456,4.11 3.24 3.1234 1.1111)
ST_Snap — 入力ジオメトリの辺と頂点を参照ジオメトリの頂点にスナップします。
geometry ST_Snap(
geometry input, geometry reference, float tolerance)
;
ジオメトリの頂点と辺を、もう一つのジオメトリの頂点にスナップします。スナップが実行される位置を制御するにはスナップ距離許容値を使います。結果ジオメトリはスナップされた頂点を持つ入力ジオメトリです。スナップが発生しなかった場合には、入力ジオメトリが変更されずに返されます。
一つのジオメトリからもう一つへの変換によって、近傍エッジ (ノード生成とインタセクション計算で問題を引き起こします)を除くことになり、オーバレイ演算のロバスト性が改善されます。
あまりに多数のスナップを行った場合には、生成されるトポロジが不正になる可能性があります。いつスナップが安全かを判定するために、ヒューリスティックにスナップされた頂点の数と位置が決めるしかありません。しかし、省略された潜在的なスナップになりえます。
返されるジオメトリは単純性が失われているかも知れません (ST_IsSimpleを参照してください)し、妥当性が失われているかも知れません (ST_IsValidを参照して下さい)。 |
GEOSモジュールで実現しています。
Availability: 2.0.0
SELECT ST_AsText(ST_Snap(poly,line, ST_Distance(poly,line)*1.01)) AS polysnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( ((26 125, 26 200, 126 200, 126 125, 26 125 ), ( 51 150, 101 150, 76 175, 51 150 )), (( 151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; polysnapped --------------------------------------------------------------------- MULTIPOLYGON(((26 125,26 200,126 200,126 125,101 100,26 125), (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100))) |
SELECT ST_AsText( ST_Snap(poly,line, ST_Distance(poly,line)*1.25) ) AS polysnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( (( 26 125, 26 200, 126 200, 126 125, 26 125 ), ( 51 150, 101 150, 76 175, 51 150 )), (( 151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; polysnapped --------------------------------------------------------------------- MULTIPOLYGON(((5 107,26 200,126 200,126 125,101 100,54 84,5 107), (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100))) |
SELECT ST_AsText( ST_Snap(line, poly, ST_Distance(poly,line)*1.01) ) AS linesnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( ((26 125, 26 200, 126 200, 126 125, 26 125), (51 150, 101 150, 76 175, 51 150 )), ((151 100, 151 200, 176 175, 151 100)))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; linesnapped ---------------------------------------- LINESTRING(5 107,26 125,54 84,101 100)
|
SELECT ST_AsText( ST_Snap(line, poly, ST_Distance(poly,line)*1.25) ) AS linesnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( (( 26 125, 26 200, 126 200, 126 125, 26 125 ), (51 150, 101 150, 76 175, 51 150 )), ((151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; linesnapped --------------------------------------- LINESTRING(26 125,54 84,101 100) |
ST_SwapOrdinates — 与えられたジオメトリにおいて与えられた座標の値を入れ替えたジオメトリを返します。
geometry ST_SwapOrdinates(
geometry geom, cstring ords)
;
与えられたジオメトリにおいて与えられた座標の値を入れ替えたジオメトリを返します。
ords
引数は2文字の文字列で、入れ替える座標名を示します。座標名はx, y, z, mが有効です。
Availability: 2.2.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は3次元に対応し、Z値を削除しません。
この関数はM値に対応します。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
-- Scale M value by 2 SELECT ST_AsText( ST_SwapOrdinates( ST_Scale( ST_SwapOrdinates(g,'xm'), 2, 1 ), 'xm') ) FROM ( SELECT 'POINT ZM (0 0 0 2)'::geometry g ) foo; st_astext -------------------- POINT ZM (0 0 0 4)
これらの関数は、ジオメトリがOGC SFS標準として妥当かどうかをテストします。また、不正となった場合の種類と位置に関する情報の提供も行います。不正なジオメトリから妥当なジオメトリを生成する機能もあります。
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で説明しています。
ジオメトリ評価に関する詳細情報についてはSection 4.4, “ジオメトリ検証”を参照してください。
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(ST_GeomFromText('LINESTRING(0 0, 1 1)')) As good_line, ST_IsValid(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) As bad_poly --results NOTICE: Self-intersection at or near point 0 0 good_line | bad_poly -----------+---------- t | f
ST_IsValidDetail — ジオメトリが妥当か、妥当でないなら理由と位置をそれぞれ示すvalid_detail
行を返します。
valid_detail ST_IsValidDetail(
geometry geom, integer flags)
;
valid_detail
行を返します。これには、ジオメトリが妥当かどうかを示す真偽値 (valid
)、不正である理由を示す文字列 (reason
)、不正である位置を指摘するジオメトリ (location
)からなります。
不正ジオメトリの詳細報告の生成をするST_IsValidとST_IsValidReasonの組み合わせを改善するために使います。
任意パラメータflags
はビットフィールドです。次の値を持つことができます。
0: 通常のOGC SFS評価モデルを使用します。
1: ある種の自己接触リング (逆の外リングと逆の穴リング)を妥当とします。この評価モデルはこれらのツールで使われるため「ESRIフラグ」とも言われます。OGCモデルでは不正とされることに注意してください。
GEOSモジュールで実現しています。
Availability: 2.0.0
--First 3 Rejects from a successful quintuplet experiment SELECT gid, reason(ST_IsValidDetail(geom)), ST_AsText(location(ST_IsValidDetail(geom))) as location FROM (SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As geom, gid FROM (SELECT ST_Buffer(ST_Point(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid FROM generate_series(-4,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,8) z1 WHERE x1 > y1*0.5 AND z1 < x1*y1) As e INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_Point(x1*10,y1), z1)),y1*1, z1*2) As line FROM generate_series(-3,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,10) z1 WHERE x1 > y1*0.75 AND z1 < x1*y1) As f ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line)) GROUP BY gid, e.buff) As quintuplet_experiment WHERE ST_IsValid(geom) = false ORDER BY gid LIMIT 3; gid | reason | location ------+-------------------+------------- 5330 | Self-intersection | POINT(32 5) 5340 | Self-intersection | POINT(42 5) 5350 | Self-intersection | POINT(52 5) --simple example SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)'); valid | reason | location -------+--------+---------- t | |
ST_IsValidReason — ジオメトリが妥当か否かを示す文字列を返し、不正な場合は理由を返します。
text ST_IsValidReason(
geometry geomA)
;
text ST_IsValidReason(
geometry geomA, integer flags)
;
ジオメトリが妥当かどうか、不正な場合はその理由を示す文字列を返します。
不正なジオメトリと理由の詳細報告を生成するのに、ST_IsValidと併用します。
許されるflags
は、 ST_IsValidDetailにあります。
GEOSモジュールで実現しています。
Availability: 1.4
Availability: 2.0 フラグを取る形式。
-- invalid bow-tie polygon SELECT ST_IsValidReason( 'POLYGON ((100 200, 100 100, 200 200, 200 100, 100 200))'::geometry) as validity_info; validity_info -------------------------- Self-intersection[150 150]
--First 3 Rejects from a successful quintuplet experiment SELECT gid, ST_IsValidReason(geom) as validity_info FROM (SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As geom, gid FROM (SELECT ST_Buffer(ST_Point(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid FROM generate_series(-4,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,8) z1 WHERE x1 > y1*0.5 AND z1 < x1*y1) As e INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_Point(x1*10,y1), z1)),y1*1, z1*2) As line FROM generate_series(-3,6) x1 CROSS JOIN generate_series(2,5) y1 CROSS JOIN generate_series(1,10) z1 WHERE x1 > y1*0.75 AND z1 < x1*y1) As f ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line)) GROUP BY gid, e.buff) As quintuplet_experiment WHERE ST_IsValid(geom) = false ORDER BY gid LIMIT 3; gid | validity_info ------+-------------------------- 5330 | Self-intersection [32 5] 5340 | Self-intersection [42 5] 5350 | Self-intersection [52 5] --simple example SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020 150410)'); st_isvalidreason ------------------ Valid Geometry
ST_MakeValid — 頂点を失うことなしに不正なジオメトリを妥当なジオメトリにしようと試みます。
geometry ST_MakeValid(
geometry input)
;
geometry ST_MakeValid(
geometry input, text params)
;
与えられた不正なジオメトリを、入力ジオメトリの頂点を捨てずに、妥当な表現で生成しようとします。妥当なジオメトリは変更せずに返します。
対応する入力はPOINTS, MULTIPOINTS, LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON, GEOMETRYCOLLECTIONおよびそれらの混交したものです。
完全または部分的な次元崩壊の場合には、出力ジオメトリは、同次元まはた低い次元のジオメトリのコレクションか、低い次元のジオメトリコレクションになります。
単一ポリゴンは、自己インタセクトがある場合には、マルチポリゴンになります。
params
引数は、妥当なジオメトリを構築するために使うメソッドを選択するための任意文字列を与えるのに使えます。任意文字列は"method=linework|structure keepcollapsed=true|false"という書式に従います。"params"引数が無い場合には、"linework"アルゴリズムがデフォルトとして使われます。
"method"キーに対して取り得る値は二つあります。
"linework"は従来のアルゴリズムです。はじめに全てのラインを抽出し、線画からノードを生成して、そこから妥当なジオメトリを構築します。
"structure"は、リングの内と外の間を識別して、外リングを結合し、全ての内リングとの差を取ることで新しいジオメトリを構築します。
"keepcollapsed"キーは"structure"アルゴリズムでのみ有効です。"true"または"false"を取ります。"false"が指定された場合には、1点のLINESTRING等のような低い次元に崩壊したジオメトリ要素が出てきます。
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値を削除しません。
SELECT f.geom AS before_geom, ST_MakeValid(f.geom) AS after_geom, ST_MakeValid(f.geom, 'method=structure') AS after_geom_structure FROM (SELECT 'MULTIPOLYGON(((186 194,187 194,188 195,189 195,190 195, 191 195,192 195,193 194,194 194,194 193,195 192,195 191, 195 190,195 189,195 188,194 187,194 186,14 6,13 6,12 5,11 5, 10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,186 194)), ((150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40, 90 41,81 44,72 48,65 55,58 62,54 71,51 80,50 90,51 100, 54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139, 119 136,128 132,135 125,142 118,146 109,149 100,150 90)))'::geometry AS geom) AS f;
|
SELECT c.geom AS before_geom, ST_MakeValid(c.geom) AS after_geom, ST_MakeValid(c.geom, 'method=structure') AS after_geom_structure FROM (SELECT 'MULTIPOLYGON(((91 50,79 22,51 10,23 22,11 50,23 78,51 90,79 78,91 50)), ((91 100,79 72,51 60,23 72,11 100,23 128,51 140,79 128,91 100)), ((91 150,79 122,51 110,23 122,11 150,23 178,51 190,79 178,91 150)), ((141 50,129 22,101 10,73 22,61 50,73 78,101 90,129 78,141 50)), ((141 100,129 72,101 60,73 72,61 100,73 128,101 140,129 128,141 100)), ((141 150,129 122,101 110,73 122,61 150,73 178,101 190,129 178,141 150)))'::geometry AS geom) AS c;
|
SELECT ST_AsText(ST_MakeValid( 'LINESTRING(0 0, 0 0)', 'method=structure keepcollapsed=true' )); st_astext ------------ POINT(0 0) SELECT ST_AsText(ST_MakeValid( 'LINESTRING(0 0, 0 0)', 'method=structure keepcollapsed=false' )); st_astext ------------------ LINESTRING EMPTY
これらの関数はspatial_ref_sys
テーブルで定義されているジオメトリの空間参照系と連携します。
ST_InverseTransformPipeline — 定義した座標変換パイプラインの逆変換を使って、異なる空間参照系に座標値を変換した新しいジオメトリを返します。
geometry ST_InverseTransformPipeline(
geometry geom, text pipeline, integer to_srid)
;
定義した座標変換パイプラインの逆方向への変換を使って、異なる空間参照系に座標値を変換した新しいジオメトリを返します。
変換パイプラインの記述に関する詳細についてはST_TransformPipelineを参照して下さい。
Availability: 3.4.0
入力ジオメトリのSRIDは無視され、任意パラメータ to_srid
から値が提供されていない場合には出力ジオメトリのSRIDは0に設定されます。ST_TransformPipelineを使うときには、パイプラインが順方向に実行されます。`ST_InverseTransformPipeline()`を使うと、パイプラインは逆方向に実行されます。
パイプラインを用いた変換はST_Transformの特別版です。ほとんどの場合、`ST_Transform`は、座標系間の変換において正しい演算子を選択します。こちらの方が推奨されます。
EPSG:16031変換を使ったWGS 84 経度緯度から UTM31Nへの変換
-- Inverse direction SELECT ST_AsText(ST_InverseTransformPipeline('POINT(426857.9877165967 5427937.523342293)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::16031')) AS wgs_geom; wgs_geom ---------------------------- POINT(2 48.99999999999999) (1 row)
GDA2020の例。
-- using ST_Transform with automatic selection of a conversion pipeline. SELECT ST_AsText(ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844)) AS gda2020_auto; gda2020_auto ----------------------------------------------- POINT(143.00000635638918 -36.999986706128176) (1 row)
ST_SetSRID — ジオメトリにSRIDを設定します。
geometry ST_SetSRID(
geometry geom, integer srid)
;
ジオメトリのSRIDを特定の整数値に設定します。クエリのためのバウンディングボックスを生成する際に使います。
この関数はジオメトリを変換せず、ジオメトリが仮定する空間参照系を定義するメタデータを設定するだけです。ジオメトリを新しい投影法に変換したい場合はST_Transformを使います。 |
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドは曲線ストリングと曲線に対応しています。
-- ポイントをWGS84経度緯度に設定 --
SELECT ST_SetSRID(ST_Point(-123.365556, 48.428611),4326) As wgs84long_lat; -- the ewkt representation (wrap with ST_AsEWKT) - SRID=4326;POINT(-123.365556 48.428611)
-- ポイントをWGS84経度緯度に設定したうえで、WEBメルカトル(球面メルカトル)に変換 --
SELECT ST_Transform(ST_SetSRID(ST_Point(-123.365556, 48.428611),4326),3785) As spere_merc; -- the ewkt representation (wrap with ST_AsEWKT) - SRID=3785;POINT(-13732990.8753491 6178458.96425423)
ST_SRID — ジオメトリの空間参照系識別子を返します。
integer ST_SRID(
geometry g1)
;
ST_Geometryのspatial_ref_sysテーブルで定義されている空間参照系の識別番号を返します。Section 4.5, “空間参照系”を参照して下さい。
spatial_ref_sysテーブルはPostGISが知る参照系の全てのカタログを作っていて、ある空間参照系から他の空間参照系に変換するために使われます。ジオメトリの変換を予定している場合は正しい空間参照系の識別番号を持っているか確認することは重要です。 |
このメソッドは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)); --result 4326
ST_Transform — 異なる空間参照系に投影変換された新しいジオメトリを返します。
geometry ST_Transform(
geometry g1, integer srid)
;
geometry ST_Transform(
geometry geom, text to_proj)
;
geometry ST_Transform(
geometry geom, text from_proj, text to_proj)
;
geometry ST_Transform(
geometry geom, text from_proj, integer to_srid)
;
異なる空間参照系に投影変換された新しいジオメトリを返します。変換先空間参照系であるto_srid
は、妥当なSRID整数パラメータ (spatial_ref_sys
にあるということ)です。他にも、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_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))',2249),4326)) As wgs_geom; wgs_geom --------------------------- POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009, -71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.177684 8522251 42.3902896512902)); (1 row) --3D Circular String example SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'),4326)); st_asewkt -------------------------------------------------------------------------------------- SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512902 1,-71.1776843766326 42.3903829478009 2, -71.1775844305465 42.3903826677917 3, -71.1775825927231 42.3902893647987 3,-71.1776848522251 42.3902896512902 4)
部分関数インデクスを作る例です。全てのジオメトリが入っているとは確信できないテーブルのためには、スペースの節約とインデクスを小さく効率的にするために、NULLジオメトリを無視する部分インデクスを使うのが最善です。
CREATE INDEX idx_geom_26986_parcels ON parcels USING gist (ST_Transform(geom, 26986)) WHERE geom IS NOT NULL;
PROJ.4テキストを使って、独自の空間参照系に投影変換する例です。
-- Find intersection of two polygons near the North pole, using a custom Gnomic projection -- See http://boundlessgeo.com/2012/02/flattening-the-peel/ WITH data AS ( SELECT ST_GeomFromText('POLYGON((170 50,170 72,-130 72,-130 50,170 50))', 4326) AS p1, ST_GeomFromText('POLYGON((-170 68,-170 90,-141 90,-141 68,-170 68))', 4326) AS p2, '+proj=gnom +ellps=WGS84 +lat_0=70 +lon_0=-160 +no_defs'::text AS gnom ) SELECT ST_AsText( ST_Transform( ST_Intersection(ST_Transform(p1, gnom), ST_Transform(p2, gnom)), gnom, 4326)) FROM data; st_astext -------------------------------------------------------------------------------- POLYGON((-170 74.053793645338,-141 73.4268621378904,-141 68,-170 68,-170 74.053793645338))
グリッドシフトを含む座標変換は、ときどき失敗します。たとえば、PROJ.4にグリッドシフトファイルを付けてビルドされていなかった場合や、座標がグリッドシフト定義の範囲内に無い、といった場合です。デフォルトでは、PostGISはグリッドシフトファイルが無い場合はエラーを投げますが、この挙動は、PROJ.4 テキストのto_proj
値の変更を試みたり、spatial_ref_sys
テーブルのproj4text
値を変更したりすることで、SRID毎の原則を設定することができます。
たとえば、proj4textパラメータ +datum=NAD87 は次に示す+nadgridsパラメータの短縮形です。
+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
接頭辞@は、ファイルが無くてもエラー報告をしないという意味ですが、適切だった (発見されてオーバラップした)ファイルがないままリストの終わりに達した場合はエラーが出ます。
逆に、少なくとも標準的なファイルが確実にあって欲しいけれども、該当が無いまま全てのファイルが走査された場合に、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への変換
-- Forward direction SELECT ST_AsText(ST_TransformPipeline('SRID=4326;POINT(2 49)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::16031')) AS utm_geom; utm_geom -------------------------------------------- POINT(426857.9877165967 5427937.523342293) (1 row) -- Inverse direction SELECT ST_AsText(ST_InverseTransformPipeline('POINT(426857.9877165967 5427937.523342293)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::16031')) AS wgs_geom; wgs_geom ---------------------------- POINT(2 48.99999999999999) (1 row)
GDA2020の例。
-- using ST_Transform with automatic selection of a conversion pipeline. SELECT ST_AsText(ST_Transform('SRID=4939;POINT(143.0 -37.0)'::geometry, 7844)) AS gda2020_auto; gda2020_auto ----------------------------------------------- POINT(143.00000635638918 -36.999986706128176) (1 row) -- using a defined conversion (EPSG:8447) SELECT ST_AsText(ST_TransformPipeline('SRID=4939;POINT(143.0 -37.0)'::geometry, 'urn:ogc:def:coordinateOperation:EPSG::8447')) AS gda2020_code; gda2020_code ---------------------------------------------- POINT(143.0000063280214 -36.999986718287545) (1 row) -- using a PROJ pipeline definition matching EPSG:8447, as returned from -- 'projinfo -s EPSG:4939 -t EPSG:7844'. -- NOTE: any 'axisswap' steps must be removed. SELECT ST_AsText(ST_TransformPipeline('SRID=4939;POINT(143.0 -37.0)'::geometry, '+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=hgridshift +grids=au_icsm_GDA94_GDA2020_conformal_and_distortion.tif +step +proj=unitconvert +xy_in=rad +xy_out=deg')) AS gda2020_pipeline; gda2020_pipeline ---------------------------------------------- POINT(143.0000063280214 -36.999986718287545) (1 row)
postgis_srs_codes — 指定した機関に関連付けられたSRSコードの一覧を返します。
setof text postgis_srs_codes(
text auth_name)
;
与えられたauth_name
に関する全てのauth_srid
の集合を返します。
Availability: 3.4.0
Proj 6以上
EPSG機関に関連付けられているコードの最初の10件の一覧を得ます。
SELECT * FROM postgis_srs_codes('EPSG') LIMIT 10; postgis_srs_codes ------------------- 2000 20004 20005 20006 20007 20008 20009 2001 20010 20011
postgis_srs — 求める機関と空間参照識別子に関するメタデータレコードを返します。
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 * FROM postgis_srs('EPSG', '3005'); auth_name | EPSG auth_srid | 3005 srname | NAD83 / BC Albers srtext | PROJCS["NAD83 / BC Albers", ... ]] proj4text | +proj=aea +lat_0=45 +lon_0=-126 +lat_1=50 +lat_2=58.5 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs +type=crs point_sw | 0101000020E6100000E17A14AE476161C00000000000204840 point_ne | 0101000020E610000085EB51B81E855CC0E17A14AE47014E40
postgis_srs_all — Projデータベース内のあらゆる空間参照系のメタデータレコードを返します。
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() LIMIT 10; auth_name | auth_srid | srname -----------+-----------+------------------------------------------ EPSG | 2000 | Anguilla 1957 / British West Indies Grid EPSG | 20004 | Pulkovo 1995 / Gauss-Kruger zone 4 EPSG | 20005 | Pulkovo 1995 / Gauss-Kruger zone 5 EPSG | 20006 | Pulkovo 1995 / Gauss-Kruger zone 6 EPSG | 20007 | Pulkovo 1995 / Gauss-Kruger zone 7 EPSG | 20008 | Pulkovo 1995 / Gauss-Kruger zone 8 EPSG | 20009 | Pulkovo 1995 / Gauss-Kruger zone 9 EPSG | 2001 | Antigua 1943 / British West Indies Grid EPSG | 20010 | Pulkovo 1995 / Gauss-Kruger zone 10 EPSG | 20011 | Pulkovo 1995 / Gauss-Kruger zone 11
postgis_srs_search — 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, ST_AsText(point_sw) AS point_sw, ST_AsText(point_ne) AS point_ne FROM postgis_srs_search('SRID=4326;LINESTRING(-90 30, -91 31)') LIMIT 3; auth_name | auth_srid | srname | point_sw | point_ne -----------+-----------+--------------------------------------+---------------------+--------------------- EPSG | 2801 | NAD83(HARN) / Louisiana South | POINT(-93.94 28.85) | POINT(-88.75 31.07) EPSG | 3452 | NAD83 / Louisiana South (ftUS) | POINT(-93.94 28.85) | POINT(-88.75 31.07) EPSG | 3457 | NAD83(HARN) / Louisiana South (ftUS) | POINT(-93.94 28.85) | POINT(-88.75 31.07)
最大範囲を得るためにテーブルをスキャンして、適していると言えそうな投影座標系を見つけます。
WITH ext AS ( SELECT ST_Extent(geom) AS geom, Max(ST_SRID(geom)) AS srid FROM foo ) SELECT auth_name, auth_srid, srname, ST_AsText(point_sw) AS point_sw, ST_AsText(point_ne) AS point_ne FROM ext CROSS JOIN postgis_srs_search(ST_SetSRID(ext.geom, ext.srid)) LIMIT 3;
これらの関数によって、様々な文字列形式やバイナリ形式からジオメトリオブジェクトを生成できます。
ST_BdPolyFromText — マルチラインストリングの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の別名です。ポイントは常に経度緯度形式で表現されます。
--- converting lon lat coords to geography ALTER TABLE sometable ADD COLUMN geog geography(POINT,4326); UPDATE sometable SET geog = ST_GeogFromText('SRID=4326;POINT(' || lon || ' ' || lat || ')'); --- specify a geography point using EPSG:4267, NAD27 SELECT ST_AsEWKT(ST_GeogFromText('SRID=4267;POINT(-77.0092 38.889588)'));
ST_GeographyFromText — 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)に対応しています。
SELECT ST_GeomFromEWKT('SRID=4269;LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)'); SELECT ST_GeomFromEWKT('SRID=4269;MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))'); SELECT ST_GeomFromEWKT('SRID=4269;POINT(-71.064544 42.28787)'); SELECT ST_GeomFromEWKT('SRID=4269;POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'); SELECT ST_GeomFromEWKT('SRID=4269;MULTIPOLYGON(((-71.1031880899493 42.3152774590236, -71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307, -71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248, -71.102505233663 42.3144722937587,-71.10277487471 42.3141658254797, -71.103113945163 42.3142739188902,-71.10324876416 42.31402489987, -71.1033002961013 42.3140393340215,-71.1033488797549 42.3139495090772, -71.103396240451 42.3138632439557,-71.1041521907712 42.3141153348029, -71.1041411411543 42.3141545014533,-71.1041287795912 42.3142114839058, -71.1041188134329 42.3142693656241,-71.1041112482575 42.3143272556118, -71.1041072845732 42.3143851580048,-71.1041057218871 42.3144430686681, -71.1041065602059 42.3145009876017,-71.1041097995362 42.3145589148055, -71.1041166403905 42.3146168544148,-71.1041258822717 42.3146748022936, -71.1041375307579 42.3147318674446,-71.1041492906949 42.3147711126569, -71.1041598612795 42.314808571739,-71.1042515013869 42.3151287620809, -71.1041173835118 42.3150739481917,-71.1040809891419 42.3151344119048, -71.1040438678912 42.3151191367447,-71.1040194562988 42.3151832057859, -71.1038734225584 42.3151140942995,-71.1038446938243 42.3151006300338, -71.1038315271889 42.315094347535,-71.1037393329282 42.315054824985, -71.1035447555574 42.3152608696313,-71.1033436658644 42.3151648370544, -71.1032580383161 42.3152269126061,-71.103223066939 42.3152517403219, -71.1031880899493 42.3152774590236)), ((-71.1043632495873 42.315113108546,-71.1043583974082 42.3151211109857, -71.1043443253471 42.3150676015829,-71.1043850704575 42.3150793250568,-71.1043632495873 42.315113108546)))');
--3d circular string SELECT ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)');
--Polyhedral Surface example SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )');
ST_GeomFromMARC21 — MARC21/XML地理データを入力に取り、PostGISジオメトリオブジェクトを返します。
geometry ST_GeomFromMARC21 (
text marcxml )
;
この関数はMARC21/XMLデータからPostGISジオメトリを生成するものです。POINT
またはPOLYGON
を含みます。同じMARC21/XMLデータで複数の地理データが存在する場合には、 MULTIPOINT
またはMULTIPOLYGON
を返します。データにジオメトリタイプが混じっている場合には、GEOMETRYCOLLECTION
を返します。MARC21/XMLデータに地理データ (データフィールド:034)を含まない場合にはNULLを返します。
対応するLOC MARC21/XMLのバージョンは次の通りです。
Availability: 3.3.0 libxml2 2.6以上が必要です。
MARC21/XMLコード化地理数値データでは、今のところコード化した座標の空間参照系を記述する手段がないため、この関数は常に |
返される |
POINT
を一つ含み hddd.dddddd
でエンコードしたMARC21/XML地理データの変換
SELECT ST_AsText( ST_GeomFromMARC21(' <record xmlns="http://www.loc.gov/MARC21/slim"> <leader >00000nz a2200000nc 4500</leader> <controlfield tag="001" >040277569</controlfield> <datafield tag="034" ind1=" " ind2=" "> <subfield code="d" >W004.500000</subfield> <subfield code="e" >W004.500000</subfield> <subfield code="f" >N054.250000</subfield> <subfield code="g" >N054.250000</subfield> </datafield> </record >')); st_astext ------------------- POINT(-4.5 54.25) (1 row)
POLYGON
を一つ含み hdddmmss
でエンコードしたMARC21/XML地理データの変換
SELECT ST_AsText( ST_GeomFromMARC21(' <record xmlns="http://www.loc.gov/MARC21/slim"> <leader >01062cem a2200241 a 4500</leader> <controlfield tag="001" > 84696781 </controlfield> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="b" >50000</subfield> <subfield code="d" >E0130600</subfield> <subfield code="e" >E0133100</subfield> <subfield code="f" >N0523900</subfield> <subfield code="g" >N0522300</subfield> </datafield> </record >')); st_astext ----------------------------------------------------------------------------------------------------------------------- POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)) (1 row)
POLYGON
とPOINT
を含むMARC21/XML地理データの変換:
SELECT ST_AsText( ST_GeomFromMARC21(' <record xmlns="http://www.loc.gov/MARC21/slim"> <datafield tag="034" ind1="1" ind2=" "> <subfield code="a" >a</subfield> <subfield code="b" >50000</subfield> <subfield code="d" >E0130600</subfield> <subfield code="e" >E0133100</subfield> <subfield code="f" >N0523900</subfield> <subfield code="g" >N0522300</subfield> </datafield> <datafield tag="034" ind1=" " ind2=" "> <subfield code="d" >W004.500000</subfield> <subfield code="e" >W004.500000</subfield> <subfield code="f" >N054.250000</subfield> <subfield code="g" >N054.250000</subfield> </datafield> </record >')); st_astext ------------------------------------------------------------------------------------------------------------------------------------------------------------- GEOMETRYCOLLECTION(POLYGON((13.1 52.65,13.516666666666667 52.65,13.516666666666667 52.38333333333333,13.1 52.38333333333333,13.1 52.65)),POINT(-4.5 54.25)) (1 row)
ST_GeometryFromText — Well-Knwon Text表現 (WKT)から指定したST_Geometry値を返します。これはST_GeomFromTextの別名です。
geometry ST_GeometryFromText(
text WKT)
;
geometry ST_GeometryFromText(
text WKT, integer srid)
;
このメソッドは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')となります。 |
SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)'); SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)',4269); SELECT ST_GeomFromText('MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))'); SELECT ST_GeomFromText('POINT(-71.064544 42.28787)'); SELECT ST_GeomFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'); SELECT ST_GeomFromText('MULTIPOLYGON(((-71.1031880899493 42.3152774590236, -71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307, -71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248, -71.102505233663 42.3144722937587,-71.10277487471 42.3141658254797, -71.103113945163 42.3142739188902,-71.10324876416 42.31402489987, -71.1033002961013 42.3140393340215,-71.1033488797549 42.3139495090772, -71.103396240451 42.3138632439557,-71.1041521907712 42.3141153348029, -71.1041411411543 42.3141545014533,-71.1041287795912 42.3142114839058, -71.1041188134329 42.3142693656241,-71.1041112482575 42.3143272556118, -71.1041072845732 42.3143851580048,-71.1041057218871 42.3144430686681, -71.1041065602059 42.3145009876017,-71.1041097995362 42.3145589148055, -71.1041166403905 42.3146168544148,-71.1041258822717 42.3146748022936, -71.1041375307579 42.3147318674446,-71.1041492906949 42.3147711126569, -71.1041598612795 42.314808571739,-71.1042515013869 42.3151287620809, -71.1041173835118 42.3150739481917,-71.1040809891419 42.3151344119048, -71.1040438678912 42.3151191367447,-71.1040194562988 42.3151832057859, -71.1038734225584 42.3151140942995,-71.1038446938243 42.3151006300338, -71.1038315271889 42.315094347535,-71.1037393329282 42.315054824985, -71.1035447555574 42.3152608696313,-71.1033436658644 42.3151648370544, -71.1032580383161 42.3152269126061,-71.103223066939 42.3152517403219, -71.1031880899493 42.3152774590236)), ((-71.1043632495873 42.315113108546,-71.1043583974082 42.3151211109857, -71.1043443253471 42.3150676015829,-71.1043850704575 42.3150793250568,-71.1043632495873 42.315113108546)))',4326); SELECT ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)');
ST_LineFromText — 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)') AS null_return; aline | null_return ------------------------------------------------ 010200000002000000000000000000F ... | t
ST_MLineFromText — WKT表現から指定したST_MultiLineString値を返します。
geometry ST_MLineFromText(
text WKT, integer srid)
;
geometry ST_MLineFromText(
text WKT)
;
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
SELECT ST_MPolyFromText('MULTIPOLYGON(((0 0 1,20 0 1,20 20 1,0 20 1,0 0 1),(5 5 3,5 7 3,7 7 3,7 5 3,5 5 3)))'); SELECt ST_MPolyFromText('MULTIPOLYGON(((-70.916 42.1002,-70.9468 42.0946,-70.9765 42.0872,-70.9754 42.0875,-70.9749 42.0879,-70.9752 42.0881,-70.9754 42.0891,-70.9758 42.0894,-70.9759 42.0897,-70.9759 42.0899,-70.9754 42.0902,-70.9756 42.0906,-70.9753 42.0907,-70.9753 42.0917,-70.9757 42.0924,-70.9755 42.0928,-70.9755 42.0942,-70.9751 42.0948,-70.9755 42.0953,-70.9751 42.0958,-70.9751 42.0962,-70.9759 42.0983,-70.9767 42.0987,-70.9768 42.0991,-70.9771 42.0997,-70.9771 42.1003,-70.9768 42.1005,-70.977 42.1011,-70.9766 42.1019,-70.9768 42.1026,-70.9769 42.1033,-70.9775 42.1042,-70.9773 42.1043,-70.9776 42.1043,-70.9778 42.1048,-70.9773 42.1058,-70.9774 42.1061,-70.9779 42.1065,-70.9782 42.1078,-70.9788 42.1085,-70.9798 42.1087,-70.9806 42.109,-70.9807 42.1093,-70.9806 42.1099,-70.9809 42.1109,-70.9808 42.1112,-70.9798 42.1116,-70.9792 42.1127,-70.979 42.1129,-70.9787 42.1134,-70.979 42.1139,-70.9791 42.1141,-70.9987 42.1116,-71.0022 42.1273, -70.9408 42.1513,-70.9315 42.1165,-70.916 42.1002)))',4326);
ST_PointFromText — 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
SELECT ST_PointFromText('POINT(-71.064544 42.28787)'); SELECT ST_PointFromText('POINT(-71.064544 42.28787)', 4326);
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
SELECT ST_PolygonFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))'); st_polygonfromtext ------------------ 010300000001000000050000006... SELECT ST_PolygonFromText('POINT(1 2)') IS NULL as point_is_notpoly; point_is_not_poly ---------- t
ST_WKTToSQL — Well-Knwon Text表現 (WKT)から指定したST_Geometry値を返します。これはST_GeomFromTextの別名です。
geometry ST_WKTToSQL(
text WKT)
;
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.34
LINESTRING
を生成します。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経度緯度)となります。
このメソッドは曲線ストリングと曲線に対応しています。
--Although bytea rep contains single \, these need to be escaped when inserting into a table SELECT ST_AsText( ST_GeogFromWKB(E'\\001\\002\\000\\000\\000\\002\\000\\000\\000\\037\\205\\353Q\\270~\\\\\\300\\323Mb\\020X\\231C@\\020X9\\264\\310~\\\\\\300)\\\\\\217\\302\\365\\230C@') ); st_astext ------------------------------------------------------ LINESTRING(-113.98 39.198,-113.981 39.195) (1 row)
ST_GeomFromEWKB — 拡張Well-Known Binary表現 (EWKB)から指定したST_Geometry値を返します。
geometry ST_GeomFromEWKB(
bytea EWKB)
;
拡張Well-Known Binary表現 (EWKB)からPostGISのST_Geometryオブジェクトを構築します。
EWKB書式はOGC標準ではなくPostGIS独特の書式で、空間参照系識別番号 (SRID)を含みます。 |
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
この関数は3次元に対応し、Z値を削除しません。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
NAD83経度緯度 (4269)のLINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)のバイナリ表現です。
ご注意: byte配列は、\で区切られ、'を持ちますが、standard_conforming_stringsが切られている場合には、\と''でエスケープします。正確にはAsEWKB表現とはあいません。 |
SELECT ST_GeomFromEWKB(E'\\001\\002\\000\\000 \\255\\020\\000\\000\\003\\000\\000\\000\\344J= \\013B\\312Q\\300n\\303(\\010\\036!E@''\\277E''K \\312Q\\300\\366{b\\235*!E@\\225|\\354.P\\312Q \\300p\\231\\323e1!E@');
PostgreSQL 9.1より前では、standard_conforming_stringsは切られていましたが、9.1以上では、デフォルトで入っていることになりました。必要に応じて、クエリ1回で、データベースまたはサーバレベルでのデフォルトを変更できます。standard_conforming_strings = on使った場合を次に示します。この場合、'を標準ANSIの'でエスケープしますが、バックスラッシュはエスケープしていません。 |
set standard_conforming_strings = on; SELECT ST_GeomFromEWKB('\001\002\000\000 \255\020\000\000\003\000\000\000\344J=\012\013B \312Q\300n\303(\010\036!E@''\277E''K\012\312Q\300\366{b\235*!E@\225|\354.P\312Q\012\300p\231\323e1')
ST_GeomFromWKB — 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
このメソッドは曲線ストリングと曲線に対応しています。
--Although bytea rep contains single \, these need to be escaped when inserting into a table -- unless standard_conforming_strings is set to on. SELECT ST_AsEWKT( ST_GeomFromWKB(E'\\001\\002\\000\\000\\000\\002\\000\\000\\000\\037\\205\\353Q\\270~\\\\\\300\\323Mb\\020X\\231C@\\020X9\\264\\310~\\\\\\300)\\\\\\217\\302\\365\\230C@',4326) ); st_asewkt ------------------------------------------------------ SRID=4326;LINESTRING(-113.98 39.198,-113.981 39.195) (1 row) SELECT ST_AsText( ST_GeomFromWKB( ST_AsEWKB('POINT(2 5)'::geometry) ) ); st_astext ------------ POINT(2 5) (1 row)
ST_LineFromWKB — WKB表現と与えられたSRIDからLINESTRING
を生成します。
geometry ST_LineFromWKB(
bytea WKB)
;
geometry ST_LineFromWKB(
bytea WKB, integer srid)
;
ST_LineFromWKB
は、ジオメトリのWell-Known Binary表現と空間参照系識別番号 (SRID
)を取り、適切なジオメトリタイプを返します。この場合はLINESTRING
ジオメトリです。この関数はSQLのジオメトリファクトリの役割を果たします。
SRIDが指定されていない場合は0 (不明)となります。入力bytea
がLINESTRING
を表現していない場合はNULL
を返します。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。 |
全てのジオメトリが |
このメソッドは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 ------------------------------------------------ 010200000002000000000000000000F ... | t
ST_LinestringFromWKB — WKB表現と与えられたSRIDからジオメトリを生成します。
geometry ST_LinestringFromWKB(
bytea WKB)
;
geometry ST_LinestringFromWKB(
bytea WKB, integer srid)
;
ST_LinestringFromWKB
は、ジオメトリのWell-Known Binary表現と空間参照系識別番号 (SRID
を取り、適切なジオメトリタイプのインスタンスを生成します。この場合、LINESTRING
ジオメトリです。この関数はSQLのジオメトリファクトリの役割を果たします。
SRIDが指定されていない場合は0 (不明)となります。入力bytea
がLINESTRING
を表現していない場合はNULL
を返します。これはST_LineFromWKBの別名です。
OGC SPEC 3.2.6.2 - 任意引数SRIDは仕様適合のためです。 |
全てのジオメトリが |
このメソッドは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 ------------------------------------------------ 010200000002000000000000000000F ... | 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_AsText( ST_PointFromWKB( ST_AsEWKB('POINT(2 5)'::geometry) ) ); st_astext ------------ POINT(2 5) (1 row) SELECT ST_AsText( ST_PointFromWKB( ST_AsEWKB('LINESTRING(2 5, 2 6)'::geometry) ) ); st_astext ----------- (1 row)
ST_WKBToSQL — Well-Known Binary表現 (WKB)からST_Geometry値を生成します。これはSRIDを取らないST_GeomFromWKBの別名です。
geometry ST_WKBToSQL(
bytea WKB)
;
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.36
ST_Box2dFromGeoHash — GeoHash文字列からBOX2Dを返します。
box2d ST_Box2dFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
GeoHash文字列からBOX2Dを返します。
precision
が指定されない場合には、ST_Box2dFromGeoHashは、入力ジオハッシュ文字列の完全な精度に基づいたBOX2Dを返します。
precision
が指定されている場合には、ST_Box2dFromGeoHashは、BOX2Dを生成するために、GeoHashからの多数の文字を使用します。低い精度の値では大きなBOX2Dを返し、値が大きいほど精度が増します。
Availability: 2.1.0
SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0'); st_geomfromgeohash -------------------------------------------------- BOX(-115.172816 36.114646,-115.172816 36.114646) SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 0); st_box2dfromgeohash ---------------------- BOX(-180 -90,180 90) SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10); st_box2dfromgeohash --------------------------------------------------------------------------- BOX(-115.17282128334 36.1146408319473,-115.172810554504 36.1146461963654)
ST_GeomFromGeoHash — GeoHash文字列からジオメトリを返します。
geometry ST_GeomFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
GeoHash文字列からジオメトリを返します。ジオメトリはGeoHashバウンディングボックスのポリゴン表現となります。
precision
を指定しない場合には、ST_GeomFromGeoHashは、入力GeoHash文字列の最大精度に基づくポリゴンを返します。
precision
が指定されると、ST_GeomFromGeoHashは、ポリゴンを生成するためGeoHashからの多数の文字を使います。
Availability: 2.1.0
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0')); st_astext -------------------------------------------------------------------------------------------------------------------------- POLYGON((-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646)) SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4)); st_astext ------------------------------------------------------------------------------------------------------------------------------ POLYGON((-115.3125 36.03515625,-115.3125 36.2109375,-114.9609375 36.2109375,-114.9609375 36.03515625,-115.3125 36.03515625)) SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10)); st_astext ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- POLYGON((-115.17282128334 36.1146408319473,-115.17282128334 36.1146461963654,-115.172810554504 36.1146461963654,-115.172810554504 36.1146408319473,-115.17282128334 36.1146408319473))
ST_GeomFromGML — GML表現からPostGISジオメトリオブジェクトを出力します。
geometry ST_GeomFromGML(
text geomgml)
;
geometry ST_GeomFromGML(
text geomgml, integer srid)
;
OGC GML表現からPostGIS ST_Geometryオブジェクトを生成します。
ST_GeomFromGMLは、GMLのうちジオメトリ部分でのみ動作します。GML文書全体に使用しようとするとエラーが投げられます。
サポートされているOGC GMLの版は次のとおりです。
GML 3.2.1 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任意引数が追加されました。
この関数は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機能を使いたい場合は必要です。
ST_GeomFromGMLはSQL/MM曲線ジオメトリに対応していません。 |
SELECT ST_GeomFromGML($$ <gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4269"> <gml:coordinates> -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932 </gml:coordinates> </gml:LineString> $$);
SELECT ST_GeomFromGML($$ <gml:LineString xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" srsName="urn:ogc:def:crs:EPSG::4269"> <gml:pointProperty> <gml:Point gml:id="p1" ><gml:pos >42.258729 -71.16028</gml:pos ></gml:Point> </gml:pointProperty> <gml:pos >42.259112 -71.160837</gml:pos> <gml:pointProperty> <gml:Point xlink:type="simple" xlink:href="#p1"/> </gml:pointProperty> </gml:LineString> $$);
SELECT ST_AsEWKT(ST_GeomFromGML(' <gml:PolyhedralSurface xmlns:gml="http://www.opengis.net/gml"> <gml:polygonPatches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing ><gml:posList srsDimension="3" >0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList ></gml:LinearRing> </gml:exterior> </gml:PolygonPatch> </gml:polygonPatches> </gml:PolyhedralSurface >')); -- result -- POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)), ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)), ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)), ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)), ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)), ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))
ST_GeomFromGeoJSON — ジオメトリのGeoJSON表現を入力として、PostGISジオメトリオブジェクトを出力します。
geometry ST_GeomFromGeoJSON(
text geomjson)
;
geometry ST_GeomFromGeoJSON(
json geomjson)
;
geometry ST_GeomFromGeoJSON(
jsonb geomjson)
;
GeoJSON表現からPostGISジオメトリオブジェクトを生成します。
ST_GeomFromGeoJSONは、JSONのうちジオメトリ部分でのみ動作します。JSON文書全体を使おうとするとエラーが投げられます。
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をコンフィギュアで指定します。詳細についてはSection 2.2.3, “コンフィギュレーション”をご覧下さい。 |
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt; wkt ------ POINT(-48.23456 20.12345)
-- a 3D linestring SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[1,2,3],[4,5,6],[7,8,9]]}')) As wkt; wkt ------------------- LINESTRING(1 2,4 5,7 8)
ST_GeomFromKML — ジオメトリのKML表現の入力をとり、PostGISジオメトリオブジェクトを出力します。
geometry ST_GeomFromKML(
text geomkml)
;
OGC KML表現からPostGIS ST_Geometryオブジェクトを生成します。
ST_GeomFromKMLは、KMLのうちジオメトリ部分でのみ動作します。KML文書全体に使用しようとするとエラーが投げられます。
対応するOGC KMLの版は次の通りです。
KML 2.2.0 Namespace
OGC KML標準についてはhttp://www.opengeospatial.org/standards/kmlをご覧ください。
Availability: 1.5 libxml2 2.6以上が必要です。
この関数は3次元に対応し、Z値を削除しません。
ST_GeomFromKML関数はSQL/MM曲線ジオメトリに対応していません。 |
SELECT ST_GeomFromKML($$ <LineString> <coordinates >-71.1663,42.2614 -71.1667,42.2616</coordinates> </LineString> $$);
ST_GeomFromTWKB — TWKB ("Tiny Well-Known Binary")ジオメトリ表現からジオメトリインスタンスを生成します。
geometry ST_GeomFromTWKB(
bytea twkb)
;
ST_GeomFromTWKB
は、TWKB ("Tiny Well-Known Binary")ジオメトリ表現を取り、適切なジオメトリタイプとなるインスタンスを生成します。
SELECT ST_AsText(ST_GeomFromTWKB(ST_AsTWKB('LINESTRING(126 34, 127 35)'::geometry))); st_astext ----------------------------- LINESTRING(126 34, 127 35) (1 row) SELECT ST_AsEWKT( ST_GeomFromTWKB(E'\\x620002f7f40dbce4040105') ); st_asewkt ------------------------------------------------------ LINESTRING(-113.98 39.198,-113.981 39.195) (1 row)
ST_GMLToSQL — GML表現から指定したST_Geometry値を返します。これはST_GeomFromGMLの別名です。
geometry ST_GMLToSQL(
text geomgml)
;
geometry ST_GMLToSQL(
text geomgml, integer srid)
;
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.50 (曲線対応を除く)
Availability: 1.5 libxml2 1.6+が必要です。
Enhanced: 2.0.0 多面体サーフェス対応とTIN対応が導入されました。
Enhanced: 2.0.0 SRID任意引数が追加されました。
ST_LineFromEncodedPolyline — エンコード化ポリラインからラインストリングを生成します。
geometry ST_LineFromEncodedPolyline(
text polyline, integer precision=5)
;
エンコード化ポリラインからラインストリングを生成します。
任意パラメータprecision
は、ポリライン符号化の際の桁数を決定するものです。符号化と復号とで同じ値であるべきで、異なる場合には座標が正しくなりません。
http://developers.google.com/maps/documentation/utilities/polylinealgorithmを参照して下さい。
Availability: 2.2.0
-- Create a line string from a polyline SELECT ST_AsEWKT(ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@')); -- result -- SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252) -- Select different precision that was used for polyline encoding SELECT ST_AsEWKT(ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@',6)); -- result -- SRID=4326;LINESTRING(-12.02 3.85,-12.095 4.07,-12.6453 4.3252)
ST_PointFromGeoHash — GeoHash文字列からポイントを返します。
point ST_PointFromGeoHash(
text geohash, integer precision=full_precision_of_geohash)
;
GeoHash文字列からポイントを返します。ポイントはGeoHashの中心点を表します。
precision
を指定しない場合には、ST_PointFromGeoHashは、入力GeoHash文字列の最大精度に基づくポイントを返します。
precision
を指定した場合には、ST_PointFromGeoHashは、ポイント生成のために、GeoHasoから多数の文字を使用します。
Availability: 2.1.0
SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0')); st_astext ------------------------------ POINT(-115.172816 36.114646) SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4)); st_astext ----------------------------------- POINT(-115.13671875 36.123046875) SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10)); st_astext ------------------------------------------- POINT(-115.172815918922 36.1146435141563)
ST_FromFlatGeobufToTable — FlatGeobufデータの構造に基づいてテーブルを生成します。
void ST_FromFlatGeobufToTable(
text schemaname, text tablename, bytea FlatGeobuf input data)
;
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('0103000020E61000000100000005000000000000 000000000000000000000000000000000000000000000000000000 F03F000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000'::geometry); st_asewkt -------------------------------- SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0)) (1 row) SELECT ST_AsEWKT('0108000080030000000000000060E30A4100000000785C0241000000000000F03F0000000018 E20A4100000000485F024100000000000000400000000018 E20A4100000000305C02410000000000000840') --st_asewkt--- CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)
ST_AsText — ジオメトリ/ジオグラフィのSRIDメタデータのない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('01030000000100000005000000000000000000 000000000000000000000000000000000000000000000000 F03F000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000'); st_astext -------------------------------- POLYGON((0 0,0 1,1 1,1 0,0 0))
完全な出力制度がデフォルトです。
SELECT ST_AsText('POINT(111.1111111 1.1111111)')); st_astext ------------------------------ POINT(111.1111111 1.1111111)
引数maxdecimaldigits
は、出力精度の制限に使います。
SELECT ST_AsText('POINT(111.1111111 1.1111111)'), 2); st_astext -------------------- POINT(111.11 1.11)
ST_AsBinary — ジオメトリ/ジオグラフィの、SRIDメタデータを持たないOGC/ISO 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/ISOWell-Knownバイナリ (WKB)表現を返します。最初の形式では、サーバ機のエンディアンをデフォルトとして使います。二つ目の形式では、リトルエンディアン ('NDR')またはビッグエンディアン ('XDR')を指定する文字列を取ります。
WKB書式は、ジオメトリデータをデータベースから、完全な数値精度を維持して読み取るために使われます。これにより、WKT等のテキスト書式で発生する丸め誤差を回避できます。
WKB表現をPostGISジオメトリに逆変換するにはST_GeomFromWKBを使います。
OGC/ISO WKB書式はSRIDを持ちません。SRIDを含むEWKB書式を得るにはST_AsEWKBを使います。 |
PostgreSQL 9.0でのデフォルトの振る舞いが変更され、出力がbytea型の16進数エンコーディングなりました。GUIツールで古い振る舞いが必要な場合には、データベース内で SET bytea_output='escape' を実行します。 |
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)); st_asbinary -------------------------------- \x01030000000100000005000000000000000000000000000000000000000000000000000000000000 000000f03f000000000000f03f000000000000f03f000000000000f03f0000000000000000000000 00000000000000000000000000
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR'); st_asbinary -------------------------------- \x000000000300000001000000050000000000000000000000000000000000000000000000003ff000 00000000003ff00000000000003ff00000000000003ff00000000000000000000000000000000000 00000000000000000000000000
ST_AsEWKB — ジオメトリの、SRIDメタデータを持つExtended Well-Knownバイナリ (EWKB)表現を返します。
bytea ST_AsEWKB(
geometry g1)
;
bytea ST_AsEWKB(
geometry g1, text NDR_or_XDR)
;
ジオメトリの、SRIDメタデータを持つExtended Well-Knownバイナリ (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)); st_asewkb -------------------------------- \x0103000020e610000001000000050000000000000000000000000000000000000000000000000000 00000000000000f03f000000000000f03f000000000000f03f000000000000f03f00000000000000 0000000000000000000000000000000000
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR'); st_asewkb -------------------------------- \x0020000003000010e600000001000000050000000000000000000000000000000000000000000000 003ff00000000000003ff00000000000003ff00000000000003ff000000000000000000000000000 0000000000000000000000000000000000
ST_AsHEXEWKB — ジオメトリの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)); which gives same answer as SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)::text; st_ashexewkb -------- 0103000020E6100000010000000500 00000000000000000000000000000000 00000000000000000000000000000000F03F 000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000
ST_AsEncodedPolyline — ラインストリングジオメトリから符号化したポリラインを返します。
text ST_AsEncodedPolyline(
geometry geom, integer precision=5)
;
符号化したポリラインを返します。この書式はGoogle Mapsではprecision=5で、Open Source Routing Machineでは precision=5と6を使います。
任意パラメータprecision
は、ポリライン符号化の際の桁数を決定するものです。符号化と復号とで同じ値であるべきで、異なる場合には座標が正しくなりません。
Availability: 2.2.0
基本
SELECT ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); --result-- |_p~iF~ps|U_ulLnnqC_mqNvxq`@
ジオグラフィ型のラインストリングとジオグラフィ型のセグメント化したラインストリングを結合してGoogle Mapsに置きます。
-- the SQL for Boston to San Francisco, segments every 100 KM SELECT ST_AsEncodedPolyline( ST_Segmentize( ST_GeogFromText('LINESTRING(-71.0519 42.4935,-122.4483 37.64)'), 100000)::geometry) As encodedFlightPath;
JavaScriptコードは、クエリの結果を$変数と置き換えると次のようになります。
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry" ></script> <script type="text/javascript"> flightPath = new google.maps.Polyline({ path: google.maps.geometry.encoding.decodePath("$encodedFlightPath"), map: map, strokeColor: '#0000CC', strokeOpacity: 1.0, strokeWeight: 4 }); </script>
ST_AsFlatGeobuf — 行の集合のFlatGeobuf表現を返します。
bytea ST_AsFlatGeobuf(
anyelement set row)
;
bytea ST_AsFlatGeobuf(
anyelement row, bool index)
;
bytea ST_AsFlatGeobuf(
anyelement row, bool index, text geom_name)
;
FeatureCollectionに対応する行の集合のFlatGeobuf表現 (http://flatgeobuf.org) を返します。ご注意: PostgreSQLのbytea型は1GBを超えられません。
row
少なくとも一つのジオメトリカラムを持つ行データ。
index
空間インデックスの生成の切り替え。デフォルトはFALSEです。
geom_name
行データにおけるジオメトリカラムのカラム名。NULLの場合には、最初に見つけたジオメトリカラムとします。
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 ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))') AS geom) AS q; st_asgeobuf ---------------------------------- GAAiEAoOCgwIBBoIAAAAAgIAAAE=
ST_AsGeoJSON — GeoJSON形式のジオメトリまたは地物を返します。
text ST_AsGeoJSON(
record feature, text geom_column="", integer maxdecimaldigits=9, boolean pretty_bool=false, text id_column='')
;
text ST_AsGeoJSON(
geometry geom, integer maxdecimaldigits=9, integer options=8)
;
text ST_AsGeoJSON(
geography geog, integer maxdecimaldigits=9, integer options=0)
;
ジオメトリについてはGeoJSONの"geometry"オブジェクトとして返し、行についてGeoJSONの"feature"オブジェクトとして返します。
GeoJSONのジオメトリと地物の表現は、GeoJSON 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"メンバ内に入ります。
GeoJSON仕様では、ポリゴンは右手規則を使い、この方向を求めるクライアントがあります。これはST_ForcePolygonCCW を使用して確実に対応します。仕様はまたジオメトリの座標系としてWGS84 (SRID=4326)が求められます。必要ならST_TransformをST_Transform( geom, 4326 )
のように使って、ジオメトリをWGS84に座標変換します。
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を含むカラムを指定できるようになりました
この関数は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);
st_asgeojson ----------------------------------------------------------------------------------------------------------------- {"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;
st_asgeojson ----------------------------------------------------------------------------------------------------------- {"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)に対応しています。
SELECT ST_AsGML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asgml -------- <gml:Polygon srsName="EPSG:4326" ><gml:outerBoundaryIs ><gml:LinearRing ><gml:coordinates >0,0 0,1 1,1 1,0 0,0</gml:coordinates ></gml:LinearRing ></gml:outerBoundaryIs ></gml:Polygon>
-- Flip coordinates and output extended EPSG (16 | 1)-- SELECT ST_AsGML(3, ST_GeomFromText('POINT(5.234234233242 6.34534534534)',4326), 5, 17); st_asgml -------- <gml:Point srsName="urn:ogc:def:crs:EPSG::4326" ><gml:pos >6.34535 5.23423</gml:pos ></gml:Point>
-- Output the envelope (32) -- SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 32); st_asgml -------- <gml:Envelope srsName="EPSG:4326"> <gml:lowerCorner >1 2</gml:lowerCorner> <gml:upperCorner >10 20</gml:upperCorner> </gml:Envelope>
-- Output the envelope (32) , reverse (lat lon instead of lon lat) (16), long srs (1)= 32 | 16 | 1 = 49 -- SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 49); st_asgml -------- <gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"> <gml:lowerCorner >2 1</gml:lowerCorner> <gml:upperCorner >20 10</gml:upperCorner> </gml:Envelope>
-- Polyhedral Example -- SELECT ST_AsGML(3, ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')); st_asgml -------- <gml:PolyhedralSurface> <gml:polygonPatches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3" >0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> </gml:polygonPatches> </gml:PolyhedralSurface>
ST_AsKML — ジオメトリをKML要素として返します。
text ST_AsKML(
geometry geom, integer maxdecimaldigits=15, text nprefix=NULL)
;
text ST_AsKML(
geography geog, integer maxdecimaldigits=15, text nprefix=NULL)
;
ジオメトリをKeyhole Markup Language (KML)要素として返します。デフォルトの最大の小数点以下の桁数は15で、デフォルトの名前空間はプリフィクス無しです。
任意引数 |
PostGISがProj対応でコンパイルされている必要があります。PostGIS_Full_Versionを使ってProj対応でコンパイルされているか確認して下さい。 |
Availability: 1.2.2 - versionパラメータが付く形式は1.3.2からです。 |
Enhanced: 2.0.0 - プレフィクスの名前空間の追加、デフォルト値と名前付き引数の追加 |
Changed: 3.0.0 - "version"の付いた形式の削除 |
AsKML出力はSRIDを持たないジオメトリでは動作しません。 |
この関数は3次元に対応し、Z値を削除しません。
SELECT ST_AsKML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_askml -------- <Polygon ><outerBoundaryIs ><LinearRing ><coordinates >0,0 0,1 1,1 1,0 0,0</coordinates ></LinearRing ></outerBoundaryIs ></Polygon> --3d linestring SELECT ST_AsKML('SRID=4326;LINESTRING(1 2 3, 4 5 6)'); <LineString ><coordinates >1,2,3 4,5,6</coordinates ></LineString>
ST_AsLatLonText — 与えられたポイントの度・分・秒表現を返します。
text ST_AsLatLonText(
geometry pt, text format='')
;
ポイントの度・分・秒表現を返します。
緯度/経度座標系のポイントを前提としています。X(経度)とY(緯度)座標系は「正常な」範囲 (経度は-180から180、緯度は-90から90)に正常化されます。 |
text引数は結果文字列のための書式を含む書式文字列です。日付書式文字列に近いものです。妥当なトークンは"D"が度、"M"が分、"S"が秒、"C" (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)')); st_aslatlontext ---------------------------- 2°19'29.928"S 3°14'3.243"W
書式を指定 (デフォルトと同じ)。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"C')); st_aslatlontext ---------------------------- 2°19'29.928"S 3°14'3.243"W
D, M, S, C以外の文字は通過するだけです。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D degrees, M minutes, S seconds to the C')); st_aslatlontext -------------------------------------------------------------------------------------- 2 degrees, 19 minutes, 30 seconds to the S 3 degrees, 14 minutes, 3 seconds to the W
4方位文字でなく符号で示された度。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"')); st_aslatlontext ---------------------------- -2°19'29.928" -3°14'3.243"
十進の度。
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D.DDDD degrees C')); st_aslatlontext ----------------------------------- 2.3250 degrees S 3.2342 degrees W
過大な値が正常化されます。
SELECT (ST_AsLatLonText('POINT (-302.2342342 -792.32498)')); st_aslatlontext ------------------------------- 72°19'29.928"S 57°45'56.757"E
ST_AsMARC21 — ジオメトリを、地理データフィールド (034)を持つMARC21/XMLデータとして返します。
text ST_AsMARC21 (
geometry geom , text format='hdddmmss' )
;
この関数は与えられたジオメトリのバウンディングボックスを表現するコード化地図数値データを持つMARC21/XMLのデータを返します。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_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_AsText(ST_AsMVTGeom( ST_GeomFromText('POLYGON ((0 0, 10 0, 10 5, 0 -5, 0 0))'), ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false)); st_astext -------------------------------------------------------------------- MULTIPOLYGON(((5 4096,10 4091,10 4096,5 4096)),((5 4096,0 4101,0 4096,5 4096)))
クエリを実行してジオメトリをクリップするために計算されたタイル境界を使うウェブメルカトルのタイルの標準的な例です。
SELECT ST_AsMVTGeom( ST_Transform( geom, 3857 ), ST_TileEnvelope(12, 513, 412), extent = > 4096, buffer = > 64) AS geom FROM data WHERE geom && ST_TileEnvelope(12, 513, 412, margin = > (64.0 / 4096))
ST_AsMVT — 行集合のMVT表現を返す集約関数です。
bytea ST_AsMVT(
anyelement set row)
;
bytea ST_AsMVT(
anyelement row, text name)
;
bytea ST_AsMVT(
anyelement row, text name, integer extent)
;
bytea ST_AsMVT(
anyelement row, text name, integer extent, text geom_name)
;
bytea ST_AsMVT(
anyelement row, text name, integer extent, text geom_name, text feature_id_name)
;
タイルレイヤに対応する行集合をMapbox 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); st_assvg -------- M 0 0 L 0 -1 1 -1 1 0 Z
曲線ストリング
SELECT ST_AsSVG( ST_GeomFromText('CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)') ); st_assvg -------- M -2 0 A 2 2 0 0 1 2 0 A 2 2 0 0 1 2 -4
マルチ曲線
SELECT ST_AsSVG('MULTICURVE((5 5,3 5,3 3,0 3), CIRCULARSTRING(0 0,2 1,2 2))'::geometry, 0, 0); st_assvg ------------------------------------------------ M 5 -5 L 3 -5 3 -3 0 -3 M 0 0 A 2 2 0 0 0 2 -2
マルチサーフェス
SELECT ST_AsSVG('MULTISURFACE( CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0), (-1 0,0 0.5,1 0,0 1,-1 0)), ((7 8,10 10,6 14,4 11,7 8)))'::geometry, 0, 2); st_assvg --------------------------------------------------------- M -2 0 A 1 1 0 0 0 0 0 A 1 1 0 0 0 2 0 A 2 2 0 0 0 -2 0 Z M -1 0 L 0 -0.5 1 0 0 -1 -1 0 Z M 7 -8 L 10 -10 6 -14 4 -11 Z
ST_AsTWKB — TWKB (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); st_astwkb -------------------------------------------- \x02000202020808
識別子を含むTWKBオブジェクトの集計を生成するには、まず、"array_agg()"を使って求めるジオメトリとオブジェクトを集計して、その後に適切なTWKB関数を呼んでいます。
SELECT ST_AsTWKB(array_agg(geom), array_agg(gid)) FROM mytable; st_astwkb -------------------------------------------- \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'引数はビットフィールドです。PostGIS 2.2以上では、これは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)に対応しています。
SELECT '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <Scene> <Transform> <Shape> <Appearance> <Material emissiveColor=''0 0 1''/> </Appearance > ' || ST_AsX3D( ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')) || '</Shape> </Transform> </Scene> </X3D >' As x3ddoc; x3ddoc -------- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <Scene> <Transform> <Shape> <Appearance> <Material emissiveColor='0 0 1'/> </Appearance> <IndexedFaceSet coordIndex='0 1 2 3 -1 4 5 6 7 -1 8 9 10 11 -1 12 13 14 15 -1 16 17 18 19 -1 20 21 22 23'> <Coordinate point='0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1' /> </IndexedFaceSet> </Shape> </Transform> </Scene> </X3D>
このクエリの出力をx3d scene viewerにコピーして貼り付けて、Showをクリックします。
SELECT string_agg('<Shape >' || ST_AsX3D(ST_Extrude(geom, 0,0, i*0.5)) || '<Appearance> <Material diffuseColor="' || (0.01*i)::text || ' 0.8 0.2" specularColor="' || (0.05*i)::text || ' 0 0.5"/> </Appearance> </Shape >', '') FROM ST_Subdivide(ST_Letters('PostGIS'),20) WITH ORDINALITY AS f(geom,i);
SELECT ST_AsX3D( ST_Translate( ST_Force_3d( ST_Buffer(ST_Point(10,10),5, 'quad_segs=2')), 0,0, 3) ,6) As x3dfrag; x3dfrag -------- <IndexedFaceSet coordIndex="0 1 2 3 4 5 6 7"> <Coordinate point="15 10 3 13.535534 6.464466 3 10 5 3 6.464466 6.464466 3 5 10 3 6.464466 13.535534 3 10 15 3 13.535534 13.535534 3 " /> </IndexedFaceSet>
SELECT ST_AsX3D(ST_GeomFromEWKT('TIN ((( 0 0 0, 0 0 1, 0 1 0, 0 0 0 )), (( 0 0 0, 0 1 0, 1 1 0, 0 0 0 )) )')) As x3dfrag; x3dfrag -------- <IndexedTriangleSet index='0 1 2 3 4 5' ><Coordinate point='0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0'/></IndexedTriangleSet>
SELECT ST_AsX3D( ST_GeomFromEWKT('MULTILINESTRING((20 0 10,16 -12 10,0 -16 10,-12 -12 10,-20 0 10,-12 16 10,0 24 10,16 16 10,20 0 10), (12 0 10,8 8 10,0 12 10,-8 8 10,-8 0 10,-8 -4 10,0 -8 10,8 -4 10,12 0 10))') ) As x3dfrag; x3dfrag -------- <IndexedLineSet coordIndex='0 1 2 3 4 5 6 7 0 -1 8 9 10 11 12 13 14 15 8'> <Coordinate point='20 0 10 16 -12 10 0 -16 10 -12 -12 10 -20 0 10 -12 16 10 0 24 10 16 16 10 12 0 10 8 8 10 0 12 10 -8 8 10 -8 0 10 -8 -4 10 0 -8 10 8 -4 10 ' /> </IndexedLineSet>
ST_GeoHash — ジオメトリのGeoHash表現を返します。
text ST_GeoHash(
geometry geom, integer maxchars=full_precision_of_point)
;
ジオメトリのジオハッシュ表現を計算します。ジオハッシュは地理座標系のポイントを、前置に基づいた文字列として符号化したもので、ソート可能かつ検索可能です。短いジオハッシュではポイントは低精度に表現されています。これは、ポイントを含むボックスと考えることができます。
0でない範囲を持つ、ポイントでないジオメトリ値はジオハッシュコードに対応付けできます。コードの精度はジオメトリの地理範囲に依存します。
maxchars
が指定されていない場合には、返されるジオハッシュコードは、入力ジオメトリを含む最も小さいセルです。ポイントでは、20文字の精度 (入力の完全な倍精度浮動小数点数の保持十分です)ジオハッシュを返します。他のジオメトリタイプでは、より低い精度のジオハッシュを返しますが、精度はジオメトリの範囲に依存します。大きいジオメトリは低い精度となり、小さいジオメトリは高い精度になります。ジオハッシュコードで決まるボックスは常に入力入力地物を含んでいます。
maxchars
が指定された場合には、この値は、返されるジオハッシュコードの最大文字数になります。入力ジオメトリは(おそらく)より低い精度で表現されます。ポイントでない場合には、計算の最初のポイントはジオメトリのバウンダリボックスの中心となります。
Availability: 1.4.0
ST_GeoHashの入力ジオメトリは、地理座標系 (経度/緯度)でなければなりません。 |
このメソッドは曲線ストリングと曲線に対応しています。
SELECT ST_GeoHash( ST_Point(-126,48) ); st_geohash ---------------------- c0w3hf1s70w3hf1s70w3 SELECT ST_GeoHash( ST_Point(-126,48), 5); st_geohash ------------ c0w3h -- This line contains the point, so the GeoHash is a prefix of the point code SELECT ST_GeoHash('LINESTRING(-126 48, -126.1 48.1)'::geometry); st_geohash ------------ c0w3
TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。TRUE
を返します。&& — Aの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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_Point(1,1) && ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) AS overlaps; overlaps ---------- t (1 row)
&&(box2df,geometry) — 単精度浮動小数点数による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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_Point(1,1) AS overlaps; overlaps ---------- t (1 row)
&&(box2df,box2df) — 二つの単精度浮動小数点数による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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) && ST_MakeBox2D(ST_Point(1,1), ST_Point(3,3)) AS overlaps; overlaps ---------- t (1 row)
&&& — Aのn次元バウンディングボックスがBのn次元バウンディングボックスとインタセクトする場合にTRUE
を返します。
boolean &&&(
geometry A , geometry B )
;
&&&
演算子は、Aのn次元バウンディングボックスがBのn次元バウンディングボックスとインタセクトする場合にTRUE
を返します。
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
Availability: 2.0.0
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (TIN)に対応しています。
この関数は3次元に対応し、Z値を削除しません。
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3d, tbl1.column2 && tbl2.column2 AS overlaps_2d FROM ( VALUES (1, 'LINESTRING Z(0 0 1, 3 3 2)'::geometry), (2, 'LINESTRING Z(1 2 0, 0 5 -1)'::geometry)) AS tbl1, ( VALUES (3, 'LINESTRING Z(1 2 1, 4 6 1)'::geometry)) AS tbl2; column1 | column1 | overlaps_3d | overlaps_2d ---------+---------+-------------+------------- 1 | 3 | t | t 2 | 3 | f | t
SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3zm, tbl1.column2 && tbl2.column2 AS overlaps_2d FROM ( VALUES (1, 'LINESTRING M(0 0 1, 3 3 2)'::geometry), (2, 'LINESTRING M(1 2 0, 0 5 -1)'::geometry)) AS tbl1, ( VALUES (3, 'LINESTRING M(1 2 1, 4 6 1)'::geometry)) AS tbl2; column1 | column1 | overlaps_3zm | overlaps_2d ---------+---------+-------------+------------- 1 | 3 | t | t 2 | 3 | f | t
&&&(geometry,gidx) — ジオメトリの (キャッシュされている)n次元バウンディングボックスが単精度浮動小数点数によるn次元バウンディングボックス (GIDX)とインタセクトする場合にTRUE
を返します。
boolean &&&(
geometry A , gidx B )
;
&&&
演算子は、ジオメトリAのキャッシュされたn次元バウンディングボックスが、n次元バウンディングボックスBとインタセクトする場合に、TRUE
を返します。単精度浮動小数点数によるバウンディングボックスを使います。Bが倍精度浮動小数点数を使うbox3dである場合には、単精度浮動小数点数による3次元バウンディングボックス (GIDX)に変換されることになります。
この演算子は、ユーザが使うためというよりも内部でBRINインデックスに使うために導入されました。 |
Availability: 2.3.0 BRIN (Block Range INdexes)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
この関数は三角形と不規則三角網 (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 ST_AsText(column1) FROM ( VALUES ('LINESTRING(0 0, 1 1)'::geometry), ('LINESTRING(1 1, 0 0)'::geometry)) AS foo; st_astext --------------------- LINESTRING(0 0,1 1) LINESTRING(1 1,0 0) (2 rows) -- Note: the GROUP BY uses the "=" to compare for geometry equivalency. SELECT ST_AsText(column1) FROM ( VALUES ('LINESTRING(0 0, 1 1)'::geometry), ('LINESTRING(1 1, 0 0)'::geometry)) AS foo GROUP BY column1; st_astext --------------------- LINESTRING(0 0,1 1) LINESTRING(1 1,0 0) (2 rows) -- In versions prior to 2.0, this used to return true -- SELECT ST_GeomFromText('POINT(1707296.37 4820536.77)') = ST_GeomFromText('POINT(1707296.27 4820536.87)') As pt_intersect; --pt_intersect -- f
>> — Aのバウンダリボックスが、厳密にBのバウンダリボックスの右にある場合にTRUE
を返します。
boolean >>(
geometry A , geometry B )
;
>>
演算子は、Aのバウンダリボックスが、厳密にBのバウンダリボックスの右にある場合にTRUE
を返します。
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 > > tbl2.column2 AS right FROM ( VALUES (1, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (1 4, 1 7)'::geometry), (3, 'LINESTRING (6 1, 6 5)'::geometry), (4, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl2; column1 | column1 | right ---------+---------+------- 1 | 2 | t 1 | 3 | f 1 | 4 | f (3 rows)
@ — AのバウンダリボックスがBのバウンダリボックスに含まれている場合にTRUE
を返します。
boolean @(
geometry A , geometry B )
;
@
演算子は、AのバウンダリボックスがBのバウンダリボックスに、完全に含まれている場合にTRUE
を返します。
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
SELECT tbl1.column1, tbl2.column1, tbl1.column2 @ tbl2.column2 AS contained FROM ( VALUES (1, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl1, ( VALUES (2, 'LINESTRING (0 0, 4 4)'::geometry), (3, 'LINESTRING (2 2, 4 4)'::geometry), (4, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl2; column1 | column1 | contained ---------+---------+----------- 1 | 2 | t 1 | 3 | f 1 | 4 | t (3 rows)
@(geometry,box2df) — ジオメトリの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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_Buffer(ST_GeomFromText('POINT(2 2)'), 1) @ ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) AS is_contained; is_contained -------------- t (1 row)
@(box2df,geometry) — 単精度浮動小数点数による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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(2,2), ST_Point(3,3)) @ ST_Buffer(ST_GeomFromText('POINT(1 1)'), 10) AS is_contained; is_contained -------------- t (1 row)
@(box2df,box2df) — 二つの単精度浮動小数点数による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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(2,2), ST_Point(3,3)) @ ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) AS is_contained; is_contained -------------- t (1 row)
|&> — AのバウンディングボックスがBのバウンディングボックスをオーバラップするか、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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_Buffer(ST_GeomFromText('POINT(1 1)'), 10) ~ ST_MakeBox2D(ST_Point(0,0), ST_Point(2,2)) AS contains; contains ---------- t (1 row)
~(box2df,geometry) — 単精度浮動小数点数による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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) ~ ST_Buffer(ST_GeomFromText('POINT(2 2)'), 1) AS contains; contains ---------- t (1 row)
~(box2df,box2df) — 二つの単精度浮動小数点数による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)が導入されました。PostgreSQL 9.5以上が必要です。
このメソッドは曲線ストリングと曲線に対応しています。
この関数は多面体サーフェスに対応しています。
SELECT ST_MakeBox2D(ST_Point(0,0), ST_Point(5,5)) ~ ST_MakeBox2D(ST_Point(2,2), ST_Point(3,3)) AS contains; contains ---------- t (1 row)
~= — AのバウンディングボックスがBのバウンディングボックスと同じ場合に TRUE
を返します。
boolean ~=(
geometry A , geometry B )
;
~=
演算子はジオメトリ/ジオグラフィAのバウンディングボックスがジオメトリ/ジオグラフィBのバウンディングボックスと同じ場合にTRUE
を返します。
これのオペランドは、ジオメトリで使用できるインデックスを使用します。 |
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; equality | -----------------+ t |
<-> — AとBの2次元距離を返します。
double precision <->(
geometry A , geometry B )
;
double precision <->(
geography A , geography B )
;<