MapLibre GL JSと国土地理院データで作るWeb地図

WEB制作その他
記事内に広告が含まれています。

WebアプリケーションにMapLibre 国土地理院の信頼性の高い地図データを組み込もうとしたとき、どのようにタイルを指定すればよいか、迷ったことはありませんか? 国土地理院が提供する地図や標高データを自分のWebアプリに表示させたいものの、どのURLを使えばいいのか、ラスタとベクトルで何が違うのか、あるいは3D地形や独自のデータをどう重ね合わせるべきか、実装の手順でつまずくケースは少なくありません。

この記事では、MapLibre GL JSを使って国土地理院の各種データを自分のプロジェクトにスムーズに組み込み、実用的なWeb地図アプリを構築する方法を分かりやすく解説します。

この記事を読んでわかること

  • 標準地図や淡色地図、航空写真などの正しいタイルURLと用途に応じた選び方
  • ベクトルタイル(地理院地図Vector)のスタイル設定と読み込み手順
  • 標高データや陰影起伏を活用した3D地形・山岳マップの実装方法
  • ハザードマップや観光マップなど、独自GeoJSONを重ねた実用的なアプリ構築例
  • 出典表記の正しい書き方や、商用利用・ライセンス、画面が真っ白になったときの原因と解決方法

国土地理院の豊かな地理空間データを活かして、思い通りのWeb地図を実現してみてください。

  1. MapLibre GL JSで国土地理院の背景地図を表示する基本手順
    1. 標準地図・淡色地図・航空写真・白地図のタイルURLと選び方
    2. npmとCDNの導入方法とHTML・JSによる最小構成のサンプルコード
    3. 地理院地図VectorのスタイルJSONを利用したベクトルタイルの読み込み方
  2. 国土地理院の標高データと3D地形・レイヤーカスタマイズの実装方法
    1. 標高タイルとraster-demを活用したリアルな3D地形表示の実装手順
    2. 地理院ベクトルタイルの道路や建物の色分け・非表示などのスタイル調整
    3. 独自GeoJSONデータとマーカー・ポップアップの重ね合わせ表示
  3. 実用的なWeb地図アプリの構築例
    1. ハザードマップ・防災情報マップの作り方
    2. 観光マップ・店舗マップにGeoJSONとポップアップを組み合わせる
    3. 登山マップに標高・等高線・3D地形を活用する
  4. 国土地理院データ利用のライセンスと注意点
    1. 地理院タイルの利用条件と「国土地理院」出典表記の方法
    2. 改変・再配布・商用利用で確認すべきポイント
    3. 地理院ベクトルタイルの大量取得・キャッシュ・継続利用の注意点
  5. タイルが表示されない・画面が真っ白になるときの原因と解決方法
    1. URLの指定ミス・{z}/{x}/{y}の書き間違い・拡張子(png/jpg)の確認ポイント
    2. style JSONの記述ミスとコンソールのエラーメッセージの読み方
    3. CORS・HTTPエラー(404・403)・ネットワーク障害・ズーム範囲外の対処法
  6. よくある質問(FAQ)
  7. まとめ

MapLibre GL JSで国土地理院の背景地図を表示する基本手順

MapLibre GL JSで国土地理院の背景地図を表示する基本手順

MapLibre GL JSで国土地理院(GSI)のデータを利用する第一歩として、背景地図の選択と読み込み方法を解説します。国土地理院が提供する多様なタイルの中から、目的に応じた最適な背景地図を選び、コードに組み込む手順を確認していきましょう。

標準地図・淡色地図・航空写真・白地図のタイルURLと選び方

国土地理院は、Webアプリや地理空間情報システムで利用できる様々なラスタタイルを公開しています。用途に応じた適切なタイルを選択し、正しいURLスキームを指定することが重要です。

地図の種類タイルURLパターン表示上の特徴適した用途ズームレベル
標準地図https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png地名、道路、建物などの情報が詳細に記載された標準的な地図総合的な案内マップ、一般的な位置確認Z2〜Z18
淡色地図https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png色使いを抑え、文字や統計データを重ねやすいように調整された地図統計データの可視化、独自のレイヤーを重ねる地図Z2〜Z18
航空写真https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg全国をカバーするシームレスな空中写真(オルソ画像)現地状況の把握、自然災害の確認、観光マップZ2〜Z18(一部地域で高ズーム対応)
白地図https://cyberjapandata.gsi.go.jp/xyz/blank/{z}/{x}/{y}.png道路や行政界の線をメインに描画したシンプルな背景独自の境界線やエリア情報の書き込み、教育用資料Z2〜Z14

※タイルの詳細な提供範囲や最新の仕様については、国土地理院 地理院タイル一覧をご確認ください。

npmとCDNの導入方法とHTML・JSによる最小構成のサンプルコード

MapLibre GL JSの基本的な導入手順(環境構築の前提など)については、MapLibreの使い方ガイドを参考にしてください。ここでは国土地理院のラスタタイルを表示するための具体的なコードに焦点を当てます。

CDNを利用する場合は、HTMLファイルの <head> 内でMapLibre GL JSのCSSとJSを読み込み、コンテナ要素を指定して地図を初期化します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MapLibre 国土地理院 標準地図サンプル</title>
    <!-- MapLibre GL JSのCSS読み込み -->
    <link href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css" rel="stylesheet" />
    <style>
        body { margin: 0; padding: 0; }
        #map { width: 100%; height: 100vh; }</style>
</head>
<body>
    <div id="map"></div>

    <!-- MapLibre GL JSのJavaScript読み込み -->
    <script src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js"></script>
    <script>
        const map = new maplibregl.Map({
            container: 'map', // 地図を表示するdiv要素のID
            style: {
                version: 8,
                sources: {
                    'gsi-std': {
                        type: 'raster',
                        tiles: [
                            'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png'
                        ],
                        tileSize: 256,
                        attribution: '<a href="<https://maps.gsi.go.jp/development/ichiran.html>" target="_blank">国土地理院</a>'
                    }
                },
                layers: [
                    {
                        id: 'gsi-std-layer',
                        type: 'raster',
                        source: 'gsi-std',
                        minzoom: 0,
                        maxzoom: 18
                    }
                ]
            },
            center: [139.7671, 35.6812], // 初期表示の中心座標(東京駅周辺)
            zoom: 11
        });</script>
</body>
</html>

npm環境で開発を進める場合は、パッケージをインストールしてモジュールとして読み込みます。

npm install maplibre-gl
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

const map = new maplibregl.Map({
    container: 'map',
    style: {
        version: 8,
        sources: {
            'gsi-pale': {
                type: 'raster',
                tiles: [
                    'https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png'
                ],
                tileSize: 256,
                attribution: '<a href="<https://maps.gsi.go.jp/development/ichiran.html>" target="_blank">国土地理院</a>'
            }
        },
        layers: [
            {
                id: 'gsi-pale-layer',
                type: 'raster',
                source: 'gsi-pale',
                minzoom: 0,
                maxzoom: 18
            }
        ]
    },
    center: [135.0, 35.0],
    zoom: 7
});

地理院地図VectorのスタイルJSONを利用したベクトルタイルの読み込み方

ラスタタイルが画像データをそのまま配信するのに対し、地理院地図Vectorなどのベクトルタイルは、ベクターデータ(PBF形式)をクライアント側で描画します。ベクトルタイルを利用することで、拡大時も文字や線の輪郭が鮮明に保たれ、柔軟なスタイル変更が可能になります。

国土地理院が提供するベクトルタイルや、PMTiles形式で配信されるデータをMapLibre GL JSで読み込むには、適切なスタイルJSONと、必要に応じたプロトコル登録(PMTiles利用時の pmtiles ライブラリなど)を行います。

以下は、ベクトルタイルソースを独自に定義してスタイルJSONに組み込む構成例です。

const map = new maplibregl.Map({
    container: 'map',
    style: {
        version: 8,
        sources: {
            'gsi-vector': {
                type: 'vector',
                tiles: [
                    'https://cyberjapandata.gsi.go.jp/xyz/experimental_bvmap/{z}/{x}/{y}.pbf'
                ],
                minzoom: 4,
                maxzoom: 16,
                attribution: '<a href="<https://github.com/gsi-cyberjapan/gsimaps-vector-experiment>" target="_blank">国土地理院ベクトルタイル提供実験</a>'
            }
        },
        layers: [
            {
                id: 'background',
                type: 'background',
                paint: { 'background-color': '#f8f4f0' }
            },
            {
                id: 'transp-road',
                type: 'line',
                source: 'gsi-vector',
                'source-layer': 'road', // ベクトルタイル内のソースレイヤー名
                paint: {
                    'line-color': '#ff9900',
                    'line-width': 1.5
                }
            }
        ]
    },
    center: [139.7671, 35.6812],
    zoom: 14
});

ベクトルタイルを利用する際は、配信方式や対応する source-layer 名が提供仕様によって異なるため、利用するデータセットのドキュメントや公式リポジトリを確認した上でレイヤー構造を構築してください。

国土地理院の標高データと3D地形・レイヤーカスタマイズの実装方法

国土地理院の標高データと3D地形・レイヤーカスタマイズの実装方法

国土地理院の背景地図やベクトルタイルをベースに、3D地形の表現、スタイルの細やかな調整、そして独自のGeoJSONデータを重ね合わせる具体的な実装方法を解説します。

標高タイルとraster-demを活用したリアルな3D地形表示の実装手順

国土地理院は、全国の標高値をRGBカラーの画像として配信する「標高タイル(DEM)」を提供しています。MapLibre GL JSで3D地形を表現するには、raster-dem ソースを使用して地形データを読み込み、map.setTerrain() メソッドを適用します。

ただし、国土地理院の標高タイル(PNG形式)は独自のRGB符号化方式(標高値を赤・緑・青の階調に変換した形式)を採用しており、MapLibre GL JSの標準的な raster-dem(MapboxフォーマットやTerrariumフォーマットを想定)とはエンコード方式が異なります。そのため、標高タイルをそのまま raster-dem ソースに指定するだけでは正確な高低差に復号されない点に注意が必要です。

正確な3D地形を構築する場合は、国土地理院の標高タイルを処理可能な形式に変換したデータソースを利用するか、カスタムの標高プロトコルを介して値を復号する必要があります。以下は、DEMソースと setTerrain、および陰影起伏(Hillshade)を組み合わせる際の基本的な実装構造です。

// 地図の初期化とDEMソース・3D地形の設定例
const map = new maplibregl.Map({
    container: 'map',
    style: {
        version: 8,
        sources: {
            'gsi-std': {
                type: 'raster',
                tiles: ['https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png'],
                tileSize: 256,
                attribution: '<a href="<https://maps.gsi.go.jp/development/ichiran.html>" target="_blank">国土地理院</a>'
            },
            // 標高DEMソースの定義(※利用する環境に応じたDEMタイルURLやエンコード設定が必要)
            'gsi-terrain': {
                type: 'raster-dem',
                tiles: [
                    // 注: 国土地理院の標高タイルをそのまま指定する場合、デコード処理や変換済みタイル配信の併用を推奨
                    'https://cyberjapandata.gsi.go.jp/xyz/dem_png/{z}/{x}/{y}.png'
                ],
                tileSize: 256,
                maxzoom: 15
            }
        },
        layers: [
            {
                id: 'gsi-std-layer',
                type: 'raster',
                source: 'gsi-std'
            },
            {
                id: 'hills',
                type: 'hillshade',
                source: 'gsi-terrain',
                paint: {
                    'hillshade-exaggeration': 0.5 // 陰影の強調度合い
                }
            }
        ]
    },
    center: [138.7274, 35.3606], // 富士山周辺
    zoom: 11,
    pitch: 60, // 傾斜角をつけて3D表示を有効化
    bearing: -20
});

map.on('load', () => {
    // 3D地形の高低差を有効化
    // map.setTerrain({ source: 'gsi-terrain', exaggeration: 1.5 });
});

立体的な起伏を視覚的に表現するだけであれば、上記のように hillshade レイヤーを活用することで、標高データをデコードする複雑な処理を行わずに起伏豊かな地図表現を実現できます。

地理院ベクトルタイルの道路や建物の色分け・非表示などのスタイル調整

地理院ベクトルタイルや独自配信のPBFデータを利用する場合、スタイルJSONの paint プロパティや filter プロパティを調整することで、道路の太さ、建物の色、特定のレイヤーの非表示などを自由に制御できます。

ベクトルタイルは、データ内部のレイヤー構造である source-layer ごとにスタイルを適用します。以下は、道路や建物の色分け・表示制御を行うスタイル設定の例です。

const vectorStyle = {
    version: 8,
    sources: {
        'gsi-vector': {
            type: 'vector',
            tiles: ['https://cyberjapandata.gsi.go.jp/xyz/experimental_bvmap/{z}/{x}/{y}.pbf'],
            minzoom: 4,
            maxzoom: 16
        }
    },
    layers: [
        {
            id: 'background',
            type: 'background',
            paint: { 'background-color': '#f2f2f2' }
        },
        {
            id: 'building-layer',
            type: 'fill',
            source: 'gsi-vector',
            'source-layer': 'building', // ベクトルタイル内の建物レイヤー
            paint: {
                'fill-color': '#d0d0d0',
                'fill-opacity': 0.8
            }
        },
        {
            id: 'road-layer',
            type: 'line',
            source: 'gsi-vector',
            'source-layer': 'road', // ベクトルタイル内の道路レイヤー
            paint: {
                'line-color': [
                    'match',
                    ['get', 'class'], // 道路種別プロパティに応じた色分け
                    'highway', '#ff5722',
                    'major_road', '#ff9800',
                    '#b0bec5' // その他道路の色
                ],
                'line-width': [
                    'interpolate', ['linear'], ['zoom'],
                    10, 1,
                    16, 4
                ]
            }
        }
    ]
};

このように match 式や interpolate 式を用いることで、ズームレベルやデータの属性値に連動した洗練されたデザイン調整が可能になります。

独自GeoJSONデータとマーカー・ポップアップの重ね合わせ表示

国土地理院の背景地図の上に、独自の施設データや調査地点などのGeoJSONを重ね、クリック時に詳細情報をポップアップで表示する実装を行います。マーカーの基本的な追加方法やイベント処理の詳細はMapLibreの使い方ガイドも合わせて参照してください。

以下は、GeoJSONソースを追加し、レイヤー描画とポップアップを連動させるコードです。

map.on('load', () => {
    // 独自のGeoJSONデータをソースとして追加
    map.addSource('custom-spots', {
        type: 'geojson',
        data: {
            type: 'FeatureCollection',
            features: [
                {
                    type: 'Feature',
                    geometry: {
                        type: 'Point',
                        coordinates: [139.7671, 35.6812]
                    },
                    properties: {
                        title: '東京オフィス',
                        description: '東京都千代田区の拠点です。'
                    }
                }
            ]
        }
    });

    // ポイントを円(Circle)として描画するレイヤーを追加
    map.addLayer({
        id: 'spots-circle',
        type: 'circle',
        source: 'custom-spots',
        paint: {
            'circle-radius': 8,
            'circle-color': '#007cbf',
            'circle-stroke-width': 2,
            'circle-stroke-color': '#ffffff'
        }
    });

    // クリックイベントの設定(ポップアップ表示)
    map.on('click', 'spots-circle', (e) => {
        const coordinates = e.features[0].geometry.coordinates.slice();
        const title = e.features[0].properties.title;
        const description = e.features[0].properties.description;

        // 画面端クリック時のズレを防ぐ処理
        while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
            coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
        }

        new maplibregl.Popup()
            .setLngLat(coordinates)
            .setHTML(`<strong>${title}</strong><p>${description}</p>`)
            .addTo(map);
    });

    // カーソルをポインタに変更
    map.on('mouseenter', 'spots-circle', () => {
        map.getCanvas().style.cursor = 'pointer';
    });
    map.on('mouseleave', 'spots-circle', () => {
        map.getCanvas().style.cursor = '';
    });
});

この実装により、国土地理院の信頼性の高い背景地図上に、業務や目的に応じた独自の地理情報をインタラクティブに重ね合わせることができます。

実用的なWeb地図アプリの構築例

実用的なWeb地図アプリの構築例

国土地理院の背景地図や標高データ、独自データを組み合わせることで、防災、観光、登山など、具体的な目的に応じた実用的なWeb地図アプリを構築できます。ここでは、代表的な3つのユースケースにおける実装のポイントと構成例を解説します。

ハザードマップ・防災情報マップの作り方

防災関連のWebアプリでは、正確な位置情報の把握と、災害リスク情報を視覚的に重ね合わせることが求められます。国土地理院の淡色地図や白地図をベースマップとして採用し、ハザードマップ等の外部データを重ねる構成が効果的です。

防災情報は一般的にGeoJSONや外部タイルとして配信されます。以下のコードは、淡色地図の背景に浸水想定区域などのポリゴンデータをGeoJSONソースとして追加し、リスク情報を重ね合わせる実装例です。

const map = new maplibregl.Map({
    container: 'map',
    style: {
        version: 8,
        sources: {
            'gsi-pale': {
                type: 'raster',
                tiles: ['https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png'],
                tileSize: 256,
                attribution: '<a href="<https://maps.gsi.go.jp/development/ichiran.html>" target="_blank">国土地理院</a>'
            },
            'hazard-data': {
                type: 'geojson',
                data: 'https://example.com/data/flood-risk.json' // 外部のハザードマップGeoJSONデータ
            }
        },
        layers: [
            {
                id: 'gsi-pale-layer',
                type: 'raster',
                source: 'gsi-pale'
            },
            {
                id: 'hazard-fill',
                type: 'fill',
                source: 'hazard-data',
                paint: {
                    'fill-color': '#ff4d4d',
                    'fill-opacity': 0.4,
                    'fill-outline-color': '#b30000'
                }
            }
        ]
    },
    center: [139.6917, 35.6895],
    zoom: 12
});

防災情報を扱う際は、データの更新日時や出典元をUI上に明記し、地図上の表示だけで避難判断を断定させない注意書きを併記することが重要です。

観光マップ・店舗マップにGeoJSONとポップアップを組み合わせる

観光スポットや店舗情報を網羅したWebマップでは、ユーザーの利便性を高めるために視認性の高いマーカーや詳細情報のポップアップが不可欠です。標準地図や淡色地図を背景に、スポットの位置情報をまとめたGeoJSONを読み込ませます。

以下は、複数のポイントデータに対してアイコンや色分けを適用し、クリック時に店舗詳細を表示する実装の骨組みです。

map.on('load', () => {
    map.addSource('stores', {
        type: 'geojson',
        data: {
            type: 'FeatureCollection',
            features: [
                {
                    type: 'Feature',
                    geometry: { type: 'Point', coordinates: [139.7715, 35.6852] },
                    properties: { name: '店舗A', category: 'cafe', address: '東京都中央区...' }
                },
                {
                    type: 'Feature',
                    geometry: { type: 'Point', coordinates: [139.7630, 35.6810] },
                    properties: { name: '店舗B', category: 'shop', address: '東京都千代田区...' }
                }
            ]
        }
    });

    // カテゴリごとに色を分けて円を描画
    map.addLayer({
        id: 'store-points',
        type: 'circle',
        source: 'stores',
        paint: {
            'circle-radius': 7,
            'circle-color': [
                'match',
                ['get', 'category'],
                'cafe', '#ff7043',
                '#42a5f5'
            ],
            'circle-stroke-width': 2,
            'circle-stroke-color': '#ffffff'
        }
    });

    // クリック時のポップアップ表示
    map.on('click', 'store-points', (e) => {
        const coords = e.features[0].geometry.coordinates.slice();
        const props = e.features[0].properties;

        new maplibregl.Popup()
            .setLngLat(coords)
            .setHTML(`<strong>${props.name}</strong><br>住所: ${props.address}`)
            .addTo(map);
    });
});

マーカーやポップアップの制御についての詳細な手法は、MapLibreの使い方ガイドでも解説しています。

登山マップに標高・等高線・3D地形を活用する

登山やハイキング向けのWebマップでは、起伏の把握やルートの安全性確認が重要となります。国土地理院が提供する標高タイルや陰影起伏、および重ね合わせ用の等高線タイルを活用することで、立体感のある登山マップを構築できます。

登山マップでは、傾斜の度合いや山岳地帯の細かい地形を視認しやすくするため、標準地図に加えて hillshade レイヤーや標高データを組み合わせます。

const map = new maplibregl.Map({
    container: 'map',
    style: {
        version: 8,
        sources: {
            'gsi-std': {
                type: 'raster',
                tiles: ['https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png'],
                tileSize: 256,
                attribution: '<a href="<https://maps.gsi.go.jp/development/ichiran.html>" target="_blank">国土地理院</a>'
            },
            'gsi-dem': {
                type: 'raster-dem',
                tiles: ['https://cyberjapandata.gsi.go.jp/xyz/dem_png/{z}/{x}/{y}.png'],
                tileSize: 256,
                maxzoom: 15
            }
        },
        layers: [
            {
                id: 'gsi-std-layer',
                type: 'raster',
                source: 'gsi-std'
            },
            {
                id: 'mountain-hills',
                type: 'hillshade',
                source: 'gsi-dem',
                paint: {
                    'hillshade-exaggeration': 0.7,
                    'hillshade-shadow-color': '#2b3e50'
                }
            }
        ]
    },
    center: [137.6485, 36.2598], // 槍ヶ岳・穂高岳周辺
    zoom: 12,
    pitch: 50
});

このような立体表現や陰影を加えることで、険しい山岳地形や尾根・谷筋を視覚的に把握しやすくなります。ただし、Web地図上の標高データや3D表現はあくまで参考情報であり、実際の登山の安全性や気象条件を完全に保証するものではない点に留意してください。

国土地理院データ利用のライセンスと注意点

国土地理院データ利用のライセンスと注意点

国土地理院が提供する地理院タイルや各種データは、Webサイトやアプリで手軽に利用できますが、無条件に自由に使えるわけではありません。利用目的や利用形態に応じた規約の遵守、適切な出典表記、申請の要否の確認が必要です。

地理院タイルの利用条件と「国土地理院」出典表記の方法

国土地理院のデータを利用する際は、「国土地理院コンテンツ利用規約」に基づいた出典表記が必須となります。

MapLibre GL JSで地理院タイルを表示する場合、sources オブジェクトの attribution プロパティに出典情報を指定します。リンクを含めた適切なHTML形式で記述するのが一般的です。

sources: {
    'gsi-std': {
        type: 'raster',
        tiles: ['https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png'],
        tileSize: 256,
        // 出典表記の標準的な指定例
        attribution: '<a href="<https://maps.gsi.go.jp/development/ichiran.html>" target="_blank">国土地理院</a>'
    }
}

出典表記における主なポイントは以下の通りです。

  • Web画面上での表示: 地図の右下などに常時読める形で「国土地理院」と表示し、可能であれば国土地理院 地理院タイル一覧へのリンクを設定します。
  • データごとの固有条件: 気象庁や他機関のデータを国土地理院が重ね合わせて配信しているタイルなど、一部の特殊なデータでは追加の出典表記が必要になる場合があります。

改変・再配布・商用利用で確認すべきポイント

国土地理院のデータを商用サービスや二次利用で活用する場合、利用の形態によって「国土地理院長への申請(測量法第29条・第30条に基づく承認申請)」が必要かどうかが変わります。

利用形態申請の要否補足・確認ポイント
Webサイトやアプリでのリアルタイム表示原則不要国土地理院のサーバーから直接タイル画像を読み込んで背景表示する一般的な利用方法。適切な出典表記が必要。
データを加工・トレースして新たなデータを再現要確認(申請が必要な場合あり)地図画像から道路網などを独自に抽出・ベクター化して新たな基本測量成果に相当するデータを作成する場合。
タイルデータ自体をローカルや自社サーバーへ保存・再配信申請が必要な場合ありオフライン利用や独自サーバー配信を目的に、データを大規模にコピー・複製して再配布する場合。
商用サイト・有料サービスでの背景利用原則不要(表示のみの場合)サービス自体を有料で提供していても、背景地図として国土地理院のサーバーから表示するだけであれば申請不要なケースが多い。

※利用目的が「申請不要」の範囲に収まるかどうか不安な場合は、必ず国土地理院の利用案内(申請要否の判定チェックシート等)を参照してください。

地理院ベクトルタイルの大量取得・キャッシュ・継続利用の注意点

アプリのパフォーマンス向上やオフライン対応を目的にタイルを大量ダウンロードしたり、サーバーにキャッシュしたりする際は、配信サーバーへの負荷と利用規約への配慮が必要です。

  1. サーバーへの負荷軽減: 自動プログラム(スクレイピング等)による大量・短時間での一括ダウンロードは、地理院タイルの配信サーバーに過度な負荷をかけるため厳禁です。
  2. キャッシュの取扱い: 一時的なブラウザキャッシュを超えて大量のタイルをローカルストレージや独自サーバーに複製・蓄積する場合は、測量法に基づく複製承認申請が必要となる場合があります。
  3. 実験的提供データの仕様変更: ベクトルタイル提供実験(experimental_bvmap など)のデータは、予告なくURLやスキーマ構造、配信仕様が変更・終了される可能性が提示されています。商用環境や長期的な運用を行うアプリでは、正式運用されているタイル規格の採用や、定期的な公式アナウンスの確認を行ってください。

タイルが表示されない・画面が真っ白になるときの原因と解決方法

タイルが表示されない・画面が真っ白になるときの原因と解決方法

MapLibre GL JSで国土地理院の地図を組み込む際、「画面が真っ白のまま地図が出ない」「一部のタイルだけが欠けて表示される」といったトラブルが発生することがあります。多くの場合、設定や通信手順の切り分けによって解決可能です。ブラウザの開発者ツール(F12キー)を活用したチェックポイントと対処手順を解説します。

URLの指定ミス・{z}/{x}/{y}の書き間違い・拡張子(png/jpg)の確認ポイント

最も頻繁に見られる原因は、地理院タイルのURL指定ミスです。プレースホルダーや拡張子が間違っていると、配信サーバーが画像を見つけられずエラーを返します。

  • {z}/{x}/{y} の表記: 大文字小文字の違いや、括弧の種類の間違い({Z}/{X}/{Y} や %z/%x/%y など)に注意してください。MapLibre GL JSがズーム・座標値に自動変換できるよう、半角小文字の {z}, {x}, {y} を使用します。
  • 拡張子の誤り: タイル種別によって拡張子が異なります。
    • 標準地図・淡色地図・白地図: .png
    • 航空写真(seamlessphoto等): .jpg
  • プロトコルの記述: http:// ではなく、必ず https:// から始まるURLを指定してください。

確認方法: ブラウザの開発者ツールを開き、「ネットワーク(Network)」タブを開いて地図を操作します。赤字で失敗しているリクエストを選択し、リクエスト先URLが正しく {z}/{x}/{y} に展開されているか確認します。

style JSONの記述ミスとコンソールのエラーメッセージの読み方

スタイル設定(style オブジェクト)の記述に誤りがあると、MapLibre GL JSの描画エンジンが正常に起動せず、地図エリア全体が真っ白になります。

開発者ツールの「コンソール(Console)」タブに赤文字で表示される代表的なエラーメッセージと原因は以下の通りです。

  • Error: Invalid style object / JSON.parse error: スタイルオブジェクト内のカンマの脱落や括弧の閉じ忘れなど、JSONとしての構文エラーです。
  • Error: Unknown source "gsi-std": layers 配列内のレイヤー設定で指定している source 名(例: source: 'gsi-std')が、sources オブジェクト側で正しく定義されていません。IDの綴り合わせを確認してください。
  • Error: Could not load glyphs / sprite: ベクトルタイル利用時、フォントデータ(glyphs)やアイコンスプライト(sprite)の参照URLが正しく設定されていない場合に発生します。ラスタタイル表示のみの場合は、これらの指定を省略できます。

CORS・HTTPエラー(404・403)・ネットワーク障害・ズーム範囲外の対処法

ネットワーク通信やタイルの提供範囲に関連する問題の切り分け手順です。

  1. HTTP 404 (Not Found) の場合: 指定したタイルのズームレベルが、国土地理院の提供範囲外である可能性があります。白地図など最高ズームがZ14までのタイルをZ16で表示しようとすると404エラーが発生します。スタイル設定の maxzoom をタイルの仕様に合わせて制限(例: maxzoom: 14)してください。
  2. HTTP 403 (Forbidden) の場合: リクエストヘッダーやアクセスの過多により拒否されているか、廃止された旧URLを指定している可能性があります。最新の 地理院タイル一覧 で現在の正確なURLを確認してください。
  3. CORS(Cross-Origin Resource Sharing)エラーの場合: 国土地理院の主要な画像タイル・ベクトルタイルはCORSヘッダーが許可されていますが、自前で準備した外部データや一部の特殊な配信サーバーを利用する際にCORSエラーが発生することがあります。サーバー側のCORS設定を確認するか、適切なプロキシを経由してください。
  4. コンテナサイズ(CSS)の未設定: エラーが何も出ていないにもかかわらず画面が表示されない場合、地図を表示する div 要素に高さが指定されていないケースが多発します。CSSで #map { width: 100%; height: 100vh; } など明示的にサイズを指定しているか確認してください。

よくある質問(FAQ)

MapLibreで国土地理院の地図を使うのにAPIキーは必要ですか?

必要ありません。国土地理院が提供している主要な地理院タイル(標準地図、淡色地図、航空写真など)はAPIキーなしで直接読み込んで利用できます。スタイル定義の sources に正しいタイルURLを指定するだけで地図を表示できます。

国土地理院のタイルは商用サイトでも利用できますか?

利用可能です。Webサイトやアプリの背景地図として国土地理院のサーバーから直接読み込んで表示する一般的な利用形態であれば、商用サービスであっても原則として申請不要で利用できます。ただし、画面上での適切な「国土地理院」の出典表記が必須となります。データを加工して再配布する場合やローカルに大量複製する場合は別途申請が必要になる場合があるため、事前によく確認してください。

標準地図・淡色地図・航空写真はどのように使い分ければよいですか?

A. 目的と重ね合わせるデータに応じて使い分けるのが効果的です。

  • 標準地図: 地名や建物、道路が詳細に記載されているため、店舗案内や一般的な位置確認に最適です。
  • 淡色地図: 色遣いが抑えられているため、独自のピンやポリゴン(ハザードマップやエリア分析など)を重ねて視認性を高めたい場合に適しています。
  • 航空写真: 現地の地形や建物の実態を視覚的に把握したい場合や、観光・防災目的のマップに適しています。

国土地理院のベクトルタイルをMapLibreで使うには何が必要ですか?

ベクトルタイルのURL(PBF形式など)をソースとして指定し、描画に必要なレイヤー(line、fill、symbol など)をスタイルJSON内に定義する必要があります。また、PMTiles形式で配信されているデータを利用する場合は、pmtiles ライブラリの読み込みと maplibregl.addProtocol によるプロトコル登録が必要です。

地図が表示されず画面が真っ白になる場合、最初に何を確認すべきですか?

以下の3点を順番に確認してください。

  1. HTML/CSSのコンテナサイズ: 地図を表示する div 要素に #map { width: 100%; height: 100vh; } などの高さ・幅が正しく設定されているか。
  2. タイルのURL表記: {z}/{x}/{y} が半角小文字で書かれているか、拡張子(.png / .jpg)が間違っていないか。
  3. ブラウザの開発者ツール: コンソール(Console)にJSON構文エラーやソースの指定ミスが出ていないか、ネットワーク(Network)タブで通信エラー(404や403)が発生していないか。

まとめ

MapLibre GL JSで国土地理院のデータを利用することで、APIキー不要かつ高品質な背景地図や3D表現をWebアプリケーションに組み込めます。

重要ポイント

  • タイルの選定とURL記述: 用途に応じて標準地図・淡色地図・航空写真・白地図を選び、{z}/{x}/{y} や拡張子(.png/.jpg)を正確に指定する
  • 表示パフォーマンスとスタイル管理: 表示目的(可視化・店舗マップ・登山など)に応じてラスタタイルとベクトルタイルを適切に使い分ける
  • 標高データの扱い: 国土地理院の標高タイル(PNG)は独自の符号化方式を採用しているため、raster-dem や hillshade で扱う際はデコード処理や対応データソースを用意する
  • ライセンスと出典表記: 「国土地理院」の適切な出典表記を行い、データの加工・再配布や大量取得時は利用規約と申請要否を確認する
  • トラブルシューティング: 画面が表示されない場合はCSSのコンテナサイズ、URL表記、開発者ツールのコンソール・ネットワークタブを優先して確認する

国土地理院の信頼性の高い地理空間データを活用し、自社サービスやWebアプリに最適なWeb地図の実装を進めてみてください。

タイトルとURLをコピーしました