見出し画像

地図上で日陰が分かるようになりました!

こんにちは、三代目ゆう と 初代クワマン です。私達はナビタイムジャパンで地図フレームワークエンジニアを担当しています。

うだるような暑さの続く昨今、みさなまいかがお過ごしでしょうか。本日は当社のウォーキングアプリ『ALKOO by NAVITIME』から、そんな暑さを和らげる新機能「日陰マップ」のご紹介です!

下図のように、建物によってできる日陰を地図上に表現しています。

時間経過で動く日陰

機能紹介

「日陰マップ」は、ビル等の建物によってできる日陰を地図上に表示する機能となっています。詳しくは後述しますが、算出した太陽高度と建物形状および高さデータから、その建物の影となる領域を計算して描画しています。そのため、季節や時間、緯度経度による日の傾きの差なども反映されます。

(左)7月25日10時の様子、(右)7月25日17時の様子

画像をご覧いただくと分かる通り、その時間にどの道なら日陰を歩けるのかが直感的に見えるようになっておりますので、快適なお散歩のお供にもってこいな機能となっております。

また、この機能は社内共通ライブラリであるところの地図フレームワークで実装しているため、第一弾となる『ALKOO by NAVITIME』のほかにもナビタイムジャパンの複数サービスで順次導入を予定しています!

機能の詳細はぜひ当社プレスリリースもご覧ください。

開発経緯

こちらの機能ですが、ナビタイムジャパンの研究開発部門の一つである我々地図開発チーム内の雑談がきっかけで開発が始まりました。

6月末の記録的暑さが続いてたある日のこと、少しでも涼しい道を通りたいよねという話から、地図上で日陰が分かると便利そうだというアイディアが出てきました。そこからはトントン拍子で、地図描画に使ってる建物形状と高さのデータを使えば建物の影が計算できるのでは?太陽の角度とかは計算で出せるはず……と知恵がどんどん集まり、であればまずは試作してみようかという流れとなりました。

そしてわずか2,3日で試作版が完成し、さっそく各サービス開発者に見てもらったところかなり好評を得られたので本格的に開発を開始する運びとなりました。せっかくの機能、今の暑い季節にリリースしなければ勿体ない。ということで、そこからもわずか2週間ほどで地図フレームワークが完成し、発案から1ヶ月足らずに『ALKOO by NAVITIME』からサービスリリースという非常にスピード感の高い開発が実現できました。

実現方法

さて、ここではそんな「日陰マップ」機能の実現方法について簡単にご紹介したいと思います。

太陽高度と方位角の計算

まず日陰の形状を求めるためには光源であるところの太陽の位置を計算する必要があります。太陽は十分遠く地球には平行の光として届くことから、地上から見た角度さえわかれば光の照射角として扱うことができます。そこで求めることになるのが、太陽高度と方位角です。太陽高度は地平線方向を0度、天頂を90度とした角度で表さられる太陽の高さで、方位角は北を0度、東を90度以下時計回りに表される太陽の方角です。

太陽高度$${h}$$、方位角$${A}$$としたとき、

$$
\cos h \sin A = -\cos \delta \sin H \\
\cos h \cos A = \cos \varphi \sin \delta - \sin \varphi \cos \delta \cos H \\
\sin h = \sin \varphi \sin \delta + \cos \varphi \cos \delta \cos H
$$

の3式から求められます。ここで、$${\delta}$$は太陽の視赤緯、$${H}$$は時角、$${\varphi}$$は緯度を表します。詳しい解説は割愛しますがさらにそれぞれ、視赤緯$${\delta}$$はその年の通算日数から、時角$${H}$$は標準時と経度と均時差から計算できることが知られています。つまり、観測地点の緯度経度と日時のパラメータがあれば太陽高度と方位角を求めることができます。

参考:国立天文台Webサイト
https://eco.mtk.nao.ac.jp/koyomi/topics/html/topics2005.html

建物形状データ

描画地図は、当社が保有する地図データをもとに描画を行っています。データには建物の形状だけでなく高さに関する情報も含まれており、『NAVITIME』等のナビゲーションサービスでは、既に形状と高さを組み合わせることで3Dの建物を表示する機能を提供しています。この3D建物表示に用いられている情報を流用することで、影の形状、長さ等を計算することが可能となっています。

建物形状と高さ

地図上への描画

地図上に単純な影を描画してみると、困ったことになりました……
影は地図自体を塗りつぶさないよう半透明で描いているため、影それぞれが重複すると色が濃くなり不均一な影となってしまうのです。

重複する影

この影の色を統一させるため、影の描画処理自体に工夫を加えました。OpenGL ES の Stencil Buffer という機能を用いて、一度影を描いたピクセルには影を描画しない、という処理に調整しています。

影の色統一前後

現状での課題

先に書いたように、形状と高さを持つ建物データについては、影を表示することができました。しかし、実際の世界には建物以外にも日陰を作ってくれるモノがあります。
・街路樹
・高架
・歩道橋
など…
これらの日陰についても、今後データの拡充などによって対応できるようになる日も来るのではないかと考えております。

おわりに

ということで、新機能の「日陰マップ」についてご紹介させていただきました!
また、今は夏ですので「日差しを避ける」という用途にフォーカスして説明させていただきましたが、冬になれば逆に「日当たりの良い道」を選ぶ助けにもなり、一年中活用いただける機能となっております。

まだまだ厳しい暑さが続くことが予想されますので、ぜひ事前の日陰チェックで熱中症対策をしつつお出かけやお散歩を楽しんでいただければと思います!