Upgrade to Pro — share decks privately, control downloads, hide ads and more …

foss4g-hokkaido-2025-9-27-qgis-spatialite

Avatar for yama-kei yama-kei
October 01, 2025

 foss4g-hokkaido-2025-9-27-qgis-spatialite

SpatiaLiteによるデータ管理と空間解析機能を活用することで、QGISをより魅力的なツールにする手法を説明します。

Avatar for yama-kei

yama-kei

October 01, 2025

More Decks by yama-kei

Other Decks in Technology

Transcript

  1. 山崎 渓 Software Engineer 群馬県で GIS エンジニアをしていま す 経歴としては、地質 → 建建コンサ

    ルタント →GIS エンジニア 札幌には 1 年間住んでいたので、町 を完全理解しています。何でも聞い てください 3
  2. 今日の発表内容 1. Introduction 2. SpatiaLite とは 3. QGIS における SpatiaLite

    の使い方 4. QGIS プラグインで SpatiaLite を使う際の戦略 4
  3. 代表的な SpatiaLite の空間クエリ ST_Buffer :ジオメトリのバッファを作成 ST_Intersection :2 つのジオメトリの交差部分を取得 ST_Distance :2

    つのジオメトリ間の距離を計算 ST_Within :ジオメトリが他のジオメトリ内に含まれるかを判定 ST_Transform :ジオメトリの座標系を変換 BuildMbr :ジオメトリの最小外接矩形を作成 ST_Azimuth :2 点間の方位角を計算 ST_Area :ポリゴンの面積を計算 ST_Length :ラインの長さを計算 25
  4. SpatiaLite の空間クエリを使用すると、以下のように簡潔なコードで 処理できたが・・・・ SELECT MakeLine(ST_StartPoint(geom), ST_EndPoint(geom)) AS geom FROM 'eroad_N10-24_10';

    これを QGIS の processing や PyQGIS を使って処理しようとすると、 結構頭を悩ませる SpatitaLite でクエリすることで、複雑な処理でも簡潔な記述で処 理できる可能性がある! 31
  5. Python での利用 Python コンソールから利用するには、最初におまじないが必要 windows の場合 import sqlite3 db_path =

    r"data/sample_db.sqlite" con = sqlite3.connect(db_path) # 拡張を有効 con.enable_load_extension(True) cur = con.cursor() cur.execute("SELECT load_extension('mod_spatialite')") 33
  6. Python での利用 Python コンソールから利用するには、最初におまじないが必要 mac の場合 import sqlite3 db_path =

    r"data/sample_db.sqlite" con = sqlite3.connect(db_path) # 拡張を有効 con.enable_load_extension(True) cur = con.cursor() cur.execute("SELECT load_extension('mod_spatialite.so')") 34
  7. Python での利用 Cursor オブジェクトから execute() を呼び出して、クエリを実行し ます。 試しに接続した DB のテーブル一覧を表示してみます

    cur.execute("SELECT name FROM sqlite_master WHERE type='table';") all_rows = cur.fetchall() for row in all_rows: print(row) 35
  8. cur.executescript(""" CREATE TABLE eroad_straight_lines AS SELECT MakeLine(ST_StartPoint(geom), ST_EndPoint(geom)) AS geom

    FROM 'eroad_N10-24_10'; SELECT RecoverGeometryColumn( 'eroad_straight_lines', 'geom', 6668, 'LINESTRING' ) """) 38
  9. -- eroad_staright_linesというテーブルを作成し、処理結果を格納する CREATE TABLE eroad_straight_lines AS SELECT MakeLine(ST_StartPoint(geom), ST_EndPoint(geom)) AS

    geom FROM 'eroad_N10-24_10'; -- SpatiaLiteのお作法として、新たに作成したテーブルには、 -- Geometryの情報を教えてあげる必要がある SELECT RecoverGeometryColumn( 'eroad_straight_lines', -- 対象のテーブルを指定 'geom', -- Geometryとして指定する列 6668, -- 座標系をEPSGコードで指定 'LINESTRING' -- Geometryタイプを指定 ) 39
  10. QGIS プラグインで SpatiaLite を使う際の戦略 特定の業務を遂行するためのプラグインを作成する時、SQLite (SpatiaLite )を使ったデータ管理は便利。 任意の SQLite を指定することで動作する設計とする

    (もしくは新しく SQLite ファイルを作成し、新規プロジェクト として立ち上げる) これにより 1 ファイルを共有すればプラグインの動作に必要なデー タをやり取りすることができる 41
  11. QGIS プラグインで SpatiaLite を使う際の戦略 要件を満たしたデータだけを DB に取り込む・・という戦略を取る ことで、DB に格納されたデータはプラグインで正しく動作するデ ータということを保証できる

    フォルダ指定で、そこに必要なデータが格納されていることを前 提にしたシステムだと、問題のあるデータを取り入れてしまう原 因となる データ管理の面においても、1 つの SQLite ファイルで管理でき るのは楽。 43
  12. SpatiaLite でデータを管理する優位性 GeoJSON でデータを管理している場合は、レイヤが 3 つあると 3 フ ァイルが必要。 .

    ├── sample1.geojson ├── sample2.geojson └── sample3.geojson SpatiaLite であれば、1 ファイルで 良い。 . └── sample.sqlite 44
  13. SpatiaLite でデータを管理する優位性 大量の地物の値を一括更新したい時に利用したい processing の フィールド計算機 があるが、これは Input したデータを更新するので はなく、新たにデータを作成してしまうので、データ更新の観点か

    らは使用しにくい。 SpatiaLite に格納されたレイヤであればクエリで値を更新できるの で、 フィールド計算機 の使用感覚で、特定の要件にあった地物の属性 の更新を行うことができる(新たにレイヤを作成することなく) 。 46
  14. SpatiaLite の特徴 SQLite の空間拡張で、1 ファイルでポータブル ファイル系とデータベース系の良いとこ取り QGIS での活用方法 ブラウザパネル、DB マネージャ、Python

    コンソールから利用 空間クエリによる高度な処理が簡潔に記述可能 プラグイン開発での戦略 1 ファイルでデータ管理とプロジェクト共有 49