ベクターデーターモデル
このページでは,ベクターデータの処理に使用されるクラスについて説明します.多くのデータ タイプとメソッド名は 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 でモデル化されていません. ほとんどの場合, メソッドは他のクラスに集約されます.
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
の利用可能なタイプには次のものがあります:
OGRCodedFieldDomain
, 指定された列挙に存在する値を制約しますOGRRangeFieldDomain
, 指定された範囲の値を制約しますOGRGlobFieldDomain
, 指定されたパターンに一致する値を制約します
さらに, 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 つの疑問は, なぜ OGRLayer
と OGRFeatureDefn
クラスが異なるのかということです. OGRLayer
は常に OGRFeatureDefn
との一対一の関係を持つため, なぜクラスを統合しないのでしょうか? その理由は 2 つあります:
現在の定義では,
OGRFeature
とOGRFeatureDefn
はOGRLayer
に依存していないため, データストア内の特定のレイヤーに関係なく, メモリ内で独立して存在することができます.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
オブジェクトがインスタンス化されます. 通常, 新しいデータセットを開くために使用されるシングルトンクラスである GDALDriverManager
に GDALDriver
オブジェクトが登録されます.
新しい GDALDriver
オブジェクトが, サポートされる各ファイル形式に対して Identify(), Open() などの操作のための関数ポインタを定義し, インスタンス化されることが意図されています (GDALDataset
および OGRLayer
クラスを含むファイル形式固有のクラスとともに).
アプリケーションの起動時には, 各所望のファイル形式に対して登録関数が通常呼び出されます. これらの関数は適切な GDALDriver
オブジェクトをインスタンス化し, それらを GDALDriverManager
に登録します. データセットを開くときには, ドライバーマネージャは通常, 1 つずつ各 GDALDataset
を試し, 成功するまで続け, GDALDataset
オブジェクトを返します.