Leaflet では・・・
- 背景地図+オーバレイ、というのが基本的な考え方でした。
(そういう、概念データモデルでした)。
//-------- in Leaflet --------//
// 背景地図 + オーバレイ
// tileLayer image
// video
// GeoJSON
- 従ってソースコードはこんな具合でした。
//-------- in Leaflet --------//
// 1. マップをインスタンス化
var map = L.map('map').setView([35.0,135.0],5);
// 2. タイルレイヤを作成しマップに add する
L.tileLayer('/tiles/my-tile/{z}/{y}/{x}.jpg', {
attribution: '<a href="...">mytile at me</a>'
}).addTo(map);
// 3. さらにいろんなものを add する
L.geoJSON( json, {
color: "maroon"
}).addTo(map);
Mapbox GL JS では・・・
みんな Source
背景地図も、オーバレイも、みんなひっくるめて Source
です。
//-------- in Mapbox --------//
// Sources
// - 背景地図
// - GeoJSON
// - 画像
// - 動画
- 背景地図は
Source
- ベクトルタイル も
Source
( type:vector
) - ラスタタイルも
Source
( type:raster
)
- ベクトルタイル も
- GeoJSON も
Source
( type:geojson
) - 画像も
Source
( type:image
) - 動画も
Source
( type:video
) - 標高タイルも
Source
( type:raster-dem
)
ツマんで Layer
Source
から、見せたいものをツマみ出して Layer
を構成します。
Source
は単なる「データ源」、いわば「ネタ元」。- そこから、見せたいものの「選び出し方」と「見せ方」を決め、
Layer
として出します。- バックエンドで
Source
を用意し、 - フロントエンドへ
Layer
として出す。
- バックエンドで
- ひとつの
Source
から 複数のLayer
を作ることもある。
//-------- in Mapbox --------//
// Sources
// (Source) 背景地図 --> Layer
// (Source) GeoJSON --> Layer
// (Source) 画像
// (Source) 動画 --> Layer
Source
+ Layer
= スタイルファイル
- 背景地図には、海洋、湖沼、河川、道路、線路、建物、その他いろいろなものが
含まれており膨大となるため、
Layer はファイルとして出してしまっておくのが合理的。 - それが「スタイルファイル」。
- すなわちスタイルファイルには、その地図で使う
- 初期の
Source
リスト - 初期の
Layer
定義 が含まれている。
- 初期の
/* スタイルファイルとは名ばかりで `Source` の定義までここに入ってやがる! */
{
"version": 8,
"name": "Klokantech Basic JA",
"center": [
138.731389,
35.362222
],
"zoom": 5,
"bearing": 0,
"pitch": 0,
"sources": { /*** HERE are the Sources ***/
"openmaptiles": {
"type": "vector",
"tiles": ["https://hfu.github.io/jp1710_{z}/{x}/{y}.mvt"],
"attribution": "(c) OpenStreetMap contributors (c) OpenMapTiles",
"maxzoom": 14
}
},
"glyphs": "https://hfu.github.io/noto-jp/{fontstack}/{range}.pbf",
"layers": [
{
"id": "background",
"type": "background",
"paint": {
"background-color": "hsl(47, 26%, 88%)"
}
}, /*** HERE are the Layers ***/
{
"id": "landuse-residential",
"type": "fill",
"source": "openmaptiles",
"source-layer": "landuse",
"filter": [
"all",
[
"==",
"$type",
"Polygon"
],
[
"==",
"class",
"residential"
]
],
"layout": {
"visibility": "visible"
},
"paint": {
"fill-color": "hsl(47, 13%, 86%)",
"fill-opacity": 0.7
}
},
{
"id": "landcover_grass",
"type": "fill",
"source": "openmaptiles",
"source-layer": "landcover",
"filter": [
"==",
"class",
"grass"
],
"paint": {
"fill-color": "hsl(82, 46%, 72%)",
"fill-opacity": 0.45
}
},
: /* Continues */
- 引用元
ここ
(リポジトリ)
from gh-pagesで OSM 日本ベクトルタイル提供 - Qiita
タイルのURL
/* スタイルファイルとは名ばかりで `Source` の定義までここに入ってやがる! */
- 従って、タイルの URL は、
- 「JavaScript のコードの中」ではなく、
- 「スタイルファイルの中」に、
Source
の属性の一つとして、 現れることになる。
- これは、Leaflet との違いであって。
JavaScript の中をいくら捜したって、
どのタイルを使っているかはわからない。
Mapbox さんの商売
- スタイルファイルとして
mapbox:...
という表記ができる。
こう書くと Mapbox GL JS がよきに変換してくれる。
(そしてアクセスカウントが課金につながる)。 - こう書かれるともう中がどういう仕組みなのかまったくわからない。
(二重に隠蔽されてしまっているため)。 - スタイルファイルに
mapbox:
と書くだけであんなキレイなマップが
出てくるから、これがうっかり魔法か何かのように感じてしまう。
=> これが、Mapbox さんのビジネス!
まとめ
- Leaflet は
map
に 背景地図(tileLayer
) や オーバレイ をadd
。 - Mapbox は
Source
からLayer
を構成。- 初期設定はスタイルファイル。
- タイルの場所はスタイルファイルを見なければわからない。