SpatiaLite を使ってみる
【目次】
SpatiaLite の概要
SpatiaLite は SQLite 3 に空間データ機能を追加する拡張ライブラリである。空間データは SQLite 3 の BLOB 型(Binary Large Object、バイナリデータを格納するデータ型)属性に格納される。
SpatiaLite を使用するメリット
- SQL 文を使用して空間データの検索、分析、加工ができる
- 空間索引(空間データに特化した索引構造)により、位置に基づく検索が高速化される
- サーバー不要で、単一ファイルとしてデータベースを管理できる
- GIS ソフトウェア(QGIS など)との連携が容易である
主要な機能
- SQLite を拡張し空間データを扱えるようにしたもの
- AsText()、GeomFromText()、Area()、PointN() などの SQL 空間関数を実装
- OpenGIS(地理情報の標準化を推進する国際的なコンソーシアム)が定める関数(Overlaps()、Touches()、Union()、Buffer() など)
- OpenGIS が定める空間メタデータ(Spatial metadata)
- ESRI Shape ファイルのインポートとエクスポート(手順は本ページで説明)
- 座標の再投影(PROJ.4(座標変換ライブラリ)と EPSG(座標参照系の国際的な識別コード体系)geodetic parameters dataset を使用)
- ロケール・キャラクタセット(locale charsets、GNU libiconv を使用)
- SQLite 3 の RTree(空間データの高速検索に適した木構造の索引)上に空間索引を実装
- VirtualShape 拡張(外部の ESRI Shape ファイル、CSV ファイル、TxtTab ファイルを SpatiaLite にインポートせずに直接 SQL で問い合わせできる機能)
主なデータ型
SpatiaLite で扱う主なデータ型を以下に示す。
- Point: 点(緯度・経度などの単一座標)
- LineString: 線(複数の点を結んだ経路)
- Polygon: 多角形(閉じた領域)
- MultiPoint: 複数の点の集合
- MultiLineString: 複数の線の集合
- MultiPolygon: 複数の多角形の集合
参考資料
- SpatiaLite の cookbook: https://www.gaia-gis.it/fossil/libspatialite/wiki?name=misc-docs
- SpatiaLite の SQL 関数リファレンス: https://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html
- Ubuntu での SpatiaLite のインストール手順
SpatiaLite データベースファイルの生成とメタデータのロード
SpatiaLite を使用するには、最初にデータベースファイルの生成とメタデータのロードを行う。メタデータには、空間参照系の定義やジオメトリカラムの情報が含まれており、空間クエリを正しく実行するために必要である。
SpatiaLite バージョン 3.0.0 以降の場合
バージョン 3.0.0 以降では、spatialite コマンドを実行するだけでメタデータが自動的にロードされる。
実行手順例:
spatialite mydb
Ubuntu での実行結果例:
SpatiaLite バージョン 2.4.0 の場合
バージョン 2.4.0 では、データベース生成後に InitSpatialMetaData() 関数を実行してメタデータを初期化する必要がある。
実行手順例:
spatialite mydb
SELECT InitSpatialMetaData();
Ubuntu での実行結果例:
メタデータの確認
メタデータが正しくロードされたかを確認するには、以下の SQL 文を実行する。
SELECT * FROM sqlite_master;
SpatiaLite バージョン 3.0.0 の場合の実行結果例:
SpatiaLite バージョン 2.4.0 の場合の実行結果例:
SpatiaLite の終了
SpatiaLite を終了するには、.exit と入力する。
ESRI Shape ファイルの読み込み
ESRI Shape ファイルは GIS 分野で広く使用されているベクターデータ形式である。Shape ファイルを SpatiaLite に読み込むことで、SQL を使用した空間データの検索、分析、他データとの結合が可能になる。
事前準備
読み込む Shape ファイルのパスとベース名を確認しておく。以下の例では、QGIS が配布しているサンプルデータセットを使用している。
読み込みコマンドの書式
spatialite_tool コマンドを使用して Shape ファイルを読み込む。
spatialite_tool -i -shp <ファイルのベース名> -d <SQLite 3 データベース名> -t <テーブル名> -c CP1252 [-s 4326] [-g <読み込み先の属性名>]
主なオプション:
- -i: インポートモード
- -shp: Shape ファイルのベース名(拡張子なし)
- -d: 出力先の SQLite 3 データベース名
- -t: 作成するテーブル名
- -c: 文字コード(例: CP1252、UTF-8)
- -s: SRID(Spatial Reference System Identifier、空間参照系識別子)。「4326」は「WGS 84」(GPS で使用される世界測地系)を意味する
- -g: ジオメトリ属性名(省略時は「geom」)
注意事項
- 文字コード: Shape ファイルの属性データに日本語が含まれる場合、適切な文字コード(Shift_JIS、UTF-8 など)を指定しないと文字化けが発生する
- SRID: Shape ファイルの座標系と異なる SRID を指定すると、座標値が正しく解釈されない
実行例
Ubuntu での実行手順例:
spatialite_tool -i -shp qgis_sample_data/shapefiles/regions -d /home/ubuntuuser/SQLite/mydb -t regions -c CP1252 -g Geom
SpatiaLite バージョン 3.0.0 の場合の実行画面例:
SpatiaLite バージョン 2.4.0 の場合の実行画面例:
読み込み結果の確認
読み込みが正常に完了したかを確認する方法を示す。
SpatiaLite バージョン 3.0.0 の場合
SpatiaLite GUI を使用した確認方法:
-
「Geom」を右クリックし、「Map Preview」を選択する。
-
地図が表示されることを確認する。
SpatiaLite コマンドラインを使用した確認:
SQLite を使用した確認(SQLite バージョン 3.7 系列がインストール済みであること):
SQLiteman を使用した確認:
SpatiaLite バージョン 2.4.0 の場合
SpatiaLite を使用した確認:
SQLite を使用した確認(SQLite バージョン 3.7 系列がインストール済みであること):
SQLiteman を使用した確認:
ESRI Shape ファイルへの書き出し
SpatiaLite データベースから ESRI Shape ファイルへ書き出すことで、QGIS、ArcGIS などの GIS ソフトウェアでデータを利用したり、Shape 形式を要求する外部システムとデータ交換したりできる。
書き出しコマンドの書式
spatialite_tool コマンドを使用して Shape ファイルを書き出す。
spatialite_tool -e -shp <ファイルのベース名> -d <SQLite 3 データベース名> -t <テーブル名> -g geom -c CP1252 [--type POINT]
主なオプション:
- -e: エクスポートモード
- -shp: 出力する Shape ファイルのベース名(拡張子なし)
- -d: 入力元の SQLite 3 データベース名
- -t: エクスポートするテーブル名
- -g: ジオメトリ属性名
- -c: 文字コード
- --type: ジオメトリタイプ(POINT、LINESTRING、POLYGON など)
注意事項
- Shape ファイルは1ファイルにつき1種類のジオメトリタイプしか格納できない。複数のジオメトリタイプが混在するテーブルをエクスポートする場合は、--type オプションで出力するタイプを指定する
- 属性名は10文字までに制限される。長い属性名は切り詰められる
実行例
SpatiaLite バージョン 2.4.0 の場合の Ubuntu での実行画面例:
OpenStreetMap データのファイルからの読み込み
OpenStreetMap(OSM)は、誰でも自由に利用できるオープンな地図データである。OSM データを SpatiaLite に読み込むことで、道路、建物、施設などの地理情報を SQL で検索、分析できる。
事前準備
読み込む OpenStreetMap データファイル(.osm 形式)のパスを確認しておく。OSM データは OpenStreetMap 公式サイトなどからダウンロードできる。
読み込みコマンドの書式
spatialite_osm_map コマンドを使用して OpenStreetMap データを読み込む。書式はバージョンによって異なる。
SpatiaLite バージョン 3.0.0 以降の場合:
spatialite_osm_map -o <ファイル名> -d <SQLite 3 データベース名>
SpatiaLite バージョン 2.4.0 の場合:
spatialite_osm_map -o <ファイル名> -d <SQLite 3 データベース名> -T<テーブル名> -m
注意事項
- 大きな OSM ファイル(数百 MB 以上)の読み込みには時間がかかる場合がある
- 読み込み時に複数のテーブル(道路、建物、POI など)が自動的に作成される
実行例
Ubuntu での実行画面例:
読み込み結果の確認
SpatiaLite バージョン 3.0.0 の場合、SpatiaLite GUI を使用して確認できる。
-
「Geom」を右クリックし、「Map Preview」を選択する。
-
地図が表示されることを確認する。
SpatiaLite の関数を使ってみる
SpatiaLite は空間データを操作するための SQL 関数を提供している。これらの関数を使用することで、座標の取得、図形の変換、空間演算などが可能になる。
前提条件
SpatiaLite バージョン 3.0.0 以降がインストールされていること。
サンプルデータベースの作成
以下では、地図データのページで説明しているファイル fukuoka-city.osm を使用してデータベースを作成する。事前にこのファイルを準備しておく。
次のコマンドでデータベースを作成する:
spatialite_osm_map -o <ファイル名> -d <SQLite 3 データベース名>
エラーメッセージが表示されていないことを確認する。
行数の取得
count() 関数でテーブル内のレコード数を取得できる。データ量の把握や、フィルタ条件の検証に使用する。
SELECT count(*) FROM pg_building;
Geometry のテキスト表示
AsText() 関数は Geometry を WKT(Well-Known Text)形式の文字列に変換する。WKT は空間データを人間が読める形式で表現したもので、デバッグや他システムとのデータ交換に使用する。
SELECT *, AsText(Geometry) FROM pg_building;
Geometry の16進表示
HEX() 関数は Geometry のバイナリデータを16進数文字列に変換する。内部表現の確認やバイナリレベルでのデータ検証に使用する。
SELECT *, HEX(Geometry) FROM pg_building;
GeometryType の表示
GeometryType() 関数は Geometry の型(POINT、POLYGON など)を返す。データの種類を確認したり、型に応じた処理を分岐させたりする場合に使用する。
SELECT *, GeometryType(Geometry) FROM pg_building;
Geometry の Boundary の表示
Boundary() 関数は Geometry の境界を返す。Polygon の場合は外周の LineString が返される。図形の輪郭のみを取得したい場合に使用する。
SELECT *, AsText(Boundary(Geometry)) FROM pg_building;
Geometry の Envelope の表示
Envelope() 関数は Geometry を囲む最小の矩形(包絡線)を返す。図形の大まかな範囲を把握したり、空間インデックスの範囲検索に使用する。
SELECT *, AsText(Envelope(Geometry)) FROM pg_building;
Geometry の MBR(最小外接矩形)の表示
MbrMinX()、MbrMinY()、MbrMaxX()、MbrMaxY() 関数は、Geometry の最小外接矩形(MBR: Minimum Bounding Rectangle)の各座標値を個別に返す。範囲検索の条件指定や、座標値を使った計算に使用する。
SELECT *, MbrMinX(Geometry), MbrMinY(Geometry), MbrMaxX(Geometry), MbrMaxY(Geometry) FROM pg_building;