【第4回】リアルタイムデータをGISで扱う!iDesktopXのストリーミングデータ管理

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

「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、第4回へようこそ!前回はGISの心臓部である「データ管理」について学びました。今回は少し未来的なテーマ、「ストリーミングデータ」の管理機能をご紹介します。IoTデバイスやセンサーから絶え間なく送られてくるリアルタイムデータを、iDesktopXでどのように扱えるのか見ていきましょう。


【第4回】リアルタイムデータをGISで扱う!iDesktopXのストリーミングデータ管理


1. ストリーミングデータとは?

ストリーミングデータとは、その名の通り「流れ込んでくる」データのことです。時間の経過とともに継続的に、そして大量に生成される動的なデータを指します。

私たちの身の回りでも、すでに多くのストリーミングデータが活用されています。

  • 走行中の港区コミュニティバス「ちぃばす」から送られてくるGPS位置情報

  • 区内に設置された気象・環境センサーの観測データ

  • シェアサイクルのリアルタイムな位置情報

これらのデータを地図上でリアルタイムに可視化・分析することで、交通状況の監視、防災情報の提供、効率的な都市運営など、様々なスマートシティの取り組みが実現できます。


図4-1 港区の地図上を流れるリアルタイムデータのイメージ


2. iDesktopXにおけるデータ送受信の仕組み

iDesktopXでストリーミングデータを扱うには、データを受け取るための「窓口」と、そこにデータを送り込む「送信元」が必要です。iDesktopXは、この仕組みを2つの方法で提供しています。

(1) SuperMap iServerを利用する方法

SuperMapのGISサーバー製品である「iServer」をデータの中継ハブとして利用します。iServerはWebSocketプロトコルを使用し、高速で双方向の通信を実現します。大規模なシステムや、複数のデータソースを統合して配信するような場合に強力な選択肢となります。

(2) iDesktopX内蔵のHTTP/HTTPSサービスを利用する方法

iServerのような外部サーバーを立てなくても、iDesktopX自体が簡易的なHTTP/HTTPSサーバーとして機能します。これにより、手軽にストリーミングデータの送受信テストを行ったり、小規模なシステムを構築したりすることが可能です。


図4-2 ストリーミングデータ処理のフロー

3. リアルタイムストリーミングデータの受信と可視化

これがストリーミングデータ機能のメインとなる部分です。外部から送られてくるデータをリアルタイムで受信し、地図上に表示します。

(1) 「オンライン」タブ -> 「リアルタイムストリーミングデータ」 -> 「リアルタイムストリーミングデータを受信」を選択します。

(2) 表示されるダイアログで、接続するサービスタイプ(iServerまたはHttp/Https)を選択し、サービスのアドレス(内蔵サービスの場合は http://localhost:8125 など)を入力します。

(3) データの扱い方を設定します:

① 地図に追加: このオプションをオンにすると、受信したデータが地図上にリアルタイムでプロットされ、動的に更新されていく様子を確認できます。

② データを保存: 受信したデータをローカルのデータソースに保存することも可能です。新しいデータセットとして保存するか、既存のデータセットに追加していくかを選択できます。これにより、リアルタイムデータの履歴を蓄積し、後の分析に活用できます。

(4) 設定が完了すると、iDesktopXは指定されたサービスへの接続を開始し、データが流れ込み始めます。地図上では、新しい点が表示されたり、既存の点が移動したりする様子がリアルタイムで描画されます。


4. リアルタイムストリーミングデータの送信

iDesktopXは、データを受信するだけでなく、既存のデータセットをストリームとして「送信」する機能も持っています。これは、監視システムの動作テストのためにシミュレーションデータを生成したり、他のシステムへデータを連携させたりするデモンストレーションに非常に便利です。

まとめ

今回は、iDesktopXが持つストリーミングデータ管理機能をご紹介しました。IoTやリアルタイム監視のニーズが高まる中、GISソフトウェアが標準でこのような機能を備えていることは非常に強力なアドバンテージです。iDesktopXを使えば、複雑なプログラミングなしで、リアルタイムデータの「見える化」をすぐに始めることができます。

次回は、**第5回「地図データは描いて編集!オブジェクト操作の基本」**です。地図上の点、線、ポリゴンといった図形(オブジェクト)を描画したり、その形状を編集したりするための基本的なツールについて詳しく解説します。お楽しみに!


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


iDesktopXのストリーミングサービス(HTTP/TCP)にデータを送信するクライアント側の簡単なPythonスクリプトの例です。ご自身のPCでこのスクリプトを実行し、iDesktopXで受信することで、リアルタイムデータ連携を手軽に試すことができます。

Python

import socket

import json
import time
import random

# iDesktopXのHTTP/TCPサービスがリッスンしているホストとポート
# iDesktopXの「リアルタイムストリーミングデータを受信」で設定した値に合わせます
HOST = '127.0.0.1'  # ローカルホスト
PORT = 8125         # デフォルトポート

def create_bus_location_data(bus_id, route_points):
    """
    港区ちぃばすのダミー位置情報を生成する関数
    """
    # ルート上のランダムな点を取得
    point = random.choice(route_points)
   
    # 実際には少しだけ位置をずらす
    lat = point[0] + (random.random() - 0.5) * 0.0005
    lon = point[1] + (random.random() - 0.5) * 0.0005
   
    # iDesktopXが解釈できるGeoJSON形式のデータを作成
    data = {
        "type": "Feature",
        "geometry": {
            "type": "Point",
            "coordinates": [lon, lat]
        },
        "properties": {
            "busID": bus_id,
            "speed_kmh": random.randint(15, 30),
            "timestamp": time.time()
        }
    }
    # JSON文字列に変換し、末尾に改行を追加(TCPストリームの区切り)
    return json.dumps(data) + '\n'

def send_data():
    """
    ソケット通信でデータを送信する
    """
    # 芝ルートの簡単なダミー座標リスト(東京タワー -> 芝公園駅 -> 虎ノ門ヒルズ)
    shiba_route = [
        (35.6586, 139.7454), (35.6558, 139.7483), (35.6601, 139.7491),
        (35.6660, 139.7496), (35.6698, 139.7498)
    ]

    # TCPソケットを作成
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        try:
            s.connect((HOST, PORT))
            print(f"{HOST}:{PORT} に接続しました。")
           
            print("ちぃばす(芝ルート)の仮想運行を開始します...")
            # 60回分のデータを2秒ごとに送信
            for i in range(60):
                message = create_bus_location_data("Shiba-Route-Bus01", shiba_route)
               
                # UTF-8でエンコードして送信
                s.sendall(message.encode('utf-8'))
                print(f"送信: {message.strip()}")
                time.sleep(2) # 2秒待機
               
        except ConnectionRefusedError:
            print(f"接続に失敗しました。iDesktopXでストリーミングデータ受信が開始されているか確認してください。")
        except Exception as e:
            print(f"エラーが発生しました: {e}")
        finally:
            print("接続を終了します。")

if __name__ == '__main__':
    send_data()

コメント

このブログの人気の投稿

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

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

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