ドキュメント / 基本 / Raster Layer

ラスターレイヤー

XYZ タイルのURLテンプレートを指定して、任意のタイルセットを地図に重ねます。地理院タイルなどの外部タイルをそのまま使えます。

ANDROID
com.mapconductor:core
iOS
MapConductorCore
REACT
@mapconductor/js-sdk-react
プラットフォーム

01 · 使い方

ソースにURLテンプレートを渡すだけです。透明度やズーム範囲はレイヤー側で制御します。

RasterLayerScreen.kt · Jetpack Compose
val rasterLayerState = RasterLayerState(
    id = "gsi-raster",
    source = RasterLayerSource.UrlTemplate(
        template = "https://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png",
        tileSize = 256,
        minZoom = 5,
        maxZoom = 15,
    ),
    opacity = 0.75f,
)

MapLibreMapView(state = mapState) {
    RasterLayer(rasterLayerState)
}

02 · 主なオプション

Option
Default
説明
template
{z}/{x}/{y} を含むタイルのURLテンプレート。
tileSize
512
タイルの1辺のピクセル数。
minZoom / maxZoom
なし
レイヤーを表示するズーム範囲。未指定なら全ズームで表示します。
attributionRules
[]
ズームや範囲に応じた出典表記のルール。source に指定します。
opacity
1.0
レイヤー全体の不透明度(レイヤー側の指定)。
visible
true
表示・非表示の切り替え。
zIndex
0
他のレイヤーとの重なり順。
userAgent
MapConductor/…
タイル取得時の User-Agent。対応状況はプロバイダによります(下表)。
extraHeaders
なし
タイル取得時に付ける追加ヘッダ。認証トークンなど。対応状況はプロバイダによります(下表)。

03 · ヘッダの対応状況

タイルを取りに行くのは各プロバイダの地図SDKで、リクエストを書き換える口があるかどうかはSDKごとに違います。口が無いプロバイダでは指定は無視され、実行時にログが出ます。下表はタイル要求を実際に受け取って確認した結果です(ネイティブは実機、Webはブラウザ)。

Webでは userAgent はどのプロバイダでも効きません。ブラウザが User-Agent の上書きを禁じているためで、SDK側で回避する方法はありません。プロパティ自体はReact Nativeのために残してあり、RNではネイティブSDKへ値が渡って実際に効きます。同じコードをWebとRNの両方で動かせるようにするための意図的な設計です。

Provider
iOS
Android
Web(extraHeaders)
備考
MapLibre
iOS は MLNNetworkConfiguration、Android は OkHttp クライアントの差し替え、Web は maplibre-gl の transformRequest 経由。いずれもタイル配信ホスト宛のリクエストにだけ載ります。
MapTiler
iOS は MapLibre と同じ仕組み。Android の MapTiler SDK は WebView 上で動くため、ネイティブ側からヘッダを差し替えられません。
MapKit
iOS 専用のプロバイダです。
HERE
iOS はヘッダ指定があるときだけローカルプロキシ経由になります(1ホップ増えます)。
Google Maps
userAgent
Android は自前でタイルを取得するため両方使えます。iOS の GMSURLTileLayer は userAgent しか公開しておらず、extraHeaders は無視されます。
Mapbox
iOS / Android のSDKにはリクエストを書き換える公開APIがありません。Web の mapbox-gl には transformRequest があるため、Webだけ対応しています。
ArcGIS
同上。
TomTom
同上。
Longdo
同上。
Leaflet
Web専用。ヘッダ指定があるときだけ fetch でタイルを取り、blob に差し替えます。
OpenLayers
Web専用。同上(tileLoadFunction を差し替え)。
Azure Maps
Web専用。transformRequest 経由。
Cesium
✓(未計測)
Web専用。headers を持つ Resource を渡す実装ですが、サンプルアプリ側の別の不具合で実測できていません。

ヘッダが必須のタイルサーバを使う場合は、対応しているプロバイダを選んでください。非対応のプロバイダでも、URLのクエリパラメータにトークンを載せる方式なら利用できます。

04 · サンプル

地理院タイルの例

サンプルでは陰影起伏図と標準地図を切り替え、透明度をスライダーで変更しています。出典表記は attributionRules で自動的に切り替わります。

動画で見せる実装 · Android + MapLibreKotlin · Jetpack Compose
var opacity by remember { mutableFloatStateOf(0.75f) }
var relief by remember { mutableStateOf(true) }

val layerState = remember { RasterLayerState(id = "gsi-raster") }

// source も opacity も後から差し替えられる。レイヤーは作り直されない
LaunchedEffect(relief, opacity) {
    layerState.source = RasterLayerSource.UrlTemplate(
        template = if (relief) {
            "https://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png"
        } else {
            "https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png"
        },
        tileSize = 256,
        minZoom = 5,
        maxZoom = 15,
    )
    layerState.opacity = opacity
}

MapLibreMapView(state = mapViewState) {
    RasterLayer(layerState)
}

Slider(value = opacity, onValueChange = { opacity = it })
Switch(checked = relief, onCheckedChange = { relief = it })
サンプル動画 · ラスタタイルを重ねる
動画 未撮影外部のタイルサーバを重ね、ズームに合わせてタイルが差し替わっていく様子。

関連ページ