エコモットアドベントカレンダー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と呼ばれるような機能になってしまったりするかもしれません。
非常に可能性を感じる実験だったと思います。
それでは、最後までご覧いただきありがとうございました。