ベクターデーターモデル

このページでは,ベクターデータの処理に使用されるクラスについて説明します.多くのデータ タイプとメソッド名は OGC シンプル フィーチャ データ モデルに基づいているため, specifications published by OGC を確認すると役立つ場合があります.歴史的な理由から,GDAL ではベクターデータにのみ適用されるタイプと関数を示すために "OGR" プレフィックスを使用しています.

クラス概要

以下のクラスがベクターデータモデルの中核を形成します:

  • ジオメトリ (ogr_geometry.h): ジオメトリクラス (OGRGeometry, など) は OGC ベクターデータ型をカプセル化します. いくつかのジオメトリ操作と, 既知のバイナリおよびテキスト形式への変換を提供します. ジオメトリには空間参照系(投影)が含まれます.

  • 空間参照 (ogr_spatialref.h): OGRSpatialReference は投影と測地系の定義をカプセル化します.

  • 地物 (ogr_feature.h): OGRFeature は, 1 つのエンティティに関連するジオメトリと属性のセットをカプセル化します.

  • 地物クラス定義 (ogr_feature.h): OGRFeatureDefn クラスは, 関連する地物のスキーマ(フィールド定義のセット)をキャプチャします(通常は全レイヤー).

  • レイヤー (ogrsf_frmts.h): OGRLayer は, GDALDataset の地物レイヤーを表す抽象クラスです.

  • データセット (gdal_priv.h): GDALDataset は, 1 つ以上の OGRLayer オブジェクトを含むファイルまたはデータベースを表す抽象基底クラスです.

  • ドライバー (gdal_priv.h): GDALDriver は, 特定の形式のための変換プログラムを表し, GDALDataset オブジェクトを開いたり, 書き込んだりすることができます. 利用可能なすべてのドライバーは GDALDriverManager によって管理されます.

ジオメトリ

個々のジオメトリクラスは, 異なる種類のベクタージオメトリを表すために使用されます. すべてのジオメトリクラスは, すべてのジオメトリの共通機能を定義する OGRGeometry から派生しています. ジオメトリタイプには, OGRPoint, OGRLineString, OGRPolygon, OGRGeometryCollection, OGRMultiPoint, OGRMultiLineString, OGRMultiPolygon, OGRPolyhedralSurface が含まれます. 三角形ポリゴンの特殊な場合は OGRTriangle として表すことができ, その非重複コレクションは OGRTriangulatedSurface で表すことができます. 非線形ジオメトリを格納するために追加のタイプが使用されます: OGRCircularString, OGRCompoundCurve, OGRCurvePolygon, OGRMultiCurve, OGRMultiSurface です.

上記のいずれかのジオメトリクラスは, 2 (XY), 3 (XYZ または XYM), または 4 (XYZM) 次元で座標を格納することができます.

複数のジオメトリタイプで使用される機能を含む追加の中間クラスがあります. これらには, OGRCurve (OGRLineString の基本クラス) と OGRSurface (OGRPolygon の基本クラス) が含まれます. シンプルフィーチャ抽象モデルと SFCOM でモデル化されたいくつかの中間インタフェースは, この時点では OGR でモデル化されていません. ほとんどの場合, メソッドは他のクラスに集約されます.

OGRGeometry およびサブクラスの図

OGRGeometryFactory は, well known text (WKT) および well known binary(WKB) 形式のデータを適切な OGRGeometry サブクラスに変換するために使用されます. これらは, すべてのシンプルフィーチャジオメトリの種類を表すための事前定義の ASCII およびバイナリ形式です.

OGRGeometry には, そのジオメトリの空間参照系を定義する OGRSpatialReference オブジェクトへの参照が含まれています. これは, 通常, それを使用する各 OGRGeometry オブジェクトに対して参照カウントを持つ共有空間参照オブジェクトへの参照です.

理論的には, 既存の OGRGeometry クラスから他のまたはより具体的なジオメトリクラスを派生させることが可能ですが, これは十分に考慮されていない側面です. 特に, OGRGeometryFactory を変更せずに, 専用のクラスを作成することが可能です.

非線形ジオメトリとの互換性の問題

非線形ジオメトリを持つレイヤーのドライバーで非線形ジオメトリを持つ地物を作成または変更すると, そのジオメトリが最も近い一致する線形ジオメトリに変換されるように, 一般的なメカニズムが導入されました. この線形化は, ベクター関連オプション を使用して制御できます.

一方, OGR C API からデータを取得する場合, OGRSetNonLinearGeometriesEnabledFlag() 関数を使用して, 必要に応じてジオメトリとレイヤーのジオメトリタイプが線形近似に変換されるようにすることができます.

空間参照

OGRSpatialReference クラスは, OpenGIS 空間参照系定義を格納することを意図しています. 現在, ローカル, 地理的, 投影座標系がサポートされています. 垂直座標系, 地心座標系, および複合(水平 + 垂直)座標系も, 最近の GDAL バージョンでサポートされています.

空間座標系データモデルは, OpenGIS Well Known Text 形式から継承されています. これの単純な形式は, シンプルフィーチャ仕様で定義されています. より洗練された形式は, 座標変換仕様で見つかります. OGRSpatialReference は, 座標変換仕様の機能に基づいて構築されていますが, 以前のシンプルフィーチャ形式と互換性があるように意図されています.

異なる座標系間での変換に PROJ を使用するための OGRCoordinateTransformation クラスも関連付けられています.

地物 / 地物定義

OGRGeometry はベクター地物のジオメトリをキャプチャします. OGRFeature はジオメトリを含み, 地物属性, 地物 ID, および地物クラス識別子を追加します. スタイル情報も含むことができます. 複数のジオメトリを OGRFeature に関連付けることができます.

属性のセット (OGRFieldDefn), そのタイプ, 名前などは, OGRFeatureDefn クラスを介して表現されます. 通常, 1 つの OGRFeatureDefn は地物のレイヤーに存在します. 同じ定義は, そのタイプ(または地物クラス)の地物に対して参照カウントされた方法で共有されます.

地物の地物 ID (FID) は, その地物が所属するレイヤー内での地物の一意の識別子であることを意図しています. 独立した地物, またはまだレイヤーに書き込まれていない地物は, null (OGRNullFID) 地物 ID を持つことができます. 地物 ID は OGR で 64 ビット整数としてモデル化されていますが, これは一部の形式の自然な地物 ID をモデル化するには十分な表現力を持っていません. たとえば, GML 地物 ID は文字列です.

OGRFeatureDefn には, その地物クラスに許可されているジオメトリのタイプの指示子も含まれています (OGRFeatureDefn::GetGeomType() から OGRwkbGeometryType として返されます). これが OGRwkbGeometryType::wkbUnknown の場合, 任意のタイプのジオメトリが許可されます. これは, 与えられたレイヤーの地物が異なるジオメトリタイプである可能性があることを意味しますが, それらは常に共通の属性スキーマを共有します.

複数のジオメトリフィールド (OGRGeomFieldDefn) を OGRFeatureDefn に関連付けることができます. 各ジオメトリフィールドには, その許可されているジオメトリタイプの指示子があり, OGRGeomFieldDefn::GetType() によって返され, その空間参照系があり, OGRGeomFieldDefn::GetSpatialRef() によって返されます.

OGRFeatureDefn には, 地物クラス名 (通常はレイヤー名として使用される)も含まれています.

フィールド定義

地物クラスの各フィールドの動作は, 共有された OGRFieldDefn によって定義されます. OGRFieldDefn は, OGRFieldType の値からフィールドタイプを指定します. このフィールドに格納される値は, OGRFieldSubType に従ってさらに制限される場合があります. たとえば, フィールドは, OGRFieldType::OFTInteger タイプで, OGRFieldSubType::OFSTBoolean サブタイプを持つことがあります.

OGRFieldDefn は, フィールドが null に許可されているかどうか (OGRFieldDefn::IsNullable()), その値が一意である必要があるかどうか (OGRFieldDefn::IsUnique()), および小数桁数, 幅, および整列などのフォーマット情報を追跡することもできます. 手動で指定されていない場合, デフォルト値を定義することもできます.

フィールドドメイン

一部の形式は, 特定の属性フィールドに格納できる値を記述するフィールドドメインの使用をサポートしています. OGRFieldDefn は, GDALDataset に関連付けられた単一の OGRFieldDomain を参照することができます. GDALを使用するプログラムは, OGRFieldDomain を使用してユーザー入力を適切に制約することができます. GDAL は自体で検証を実行せず, フィールドに関連付けられた OGRFieldDomain を違反する値の格納を許可します.

OGRFieldDomain の利用可能なタイプには次のものがあります:

さらに, OGRFieldDomain は, 地物が分割または結合されたときに, ドメイン制御フィールドに割り当てるべき値を記述するポリシーを定義することができます.

レイヤー

OGRLayer は, データソース内の地物レイヤーを表します. OGRLayer 内のすべての地物は共通のスキーマを共有し, 同じ OGRFeatureDefn です. OGRLayer クラスには, データソースから地物を読み取るためのメソッドも含まれています. OGRLayer は, ディスク上のファイルやデータベースクエリの結果など, 下位のデータソースから地物を読み書きするためのゲートウェイと考えることができます.

OGRLayer には, 順次およびランダムな読み取りおよび書き込みのためのメソッドが含まれています. 読み取りアクセス (OGRLayer::GetNextFeature() メソッドを介して) は通常, 1 回に 1 つずつすべての地物を順次読み取ります; ただし, OGRLayer に空間フィルタを設定することで, 特定の地理的領域に交差する地物を返すように制限することができます (OGRLayer::SetSpatialFilter() メソッドを介して). 属性に対するフィルタは, OGRLayer::SetAttributeFilter() メソッドでのみ設定できます. デフォルトでは, すべての利用可能な属性とジオメトリが読み取られますが, これはフィールドを無視するようにフラグを立てることで制御できます (OGRLayer::SetIgnoredFields()).

GDAL 3.6 以降, GetNextFeature を介して地物を取得する代わりに, OGRLayer::GetArrowStream() メソッドを使用して, バッチで地物を取得し, 列指向のメモリレイアウトで取得することができます (cf Arrow C Streamデータインターフェースを使用してOGRから読み込む).

OGRLayer には, レイヤー内の地物で使用できるスタイルセットを提供する OGRStyleTable を格納することもできます. 地物スタイルの GDAL の処理に関する詳細は, 地物スタイル仕様 にあります.

現在の OGR アーキテクチャの欠点の 1 つは, 空間フィルタと属性フィルタが, データソース内の特定のレイヤーの唯一の代表であることを意図している OGRLayer に直接設定されていることです. これは, 各々に異なる空間フィルタが設定された複数の読み取り操作を同時にアクティブにすることができないことを意味します.

もう 1 つの疑問は, なぜ OGRLayerOGRFeatureDefn クラスが異なるのかということです. OGRLayer は常に OGRFeatureDefn との一対一の関係を持つため, なぜクラスを統合しないのでしょうか? その理由は 2 つあります:

  • 現在の定義では, OGRFeatureOGRFeatureDefnOGRLayer に依存していないため, データストア内の特定のレイヤーに関係なく, メモリ内で独立して存在することができます.

  • SF CORBA モデルには, SFCOM および SFSQL モデルのように, 単一の固定スキーマを持つレイヤーの概念がありません. 地物が現在の地物グループに直接関連していない可能性のある地物コレクションに属しているという事実は, OGR を使用して SFCORBA サポートを実装する際に重要かもしれません.

OGRLayer クラスは抽象基底クラスです. 実装は, 実装された各ファイル形式ドライバーに対してサブクラス化されることが期待されています. OGRLayer は通常, 直接 GDALDataset によって所有され, 直接インスタンス化または破棄されません.

データセット

GDALDataset は, OGRLayer オブジェクトのセットを表します. これは通常, 単一のファイル, ファイルセット, データベース, またはゲートウェイを表します. GDALDataset には, 所有している OGRLayer のリストがありますが, 参照を返すこともできます.

GDALDataset は抽象基底クラスです. 実装は, 実装された各ファイル形式ドライバーに対してサブクラス化されることが期待されています. GDALDataset オブジェクトは通常, 直接インスタンス化されるのではなく, GDALDriver の支援を受けてインスタンス化されます. GDALDataset を削除すると, 下位の永続データソースへのアクセスが閉じられますが, 通常, そのファイルが削除されることはありません.

GDALDataset には, データソースを GDALDriver で再オープンするために使用できる名前 (通常はファイル名またはデータベース接続文字列) があります.

GDALDataset には, 通常 SQL の形式のデータソース固有のコマンドを実行するサポートもあります. これは, GDALDataset::ExecuteSQL() メソッドを介して実行されます. 一部のデータソース (PostGIS や Oracle など) は SQL を下位のデータベースに渡しますが, OGR は任意のデータソースに対して SQL SELECT 文のサブセットを評価するサポートも提供しています (OGR SQL方言とSQLITE SQL方言 を参照).

一部のドライバを使用する場合, GDALDataset は, 下位のデータストアとやり取りするときにトランザクションを開始, コミット, ロールバックするメカニズムも提供しています.

GDALDataset は, レイヤー間の関係 (たとえば, データベーステーブル間の外部キー関係) についても認識することができます. これらの関係に関する情報は, GDALRelationshp に格納されます.

注釈

以前のバージョンの GDAL では, ベクターデータセットを OGRDataSource クラスを使用して表現していました. このクラスは後方互換性のために維持されていますが, ベクターデータに対しては GDALDataset と機能的に同等です.

ドライバー

サポートされている各ファイル形式に対して GDALDriver オブジェクトがインスタンス化されます. 通常, 新しいデータセットを開くために使用されるシングルトンクラスである GDALDriverManagerGDALDriver オブジェクトが登録されます.

新しい GDALDriver オブジェクトが, サポートされる各ファイル形式に対して Identify(), Open() などの操作のための関数ポインタを定義し, インスタンス化されることが意図されています (GDALDataset および OGRLayer クラスを含むファイル形式固有のクラスとともに).

アプリケーションの起動時には, 各所望のファイル形式に対して登録関数が通常呼び出されます. これらの関数は適切な GDALDriver オブジェクトをインスタンス化し, それらを GDALDriverManager に登録します. データセットを開くときには, ドライバーマネージャは通常, 1 つずつ各 GDALDataset を試し, 成功するまで続け, GDALDataset オブジェクトを返します.