鉄道撮影地マップとGISと、私のこれから
はじめまして(?) mipsparc と申します。
このたび、RDBMS-GIS Advent Calendar 2022の最終日を書かせていただきます。
後半は個人的な非技術的な話が混ざってしまいますが、どうかお許し願えれば幸いです。
「だれでも撮影地マップ」
2020年3月、当時某大規模Webサービスの開発に関わっていたものの、実はゼロからしっかりしたWebアプリケーションを作ったことがなかった私は、習作を兼ねてなにかしっかりとして使ってもらえる実用的なプロダクトを作りたいと考えました。
いろいろと考えた末に、趣味の大きなウェイトを占める鉄道と絡めて、「列車を撮影するスポットと、そこで撮影できる写真の作例をシェアするサービス」を作ることに決めました。
当時バックエンドエンジニアとしてPHPとPython(業務経験はなし)、MySQLなどの経験があった私は、業務により役立てるため、PHPを選択しました。また、MySQLは最新のMySQL8.0をぜひ使ってみたいと考え、CloudSQLなどではなく、通常の独立したデータベースとして建てることにしました。
当時の技術構成はこちらです
- PHP7.3(お恥ずかしい、でも型はしっかりつけてるので、8でも多分動く)
- MySQL8.0
- Google Compute Engine
- Google Cloud Storage (画像保存、配信)
- Google Cloud Load Balancer
- Google Domains (DNS)
- Google Cloud IAP (管理画面認証)
- ImageMagick6
- Symfony5(PHPフレームワーク)
- OpenStreetMap
- Mapbox GL JS (ベクターマップ描画)
- MapTiler (ベクタータイル配信)
- Sentry
開発する上では、一応動くレベルには持っていってはいたのですが、フロントエンドのブラッシュアップやデザインの改善で Torishimaさん 、 fonoさんの協力を賜りました。
匿名でアップロードできるサービスのため誰なのかはわかりませんが、当時所属していた大学の鉄道研究会の仲間などを中心に綺麗な写真を大量に投稿していただき、2022年現在では800箇所、写真は1000枚程度公開されています。
以下はその「だれでも撮影地マップ」の現在の画面です。
日本MySQLユーザ会Discordへの参加
時は2022年9月になり…MySQLのより深い最新の情報がほしいと思った私は、日本MySQLユーザ会のDiscordにジョインしました。そこでは、不定期で「生マイ(今夜も生でMySQL(仮題))」というボイスチャットが偶然試験的に行われていて、新参者の私も歓迎していただけました。
そこで、昔作った「だれでも撮影地マップ」と、その地点保存の仕組みをちょっとお話したところ、大変おもしろがっていただきました。
具体的には、緯度カラム・経度カラム(FLOAT)ではなく、GeoHashカラム(VARCHAR)という仕組みで保存しています。
GeoHashとは
緯度経度座標系(要するに「普通の」地図)において、文字列長に応じた広さのエリアを、一意な文字列で表す技術です。特徴としては、
- 文字列長に応じてエリアが狭く(=精度が高く)なっていく
- 前方一致するならば、あるメッシュ段階まで同じメッシュに含まれる
- 文字列的に近傍であれば、地理的、座標的にも近傍である
があります。
ここから言えるのは、まず、精度の扱いが難しい浮動小数点型ではなく、エリアが一意に定まる文字列型であるというのは、扱うときに安心感があります。
また、3つ目に書いたとおり、文字列の前方一致で近傍ソートが一定の精度でできるという特徴が面白いと感じました。(マップを見ればいいのでサービスには実装していないんですが…)
実は、MySQL5.7以降ではGeoHashのための関数が用意されています。
GeoHash化するには
ST_GeoHash(緯度, 経度, 文字数)
逆は
ST_LatFromGeoHash(`geohash`)
で可能です。
MySQLと地理空間
MySQL8.0以降、MySQLでは大幅に地理情報システム(GIS)で使える関数や型が拡充されました。
それまで、GISといえばPostgreSQLといった状態でしたが、これにより(PostGISに比べるとまだ不足する点も多いそうですが)MySQLもGIS用途に実用的に使える状態になりました。
突然の登壇のお誘い
先述した生マイでの私のちょっとした話を噂に聞いた、 Yamasakiさん からこんなお誘いを突如受け、びっくり仰天。
もしよければ、このサービスの紹介がてら、
FOSS4GというGIS系のイベントでこのサービスについて発表してみませんか?
ちょうど「FOSS4G 2022 Japan Online」というイベントが11月にあり、
11月12日(土)がコアデイという位置づけで、GIS系の事例紹介、やってみたの報告などをする
場となっていますので、もし興味を持って頂けるようであればどうかなと思いまして。
発表時間も10〜15分程度のイベントで気軽に発表して頂けますので、
ご検討頂けると嬉しいです!
(発表準備などに関しては、諸々サポートさせて頂きます)
まさか、こんな自分ではただの習作にすぎないと思っていたものが、注目されるなんて! こんなチャンス、逃せないと即座に乗らせてもらうことにしました。
FOSS4G Japan 2022 Online
スライドを作って練習して挑んだ11月12日。(実は誕生日でした)
今回は発表者・関係者のみオフラインでも参加可能ということで、折角なのでオフラインで参加することにしました。場所はホテルの会議場。
Yamasakiさんとリアルでは初対面して、周りの方とも軽くお話をさせていただいてから、本番がスタート。
基調講演ではデジタルツインという聞いたことがなかった概念を知り、他のすごい方々の発表の後、私も「MySQL8のGIS機能を活用した鉄道写真撮影地マップのご紹介」というタイトルで発表してきました。実はLT以外で発表するのは初めてでしたが、あまり緊張しないで済みました。
(「コアデイ」のところから当日の映像が確認可能です。恥ずかしくてみてませんけど)
その後も皆様の発表を拝聴したのですが、株式会社Mobility Technologiesの松浦さんの「道路情報の自動差分抽出プロジェクトでFOSS4Gが大活躍!」という発表には衝撃を受けました。
内容を私なりに要約すると、
道路標識などによる交通規制情報は少しずつ変わっていく。
自動運転車が正しく走行するためには最新の道路情報が必要であるため、
高頻度に地図を更新する必要がある。
そこで、スマートドライブレコーダーを搭載した車両が走行した場所の映像と、
地図に差分がないかをコンピュータビジョンで自動的に判定する。
というものでした。自動運転社会を進める上で欠かせない要素である正しい地図を作るのは、今後極めて重要なことだと感じました。
セッション後も質問をいろいろとさせていただき、本当に面白そうな事をやっていらっしゃるなと思いました。
イベント後は発表者有志で「意見交換会」(察して)を行ったのですが、GISへの興味が段々と高まりました。皆さん気さくに若輩者の私を受け入れてくださり、楽しくお話ができました。
その後
イベントから一ヶ月と少し経った12月20日。
私は六本木一丁目駅直結のビル、住友不動産六本木グランドタワー16階の会議室に呼ばれていました。
そこで株式会社Mobility Technologiesの人事担当者さまに手渡されたのは、内定通知書と、労働条件通知書でした。
配属予定部署は松浦さんと同じ、「次世代事業本部 データビジネス部 KUUグループ」
無論、即座に受諾させていただきました。その後、これからチームメンバーとなる皆様(もちろん松浦さんも)とご挨拶をしました。松浦さんには、「若いGISエンジニアがいないので、ぜひなってほしい」と言われました。
Web業界から来たわけですから、右も左もまだわかっていませんが、期待を受けていることは間違いありません。ポテンシャルだけで採っていただいたことに感謝しつつ、期待に沿ってこれから奮闘していきます。
「わたし、これからバックエンドエンジニア、兼、GISエンジニアになります!」
本当ですよ。絶対なってみせます。
(完)
Discussion