2017-01-14 8 views
0

私はJavaとPostgresを使用してバス到着予測システムを作成しています。バスごとに固定ルートがありますので、PostgresにLineStringとして全駆動ルートを保存しています。gps座標から次の頂点までの距離を見つける

enter image description here

あり3バス停止であり、各バス停のLAT経度もルートテーブルにラインストリングとして格納されます。 停止名と緯度の詳細を持つもう1つのテーブルがあります。

stoppage_details表

Stoppage 1 - lat1,lon1 
Stoppage 2 - lat2,lon2 
Stoppage 3 - lat3,lon3 

私は、問題の下に解決するためにPostgresの機能を探しています。

  1. にはどうすれば( ポイントの緯度経度とエンドポイントの緯度経度の開始)ラインストリングを使用してルートの総距離(660メートル)を取得することができます。
  2. 30秒ごとにデータを送信する各バスにGPSシステムがインストールされています。ST_ClosestPoint関数を使用してLineStringから最も近い頂点 を検索しています。頂点と次の間の距離はどれくらいですか とそれ以前の停止はLineStringを使ってどのように見つけることができますか?
  3. または誰かが上記の問題を解決するための他のアプローチを提案することができます。

答えて

0
  1. P1〜P8のは、SRIDでラインストリングジオメトリある場合:4326は、(長い/緯度)、その後、あなたはそれをメートル単位でst_length(ライン::地理)との長さを得ることができます。

  2. はもう少し複雑ですが、さまざまなアプローチがあります。たとえば、線形参照関数を使用して、GPSポイントをラインストリングに投影し、0が始点、1.0が終点になるようなパーセンテージを得ることができます。あなたが各停留所を取ってそのパーセンテージを同じように得るならば(あなたのテーブルにもそれを格納するかもしれません)、GPSのパーセンテージよりも少ない停留点を見つけ、GPSのパーセンテージよりも大きい値は隣接する停留点を与えます。線形参照関数を使用すると、線ストリングの開始および停止率に基づいて部分文字列を抽出することができます。また、GPSポイントの前後の距離について、それぞれの長さを取得できます。

+0

私はST_length(line :: geography)FROM routesを選択しようとしました。正確な長さを与えていません。そして、線ストリング上の任意のGPS座標の前回と次の停止を見つける方法はありますか? – raw

+0

linstringがsrid:4326(WGS84)の場合、長さを計算するのに適切な投影に投影する必要があります。それを地理学にキャスティングするには、メートル単位のグローバルメルケータ投影のようなものに投影することでこれを行います。 st_length_spheriod()http://postgis.net/docs/manual-1.4/ST_Length_Spheroid.htmlを試すと、どのspheriodを投影するかをよりよく制御できます。ポイント2については –

+0

です。私はこれを行う方法を説明しました。あなたが要請したことを即座に行う「缶詰め」機能はありません。 Postgisは、より複雑なソリューションを構築するためのツール群です。多くのユーザーは、pgplsqlストアドプロシージャを作成して、より複雑なタスクや特定のタスクを実行します。私は「PostGIS in Action」を推奨しています。http://www.postgis.us/ –

関連する問題