8 位置追跡サーバー

Oracle Spatial and Graphの位置追跡サーバーを使用すると、地域を定義し、オブジェクトのその地域への移動またはその地域からの移動を追跡して、特定の移動があると通知を受信できます。

位置追跡PL/SQLサブプログラムのリファレンス情報については、「SDO_TRKRパッケージ(位置追跡)」を参照してください。

8.1 位置追跡サーバーについて

生活の中で位置の重要性が増し、位置検出デバイスがいたる所に存在するようになるにつれ、アプリケーションで利用者の位置データを継続的にモニターする需要が高まっています。位置データのモニターの結果、システムでアラートが生成されることがあります。

たとえば、運送会社で、指定されたルートを通って目的地に移動する10,000台のトラックのネットワークをモニターするとします。指定した範囲のルート内のトラックの移動を追跡し、想定したルートから外れたトラックを検出した場合に通知を生成します。プロアクティブなロケーションベース・サービス(LBS)とは一般に、指定した地域内または地域外の利用者の位置を追跡して、ロケーションベースの広告や友人が近くにいることを知らせるなどの様々な用途に利用するアプリケーションのことです。

Oracle Spatial and Graphの位置追跡サーバーでは、次のものが提供されます。

  • PL/SQLインタフェースを介してデータベース内で位置追跡ネットワークを設定するための単純なフレームワーク

  • 追跡ネットワーク内のオブジェクトの位置を継続的にモニターするためのAPI

  • Oracle Advanced Queuingを使用した、着信の位置の更新や追跡リクエストおよび発信の関連通知のためのキューイング・メカニズム

  • データベース内の何千もの関連オブジェクトのための効率的で継続的な位置モニター

8.2 位置追跡セット

位置追跡サーバーは、移動する一連のオブジェクトを既知の地域セットについて追跡し、必要に応じて通知を生成します。このフレームワークでは、オブジェクトと地域のセットは追跡セットと呼ばれます。

データベースでは、これらは次の2列で構成される表で管理されます。

region_id  NUMBER, 
geometry   SDO_GEOMETRY

REGION_IDはこの表の主キーで、GEOMETRYは追跡地域のジオメトリです。

追跡セットを作成すると、いくつかの追加構造が作成されます。追跡セットはいくつでも作成でき、各セットには数千の地域を指定できます。地域が追跡の対象でなくなった場合、追跡地域表から削除します。

追跡するオブジェクトのセットを作成する必要もあります。各オブジェクトには、オブジェクトのIDと、そのオブジェクトが追跡される地域を示す地域IDを指定する必要があります。つまり、各オブジェクトは1つ以上の追跡地域について追跡できるということです。オブジェクトは、トラッカ・メッセージTRACKER_MSGを追跡キューに挿入して作成します。

トラッカ・メッセージ・オブジェクトにはobject_idregion_idおよびoperationを指定します。operationパラメータは次のいずれかの文字列値をとります。

  • I: object_idで定義されているオブジェクトが、region_idで定義されている地域を移動するたびに通知メッセージが発行されます。

  • O: object_idで定義されているオブジェクトが、region_idで定義されている地域を移動するたびに通知メッセージが発行されます。

  • T: object_idで定義されているオブジェクトが、region_idで定義されている地域の内から外に、または外から内に遷移した場合にのみ通知メッセージが発行されます。

  • D: region_idで定義されている地域内でのobject_idで定義されているオブジェクトの追跡を無効にします。このオブジェクトの追跡を再度有効にするには、別の追跡メッセージを送信する必要があります。

オブジェクトを作成して追跡地域を構成すると、そのオブジェクトの新しい位置メッセージを送信できます。オブジェクトが移動するにつれて、位置が変わります。新しい位置メッセージが送信されるたびに、位置メッセージ・キューに挿入され、位置追跡サーバーで処理されます。位置メッセージが処理され、必要に応じて通知メッセージが生成されます。アプリケーションでは、通知キューをモニターし、新しい通知が生成されるたびに通知メッセージを処理できます。

ユーザーが位置追跡サーバーを実行するには、次の追加権限が必要です。

GRANT aq_administrator_role, create job, manage scheduler to <USER>; grant execute on dbms_aq to <USER>; 
GRANT execute on dbms_aqadm to <USER>;
GRANT execute on dbms_lock to  <USER>;
GRANT execute on dbms_aqin to  <USER>;
GRANT execute on dbms_aqjms to <USER>; 

8.3 位置追跡サーバー用のデータ型

位置追跡に関連付けられているPL/SQLサブプログラムは、位置追跡サーバーに固有のデータ型のパラメータをとります。

これらのサブプログラムについては、「SDO_TRKRパッケージ(位置追跡)」を参照してください。固有のデータ型の定義は次のとおりです。

  • LOCATION_MSG

    (object_id INTEGER, 
     time      TIMESTAMP, 
     x         NUMBER, 
     y         NUMBER) 
    
  • LOCATION_MSG_ARR

    VARRAY(1000) of location_msg
  • LOCATION_MSG_PKD

    object(arr location_msg_arr)
  • NOTIFICATION_MSG

    (object_id INTEGER, 
     region_id INTEGER, 
     time      TIMESTAMP,
     x         NUMBER,
     y         NUMBER,
     state     VARCHAR2(8))
    
  • PROC_MSG

    (object_id  INTEGER, 
     time       TIMESTAMP, 
     x          NUMBER, 
     y          NUMBER, 
     region_id  INTEGER,
     alert_when VARCHAR2(2)) 
    
  • PROC_MSG_ARR

    VARRAY(1000) of proc_msg
  • PROC_MSG_PKD

    object(arr proc_msg_arr)
  • TRACKER_MSG

    (object_id INTEGER,
     region_id INTEGER,
     operation VARCHAR2(2)) 
    

8.4 位置追跡サーバー用のデータ構造

位置追跡サーバーを使用する場合、サーバーの作成時にユーザーが追跡セット名を指定する必要があります。この名前に基づき、追加データ構造が作成されます。

  • <TS_NAME>_TRACKING_REGIONS (region_id NUMBER, geometry MDSYS.SDO_GEOMETRY)は、追跡セット<TS_NAME>で定義されている追跡地域ポリゴンが格納される表です。サーバーの作成後、ユーザーはポリゴンをこの表に挿入する必要があります。ポリゴンはすべて、測地(SRID8307を使用)であり、2次元である必要があります。この表では、主キーがREGION_ID列に定義されています。

  • <TS_NAME>_TRACKER (object_id NUMBER, region_id NUMBER, queue_no NUMBER, alert_when VARCHAR2(2))は、エントリによってオブジェクトとそのオブジェクが追跡される地域との間の関係がマップされる表です。この表では、主キーがOBJECT_ID列およびREGION_ID列に定義されています。この表はTRACKER_MSG型を使用して管理され、ユーザーがこの表を直接更新することはありません。

  • <TS_NAME>_TRACKER_QUEUES(num_loc_queues NUMBER, num_trkr_queues NUMBER)は、サーバーで必要となるキュー情報が保持される表です。サーバーによってこの表にデータが移入され、保守されます。ユーザーがこの表を変更することはありません。

  • <TS_NAME>_TRACKER_LOG (message_level VARCHAR2(1), message VARCHAR2(512), ts TIMESTAMP WITH TIMEZONE)は、サーバーによって生成されたログ・メッセージが格納される表です。メッセージ・レベル'I'は情報メッセージであることを示し、メッセージ・レベル'E'はエラー・メッセージであることを示します。この表は、追跡セットが削除されても削除されません。ただし、同じ名前の追跡セットがその後作成されると、この表は新しい追跡セットによって切り捨てられ再利用されます。

  • <TS_NAME>_NOTIFICATIONS (object_id NUMBER, region_id NUMBER, time TIMESTAMP, x NUMBER, y NUMBER, state VARCHAR2(8))は、通知キューからのメッセージを格納するためにユーザーに提供される補助表です。この表の列のレイアウトは、NOTIFICATION_MSG型のレイアウトと一致します。X列とY列は、その時点のregion_id内のobject_idに関する通知を求めた座標です。STATE列は、ポイントが地域の内(INSIDE)か外(OUTSIDE)かを示します。追跡タイプINSIDEおよびOUTSIDEの場合、この値は変化しません。追跡タイプTRANSITIONの場合、この列は通知が生成された時点でのオブジェクトの状態を示します。

  • <TS_NAME>_TRAJECTORYは、位置追跡サーバーで現在使用されていない補助表です。

これらの表以外に、位置追跡サーバーでは、位置、追跡および通知のメッセージを管理するために、アドバンスト・キューイング(AQ)オブジェクトのセットも作成されます。すべてのキューには、<TS_NAME>_TRACKER_Q_1や<TS_NAME>_LOCATION_Q_1など、接頭辞<TS_NAME>が付きます。

8.5 位置追跡サーバー用のワークフロー

一般的な位置追跡ワークフローには複数の操作が含まれており、必須の操作もあれば、オプションの操作もあります。

一般的なワークフローは、いくつかのステップで構成されます。

  1. 追跡セットを作成します。

  2. 必要に応じて、作成した追跡セット表を表示します。

  3. 追跡セットを起動します。

  4. 必要に応じて、追跡セットで使用されるキューを表示します。

  5. 必要に応じて、追跡セットで使用されるスケジューラ・ジョブを表示します。

  6. 様々な地域のポリゴンを挿入します。

  7. 追跡するオブジェクト/地域ペアを作成します。

  8. 必要に応じて、追跡セット内のオブジェクト/地域ペアを表示します。

  9. 位置メッセージを送信します。

  10. 必要に応じて、送信済の位置メッセージを表示します。

  11. 通知メッセージを通知表にデキューします。

  12. 必要に応じて、追跡サーバーのオブジェクト/地域ペアを無効にします。

  13. 追跡セットを停止します。

  14. 追跡セットを削除します。

位置追跡サーバー・ワークフローの単純な例を次に示します。

例8-1 位置追跡サーバーのワークフロー

-- Create a tracking set named sample with one tracker/process
-- queue pair and one location queue.
EXEC sdo_trkr.create_tracking_set('sample', 1, 1);

-- Optional: Show the tracking sets tables that were created
SELECT table_name 
FROM user_tables 
WHERE table_name LIKE ‘SAMPLE%’
ORDER BY table_name;

TABLE_NAME
----------------------
SAMPLE_LOCATION_QT_1    - AQ queue table for location queue
SAMPLE_NOTIFICATIONS    - Auxiliary table to store notification messages
SAMPLE_NOTIFICATION_QT  - AQ queue table for the notification queue 	
SAMPLE_PROC_QT_1        - AQ queue table for the process queue
SAMPLE_TRACKER          - Table, will contain object-region tracking pairs
SAMPLE_TRACKER_LOG      - Table, contains log messages from the server 
SAMPLE_TRACKER_QT_1     - AQ queue table for the tracker queue
SAMPLE_TRACKER_QUEUES   - Table, contains tracking sets queue metadata
SAMPLE_TRACKING_REGIONS - Table, will contain the regions geometry
SAMPLE_TRAJECTORY       - Table, currently unused

-- Start the tracking set
EXEC sdo_trkr.start_tracking_set(‘sample’);

-- Optional: Show the queues used by the tracking set
SELECT name
FROM user_queues
WHERE name LIKE 'SAMPLE%'
ORDER BY name;

NAME
---------------------
SAMPLE_LOCATION_Q_1
SAMPLE_NOTIFICATION_Q
SAMPLE_PROC_Q_1
SAMPLE_TRACKER_Q_1

-- Optional: Show the scheduler jobs used by the tracking set
SELECT job_name, state 
FROM user_scheduler_jobs 
WHERE job_name LIKE 'SAMPLE%'
ORDER BY job_name;

JOB_NAME	    STATE
--------------------------
SAMPLE_LOC_JOB_1   RUNNING
SAMPLE_TRKR_JOB_1  RUNNING


-- Insert a polygon for region 1. This polygon must be geodetic (using SRID 8307) 
-- and two dimensional. The region may also be a multi-polygon.
INSERT INTO SAMPLE_TRACKING_REGIONS VALUES (1,
  MDSYS.SDO_GEOMETRY(2003, 8307, null,
    sdo_elem_info_array(1, 1003, 1),
    sdo_ordinate_array(0,0, 5,0, 5,5, 0,5, 0,0)));
-- Create two objects, object 1 and 2 that are tracked in region 1.
-- Object 1 sends notification messages when it is inside region 1. 
-- Object 2 sends notification messages when it is outside region 1.
EXEC sdo_trkr.send_tracking_msg(
  'SAMPLE', mdsys.tracker_msg(1, 1, 'I'));
EXEC sdo_trkr.send_tracking_msg(
  'SAMPLE', mdsys.tracker_msg(2, 1, 'O'));
-- Optional: Show the object-region pairs used in the tracking set
SELECT object_id, region_id, alert_when  FROM sample_tracker;

OBJECT_ID  REGION_ID  ALERT_WHEN
---------- ---------- -----------
     1	         1        I
     2	         1        O

-- Send 2 location messages.
–- Object 1 moves to (1, 1).
–- Object 2 moves to (8, 8).
EXEC sdo_trkr.send_location_msgs('SAMPLE',
  mdsys.location_msg_arr(
    mdsys.location_msg(1, '01-AUG-16 01.01.46.000000 PM', 1, 1),
    mdsys.location_msg(2, '01-AUG-16 01.02.46.000000 PM', 8, 8)));

-- Optional: Show that 2 notification message were generated
SELECT a.name, b.ready
FROM user_queues a, v$aq b 
WHERE a.name='SAMPLE_NOTIFICATION_Q' AND a.qid=b.qid
ORDER BY a.name;

NAME                   READY
---------------------- ------
SAMPLE_NOTIFICATION_Q    2

-- Dequeue the notification messages into the notifications table
DECLARE
  message       mdsys.notification_msg;
BEGIN
  LOOP   
    sdo_trkr.get_notification_msg(
      tracking_set_name => 'SAMPLE', 
      message => message, 
      deq_wait =>2);	-- wait at most 2 seconds for a message

    IF (message IS NULL) THEN
      EXIT;
    END IF;

    INSERT INTO sample_notifications (
                  object_id, region_id, time, x, y, state) 
      (SELECT message.object_id, message.region_id, 
              message.time, message.x, message.y, message.state);
  END LOOP;
END;
-- Query the object id, region id, (x, y) coordinate and the objects
-- relationship to the region sorted by the time that was sent with
-- the objects location message.
SELECT object_id, region_id, x, y, state 
FROM sample_notifications 
ORDER BY time; 
OBJECT_ID  REGION_ID	X   Y   STATE
---------- ---------- --- --- -------
  1	      1	        1   1   INSIDE
  2	      1	        8   8   OUTSIDE
-- Optional: Disable the tracking server's object-region pairs
EXEC sdo_trkr.send_tracking_msg('SAMPLE', 
  mdsys.tracker_msg(1, 1, 'D'));
EXEC sdo_trkr.send_tracking_msg('SAMPLE', 
  mdsys.tracker_msg(2, 1, 'D'));
-- Stop the tracking set. This stops the tracking sets
-- queues and its scheduler jobs. Running stop_tracking_set 
-- does not delete the tables and queues used by the tracking
-- server so start_tracking_set can be rerun and all of the 
-- object and region data is still available.
-- This must be done before dropping a tracking set
EXEC sdo_trkr.stop_tracking_set('sample');

-- Drop the tracking set. This completely deletes the tracking
-- sets queues and tables. Once completed all traces of the tracking
-- set are removed except for the log table which is left intact for
-- debugging purposes. If another tracking set of the same name is
-- created the log table is truncated.
EXEC sdo_trkr.drop_tracking_set('sample');