ドキュメント / コンセプト / なぜ MapConductor か

なぜ MapConductor か

地図機能を持つアプリのコードは、たいてい特定の地図 SDK に深く結びついています。乗り換えたくなったときに書き直すのは地図まわりだけでは済まず、画面のロジックにまで及びます。MapConductor は、その結びつきを 1 枚の共通 API に置き換えます。

PROVIDERS
13
PLATFORMS
Android · iOS · Web
LICENSE
Apache 2.0
紹介動画 · マップコンダクターで地図アプリ開発に選択の自由を!

01 · 何が問題なのか

01

料金と契約が変わる

地図 API の課金体系は変わります。乗り換えたいのに、アプリのコードがそれを許さない、という状況が起こります。

02

同じ機能を 3 回書く

Android・iOS・Web でそれぞれ別の地図 SDK を使うと、マーカーの扱いもカメラの意味も揃いません。仕様の議論が 3 回必要になります。

03

数値が一致しない

ズーム 14 が指す縮尺も、2 点間の距離も、SDK のユーティリティ任せにすると環境ごとにずれます。QA で「どちらが正しいのか」を毎回決めることになります。

04

件数が増えると破綻する

マーカーが数千を超えると、素朴な実装ではカメラ操作が重くなります。対策はプロバイダごとに違い、そのたびに書き直しになります。

02 · MapConductor の答え

アプリは統一 API にだけ依存します。プロバイダごとの差はドライバーが吸収し、切り替えは依存モジュールとビューの型を差し替えるだけになります。

ひとつの型

座標も状態も共通

GeoPoint・MarkerState・MapCameraPosition は 3 プラットフォームで同じ名前・同じ意味です。プロバイダごとの型は出てきません。

ひとつの尺度

ズームも距離も一致する

ズームは共通の尺度に正規化され、距離・方位・面積は SDK 自前の実装で計算されます。同じ入力なら、どのプロバイダでも同じ値が返ります。

ひとつの書き方

状態を渡すだけ

「今あるべき状態の配列」を渡すと、Core が前回との差分を求めて必要な分だけ地図へ反映します。追加・更新・削除を自分で管理する必要はありません。

件数の問題は SDK 側で解く

マーカーが 2,000 個を超えると、内部のレンダリングエンジンが描き方をラスタータイルへ自動で切り替えます。数万件でもカメラ操作は滑らかなままで、アプリ側のコードは 1 行も変わりません。基準値は地図ビューのオプションで変更できます。

03 · 薄いラッパーではない

各 SDK のメソッドを呼び分けるだけのラッパーなら、できることは「一番機能の少ない SDK」に揃ってしまいます。MapConductor は足りない機能を自分で描いて埋めるため、プロバイダを変えても見た目と挙動が揃います。

自前で持っているもの
そのおかげで揃うこと
地理計算
距離・方位・面積・補間を Kotlin / Swift / TypeScript で同じ式で実装。SDK のユーティリティに依存しないため、表示される数値がプラットフォームでずれません。
マーカー描画エンジン
少数ならネイティブマーカー、大量ならラスタータイル。空間インデックスでタップ判定とビューポート抽出を件数に依存しない速さにしています。
穴あきポリゴン・大圏コース
ネイティブに機能がないプロバイダでは、ラスタータイルとして描いて同じ見た目にします。呼び出し側のコードは変わりません。
カメラの共通化
ズームとカメラ高度を相互変換し、実測にもとづいて校正しています。zoom 14 はどのプロバイダでも同じ広さです。
出典表記
ズームや表示範囲に応じて出典を切り替えるルールを、デザインの一部として持ちます。独自タイルを使うときにも必要な表記が出せます。

04 · チームに効いてくること

共通 API を 1 枚挟むと、書けるコードの性質が変わります。地図 SDK の名前が出てこないコードは、プロバイダを変えても、別のプラットフォームへ移しても、そのまま残ります。

学習コスト

覚える API は 1 つ

地図 SDK はベンダーごとに概念も命名も違うため、プロバイダを変えるたび、プラットフォームを移るたびに覚え直しが発生します。MapConductor で覚えるのは 1 つの API だけで、Android・iOS・React のどこでも同じ名前・同じ意味のまま使えます。あるプラットフォームで得た知見はそのまま別のプラットフォームで通用し、チームに人が入るときに読む対象がプロバイダの数だけ増えることもありません。

再利用

地図 SDK に依存しないコード

GeoPoint や MarkerState は、どの地図 SDK にも属さない型です。経路を組み立てる、範囲に入るかを判定する、何を表示するかを決める ── こうしたロジックを地図 SDK の型から切り離して書けるため、プロバイダを変えても書き直しになりません。地図まわりの共通部品を、プロバイダごとに作り分けずにライブラリとして切り出すこともできます。

05 · データを配る側から見ると

ここまでは地図を組み込む側の話です。MapConductor が目指しているのはベンダーロックインからの解放だけではなく、どのベンダーに寄るかを地図 SDK の選択とは切り離して決められるようにすることでもあります。

選べないこともある

商用 SDK を使うことになる

完全にオープンな地図を使う場合を除けば、実運用ではどこかの商用地図 SDK を使うことになります。契約や調達の都合で、その選択肢が最初から 1 つしかないこともあります。MapConductor が効くのは、そうした状況でも手持ちのリソースを捨てずに済むことです。

紐付きをほどく

地図 SDK とデータを切り離す

地図データ・ジオコーディング・タイルといったリソースは、それを提供するベンダーの地図 SDK とセットで使うのが前提でした。両者を分けられれば、たとえば ArcGIS に蓄積したコンテンツを別の地図 SDK の画面の上で使う、といったことが成り立ちます。

表示手段を持たない提供者

ジオコーディングだけ、データだけ

ジオコーディングだけ、特定分野のデータだけを持つ提供者は、自前の地図 SDK を持たないために使われる場面が限られてきました。表示側と切り離せれば、どの地図の上でも使ってもらえるようになります。

現時点では、この用途に向けた機能はまだありません。近いものとして Android SDK が ArcGIS Online のコンテンツを読み込めますが、これは ArcGIS のビュー上での表示です。ここに書いたのは今後追加していく方向であり、現在の機能一覧ではありません。
データやサービスの利用規約に従うのは、それを組み込む開発者の責務です。技術的に組み合わせられることと、その組み合わせが許諾されていることは別の話です。

06 · 地図 SDK プロバイダから見ると

共通レイヤーは、地図 SDK を提供する側にとって自分の存在を薄めるものに見えるかもしれません。MapConductor はそう設計していません。共通化するのはどのプロバイダにもある部分だけで、各社の強みはそのまま外に出しています。

流入

外から来る顧客

複数のプロバイダが同じ書き方で扱えるようになると、他社の SDK で作られたアプリからも候補として見てもらえるようになります。乗り換えの敷居が下がることは既存顧客を引き止める力を弱める方向にも働きますが、その分、選ばれる理由が「乗り換えられないから」ではなく、価格・カバレッジ・描画品質そのものになります。

最低限の共通化

強みは隠さない

共通化しているのは、どのプロバイダにも存在する基本的な機能だけです。状態オブジェクトの getMapViewHolder() を呼べばネイティブの地図ビューと地図インスタンスがそのまま取り出せるので、そのプロバイダにしかない機能は各社の API で直接書けます。完全に覆い隠すラッパーであれば差別化要因が消えますが、そうはしていません。

業界全体

共通の土台の上で競う

ブラウザが HTML5 で実装を揃えたあと、各ブラウザは互換性を保つこと自体ではなく、速度や機能そのもので競うようになりました。地図 SDK も同じで、共通のインタフェースが定まれば、その上でどれだけ速く・正確に・広い地域を描けるかが問われるようになります。共通化は個々の SDK の進化を止めるものではなく、進化の向きを揃えるものだと考えています。

07 · 向いている場合・いない場合

向いている
  • 複数プラットフォームで同じ地図体験を出したい
  • 将来プロバイダを変える可能性を残しておきたい
  • マーカー・図形・カメラといった標準的な地図表現が中心
  • 数千〜数万のマーカーを扱う
  • 距離や面積の表示に一貫性が求められる
向いていない
  • 特定プロバイダ固有の高度な表現が主役(独自シェーダー、ベンダー専用レイヤー)
  • ターンバイターンのナビゲーションなど、SDK の専用機能そのものが目的
  • 1 プラットフォーム・1 プロバイダで完結し、今後も変える予定がない

ただし部分的な併用はできます。ネイティブの地図インスタンスには常に手が届くので、特殊な部分だけプロバイダ固有のコードで書く構成が可能です。

次に読むもの