「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、前回は東京都港区のオープンデータを使って、簡単な地図と3Dシーンを作成するチュートリアルをお届けしました。今回からは、さらに各機能を深掘りしていきます。第3回となる本記事では、すべてのGIS作業の基礎となる「データ管理」について徹底解説します。
【第3回】GISデータの心臓部!iDesktopXのデータ管理を徹底解説
GISを効率的に活用するためには、データの構造を正しく理解することが非常に重要です。iDesktopXでは、データを「ワークスペース」「データソース」「データセット」という3つの階層で管理します。このシンプルかつ強力な構造を理解すれば、データ整理が格段に楽になり、プロジェクト全体の作業効率も飛躍的に向上します。
図3-1 iDesktopXのデータ管理階層のイメージ
1. すべての作業の器「ワークスペース」
ワークスペース(*.smwu, *.sxwu)は、GISプロジェクト全体のコンテナ、つまり作業ファイルそのものです。作成した地図、3Dシーン、レイアウト、そして次に説明するデータソースへの接続情報など、プロジェクトに関連するすべての要素がこのワークスペースファイルに保存されます。
プロジェクトを再開する際は、このワークスペースファイルを開くだけで、前回の作業状態を完全に復元できます。
(1) ファイルベースのワークスペース: .smwuや.sxwuといった単一のファイルとしてプロジェクトを管理します。手軽に扱えるため、個人での作業や小規模プロジェクトに適しています。
(2) データベースベースのワークスペース: プロジェクト情報をPostGISやOracleなどのデータベース内に保存します。複数人での共同作業や、大規模なプロジェクト管理に適しています。
図3-2 iDesktopXのデータ階層構造
2. データの保管庫「データソース」
データソースは、実際の地理空間データ(ベクタデータやラスタデータ)を格納するデータベースやファイルコンテナそのものです。ワークスペースはデータソースへの「接続情報」を保持しており、データソース自体は独立しています。これにより、1つのデータソースを複数のワークスペースから参照するといった柔軟なデータ管理が可能です。
iDesktopXは、様々な種類のデータソースに対応しています。
(1) ファイルベースのデータソース: SuperMap独自の高性能なファイル形式(*.udbx)でデータを管理します。ファイルサイズに制限がなく、安全かつ安定したデータ操作が可能です。
(2) データベースベースのデータソース: PostGIS、Oracle、SQL Server、MySQL、MongoDBなど、主要なリレーショナルデータベースやNoSQLデータベースに接続し、GISデータソースとして利用できます。企業の基幹データベースと連携したシステム構築に不可欠です。
(3) Webデータソース: WMS、WFSといったOGC標準のWebサービスや、SuperMap iServerのRESTサービスとして公開されている外部の地図サービスを、あたかもローカルデータのように直接地図に重ねて利用できます。
(4) メモリデータソース: データをメモリ上に一時的に保持するデータソースです。分析の中間結果を保存するなど、高速な処理が求められる場面で役立ちます。
3. データの最小単位「データセット」
データセットは、点・線・ポリゴンといった具体的な地理データを格納する、データ管理の最小単位です。Excelのシートのように、同じ種類のデータ(例:全国の市区町村ポリゴン)が一つのデータセットにまとめられます。1つのデータソースには、複数のデータセットを格納できます。
iDesktopXは、基本的なベクタ・ラスタデータセットに加え、LiDAR点群を扱うためのLASデータセットなど、専門的なデータタイプもサポートしています。
4. 高速アクセスのための技術
大量のデータを快適に扱うために、iDesktopXにはいくつかの高度な技術が搭載されています。
(1) 空間インデックス: 広大な地図の中から特定の場所のデータを高速に検索するための「索引」です。このインデックスがあるおかげで、日本全国のデータの中から港区周辺だけを瞬時に表示するといった操作が可能になります。
(2) イメージピラミッド: 高解像度の航空写真などを、縮尺に応じて複数の解像度の画像に変換して保持する技術です。地図を縮小表示する際は低解像度の画像を、拡大表示する際は高解像度の画像を使うことで、常に快適な表示速度を保ちます。
(3) モザイクデータセット: 何百、何千枚もの航空写真タイルを、あたかも1枚の連続したデータのように扱うための仕組みです。元のファイルを移動・複製することなく仮想的に管理するため、ディスク容量を圧迫せずに広範囲のラスタデータを効率的に扱えます。
5. 複数人での共同編集を可能にする「データバージョン管理」
この機能を使えば、複数のユーザーが同じデータセットを同時に、かつ安全に編集できます。各ユーザーはデータの「バージョン」を分岐させて編集を行い、編集が完了したら親バージョンにマージ(統合)します。編集内容の競合が発生した場合は、システムがそれを検出し、どちらの編集を優先するかを選択して解決することができます。これにより、データの整合性を保ちながら、効率的な共同作業を実現します。
まとめ
今回は、GISの土台となるiDesktopXのデータ管理機能について解説しました。**「ワークスペース > データソース > データセット」**という階層構造と、ファイル、データベース、Webサービスといった多様なデータソースへの対応力が、iDesktopXの柔軟で堅牢なデータ管理基盤を支えています。この構造を理解することが、GISを使いこなすための第一歩です。
次回は、**第4回「リアルタイムデータをGISで扱う!iDesktopXのストリーミングデータ管理」**をお届けします。IoTデバイスから送られてくる位置情報などを、地図上でリアルタイムに可視化する機能をご紹介します。お楽しみに!
付録:サンプルコード(Python)
iDesktopXのPython IDEを使って、新しいデータソースとデータセットを作成する基本的なコードです。
Python
# -*- coding: utf-8 -*-
from PySuperMap import *
def manage_data_sample():
"""
データソースとデータセットをプログラムで作成・管理するサンプル
"""
try:
# 現在のワークスペースを取得
workspace = Workspace()
# 1. 新しいファイルベースのデータソースを作成
datasource_name = "Minato_Data"
# UDBX形式でデータソースを作成するための接続情報を設定
conn_info = DatasourceConnectionInfo()
# 出力パスはご自身の環境に合わせて変更してください
conn_info.set_server(r"D:\gis_data\Minato_Data.udbx")
conn_info.set_engine_type(EngineType.UDBX)
# 同じ名前のデータソースがなければ作成
if workspace.get_datasources().get_item(datasource_name) is None:
datasource = workspace.get_datasources().create(conn_info)
if datasource is not None:
print(f"データソース '{datasource.alias}' を作成しました。")
else:
print("データソースの作成に失敗しました。")
return
else:
datasource = workspace.get_datasources().get_item(datasource_name)
print(f"データソース '{datasource.alias}' は既に存在します。")
# 2. 新しいポリゴンデータセットを作成
dataset_name = "Parks"
# 同じ名前のデータセットがなければ作成
if datasource.get_datasets().get_item(dataset_name) is None:
dataset_info = DatasetVectorInfo()
dataset_info.set_name(dataset_name)
dataset_info.set_type(DatasetType.REGION) # REGIONはポリゴンを意味します
dataset = datasource.get_datasets().create(dataset_info)
if dataset is not None:
print(f"データセット '{dataset.name}' を作成しました。")
else:
print("データセットの作成に失敗しました。")
return
else:
dataset = datasource.get_datasets().get_item(dataset_name)
print(f"データセット '{dataset.name}' は既に存在します。")
# 3. データセットにフィールドを追加
field_name = "Park_Name"
if dataset.get_field_infos().get_index(field_name) < 0:
field_info = FieldInfo(field_name, FieldType.TEXT)
field_info.set_max_length(100)
dataset.add_field(field_info, True)
print(f"フィールド '{field_name}' を追加しました。")
else:
print(f"フィールド '{field_name}' は既に存在します。")
except Exception as e:
print(f"エラーが発生しました: {e}")
if __name__ == '__main__':
manage_data_sample()
コメント
コメントを投稿