【第9回】欲しいデータを瞬時に抽出!iDesktopXのSQLクエリと空間クエリ

こんにちは!GIS導入支援コンサルタントのippuku_timeです。

「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」第9回です。前回は、データを視覚的に表現する「主題図」について学びました。今回は、その逆のプロセスとも言える、膨大なデータの中から特定の条件に合うものだけを効率的に探し出す「クエリ(問い合わせ)」機能に焦点を当てます。データ分析の第一歩は、必要なデータを正確に抽出することから始まります。


【第9回】欲しいデータを瞬時に抽出!iDesktopXのSQLクエリと空間クエリ


GISデータは、位置情報を持つ「空間データ」と、名称や数値などの付加情報を持つ「属性データ」が一体となっています。iDesktopXのクエリ機能も、この2つの側面からアプローチできるように設計されています。クエリをマスターすれば、まるでデータと対話するように、必要な情報を自由自在に取り出すことができます。

図 GISクエリの概念イメージ:膨大なデータから条件に合うものだけを抽出する


1. 属性で探す「SQLクエリ」

SQL(Structured Query Language)は、データベースに問い合わせを行うための世界標準言語です。iDesktopXでは、このSQLを利用して、属性テーブルの情報から条件に合うオブジェクトを検索できます。

(1) SQLクエリの基本

「このデータセットの中から、『階数が30階以上』のビルを探す」「『路線名がJR山手線』である駅だけを表示する」といった条件をSQL文で記述して実行します。iDesktopXには、SQL文を直感的に組み立てられるUIが用意されているため、SQLに詳しくない方でも簡単にクエリを作成できます。

(2) 港区データを使ったSQLクエリの例

① 数値による検索:

"階数" >= 30

(港区の建物データから、30階建て以上の超高層ビルを検索)

② **文字による検索**:
  `"路線名" = '都営大江戸線'`
  (港区の駅データから、都営大江戸線の駅を検索)
③ **あいまい検索(ワイルドカード)**:
  `"施設名称" LIKE '%美術館'`
  (施設データから、名称に「美術館」を含むものをすべて検索)
④ **複数の条件を組み合わせる**:
  `"地目" = '公園' AND "面積" > 10000`
  (土地利用データから、地目が「公園」で、かつ面積が10,000㎡以上のものを検索)

2. 場所で探す「空間クエリ」

空間クエリは、オブジェクトの空間的な位置関係を条件としてデータを検索する、GISならではの強力な機能です。

(1) 空間クエリの考え方

「六本木ヒルズから500m以内にあるすべてのコンビニ」「芝公園の中に完全に含まれるすべての施設」「国道1号線に接しているすべての土地区画」といった、場所に関する問い合わせを行います。

(2) 代表的な空間演算子

空間的な位置関係を定義するために、「空間演算子」と呼ばれるキーワードを使います。

① インターセクト (Intersect): 2つのオブジェクトが少しでも重なっている(交差している)場合に合致。最もよく使われます。

② 内包 (Contains): あるオブジェクトが、別のオブジェクトを完全に内部に含んでいる場合に合致。(例:港区が、赤坂という地区を「内包する」)

③ 含まれる (Within): あるオブジェクトが、別のオブジェクトに完全に含まれている場合に合致。(例:東京タワーが、港区に「含まれる」)

④ 隣接 (Touches): 2つのオブジェクトの境界が接しているが、内部は重なっていない場合に合致。

⑤ 分離 (Disjoint): 2つのオブジェクトが全く接しておらず、離れている場合に合致。


3. クエリ結果の活用

クエリを実行すると、条件に合致したオブジェクトが地図上でハイライト表示されたり、属性テーブルで絞り込み表示されたりします。さらに重要なのは、クエリ結果を新しいデータセットとして保存できることです。これにより、分析対象を必要なデータだけに絞り込み、その後の解析や作図を効率的に進めることができます。

まとめ

今回は、大量のGISデータから必要な情報を効率的に見つけ出すための「クエリ」機能について解説しました。属性情報から検索する「SQLクエリ」と、位置関係から検索する「空間クエリ」。この2つのクエリを使いこなすことで、データ探索の時間が大幅に短縮され、より本質的な分析作業に集中できるようになります。

次回は、いよいよGIS分析機能の中核、**第10回「データの可能性を解き放つ!空間解析入門」**です。バッファ分析やオーバーレイ分析といった、GISならではの強力な解析手法についてご紹介します。お楽しみに!


付録:サンプルコード(Python)


空間クエリを実行し、特定のエリア(ここでは港区の「芝公園」エリアを想定)と重なる施設を抽出するPythonコードの例です。

Python


# -*- coding: utf-8 -*-

from PySuperMap import *

def execute_spatial_query():
    """
    空間クエリを実行し、特定の公園と重なる施設を抽出するサンプル
    """
    try:
        # ワークスペースとデータソースを取得
        workspace = Workspace()
        datasource = workspace.get_datasource("Minato_Data")
        if datasource is None: return
       
        # 検索対象のデータセット(施設)を取得
        target_dataset = datasource.get_dataset("Facilities")
        if target_dataset is None:
            print("検索対象のデータセット 'Facilities' が見つかりません。")
            return

        # 検索条件となるデータセット(公園)を取得
        filter_dataset = datasource.get_dataset("Parks")
        if filter_dataset is None:
            print("検索条件のデータセット 'Parks' が見つかりません。")
            return

        # 1. 検索条件となるジオメトリオブジェクトを取得(ここでは '芝公園' を検索)
        filter_recordset = filter_dataset.query("Park_Name = '芝公園'", CursorType.STATIC)
        if filter_recordset.is_empty():
            print(" '芝公園' が見つかりませんでした。")
            filter_recordset.dispose()
            return
       
        shiba_park_geometry = filter_recordset.get_geometry()
        print("'芝公園' のジオメトリを取得しました。")
        filter_recordset.dispose()

        # 2. 空間クエリのパラメータを設定
        query_param = QueryParameter()
        query_param.set_spatial_query_object(shiba_park_geometry)
        query_param.set_spatial_query_mode(SpatialQueryMode.INTERSECT) # インターセクト(交差)
        query_param.set_cursor_type(CursorType.STATIC)
       
        # 3. 空間クエリを実行
        print("空間クエリを実行中...")
        result_recordset = target_dataset.query(query_param)
       
        if result_recordset.is_empty():
            print("芝公園と重なる施設は見つかりませんでした。")
        else:
            print(f"クエリ結果: {result_recordset.get_record_count()}件の施設が見つかりました。")
            result_recordset.move_first()
            while not result_recordset.is_eof():
                facility_name = result_recordset.get_value("Facility_Name")
                print(f" - {facility_name}")
                result_recordset.move_next()
       
    except Exception as e:
        print(f"エラーが発生しました: {e}")

    finally:
        # 4. リソースを解放
        if 'filter_recordset' in locals() and filter_recordset is not None:
            filter_recordset.dispose()
        if 'result_recordset' in locals() and result_recordset is not None:
            result_recordset.dispose()
        print("処理を終了します。")

if __name__ == '__main__':
    execute_spatial_query()


コメント

このブログの人気の投稿

【11月リリース予定】SuperMap iServer 2025 プレビュー:WebGIS体験を刷新する新機能とは?

「GIS」っていまだに「地理情報システム」の略?時代の変化と共に、その本当の意味を再定義してみた

「国土数値情報」を考える:それは日本のGISを支える“共通の土台”である