「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()
コメント
コメントを投稿