OpenStreetMap

店舗や観光スポットの地図表示に最適!LeafletでOpenStreetMapにマーカーを追加する方法

この記事は約5分で読めます。
スポンサーリンク

ブログやサービスに地図を掲載する際、「Google Mapsは有料化が進んで使いにくい…」「もっと自由に使える地図が欲しい…」と感じたことはありませんか?

そんなときに頼れるのが OpenStreetMap(OSM)Leaflet.js の組み合わせです。本記事では、OSMの地図上に「ショップ」や「観光スポット」などをマーカーで表示する方法を、初心者にもわかりやすく解説します。

スポンサーリンク

なぜOpenStreetMap+Leafletなのか?

比較項目OpenStreetMap(+Leaflet)Google Maps
利用料金無料商用利用はAPI数に応じて課金
カスタマイズ性非常に高い(HTML+JSで自由に制御可能)制限あり(API依存)
表示スタイルの変更タイルやアイコンを自由に差し替え可能スタイル変更に制限あり
著作権・商用表示制限クレジット表示すれば自由に使えるGoogleの規約順守が必要
軽量さ・速度高速。Leafletは非常に軽量やや重め。モバイルでは読み込みに難あり

カスタマイズ性や軽さ、将来の拡張を考えるなら、Leaflet+OSM の組み合わせは非常に強力です。


まずは地図を表示してみよう

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Leaflet × OpenStreetMap</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<style>
#map { height: 500px; }
</style>
</head>
<body>
<h2>OpenStreetMap × Leafletで観光地マップ</h2>
<div id="map"></div>

<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
var map = L.map('map').setView([35.6895, 139.6917], 13); // 東京駅付近

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
</script>
</body>
</html>

マーカーを追加してみよう(ショップや観光スポット)

// 観光地・スポット情報
var spots = [
{
name: "浅草寺",
lat: 35.7148,
lng: 139.7967,
desc: "東京最古のお寺。雷門と仲見世通りが有名です。"
},
{
name: "東京スカイツリー",
lat: 35.7100,
lng: 139.8107,
desc: "高さ634m、日本一高いタワー。展望デッキからの眺望は圧巻。"
},
{
name: "上野動物園",
lat: 35.7160,
lng: 139.7710,
desc: "パンダで有名な動物園。ファミリーに人気。"
}
];

// マーカー追加処理
spots.forEach(function(spot) {
L.marker([spot.lat, spot.lng])
.addTo(map)
.bindPopup("<b>" + spot.name + "</b><br>" + spot.desc);
});

実際に地図上にクリック可能なマーカーが表示され、説明文付きの吹き出し(ポップアップ)が開きます。

アイコンをカスタムにしたいときは?

デフォルトのマーカーでは物足りない場合、以下のようにオリジナルのアイコン画像を設定できます。

var shopIcon = L.icon({
iconUrl: 'https://example.com/icons/shop.png',
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});

L.marker([35.6895, 139.6917], { icon: shopIcon })
.addTo(map)
.bindPopup("ショップの名前");

※ 商用利用の画像は著作権に注意。

複数マーカーをカテゴリごとにまとめたいなら?

Leafletのレイヤーグループ機能を使えば、カテゴリごとにグループ化して表示・非表示を切り替えることも可能です。

詳しい実装方法はこちらのLeaflet公式チュートリアルをご参照ください。

Leaflet — an open-source JavaScript library for interactive maps
Leaflet is a modern, lightweight open-source JavaScript library for mobile-friendly interactive maps.

注意点:OpenStreetMapの利用にはクレジット表示が必要です

Leaflet × OSMを使う際には、地図の下に以下のようなクレジットを表示する必要があります。

attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'

これはライセンス上の義務ですので、必ず記載しましょう。

今後の応用アイデア(本記事では割愛)

  • GeoJSONと連携して外部データをマーカーとして表示
  • マーカーをクリックした際に詳細ページへジャンプ
  • マップ上で検索やフィルターを実装

これらの応用については、別記事で詳しく紹介予定です。


おわりに

Google Mapsでは自由にできなかった地図の「見せ方」や「使い方」が、LeafletとOpenStreetMapを使うことで柔軟に実現できます。

自社サービスのマップ表示や、観光ブログ、ポータルサイトなど、「伝えたい場所がある」すべての人にとって、Leafletは非常に強力な武器になります。

スポンサーリンク
OpenStreetMap
フォローしてね
スポンサーリンク

コメント

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