引き続き、任意の時間のバス位置をプロットする方法を説明します。
前回は、バス停に最も近い、バス路線の座標点を取得したので、
その後の処理からバス位置の座標点を取得する方法を説明します。
①バス路線、バス停、時刻表の入力…済
②任意の時刻から、バス時刻表にあるバス停を抽出…済
③バス停に最も近い、バス路線の座標点を取得…済
④バス路線から③で取得した座標点の区間のバス路線を取得←今ここ
⑤任意の時刻のバス位置を④で取得したバス路線上にプロット←今ここ
1.バスルートから区間ルートを取得
バスルートから、前回取得した、バス停に最も近い座標点間までの、区間ルートを取得します。区間ルートの取得には、ExtractLineByLocationクラスを利用します。
1 2 3 4 5 6 7 |
var wktReader = new WKTReader(); var extractLine = new ExtractLineByLocation(busRoute.Geometry); var nearestPoint1 = wktReader.Read("POINT (14886718.479752757 4054975.1601012326)"); var nearestPoint2 = wktReader.Read("POINT (14886928.885966511 4054781.085251334)"); var start = LocationIndexOfPoint.IndexOf(busRoute.Geometry, nearestPoint1); var end = LocationIndexOfPoint.IndexOf(busRoute.Geometry, nearestPoint2); var subLine = extractLine.Extract(start, end); |
バス路線のルートは以下の通りです。
取得後は以下の通りです。区間ルートが取得されています。
2.バス停間の進行距離を算出
次に、バス停間の停車時刻から、バスの進行距離を算出します。
以下の例では、バス停間の停車時刻が10:58~11:01の間で、11:00のバス位置を取得しています。
バス停間の距離は約1200mあり、バス停間の時間は3分で、2分後のバス位置を取得するので、バス位置は、バス停間の800m進行した位置になります。
※TimeUtil.ToMinitus()は自前のメソッドで、時刻文字から分を返します。
1 2 3 4 5 6 |
var stopTime1 = "11:01"; var stopTime2 = "10:58"; var nowTime = "11:00"; var minitus1 = double.Parse((TimeUtil.ToMinitus(stopTime1) - TimeUtil.ToMinitus(stopTime2)).ToString()); var minitus2 = double.Parse((TimeUtil.ToMinitus(nowTime) - TimeUtil.ToMinitus(stopTime2)).ToString()); var length = minitus2 / minitus1 * subLine.Length; |
3.バス停間の進行距離から、バス位置をバス路線上にプロットします。
進行距離から、路線上にプロットするには、自前では難しいので、LengthIndexedLineクラスを利用します。
ExtractPointメソッドに、距離を入れると、バス路線上の位置を返してくれます。
1 2 3 |
var indexedLine = new LengthIndexedLine(subLine); var pt = indexedLine.ExtractPoint(length); var busPos = factory.CreatePoint(pt); |
取得した座標点を確認してみます。バス路線上の2/3の位置にプロットされています。