コンテンツにスキップ

Map Service Registry

MapConductor には、軽量な「プラグイン」機構として MapServiceRegistry があります。 地図SDKモジュール(Google Maps / Mapbox / MapLibre など)と、機能モジュール(クラスタリング / マーカー戦略など)を 継承に頼らずに 連携させるための仕組みです。

  • MapView が map-scoped なレジストリを提供します
  • MapViewBase が CompositionLocal の LocalMapServiceRegistry で公開します
  • 機能モジュール側はレジストリから capability を解決して利用します

つまり、地図SDKモジュールが capability を「登録」し、機能モジュールがそれを「利用」することで分離を保ちます。

クラスタリングや strategy ベースのレンダリングは、地図SDKごとの renderer/controller が必要です。 それを MarkerRenderingSupport<ActualMarker>MarkerRenderingSupportKey で表現します。

組み込みの地図SDKモジュールは MarkerRenderingSupportKey を自動登録するため、mapconductor-marker-clustering はコントローラの継承なしで動きます。

独自地図SDKモジュールでの連携(Android)

Section titled “独自地図SDKモジュールでの連携(Android)”

独自の地図SDKモジュールを実装する場合は、MutableMapServiceRegistryMarkerRenderingSupport を登録し、それを MapViewBase に渡してください。

val serviceRegistry =
remember {
MutableMapServiceRegistry().apply {
put(MarkerRenderingSupportKey, myMarkerRenderingSupport)
}
}
MapViewBase(
state = state,
/* ... */
serviceRegistry = serviceRegistry,
)

iOS でも同じ考え方で、SwiftUI Environment にレジストリを流し込みます(EnvironmentValues.mapServiceRegistry)。 provider 側が capability を登録することで、機能側は provider 非依存のまま拡張できます。