現在、仕事でバス路線の解析をやってまして、バス時刻表とバス路線を元に
任意の時間のバス位置をプロットする作業が発生しました。
中々難易度の高い作業ですが、やりがいがあります。
バス位置をプロットでは、以下の処理を考えました。
- バス路線、バス停、時刻表の入力…済
- 任意の時刻から、バス時刻表にあるバス停を抽出…済
- バス停に最も近い、バス路線の座標点を取得←今ここ
- バス路線からⅲで取得した座標点の区間のバス路線を抽出
- 任意の時刻のバス位置を算出しⅳで取得した区間バス路線上にプロット
本来、バス停の位置は、バス路線上にプロットすべきなのですが、
GISを使って手入力をしていたので、バス路線上にありません。
そこで、バス停から最も近い、バス路線の座標点を取得してから
バス停間のバス路線を取得することにしました。
1.バス路線及びバス停の位置座標を取得
本来はshpファイルからバス路線及びバス停の位置情報を取得するのですが、
わかりやすいように、手打ちで設定しています。
1 2 3 |
var wktReader = new WKTReader(); var busStop = wktReader.Read("POINT (14886718.479752757 4054975.1601012326)"); var busRoute = wktReader.Read("LINESTRING (14886690.256790992 4055087.4261809373, 14886717.327250304 4054971.8626344143, 14886665.794772454 4055105.4696266088 )"); |
位置情報を視覚的に確認します。確認には、JTS TestBuilderを使用します。これめちゃくちゃ便利です。GISプログラマーでは必須ですね。
バス路線からバス停が離れています。
2.バス停に最も近い、バス路線の座標点を取得
次に、バス停に最も近い、バス路線の座標点を取得します。座標点の取得には、「NTS」のDistanceOpクラスを使います。
引数を、バス停、バス路線の順にします。注意してください。
これがが逆になると、バス停の位置しか返ってきません。私はこれで何時間か悩みました。
1 |
var nearestPoint1 = new DistanceOp(busStop, busRoute).NearestPoints()[1]; |
取得した座標点をJTS TestBuilderで確認してみます。
バス路線上に座標点がプロットされています。