2017-06-25 2 views
1

私は、運動学的データのテーブル(船舶からの位置報告)を持っています。表は、以下の行を有する:AISデータセットに基づいて各船の軌道を計算する

row name: type:    Description: 
timestamp double precision timestamp in UNIX epochs (seconds from 1/1/1970) 
type  integer    AIS message type 
mmsi  integer    MMSI identifier for vessel 
status  integer    Navigational status 
lon   double precision Longitude (georeference: WGS 1984) 
lat   double precision Latitude (georeference: WGS 1984) 
heading  integer    True heading in degrees (0-359), relative to true north 
turn  double precision Rate of turn, right or left, 0 to 720 degrees per minute 
speed  double precision Speed over ground in knots (allowed values: 0-102.2 knots) 
course  double precision Course over ground (allowed values: 0-359.9 degrees). 

Iは、データをインポートした後、私は1つの以上の経度を用いて形成されたタイプの幾何学的形状の行、緯度と、タイムスタンプ列を追加した:

SELECT AddGeometryColumn ('public', 'gis_may', 'geom_time', 4326, 'POINTZ', 3); 
UPDATE public.gis_may SET geom_time = ST_Transform(ST_SetSRID(ST_MakePoint(lon, lat, gis_may.timestamp), 4326),4326); 

Iを計算しなければなりませんこのデータに基づいて各船の軌道を計算します。私は以下のコード使用してみました:

CREATE TABLE ship_trajectories AS SELECT st_makeline(st_setsrid(st_makepoint(lon::REAL, lat::REAL, gis_may.timestamp), 4326)) as traj 
FROM gis_may 
GROUP BY mmsi; 

を...しかし、問題は、このコードはのみ、各船の座標に基づいてのみ、1ラインストリング/軌道を返し、考慮に船が動いて停止時間を取ることはありません、です。

この解決方法は次の行を使用していると思います。status(私は検索して、どのようなナビゲートステータスが:https://help.marinetraffic.com/hc/en-us/articles/203990998-What-is-the-significance-of-the-AIS-Navigational-Status-Values-)を使用しています。 statusが0の場合は船が移動していることを意味し、1の場合は軌道を形成しないように固定されていることを意味します。

答えて

0

私は同じ問題を解決するプロジェクトに取り組んできました。最初にすべてのAISポイントを調べて軌道の折れ点を決定しました。 AIS変数statusがあなたの目的に十分であると思うなら、あなたには良いことです。ステータスの各インスタンスが0に変わるのを確認できます.AISデータには他のステータス値もあります。 thisを参照してください。

船がステータス1からステータス0に移行したときに、各mmsi内でその行に印をつけたいとしたら、これで軌跡の区切り点が作成されます。最初gis_point呼ばポイントジオメトリとしてあなたの経度・緯度の配位を追加した後にこれを見て:

-- Make a point geometry and work with those. 
SELECT AddGeometryColumn('public', 'gis_may', 'gis_point', 4326, 'POINT', 2); 
UPDATE gis_may SET gis_point = ST_Transform(ST_SetSRID(
       ST_MakePoint(longitude, latitude), 
       4326), 4326); 

-- Look ahead to keep stuff within the same mmsi. Create a switch for when the status changes: 
CREATE TABLE lookahead AS 
SELECT aislag.mmsi, aislag.timestamp1, aislag.gis_point, EXTRACT(EPOCH FROM (aislag.ts2 - aislag.ts1)) AS timediff, aislag.g, 
     CASE WHEN aislag.status = '1' AND aislag.newstatus ='0' THEN 'Start' ELSE '.' END AS newtrajectory 
FROM 
    (SELECT mmsi, timestamp as timestamp1, status, gis_point, 
      LEAD(mini_c.timestamp) OVER (ORDER BY mmsi, timestamp) AS timestamp2, 
      LEAD(mini_c.mmsi) OVER (ORDER BY mmsi, timestamp) AS mmsi2, 
      mini_c.status AS status, 
      LEAD(mini_c.status) OVER (ORDER BY mmsi, timestamp) AS newstatus 
    FROM mini_c) AS aislag 
    WHERE aislag.mmsi = aislag.mmsi2 

私はあまりにも遅れ時間変数を追加しました。たぶん、同じ船舶の次のAISポイントとの時間差が観測されるように、ステータススイッチャーを拡大したいと思うかもしれません。区切り記号があるので、lookaheadの行に新しいidを作成して、mmsi, tsをソートします。次に、新しいテーブルtrajectoriesidのペアでid1id2とし、lookahead WHERE newstatus = 'Start'の遅れた選択から、ステータスのスイッチ間の各距離の行を取得します。そのテーブルには、基本的に観測としての軌道があります。ルックアヘッドに参加すると、WHERE newid BETWEEN trajectories.is1 AND trajectories.id2GROUP BY mmsiを使用して、ST_Makeline(gis_point)で三角形ごとにライン・ジオメトリを作成できます。

すべてのコードを書き留めていないと申し訳ありません。

さらに進んだアプローチは、実際のAISデータを使用して、各船が長い時間静止しているように見えるように、各mmsiの経時的な平均速度と距離の平均を調べることです。軌道の区切り記号を区別する上のロジックは、同じ方法で適用されるだけで、statusのAIS変数スイッチは船の行動パターンの計算に交換されます。

運が良かった

関連する問題