React Native Mapsで野外調査アプリを作ってみた


2022年冬、野外調査アプリが群雄割拠しています。DXの掛け声のもと、仕事で使う野外調査アプリを探していた私は、四角い車輪を再発明したのでした。


これはFOSS4G Advent Calendar 2022の記事です。


群雄割拠する野外調査で使えそうなアプリたち
上から、定番、日本製、海外製、オープンソース、登山用、そして拙作


野外調査の必須アイテムと言えば、紙の野帳と図面、GPS、デジカメでした。スマホの普及とともに、数々の野外調査アプリがそれに取って代わろうと、しのぎを削っています。アプリの使い勝手は一長一短、淘汰されるものもあるでしょうが、多様性があることは健全です。


オープンソースの野外調査アプリ

FOSS4GのAdventCalendarなので、オープンソースのものをピックアップしました。どのアプリも現在進行形で開発が進んでいます。

注目ポイントは、利用している開発フレームワークです。Mergin Maps Input とQFieldは「Qt」、SMASHは「Flutter」です。採用しているフレームワークでどれぐらい開発効率やアプリのパフォーマンスが違うのか気になるところです。


四角い車輪の再発明

DXの掛け声のもと、野外調査アプリの導入を検討していたつもりが...


突然ですが、既存のものを自前で作り直すことを車輪の再発明と言います。さらに作ったものが役に立たない場合は、四角い車輪と揶揄されます。

これだけ野外調査アプリがある中、素人が似たようなものを作るのは、四角い車輪の再発明に他ならないかもしれません。

でも、まあいいか、スペアタイヤのつもりで自前の野外調査アプリを作ってみました。名前は「EcorisMap」です。React Native Mapsを利用していて、アプリもオープンソースです。



とりあえず使ってみよう![PR]

まずは、アプリをインストールしましょう。iOSAndroid、Web版があります。


起動すると日本へそ公園を中心とした地図が表示される

なんでここ?って思うかもしれませんが、日本の中心は北緯35度、東経135度だと刷り込まれた世代だからです。

操作は直感で分かるように、それっぽいアイコンになっています。直感で分かると言っておきながらボタンの説明をします。上から、ヘディングアップ切り替え、ズーム、GPS、下にいって左から、地図選択、トラックログの記録、レイヤ表示、データ追加、各種設定になってます。


自分のデータを表示してみよう


QGISで作成したGeoJSONのポリゴンとハンディGPSで取得したGPXのログを読み込んだところ。秋田駒ケ岳にはムーミン谷と呼ばれる素敵な場所があります。

データをインポートして確認する方法を説明します。

1.レイヤ表示ボタンを押して、2.レイヤ一覧の画面になったら、3.左下のデータ読み込みボタンを押して、4.スマホに保存されているGeoJSONやGPXのデータを指定するとインポートできるので、5.レイヤ一覧からレイヤを選択したあと、6.データ一覧からデータを選択して、7.左下の飛行機ボタンを押すとデータの場所にジャンプするので、8.読み込んだデータを確認します。


言葉だと上手く言えないけど思いは伝えました。色とかラベルも設定できます。


電波がなくても大丈夫?
 
調査の現場は、五分五分の確率で電波がありません。でも、地図をダウンロードできるので大丈夫。

現地が圏外の場合は、ネット環境がある場所で事前に地図をダウンロードしておきます。地図選択画面でダウンロードボタンを押して、必要な範囲を選択してダウンロードします。

地図は自前のタイル地図も登録できます。例えばドローンから作成したオルソ画像をQGISでタイル地図にして、それをGitHubにあげてURLを登録すると読み込めます。


現地でデータを取得しよう
  
1. 入力項目を設定して、2. 現在地のポイントを落として、3. データを入力します。

現地ではGPSをオンにして目的地にでかけます。素敵なお花を見つけたら現在地にポイントを落とします。お花の写真を上手に撮ったら、その名前と写真を入力します。入力したい項目は、レイヤの設定で変更できます。トラックをオンにしておけば、花の種をこぼして帰らなくても歩いた軌跡を残せます。


データをエクスポートするよ

データはGeoJSON、CSV、GPXの形式でエクスポートできます。

エクスポートしたいデータを選択して、エクスポートボタンを押すとzipファイルが作成されます。スマホ内に保存したり、Google Driveに保存したり、Slackで飛ばしたりすると便利です。でもGmailはzipファイルをブロックするから使えません。


Web版と連携すれば便利かも

Web版だと3D表示もできてカッコいい。ファイルのインポートも地図画面にドラッグ&ドロップでできます。

必要な操作はスマホで全部できますが、データの準備はパソコンからWeb版を利用すると簡単です。Web版で、調査に必要なデータをインポートして、色やラベルを設定しておきます。設定画面で「データをファイルに保存」とすると拡張子ecorismapの設定ファイルを書き出します(中身はデータと設定をzipで保存したもの)。このecorismapファイルをスマホに送って設定画面から「データファイルを読み込み」とすると、そっくりそのまま開きます。あら便利。


Web版のセキュリティが気になるかもしれませんが、データはすべてブラウザ側だけで処理してます。サーバーにデータを送ってません。でも、今後はクラウド対応も考えてたり。


ちょっとだけ技術的な説明をするよ!

React Native

EcorisMapの開発に利用しているフレームワークは、React Nativeです。React Nativeは、Meta(旧Facebook)とコミュニティによって開発されているモバイル用のフレームワークで、ReactでネイティブコードをラップすることでTypeScript(JavaScript)でAndroidiOSアプリ開発ができます。最近は、Flutterに人気が押されがちでMetaさんも元気がないので、ちょっと心配です。ソースコードは、基本的にはTypeScriptなので、JavaScriptになじみがあれば、始めやすいかも(?)

React Native Maps

GoogleのMaps SDK for AndroidiOSと、AppleのMapKitをラップしてReact Nativeで使えるようにしたライブラリです。EcorisMapでは、MapKitは使わずに、Android版、iOS版ともにMaps SDKGoogle Mapsの地図を利用しています。モバイル用だとGoogle Mapsの地図データや衛星データを無課金で利用できるのでありがたいです。

EcorisMapのWeb版

Web版は、React Native for Webを利用してスマホ用のコードからWeb版を生成しています。もともとWebの技術であったReactをNativeに適用して、それをまたWebに戻すという加工貿易的なイメージ?の技術です。ただ、Web版はスマホ版と少しコードが違う部分があって、地図ライブラリにMapLibreを使っています。その関係で、デフォルトの地図はGoogle Mapsではなく、MapTilerの地図と地形データを読み込んでいます。そのためMapTilerの無料枠を超えると地図が表示されなくなるかもしれません...という意味で現在Web版はお試し中です。MapLibreも3Dの地形表示ができるようになったのでコミュニティーに感謝です。(MapBoxも嫌いじゃないよ)

国際化

一応、国際化してあります。現時点では、日本語と(つたない)英語です。世界中のみんなが使ってくれる妄想を抱きながら作業しました。現時点のダウンロード数は36人です(笑

その他

ソースコードを見てもらえれば分かる通り、クソコードです。テストコードもろくにありません。恥の多い生涯を送って来ました。オープンソースとは残酷なものです。これからリファクタリングをします。


やりたいこと

今後やりたいことをリストアップしてみました。

  • ローカルのラスタ読み込み(TIFF, MBTiles, GeoPDF)
  • ライン、ポリゴン編集(お絵描きアプリみたいに描きたい)
  • クラウド対応(Firebase)
  • 課金(サブスク、アプリ内課金)
  • スマートウォッチ対応(AppleWatch, PixelWatch)


地図データはネット経由のタイルの読み込みだけ対応してるので、ローカルで持っているGeoTIFFとかMBTilesとかGeoPDFを読み込めるようにできたら便利かなーと思ってます。

ラインの編集は今も一応できますが、いまいちです。お絵描きアプリみたいに、さら、さら、さらーと描けるようにしたいです。ポリゴンにも対応したいです。できることならトポロジーも考慮して。

Firebaseを利用したクラウド対応は、社内用のテストアプリでは実装済みで、すでに利用しています。でも、みんなが使うサービスとして公開するにはセキュリティの面でハードルが高いなーと怖気付いてます。

当然のことながら仕事で扱う位置情報は、漏洩したらタダじゃ済まないものばかりです。アプリとFirebase間をEnd to Endで暗号できるVirgil SecurityのE3Kitを導入してますが、利用人数増えたらお安くないし、暗号化するとアプリの輸出制限に引っかかって、アプリを公開するには色々と手続きが必要になり大変そうです。

Mergin MapsやQFieldはクラウドサービスもありますが、そのあたりどう考えてるのか気になります(利用者側も)。クラウドのサーバー側もオープンソースで公開してるので、気になる人は自分でサーバー立ててねってことですかね。

課金ねぇ......先立つものは必要ですよね.....

スマホを出して現在地を確認するのは面倒なので、スマートウォッチで確認できるようにしたいです。スマートウォッチは持ってません。

サンタさんにお願いするスマートウォッチの画像を張っておきます。


 



最後になりましたが、バグは色々あると思いますので、不具合、ご要望があれば以下に書き込むなり、Pull Requestを送るなり、よろしくお願い致します。


github.com

Happy Merry Christmas !


我が家のクリスマスケーキ