Spatialite / Rasterlite 小技集(作成編)

Spatialite / Rasterliteデータ作成、読み込みに関する小技集です。

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

GUIに頼るのを良しとしない向きもあるかもしれませんが、ことSpatialiteに関してはGUIで操作するのが一番楽です。
rasterliteのメニュー/ツールバーもあるといいんですけどね、、、。


空のデータベースを作成するには

メタデータテーブル3点セット(geom_cols_ref_sys、geometry_columns、spatial_ref_sys)を含んだ空のデータベースファイルを作成するにはいくつか方法があります。
spatialite-guiを使うなら、下図のツールボタンもしくは[Creating a New (empty) SQLite DB]メニューを選択します。

新規作成ボタン

コンソールから作成するには、まず新しく作成するデータベース名を引数にしてSpatialiteコンソールを起動し、

spatialite> .read init_spatialite.sql

と入力します。
init_spatialite.sqlは、Spatialiteのダウンロードサイトから入手することができます。
パスで指定する場合、Spatialiteコンソール内ではパス区切り文字が”の場合は取り除かれてしまうので、’/’で代用します。
Windows環境では注意です。

または、spatialite_toolを使って、以下のようにコマンドを実行します。

> spatialite_tool -x -sql init_spatialite.sql -d "新規作成データベースファイル名" -c "文字コード(ASCII等)"

データを変換してデータベースを作成するには

データベースに放り込みたいデータがすでに決まっている場合は、それをSpatialite形式に変換する形でデータベース作成したほうが早いでしょう。
この場合、変換元がShapeファイルならspatialite_toolを使う方法、またはspatialiteコンソールから読み込む方法が利用できますが、これだと結局上記の新規作成手順を踏むことになります。
それ以外ならogr2ogrコマンドを使った方法の3通りがあります。

あと、spatialite-guiにはshapeファイル取り込みボタン/メニューがあります。

Shapeファイルのインポートボタン

SpatialiteのShapeファイルへの執着はただごとではありません。

spatialite_toolを使う場合

以下のようにコマンドを入力します。

> spatialite_tool -i -shp "Shapeファイル名(拡張子なし)" -d "データベース名"
      -t "テーブル名" -c "文字コード" -s "EPSG番号"

ただし、上記のメタデータ3点セットは作成されないので、先にinit_spatialite.sqlを適用する必要があります。

spatialiteコンソールから読み込む場合

上記のように新規データベース名を引数にしてコンソールを起動し、以下のようにコマンドを入力します。

spatialite> .loadshp "Shapeファイル名(拡張子なし)" "テーブル名" "文字コード" "EPSG番号"

この場合もメタデータ3点セットは作成されないので、先にinit_spatialite.sqlを適用する必要があります。

ogr2ogrコマンドを使う場合

もっとも単純に変換するには、以下のようにコマンドを入力します。

> ogr2ogr -f "SQLite" "出力ファイル名(.sqlite)" "入力ファイル名" -dsco SPATIALITE=YES

この場合は、テーブル名は入力元のファイル名になります。

最後の-dsco SPATIALITE=YESオプションはgdal v1.7から利用可能なもので、Spatialite形式のデータベースを作成します。
したがって、メタデータ3点セットが作成された状態になります。
これを指定しなかった場合、本文書作成時の最新バージョンであるv1.8ではFDO-OGR仮想テーブルというのが作成されたものになります。
よくわかりませんが、これはOGC準拠形式なんだとか?

-dsco SPATIALITE=YESオプションを指定した場合は、上記のメタデータ3点セットのテーブルが同時に作成されます。
かつ、インデックスが有効になります。

なお、どちらの形式でもQGISでは読み込むことができるようです。

データ作成時にテーブル名を指定する方法は、筆者は発見できませんでした-nln "テーブル名"オプションを使用します。
作成後にテーブル名を変更する場合は、Spatialiteコンソールから行うこともできますし、ogrinfoコマンドで、

> ogrinfo "sqliteファイル名" 
    -sql "alter table 旧テーブル名 rename to 新テーブル名;"

としてもいいでしょう。

既存のデータベースに新たにテーブルを追加することも可能です。その場合は以下のようにします。

> ogr2ogr -f SQLite -append -nln "テーブル名" -nlt "要素種別(POLYGON等)"
    "追加先のデータベースファイル名" "入力ファイル名"

-nltオプションを指定しないとエラーになる場合があるようです。
(おそらくですが、最初に作成されたテーブルと要素種別が異なる場合か?)


ラスタデータを取り込むには

rasterlite_loadコマンドを利用するか、gdal_translateを使うかの2通りがあります。

rasterlite_loadコマンドを利用する場合

まず、空のデータベースを作成し、コマンドラインから以下のように入力します。

> rasterlite_load -v -d "データベース名" -T "テーブル名" -f "入力ファイル名"
    -e "EPSG番号" -i "フォーマット"

-vオプションは詳細情報出力なので、なくても良いです。
フォーマットは、TIFF、PNG、JPEG、WAVELETのいずれかを指定します。
これは、入力ファイルのフォーマットではなく、データベース内に格納するときのフォーマットです。

ロードが完了するとインデックスも同時に作成されます。

gdal_translateを利用する場合

新規作成からできます。
コマンドラインから以下のように入力します。変換先がデータベースなので、その指定方法がちょっと特殊です。

> gdal_translate -of "Rasterlite" 入力ファイル名
    RASTERLITE:出力ファイル名,table=テーブル名 -co DRIVER=フォーマット名

最後のフォーマット名は、”GTiff”、”GIF”、”PNG”、”JPEG”、”EPSILON”を指定できます。
が、Windows環境では”EPSILON”は難ありです。
また、OSGeo4W版ではサポートそのものがされていないようです。
参考記事1
参考記事2

既存のデータベースを指定することもできます。
このとき、既存のデータベースにあるテーブル名とかぶった場合はそのテーブルにデータが追加されます。
アップデートではないので注意が必要です。
既存のテーブルを置き換えたい場合は-co WIPE=Yesオプションを指定します。

ラスタデータのテーブル構造

ラスタデータのテーブルは2つ作成され、それぞれ”テーブル名“_rasters、”テーブル名“_metadataという名称になっています。
***_rastersは実際の画像データを保持しており、***_metadataは画像タイルの図形データやもとの画像のファイル名、解像度等の情報が記載されています。
画像の取り込みでは、複数の画像をひとつのテーブルに放り込むことができますが、***_metadataの情報から元の画像をたどれるようになっています。
この情報は整備編で紹介するピラミッド画像作成のところで使用されます。


列を確認するには

Spatialite-guiで列の所在と名称はとりあえずわかりますが、
型情報などの詳細を調べたい場合はテーブルを右クリックして[Show columns]を選択します。

Show columns

これを選択するとコマンドウィンドウにも表示されますが、コマンドラインから同様の操作を行う場合は

> pragma table_info("テーブル名");

と入力します。


仮想テーブルを作成するには

既存のShapeファイルをデータベースに取り込むのではなく、仮想テーブルとしてShapeファイルにリンクすることができます。
リンクを作成するには、Spatialite-guiの【Virtual shapefile】ボタンを押します。

Virtual shapefile

コマンドラインからは以下のように実行します。

> create virtual table "テーブル名" using virtualshape("拡張子なしファイル名", '文字コード', 'SRID番号')

ビューのようなもののようで、データの追加、更新、削除はできませんが、検索などは普通にできます。
検索は若干遅いように感じられます。

リンクを削除するには、通常のテーブルと同じようにDROP TABLEコマンドを使用します。
本体のShapeファイルが削除されることはありません。

アーカイブ