Docs / Map view / Map design

Switching the map design (tiles)

How the map looks is decided by a single mapDesignType. Pick one of the presets shipped for each provider, or define your own from a style JSON or tile URL. Switching is just an assignment — the map view is never rebuilt.

ANDROID
com.mapconductor:core
iOS
MapConductorCore
REACT
@mapconductor/js-sdk-core

01 · The design type

Every provider design implements MapDesignTypeInterface (MapDesignTypeProtocol on iOS). Learn these three members and the handling stays identical across providers.

id
Identifies the design — either the provider native value (e.g. a Google mapType constant) or a string.
getValue()
The value handed to the provider engine, including the style JSON URL or tile definition.
attributionRules
Rules that switch attribution text by zoom and area. Required when you bring your own tiles.

02 · Presets

Each provider package exposes its standard designs as constants. The sample apps use these lists directly as their options.

Provider
Type
Presets
Google Maps
GoogleMapDesign
Normal · Satellite · Hybrid · Terrain · None
MapLibre
MapLibreDesign
DemoTiles · OsmBright / En / Ja · MapTilerBasicEn / Ja · MapTilerTonerEn / Ja · OpenMapTiles(9)
MapKit
iOS · React
MapKitMapDesign
Standard · Satellite · Hybrid · SatelliteFlyover · HybridFlyover · MutedStandard
Mapbox
MapboxMapDesign
React: MapboxDesign
Standard · StandardSatellite · Streets · Outdoors · Light · Dark · Satellite · SatelliteStreets · NavigationDay / Night
React は Streets · Outdoors · Light · Dark · SatelliteStreets + OsmBright / MapTiler 系のスタイルJSON
MapTiler
MapTilerDesign
Streets · StreetsDark · StreetsLight · Basic · Bright · Satellite · Outdoor · Winter · Topo · Toner · Dataviz · Backdrop · Ocean · Landscape · Aquarelle · OpenStreetMap(16)
HERE
HereMapDesign
NormalDay / Night · Satellite · HybridDay / Night · LiteDay / Night · LiteHybridDay / Night · LogisticsDay / Night · LogisticsHybridDay · RoadNetworkDay / Night(14。iOS のみ LogisticsHybridNight を加えた 15)
ArcGIS
ArcGISDesign
iOS / React: ArcGISMapDesign
Streets · Imagery · Topographic · Navigation · Nova · Newspaper · HumanGeography… · OsmStandard …(61)
TomTom
TomTomMapDesign
React: TomTomDesign
Standard · Driving · Satellite
React はさらに StandardLight / Dark · DrivingLight / Dark · MonoLight / Dark
Longdo
LongdoDesign
Normal · Easy · Pastel · PastelGray · Hard · Gray · Light · Night · Dark · Political · Osm · Satellite · Hybrid(13)
Leaflet
React
LeafletDesign
OpenStreetMap · None + plus any XYZ tiles
OpenLayers
React
OpenLayersDesign
OpenStreetMap · None + plus any XYZ tiles
Azure Maps
React
AzureMapsDesign
Road · RoadShadedRelief · Blank · BlankAccessible · Satellite · SatelliteRoadLabels · GrayscaleDark / Light · Night · HighContrastDark / Light(12)
Cesium
React
CesiumDesign
Default · None

Only the rows that differ per platform are annotated; everywhere else the type name and the preset constant names are the same on all three platforms.

Platform

03 · Switching

Assign to mapDesignType on the map view state. The state is observed, so the map changes the moment you assign.

MapDesignMapPage.kt · Jetpack Compose
// state は MapViewStateInterface<*>。プロバイダごとの型に絞って代入する
when (state) {
    is GoogleMapViewStateInterface ->
        state.mapDesignType = GoogleMapDesign.Satellite
    is MapLibreViewStateInterface ->
        state.mapDesignType = MapLibreDesign.OsmBrightJa
    is MapTilerViewStateInterface ->
        state.mapDesignType = MapTilerDesign.Toner
}

04 · Defining a custom design

The preset types are the public constructors too. Give an id plus a style JSON URL (vector) or a tile URL template (raster) and your own style is treated exactly like a preset.

CustomDesigns.kt · MapLibre / from a style JSON
// MapLibreDesign は data class。スタイル JSON の URL を渡せば独自デザインになる
val GsiPale =
    MapLibreDesign(
        id = "gsi-pale",
        styleJsonURL = "https://example.com/styles/gsi-pale/style.json",
        attributionRules =
            listOf(
                AttributionRule(attribution = "地理院タイル"),
                AttributionRule(attribution = "GEBCO", minZoom = 5, maxZoom = 8),
            ),
    )
MapDesignPageViewModel.kt · add to the options
private val mapLibreDesigns =
    listOf(
        MapDesignOption(label = "OsmBright", design = MapLibreDesign.OsmBright),
        MapDesignOption(label = "GSI Pale", design = GsiPale),
    )
GoogleMapDesign.Custom · wrap a native value
// ネイティブの mapType 定数をそのまま包み、出典表記だけ足す
val NormalWithNotice =
    GoogleMapDesign.Custom(
        id = MAP_TYPE_NORMAL,
        attributionRules = listOf(AttributionRule(attribution = "自社データ 2026")),
    )

Where the map kind is a native constant — Google Maps — use GoogleMapDesign.Custom, passing the constant as id and supplying your own attribution. MapTiler, Mapbox and HERE expose constructors of the same shape.

05 · Attribution rules

When you bring your own tiles, carry the provider attribution conditions as rules. Only the rules that apply to the current zoom and viewport are shown.

attribution
The text to display; HTML with links is accepted.
minZoom / maxZoom
Zoom range in which the text appears — it disappears outside it.
bounds
Rectangle in which the text applies, e.g. tiles covering only Japan.

06 · Sample apps

All three sample apps ship a design switcher. The UI is idiomatic per platform; only the assignment is shared.

Map design ▾
ANDROID · ExposedDropdownMenu
Map design ⌄
iOS · SwiftUI Menu
<select>
REACT · map-design-selector
What the video shows · Android + MapLibreKotlin · Jetpack Compose
val mapViewState = rememberMapLibreMapViewState(
    mapDesign = MapLibreDesign.DemoTiles,
    cameraPosition = MapCameraPosition(
        position = GeoPoint.fromLatLong(21.382314, -157.933097),
        zoom = 12.0,
    ),
)

val designs = listOf(
    "Demo" to MapLibreDesign.DemoTiles,
    "OSM Bright" to MapLibreDesign.OsmBrightJa,
    "Toner" to MapLibreDesign.MapTilerTonerJa,
)

MapLibreMapView(state = mapViewState, modifier = Modifier.weight(1f))

Row {
    designs.forEach { (label, design) ->
        // Just an assignment. The map is not rebuilt, so the camera stays where it is
        Button(onClick = { mapViewState.mapDesignType = design }) { Text(label) }
    }
}
Sample video · switching designs
Video not shot yetOne map with mapDesignType reassigned, the presets applying in turn. The moment of the switch is the whole point.

Related pages