Spatialite / Rasterlite 小技集(整備編)

Spatialite / Rasterliteデータ整備に関する小技集です。

このページは現在作成途中です。使用しているバージョンはv3.0beta、GUIは1.5です。

筆者は自前コンパイル版を使用していますが、Epsilon周り以外には手を入れていないのでバイナリ版と大差はないと思います。
GUIもwxのコンパイルからスタートしているので安定して動作するかどうか不安でしたが、なかなかどうして安定しています。
クリティカルな業務で使用するのでなければv3.0betaはなかなかいいです。


マスタテーブルを参照するには

テーブル一覧のどこにも見当たりませんが、sqliteデータベースにはもれなくsqlite_masterという名前のテーブルが存在します。
このテーブルにはテーブル、ビュー、トリガ、インデックスなどの作成内容が記されています。

特に、トリガ、インデックスの作成内容は後で確認することもあろうかと思われるので便利です。

マスタテーブルとはいえ普通のテーブルなので、SELECTで参照できます。
書き換えとかはできるかどうかわかりませんが、おススメはできません。


空間インデックスを作成するには

通常のインデックスは列の値に対するバイナリツリーとして作成されるのだそうです。細かいことは他のサイトに詳しく載っています。
通常のインデックスを作成するには、Spatialite-guiからの場合はテーブルを右クリックして、[Maintenance]-[Create New Index]を選択します。

Create new index

選択すると、SQL入力画面に以下のようにSQLテンプレートが表示されます。

Create new index template

インデックスの名称と、対象とする列、およびUNIQUEを入れる入れないの選択を入力して実行するとインデックスが作成されます。

インデックスは表示されませんが、内容はマスターテーブルに記載されています。
列ごとに複数作成することもできるそうです。

空間インデックスはこれとは異なるものです。
空間インデックスにはいろいろな種類がありますが、spatialiteのそれはRTree(Rectangle Tree)だそうです。
(R-Tree、R+Tree、R*Treeなどがあるそうですが、そのうちのどれかはわかりません。R*Treeか?)。
空間インデックスを作成する場合は、テーブルを展開してGeometryカラムを右クリックし、[Build Spatial Index]を選択します。

Create new spatial index

空間インデックスを作成すると、「idx_“テーブル名”_all_Geometry」、「idx_“テーブル名”_all_Geometry_node」、「idx_“テーブル名”_all_Geometry_parent」、「idx_“テーブル名”_all_Geometry_rowid」という4つのテーブルが作成されます。
これらのテーブルはSpatialite-gui-1.5.0betaであれば左側のツリーの”Spatial Index”の中にあることが確認できます。

空間インデックス作成結果

改めていうまでもありませんが、インデックスを作成すると検索は早くなりますが追加、更新では負担が増すので、よく見極めた上で作成しましょう。
やはりいらんなと思ったら、Geomeryカラムを右クリックして[Remove Spatial Index]を選択します。

空間インデックス削除

なお、コマンドラインから行う場合は、作成はselect CreateSpatialIndex("テーブル名", "Geometryカラム名")
削除はselect DisableSpatialIndex("テーブル名", "Geometryカラム名")を実行後、インデックス4点セットのテーブルを削除します。

空間インデックスを利用する場合はSQL文を工夫して上記のインデックステーブルをうまく利用する必要があります。


MBRキャッシュを利用するには

Master Boot Recordと思ったのは私だけではないはず。

MBR(Minimum Bounding Rectangle)キャッシュとは、各要素の外接矩形を記録したテーブルをメモリ上に展開しておくことで高速検索を実現させようとするものです。
インデックスと同様の効果がありますが、インデックスではSQL文に特段工夫をする必要は無いのに対し、(うそでした!)MBRキャッシュを活用する場合もSQL文を工夫する必要があります。

MBRキャッシュを構築するには、Geometryカラムを右クリックして[Build MBR cache]を選択します。

Create MBR cache

コマンドラインから作成する場合はselect CreateMbrCache("テーブル名", "Geometryカラム名")とします。

なお、空間インデックスとMBRキャッシュは共存できません。

作成すると、「cache_”テーブル名“_”Geometryカラム名“」という仮想テーブルが作成されます。
このテーブルは要素ID(rowid)とMBR(mbr)という列を持っています。
空間検索のときにこのテーブルに対して条件を設定することで対象を絞り込むことができます。

MBRキャッシュはメモリ上に展開されるので、要素数がベラボーに多いときは避けたほうがよさそうです。
また、メモリ上に展開されるタイミングはデータベースに接続するときなので、接続/切断が頻繁に起こるような場合はやめたほうがよいそうです。


Geometry Columnを再設定するには

たとえば、クエリの結果をテーブルに保存したりした場合、クエリの結果にGeometryカラムが含まれていてもそのままではGeometryカラムとして認定されていません。
このままではただのブロブなので、Geometryカラムを設定する必要があります。

Spatialite-guiから行うには、Geometryカラムを右クリックして[Recover geometry column]を選択します。

Recover geometry column

選択すると以下のようなダイアログが表示されます。

Recover geometry columnダイアログ

SRID、次元、Geometry種別を選択して【OK】ボタンを押すと、Geometryカラムとして設定されます。
正しく設定しないと作成してくれません。

このとき、抽出元のGeometry情報を参照したい場合は、Geometryカラムを右クリックして[Show Spatial Metadata]または[Check geometries]を選択します。

なお、コマンドラインからGeometryカラムの再設定を行うには、select RecoverGeometryColumn("テーブル名", "カラム名", "SRID", "種別", "次元数")
とします。


画像ピラミッドを作成するには

こちらに構築方法が丁寧に記載されています。
rasterlite_toolコマンドで画像を切り出したりする場合はピラミッド画像の作成は必須で、無いと怒られます。

ピラミッド画像は、指定したテーブルの末尾に追加されます。イメージタイプ(-iオプション)を指定しない場合フォーマットはPNGになります。
また、raster_pyramidsというテーブルが作成され、ピラミッド画像の情報が書き込まれます。

経緯度ラスタを扱うときの注意

ピラミッド画像はもとの画像ごとに作成されます。
このとき、全画像データの解像度を調べて、解像度の最小値を求め、それよりも大きな解像度を持つタイルはピラミッド画像であると判断されて削除されます。
経緯度ラスタの場合、緯度によってわずかに解像度が変化することがありますが、
これらをひとつのテーブルに放り込んだ状態では最小解像度のもの意外が削除されてしまいます。

これを回避するには、ピラミッド作成の前にあらかじめ解像度をそろえておく必要があります。
苦肉の策ではありますが、以下のクエリを実行しておくと一応ピラミッドが作成されます。

update "テーブル名"_metadata set
pixel_x_size = (select avg(pixel_x_size) from "テーブル名"_metadata),
pixel_y_size = (select avg(pixel_y_size) from "テーブル名"_metadata);

ネットワークを構築するには

Spatialite-networkのドキュメントに方法が載っています。

条件が整ったデータが準備できていれば、ツールボタンの【Build network】ボタンを押して、表示されるダイアログで必要な情報を入力すれば完了です。
コマンドラインでは、spatialite_networkコマンドを利用します。

ネットワークが構築されると、“テーブル名”_net、“テーブル名”_net_dataという2つのテーブルが作成されます。

が、、、

そもそも条件が整ったデータを準備するのが至難です。
その条件とは、

    • 交差点はその点に接続する全ての連続線分の端点でなければならない
    • 始点ノード、終点ノードのIDを持つフィールドが必要
    • そのノードIDとは端点または交差点に割り振られているユニーク番号、点に実体はなくてもよい様子(別途端点テーブルとかは要らない様子)

GRASSを通せば連結関係の条件は整えられるかもしれませんが、ノードIDはどうしようもありません。
それにGRASSにデータを取り込んだのならネットワーク解析もGRASS上で行った方がよかろうというものです。


CSV/TXT、DBF、Excelデータを読み込むには

これらのファイルをテーブルとして、またはリンクとして読み込んで、図形データと結合という定番の流れがあるかと思います。

Spatialite-guiではツールボタンにそれぞれのファイルを読み込む、またはリンクするボタンがあります。
Excelファイルはspatialite v3.0からサポートされます。

Load CSV, DBF, Excelボタン

CSV/TXTの場合は先頭行は列名になっている必要があります。
テキストの場合はいろいろと設定が大変で、ボタンを押すと以下のようなダイアログが表示されます。

Load CSV/TXTダイアログ

一方DBFの場合はテーブル名と文字コード、XLSの場合はテーブル名とインポートするワークシートを指定するだけです。
XLSの場合は先頭行を列名にするかどうかを選択できます。先頭行を列名にしない場合は、列名はcol_0, col_1, …となります。

コマンドラインからの場合もCSV/TXTは大変で、どうもあらかじめテーブルを作成しておく必要があるようです。
DBF、XLSの場合はそれぞれ.loaddbf ファイル名 テーブル名 文字コード
.loadxl ファイル名 テーブル名 (ワークシート番号 先頭行を列名にするかどうかとすれば読み込めます。

コマンドラインから仮想テーブルの作成を行い場合はcreate virtual table句を使います。

DBFの場合
> create virtual table テーブル名 using virtualdbf('ファイルパス', '文字コード' )

XLSの場合
> create virtual table テーブル名 using virtualxl('ファイルパス', 'ワークシート番号(0start)', '1なら先頭行を列名')
アーカイブ