【第25回】iDesktopXを自分仕様に!カスタム開発入門

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

「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、第25回です。前回は、3D地図をサクサク動かすための「パフォーマンス最適化」について学びました。今回は、iDesktopXを単なる既製ソフトウェアとして使うだけでなく、皆様の業務に完全にフィットした「自分だけのGIS」へと進化させる「カスタム開発」の世界への扉を開きます。


【第25回】iDesktopXを自分仕様に!カスタム開発入門


1. なぜカスタム開発が必要か?

iDesktopXは非常に高機能なGISソフトウェアですが、世の中のあらゆる業務に100%対応できるわけではありません。カスタム開発を行うことで、以下のような課題を解決できます。

(1) 定型業務の完全自動化: 毎日繰り返すデータチェックや変換作業など、組織独自のワークフローを自動化する専用ツールを作成したい。

(2) 専門分野に特化した機能: 標準機能にはない、特定の業界(例:不動産、林業、電力)で使われる特殊な計算や分析機能を追加したい。

(3) 他システムとの連携: 社内の基幹システムやデータベースとGISを直接連携させたい。

(4) UIの簡素化: GIS専門家ではないユーザー向けに、業務で使う機能だけをまとめたシンプルな操作画面を作りたい。

図25-1 GISソフトウェアをベースに独自のツールやUIを構築するカスタム開発のイメージ


2. iDesktopXのカスタマイズアプローチ

iDesktopXでは、ユーザーのスキルレベルや目的に応じて、複数のカスタマイズアプローチが用意されています。

(1) UIのカスタマイズ(ノンコーディング)

驚くべきことに、iDesktopXのリボンメニューやツールバー、右クリックメニューといったUI要素の多くは、XML形式の設定ファイルで定義されています。つまり、プログラミングの知識がなくても、この設定ファイル(*.config)をテキストエディタで編集するだけで、

* ① ボタンの表示/非表示を切り替える

* ② ボタンの配置や順序を変更する

* ③ 新しいタブやグループを作成する

といったカスタマイズが可能です。これにより、特定の業務に不要なボタンを隠して、初心者にも使いやすいシンプルなUIを簡単に作成できます。

(2) 機能拡張(コーディング)

新しい機能そのものを追加したい場合は、プログラミングによる機能拡張(アドイン開発)を行います。iDesktopXは、主に2つの言語をサポートしています。

① Java: iDesktopXのコア言語であり、パフォーマンスが求められる高度な機能や、独自のUIパネル、複雑な処理を行うためのアドイン開発に適しています。SuperMapが提供する豊富なGISコンポーネント(SuperMap iObjects)の全機能にアクセスできます。

② Python: データサイエンスや自動化の分野で広く使われているPythonは、iDesktopXでも強力な開発言語です。特に、データ処理や空間解析のスクリプト作成、そして後述する「カスタムツール」の開発に最適です。iDesktopXには専用のPython IDEも内蔵されています。


3. Pythonによる二次開発の魅力

GISユーザーにとって、特にPythonによる開発は非常に魅力的です。

(1) 内蔵Python IDE:

iDesktopXには、コードの記述、実行、デバッグが可能なPython開発環境が統合されています。これにより、外部のエディタを別途用意することなく、スムーズに開発を始めることができます。

(2) カスタムツールの作成:

Pythonで作成した独自の処理スクリプトを、iDesktopXの標準ツールと同様に「ツールボックス」に登録することができます。作成したカスタムツールは、

* ① ツールボックスから直接実行できる

* ② 第17回で紹介した「プロセスオートメーション」のモデルに組み込める

* ③ リボンメニューのボタンに割り当ててワンクリックで実行できる

といった利点があり、組織内のGIS利用の幅を大きく広げます。


まとめ

今回は、SuperMap iDesktopXが単なる既製のGISソフトウェアではなく、ユーザーのニーズに合わせて成長させることができる柔軟な「プラットフォーム」であることをご紹介しました。設定ファイルの編集による簡単なUIカスタマイズから、JavaやPythonを使った本格的な機能拡張まで、iDesktopXはあらゆるレベルのカスタム開発に対応しています。これにより、汎用的なGISを、皆様の業務に特化した最強の専用ツールへと進化させることが可能です。

次回は、シリーズ最終回**第26回「作戦司令図を描く!2D/3Dダイナミックプロット」**です。防衛、防災、警察などの分野で使われる、特殊なシンボルを用いた状況図作成機能について解説します。お楽しみに!


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

iDesktopXのツールボックスに追加できる「カスタムツール」をPythonで作成する際の構造的なサンプルコードです。ここでは、入力されたポリゴンレイヤーの各ポリゴンに対して面積(ヘクタール単位)を計算し、新しいフィールドに結果を書き出すツールを想定しています。

Python


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

# SuperMap iObjects PythonのToolBaseをインポートする必要があります
# (これは概念的なコードであり、実際のカスタムツール開発では
# SuperMapが提供する特定のテンプレートに従います)

class CalculateAreaInHectaresTool:
    """
    ポリゴンの面積をヘクタール単位で計算するカスタムツールの概念的な例
    """
    def __init__(self):
        self.name = "面積計算(ヘクタール)"
        self.description = "選択されたポリゴンデータセットの面積を計算し、'Area_ha'フィールドに追加します。"

    def get_parameter_info(self):
        """
        ツールのパラメータ(入力・出力)を定義する
        """
        return [
            {
                'name': 'input_dataset',
                'displayName': '入力ポリゴンデータセット',
                'direction': 'Input',
                'dataType': 'Dataset',
                'datasetType': ['Region'] # ポリゴンデータセットのみ
            },
            {
                'name': 'output_dataset',
                'displayName': '出力データセット',
                'direction': 'Output',
                'dataType': 'Dataset'
            }
        ]

    def execute(self, parameters):
        """
        ツールの本体となる処理
        """
        try:
            # パラメータから入力データセットを取得
            input_dataset = parameters['input_dataset'].value
            print(f"処理対象: {input_dataset.name}")

            # 1. 新しいフィールド'Area_ha'を追加
            field_name = "Area_ha"
            field_info = FieldInfo(field_name, FieldType.DOUBLE)
           
            # 既存のフィールドをチェックし、なければ追加
            if input_dataset.get_field_infos().get_index(field_name) < 0:
                input_dataset.add_field(field_info, True)
                print(f"フィールド '{field_name}' を追加しました。")

            # 2. レコードセットをループして面積を計算
            recordset = input_dataset.get_recordset(False, CursorType.DYNAMIC)
            recordset.move_first()
           
            while not recordset.is_eof():
                recordset.edit()
               
                geometry = recordset.get_geometry()
                if geometry is not None:
                    # 面積を平方メートル単位で取得し、ヘクタールに変換 (1ha = 10000 m^2)
                    area_sqm = geometry.get_area()
                    area_ha = area_sqm / 10000.0
                   
                    # 計算結果をフィールドに書き込み
                    recordset.set_value(field_name, area_ha)
                    recordset.update()
               
                recordset.move_next()
           
            recordset.dispose()
            print("面積計算が完了しました。")
           
            # 出力パラメータに結果を設定 (この例では入力データを直接変更)
            parameters['output_dataset'].value = input_dataset

        except Exception as e:
            print(f"エラーが発生しました: {e}")
            raise e

# このコードはiDesktopXのツールボックスフレームワーク内で実行されることを想定しています

コメント

このブログの人気の投稿

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

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

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