<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OpenStreetMap  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/category/tech/osm/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 31 Mar 2026 07:15:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>OpenStreetMap  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>OpenStreetMapは“地図”を超えた──2026年、空間データ基盤の最前線</title>
		<link>https://blog.takeho.com/hd55z8c73ioypitnlep4bp91dh2cta7m/</link>
					<comments>https://blog.takeho.com/hd55z8c73ioypitnlep4bp91dh2cta7m/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 10:42:00 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Leaflet]]></category>
		<category><![CDATA[MapLibre GL JS]]></category>
		<category><![CDATA[OpenLayers]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1854</guid>

					<description><![CDATA[はじめに：OSMは「インフラ」になった OpenStreetMap（OSM）は、長らく「オープンな地図」として認識されてきた。しかし現在、その本質は大きく変化している。 今やOSMは、単なる地図ではなく、現実世界を記述す [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading"><span id="toc1">はじめに：OSMは「インフラ」になった</span></h3>



<p>OpenStreetMap（OSM）は、長らく「オープンな地図」として認識されてきた。しかし現在、その本質は大きく変化している。</p>



<p>今やOSMは、単なる地図ではなく、<strong>現実世界を記述するためのオープンデータ基盤</strong>である。物流、都市開発、AI、自動運転など、多くの分野において不可欠な存在となっている。</p>



<p>その背景には、ここ数年で急速に進んだ技術革新がある。本稿では、その中でも特に重要なトピックを、構造的に整理しながら解説していく。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><ol><li><a href="#toc1" tabindex="0">はじめに：OSMは「インフラ」になった</a></li></ol></li><li><a href="#toc2" tabindex="0">ベクトルタイル革命：地図の描き方が変わった</a><ol><li><a href="#toc3" tabindex="0">ラスタ vs ベクトルタイル比較</a></li><li><a href="#toc4" tabindex="0">何が変わったのか</a></li></ol></li><li><a href="#toc5" tabindex="0">タイル生成の進化：職人技からエンジニアリングへ</a><ol><li><a href="#toc6" tabindex="0">旧アーキテクチャ</a></li><li><a href="#toc7" tabindex="0">最新アーキテクチャ（2026）</a></li><li><a href="#toc8" tabindex="0">進化ポイント</a></li></ol></li><li><a href="#toc9" tabindex="0">フロントエンドGISの時代</a><ol><li><a href="#toc10" tabindex="0">主な描画ライブラリ</a></li><li><a href="#toc11" tabindex="0">技術トレンド</a></li></ol></li><li><a href="#toc12" tabindex="0">ビッグデータとしてのOSM</a><ol><li><a href="#toc13" tabindex="0">スケール比較</a></li><li><a href="#toc14" tabindex="0">できること</a></li></ol></li><li><a href="#toc15" tabindex="0">AI × OSM：データから生成へ</a><ol><li><a href="#toc16" tabindex="0">主な活用領域</a></li><li><a href="#toc17" tabindex="0">変化の本質</a></li></ol></li><li><a href="#toc18" tabindex="0">デジタルツイン化：2Dから3Dへ</a><ol><li><a href="#toc19" tabindex="0">構成要素</a></li><li><a href="#toc20" tabindex="0">活用例</a></li></ol></li><li><a href="#toc21" tabindex="0">タグ体系の課題と進化</a><ol><li><a href="#toc22" tabindex="0">メリット・デメリット</a></li><li><a href="#toc23" tabindex="0">現在の対策</a></li></ol></li><li><a href="#toc24" tabindex="0">APIからストリームへ</a><ol><li><a href="#toc25" tabindex="0">主なデータ取得手段</a></li></ol></li><li><a href="#toc26" tabindex="0">技術スタックまとめ（2026年版）</a><ol><li><a href="#toc27" tabindex="0">現代OSM構成</a></li></ol></li><li><a href="#toc28" tabindex="0">今後のトレンド予測</a><ol><li><a href="#toc29" tabindex="0">重要テーマ</a></li></ol></li><li><a href="#toc30" tabindex="0">ビジネスインパクト</a><ol><li><a href="#toc31" tabindex="0">活用分野</a></li><li><a href="#toc32" tabindex="0">OSMの強み</a></li></ol></li><li><a href="#toc33" tabindex="0">OSMは“現実のOS”になった</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc2">ベクトルタイル革命：地図の描き方が変わった</span></h2>



<p>OSMの進化を語るうえで最も重要なのが、ベクトルタイルの導入である。</p>



<p>従来はサーバー側で画像として地図を生成していたが、現在はデータとして配信し、ブラウザ側で描画する方式へと移行している。</p>



<h3 class="wp-block-heading"><span id="toc3">ラスタ vs ベクトルタイル比較</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>ラスタタイル</th><th>ベクトルタイル</th></tr></thead><tbody><tr><td>形式</td><td>PNG / JPEG</td><td>Protocol Buffers（MVT）</td></tr><tr><td>描画場所</td><td>サーバー</td><td>クライアント（WebGL）</td></tr><tr><td>スタイル変更</td><td>再生成が必要</td><td>即時変更可能</td></tr><tr><td>パフォーマンス</td><td>中</td><td>高速</td></tr><tr><td>拡張性</td><td>低い</td><td>非常に高い</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc4">何が変わったのか</span></h3>



<ul class="wp-block-list">
<li>地図は「画像」から「データ」へ</li>



<li>UIの自由度が爆発的に向上</li>



<li>フロントエンド主導の開発へ移行</li>
</ul>



<p>結論：<strong>地図はバックエンドの産物ではなく、フロントエンドの表現レイヤーになった</strong></p>



<h2 class="wp-block-heading"><span id="toc5">タイル生成の進化：職人技からエンジニアリングへ</span></h2>



<p>ベクトルタイル化は、裏側の生成プロセスも大きく変えた。</p>



<h3 class="wp-block-heading"><span id="toc6">旧アーキテクチャ</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ステップ</th><th>技術</th></tr></thead><tbody><tr><td>データ投入</td><td>osm2pgsql</td></tr><tr><td>DB</td><td>PostGIS</td></tr><tr><td>レンダリング</td><td>Mapnik</td></tr><tr><td>出力</td><td>ラスタタイル</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc7">最新アーキテクチャ（2026）</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ステップ</th><th>技術</th></tr></thead><tbody><tr><td>データ投入</td><td>osm2pgsql / Themepark</td></tr><tr><td>DB</td><td>PostGIS</td></tr><tr><td>タイル生成</td><td>Tilekiln</td></tr><tr><td>出力</td><td>ベクトルタイル</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc8">進化ポイント</span></h3>



<ul class="wp-block-list">
<li>SQLでタイル生成（柔軟性↑）</li>



<li>ETLのモジュール化</li>



<li>スケーラブル設計</li>
</ul>



<p><strong>地図生成が「ブラックボックス」から「設計可能なシステム」へ変化</strong></p>



<h2 class="wp-block-heading"><span id="toc9">フロントエンドGISの時代</span></h2>



<p>現在の地図開発は、サーバーよりもフロントエンドが主役である。</p>



<h3 class="wp-block-heading"><span id="toc10">主な描画ライブラリ</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ライブラリ</th><th>特徴</th></tr></thead><tbody><tr><td>MapLibre GL JS</td><td>OSS・Mapbox互換・主流</td></tr><tr><td>OpenLayers</td><td>高機能・GIS向け</td></tr><tr><td>Leaflet</td><td>軽量・簡易用途</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc11">技術トレンド</span></h3>



<ul class="wp-block-list">
<li>WebGLによる高速描画</li>



<li>スタイルJSONによるUI制御</li>



<li>地図＝UIコンポーネント化</li>
</ul>



<p><strong>地図はAPIではなく「Reactコンポーネント的存在」になった</strong></p>



<h2 class="wp-block-heading"><span id="toc12">ビッグデータとしてのOSM</span></h2>



<p>OSMは現在、地球規模のビッグデータとして扱われている。</p>



<h3 class="wp-block-heading"><span id="toc13">スケール比較</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>時代</th><th>処理対象</th><th>規模</th></tr></thead><tbody><tr><td>2010年代</td><td>都市単位</td><td>数百万ノード</td></tr><tr><td>2020年代前半</td><td>国単位</td><td>数千万ノード</td></tr><tr><td>2025以降</td><td>地球全体</td><td>数十億ノード</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc14">できること</span></h3>



<ul class="wp-block-list">
<li>交通シミュレーション</li>



<li>都市構造分析</li>



<li>災害リスク評価</li>
</ul>



<p><strong>OSMは「地図」から「分析エンジンの燃料」へ進化</strong></p>



<h2 class="wp-block-heading"><span id="toc15">AI × OSM：データから生成へ</span></h2>



<p>近年、OSMはAIとの融合によって新たな段階に入った。</p>



<h3 class="wp-block-heading"><span id="toc16">主な活用領域</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>分野</th><th>内容</th></tr></thead><tbody><tr><td>画像生成</td><td>地図→衛星画像生成</td></tr><tr><td>都市予測</td><td>開発シミュレーション</td></tr><tr><td>データ補完</td><td>欠損情報の推定</td></tr><tr><td>タグ整理</td><td>LLMによる意味統合</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc17">変化の本質</span></h3>



<ul class="wp-block-list">
<li>OSMは「入力データ」から</li>



<li>OSMは「生成の起点」へ</li>
</ul>



<p><strong>AIによってOSMは“未来の地図”を作る基盤になった</strong></p>



<h2 class="wp-block-heading"><span id="toc18">デジタルツイン化：2Dから3Dへ</span></h2>



<p>OSMは現在、3次元空間へ拡張されている。</p>



<h3 class="wp-block-heading"><span id="toc19">構成要素</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>データ</th><th>役割</th></tr></thead><tbody><tr><td>OSM</td><td>道路・建物情報</td></tr><tr><td>LiDAR</td><td>高さ・形状</td></tr><tr><td>ゲームエンジン</td><td>可視化</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc20">活用例</span></h3>



<ul class="wp-block-list">
<li>自動運転シミュレーション</li>



<li>スマートシティ設計</li>



<li>防災訓練</li>
</ul>



<p><strong>OSMは「地図」ではなく「世界のコピー」になりつつある</strong></p>



<h2 class="wp-block-heading"><span id="toc21">タグ体系の課題と進化</span></h2>



<p>OSMの最大の特徴であり弱点でもあるのが、自由なタグ体系である。</p>



<h3 class="wp-block-heading"><span id="toc22">メリット・デメリット</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>観点</th><th>内容</th></tr></thead><tbody><tr><td>メリット</td><td>柔軟・拡張性が高い</td></tr><tr><td>デメリット</td><td>非統一・解析困難</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc23">現在の対策</span></h3>



<ul class="wp-block-list">
<li>AIによるタグ統合</li>



<li>外部データとの連携</li>



<li>セマンティック化</li>
</ul>



<p><strong>OSMは「ナレッジグラフ」に近づいている</strong></p>



<h2 class="wp-block-heading"><span id="toc24">APIからストリームへ</span></h2>



<p>従来のOSMはAPI中心だったが、現在は変化している。</p>



<h3 class="wp-block-heading"><span id="toc25">主なデータ取得手段</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>方法</th><th>特徴</th></tr></thead><tbody><tr><td>REST API</td><td>基本機能</td></tr><tr><td>Overpass API</td><td>クエリ特化</td></tr><tr><td>Planetデータ</td><td>フルデータ</td></tr><tr><td>差分ストリーム</td><td>リアルタイム更新</td></tr></tbody></table></figure>



<p><strong>静的API → リアルタイムデータ基盤へ移行</strong></p>



<h2 class="wp-block-heading"><span id="toc26">技術スタックまとめ（2026年版）</span></h2>



<h3 class="wp-block-heading"><span id="toc27">現代OSM構成</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>レイヤー</th><th>技術</th></tr></thead><tbody><tr><td>データ</td><td>OSM Planet</td></tr><tr><td>ETL</td><td>osm2pgsql / Themepark</td></tr><tr><td>DB</td><td>PostGIS</td></tr><tr><td>タイル</td><td>Tilekiln</td></tr><tr><td>配信</td><td>Vector Tile Server</td></tr><tr><td>フロント</td><td>MapLibre GL JS</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc28">今後のトレンド予測</span></h2>



<h3 class="wp-block-heading"><span id="toc29">重要テーマ</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>内容</th></tr></thead><tbody><tr><td>リアルタイム化</td><td>秒単位更新</td></tr><tr><td>AI統合</td><td>自動生成・補完</td></tr><tr><td>3D化</td><td>デジタルツイン</td></tr><tr><td>標準競争</td><td>データ仕様統一</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc30">ビジネスインパクト</span></h2>



<h3 class="wp-block-heading"><span id="toc31">活用分野</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>分野</th><th>利用例</th></tr></thead><tbody><tr><td>不動産</td><td>立地分析</td></tr><tr><td>物流</td><td>配送最適化</td></tr><tr><td>都市開発</td><td>インフラ設計</td></tr><tr><td>モビリティ</td><td>自動運転</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc32">OSMの強み</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>内容</th></tr></thead><tbody><tr><td>コスト</td><td>無料</td></tr><tr><td>カスタマイズ</td><td>自由</td></tr><tr><td>制限</td><td>ほぼなし</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc33">OSMは“現実のOS”になった</span></h2>



<p>OpenStreetMapは、もはや地図ではない。</p>



<p>それは、現実世界を記述し、分析し、そして生成するための「空間データ基盤」である。</p>



<p>ベクトルタイルによる表現革命、ビッグデータ処理によるスケール、AIによる拡張。この三つが揃ったことで、OSMは新たなステージへと到達した。</p>



<p>今後は「使うかどうか」ではなく、<strong>どう組み込むか</strong>が問われる時代になる。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/hd55z8c73ioypitnlep4bp91dh2cta7m/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>観光地マップ構築チュートリアル — HTML／JavaScriptで始めるインタラクティブ地図アプリ</title>
		<link>https://blog.takeho.com/tourist-map-building-tutorial-interactive-map-apps-using-html-javascript-tourist-map-building-tutorial-interactive-map-apps-using-html-javascript/</link>
					<comments>https://blog.takeho.com/tourist-map-building-tutorial-interactive-map-apps-using-html-javascript-tourist-map-building-tutorial-interactive-map-apps-using-html-javascript/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 11:51:00 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[GeoJSON]]></category>
		<category><![CDATA[Leaflet]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1372</guid>

					<description><![CDATA[まえがき 「Googleマップを使えば、どんな地図アプリでも簡単に作れる」——そう思っている人は、意外と多いのではないでしょうか。 確かに、Google Maps API は高機能で、商用サイトでも広く使われています。し [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h4 class="wp-block-heading"><span id="toc1">まえがき</span></h4>



<p>「Googleマップを使えば、どんな地図アプリでも簡単に作れる」<br>——そう思っている人は、意外と多いのではないでしょうか。</p>



<p>確かに、Google Maps API は高機能で、商用サイトでも広く使われています。<br>しかし最近では、「地図をもっと自由に」「コストを抑えて」「独自のデザインで」活用したいというニーズが高まっています。</p>



<p>そこで注目されているのが、<strong>オープンソースの地図技術「OpenStreetMap（OSM）」</strong> と、<br>軽量な JavaScript ライブラリ <strong>Leaflet.js（リーフレット）</strong> の組み合わせです。</p>



<p>Leaflet は地図アプリ開発の“定番フレームワーク”として世界中で利用されており、<br>たった数行のコードで美しい地図を表示できます。<br>しかも、OSMのオープンデータを使えば無料で地図を提供できるため、<br>小規模なサイトや個人プロジェクト、自治体・観光協会の案内ページなどに最適です。</p>



<p>今回のチュートリアルでは、<br>「観光地をマップ上に可視化し、ジャンル別に表示・非表示を切り替え、<br>さらにルート表示まで行えるインタラクティブな地図アプリ」を<br><strong>HTML・CSS・JavaScriptだけで構築する</strong>方法を解説します。</p>



<p>基本から応用までのステップを、<br>実際のコードサンプルとともに丁寧に追っていくので、<br>プログラミング初心者でも最後まで作りきれる内容です。</p>



<p>このチュートリアルを終える頃には、<br>あなたも <strong>「自分の街を自分の手で描く」</strong> 地図クリエイターになっているはずです。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4"><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><ol><ol><li><a href="#toc1" tabindex="0">まえがき</a></li></ol></li></ol></li><li><a href="#toc2" tabindex="0">はじめに</a><ol><li><a href="#toc3" tabindex="0">なぜ Leaflet + OpenStreetMap なのか</a></li><li><a href="#toc4" tabindex="0">本チュートリアルで作るもののゴール</a></li><li><a href="#toc5" tabindex="0">前提知識・対象読者</a></li></ol></li><li><a href="#toc6" tabindex="0"> Leaflet と OpenStreetMap の基礎知識</a><ol><li><a href="#toc7" tabindex="0">Leaflet とは何か／特徴・利点</a></li><li><a href="#toc8" tabindex="0">OpenStreetMap の概要と利用の注意点</a></li><li><a href="#toc9" tabindex="0">タイルサーバー（地図地図タイル）の仕組み</a></li></ol></li><li><a href="#toc10" tabindex="0">開発環境の準備</a><ol><li><a href="#toc11" tabindex="0">ディレクトリ構成</a></li><li><a href="#toc12" tabindex="0">HTML, CSS, JavaScript ファイルのひな形</a></li><li><a href="#toc13" tabindex="0">Leaflet の読み込み（CDN／npm）</a></li><li><a href="#toc14" tabindex="0">CSSで地図 div に高さ確保</a></li></ol></li><li><a href="#toc15" tabindex="0">地図を表示する（ベースマップ設定）</a><ol><li><a href="#toc16" tabindex="0">地図初期表示位置とズームレベルの設定</a></li><li><a href="#toc17" tabindex="0">OpenStreetMap タイルの追加</a></li><li><a href="#toc18" tabindex="0">属性表示（Attribution 表示）</a></li><li><a href="#toc19" tabindex="0">タイルサービス利用の注意（利用規約、負荷、キャッシュなど）</a></li></ol></li><li><a href="#toc20" tabindex="0">マーカー配置とポップアップ表示</a><ol><li><a href="#toc21" tabindex="0">単一マーカーの追加とポップアップ</a></li><li><a href="#toc22" tabindex="0">複数マーカーを配列で管理して追加</a></li><li><a href="#toc23" tabindex="0">カスタムアイコンを使う</a></li><li><a href="#toc24" tabindex="0">ポップアップ内に HTML やリンクを入れる</a></li></ol></li><li><a href="#toc25" tabindex="0">GeoJSON データの読み込みと表示</a><ol><li><a href="#toc26" tabindex="0">GeoJSON とは何か</a></li><li><a href="#toc27" tabindex="0">GeoJSON を使って観光スポット情報を保持する設計</a></li><li><a href="#toc28" tabindex="0">L.geoJSON() による読み込みとマップへの配置</a></li><li><a href="#toc29" tabindex="0">onEachFeature によるポップアップバインド</a></li><li><a href="#toc30" tabindex="0">スタイリング（スタイル関数）</a></li></ol></li><li><a href="#toc31" tabindex="0">レイヤー制御、グループ化、絞り込み機能</a><ol><li><a href="#toc32" tabindex="0">L.layerGroup／L.featureGroup の活用</a></li><li><a href="#toc33" tabindex="0">コントロール（レイヤー切り替え）を追加</a></li><li><a href="#toc34" tabindex="0">UI制御でカテゴリごとに絞る</a></li><li><a href="#toc35" tabindex="0">フィルタリング機能の応用</a></li></ol></li><li><a href="#toc36" tabindex="0">ルート表示・ナビゲーション機能（応用）</a><ol><li><a href="#toc37" tabindex="0">ルート API の選定</a></li><li><a href="#toc38" tabindex="0">ルート取得リクエスト</a></li><li><a href="#toc39" tabindex="0">GeoJSON によるルート描画</a></li><li><a href="#toc40" tabindex="0">出発地・目的地の入力フォーム</a></li><li><a href="#toc41" tabindex="0">複数ルート・案内表示</a></li></ol></li><li><a href="#toc42" tabindex="0">インタラクティブ性を高める工夫</a><ol><li><a href="#toc43" tabindex="0">クリック・ズームイベントの活用</a></li><li><a href="#toc44" tabindex="0">現在地取得と追従</a></li><li><a href="#toc45" tabindex="0">クラスター化</a></li><li><a href="#toc46" tabindex="0">UX 改善の小技</a></li><li><a href="#toc47" tabindex="0">スマホ対応のポイント</a></li></ol></li><li><a href="#toc48" tabindex="0">パフォーマンスと最適化</a><ol><li><a href="#toc49" tabindex="0">タイルキャッシュ・CDN</a></li><li><a href="#toc50" tabindex="0">GeoJSON の軽量化</a></li><li><a href="#toc51" tabindex="0">レンダリング最適化</a></li><li><a href="#toc52" tabindex="0">ズームレベル制限</a></li><li><a href="#toc53" tabindex="0">レイヤー遅延読み込み</a></li></ol></li><li><a href="#toc54" tabindex="0">デプロイと運用上の注意点</a><ol><li><a href="#toc55" tabindex="0">HTTPS 必須</a></li><li><a href="#toc56" tabindex="0">タイルサーバーの選択</a></li><li><a href="#toc57" tabindex="0">APIキー管理</a></li><li><a href="#toc58" tabindex="0">モニタリングとログ</a></li><li><a href="#toc59" tabindex="0">著作権とライセンス表記</a></li></ol></li><li><a href="#toc60" tabindex="0">完成例と拡張アイデア</a><ol><li><a href="#toc61" tabindex="0">完成例イメージ</a></li><li><a href="#toc62" tabindex="0">拡張アイデア</a></li><li><a href="#toc63" tabindex="0">活用ケース</a></li></ol></li><li><a href="#toc64" tabindex="0">まとめと次のステップ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc2">はじめに</span></h2>



<h3 class="wp-block-heading"><span id="toc3">なぜ Leaflet + OpenStreetMap なのか</span></h3>



<p>Web上で地図を扱いたいとき、Google Maps や Mapbox など選択肢は多くあります。しかし、以下の理由から <strong>Leaflet + OpenStreetMap（OSM）</strong> の組み合わせは非常に魅力的です：</p>



<ul class="wp-block-list">
<li><strong>オープン性</strong>：Leaflet は軽量なオープンソース JavaScript ライブラリです 。</li>



<li><strong>ライセンス自由度</strong>：OpenStreetMap のデータはオープンライセンスであり、商用利用も可能。ただし適切な属性表示（attribution 表示）は必要です。</li>



<li><strong>軽量で拡張性あり</strong>：Leaflet 自体は小さく、プラグインも豊富。必要な機能だけを追加できる柔軟性があります。</li>



<li><strong>コミュニティと事例の豊富さ</strong>：多くのサイトやシステムで使われており、事例や情報がネット上に多くあります 。</li>



<li><strong>タイルソースを選べる自由</strong>：OSM以外のタイルソースも使える設計で、見た目／性能の選択肢が拡がります。</li>
</ul>



<p>とはいえ、デメリットもあります。たとえば、タイル提供元の制約（過剰なリクエスト制限やキャッシュ制御など）、ルート検索 API の別構築、地図データの更新・同期、負荷分散など運用上の考慮は必要です。</p>



<p>このチュートリアルでは、それらを踏まえつつも「観光地マップを自前で作る」ための実践手順をできるだけ丁寧に解説します。</p>



<h3 class="wp-block-heading"><span id="toc4">本チュートリアルで作るもののゴール</span></h3>



<p>最終的には、次のような機能を備えた「観光地マップアプリ」を作ることを目指します：</p>



<ul class="wp-block-list">
<li>都道府県や都市などの地図中心表示</li>



<li>観光スポット（地点）を GeoJSON 形式で管理</li>



<li>マーカーでスポットを配置し、クリックで名称・説明・画像などをポップアップ表示</li>



<li>観光ジャンル別に表示を絞る UI 制御</li>



<li>出発地／目的地を指定して、地図上にルートを描画</li>



<li>モバイル対応、インタラクティブな UX</li>



<li>高速化・最適化を意識した実装</li>
</ul>



<p>この記事を通じて「地図を扱う基本」「GeoJSON を使ったデータ構造」「インタラクティブ操作の実装法」「運用上の注意点」などを体系的に学べるように設計します。</p>



<h3 class="wp-block-heading"><span id="toc5">前提知識・対象読者</span></h3>



<p>本記事は Web フロントエンド（HTML／CSS／JavaScript）の基本的な知識を持つ方向けを対象としています。ただし、Leaflet や地理情報に不慣れな方でも読み進められるよう、逐次説明を入れます。</p>



<p>また、バックエンド技術（サーバーサイド言語、DB 等）は深く触れませんが、GeoJSON を返す API 設計などについては軽く触れる場面があります。</p>



<h2 class="wp-block-heading"><span id="toc6"> Leaflet と OpenStreetMap の基礎知識</span></h2>



<h3 class="wp-block-heading"><span id="toc7">Leaflet とは何か／特徴・利点</span></h3>



<p>Leaflet（リーフレット）は、Web 上でインタラクティブ地図を扱うための軽量 JavaScript ライブラリです。HTML5／CSS3 に対応し、モバイルでも快適に動作する設計です。<a rel="noopener" href="https://leafletjs.com/?utm_source=chatgpt.com" target="_blank">leafletjs.com+2wiki.openstreetmap.org+2</a></p>



<p>主な特徴：</p>



<ul class="wp-block-list">
<li><strong>軽量設計</strong>：基本ライブラリは小さく、必要な機能をプラグインで追加できる</li>



<li><strong>直感的 API</strong>：<code>L.map</code>、<code>L.tileLayer</code>、<code>L.marker</code> といった関数体系が分かりやすい</li>



<li><strong>拡張性</strong>：多くのプラグイン（クラスタリング、ヒートマップ、ルーティング、GeoJSON 操作など）が存在</li>



<li><strong>多様なレイヤー対応</strong>：タイルレイヤー、ベクターレイヤー、GeoJSON、WMS など</li>



<li><strong>イベント対応</strong>：クリック、パン、ズームなど、各種操作に応じたイベントハンドリングが可能</li>
</ul>



<p>一方で、Leaflet は GIS が得意とする高度なジオプロセシング機能（空間クエリ、ジオメトリ演算など）は基本的に含んでおらず、必要な場合は別ライブラリ（Turf.js や他 GIS ライブラリ）と組み合わせて使うことが多いです。</p>



<h3 class="wp-block-heading"><span id="toc8">OpenStreetMap の概要と利用の注意点</span></h3>



<p>OpenStreetMap（OSM）は、オープンな地理空間データプロジェクトであり、世界中のユーザーが地図情報を編集・参照できます。地図タイルやデータを自前で利用できる自由度が高い点が魅力です。</p>



<p>ただし、使う際には以下の注意があります：</p>



<ul class="wp-block-list">
<li><strong>タイル提供元の制約</strong>：公式の OSM タイルサーバーは、商用サービスや高トラフィック用途を前提とした提供ではありません。過剰な負荷をかけるとアクセス制限を受ける可能性があります。</li>



<li><strong>キャッシュと CDN</strong>：自分でタイルキャッシュや CDN 配信を検討することが望ましい。</li>



<li><strong>属性表示義務（Attribution）</strong>：地図下部などに「© OpenStreetMap contributors」などの表示が必要です。</li>



<li><strong>データ更新</strong>：OSM データは随時更新されているため、キャッシュや定期更新の戦略を持つとよいです。</li>



<li><strong>利用規約・マナー</strong>：API 利用制限、利用ルール、使途の範囲などを確認して使うこと。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc9">タイルサーバー（地図地図タイル）の仕組み</span></h3>



<p>地図アプリで使われる「タイル（タイル画像）」は、ズームレベル <code>z</code>、X／Y の座標で構成される小さな画像単位の地図ブロックです。ブラウザは必要なズームレベルと範囲に応じて適切なタイル画像をリクエストし、地図全体を構成します。</p>



<p>Leaflet では、以下のようにタイル URL テンプレートを指定して読み込むことができます。</p>



<pre class="wp-block-code"><code>L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 19,
  attribution: '&amp;copy; &lt;a href="https://www.openstreetmap.org/copyright">OpenStreetMap&lt;/a> contributors'
}).addTo(map);</code></pre>



<p>上記の <code><strong>{z}</strong></code>、<code><strong>{x}</strong></code>、<code><strong>{y}</strong></code> はズーム／X座標／Y座標にそれぞれ展開されます。<code><strong>{s}</strong></code> はサブドメイン（例：a, b, c）で並列リクエスト分散に使われます。</p>



<p>この方式のおかげで、クライアント側では効率よくタイルをレンダリングでき、必要なタイルのみを逐次取得できる構造になります。</p>



<h2 class="wp-block-heading"><span id="toc10">開発環境の準備</span></h2>



<h3 class="wp-block-heading"><span id="toc11">ディレクトリ構成</span></h3>



<p>まずは手を動かすためのファイル構成を決めましょう。例えば次のような構成がシンプルで扱いやすいです。</p>



<pre class="wp-block-code"><code>/project-root/
  index.html
  css/
    style.css
  js/
    main.js
  data/
    spots.geojson
  assets/
    icons/
    images/
  README.md</code></pre>



<ul class="wp-block-list">
<li><code>index.html</code>：地図アプリ本体ページ</li>



<li><code>css/style.css</code>：地図表示用および追加 UI 用スタイル</li>



<li><code>js/main.js</code>：メインの JavaScript ロジック</li>



<li><code>data/spots.geojson</code>：観光スポット情報を保持する GeoJSON</li>



<li><code>assets/</code>：アイコン画像、スポット画像など</li>
</ul>



<p>このあたりは、ご自身のブログ構成やファイル配置ルールに合わせて調整しても構いません。</p>



<h3 class="wp-block-heading"><span id="toc12">HTML, CSS, JavaScript ファイルのひな形</span></h3>



<p>まず、<code>index.html</code> の基本骨格を作ります。</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html>
&lt;html lang="ja">
&lt;head>
  &lt;meta charset="UTF-8" />
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" />
  &lt;title>観光地マップ with Leaflet &amp; OSM&lt;/title>
  &lt;!-- Leaflet CSS を読み込む -->
  &lt;link
    rel="stylesheet"
    href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
    integrity="sha512-…（省略）"
    crossorigin=""
  />
  &lt;link rel="stylesheet" href="css/style.css" />
&lt;/head>
&lt;body>
  &lt;h1>観光地マップ&lt;/h1>
  &lt;div id="map">&lt;/div>

  &lt;!-- 必要なら UI エレメント（例：ジャンル選択、ルート入力フォームなど） -->
  &lt;div id="controls">
    &lt;!-- ジャンル選択など -->
  &lt;/div>

  &lt;!-- Leaflet JS を読み込む -->
  &lt;script
    src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
    integrity="sha512-…（省略）"
    crossorigin=""
  >&lt;/script>
  &lt;script src="js/main.js">&lt;/script>
&lt;/body>
&lt;/html></code></pre>



<p><code>css/style.css</code> には最低限、地図 div の高さを確保するスタイルを入れておきます。</p>



<pre class="wp-block-code"><code>html, body {
  margin: 0;
  padding: 0;
  height: 100%;
}

#map {
  width: 100%;
  height: 80vh; /* ブラウザ高さの 80% を地図領域に使う例 */
}

#controls {
  padding: 1em;
  /* 必要に応じて UI 部分のスタイル */
}
js/main.js は後ほどロジックを入れていきます。まずは空の構造だけ作っておきます：

js
コードをコピーする
// main.js

// 初期化処理
function initMap() {
  // 地図生成やマーカー読み込み等をここに書く
}

// ページ読み込み後に実行
window.addEventListener('load', () => {
  initMap();
});</code></pre>



<h3 class="wp-block-heading"><span id="toc13">Leaflet の読み込み（CDN／npm）</span></h3>



<p>上の HTML 例では CDN 版を使う形式を採っていますが、モジュール構成やビルドツールを使っている場合は npm で Leaflet をインストールして取り込む方法でも構いません。</p>



<pre class="wp-block-code"><code>npm install leaflet</code></pre>



<p>そして JavaScript 側（たとえば bundler 環境）で次のように</p>



<pre class="wp-block-code"><code>import L from 'leaflet';
import 'leaflet/dist/leaflet.css';</code></pre>



<p>という形で取り込むやり方です。ただし、この方式を使う場合、アイコン画像パスや CSS 読み込み処理の設定に注意が必要です（バンドル環境に応じた設定）。</p>



<p>このチュートリアルでは、手軽で理解しやすい CDN 読み込み方式を中心に説明を進めます。</p>



<h3 class="wp-block-heading"><span id="toc14">CSSで地図 div に高さ確保</span></h3>



<p>地図を描画する <code>#map</code> 要素には高さがゼロだと表示されないので、必ず CSS で高さを指定する必要があります（vh 単位や固定 px 単位など）。</p>



<p>例として先に示した <code>height: 80vh</code> のような指定や、<code>height: 500px</code> などでも構いません。レスポンシブ対応を考えるなら、<code>@media</code> を使ってスマホ・PCで高さ調整をする方法も後で紹介します。</p>



<h2 class="wp-block-heading"><span id="toc15">地図を表示する（ベースマップ設定）</span></h2>



<p>ここから、実際に地図を画面に表示する手順を進めていきます。</p>



<h3 class="wp-block-heading"><span id="toc16">地図初期表示位置とズームレベルの設定</span></h3>



<p><code>main.js</code> に以下のような基本コードを入れます。</p>



<pre class="wp-block-code"><code>function initMap() {
  // 観光地マップの初期中心位置（例：東京駅周辺）
  const centerLatLng = &#91;35.681236, 139.767125]; // 緯度, 経度
  const initialZoom = 13;

  // 地図オブジェクト生成
  const map = L.map('map').setView(centerLatLng, initialZoom);

  // タイルレイヤー（OSM）を追加
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    maxZoom: 19,
    attribution:
      '&amp;copy; &lt;a href="https://www.openstreetmap.org/copyright">OpenStreetMap&lt;/a> contributors',
  }).addTo(map);

  // オプション: 他操作設定
  // map.zoomControl.setPosition('topright');
}</code></pre>



<p>このコードを走らせると、<code>#map</code> の位置に地図が表示され、指定した中心とズームレベルで初期表示されます。</p>



<h3 class="wp-block-heading"><span id="toc17">OpenStreetMap タイルの追加</span></h3>



<p>上記の <code>L.tileLayer(...)</code> が OSM のタイルを地図に読み込む役割です。タイルの URL テンプレートとオプション（<code>maxZoom</code>, <code>attribution</code> など）を指定しています。</p>



<p><code>tlesLayer</code> のオプションでは、以下のような設定がよく使われます：</p>



<ul class="wp-block-list">
<li><code>maxZoom</code>: 最大ズームレベル</li>



<li><code>minZoom</code>: 最小ズームレベル</li>



<li><code>attribution</code>: 地図著作権表示</li>



<li><code>subdomains</code>: <code>{s}</code> に使うサブドメイン配列（例：<code>['a','b','c']</code>）</li>



<li><code>tileSize</code>, <code>zoomOffset</code>：タイルの仕様調整</li>
</ul>



<h3 class="wp-block-heading"><span id="toc18">属性表示（Attribution 表示）</span></h3>



<p>タイルプロバイダー（この場合 OSM）には著作権表示義務（Attribution）があるため、地図下部などに必ず表示を行います。Leaflet の <code>attribution</code> オプションを使って設定可能です。</p>



<pre class="wp-block-code"><code>attribution:
  '&amp;copy; &lt;a href="https://www.openstreetmap.org/copyright">OpenStreetMap&lt;/a> contributors'</code></pre>



<p>このように HTML タグを使って地図表示元へのリンクを含む表記を記述します。</p>



<h3 class="wp-block-heading"><span id="toc19">タイルサービス利用の注意（利用規約、負荷、キャッシュなど）</span></h3>



<ul class="wp-block-list">
<li><strong>公式 OSM タイルサーバーの制約</strong><br>多くのプロジェクトでは、公式 OSM タイルサーバー（<code>tile.openstreetmap.org</code>）をそのまま商用サイトで使うのは推奨されません。過剰リクエスト時には制限が課される可能性があります。</li>



<li><strong>代替タイル提供サービス</strong><br>Mapbox、Maptiler、Stadia Maps、Carto 等、有償または無料プランのタイルサービスを併用する手段があります。</li>



<li><strong>キャッシュ／CDN 利用</strong><br>プロキシキャッシュや CDN を使って、タイル取得負荷を軽減する構成が望まれます。</li>



<li><strong>リクエスト節約</strong><br>不要なズームレベルでの読み込みを制限したり、不要なレイヤー読み込みを遅延化（Lazy Load）する工夫が重要です。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc20">マーカー配置とポップアップ表示</span></h2>



<p>次は観光スポットをマーカーで表示し、クリック時に詳細情報を表示するようにします。</p>



<h3 class="wp-block-heading"><span id="toc21">単一マーカーの追加とポップアップ</span></h3>



<p>まずは簡単に、ひとつのマーカーを追加してポップアップを表示する例です。</p>



<pre class="wp-block-code"><code>// 地図 map が生成済とする
const marker = L.marker(&#91;35.6895, 139.6917]).addTo(map);
marker.bindPopup('&lt;b>東京タワー&lt;/b>&lt;br>東京の有名な展望塔です。');</code></pre>



<p><code>.bindPopup(...)</code> でマーカーポップアップ内容を指定できます。<code>.openPopup()</code> をつけると初期表示時からポップアップ展開できます。</p>



<h3 class="wp-block-heading"><span id="toc22">複数マーカーを配列で管理して追加</span></h3>



<p>観光スポットが複数ある場合は、JavaScript の配列で管理し、ループでマーカーを生成する形が一般的です。</p>



<pre class="wp-block-code"><code>const spots = &#91;
  {
    name: '東京タワー',
    desc: '東京の有名な展望塔です。',
    lat: 35.65858,
    lng: 139.745433,
  },
  {
    name: '浅草寺',
    desc: '浅草の歴史あるお寺。',
    lat: 35.714765,
    lng: 139.796655,
  },
  // 他スポット…
];

spots.forEach((spot) => {
  const marker = L.marker(&#91;spot.lat, spot.lng]).addTo(map);
  marker.bindPopup(`&lt;b>${spot.name}&lt;/b>&lt;br>${spot.desc}`);
});</code></pre>



<p>この形式であればスポット数が増えても拡張しやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc23">カスタムアイコンを使う</span></h3>



<p>マーカーアイコンをオリジナルの画像に変更する例</p>



<pre class="wp-block-code"><code>const customIcon = L.icon({
  iconUrl: 'assets/icons/spot-icon.png',
  iconSize: &#91;32, 37], // 幅・高さ（px）
  iconAnchor: &#91;16, 37], // アイコンの尖った位置（マーカー先端）を基準点に
});

spots.forEach((spot) => {
  const marker = L.marker(&#91;spot.lat, spot.lng], { icon: customIcon }).addTo(map);
  marker.bindPopup(`&lt;b>${spot.name}&lt;/b>&lt;br>${spot.desc}`);
});</code></pre>



<p>アイコン画像のパスやサイズ調整を適切に行うことで、見栄えを改善できます。</p>



<h3 class="wp-block-heading"><span id="toc24">ポップアップ内に HTML やリンクを入れる</span></h3>



<p>ポップアップには HTML を自由に含められます。</p>



<pre class="wp-block-code"><code>marker.bindPopup(`
  &lt;div>
    &lt;h3>${spot.name}&lt;/h3>
    &lt;img src="assets/images/${spot.image}" alt="${spot.name}" width="200">
    &lt;p>${spot.desc}&lt;/p>
    &lt;a href="${spot.url}" target="_blank">公式サイトへ&lt;/a>
  &lt;/div>
`);</code></pre>



<p>画像やリンク、スタイルを入れることで、ユーザにとってリッチな情報を提示できます。</p>



<h2 class="wp-block-heading"><span id="toc25">GeoJSON データの読み込みと表示</span></h2>



<p>多数のスポット情報を管理するには、GeoJSON 形式でデータを扱うのが便利です。</p>



<h3 class="wp-block-heading"><span id="toc26">GeoJSON とは何か</span></h3>



<p>GeoJSON は地理空間情報を JSON で記述するデータフォーマットで、点（Point）、線（LineString）、面（Polygon）などを表現できます。属性情報（プロパティ）も含められるため、地図アプリでは扱いやすい形式です。</p>



<p>GeoJSON の構造例（観光スポット用）：</p>



<pre class="wp-block-code"><code>{
  "type": "FeatureCollection",
  "features": &#91;
    {
      "type": "Feature",
      "properties": {
        "name": "東京タワー",
        "desc": "東京の有名な展望塔です。",
        "image": "tokyo-tower.jpg",
        "url": "https://www.tokyotower.co.jp/"
      },
      "geometry": {
        "type": "Point",
        "coordinates": &#91;139.745433, 35.65858]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "name": "浅草寺",
        "desc": "浅草の歴史あるお寺。",
        "image": "sensouji.jpg",
        "url": "https://www.senso-ji.jp/"
      },
      "geometry": {
        "type": "Point",
        "coordinates": &#91;139.796655, 35.714765]
      }
    }
    // …他のスポット
  ]
}</code></pre>



<p>注意：Leaflet は緯度・経度順 <code>[lat, lon]</code> ではなく、GeoJSON の座標は <code>[longitude, latitude]</code> の順で定義する点に注意する必要があります。</p>



<h3 class="wp-block-heading"><span id="toc27">GeoJSON を使って観光スポット情報を保持する設計</span></h3>



<p><code>data/spots.geojson</code> に上記の形式でスポットを記述しておき、クライアント側でこれを取得してマップ上にレンダリングします。この設計により、データと表示ロジックを分離でき、後からスポットの追加・更新が容易になります。</p>



<h3 class="wp-block-heading"><span id="toc28">L.geoJSON() による読み込みとマップへの配置</span></h3>



<p><code>main.js</code> に以下のようなコードを追加します。</p>



<pre class="wp-block-code"><code>function initMap() {
  // …地図初期化処理…

  // GeoJSON をフェッチして表示
  fetch('data/spots.geojson')
    .then((resp) => resp.json())
    .then((geojson) => {
      L.geoJSON(geojson, {
        onEachFeature: onEachSpotFeature,
      }).addTo(map);
    })
    .catch((err) => console.error('GeoJSON 読み込みエラー:', err));
}

// 各 Feature に対する処理
function onEachSpotFeature(feature, layer) {
  if (feature.properties &amp;&amp; feature.properties.name) {
    const popupContent = `
      &lt;div>
        &lt;h3>${feature.properties.name}&lt;/h3>
        &lt;p>${feature.properties.desc}&lt;/p>
        ${feature.properties.image ? `&lt;img src="assets/images/${feature.properties.image}" width="200" />` : ''}
        ${feature.properties.url ? `&lt;br>&lt;a href="${feature.properties.url}" target="_blank">公式サイト&lt;/a>` : ''}
      &lt;/div>
    `;
    layer.bindPopup(popupContent);
  }
}</code></pre>



<p>このように、GeoJSON の各 Feature を <code>L.geoJSON</code> で読み込むと、自動的に適切な Leaflet レイヤー（この場合は点 → マーカー）として変換され、<code>onEachFeature</code> 関数でポップアップ処理などを設定できます。</p>



<h3 class="wp-block-heading"><span id="toc29">onEachFeature によるポップアップバインド</span></h3>



<p><code>onEachFeature(feature, layer)</code> 関数は、GeoJSON の各 Feature に対して呼ばれ、<code>layer</code>（Leaflet 上のレイヤー）にポップアップやイベントをバインドできます。前述の例では <code>layer.bindPopup(...)</code> を使っています。</p>



<p>この関数をもっと拡張して、クリックイベントや <code>mouseover</code>／<code>mouseout</code> イベントなども設定できます。</p>



<h3 class="wp-block-heading"><span id="toc30">スタイリング（スタイル関数）</span></h3>



<p>GeoJSON のレイヤーにスタイルを与えることも可能ですが、点（Point）ではマーカーアイコンで代替することが多く、線・面（Polyline／Polygon）を描く用途で有効です。</p>



<p>たとえば、線（観光ルート）やエリア（観光エリア範囲）を GeoJSON で定義してスタイルを指定する例：</p>



<pre class="wp-block-code"><code>L.geoJSON(geojsonLineOrPolygon, {
  style: function(feature) {
    return {
      color: feature.properties.color || 'blue',
      weight: feature.properties.weight || 3,
      opacity: feature.properties.opacity || 0.7,
    };
  },
  onEachFeature: function(feature, layer) {
    if (feature.properties &amp;&amp; feature.properties.name) {
      layer.bindPopup(feature.properties.name);
    }
  },
}).addTo(map);</code></pre>



<p>観光地マップでは、線／エリアを使う機会はルート表示やエリアハイライトといった拡張部分で出てきます。</p>



<h2 class="wp-block-heading"><span id="toc31">レイヤー制御、グループ化、絞り込み機能</span></h2>



<h3 class="wp-block-heading"><span id="toc32">L.layerGroup／L.featureGroup の活用</span></h3>



<p>観光地マップでは、スポットの種類（例：史跡・自然・グルメなど）ごとにマーカーをまとめたい場面があります。Leaflet にはそのための機能として <code>L.layerGroup()</code> と <code>L.featureGroup()</code> が用意されています。</p>



<ul class="wp-block-list">
<li><strong><code>L.layerGroup()</code></strong>：単純に複数レイヤー（マーカーなど）をまとめるためのコンテナ。</li>



<li><strong><code>L.featureGroup()</code></strong>：<code>L.layerGroup</code> に加え、グループ全体にイベント（クリック、mouseover など）を設定できる。</li>
</ul>



<pre class="wp-block-preformatted">const historicalGroup = L.layerGroup();<br>const foodGroup = L.layerGroup();<br>const natureGroup = L.layerGroup();<br><br>// 各カテゴリに属するマーカーを追加<br>L.marker([35.71, 139.79]).bindPopup('浅草寺').addTo(historicalGroup);<br>L.marker([35.67, 139.77]).bindPopup('築地市場').addTo(foodGroup);<br>L.marker([35.68, 139.73]).bindPopup('日比谷公園').addTo(natureGroup);<br><br>// デフォルトでは全部表示<br>historicalGroup.addTo(map);<br>foodGroup.addTo(map);<br>natureGroup.addTo(map);</pre>



<h3 class="wp-block-heading"><span id="toc33">コントロール（レイヤー切り替え）を追加</span></h3>



<p>Leaflet には地図上でレイヤーを切り替えるUI部品が標準で用意されています。<br>次のようにして、チェックボックス式のレイヤーコントロールを追加できます。</p>



<pre class="wp-block-code"><code>const baseMaps = {
  "OpenStreetMap": osmLayer,
  "OSM Humanitarian": humanitarianLayer,
};

const overlayMaps = {
  "史跡": historicalGroup,
  "グルメ": foodGroup,
  "自然": natureGroup
};

L.control.layers(baseMaps, overlayMaps).addTo(map);</code></pre>



<p>これで地図右上にレイヤー選択ウィジェットが追加され、ユーザが表示・非表示を切り替えられるようになります。観光情報のカテゴリ分けに最適です。</p>



<h3 class="wp-block-heading"><span id="toc34">UI制御でカテゴリごとに絞る</span></h3>



<p>レイヤー切り替えの代わりに、HTML の <code>&lt;select&gt;</code> や <code>&lt;button&gt;</code> を使ってカテゴリごとに絞る方式もよく使われます。</p>



<pre class="wp-block-preformatted">&lt;select id="category"><br>  &lt;option value="all">すべて&lt;/option><br>  &lt;option value="historical">史跡&lt;/option><br>  &lt;option value="food">グルメ&lt;/option><br>  &lt;option value="nature">自然&lt;/option><br>&lt;/select></pre>



<p>JavaScript 側ではイベントを監視して絞り込みを制御します。</p>



<pre class="wp-block-code"><code>document.getElementById('category').addEventListener('change', (e) => {
  const val = e.target.value;
  &#91;historicalGroup, foodGroup, natureGroup].forEach(g => map.removeLayer(g));
  if (val === 'all' || val === 'historical') historicalGroup.addTo(map);
  if (val === 'all' || val === 'food') foodGroup.addTo(map);
  if (val === 'all' || val === 'nature') natureGroup.addTo(map);
});</code></pre>



<p>UIと連携することで、より自然な操作感を実現できます。</p>



<h3 class="wp-block-heading"><span id="toc35">フィルタリング機能の応用</span></h3>



<p>GeoJSON データを大量に扱う場合、クライアント側でフィルタリングしてから描画する方法も有効です。</p>



<pre class="wp-block-code"><code>fetch('data/spots.geojson')
  .then(res => res.json())
  .then(json => {
    const filtered = json.features.filter(f => f.properties.category === 'historical');
    L.geoJSON({ type: 'FeatureCollection', features: filtered }).addTo(map);
  });</code></pre>



<p>これにより、データを都度再描画する形で軽量に扱うこともできます。</p>



<h2 class="wp-block-heading"><span id="toc36">ルート表示・ナビゲーション機能（応用）</span></h2>



<h3 class="wp-block-heading"><span id="toc37">ルート API の選定</span></h3>



<p>Leaflet 自体には経路探索機能はありません。そのため、外部のルーティングサービスを利用します。代表的なものとして</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>サービス名</th><th>特徴</th><th>無料枠</th></tr></thead><tbody><tr><td><strong>OpenRouteService</strong></td><td>OSM データを基にしたルート検索</td><td>1日あたり多数</td></tr><tr><td><strong>OSRM</strong></td><td>高速なオープンソースルータ</td><td>自前ホスティング可</td></tr><tr><td><strong>GraphHopper</strong></td><td>商用利用も可能なAPI</td><td>月間制限あり</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc38">ルート取得リクエスト</span></h3>



<p>OpenRouteService の例を見てみましょう。<br>以下のようなエンドポイントに GET リクエストを送信します。</p>



<pre class="wp-block-code"><code>https:&#47;&#47;api.openrouteservice.org/v2/directions/foot-walking?api_key=YOUR_KEY&amp;start=139.745433,35.65858&amp;end=139.796655,35.714765</code></pre>



<p>返却される JSON は GeoJSON 形式のルート情報を含んでおり、これを <code>L.geoJSON()</code> で表示可能です。</p>



<h3 class="wp-block-heading"><span id="toc39">GeoJSON によるルート描画</span></h3>



<pre class="wp-block-code"><code>fetch(url)
  .then(res => res.json())
  .then(data => {
    const route = data.features&#91;0];
    L.geoJSON(route, {
      style: {
        color: 'red',
        weight: 4
      }
    }).addTo(map);
  });</code></pre>



<p>これで、2地点間のルートが地図上に赤いラインで表示されます。</p>



<h3 class="wp-block-heading"><span id="toc40">出発地・目的地の入力フォーム</span></h3>



<p>ユーザーに自由に経路を指定させる場合は、HTML フォームを追加します。</p>



<pre class="wp-block-code"><code>&lt;input id="start" placeholder="出発地（緯度,経度）">
&lt;input id="end" placeholder="目的地（緯度,経度）">
&lt;button id="routeBtn">ルート表示&lt;/button></code></pre>



<p>ボタンクリックで API にリクエストを送り、ルートを描画する仕組みです。<br>UIを工夫すれば、クリックで地点を選んだり、現在地を自動入力したりもできます。</p>



<h3 class="wp-block-heading"><span id="toc41">複数ルート・案内表示</span></h3>



<p>OpenRouteService などは複数ルート案を返すこともあり、これを切り替えて表示することで利便性を向上できます。<br>さらに、ルートの距離や所要時間をポップアップやサイドバーに表示すれば、簡易ナビとしても機能します。</p>



<h2 class="wp-block-heading"><span id="toc42">インタラクティブ性を高める工夫</span></h2>



<h3 class="wp-block-heading"><span id="toc43">クリック・ズームイベントの活用</span></h3>



<p>Leaflet では地図やマーカーに多数のイベントを設定できます。</p>



<pre class="wp-block-code"><code>map.on('click', function(e) {
  L.popup()
    .setLatLng(e.latlng)
    .setContent(`緯度: ${e.latlng.lat.toFixed(5)}, 経度: ${e.latlng.lng.toFixed(5)}`)
    .openOn(map);
});</code></pre>



<p>地図をクリックした場所の座標を確認できるデバッグ用の機能として便利です。</p>



<h3 class="wp-block-heading"><span id="toc44">現在地取得と追従</span></h3>



<p>ブラウザの Geolocation API を使えば、現在地を取得して地図中心を自動移動できます。</p>



<pre class="wp-block-code"><code>if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition((pos) => {
    const lat = pos.coords.latitude;
    const lng = pos.coords.longitude;
    map.setView(&#91;lat, lng], 15);
    L.marker(&#91;lat, lng]).addTo(map).bindPopup("現在地");
  });
}</code></pre>



<p>旅行中にスマートフォンで使う観光マップでは特に有用です。</p>



<h3 class="wp-block-heading"><span id="toc45">クラスター化</span></h3>



<p>観光地が数百件を超えると、マーカーが重なり視認性が落ちます。<br><code>leaflet.markercluster</code> プラグインを使うと、近接したマーカーをグループ化してまとめて表示できます。</p>



<pre class="wp-block-code"><code>const markers = L.markerClusterGroup();
spots.forEach((s) => {
  const m = L.marker(&#91;s.lat, s.lng]).bindPopup(s.name);
  markers.addLayer(m);
});
map.addLayer(markers);</code></pre>



<p>クラスターをクリックするとズームして展開され、軽快な操作感が得られます。</p>



<h3 class="wp-block-heading"><span id="toc46">UX 改善の小技</span></h3>



<ul class="wp-block-list">
<li>マウスオーバーでスポット名をツールチップ表示</li>



<li>マーカークリック時にスクロールを抑止</li>



<li><code>flyTo()</code> や <code>panTo()</code> を使ってスムーズに地図中心を移動</li>



<li>ズームや回転をアニメーション化（モバイルでは特に効果的）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc47">スマホ対応のポイント</span></h3>



<p>地図は <code>height: 100vh</code> で全画面表示し、UIボタンは固定配置にします。<br>スマホではポップアップサイズを調整し、誤タップを防ぐ余白を設けると良いでしょう。</p>



<h2 class="wp-block-heading"><span id="toc48">パフォーマンスと最適化</span></h2>



<p>Leaflet は軽量ですが、データ量が多いと描画負荷が上がります。ここでは高速化のポイントを整理します。</p>



<h3 class="wp-block-heading"><span id="toc49">タイルキャッシュ・CDN</span></h3>



<p>タイル画像を自前でキャッシュするか、Maptiler などの CDN タイルを利用することで、レスポンスを大幅に改善できます。</p>



<h3 class="wp-block-heading"><span id="toc50">GeoJSON の軽量化</span></h3>



<ul class="wp-block-list">
<li>不要な属性を削除</li>



<li>緯度経度を小数点4桁程度に丸める</li>



<li>GeoJSON を分割して遅延読み込み</li>
</ul>



<p>これによりデータ転送量を削減できます。</p>



<h3 class="wp-block-heading"><span id="toc51">レンダリング最適化</span></h3>



<p>マーカーが多すぎる場合は、すべてを一度に描画せず、ズームレベルに応じて表示数を制御します。</p>



<pre class="wp-block-code"><code>map.on('zoomend', () =&gt; {
  const zoom = map.getZoom();
  if (zoom &lt; 10) {
    map.removeLayer(detailGroup);
  } else {
    map.addLayer(detailGroup);
  }
});</code></pre>



<h3 class="wp-block-heading"><span id="toc52">ズームレベル制限</span></h3>



<p>あまり細かくズームできる必要がない場合、<code>maxZoom</code> を低めに設定すると、不要なタイルロードを防げます。</p>



<h3 class="wp-block-heading"><span id="toc53">レイヤー遅延読み込み</span></h3>



<p>スクロールやボタン操作で特定エリアに来たときだけデータを読み込む方式（Lazy Load）も有効です。</p>



<h2 class="wp-block-heading"><span id="toc54">デプロイと運用上の注意点</span></h2>



<h3 class="wp-block-heading"><span id="toc55">HTTPS 必須</span></h3>



<p>地図APIやGeolocation APIを利用するには、サイトがHTTPSである必要があります。<br>特に現在地取得はHTTP環境では動作しません。</p>



<h3 class="wp-block-heading"><span id="toc56">タイルサーバーの選択</span></h3>



<p>商用サービスでの安定運用には、次のような代替タイル提供元を検討します。</p>



<ul class="wp-block-list">
<li>Maptiler Cloud</li>



<li>Stadia Maps</li>



<li>Thunderforest</li>



<li>CARTO Basemaps</li>
</ul>



<p>それぞれスタイルや利用制限、価格体系が異なるため、用途に合わせて選定します。</p>



<h3 class="wp-block-heading"><span id="toc57">APIキー管理</span></h3>



<p>OpenRouteService などの外部APIを使う場合は、<code>.env</code> やサーバ側でキーを隠蔽するのが鉄則です。<br>フロントに直接埋め込むと不正利用のリスクが高まります。</p>



<h3 class="wp-block-heading"><span id="toc58">モニタリングとログ</span></h3>



<p>アクセスログやリクエスト数を可視化し、負荷が高い時間帯を把握することでタイル制限を回避しやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc59">著作権とライセンス表記</span></h3>



<p>地図の下部に OSM のクレジット表記を残すことは必須です。<br>自作タイルを使う場合でも、元データが OSM の場合は「© OpenStreetMap contributors」と明記します。</p>



<h2 class="wp-block-heading"><span id="toc60">完成例と拡張アイデア</span></h2>



<h3 class="wp-block-heading"><span id="toc61">完成例イメージ</span></h3>



<p>完成したマップは、観光地スポットを色分けしたマーカーで表示し、クリックで写真・説明文を表示します。<br>ジャンル別の絞り込みUIと、ルート検索ボタンを併設することで、実用的な観光ナビとして機能します。</p>



<h3 class="wp-block-heading"><span id="toc62">拡張アイデア</span></h3>



<ul class="wp-block-list">
<li><strong>レビュー機能</strong>：各スポットにコメントや評価を追加</li>



<li><strong>写真ギャラリー</strong>：ポップアップにスライダーを埋め込み</li>



<li><strong>オフラインキャッシュ</strong>：PWA対応で一部キャッシュ</li>



<li><strong>多言語化</strong>：Leaflet のラベルやUIを英語・中国語対応</li>



<li><strong>時系列データ</strong>：季節イベントや期間限定情報を時間軸で管理</li>
</ul>



<h3 class="wp-block-heading"><span id="toc63">活用ケース</span></h3>



<ul class="wp-block-list">
<li>自治体や観光協会の案内サイト</li>



<li>イベントマップ（花火大会・祭り）</li>



<li>トレッキング／自転車ルート案内</li>



<li>ショッピングモールや施設内マップ</li>
</ul>



<h2 class="wp-block-heading"><span id="toc64">まとめと次のステップ</span></h2>



<p>Leaflet.js と OpenStreetMap を組み合わせることで、無料かつ柔軟な観光地マップを構築できました。<br>今回のポイントを整理します。</p>



<ol class="wp-block-list">
<li><strong>Leaflet の基礎構造</strong>：<code>L.map()</code> で地図を生成し、<code>L.tileLayer()</code> でOSMタイルを追加。</li>



<li><strong>マーカーとポップアップ</strong>：<code>L.marker()</code> と <code>.bindPopup()</code> で地点情報を視覚化。</li>



<li><strong>GeoJSON の利用</strong>：観光地データを分離し、柔軟に更新可能。</li>



<li><strong>レイヤー管理</strong>：カテゴリごとにグループ化し、ユーザ操作で切り替え。</li>



<li><strong>ルート描画</strong>：外部APIと組み合わせてナビゲーション実装。</li>



<li><strong>パフォーマンスと運用</strong>：キャッシュ、API管理、著作権表記を徹底。</li>
</ol>



<p>Leaflet はプラグインが豊富で、今後さらに機能拡張が可能です。<br>次のステップとしては以下を試すとよいでしょう。</p>



<ul class="wp-block-list">
<li><strong>Leaflet Routing Machine</strong> を使った経路案内</li>



<li><strong>Turf.js</strong> による地理解析（距離計算・範囲抽出）</li>



<li><strong>Leaflet Search</strong> プラグインによる検索機能追加</li>



<li><strong>サーバ連携</strong>：バックエンドから GeoJSON を動的取得</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/tourist-map-building-tutorial-interactive-map-apps-using-html-javascript-tourist-map-building-tutorial-interactive-map-apps-using-html-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OpenStreetMapに国土地理院DEMを適用して標高データを活用する手順【実践サンプル付き 】</title>
		<link>https://blog.takeho.com/procedures-for-applying-gsi-dem-to-openstreetmap-to-utilize-elevation-data/</link>
					<comments>https://blog.takeho.com/procedures-for-applying-gsi-dem-to-openstreetmap-to-utilize-elevation-data/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 22 Jul 2025 10:28:00 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[Leaflet]]></category>
		<category><![CDATA[QGIS]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1216</guid>

					<description><![CDATA[回の記事では、標高データの種類や概要について解説しました。今回は、日本国内で活用しやすい国土地理院 基盤地図情報 数値標高モデル（DEM）を使い、OpenStreetMap（OSM）のルートデータに標高情報を付与し、We [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>回の記事では、標高データの種類や概要について解説しました。今回は、日本国内で活用しやすい<strong>国土地理院 基盤地図情報 数値標高モデル（DEM）</strong>を使い、OpenStreetMap（OSM）のルートデータに標高情報を付与し、Web上で標高プロファイル付きルートを表示するまでの一連手順を詳しく解説します。</p>



<p>この内容は、QGISを使ったGIS初心者でも再現できるよう、データ取得からWebマップ活用までまとめました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6"><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">QGISとは？概要と入手方法</a><ol><li><a href="#toc2" tabindex="0">QGISの概要</a></li><li><a href="#toc3" tabindex="0">主な用途</a></li><li><a href="#toc4" tabindex="0">QGISの入手方法</a></li></ol></li><li><a href="#toc5" tabindex="0">必要なデータの取得</a><ol><li><a href="#toc6" tabindex="0">国土地理院DEM（基盤地図情報 数値標高モデル）</a></li><li><a href="#toc7" tabindex="0">OpenStreetMapのルート・道路データ</a></li></ol></li><li><a href="#toc8" tabindex="0">QGISによるDEM → OSMへの標高付与手順</a></li><li><a href="#toc9" tabindex="0">Webマップでの標高プロファイル表示【Leafletサンプル】</a><ol><ol><li><a href="#toc10" tabindex="0">使用ライブラリ（CDN）</a></li><li><a href="#toc11" tabindex="0">地図＋標高プロファイル表示サンプル</a></li></ol></li></ol></li><li><a href="#toc12" tabindex="0">完成イメージと活用例</a><ol><li><a href="#toc13" tabindex="0">活用例</a></li><li><a href="#toc14" tabindex="0">表示結果イメージ</a></li></ol></li><li><a href="#toc15" tabindex="0">関連リンクまとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">QGISとは？概要と入手方法</span></h2>



<h3 class="wp-block-heading"><span id="toc2">QGISの概要</span></h3>



<p>QGIS（キュージーアイエス）は、オープンソース・無料で利用できる<strong>地理情報システム（GIS）ソフトウェア</strong>です。国際的に普及しており、日本でも防災・インフラ・観光・登山など幅広い分野で使われています。</p>



<h3 class="wp-block-heading"><span id="toc3">主な用途</span></h3>



<ul class="wp-block-list">
<li>ラスタ（DEM標高データ）とベクタ（道路・登山道等）データ統合</li>



<li>標高プロファイルや等高線の自動生成</li>



<li>3D表示や俯瞰図作成</li>



<li>Webマップ用データ作成</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4">QGISの入手方法</span></h3>





<a rel="noopener" href="https://qgis.org/ja/site/forusers/download.html" title="Download · QGIS Web Site" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://qgis.org/img/QGIScover.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Download · QGIS Web Site</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://qgis.org/ja/site/forusers/download.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">qgis.org</div></div></div></div></a>




<p>インストールは「Long Term Release（長期安定版）」を推奨します。OSごとにインストーラーが用意されています。</p>



<h2 class="wp-block-heading"><span id="toc5">必要なデータの取得</span></h2>



<h3 class="wp-block-heading"><span id="toc6">国土地理院DEM（基盤地図情報 数値標高モデル）</span></h3>





<a rel="noopener" href="https://fgd.gsi.go.jp/download/menu.php" title="&#35480;&#23566;&#12506;&#12540;&#12472;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Ffgd.gsi.go.jp%2Fdownload%2Fmenu.php?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">&#35480;&#23566;&#12506;&#12540;&#12472;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://fgd.gsi.go.jp/download/menu.php" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">fgd.gsi.go.jp</div></div></div></div></a>




<ul class="wp-block-list">
<li>範囲を選択して5mまたは10mメッシュ（XML/GML形式）をダウンロード。</li>



<li>都市部は5m、郊外は10mが推奨です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc7">OpenStreetMapのルート・道路データ</span></h3>



<p><a>▶ Overpass Turbo</a> ：範囲指定・道路種別指定が可能。</p>



<p><a>▶ Geofabrik</a> ：都道府県単位など広域データ（PBF形式）。</p>



<p>GeoJSONまたはShapefile形式で取得し、QGISへ読み込みます。</p>



<h2 class="wp-block-heading"><span id="toc8">QGISによるDEM → OSMへの標高付与手順</span></h2>



<ol class="wp-block-list">
<li><strong>DEM（GML形式）をGeoTIFFへ変換</strong><br>・QGISで <code>GML</code> ファイルを読み込み。<br>・「ラスタ → ラスタデータセット変換」でGeoTIFF形式へエクスポート。<br>・座標系は<strong>EPSG:4326（WGS84）</strong> に変換統一。<br>これにより、他ツールやWebマップでも扱いやすくなります。<br></li>



<li><strong>OSMルートへの標高付与</strong><br>・OSMから取得した登山道や道路のルートをQGISへ読み込み（GeoJSON等）。<br>・DEM（GeoTIFF）を読み込み。<br>・「ベクタ → ラスタ → ラスタ値抽出（サンプリング）」で標高値（Z座標）をルート上各頂点に付与。<br>・出力を<strong>GeoJSON形式</strong>とし、Z値（標高）を保持。<br></li>



<li><strong>GeoJSONの出力イメージ</strong><br>
<pre><code>{
  "type": "FeatureCollection",
  "features": [{
    "type": "Feature",
    "properties": {},
    "geometry": {
      "type": "LineString",
      "coordinates": [
        [139.6917, 35.6895, 123],
        [139.6927, 35.6905, 135],
        [139.6937, 35.6915, 140]
      ]
    }
  }]
}
</code></pre>
このZ座標（3番目の数値）が標高（単位：m）です。
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc9">Webマップでの標高プロファイル表示【Leafletサンプル】</span></h2>



<h4 class="wp-block-heading"><span id="toc10">使用ライブラリ（CDN）</span></h4>



<pre class="wp-block-code"><code>&lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
&lt;link rel="stylesheet" href="https://unpkg.com/leaflet-elevation@0.0.4/dist/leaflet-elevation.min.css">
&lt;script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js">&lt;/script>
&lt;script src="https://unpkg.com/d3@5.7.0/dist/d3.min.js">&lt;/script>
&lt;script src="https://unpkg.com/leaflet-elevation@0.0.4/dist/leaflet-elevation.min.js">&lt;/script></code></pre>



<h4 class="wp-block-heading"><span id="toc11">地図＋標高プロファイル表示サンプル</span></h4>



<pre class="wp-block-code"><code>&lt;div id="map" style="height: 500px;">&lt;/div>
&lt;script>
const map = L.map('map').setView(&#91;35.6895, 139.6917], 12);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);

const elevation = L.control.elevation({
    theme: "steelblue-theme",
    height: 125,
    detached: true
}).addTo(map);

fetch('route_with_elevation.geojson')
    .then(response => response.json())
    .then(geojson => {
        L.geoJSON(geojson, {
            onEachFeature: elevation.addData.bind(elevation)
        }).addTo(map);
    });
&lt;/script></code></pre>



<p>これで、ルート上に標高プロファイル（距離 vs 標高）が動的に表示され、マウスオーバーで該当地点がハイライトされます。</p>



<h2 class="wp-block-heading"><span id="toc12">完成イメージと活用例</span></h2>



<h3 class="wp-block-heading"><span id="toc13">活用例</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>用途</th><th>入手情報</th><th>備考</th></tr></thead><tbody><tr><td>登山・サイクリング</td><td>OSMルート＋国土地理院DEM</td><td>距離・標高プロファイル</td></tr><tr><td>ハザードマップ</td><td>DEM＋道路高低差</td><td>洪水・土砂災害分析</td></tr><tr><td>景観・観光</td><td>QGIS 3D表示・Blender</td><td>俯瞰図や3Dビジュアル化</td></tr><tr><td>防災教育</td><td>標高理解・傾斜確認</td><td>子供向け教材にも活用可能</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc14">表示結果イメージ</span></h3>



<ol class="wp-block-list">
<li>OSM地図上にルート表示</li>



<li>下部に標高プロファイル（距離 vs 標高）</li>



<li>マウスオーバーでルートと連携表示</li>
</ol>



<h2 class="wp-block-heading"><span id="toc15">関連リンクまとめ</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>内容</th><th>URL</th></tr></thead><tbody><tr><td>QGIS</td><td><a>https://qgis.org/ja/site/</a></td></tr><tr><td>国土地理院DEM</td><td><a>https://fgd.gsi.go.jp/download/menu.php</a></td></tr><tr><td>OSM取得</td><td><a>https://overpass-turbo.eu/</a></td></tr><tr><td>Blender-OSM</td><td><a>https://gumroad.com/l/blender-osm</a></td></tr><tr><td>Leaflet</td><td><a>https://leafletjs.com/</a></td></tr><tr><td>Leaflet-Elevation</td><td><a class="" href="https://github.com/MrMufflon/Leaflet.Elevation">https://github.com/MrMufflon/Leaflet.Elevation</a></td></tr></tbody></table></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/procedures-for-applying-gsi-dem-to-openstreetmap-to-utilize-elevation-data/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>LeafletとOSRMで簡単ルート表示！徒歩・自転車ナビをWebページに組み込む方法</title>
		<link>https://blog.takeho.com/easy-route-display-with-leaflet-and-osrm-how-to-integrate-walking-and-bicycle-navigation-into-your-web-page/</link>
					<comments>https://blog.takeho.com/easy-route-display-with-leaflet-and-osrm-how-to-integrate-walking-and-bicycle-navigation-into-your-web-page/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 01 Jul 2025 21:04:00 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1185</guid>

					<description><![CDATA[Webサイトに徒歩や自転車のルート表示機能を追加したい──それも、無料で、柔軟にカスタマイズできる形で。そんなときに頼りになるのが、OpenStreetMap（OSM）とLeaflet.js、そしてOSRM（Open S [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Webサイトに徒歩や自転車のルート表示機能を追加したい──それも、無料で、柔軟にカスタマイズできる形で。<br>そんなときに頼りになるのが、<strong>OpenStreetMap（OSM）とLeaflet.js</strong>、そしてOSRM（Open Source Routing Machine）です。</p>



<p>本記事では、OSMとLeaflet、OSRMを組み合わせて「出発地から目的地までのルート」を地図上に表示する仕組みを、初心者向けに解説します。特に、自転車ナビや観光地案内サイト、キャンプ場や宿泊施設の周辺案内などに活用したい方におすすめです。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8"><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">なぜOSRMを使うのか？</a></li><li><a href="#toc2" tabindex="0">OSRMの基本API仕様</a></li><li><a href="#toc3" tabindex="0">実用サンプル：徒歩ルートを表示する</a></li><li><a href="#toc4" tabindex="0">応用：自転車ナビに切り替える</a></li><li><a href="#toc5" tabindex="0">地図クリックでルート計算（応用例）</a></li><li><a href="#toc6" tabindex="0">よくあるトラブルと対策</a></li><li><a href="#toc7" tabindex="0">自前でOSRMサーバを立てる方法（中級者向け）</a></li><li><a href="#toc8" tabindex="0">今後の拡張アイデア</a></li><li><a href="#toc9" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">なぜOSRMを使うのか？</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>OSRM</th><th>GraphHopper</th><th>OpenRouteService</th></tr></thead><tbody><tr><td>APIキー</td><td>不要（パブリックAPIあり）</td><td>必要</td><td>必要</td></tr><tr><td>レスポンス速度</td><td>非常に高速</td><td>高速</td><td>やや遅め</td></tr><tr><td>徒歩対応</td><td>○</td><td>○</td><td>○</td></tr><tr><td>自転車対応</td><td>○</td><td>○</td><td>○</td></tr><tr><td>カスタマイズ性</td><td>高い（自前サーバ構築可）</td><td>高い</td><td>高機能だがやや複雑</td></tr><tr><td>日本語住所検索</td><td>×（補完必要）</td><td>×</td><td>○</td></tr></tbody></table></figure>



<p>OSRMは非常に軽量・高速で、APIキーなしで試せるのが最大の利点です。APIリクエスト制限もありません（ただしパブリックAPIはあくまでテスト用と位置づけられています）。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本番用途では自前でサーバを構築することで、完全に独立したナビゲーションシステムを構築できます。</p>
</blockquote>



<h2 class="wp-block-heading"><span id="toc2">OSRMの基本API仕様</span></h2>



<p>OSRMのパブリックAPIは以下のようなエンドポイントを使います：</p>



<pre class="wp-block-preformatted"><code>https://router.project-osrm.org/route/v1/{profile}/{lon1},{lat1};{lon2},{lat2}?overview=full&amp;geometries=geojson</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>パラメータ</th><th>内容</th></tr></thead><tbody><tr><td>profile</td><td>&#8220;foot&#8221;（徒歩）, &#8220;bike&#8221;（自転車）, &#8220;car&#8221;（車）など</td></tr><tr><td>lon, lat</td><td>経度, 緯度（順番に注意）</td></tr><tr><td>overview</td><td>&#8220;full&#8221;指定でルート全体を取得</td></tr><tr><td>geometries</td><td>&#8220;geojson&#8221;を指定してLeafletと相性の良い形式に</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc3">実用サンプル：徒歩ルートを表示する</span></h2>



<p>以下は東京駅から東京タワーまでの徒歩ルートをLeafletとOSRMで描画するHTMLサンプルです：</p>



<pre class="wp-block-preformatted"><code>&lt;!DOCTYPE html><br>&lt;html><br>&lt;head><br>  &lt;meta charset="utf-8" /><br>  &lt;title>Leaflet + OSRM 徒歩ルート表示&lt;/title><br>  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /><br>  &lt;link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" /><br>  &lt;style>#map { height: 500px; }&lt;/style><br>&lt;/head><br>&lt;body><br>  &lt;div id="map">&lt;/div><br><br>  &lt;script src="https://unpkg.com/leaflet/dist/leaflet.js">&lt;/script><br>  &lt;script><br>    const map = L.map('map').setView([35.6764, 139.6993], 13); // 渋谷近辺<br><br>    // OpenStreetMapレイヤー<br>    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {<br>      attribution: '&amp;copy; OpenStreetMap contributors'<br>    }).addTo(map);<br><br>    // 出発地と目的地（東京駅 → 東京タワー）<br>    const start = [35.681236, 139.767125];<br>    const end = [35.6586, 139.7454];<br><br>    // マーカー<br>    L.marker(start).addTo(map).bindPopup("出発地").openPopup();<br>    L.marker(end).addTo(map).bindPopup("目的地");<br><br>    // OSRM APIエンドポイント<br>    const url = `https://router.project-osrm.org/route/v1/foot/${start[1]},${start[0]};${end[1]},${end[0]}?overview=full&amp;geometries=geojson`;<br><br>    fetch(url)<br>      .then(res => res.json())<br>      .then(data => {<br>        const route = data.routes[0].geometry;<br><br>        L.geoJSON(route, {<br>          style: {<br>            color: 'blue',<br>            weight: 5<br>          }<br>        }).addTo(map);<br><br>        map.fitBounds(L.geoJSON(route).getBounds());<br>      });<br>  &lt;/script><br>&lt;/body><br>&lt;/html></code></pre>



<h2 class="wp-block-heading"><span id="toc4">応用：自転車ナビに切り替える</span></h2>



<p>上記のサンプルでは <code>foot</code>（徒歩） を指定していますが、自転車ナビに切り替えるにはエンドポイントの一部を以下のように変更するだけです：</p>



<pre class="wp-block-preformatted"><code>const url = `https://router.project-osrm.org/route/v1/bike/${start[1]},${start[0]};${end[1]},${end[0]}?overview=full&amp;geometries=geojson`;<br></code></pre>



<p>自転車ナビは自動車用の経路とは異なり、歩道やサイクリングロードを考慮したルートを表示してくれます。</p>



<h2 class="wp-block-heading"><span id="toc5">地図クリックでルート計算（応用例）</span></h2>



<p>Leafletの <code>map.on('click', ...)</code> を使えば、ユーザーが地図上をクリックしてルートの出発地・目的地を選べるインタラクティブなUIも作れます。サンプルコードが必要な場合はお知らせください。</p>



<h2 class="wp-block-heading"><span id="toc6">よくあるトラブルと対策</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>症状</th><th>対策</th></tr></thead><tbody><tr><td>ルートが表示されない</td><td>経緯度の順番を <code>経度, 緯度</code> にしているか確認</td></tr><tr><td>CORSエラー</td><td>OSRMの自前サーバを立てるか、プロキシ経由で回避</td></tr><tr><td>ルートが回り道すぎる</td><td>徒歩・自転車・車などprofileを使い分ける</td></tr><tr><td>日本語の住所で指定できない</td><td>Nominatim等のジオコーディングAPIを併用</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc7">自前でOSRMサーバを立てる方法（中級者向け）</span></h2>



<p>より信頼性の高い運用や独自ルート定義を行いたい場合は、OSRMサーバを自前で構築することも可能です。Dockerでの立ち上げが一般的です：</p>



<pre class="wp-block-preformatted"><code>docker run -t -i -p 5000:5000 osrm/osrm-backend osrm-routed --algorithm mld /data/japan-latest.osrm</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>日本用の <code>.osm.pbf</code> ファイルは <a href="https://download.geofabrik.de/asia/japan.html">Geofabrik </a>から取得できます。</p>
</blockquote>



<h2 class="wp-block-heading"><span id="toc8">今後の拡張アイデア</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>機能</th><th>実現方法</th></tr></thead><tbody><tr><td>現在地から出発</td><td>HTML5 Geolocation APIで緯度経度取得</td></tr><tr><td>経由地ルート</td><td>OSRMの複数地点対応で中間点追加</td></tr><tr><td>高低差情報</td><td>標高APIと連携</td></tr><tr><td>時間制約</td><td>OSRMは時刻未対応 → 他APIの併用検討</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc9">まとめ</span></h2>



<p>LeafletとOSRMを組み合わせれば、APIキー不要・無料で軽快なルート表示をWebサイトに実装できます。Google Mapsでは費用や制限がネックになるケースも、OSMエコシステムなら自由度が格段に広がります。</p>



<p>Web地図の可能性を、自分の手で広げてみましょう。シンプルな構成からはじめて、ぜひ“あなた専用の地図ナビ”へと育ててみてください。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/easy-route-display-with-leaflet-and-osrm-how-to-integrate-walking-and-bicycle-navigation-into-your-web-page/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>店舗や観光スポットの地図表示に最適！LeafletでOpenStreetMapにマーカーを追加する方法</title>
		<link>https://blog.takeho.com/how-to-add-markers-to-openstreetmap-with-leaflet-the-best-way-to-display-a-map-of-stores-and-tourist-spots/</link>
					<comments>https://blog.takeho.com/how-to-add-markers-to-openstreetmap-with-leaflet-the-best-way-to-display-a-map-of-stores-and-tourist-spots/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 01 Jul 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[Leaflet]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1178</guid>

					<description><![CDATA[ブログやサービスに地図を掲載する際、「Google Mapsは有料化が進んで使いにくい…」「もっと自由に使える地図が欲しい…」と感じたことはありませんか？ そんなときに頼れるのが OpenStreetMap（OSM） と [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ブログやサービスに地図を掲載する際、「Google Mapsは有料化が進んで使いにくい…」「もっと自由に使える地図が欲しい…」と感じたことはありませんか？</p>



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




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10"><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">なぜOpenStreetMap＋Leafletなのか？</a></li><li><a href="#toc2" tabindex="0">まずは地図を表示してみよう</a></li><li><a href="#toc3" tabindex="0">マーカーを追加してみよう（ショップや観光スポット）</a></li><li><a href="#toc4" tabindex="0">アイコンをカスタムにしたいときは？</a></li><li><a href="#toc5" tabindex="0">複数マーカーをカテゴリごとにまとめたいなら？</a></li><li><a href="#toc6" tabindex="0">注意点：OpenStreetMapの利用にはクレジット表示が必要です</a></li><li><a href="#toc7" tabindex="0">今後の応用アイデア（本記事では割愛）</a></li><li><a href="#toc8" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">なぜOpenStreetMap＋Leafletなのか？</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>OpenStreetMap（＋Leaflet）</th><th>Google Maps</th></tr></thead><tbody><tr><td>利用料金</td><td>無料</td><td>商用利用はAPI数に応じて課金</td></tr><tr><td>カスタマイズ性</td><td>非常に高い（HTML＋JSで自由に制御可能）</td><td>制限あり（API依存）</td></tr><tr><td>表示スタイルの変更</td><td>タイルやアイコンを自由に差し替え可能</td><td>スタイル変更に制限あり</td></tr><tr><td>著作権・商用表示制限</td><td>クレジット表示すれば自由に使える</td><td>Googleの規約順守が必要</td></tr><tr><td>軽量さ・速度</td><td>高速。Leafletは非常に軽量</td><td>やや重め。モバイルでは読み込みに難あり</td></tr></tbody></table></figure>



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



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc2">まずは地図を表示してみよう</span></h2>



<pre class="wp-block-preformatted"><code>&lt;!DOCTYPE html><br>&lt;html><br>&lt;head><br>  &lt;meta charset="utf-8"><br>  &lt;title>Leaflet × OpenStreetMap&lt;/title><br>  &lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /><br>  &lt;style><br>    #map { height: 500px; }<br>  &lt;/style><br>&lt;/head><br>&lt;body><br>  &lt;h2>OpenStreetMap × Leafletで観光地マップ&lt;/h2><br>  &lt;div id="map">&lt;/div><br><br>  &lt;script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js">&lt;/script><br>  &lt;script><br>    var map = L.map('map').setView([35.6895, 139.6917], 13); // 東京駅付近<br><br>    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {<br>      attribution: '&amp;copy; &lt;a href="https://www.openstreetmap.org/copyright">OpenStreetMap&lt;/a> contributors'<br>    }).addTo(map);<br>  &lt;/script><br>&lt;/body><br>&lt;/html></code></pre>



<h2 class="wp-block-heading"><span id="toc3">マーカーを追加してみよう（ショップや観光スポット）</span></h2>



<pre class="wp-block-preformatted"><code>// 観光地・スポット情報<br>var spots = [<br>  {<br>    name: "浅草寺",<br>    lat: 35.7148,<br>    lng: 139.7967,<br>    desc: "東京最古のお寺。雷門と仲見世通りが有名です。"<br>  },<br>  {<br>    name: "東京スカイツリー",<br>    lat: 35.7100,<br>    lng: 139.8107,<br>    desc: "高さ634m、日本一高いタワー。展望デッキからの眺望は圧巻。"<br>  },<br>  {<br>    name: "上野動物園",<br>    lat: 35.7160,<br>    lng: 139.7710,<br>    desc: "パンダで有名な動物園。ファミリーに人気。"<br>  }<br>];<br><br>// マーカー追加処理<br>spots.forEach(function(spot) {<br>  L.marker([spot.lat, spot.lng])<br>    .addTo(map)<br>    .bindPopup("&lt;b>" + spot.name + "&lt;/b>&lt;br>" + spot.desc);<br>});</code></pre>



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



<h2 class="wp-block-heading"><span id="toc4">アイコンをカスタムにしたいときは？</span></h2>



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



<pre class="wp-block-preformatted"><code>var shopIcon = L.icon({<br>  iconUrl: 'https://example.com/icons/shop.png',<br>  iconSize: [32, 32],<br>  iconAnchor: [16, 32],<br>  popupAnchor: [0, -32]<br>});<br><br>L.marker([35.6895, 139.6917], { icon: shopIcon })<br>  .addTo(map)<br>  .bindPopup("ショップの名前");<br></code></pre>



<p>※ 商用利用の画像は著作権に注意。</p>



<h2 class="wp-block-heading"><span id="toc5">複数マーカーをカテゴリごとにまとめたいなら？</span></h2>



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



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





<a rel="noopener" href="https://leafletjs.com/examples/layers-control" title="Leaflet — an open-source JavaScript library for interactive maps" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fleafletjs.com%2Fexamples%2Flayers-control?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Leaflet — an open-source JavaScript library for interactive maps</div><div class="blogcard-snippet external-blogcard-snippet">Leaflet is a modern, lightweight open-source JavaScript library for mobile-friendly interactive maps.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://leafletjs.com/examples/layers-control" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">leafletjs.com</div></div></div></div></a>




<h2 class="wp-block-heading"><span id="toc6">注意点：OpenStreetMapの利用にはクレジット表示が必要です</span></h2>



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



<pre class="wp-block-preformatted"><code>attribution: '&amp;copy; &lt;a href="https://www.openstreetmap.org/copyright">OpenStreetMap&lt;/a> contributors'<br></code></pre>



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



<h2 class="wp-block-heading"><span id="toc7">今後の応用アイデア（本記事では割愛）</span></h2>



<ul class="wp-block-list">
<li>GeoJSONと連携して外部データをマーカーとして表示</li>



<li>マーカーをクリックした際に詳細ページへジャンプ</li>



<li>マップ上で検索やフィルターを実装</li>
</ul>



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



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc8">おわりに</span></h2>



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



<p>自社サービスのマップ表示や、観光ブログ、ポータルサイトなど、「伝えたい場所がある」すべての人にとって、Leafletは非常に強力な武器になります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/how-to-add-markers-to-openstreetmap-with-leaflet-the-best-way-to-display-a-map-of-stores-and-tourist-spots/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Google Mapsからの卒業？ OpenStreetMapが“無料で自由”な開発を叶える最強地図APIの実力とは</title>
		<link>https://blog.takeho.com/graduation-from-google-maps-openstreetmaps-powerful-map-api-enables-free-and-free-development/</link>
					<comments>https://blog.takeho.com/graduation-from-google-maps-openstreetmaps-powerful-map-api-enables-free-and-free-development/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Fri, 20 Jun 2025 21:41:00 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[Leaflet]]></category>
		<category><![CDATA[Mapbox]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1121</guid>

					<description><![CDATA[目次 はじめに：Google Mapsの壁にぶつかっていませんか？OpenStreetMapとは？ 一言で言えば「みんなで作る、世界地図」Google MapsとOpenStreetMapの“決定的な違い”「OpenSt [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12"><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに：Google Mapsの壁にぶつかっていませんか？</a></li><li><a href="#toc2" tabindex="0">OpenStreetMapとは？ 一言で言えば「みんなで作る、世界地図」</a></li><li><a href="#toc3" tabindex="0">Google MapsとOpenStreetMapの“決定的な違い”</a></li><li><a href="#toc4" tabindex="0">「OpenStreetMapって扱いにくいんじゃないの？」という誤解</a></li><li><a href="#toc5" tabindex="0">どんな開発に向いている？ OSM活用シーンの例</a><ol><li><a href="#toc6" tabindex="0">1. 地図付きのブログや旅行記サイト</a></li><li><a href="#toc7" tabindex="0">2. 不動産・店舗検索サイト</a></li><li><a href="#toc8" tabindex="0">3. 災害支援アプリや避難所マップ</a></li><li><a href="#toc9" tabindex="0">4. 公共交通・ルート検索サービス</a></li></ol></li><li><a href="#toc10" tabindex="0">デメリットは？あえて正直に言うなら</a></li><li><a href="#toc11" tabindex="0">コスト比較：商用開発における現実的な差</a></li><li><a href="#toc12" tabindex="0">よくある質問（FAQ）</a></li><li><a href="#toc13" tabindex="0">まとめ：OSMは「地図開発の自由」を取り戻す鍵</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに：Google Mapsの壁にぶつかっていませんか？</span></h2>



<p>「地図をWebアプリやサイトに表示したい」<br>「位置情報を使ったサービスを提供したい」<br>――そんなとき、多くの開発者が真っ先に思い浮かべるのがGoogle Maps APIでしょう。</p>



<p>Googleが提供するこのサービスは確かに強力ですが、年々厳しくなる利用制限や価格設定、APIキーの発行と制御など、商用利用や中〜大規模サービスの構築時には「コスト」と「制約」の壁にぶつかります。</p>



<p>たとえばこんな課題、心当たりはありませんか？</p>



<ul class="wp-block-list">
<li>月額の無料枠を超えて突然発生する高額課金</li>



<li>APIキーの管理やレート制限に神経を使う毎日</li>



<li>サービス停止を恐れてキャッシュの工夫に追われる</li>



<li>「やりたいことができない」ライセンスの縛り</li>
</ul>



<p>そんなあなたにこそ知ってほしいのが、自由と開放の象徴――OpenStreetMap（OSM）です。</p>



<h2 class="wp-block-heading"><span id="toc2">OpenStreetMapとは？ 一言で言えば「みんなで作る、世界地図」</span></h2>



<p>OpenStreetMap（以下OSM）は、イギリス発のオープンソース地図プロジェクトで、ユーザー自身が地図データを追加・編集・改善していけるのが最大の特徴です。</p>



<p>OSMの魅力は何といってもその「自由さ」です。</p>



<ul class="wp-block-list">
<li>地図データはすべて<strong>無料で使える</strong>（商用利用OK）</li>



<li>データの所有権は誰にも奪われない（<strong>データポータビリティ</strong>）</li>



<li>データを加工・分析・再利用することができる（<strong>ライセンスの緩さ</strong>）</li>
</ul>



<p>要するに「地図データという“資産”を、誰でも無償で使える」これがOSM最大の価値です。</p>



<h2 class="wp-block-heading"><span id="toc3">Google MapsとOpenStreetMapの“決定的な違い”</span></h2>



<p>ここで、Google Maps APIとOSMの主要な違いを一覧で見てみましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>Google Maps API</th><th>OpenStreetMap + ライブラリ</th></tr></thead><tbody><tr><td>利用料金</td><td>有料（従量課金）</td><td>無料（完全フリー）</td></tr><tr><td>商用利用</td><td>制限あり／契約必要</td><td>完全OK（ライセンス表示だけ）</td></tr><tr><td>カスタマイズ性</td><td>限定的（スタイル変更のみ）</td><td>自由自在（地物ごとのスタイル定義可能）</td></tr><tr><td>データの再利用</td><td>不可（2次利用NG）</td><td>可能（CC BY-SAライセンス）</td></tr><tr><td>表示APIの自由度</td><td>Googleに依存</td><td>Leaflet.jsやOpenLayersなど複数選択肢</td></tr></tbody></table></figure>



<p><strong>コストゼロ、自由度100％</strong>――この対比がOSMを選ぶ理由になります。</p>



<h2 class="wp-block-heading"><span id="toc4">「OpenStreetMapって扱いにくいんじゃないの？」という誤解</span></h2>



<p>「自由すぎて逆に使いにくそう……」という声もあるかもしれません。</p>



<p>でも心配は無用。OSMを「Google Mapsと同じ感覚で使う」ための便利なライブラリが存在します。それが以下の2大ライブラリです。</p>



<ul class="wp-block-list">
<li><strong>Leaflet.js</strong>：軽量・モバイル対応・直感的なJavaScriptライブラリ</li>



<li><strong>OpenLayers</strong>：高機能・GIS対応・大規模プロジェクト向け</li>
</ul>



<p>中でもLeaflet.jsは初心者にも扱いやすく、コードも非常にシンプルです。</p>



<pre class="wp-block-preformatted"><code>&lt;div id="map" style="height: 400px;">&lt;/div><br>&lt;script><br>  var map = L.map('map').setView([35.681236, 139.767125], 13);<br>  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {<br>    attribution: '&amp;copy; OpenStreetMap contributors'<br>  }).addTo(map);<br>&lt;/script><br></code></pre>



<p>これだけで、<strong>即座に地図表示</strong>ができます。Google MapsのようなAPIキー取得・課金登録・SDK初期化などは不要です。</p>



<h2 class="wp-block-heading"><span id="toc5">どんな開発に向いている？ OSM活用シーンの例</span></h2>



<h3 class="wp-block-heading"><span id="toc6">1. 地図付きのブログや旅行記サイト</span></h3>



<p>写真やエピソードに地図を添えることで説得力アップ。無料で使えるからPVに左右されず継続可能。</p>



<h3 class="wp-block-heading"><span id="toc7">2. 不動産・店舗検索サイト</span></h3>



<p>カスタムマーカーやルート表示も思いのまま。独自スタイルで見やすさもUP。</p>



<h3 class="wp-block-heading"><span id="toc8">3. 災害支援アプリや避難所マップ</span></h3>



<p>地域貢献型のアプリにも最適。自治体や市民団体でも活用されています。</p>



<h3 class="wp-block-heading"><span id="toc9">4. 公共交通・ルート検索サービス</span></h3>



<p>GTFS（公共交通データ）と組み合わせれば、複雑なルート表示も可能。</p>



<h2 class="wp-block-heading"><span id="toc10">デメリットは？あえて正直に言うなら</span></h2>



<p>OpenStreetMapにも課題はあります。以下が代表的なものです。</p>



<ul class="wp-block-list">
<li><strong>表示スタイルがやや地味</strong>：ただしスタイル変更・独自タイル導入で解決可能</li>



<li><strong>公式サーバーの使用制限</strong>：大量アクセス用途には独自タイルサーバー構築が必要</li>



<li><strong>一部地域で情報が不完全</strong>：ローカル情報はコミュニティ次第</li>
</ul>



<p>とはいえ、これらの多くは「自分で制御できる」範囲にあります。Google Mapsのように「ルールに縛られる」のではなく「ルールを作れる」というのが大きな違いです。</p>



<h2 class="wp-block-heading"><span id="toc11">コスト比較：商用開発における現実的な差</span></h2>



<p>Google Maps APIは2025年現在、月200ドル分の無料枠を超えると以下の課金が発生します。</p>



<ul class="wp-block-list">
<li>地図の表示：1,000回あたり7ドル</li>



<li>ジオコーディング：1,000回あたり5ドル</li>
</ul>



<p>月に20万回以上表示されるような中〜大規模サービスでは、<strong>月数十万円の請求</strong>が発生することもザラです。</p>



<p>一方でOSMは無料。タイルの表示も、Leafletや独自ホスティングで<strong>維持費ゼロまたは数千円レベル</strong>に抑えることができます。</p>



<h2 class="wp-block-heading"><span id="toc12">よくある質問（FAQ）</span></h2>



<p><strong>Q. 商用サイトでも本当に無料で使えますか？</strong><br>A. はい。ライセンス表示（©OpenStreetMap contributors）さえ守れば、商用利用も問題ありません。</p>



<p><strong>Q. APIキーは必要ですか？</strong><br>A. 不要です。地図表示もジオコーディングも、APIキー不要なライブラリやサービスがあります。</p>



<p><strong>Q. 自社スタイルの地図が作れますか？</strong><br>A. 可能です。TileMillやMapbox Studioなどを使えば完全なカスタム地図が作成できます。</p>



<h2 class="wp-block-heading"><span id="toc13">まとめ：OSMは「地図開発の自由」を取り戻す鍵</span></h2>



<p>地図を使った開発は、今やあらゆるWebサービスにおいて必要不可欠です。<br>ですが、その地図が“企業依存”である限り、あなたのサービスは自由ではありません。</p>



<p>OpenStreetMapは、誰でも・無料で・無制限に使える「インフラとしての地図」です。<br>それを支えるのは、世界中のユーザーが育てる地図データと、それを支えるオープンな開発コミュニティ。</p>



<p>Google Mapsのように簡単に使える一方で、自由度と持続可能性は段違い。<br>この機会に、あなたのサービスにも「地図の自由」を取り戻してみませんか？</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">OSM開発に役立つリンク集</span></div><div class="tab-caption-box-content block-box-content box-content">
<ul class="wp-block-list">
<li><a class="" href="https://leafletjs.com/">Leaflet.js 公式サイト</a></li>



<li><a class="" href="https://www.openstreetmap.org/">OpenStreetMap公式</a></li>



<li><a>OpenStreetMap Wiki（日本語）</a></li>



<li><a>Mapbox Studio（カスタムスタイル）</a></li>



<li><a class="" href="https://nominatim.org/">Nominatim（ジオコーディング）</a></li>



<li><a class="" href="https://openstreetmap.jp/">日本のOSMコミュニティ</a></li>
</ul>
</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/graduation-from-google-maps-openstreetmaps-powerful-map-api-enables-free-and-free-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OpenStreetMapに標高データを組み込む &#8211; 標高データの概要とデータについて理解を深める</title>
		<link>https://blog.takeho.com/incorporating-elevation-data-into-openstreetmap-get-an-overview-of-elevation-data-and-an-understanding-of-the-data/</link>
					<comments>https://blog.takeho.com/incorporating-elevation-data-into-openstreetmap-get-an-overview-of-elevation-data-and-an-understanding-of-the-data/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 08 Jun 2025 08:06:41 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[Mapbox]]></category>
		<category><![CDATA[Open-Elevation]]></category>
		<category><![CDATA[OpenTopography]]></category>
		<category><![CDATA[国土地理院]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1088</guid>

					<description><![CDATA[OpenStreetMap（以下OSM）は、ユーザー主導で自由に編集・利用できる地図データとして非常に優れています。しかし、登山やハイキング、サイクリングといったアウトドア用途のルート検索では「標高情報」が欠落しているた [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>OpenStreetMap（以下OSM）は、ユーザー主導で自由に編集・利用できる地図データとして非常に優れています。しかし、登山やハイキング、サイクリングといったアウトドア用途のルート検索では「標高情報」が欠落しているため、急勾配や山岳地域の経路選定に必要な高度差を考慮できず、推奨できません。そこで本記事では、OSMに標高データを組み込むための概要解説と「自前でデータを取得・組み込む」方法をステップバイステップでご紹介します。</p>



<h2 class="wp-block-heading">標高データAPIの現状と課題</h2>



<p>インターネット上には無料で利用できる標高データAPIがいくつか存在します。代表的なものを以下に挙げます（※APIリクエスト制限や有料プランへの誘導が多い点にご留意ください）。</p>



<ol class="wp-block-list">
<li><strong>Google Maps Elevation API</strong>
<ul class="wp-block-list">
<li>無料枠あり。ただし1日あたり2,500リクエストまで。超過時は課金。</li>
</ul>
</li>



<li><strong>Open-Elevation API</strong>
<ul class="wp-block-list">
<li>完全無料。ただしリクエスト遅延、運営不安定の報告あり。</li>
</ul>
</li>



<li><strong>Mapbox Terrain-RGB</strong>
<ul class="wp-block-list">
<li>無料枠あり。高精度だが、商用利用ではプラン契約必須。</li>
</ul>
</li>



<li><strong>USGS Elevation Point Query Service</strong>
<ul class="wp-block-list">
<li>アメリカ国内限定。無料だが日本国内では未対応。</li>
</ul>
</li>



<li><strong>OpenTopography</strong>
<ul class="wp-block-list">
<li>無料プランあり。リクエスト制限・APIキー取得が必要。</li>
</ul>
</li>
</ol>



<p>これらのAPIを利用すると手軽ですが、多くが利用規約やリクエスト制限に縛られ、継続運用コストや安定性に課題があります。そこで本記事では、API依存せず、自ら標高データを取得しOSMに組み込む手法を最終目標とします。</p>



<h2 class="wp-block-heading">標高データの代表的提供元とその取得方法</h2>



<p>国内における最も信頼性が高い標高データ提供元は国土地理院（GSI）の「基盤地図情報 数値標高モデル（DEM）」です。以下、主要な提供元との比較と、国土地理院を選ぶ理由をまとめます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>提供元</th><th>データ精度</th><th>利用条件</th><th>メリット</th><th>デメリット</th></tr></thead><tbody><tr><td>Google Maps Elevation API</td><td>高精度</td><td>無料枠制限、商用利用課金</td><td>開発者向けSDK豊富、信頼性高い</td><td>リクエスト制限、課金体系が複雑</td></tr><tr><td>Open-Elevation API</td><td>中精度</td><td>完全無料</td><td>APIキー不要、シンプル</td><td>遅延・メンテ不安</td></tr><tr><td>Mapbox Terrain-RGB</td><td>高精度</td><td>無料枠制限、商用利用課金</td><td>カラーマップで可視化容易</td><td>ライセンス条件厳格</td></tr><tr><td>国土地理院 DEM</td><td>1m/5m/10m</td><td>完全無料、商用･非商用問わず可</td><td>日本全国を公的機関が提供、最新データ</td><td>データサイズ大、取り扱いが煩雑</td></tr><tr><td>OpenTopography</td><td>可変</td><td>無料枠制限、APIキー必要</td><td>多様なフォーマット対応</td><td>日本国内利用時やや不便</td></tr></tbody></table></figure>



<p><strong>国土地理院を選ぶ理由</strong></p>



<ul class="wp-block-list">
<li><strong>公的機関提供</strong><br>データの信頼性・正確性が高い</li>



<li><strong>ライセンス自由度</strong><br>商用・非商用問わず再配布や加工が可能</li>



<li><strong>更新頻度</strong><br>最新の標高データが定期的に公開</li>
</ul>



<h2 class="wp-block-heading">国土地理院データ取得の手順</h2>



<p>以下の手順で「基盤地図情報ダウンロードサービス」から数値標高モデルを入手します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1280" height="685" src="https://blog.takeho.com/wp-content/uploads/2025/06/893748923-1280x685.png" alt="" class="wp-image-1093" srcset="https://blog.takeho.com/wp-content/uploads/2025/06/893748923-1280x685.png 1280w, https://blog.takeho.com/wp-content/uploads/2025/06/893748923-640x342.png 640w, https://blog.takeho.com/wp-content/uploads/2025/06/893748923-768x411.png 768w, https://blog.takeho.com/wp-content/uploads/2025/06/893748923.png 1333w" sizes="(max-width: 1280px) 100vw, 1280px" /><figcaption class="wp-element-caption">基盤地図情報 ダウンロードサービス</figcaption></figure>



<p></p>



<ol class="wp-block-list">
<li>ブラウザで「基盤地図情報ダウンロードサービス」<br>（<a>https://service.gsi.go.jp/kiban/app/</a>）にアクセス。</li>



<li>「基盤地図情報」の一覧から「数値標高モデル」を選択し移動。</li>



<li>データ形式として<strong>1mメッシュ</strong>／<strong>5mメッシュ</strong>／<strong>10mメッシュ</strong>を選択可能。
<ul class="wp-block-list">
<li>※本記事ではバランスの取れた<strong>5mメッシュ</strong>を選択します。</li>
</ul>
</li>



<li>地図上で埼玉県所沢市周辺を拡大し、スケールを2,000ピクセル程度に設定。<br>タイル番号「533953」をクリックしてダウンロードリストに追加。</li>



<li>「ダウンロード・解凍」ボタンを押下し、XML形式データ（100ファイル）が取得できることを確認。</li>



<li>ダウンロードした100ファイルの中から「FG-GML-5339-53-01-DEM5A-20250214.xml」をテキストエディタで開く。</li>



<li><code>&lt;gml:tupleList></code>要素を探すと、33750個の標高データが並ぶリストが存在。</li>
</ol>



<h2 class="wp-block-heading">&lt;gml:tupleList>のデータ構造と意味</h2>



<p><code>&lt;gml:tupleList&gt;</code>には、5mメッシュの各格子点に対応する標高値が「空白区切り」の数値として格納されています。33750という数字は、<strong>縦225点 × 横150点</strong>のグリッドに相当し、以下のように配列されています。</p>



<ul class="wp-block-list">
<li><strong>並び順</strong>：<br>1行目の左上から右方向に150点分、<br>続いて2行目の左端から右方向に150点分、<br>…を繰り返して225行分。</li>



<li><strong>解釈例</strong>：
<ul class="wp-block-list">
<li>最初の数値＝タイル左上の標高（m）</li>



<li>150番目の数値＝タイル上辺の右端標高</li>



<li>151番目＝2行目左端の標高</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">5mメッシュタイルの面積計算</h2>



<p>5mメッシュ1格子の面積：5m × 5m = 25㎡<br>タイル全体の格子数：33750点<br>→ タイル面積 = 25㎡ × 33750 = <strong>843,750㎡</strong>（約0.844km²）</p>



<p>100ファイル分を用いると、所沢市を含むタイル群の合計面積を算出できます。<br>（例：東京多摩地域全体をカバーするエリアなど応用可能）</p>



<h2 class="wp-block-heading">メッシュ解像度とサーバ要件</h2>



<p><strong>1mメッシュ</strong></p>



<ul class="wp-block-list">
<li>データ量は5mメッシュの約25倍（225×5=1125行、150×5=750列→843,750点）</li>



<li>高性能なストレージ・メモリ・CPUが必須</li>
</ul>



<p><strong>5mメッシュ</strong></p>



<ul class="wp-block-list">
<li>バランス良く用途が多いが、標高解析が多岐にわたる場合は尚更高性能環境が望ましい</li>
</ul>



<p><strong>10mメッシュ</strong></p>



<ul class="wp-block-list">
<li>データ量はさらに軽量で、まずはこちらで運用実績を積み、パフォーマンス確認をおすすめします</li>



<li>次のステップアップとして5mメッシュ導入を検討</li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p>本記事では、OSMに標高データを組み込むための前提知識と、国土地理院を活用したデータ取得手順、データ構造の解説、面積計算例、解像度別の運用提案までをご紹介しました。次回以降では、実際に取得したXMLデータをGeoJSONやタイル形式に変換し、Leaflet.js上で可視化するステップに進みます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/incorporating-elevation-data-into-openstreetmap-get-an-overview-of-elevation-data-and-an-understanding-of-the-data/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>なぜLeaflet.js？OpenStreetMapを表示するために必要な理由と具体的サンプル解説</title>
		<link>https://blog.takeho.com/why-leaflet-js-why-it-is-necessary-to-display-openstreetmap-and-concrete-sample-explanation/</link>
					<comments>https://blog.takeho.com/why-leaflet-js-why-it-is-necessary-to-display-openstreetmap-and-concrete-sample-explanation/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sat, 07 Jun 2025 05:29:07 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[Leaflet]]></category>
		<category><![CDATA[marker]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1083</guid>

					<description><![CDATA[OpenStreetMap（以下、OSM）は、自由に使える地図データとして人気が高まっていますが、「OSMを使って地図を表示したい」と思っても、そのままではWebページに表示することはできません。 実際に地図を表示・操作 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>OpenStreetMap（以下、OSM）は、自由に使える地図データとして人気が高まっていますが、「OSMを使って地図を表示したい」と思っても、<strong>そのままではWebページに表示することはできません</strong>。</p>



<p>実際に地図を表示・操作するには、「Leaflet.js」のような地図ライブラリ（表示エンジン）が必要です。本記事では、</p>



<ul class="wp-block-list">
<li>なぜライブラリが必要なのか？</li>



<li>なぜLeaflet.jsがおすすめなのか？</li>



<li>実際にOSMをHTMLに表示するサンプルコード</li>



<li>JavaScriptコードの丁寧な解説</li>
</ul>



<p>までを、初心者の方にもわかりやすく紹介していきます。</p>



<h2 class="wp-block-heading">なぜOSMには地図表示用のライブラリが必要なのか？</h2>



<p>OpenStreetMapは「地図を作るためのデータベース」です。たとえば、ある地点の緯度・経度、道路の形状、建物の位置などは持っていますが、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>「Webページに地図を表示する機能」そのものは提供していません。</strong></p>
</blockquote>



<p>OSMが提供しているのは、「地図データ」や「タイル画像（地図の小さな画像）」です。それをどう表示するかは<strong>利用者側で実装する必要がある</strong>のです。</p>



<h3 class="wp-block-heading">例えるなら…</h3>



<ul class="wp-block-list">
<li><strong>OSM</strong>：素材（野菜や肉など）</li>



<li><strong>Leaflet.js</strong>：料理を作るためのフライパンや調理法</li>



<li><strong>完成したWebマップ</strong>：美味しい料理（ユーザーが見る地図）</li>
</ul>



<p>つまり、OSMだけでは“見える”地図にならず、「表示するための道具（＝ライブラリ）」が必要なのです。</p>



<h2 class="wp-block-heading">なぜLeaflet.jsをおすすめするのか？</h2>



<p>地図ライブラリには他にもさまざまな選択肢があります</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ライブラリ</th><th>特徴</th></tr></thead><tbody><tr><td><strong>Leaflet.js</strong></td><td>軽量、学習コスト低、初心者向け</td></tr><tr><td>OpenLayers</td><td>高機能（GIS向け）、やや複雑</td></tr><tr><td>MapLibre GL JS</td><td>3Dやベクトルタイルに強い、比較的新しい</td></tr><tr><td>CesiumJS</td><td>3D地球・宇宙向け、非常に高機能</td></tr></tbody></table></figure>



<p>この中でも、OSMの表示にLeaflet.jsをおすすめする理由は以下の通りです。</p>



<h3 class="wp-block-heading">Leaflet.jsの強み</h3>



<ol class="wp-block-list">
<li><strong>非常に軽量で高速</strong>（CDNで一発読み込み、サイズも小さい）</li>



<li><strong>設定がシンプル</strong>（地図の表示もマーカー追加も数行）</li>



<li><strong>OSMタイルとの相性が抜群</strong>（デフォルトで利用可能）</li>



<li><strong>コミュニティが活発で情報も多い</strong></li>



<li><strong>モバイル対応も標準装備</strong>（スマホでも快適に動く）</li>
</ol>



<p>特に初心者や中小規模のWebサイト運営者にとって、<strong>手軽に地図を扱える安心感とカスタマイズの柔軟さが両立している点</strong>は他のライブラリにはない魅力です。</p>



<h2 class="wp-block-heading">OpenStreetMapをLeaflet.jsで表示するサンプル</h2>



<p>以下は、Leafletを使ってOSMをHTML上に表示する<strong>最小構成の実装例</strong>です。</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html>
&lt;html lang="ja">
&lt;head>
  &lt;meta charset="utf-8" />
  &lt;title>OpenStreetMap × Leaflet サンプル&lt;/title>
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
  &lt;!-- LeafletのCSS -->
  &lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
  &lt;style>
    #map {
      height: 500px;
    }
  &lt;/style>
&lt;/head>
&lt;body>

&lt;h2>OpenStreetMap 地図表示サンプル&lt;/h2>
&lt;div id="map">&lt;/div>

&lt;!-- LeafletのJS -->
&lt;script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js">&lt;/script>
&lt;script>
  // 地図を表示する領域を指定
  var map = L.map('map').setView(&#91;35.681236, 139.767125], 13); // 東京駅の緯度・経度

  // OpenStreetMapのタイルレイヤーを設定
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&amp;copy; OpenStreetMap contributors',
    maxZoom: 19
  }).addTo(map);

  // ピン（マーカー）を追加
  L.marker(&#91;35.681236, 139.767125]).addTo(map)
    .bindPopup('東京駅です')
    .openPopup();
&lt;/script>

&lt;/body>
&lt;/html>
</code></pre>



<h2 class="wp-block-heading">JavaScript部分の解説</h2>



<pre class="wp-block-code"><code>var map = L.map('map').setView(&#91;35.681236, 139.767125], 13);</code></pre>



<ul class="wp-block-list">
<li><code>L.map('map')</code>：IDが<code>map</code>のdivに地図を表示</li>



<li><code>.setView([緯度, 経度], ズーム)</code>：初期表示位置とズーム設定</li>
</ul>



<pre class="wp-block-code"><code>L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  attribution: '&amp;copy; OpenStreetMap contributors',
  maxZoom: 19
}).addTo(map);
</code></pre>



<ul class="wp-block-list">
<li><code>tileLayer()</code>：地図のタイル画像を読み込むURLを設定（ここではOSM公式）</li>



<li><code>{z}/{x}/{y}</code>：ズームレベル・タイル座標を自動で置換して表示</li>



<li><code>addTo(map)</code>：このレイヤーを現在の地図に追加</li>
</ul>



<pre class="wp-block-code"><code>L.marker(&#91;35.681236, 139.767125]).addTo(map)
  .bindPopup('東京駅です')
  .openPopup();
</code></pre>



<ul class="wp-block-list">
<li><code>marker()</code>：指定した緯度・経度にマーカー（ピン）を置く</li>



<li><code>bindPopup()</code>：マーカーをクリックすると表示される吹き出し（ポップアップ）</li>



<li><code>openPopup()</code>：初期表示時に自動で吹き出しを開く</li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/why-leaflet-js-why-it-is-necessary-to-display-openstreetmap-and-concrete-sample-explanation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Googleマップだけじゃない！OpenStreetMap（OSM）で地図の世界がもっと自由に</title>
		<link>https://blog.takeho.com/more-than-just-google-maps-openstreetmap-osm-makes-the-world-of-maps-freer/</link>
					<comments>https://blog.takeho.com/more-than-just-google-maps-openstreetmap-osm-makes-the-world-of-maps-freer/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 25 May 2025 05:19:21 +0000</pubDate>
				<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[Google]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1078</guid>

					<description><![CDATA[Webやアプリに地図を組み込むとき、多くの人は真っ先に「Google Maps」を思い浮かべるでしょう。しかし、地図の世界はそれだけではありません。むしろ最近では、自由で柔軟な地図サービス「OpenStreetMap（O [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Webやアプリに地図を組み込むとき、多くの人は真っ先に「Google Maps」を思い浮かべるでしょう。しかし、地図の世界はそれだけではありません。むしろ最近では、自由で柔軟な地図サービス「OpenStreetMap（OSM）」が注目を集めています。</p>



<p>この記事では、これからOpenStreetMapを初めて使う方に向けて、基本的な仕組みから、Google Mapsとの違い、技術的な面でのメリット・デメリット、そしてなぜOSMを選ぶべきなのか、将来性までをじっくり解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14"><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">OpenStreetMap（OSM）とは？</a></li><li><a href="#toc2" tabindex="0">Google Mapsとの違いは？</a></li><li><a href="#toc3" tabindex="0">技術的な違いと難易度は？</a><ol><li><a href="#toc4" tabindex="0">Google Maps APIの特徴</a></li><li><a href="#toc5" tabindex="0">OSMを使うには？</a></li></ol></li><li><a href="#toc6" tabindex="0">なぜOpenStreetMapを選ぶのか？</a></li><li><a href="#toc7" tabindex="0">OpenStreetMapの将来性と世界での活用</a><ol><li><a href="#toc8" tabindex="0">活用事例（一部）</a></li></ol></li><li><a href="#toc9" tabindex="0">OpenStreetMapをおすすめしないケース</a></li><li><a href="#toc10" tabindex="0">まとめ：OpenStreetMapは「自由をくれる地図」</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">OpenStreetMap（OSM）とは？</span></h2>



<p>OpenStreetMap（オープンストリートマップ）とは、一言で言えば「みんなで作る地図」です。</p>



<ul class="wp-block-list">
<li>誰でも自由に編集・利用できるオープンな地図データ</li>



<li>世界中のボランティアが手動で道路、建物、施設などを登録・修正</li>



<li>非営利団体「OSMF（OpenStreetMap Foundation）」が運営</li>
</ul>



<p>つまり、OSMは<strong>Wikipediaの地図版</strong>と捉えるとわかりやすいでしょう。商業サービスではないため、ライセンスや利用料の制限が少なく、商用利用もOK（条件あり）というのが大きな魅力です。</p>



<h2 class="wp-block-heading"><span id="toc2">Google Mapsとの違いは？</span></h2>



<p>Google MapsとOSMの違いは、地図の「提供主体」や「自由度」にあります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>Google Maps</th><th>OpenStreetMap</th></tr></thead><tbody><tr><td>運営主体</td><td>Google（営利企業）</td><td>OSMF（非営利団体）</td></tr><tr><td>ライセンス</td><td>有料・制限あり（APIキー必須）</td><td>オープンライセンス（ODbL）</td></tr><tr><td>商用利用</td><td>月額課金やAPI制限あり</td><td>基本無料（自前でタイル提供も可能）</td></tr><tr><td>データ修正</td><td>一般ユーザーは不可</td><td>誰でも編集可能</td></tr><tr><td>データの詳細度</td><td>都市部で非常に高精度</td><td>地域によりバラつきあり</td></tr><tr><td>カスタマイズ</td><td>基本はGoogleの仕様に従う必要あり</td><td>地図スタイルや表示形式を自由に変更可能</td></tr></tbody></table></figure>



<p>Google Mapsは便利で強力なプラットフォームですが、<strong>制限も多く、料金体系も複雑</strong>です。対して、OSMは<strong>自由度が高く、自分で地図を“育てて”いくことも可能</strong>です。</p>



<h2 class="wp-block-heading"><span id="toc3">技術的な違いと難易度は？</span></h2>



<p>ここが多くの初心者がつまずくポイント。「Google MapsのAPIってコピペすれば地図が出るけど、OSMってちょっと難しそう…」という印象、ありますよね。</p>



<p>実はその印象、<strong>半分正解・半分誤解</strong>です。</p>



<h3 class="wp-block-heading"><span id="toc4">Google Maps APIの特徴</span></h3>



<ul class="wp-block-list">
<li>JavaScript SDKを使えば数行のコードで地図を表示可能</li>



<li>豊富なドキュメントとサンプルが揃っている</li>



<li>ただしAPIキーが必須で、利用回数に応じて課金される</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">OSMを使うには？</span></h3>



<p>OpenStreetMap自体には「表示用のAPI」は存在しません（主にデータ提供が目的）。表示には以下のような<strong>地図表示ライブラリ</strong>を使います：</p>



<ul class="wp-block-list">
<li><a class="" href="https://leafletjs.com/">Leaflet.js</a>（初心者向け、軽量）</li>



<li><a class="" href="https://openlayers.org/">OpenLayers</a>（中〜上級者向け、高機能）</li>



<li><a class="" href="https://maplibre.org/">MapLibre GL JS</a>（Mapboxのオープン版）</li>
</ul>



<p>これらを使って、OSMの地図タイル（地図画像）を読み込み、Webページに表示するという流れになります。</p>



<pre class="wp-block-preformatted">// Leafletの例（超シンプル）<br>L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png')</pre>



<p>つまり、<strong>Leafletなどのツールを使えば、Google Mapsに劣らないくらい手軽にOSMを扱える</strong>のです。</p>



<h2 class="wp-block-heading"><span id="toc6">なぜOpenStreetMapを選ぶのか？</span></h2>



<ol class="wp-block-list">
<li><strong>コストがゼロに近い</strong>
<ul class="wp-block-list">
<li>APIキー不要、表示回数に制限なし（タイル提供元の利用ポリシーには注意）</li>
</ul>
</li>



<li><strong>地図の見た目をカスタマイズできる</strong>
<ul class="wp-block-list">
<li>スタイルを自分好みに変更可能（例：白黒地図、夜間モード、登山向け地図など）</li>
</ul>
</li>



<li><strong>データを修正・拡張できる</strong>
<ul class="wp-block-list">
<li>地図に足りない要素を自分で追加・改善できる（例：お店の場所、歩道の情報）</li>
</ul>
</li>



<li><strong>プライバシーへの配慮</strong>
<ul class="wp-block-list">
<li>OSMは基本的にトラッキングを行わない。Google Maps APIはページ閲覧情報をGoogleに送る。</li>
</ul>
</li>



<li><strong>災害時・地域支援にも活用されている</strong>
<ul class="wp-block-list">
<li>例：東日本大震災・トルコ地震などでOSMの迅速な地図更新が支援活動に貢献</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc7">OpenStreetMapの将来性と世界での活用</span></h2>



<p>OSMはもはや「マニア向け」ではありません。実際、世界中の企業・自治体・NPOがOSMを採用しています。</p>



<h3 class="wp-block-heading"><span id="toc8">活用事例（一部）</span></h3>



<ul class="wp-block-list">
<li><strong>Facebook（Meta）</strong><br>ナビ・災害情報にOSMを利用</li>



<li><strong>UberやLyft</strong><br>一部地域のルート情報にOSMを導入</li>



<li><strong>人道支援団体（HOT OSM）</strong><br>災害地域の即時地図更新</li>



<li><strong>日本の自治体</strong><br>観光マップや自転車マップなどで活用</li>
</ul>



<p>これらの背景には、「誰かに依存しない地図インフラが必要だ」という社会的な流れがあります。</p>



<h2 class="wp-block-heading"><span id="toc9">OpenStreetMapをおすすめしないケース</span></h2>



<p>あえて、OSMを「おすすめしないケース」も挙げておきます</p>



<ol class="wp-block-list">
<li><strong>商用利用で超高精度なナビゲーションが必要な場合</strong>
<ul class="wp-block-list">
<li>OSMは地域によって精度が異なり、特に田舎や新興国では情報が古いことも</li>
</ul>
</li>



<li><strong>地図の見た目や使い方を変更したくない／学習コストをかけたくない場合</strong>
<ul class="wp-block-list">
<li>Google Mapsなら、APIキーだけで簡単に使える利点がある</li>
</ul>
</li>



<li><strong>膨大なアクセスが見込まれる場合</strong>
<ul class="wp-block-list">
<li>OSM公式タイルサーバには負荷をかけないよう注意が必要。自前でタイルホスティングする工夫が求められる</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc10">まとめ：OpenStreetMapは「自由をくれる地図」</span></h2>



<p>Google Mapsは確かに便利ですが、使うには制限があり、場合によっては「閉じた世界」に感じることもあります。</p>



<p>一方のOpenStreetMapは、多少手間はかかりますが、使う人の意志で自由に形を変えられる「開かれた世界」です。</p>



<p>プログラマーだけでなく、登山家、旅人、福祉関係者、災害支援チーム——あらゆる人がOSMを活用しています。</p>



<p>あなたのプロジェクトにも、OSMの地図という「自由な地図の土台」を加えてみませんか？</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/more-than-just-google-maps-openstreetmap-osm-makes-the-world-of-maps-freer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
