マップマッチングGPSは道路網をポイントします!


11

私はPostgresとPostGISを初めて使います。

GPSポイントの単純なマップマッチング(または、必要に応じてパス推論)を試みています。私はpostgres(postgis)を使用しています。

データベースにGPSポイントを含むテーブルがあります: gpspoints(緯度、経度、時間、速度、方位角、ジオメトリ、...)

道路ネットワークのシェープファイルもデータベースにインポートしました: ルート(gid、idrte、version、nomrte、norte、clsrte、geomなど)-リンクの方位角がありません。 postgis関数ST_azimuthを使用してどのように計算できるかわかりません。私が持っているのは、上記の列を含む道路網のシェープファイルだけです。

リンクの方向がGPSポイントの方位角(+または-15度)と一致する場合にのみ、各GPSポイントを(ポイントの周りの20メートルのバッファー内の)最も近いリンクに関連付けて、投影された位置を取得します。それ以外の場合、許容可能な方位角を持つ20メートルのバッファー内で、NEXTの最も近いリンクを検索します。(写真のように!)

投影されたGPSポイントの新しい座標を、テーブル「gpspoints」に「projectedLat」および「projectedLong」として追加する必要があります。

(下の図では、実際のポイントは方向を使用して示されていますが、投影されたポイントには方向マークがありません) ここに画像の説明を入力してください


興味深い問題です。20mバッファ内の次のポイントにも許容できない方位角がある場合、検索を続行したいと思いますか?
ジョンパウエル

はい、ジョン。ただし、20メートルのバッファーが不足している道路セグメントのみです。実際、20 mのバッファーにある道路セグメントを特定し、許容可能な方位角を持つ最も近いセグメントを見つけたいと思います。
Nader

「リンクの方位角がありません。postgis関数ST_azimuthを使用してどのように計算できるかわかりません。私が持っているのは、上記に列挙した列を含む道路網のシェープファイルだけです。」shp2pgsqlを使用して、道路をPostgres / PostGISに取り込むことができます(また、そうすべきです)。その後ST_Azimuth、使用できますが、デジタル化方向に関する方位角を伝えることに注意してください。
alphabetasoup

回答:


1

完全に解決された答えはありませんが、開始するのに十分かもしれません。これらの機能が役立つ場合があります。

ST_Line_Locate_Point()は、ラインに沿ったポイントの合計ライン長の一部として距離を提供します。ST_Line_Interpolate_Point()は、ラインに沿って(再び全長の一部として)指定された距離にあるポイントのポイントジオメトリを返します。

あなたのgpspointsに最も近いライン上の位置「new_pts」のポイントジオメトリを取得することをお勧めします(以下のサブクエリでは、WITH句として定式化されています)。次に、そのポイントを使用して、実際にライン上で最も近いポイントを見つけますが、距離はごくわずかであるため、開始点に近くなります。次に、この見つかったポイントと「new_pt」を使用して、それらの間の方位角を取得します。これは、多かれ少なかれ、その点での線の接線を表します。

次に、この角度をGPSポイントの方位角と比較して、GPSポイントを追加するかどうかを決定できます。

with new_pts AS (
    SELECT ST_ClosestPoint(geom, gpspoints) AS geompt
    FROM routes JOIN gpspoints ON ST_Distance(routes.geom, gpspoints.geom)<20
    )


SELECT ST_Azimuth(new_pts.geompt, 
    ST_Line_Interpolate_Point(routes.geom, 
        ST_Line_Locate_Point(routes.geom, new_pts.geompt)*0.999))

FROM routes JOIN new_pts ON ST_Distance(routes.geom,new_pts.geompt)<20;

繰り返しますが、テストはされていませんが、何らかの助けになることを願っています。


0

次のようなものを試してください:

  1. ポリラインの方向を度で計算します。例:ArcGIS Field Calculatorなど:180 + math.atan2((!Shape.firstpoint.X!-!Shape.lastpoint.X!)、(!Shape.firstpoint.Y! -!Shape.lastpoint.Y!))*(180 / math.pi)

  2. 道路ネットワークを道路の頂点(ポイント)に変換し、PostGISにインポートします。

  3. マッチングアルゴリズムを適用する:

    マッチング(gid、vehicle_id、segment_id、date、time、the_geom)への挿入

    SELECT DISTINCT ON(b.gid)b.gid、b.vehicle_id、a.segment_id、b.date、b.time、ST_Closestpoint(ST_Collect(a.the_geom)、b.the_geom)from the_geom FROM

    segment_vertices_geom a inner join vehicle_geom b ON ST_Dwithin(ST_Transform(a.the_geom、32632)、

    ST_Transform(b.the_geom、32632)、20)WHERE((CAST(a.azimuth AS float8)-CAST(b.direction AS float8))<180 OR(CAST(a.azimuth AS float8)-CAST(b.direction AS float8))> -180)GROUP BY b.gid、b.vehicle_id、a.segment_id、b.date、b.time、a.the_geom、b.the_geom ORDER BY b.gid、ST_Distance(a.the_geom、b .the_geom);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.