Spatialite / Rasterliteデータ操作に関する小技集です。
このページは現在作成途中です。使用しているバージョンはv3.0beta、GUIは1.5です。
クエリビルダを使う
SQLはそれぞれ方言があって、たとえばPostgreSQLでは使えたSQLがSqliteでは使えないということがよくあります。
これがPostGISとSpatialiteではさらに違いが大きくなります。
こんなとき、Spatialite_guiのクエリビルダが便利です。
クエリビルダを起動するには以下のツールボタンを押します。
起動すると以下のようなダイアログが表示されます。
“SQL statement”ペインには出来上がったSQL文が表示されます。
画面下には4つタブがあり、それぞれ”Main”、”Filter”、”Order”、”View”となっています。
“Main”タブではテーブルの選択と結合を操作することができます。
“Filter”タブは’where’句以下の条件を3つ指定することができます。
“Order”タブは’order by’句以下を3つ指定することができます。
“View”タブでは’create view’でビューを作成します。
“SQL statement”ペインは編集することはできませんがテキストを選択することはできます。
条件が足らないなどといった場合は、とりあえずSQLを作ってテキストエディタにコピー/ペーストして、
できたSQLを参考に条件を追加したりすると良いでしょう。
コマンドラインからSQLを実行するには
コマンドラインからSQLを実行するときの引数は以下のとおりです。
> spatialite ["オプション"] "データベースファイル名" "SQL文"
例として、db.sqliteにあるテーブルelements内の全要素の長さを出力するSQLを実行するには以下のようにします。
GEOMETRYカラム名は「GEOMETRY」であるとします。
> spatialite db.sqlite "select GLength(GEOMETRY) from elements;"
オプションを指定することでいろいろな形式に出力することができます。
出力結果には先頭に必ずバージョン情報が付加されてしまいますが、これを出力しないようにする方法が見当たりません。
テーブルを結合するには
上記のクエリビルダで作成してみるとわかりますが、テーブルを結合して新規テーブルに保存するSQLは以下のようになります。
create table "新規テーブル名" as SELECT * FROM "テーブル1" JOIN "テーブル2" USING ( "結合で利用するキーフィールドを列挙" )
結合キーとするフィールドがたくさんある場合でもそれらを列挙するだけでいいので大変楽です。
クエリビルダでは結合キーとするフィールドを3つまでしか指定することができません。
要素種別に仕分けるには
一般に、DGNやDXF等のCADフォーマットファイルは一つのファイルに異なる種類の要素を持つことができます。
一方、Shapeファイルの場合は要素種別ごとにファイルセットを分ける必要があります。
したがって、CADフォーマットのファイルをShapeファイルに変換する場合は要素種別ごとに仕分けてから変換する必要があります。
でないと、たとえばogr2ogrコマンドでCADデータをShapeファイルに変換すると先頭要素の種類のShapeファイルしか作られません。
Spatialiteも一つのテーブルに異なる種別の要素を持つことができます。
とりあえず、ogr2ogrコマンドでSpatialiteに変換すると全ての要素を1テーブルに格納することができるので、
クエリで要素種別ごとに取り出してテーブルを作成すると良いでしょう。
含まれる要素種別を調べる
select distinct( GeometryType(GEOMETRY) ) from elements;
特定の要素種別のレコードを取り出す
select * from elements where GeometryType(GEOMETRY) = "MULTILINESTRING Z";
赤文字のところは取り出したい要素種別を指定します。
DGNファイルの場合、点要素は長さ0の線分要素として記録されているので、点要素を取り出したい場合は以下のようにします。
select * from elements where GLength(GEOMETRY) = 0;
逆に、点要素以外の線分要素を取り出したい場合は以下のようにします。
select * from elements where GeometryType(GEOMETRY) = "LINESTRING Z" and GLength(GEOMETRY) > 0;