Windows で SpatiaLite を使ってみる
【概要】SpatiaLite は、SQLite 3 に空間データ機能を追加する拡張ライブラリである。空間データの格納、操作、空間索引の生成ができる。本記事では、Windows 環境を前提に、SpatiaLite のインストール、データベースの生成、ESRI Shape ファイルの読み書き、OpenStreetMap データの読み込み、SQL 空間関数の使用、Python からの利用方法を説明する。SpatiaLite は CPU で動作するため、GPU は不要である。
目次
SpatiaLite の概要
SpatiaLite は、SQLite 3 に空間データ機能を追加する拡張ライブラリである。空間データは、SQLite 3 の BLOB 型(Binary Large Object。バイナリデータを格納するデータ型)の列に格納される。2026年5月時点の最新版は 5.1.0 である。
SpatiaLite を使用するメリット
- SQL 文で空間データの検索、分析、加工ができる
- 空間索引(空間データに特化した索引構造)により、位置に基づく検索が高速化される
- サーバー不要で、単一ファイルとしてデータベースを管理できる
- GIS ソフトウェア(QGIS など)と連携できる
主要な機能
- SQLite 3 を拡張し、空間データを扱えるようにする
- AsText()、GeomFromText()、Area()、PointN() などの SQL 空間関数を実装する
- OGC(Open Geospatial Consortium。地理情報の標準化を推進する国際的なコンソーシアム)が定める関数(Overlaps()、Touches()、ST_Union()、Buffer() など)を実装する
- OGC が定める空間メタデータ(spatial metadata。空間参照系やジオメトリ列の定義情報)を扱う
- ESRI Shape ファイルのインポートとエクスポートができる(手順は本記事で説明する)
- 座標の再投影(座標を別の座標参照系の値に変換する処理)ができる。変換には PROJ(座標変換ライブラリ)と EPSG(座標参照系の国際的な識別コード体系)を使用する
- 文字コード変換(libiconv を使用)ができる
- SQLite 3 の R*Tree(空間データの高速検索に適した木構造の索引)上に空間索引を実装する
- VirtualShape 拡張により、外部の ESRI Shape ファイル、CSV ファイル、TxtTab ファイルを、SpatiaLite にインポートせずに SQL で直接問い合わせできる
主なデータ型
SpatiaLite で扱う主なデータ型を以下に示す。
- Point: 点(緯度・経度などの単一座標)
- LineString: 線(複数の点を結んだ経路)
- Polygon: 多角形(閉じた領域)
- MultiPoint: 複数の点の集合
- MultiLineString: 複数の線の集合
- MultiPolygon: 複数の多角形の集合
参考資料
- SpatiaLite Cookbook: https://www.gaia-gis.it/gaia-sins/spatialite-cookbook-5/index.html
- SpatiaLite の SQL 関数リファレンス: https://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html
Windows へのインストール
Windows では、gaia-gis.it が配布するコマンドラインツール一式と拡張モジュールをダウンロードし、展開して使用する。インストーラーは不要で、展開した実行ファイルをそのまま使える。
ダウンロード
以下の3点を、64bit 版 Windows 用の配布物(7-Zip 形式)としてダウンロードする。展開には 7-Zip などのアーカイバが必要である。
- コマンドラインツール: spatialite-tools-5.1.0(spatialite.exe、spatialite_tool.exe、spatialite_osm_map.exe などを含む)
- GUI ツール: spatialite_gui(地図プレビューなどができる GUI フロントエンド)
- 拡張モジュール: mod_spatialite-5.1.0(mod_spatialite.dll と依存 DLL 一式を含む。Python などから SpatiaLite を呼び出す場合に必要)
展開とパスの設定
ダウンロードした 7z ファイルを、たとえば C:\spatialite に展開する。展開先フォルダを Windows の環境変数 PATH に追加すると、コマンドプロンプトのどのディレクトリからでも各コマンドを実行できる。Python などから mod_spatialite.dll を読み込む場合も、この DLL を含むフォルダが PATH に含まれている必要がある。
コマンドプロンプトを開き、次のコマンドでバージョンが表示されれば、インストールは成功である。
spatialite --version
データベースファイルの生成とメタデータのロード
SpatiaLite を使用するには、最初にデータベースファイルを生成し、メタデータをロードする。メタデータには、空間参照系の定義やジオメトリ列の情報が含まれ、空間クエリを正しく実行するために必要である。
データベースの生成
コマンドプロンプトで spatialite コマンドを実行し、データベースファイル名を指定する。指定したファイルが存在しなければ、新規に作成される。以下の例では mydb.sqlite を作成する。
spatialite mydb.sqlite
実行すると、SpatiaLite のプロンプト(spatialite>)が表示される。以降の SQL 文は、このプロンプトに入力する。
メタデータの初期化
新規データベースに対して、InitSpatialMetaData() 関数を実行し、空間メタデータを初期化する。引数に 1 を渡すと、処理が高速化される。
SELECT InitSpatialMetaData(1);
メタデータの確認
メタデータが正しくロードされたかを確認するには、以下の SQL 文を実行する。空間メタデータ用のテーブル(spatial_ref_sys、geometry_columns など)が作成されていることを確認できる。
SELECT * FROM sqlite_master;
SpatiaLite の終了
SpatiaLite のプロンプトを終了するには、.quit または .exit と入力する。
ESRI Shape ファイルの読み込み
ESRI Shape ファイルは、GIS 分野で広く使用されているベクターデータ形式である。Shape ファイルを SpatiaLite に読み込むと、SQL による空間データの検索、分析、他データとの結合ができる。
事前準備
読み込む Shape ファイルのパスとベース名(拡張子 .shp を除いた名前)を確認しておく。Shape ファイルは、.shp、.shx、.dbf などの複数ファイルで構成されるため、これらが同じフォルダに揃っている必要がある。
読み込みコマンドの書式
Shape ファイルの読み込みには、spatialite_tool コマンドを使用する。このコマンドは、SpatiaLite のプロンプト内ではなく、コマンドプロンプトで実行する。
spatialite_tool -i -shp <ファイルのベース名> -d <SQLite 3 データベース名> -t <テーブル名> -c <文字コード> -s 4326 -g <ジオメトリ列名>
主なオプション:
-i: インポートモード-shp: Shape ファイルのベース名(拡張子なし)-d: 出力先の SQLite 3 データベース名-t: 作成するテーブル名-c: 文字コード(例: UTF-8、CP1252、CP932)-s: SRID(Spatial Reference System Identifier。空間参照系の識別子)。4326 は WGS 84(GPS で使用される世界測地系)を表す-g: ジオメトリ列名(読み込んだ図形を格納する列の名前)
注意事項
- 文字コード: 日本の公的機関が配布する Shape ファイルは、属性データが Shift_JIS(コードページ CP932)であることが多い。この場合は
-c CP932を指定する。文字コードが合っていないと、属性値が文字化けする - SRID: Shape ファイルの座標系と異なる SRID を指定すると、座標値が正しく解釈されない
実行例
コマンドプロンプトでの実行例を以下に示す。Shape ファイルとデータベースのパスは、自分の環境に合わせて書き換える。
spatialite_tool -i -shp C:\data\shapefiles\regions -d C:\data\mydb.sqlite -t regions -c CP1252 -s 4326 -g Geom
読み込み結果の確認
読み込みが正常に完了したかを確認する方法を、2通り示す。
spatialite_gui を使用した確認
-
spatialite_gui で対象のデータベースを開き、ジオメトリ列(例: Geom)を右クリックして「Map Preview」を選択する。
-
地図が表示されることを確認する。
コマンドラインを使用した確認
コマンドプロンプトで spatialite <データベース名> を実行してデータベースを開き、SpatiaLite のプロンプトで、読み込んだテーブルを SQL で確認する。
ESRI Shape ファイルへの書き出し
SpatiaLite データベースから ESRI Shape ファイルへ書き出すと、QGIS や ArcGIS などの GIS ソフトウェアでデータを利用したり、Shape 形式を要求する外部システムとデータ交換したりできる。
書き出しコマンドの書式
Shape ファイルの書き出しには、spatialite_tool コマンドを使用する。読み込みと同様に、このコマンドはコマンドプロンプトで実行する。
spatialite_tool -e -shp <ファイルのベース名> -d <SQLite 3 データベース名> -t <テーブル名> -g <ジオメトリ列名> -c <文字コード> --type POLYGON
主なオプション:
-e: エクスポートモード-shp: 出力する Shape ファイルのベース名(拡張子なし)-d: 入力元の SQLite 3 データベース名-t: エクスポートするテーブル名-g: ジオメトリ列名-c: 文字コード--type: ジオメトリタイプ(POINT、LINESTRING、POLYGON など)
注意事項
- Shape ファイルは、1ファイルにつき1種類のジオメトリタイプしか格納できない。複数のジオメトリタイプが混在するテーブルをエクスポートする場合は、
--typeオプションで出力するタイプを指定する - 属性名は10文字までに制限される。これを超える属性名は切り詰められる
実行例
コマンドプロンプトでの実行例を以下に示す。パスは、自分の環境に合わせて書き換える。
spatialite_tool -e -shp C:\data\export\regions_out -d C:\data\mydb.sqlite -t regions -g Geom -c CP1252 --type POLYGON
OpenStreetMap データの読み込み
OpenStreetMap(OSM)は、誰でも自由に利用できるオープンな地図データである。OSM データを SpatiaLite に読み込むと、道路、建物、施設などの地理情報を SQL で検索、分析できる。
事前準備
読み込む OSM データファイルのパスを確認しておく。spatialite_osm_map コマンドは、OSM-XML 形式(.osm)と OSM-ProtoBuf 形式(.osm.pbf。OSM データを圧縮したバイナリ形式)の両方を扱える。OSM データは、OpenStreetMap 公式サイトや、地域単位の抽出データを配布するサイトからダウンロードできる。
読み込みコマンドの書式
OSM データの読み込みには、spatialite_osm_map コマンドを使用する。このコマンドはコマンドプロンプトで実行する。読み込み時に、複数のテーブル(道路、建物、POI など)が自動的に作成される。
spatialite_osm_map -o <OSM ファイル名> -d <SQLite 3 データベース名>
主なオプション:
-o: 入力する OSM ファイル(.osmまたは.osm.pbf)-d: 出力先の SpatiaLite データベース名-m: インメモリデータベースを使用して処理を高速化する(任意)-n: 空間索引(R*Tree)の生成を抑制する(任意)
注意事項
- 大きな OSM ファイル(数百 MB 以上)の読み込みには、時間がかかる場合がある
- 実行中に「Unresolved-Node」「Unresolved-Way」という警告が多数表示されることがある。これは、入力データに含まれる不完全な参照が無視されているだけで、有効なオブジェクトには影響しない
実行例
コマンドプロンプトでの実行例を以下に示す。
spatialite_osm_map -o C:\data\fukuoka-city.osm -d C:\data\osm.sqlite
読み込み結果の確認
spatialite_gui で読み込み先のデータベースを開き、ジオメトリ列を右クリックして「Map Preview」を選択すると、地図として読み込み結果を確認できる。
SpatiaLite の SQL 空間関数の使用
SpatiaLite は、空間データを操作するための SQL 関数を提供している。これらの関数により、座標の取得、図形の変換、空間演算ができる。以下では、前節で作成した OSM 由来のデータベースに含まれる建物テーブル(例: pg_building)を題材に、代表的な関数を紹介する。各 SQL 文は、コマンドプロンプトで spatialite <データベース名> を実行して開いた SpatiaLite のプロンプトに入力する。テーブル名やジオメトリ列名は、自分のデータベースの構造に合わせて読み替える。
行数の取得
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;
Geometry の型の表示
GeometryType() 関数は、Geometry の型(POINT、POLYGON など)を返す。データの種類を確認したり、型に応じて処理を分岐させたりする場合に使用する。
SELECT *, GeometryType(Geometry) FROM pg_building;
Geometry の境界の表示
Boundary() 関数は、Geometry の境界を返す。Polygon の場合は、外周の LineString が返される。図形の輪郭のみを取得したい場合に使用する。
SELECT *, AsText(Boundary(Geometry)) FROM pg_building;
Geometry の包絡線の表示
Envelope() 関数は、Geometry を囲む最小の矩形(包絡線)を返す。図形の大まかな範囲を把握したり、空間索引を用いた範囲検索に使用したりする。
SELECT *, AsText(Envelope(Geometry)) FROM pg_building;
Geometry の最小外接矩形の座標の表示
MbrMinX()、MbrMinY()、MbrMaxX()、MbrMaxY() 関数は、Geometry の最小外接矩形(MBR: Minimum Bounding Rectangle。図形を囲む最小の長方形)の各座標値を個別に返す。範囲検索の条件指定や、座標値を使った計算に使用する。
SELECT *, MbrMinX(Geometry), MbrMinY(Geometry), MbrMaxX(Geometry), MbrMaxY(Geometry) FROM pg_building;
Python から SpatiaLite を使用する
Windows の Python から SpatiaLite を利用するには、Python 標準ライブラリの sqlite3 モジュールを使い、拡張モジュール mod_spatialite を動的にロードする。追加の Python パッケージは不要で、標準の sqlite3 のみで動作する。前提として、インストールの節でダウンロードした mod_spatialite.dll とその依存 DLL を含むフォルダが、環境変数 PATH に含まれている必要がある。
拡張モジュールのロード
sqlite3 では、拡張モジュールのロードが既定で無効になっている。そのため、enable_load_extension(True) で有効化したうえで、load_extension("mod_spatialite") を呼び出す。拡張子(.dll)は SQLite が自動的に補うため、ベース名のみを指定する。
import sqlite3
# データベースに接続(存在しなければ新規作成)
conn = sqlite3.connect("mydb.sqlite")
# 拡張モジュールのロードを許可
conn.enable_load_extension(True)
# SpatiaLite 拡張をロード
conn.load_extension("mod_spatialite")
Python のビルドによっては、enable_load_extension が無効化されていることがある。その場合は AttributeError が発生するので、拡張ロードに対応した Python 環境(python.org の公式インストーラー版など)を使用する。
空間メタデータの初期化とクエリの実行
新規データベースの場合は、コマンドライン版と同様に InitSpatialMetaData(1) を実行し、空間メタデータを初期化する。初期化済みのデータベースに対しては不要である。以下は、初期化後に SpatiaLite のバージョンを取得し、続いてジオメトリを WKT で表示する例である。
cur = conn.cursor()
# 新規データベースのときだけ実行(初期化済みなら不要)
cur.execute("SELECT InitSpatialMetaData(1);")
# バージョン確認
cur.execute("SELECT spatialite_version();")
print("SpatiaLite:", cur.fetchone()[0])
# ジオメトリを WKT 形式で取得する例
cur.execute("SELECT AsText(Geometry) FROM pg_building LIMIT 5;")
for row in cur.fetchall():
print(row[0])
conn.close()
注意事項
- 拡張のロードに失敗し、原因が分かりにくい場合は、まずコマンドプロンプトで spatialite を起動し、SpatiaLite のプロンプトで
SELECT load_extension('mod_spatialite');を実行する。コマンドライン版のほうが、詳細なエラーメッセージが得られる - 「The specified module could not be found」というエラーは、mod_spatialite.dll 本体ではなく、その依存 DLL が見つからないことが原因の場合が多い。DLL 一式が同じフォルダにあり、そのフォルダが PATH に含まれているかを確認する