Windows で SpatiaLite を使ってみる

【概要】SpatiaLite は、SQLite 3 に空間データ機能を追加する拡張ライブラリである。空間データの格納、操作、空間索引の生成ができる。本記事では、Windows 環境を前提に、SpatiaLite のインストール、データベースの生成、ESRI Shape ファイルの読み書き、OpenStreetMap データの読み込み、SQL 空間関数の使用、Python からの利用方法を説明する。SpatiaLite は CPU で動作するため、GPU は不要である。

目次

  1. SpatiaLite の概要
  2. Windows へのインストール
  3. データベースファイルの生成とメタデータのロード
  4. ESRI Shape ファイルの読み込み
  5. ESRI Shape ファイルへの書き出し
  6. OpenStreetMap データの読み込み
  7. SpatiaLite の SQL 空間関数の使用
  8. Python から SpatiaLite を使用する

SpatiaLite の概要

SpatiaLite は、SQLite 3 に空間データ機能を追加する拡張ライブラリである。空間データは、SQLite 3 の BLOB 型(Binary Large Object。バイナリデータを格納するデータ型)の列に格納される。2026年5月時点の最新版は 5.1.0 である。

SpatiaLite を使用するメリット

主要な機能

主なデータ型

SpatiaLite で扱う主なデータ型を以下に示す。

参考資料

Windows へのインストール

Windows では、gaia-gis.it が配布するコマンドラインツール一式と拡張モジュールをダウンロードし、展開して使用する。インストーラーは不要で、展開した実行ファイルをそのまま使える。

ダウンロード

以下の3点を、64bit 版 Windows 用の配布物(7-Zip 形式)としてダウンロードする。展開には 7-Zip などのアーカイバが必要である。

展開とパスの設定

ダウンロードした 7z ファイルを、たとえば C:\spatialite に展開する。展開先フォルダを Windows の環境変数 PATH に追加すると、コマンドプロンプトのどのディレクトリからでも各コマンドを実行できる。Python などから mod_spatialite.dll を読み込む場合も、この DLL を含むフォルダが PATH に含まれている必要がある。

コマンドプロンプトを開き、次のコマンドでバージョンが表示されれば、インストールは成功である。

spatialite --version

データベースファイルの生成とメタデータのロード

SpatiaLite を使用するには、最初にデータベースファイルを生成し、メタデータをロードする。メタデータには、空間参照系の定義やジオメトリ列の情報が含まれ、空間クエリを正しく実行するために必要である。

データベースの生成

コマンドプロンプトで spatialite コマンドを実行し、データベースファイル名を指定する。指定したファイルが存在しなければ、新規に作成される。以下の例では mydb.sqlite を作成する。

spatialite mydb.sqlite

実行すると、SpatiaLite のプロンプト(spatialite>)が表示される。以降の SQL 文は、このプロンプトに入力する。

Windows のコマンドプロンプトで spatialite を実行しデータベースを生成した結果

メタデータの初期化

新規データベースに対して、InitSpatialMetaData() 関数を実行し、空間メタデータを初期化する。引数に 1 を渡すと、処理が高速化される。

SELECT InitSpatialMetaData(1);
InitSpatialMetaData を実行して空間メタデータを初期化した結果

メタデータの確認

メタデータが正しくロードされたかを確認するには、以下の SQL 文を実行する。空間メタデータ用のテーブル(spatial_ref_sys、geometry_columns など)が作成されていることを確認できる。

SELECT * FROM sqlite_master;
sqlite_master を参照して空間メタデータ用テーブルが作成されたことを確認した結果
作成された空間メタデータ用テーブルの一覧

SpatiaLite の終了

SpatiaLite のプロンプトを終了するには、.quit または .exit と入力する。

ESRI Shape ファイルの読み込み

ESRI Shape ファイルは、GIS 分野で広く使用されているベクターデータ形式である。Shape ファイルを SpatiaLite に読み込むと、SQL による空間データの検索、分析、他データとの結合ができる。

事前準備

読み込む Shape ファイルのパスとベース名(拡張子 .shp を除いた名前)を確認しておく。Shape ファイルは、.shp.shx.dbf などの複数ファイルで構成されるため、これらが同じフォルダに揃っている必要がある。

ESRI Shape ファイルを構成するファイル群の一覧

読み込みコマンドの書式

Shape ファイルの読み込みには、spatialite_tool コマンドを使用する。このコマンドは、SpatiaLite のプロンプト内ではなく、コマンドプロンプトで実行する。

spatialite_tool -i -shp <ファイルのベース名> -d <SQLite 3 データベース名> -t <テーブル名> -c <文字コード> -s 4326 -g <ジオメトリ列名>

主なオプション:

注意事項

実行例

コマンドプロンプトでの実行例を以下に示す。Shape ファイルとデータベースのパスは、自分の環境に合わせて書き換える。

spatialite_tool -i -shp C:\data\shapefiles\regions -d C:\data\mydb.sqlite -t regions -c CP1252 -s 4326 -g Geom
Windows での Shape ファイル読み込みコマンドの実行結果
Shape ファイルの読み込み完了メッセージ

読み込み結果の確認

読み込みが正常に完了したかを確認する方法を、2通り示す。

spatialite_gui を使用した確認

  1. spatialite_gui で対象のデータベースを開き、ジオメトリ列(例: Geom)を右クリックして「Map Preview」を選択する。

    spatialite_gui でジオメトリ列を右クリックし Map Preview を選択
  2. 地図が表示されることを確認する。

    spatialite_gui での地図プレビュー表示

コマンドラインを使用した確認

コマンドプロンプトで spatialite <データベース名> を実行してデータベースを開き、SpatiaLite のプロンプトで、読み込んだテーブルを SQL で確認する。

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

主なオプション:

注意事項

実行例

コマンドプロンプトでの実行例を以下に示す。パスは、自分の環境に合わせて書き換える。

spatialite_tool -e -shp C:\data\export\regions_out -d C:\data\mydb.sqlite -t regions -g Geom -c CP1252 --type POLYGON
Windows での Shape ファイル書き出しコマンドの実行結果

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 データベース名>

主なオプション:

注意事項

実行例

コマンドプロンプトでの実行例を以下に示す。

spatialite_osm_map -o C:\data\fukuoka-city.osm -d C:\data\osm.sqlite
Windows での OpenStreetMap データ読み込みコマンドの実行結果

読み込み結果の確認

spatialite_gui で読み込み先のデータベースを開き、ジオメトリ列を右クリックして「Map Preview」を選択すると、地図として読み込み結果を確認できる。

spatialite_gui で OpenStreetMap データの Map Preview を表示した結果

SpatiaLite の SQL 空間関数の使用

SpatiaLite は、空間データを操作するための SQL 関数を提供している。これらの関数により、座標の取得、図形の変換、空間演算ができる。以下では、前節で作成した OSM 由来のデータベースに含まれる建物テーブル(例: pg_building)を題材に、代表的な関数を紹介する。各 SQL 文は、コマンドプロンプトで spatialite <データベース名> を実行して開いた SpatiaLite のプロンプトに入力する。テーブル名やジオメトリ列名は、自分のデータベースの構造に合わせて読み替える。

行数の取得

count() 関数で、テーブル内のレコード数を取得する。データ量の把握や、フィルタ条件の検証に使用する。

SELECT count(*) FROM pg_building;
count 関数による行数取得の実行結果

Geometry のテキスト表示

AsText() 関数は、Geometry を WKT(Well-Known Text)形式の文字列に変換する。WKT は、空間データを人間が読める形式で表現したもので、デバッグや他システムとのデータ交換に使用する。

SELECT *, AsText(Geometry) FROM pg_building;
AsText 関数による Geometry のテキスト表示結果

Geometry の16進表示

HEX() 関数は、Geometry のバイナリデータを16進数の文字列に変換する。内部表現の確認や、バイナリレベルでのデータ検証に使用する。

SELECT *, HEX(Geometry) FROM pg_building;
HEX 関数による Geometry の16進表示結果

Geometry の型の表示

GeometryType() 関数は、Geometry の型(POINT、POLYGON など)を返す。データの種類を確認したり、型に応じて処理を分岐させたりする場合に使用する。

SELECT *, GeometryType(Geometry) FROM pg_building;
GeometryType 関数の実行結果

Geometry の境界の表示

Boundary() 関数は、Geometry の境界を返す。Polygon の場合は、外周の LineString が返される。図形の輪郭のみを取得したい場合に使用する。

SELECT *, AsText(Boundary(Geometry)) FROM pg_building;
Boundary 関数による境界表示結果

Geometry の包絡線の表示

Envelope() 関数は、Geometry を囲む最小の矩形(包絡線)を返す。図形の大まかな範囲を把握したり、空間索引を用いた範囲検索に使用したりする。

SELECT *, AsText(Envelope(Geometry)) FROM pg_building;
Envelope 関数による包絡線表示結果

Geometry の最小外接矩形の座標の表示

MbrMinX()、MbrMinY()、MbrMaxX()、MbrMaxY() 関数は、Geometry の最小外接矩形(MBR: Minimum Bounding Rectangle。図形を囲む最小の長方形)の各座標値を個別に返す。範囲検索の条件指定や、座標値を使った計算に使用する。

SELECT *, MbrMinX(Geometry), MbrMinY(Geometry), MbrMaxX(Geometry), MbrMaxY(Geometry) FROM pg_building;
MBR 関数による最小外接矩形の各座標値の表示結果

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()

注意事項