すべてのプロダクト
Search
ドキュメントセンター

PolarDB:境界ボックスの計算

最終更新日:Jul 01, 2024

軌道およびジオメトリを含む軌道関連オブジェクトの計算は複雑である。 キューブは、これらの軌道関連オブジェクトよりも計算が容易であり、クエリを記述したり、計算操作を単純化したりするために使用できます。

BoxNDFデータ型は、キューブを記述するために使用されます。

BoxNDFオブジェクトは、x、y、z、tの4つの座標軸上の最小値と最大値で表される多次元の時空間立方体です。 z軸は空間を表し、t軸は時間を表す。 キューブは、異なる軸を含み得る。 例えば、立方体は、x軸およびy軸を含むことができ、またはx軸、y軸、z軸、およびt軸を含むことができる。

クエリを実行するときに、軌跡またはジオメトリの境界ボックスを使用してクエリを容易にすることができます。 次の図は、x軸、y軸、およびt軸上を移動するオブジェクトの軌道と境界ボックスを示しています。 Bounding box

Ganosの軌道モジュールでは、BoxNDFデータ型を使用して境界ボックスを示します。 軌道またはジオメトリの境界ボックスを計算できます。 特定の期間内の軌道またはジオメトリの境界ボックスを抽出することもできます。

  • ジオメトリのバウンディングボックスを抽出する場合は、2000-01-01 00:00:10 ~ 2000-01-01 02:13:20などの時間範囲をバウンディングボックスにアタッチすることもできます。 geom ASとの

    WITH geom AS(
        SELECT ('POLYGON((12.7243236691148 4.35238368367118,12.9102992732078 1.49748113937676,12.5926592946053 1.67643963359296' ||
                ',12.0197574747333 3.19258554889152,12.7243236691148 4.35238368367118))')::geometry a )
    SELECT ST_MakeBox(a),ST_MakeBox(a,'2000-01-01 00:00:10'::timestamp, '2000-01-01 02:13:20'::timestamp) from geom;
  • 軌道の境界ボックスを抽出できます。 特定の期間内の軌道の境界ボックスを抽出することもできます。

    With traj AS (
        Select ST_makeTrajectory(
            'STPOINT', 
            'LINESTRING(0 0, 50 50, 100 100)'::geometry,
            tsrange('2000-01-01 00:00:00'::timestamp, '2000-01-01 00:01:40'::timestamp),
            '{"leafcount":3,
                "attributes":{
                    "velocity": {"type": "integer","length": 2,"nullable" : true,"value": [120,130,140]}, 
                    "accuracy": {"type": "float", "length": 4, "nullable" : false,"value": [120,130,140]}, 
                    "bearing": {"type": "float", "length": 8, "nullable" : false,"value": [120,130,140]}, 
                    "acceleration": {"type": "string", "length": 20, "nullable" : true,"value": ["120","130","140"]},
                    "active": {"type": "timestamp","nullable" : false,"value": ["Fri Jan 01 11:35:00 2010", "Fri Jan 01 12:35:00 2010", "Fri Jan 01 13:30:00 2010"]}
                }, "events": [{"2" : "Fri Jan 02 15:00:00 2010"}, {"3" : "Fri Jan 02 15:30:00 2010"}]
              }') a )
    SELECT ST_MakeBox(a), ST_MakeBox(a,'1999-12-31 23:00:00'::timestamp, '2000-01-01 00:00:30'::timestamp) from traj;

複雑なシナリオでは、軌道を処理するには次の手順が必要です。

  1. 軌道の境界ボックスに基づいて、無関係なデータを除外します。

  2. 残りのデータを細かい粒度で処理する。

たとえば、最長共通サブシーケンス (LSSS) の類似性を計算することによって、入力軌道に類似するデータセット内の軌道を見つける必要があります。 入力軌道とデータセット内のすべての軌道との間のLCSSの類似度を直接計算し、それらをソートすると、大量のデータが計算に関与します。

入力軌道に類似する軌道は、入力軌道のバウンディングボックスと交差するか、または一定の距離内に位置する必要があると仮定する。 結果を取得するには、前述の要件を満たす軌道と入力軌道の間の類似度を計算するだけです。

  • 入力軌道に類似する軌道は、入力軌道の境界ボックスと交差する。

    -- Set the spatial reference identifier (SRID) of the trajectories to 4326.
    UPDATE trajectory_table SET traj = ST_SetSRID(traj,4326) WHERE ST_SRID(traj)!=4326;
    
    With query AS (
      SELECT '{"trajectory":{"version":1,"type":"STPOINT","leafcount":3,"start_time":"2020-04-11 17:42:30","end_time":"2020-04-11 17:45:00","spatial":"SRID=4326;LINESTRING(114.35 39.28 4,114.36 39.28 4,114.35 39.29 4)","timeline":["2020-04-11 17:42:30","2020-04-11 17:43:30","2020-04-11 17:45:00"],"attributes":{"leafcount":3,"intensity":{"type":"integer","length":4,"nullable":true,"value":[80,30,50]}}}}'::trajectory q)
    SELECT ST_lcsDistance(traj, q, 500), trajectory_table.* FROM trajectory_table, query WHERE traj && q ORDER BY ST_lcsDistance(traj, q, 500);
  • 入力軌道と同様の軌道から入力軌道の境界ボックスまでの空間距離は500メートル未満であり、時間距離は1時間未満である。

    -- Set the SRID of the trajectories to 4326.
    UPDATE trajectory_table SET traj = ST_SetSRID(traj,4326) WHERE ST_SRID(traj)!=4326;
    
    With query AS (
      SELECT '{"trajectory":{"version":1,"type":"STPOINT","leafcount":3,"start_time":"2020-04-11 17:42:30","end_time":"2020-04-11 17:45:00","spatial":"SRID=4326;LINESTRING(114.35 39.28 4,114.36 39.28 4,114.35 39.29 4)","timeline":["2020-04-11 17:42:30","2020-04-11 17:43:30","2020-04-11 17:45:00"],"attributes":{"leafcount":3,"intensity":{"type":"integer","length":4,"nullable":true,"value":[80,30,50]}}}}'::trajectory q)
    SELECT ST_lcsDistance(traj, q, 500), trajectory_table.* FROM trajectory_table, query WHERE traj && ST_ExpandTemporal(ST_ExpandSpatial(ST_MakeBox(q), 500/110000), 3600) ORDER BY ST_lcsDistance(traj, q, 500);
    説明
    • ST_Buffer関数を呼び出して軌道を処理する場合、traj列のインデックスは使用できません。 qを展開して、qのバウンディングボックスを対応する距離だけ拡張する必要があります。

    • 軌道は経度と緯度を使用します。 経度と緯度に基づいて500メートルを表現する必要があります。 赤道では、経度は緯度と同じで、約110キロメートルです。 1時間は3,600秒です。

バウンディングボックスの一般的な交差演算子:

演算子

説明

&&

2つのオブジェクトの境界ボックスは、2次元 (x,y) で交差します。

&/&

2つのオブジェクトの境界ボックスは、3次元 (x、y、z) で交差します。

&#&

2つのオブジェクトの境界ボックスは、2次元 (x,y) と時間 (t) で交差します。

&/#&

2つのオブジェクトの境界ボックスは、3次元 (x、y、z) と時間 (t) で交差します。

演算子は、軌道、ジオメトリ、およびBoxNDFオブジェクトによってサポートされます。

演算子を使用する場合は、以前に作成したインデックスを使用できます。 たとえば、traj_col列のインデックスを作成する場合、traj_col && ST_MakeEnvelope(0,0、1,1) を使用すると、インデックスを使用してクエリを高速化できます。

説明

ST_Buffer(traj_col) などの他の操作がtraj_col列で実行された場合、作成されたインデックスはST_Buffer(traj_col)&&ST_MakeEnvelope(0,0、1,1) に使用できません。