1つの多角形を描く
多角形(’Polygon'
)は'coordinates'
を多角形の頂点の3次元配列で与え、始点と終点で同じ座標とする。レイアウトの'type'
は'fill'
。
以下の例では、ベクトルタイルの地理院地図上に3つの頂点を持つ三角形を描いている。'paint'
で外枠の線を青、塗りつぶしの色を緑、塗りつぶしの不透明度を0.4としている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
let map = new maplibregl.Map({ container: 'map', style: 'https://gsi-cyberjapan.github.io/gsivectortile-mapbox-gl-js/std.json', center: [139.747, 35.677], zoom: 14, minZoom: 4, maxZoom: 17, }); map.on('load', () => { // 1つのPolygonを描く map.addSource('source_polygon', { type: 'geojson', data: { 'type': 'Feature', 'geometry': { 'type': 'Polygon', 'coordinates': [ [ [139.747, 35.682], [139.742, 35.672], [139.752, 35.672], [139.747, 35.682], ] ] }, } }); // Polygonのスタイルを設定 map.addLayer({ 'id': 'layer_polygon', 'type': 'fill', 'source': 'source_polygon', 'layout': {}, 'paint': { 'fill-outline-color': '#0000FF', 'fill-color': '#00FF00', 'fill-opacity': 0.4, } }); }); |
data
で直接Polygon
を指定できる。
|
data: { 'type': 'Polygon', 'coordinates': [ [ [139.747, 35.682], [139.742, 35.672], [139.752, 35.672], [139.747, 35.682], ] ] } |
複数の多角形を描く
以下の例ではaddSource
で2つのPolygon
を描いている。addLayout
は上と同じものを使っており、addSource
とaddLayer
をmap.on
メソッド内で実行させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
// 複数のPolygonを描く map.addSource('source_polygon', { type: 'geojson', data: { 'type': 'FeatureCollection', 'features': [ { 'type': 'Feature', 'geometry': { 'type': 'Polygon', 'coordinates': [ [ [139.747, 35.682], [139.742, 35.672], [139.752, 35.672], [139.747, 35.682], ] ] }, }, { 'type': 'Feature', 'geometry': { 'type': 'Polygon', 'coordinates': [ [ [139.742, 35.677], [139.752, 35.677], [139.747, 35.667], [139.742, 35.677], ] ] } } ] } }); |
'FeatureCollection'
の代わりに直接'MultiPolygon'
で書くと以下の通り。Polygon
の場合は頂点の経緯度配列の3次元配列だったが、MultiPolygon
の場合はさらにそれらの配列、4次元配列になる。
これは折れ線の時と比べるとおかしく思えるが、後述のように1つの図形で複数の閉曲線を持つ場合があるためと考えられる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
data: { 'type': 'MultiPolygon', 'coordinates': [ [[ [139.747, 35.682], [139.742, 35.672], [139.752, 35.672], [139.747, 35.682], ]], [[ [139.742, 35.677], [139.752, 35.677], [139.747, 35.667], [139.742, 35.677], ]] ] } |
捩じれたポリゴンは描けない
以下のように捩じれたポリゴンは描かれない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
// Zig-zag map.addSource('source_polygon', { type: 'geojson', data: { 'type': 'Feature', 'geometry': { 'type': 'Polygon', 'coordinates': [ [ [139.747, 35.682], [139.752, 35.682], [139.747, 35.677], [139.752, 35.677], [139.747, 35.682], ] ] }, } }); |
ドーナッツは描ける
1つのフィーチャーで外側のポリゴンに内側のポリゴンが収まっていれば、描画方向に関わらずドーナッツのようなポリゴンになる。ただしドーナッツの穴の中にポリゴンを置くとうまく描かれない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
// Doughnut map.addSource('source_polygon', { type: 'geojson', data: { 'type': 'Polygon', 'coordinates': [ [ [139.742, 35.682], [139.752, 35.682], [139.752, 35.672], [139.742, 35.672], [139.742, 35.682], ], [ [139.743, 35.681], [139.751, 35.681], [139.751, 35.678], [139.743, 35.678], [139.743, 35.681], ], [ [139.751, 35.673], [139.743, 35.673], [139.743, 35.676], [139.751, 35.676], [139.751, 35.673], ], ] } }); |