サーバーは人間に対し、運転要注意地点を提案できるのか?


エコモットアドベントカレンダー13日目のエントリーです。

こんにちは。開発部の対馬です。
今回は、事故削減ソリューションとして、もしかしたらこんな機能があったら夢が広がるかな、という記事を書いてみようと思います。

サーバーで危険な箇所を分析

急ブレーキ、急ハンドルなどの運転が多くなりがちな地点をサーバーが分析してマーキングしてくれたら、
その地点を運転注意エリアとしてアプリケーションに登録する根拠にもなりそうです。
今回は、PostgreSQLというオープンソースのDBと、そのDBで地理情報システム(Geographic Information Systems 、GIS)を実現するための拡張モジュールを使って試してみたいと思います。

やりたいことは「半径Xメートル以内でX回以上の急挙動が発生している地点を抽出する」です。
人間が目で見て判断する場合はなんとなく出来そうですが、機械がそれをする場合、どういう計算をすればいいのか、今のところ想像がつきません。

何か使えそうな関数がないかなと調べると、
「半径と地点数をパラメータとして指定し、複数のジオメトリデータにグループIDのようなものを付与する(クラスタリングする)」
という、非常に都合の良い関数がありました。

ST_ClusterDBSCAN — Windowing function that returns integer id for the cluster each input geometry is in based on 2D implementation of Density-based spatial clustering of applications with noise (DBSCAN) algorithm.

じゃあ、そのクラスタリングされた複数地点の重心を求めれば、そこを「危険箇所」と判断していいんじゃないかと、
複数ジオメトリの重心を求める関数がないかと調べると、これも見つかりました。

ST_Centroid — ジオメトリの幾何学的重心を返します.

なんとかなりそうです。

では「半径50m以内に3つ以上の急挙動のあった地点を自動的に判断する」という機能を作成してみます。
毎度お世話になるGoogleMapで、データを表示してみましょう。
ピンクのアイコンが「急挙動が発生した地点」、青いアイコンが「サーバーにより危険地点と判定された箇所」です。

全体
市街地付近
峠

このような機能をもっと進化させると、AIと呼ばれるような機能になってしまったりするかもしれません。
非常に可能性を感じる実験だったと思います。

それでは、最後までご覧いただきありがとうございました。