4. MapServerアプリケーションへのOGRサポートの組み込み

MapserverアプリケーションへのOGRサポートの組み込みに必要な唯一の変更はマップファイルに対して出ある。 LayerのDATAパラメータが3つのパラメータへと拡張される(CONNECTIONTYPE OGR、CONNECTION、DATA)。

文法は用いられるデータの種類によって異なる。 OGRでは、データソースは共通のベースネームをもつファイルの組(ArcViewのシェイプファイルであれば.shp/.shx/.dbfであり、MapinfoのTABであれば.tab/.map/.dat/.ind/.idである)もしくはあるディレクトリ丸ごとのファイル群(TIGERなど)である。

これらの前者を"ファイルベースのデータソース"、"ディレクトリベースのデータソース"と呼ぼう。ファイルベースのデータソースへアクセスするためには、セットとなるファイルのうちの一つ(roads.shpとかroads.tabなどのように)を指定する。ディレクトリベースのデータソースへアクセスするためには、ディレクトリ名を指定し、するとOGRはディレクトリ内の全てのファイルをいくつかのレイヤを持つかもしれない(TIGERデータなど)一つのデータソースとして読み込む。

いくつかのOGRドライバ(SHP、TABなど)は2つの動作を有している。もし一つのファイルを指定した場合、ファイルベースのデータソースとして振るまい、もしディレクトリが指定された場合にはディレクトリベースのデータソースとして振る舞うのでディレクトリにあるファイル全てがデータソースの新しいレイヤを構成する。

利用しようとしているある特定のフォーマットについての詳細は、OGRのドキュメントを参照のこと: http://ogr.maptools.org/ogr_formats.html

4.1 マップファイルでのOGRデータソースの利用

マップファイルでのファイルベースのデータソースによるレイヤの定義は以下の通り:

LAYER
   ...
   CONNECTIONTYPE OGR
   CONNECTION "<datasource_name>"
         DATA "<layer_definition>"
   ...
END

<datasource_name>は読み込むデータソースの名称であり、CONNECTIONキーワードがプレフィクスとして置かれる。正確な仕組みは用いられるドライバ次第である。用いられるドライバはデータソースとして渡した文字列であったり参照されるファイルのフォーマットを元にしてOGRにより自動的に選択される。

  • ファイルベースのデータソースでは、これは拡張子を含み、絶対パスもしくは相対パスを用いたファイル名である。相対パスは最初にSHAPEPATHに関連付けて解釈され、もし見つからない場合には、マップファイルの位置に対して関連づけられる(4.1以前ではSHAPEPATHはOGRのデータソースに対しては無視されることに注意)
  • TIGER/LineやArc/Info バイナリカバレッジのような、ディレクトリベースのデータソースでは、これはファイルを含んでいるディレクトリの名称である。パスが相対的なものであればマップファイルの位置に関連付けて解釈される。
  • データベースやOGDIのような仮想的なデータソースでは、これはファイルシステムとは何の関連もないサービスへの接続文字列である。例えばOracle Spatialではこれは"OCI:warmerda/ac.tecolev.008ladg|drowssaP#ac.tecolev.008ladg|drowssaP"のようになる。

<layer_definition>は、データソースから使用するレイヤ名、レイヤ番号、レイヤ定義のSQLのいずれかである。これはマップファイルでDATAキーワードにより示される。

  • レイヤ名: (大文字小文字を区別しない)レイヤ名がレイヤの選択に用いられる。
  • レイヤ番号: レイヤ番号(最初のレイヤを0として始まる)がレイヤの選択に用いられる。一般により説明的であるためレイヤ名がこちらより好まれる。
  • 省略された: DATAキーワードがない場合、レイヤ0が選択されたのと同じである。
  • SQLのSELECT句: SQLのSELECT句が用いられる場合、ドライバ特有の文法として解釈され、一時的な疑似レイヤのが生成される。いくつかのフォーマットでは制限のあるSQLのサブセットとしてOGR内部で解釈される。RDBMSベースのドライバ(PostGISやOracleなど)ではデータベースへとそのまま渡される。

OGRINFOプログラムがデータソースにあるレイヤのリストとその名称を取得するのに利用できる。

4.2 OGRを用いたレイヤ定義の例

例1. MapInfo TABファイル

LAYER
   NAME "Builtup_Areas_tab"
   TYPE POLYGON
   CONNECTIONTYPE OGR
   CONNECTION "data/tab/092b06_builtup_a.tab"
   STATUS ON
   CLASS
     ...
   END
...
END

例2. <レイヤ番号>を用いたMicrostation DGN
OGRでは全てのDGNファイルが一つのレイヤとして扱われる(http://ogr.maptools.org/drv_dgn.htmlを参照):

LAYER
   NAME "dgn"
   TYPE LINE
   CONNECTIONTYPE OGR
   CONNECTION "dgn/santabarbara02.dgn"
   DATA "0"
   STATUS ON
   STYLEITEM "AUTO"
   CLASS
   END
END # Layer

例3. <レイヤ名>を使用したTIGER/Line

LAYER
   NAME "Roads_tig"
   TYPE line
   CONNECTIONTYPE OGR
   CONNECTION "full/path/to/tiger/TGR25001"
   DATA "CompleteChain"
   STATUS ON
   CLASS
     ...
   END
END

例4. SQLのJOIN句を使用したシェイプファイルのあるディレクトリ

LAYER
   NAME "Parks_cov"
   TYPE POLYGON
   CONNECTIONTYPE OGR
   CONNECTION "data/shppoly"
   DATA "SELECT eas_id, idlink.Name FROM poly LEFT JOIN idlink ON poly.eas_id = idlink.eas_id"
   STATUS ON
   CLASSITEM "idlink.Name"
   CLASS
     ...
   END
END

4.3 "OGRINFO"の使いかた

OGRINFOはGDAL/OGR配布物の一部である。これはOGRがファイルにおいてレイヤの情報を取得するために用いられる実行ファイルである。(FWTools 或いはMS4Wから入手できる))パラメータは:

ogrinfo [-ro] [-q] datasource_name [layer [layer...]]
  • -ro はファイルを読み込み専用で開く(オプション)
  • -q は沈黙モードで実行され、レイヤインデックスの行のみが返される(オプション)
  • datasource_nameは拡張子を含むファイル名である(roads.tabなど); TIGER/Lineファイルではdatasource_nameはTIGERファイルを含むディレクトリ名である(ogrinfo TGR25001のように)
4.3.1 "OGRINFO"の使用例

例5. ファイルにあるレイヤ一覧の取得:

$ ogrinfo  popplace.tab

Had to open data source read-only.
INFO: Open of `popplace.tab'
using driver `MapInfo File' successful.
1: popplace (Point)

popplace.tabファイルに一つのポイントレイヤがあることを示している。

例6. 特定のレイヤについての、フィールド名や投影法などを含むダンプを取得する:

$ ogrinfo popplace.tab popplace

Had to open data source read-only.
INFO: Open of `popplace.tab'
using driver `MapInfo File' successful.

Layer name: popplace
Geometry: Point
Feature Count: 497
Layer SRS WKT: PROJCS["unnamed",GEOGCS["unnamed",DATUM["North ...snipped...
AREA: Real (15.3)
PERIMETER: Real (15.3)
POPPLACE_: Real (11.0)
POPPLACE_I: Real (15.0)
NAME: String (50.0)
OGRFeature(popplace):1
  AREA (Real) =           0.000
  PERIMETER (Real) =           0.000
  POPPLACE_ (Real) =           1
  POPPLACE_I (Real) =               1
  NAME (String) = Port Hope Simpson
  POINT (2437287.249 1153656.751)

OGRFeature(popplace):2
  AREA (Real) =           0.000
  PERIMETER (Real) =           0.000
  POPPLACE_ (Real) =           2
  POPPLACE_I (Real) =               1
  NAME (String) = Hopedale

...
...

例7. TIGER/Lineディレクトリのレイヤ一覧を取得する:

$ ogrinfo TGR25001

Had to open data source read-only.
INFO: Open of `TGR25001'
using driver `TIGER' successful.
1: CompleteChain (Line String)
2: AltName (None)
3: FeatureIds (None)
4: ZipCodes (None)
5: Landmarks (Point)
6: AreaLandmarks (None)
7: KeyFeatures (None)
8: Polygon (None)
9: EntityNames (Point)
10: IDHistory (None)
11: PolyChainLink (None)
12: PIP (Point)
13: TLIDRange (None)
14: ZipPlus4 (None)

上の例ではTGR25001ディレクトリに14のレイヤがあることを示している。

例8. 特定のTIGERレイヤの、フィールド名や投影法、エクステントなどを含むダンプを取得する:

$ ogrinfo TGR25001 Landmarks -summary

Had to open data source read-only.
INFO: Open of `TGR25001'
using driver `TIGER' successful.

Layer name: Landmarks
Geometry: Point
Feature Count: 777
Extent: (-70.674324, 41.519817) - (-69.969211, 42.046868)
Layer SRS WKT: GEOGCS["NAD83",DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.257222101]],PRIMEM["Greenwich",0],
      UNIT["degree",0.0174532925199433]]
MODULE: String (8.0)
FILE: String (5.0)
STATE: Integer (2.0)
COUNTY: Integer (3.0)
LAND: Integer (10.0)
SOURCE: String (1.0)
CFCC: String (3.0)
LANAME: String (30.0)

4.4 OGRフォーマットへのクエリ

OGRレイヤは通常のシェイプファイルと同様にクエリを受け付ける。

4.5 OGRでのTILEINDEX

OGRレイヤはシェイプファイルベースのレイヤ同様にタイルインデックスとして利用できる。 TILEINDEXキーワードはタイルインデックスファイルへの接続文字列を含んでいなければならない。タイルインデックスファイルはシェイプファイルを含むOGRでサポートされているフォーマットであればよい。

レイヤ定義でのTILEITEMキーワードはタイルインデックスファイルからどのフィールドがデータソースとして用いられるかを示している。省略された場合には、デフォルトのTILEITEMは"location"である。 "location"フィールドの値はOGRレイヤのCONNECTIONフィールドで用いられたものと同じ接続文字列でなければならない。 OGRの接続タイプを使用し、TILEINDEXキーワードのあるレイヤにおいては、CONNECTIONキーワードは必要ない(もしくは無視される)。

タイルインデックスファイルは外部のGISシステムやOGRのユーティリティogrtindexを用いて準備する。詳細についてはOGRのユーティリティページhttp://ogr.maptools.org/ogr_utilities.htmlを参照のこと。

以下はタイルインデックスを使用したポイントレイヤの例である。

LAYER
  NAME "ogr_points"
  TYPE POINT
  CONNECTIONTYPE OGR
  TILEINDEX "PIP_ogr_tiles.shp,0"
  STATUS ON
  CLASS
     SYMBOL "default-circle"
     COLOR 255 0 0
     SIZE 6
  END
END

OGRのタイルインデックスレイヤは全ての通常のクエリと属性取得の機構をMapscriptからのものも含めてサポートしている: しかしながら、2002年4月の時点ではあまりテストがなされていない。 MapserverのBguzillaを使用して報告してください。もし自動投影法サポートがOGRのタイルインデックスレイヤに用いられた場合、タイルインデックスは(そのタイルのものではなく)その投影法で読み込まれる。タイルの構成要素が異なるスキーマ(異なる属性のセット)を持つ場合に、問題と遭遇するかもしれない(しないかもしれない)。

4.6 コネクションプーリング

いくつかのOGRがサポートしているフォーマットについては、データセットへの接続がCPUの使用やディスクIOの量といった点で極めて高価な処理となる。例えばS-57フォーマットへのアクセスの確立は、データファイルをメモリ上へと完全に読み込むことになる。コネクションプーリングは同じファイルが異なるレイヤとして用いられる場合においてこのオーバーヘッドを減少させることを目的としている。

OGRがサポートしているデータセットがマップレンダラによって(各レイヤが個別にデータセットを参照する代わりに)一度だけ開かれることを保証するためには、CLOSE_CONNECTION PROCESSINGオプションを使用する。 CLOSE_CONNECTIONのデフォルト値はNORMALであるが、データセットが地図のレンダリング完了まで開かれているようにするにはDEFERに設定する。これは同じデータソースを使用する他のレイヤで再利用をするようにする。

例9. 2つのレイヤでのS-57データの維持
この例では、同じデータセット(NO410810.000)を2つのレイヤで使用している。データセットの再読み込みを避けるため、最初のレイヤに接続を閉じるのを延ばすように設定している。 2つめ(もしくは最後の)レイヤでは、NORMALな接続操作を要求している(デフォルト値であるのでこれは詳釈可能ではあるが)。

LAYER
   NAME "AdminAreas"
   TYPE POLYGON
   CONNECTIONTYPE OGR
   CONNECTION "NO410810.000"
   DATA "ADMARE"
   PROCESSING "CLOSE_CONNECTION=DEFER"
   STATUS ON
   ...
END
LAYER
   NAME "Land Areas"
   TYPE POLYGON
   CONNECTIONTYPE OGR
   CONNECTION "NO410810.000"
   DATA "LNDARE"
   PROCESSING "CLOSE_CONNECTION=NORMAL"
   STATUS ON
   ...
END
  1. CONNECTIONキーワードのテキストは接続を再利用するレイヤ間で正確に一致しなければならない。
  2. いくつかのデータセット接続は大量のメモリを消費するので、それらを開きつづけることはメモリの消費量を増大させる。
  3. ある特定の接続を閉じるのが先延ばしにされたまま全てのレイヤがレンダリングされた場合、Mapserverが終了するまでそれは開かれたままとなる。
  4. このCLOSE_CONNECTION操作の利用はOGRのレイヤ独自のものであるが、将来のある時点でMapserverでのより広範なコネクションプーリングの実装として変更されるかもしれない。
Add a New Comment
ogc
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License