付録A2: インタラクティブな地図 - クリックで情報を表示
SVGは、そのスケーラビリティとDOM操作の容易さから、インタラクティブな地図を作成するのに非常に適しています。このサンプルでは、簡単な日本の地方区分地図を作成し、マウスオーバーで地域をハイライトし、クリックするとその地域の情報を表示する機能を追加します。ウェブサイトでの地域情報案内や、データマッピングの基礎として応用できます。
完成デモ: インタラクティブ日本地方地図
下の地図の各地方にマウスカーソルを合わせると色が変わり、地方名がツールチップで表示されます。クリックすると右側の情報パネルに詳細が表示されます。
情報を表示します
地図上の地方をクリックしてください。
使用した主なテクニック
<path>
要素: 各地方の形状を単純化して描画。各パスにid
と、情報表示用のdata-name
,data-info
属性を付与。- CSSスタイリング: 通常時、マウスオーバー時 (
:hover
またはJSでクラス付与)、選択時のスタイルを定義。transition
で滑らかな色の変化。 - JavaScriptによるイベント処理:
mouseover
/mouseout
: 地方のハイライト、ツールチップの表示/非表示。click
: クリックされた地方の情報を情報パネルに表示、選択状態のスタイル適用。
- JavaScriptによるDOM操作: 情報パネルのテキスト内容の書き換え、SVG要素のクラスや属性の変更。
- ツールチップ: SVG内の
<text>
要素をマウス位置に追従させ、動的に内容と表示/非表示を切り替え。
コードのポイント解説
1. SVG構造 (HTMLに埋め込み)
各地方は <path>
要素で定義され、それぞれにユニークな id
、表示名のための data-name
、詳細情報のための data-info
属性が設定されています。
<svg id="japanMap" viewBox="0 0 400 300" ...>
<!-- 例: 北海道 -->
<path class="region" id="hokkaido"
data-name="北海道地方"
data-info="日本の最北端に位置し..."
d="M200,5 L280,5 ..." />
<!-- 他の地方も同様 ... -->
<text id="mapTooltip" class="tooltip-text" x="0" y="0">Tooltip</text>
</svg>
2. CSSスタイリング
.region
クラスで基本スタイルを、.region:hover
やJavaScriptで追加する .highlighted
, .selected
クラスで状態に応じたスタイルを定義します。
.region {
stroke: #333; stroke-width: 0.5; fill: #b2dfdb;
transition: fill 0.2s ease-in-out, opacity 0.2s ease-in-out;
cursor: pointer;
}
.region:hover, .region.highlighted { fill: #ffc107; opacity: 0.8; }
.region.selected { fill: #f06292; stroke: #c2185b; stroke-width: 1.5; }
.tooltip-text { font-size: 10px; opacity: 0; /* ... */ }
.tooltip-text.visible { opacity: 1; }
3. JavaScriptによるインタラクション
主な処理の流れは以下の通りです。(実際のコードは下の <script>
タグ内にあります)
- 全ての
.region
要素を取得。 - 各要素に
mouseenter
,mouseleave
,mousemove
,click
イベントリスナーを設定。mouseenter
: ツールチップに地方名を表示し、表示状態にする。要素にハイライトクラスを追加(CSS :hoverでも可)。mouseleave
: ツールチップを非表示状態にする。ハイライトクラスを削除。mousemove
: ツールチップをマウスカーソル位置に追従させる(SVG座標系への変換が必要)。click
:- 以前に選択された要素があれば、選択スタイルを解除。
- クリックされた要素に選択スタイルを適用。
- 情報パネルに、要素の
data-name
とdata-info
を表示。
Did you know? Creating accurate maps in SVG often involves dealing with map projections. Real-world geographical coordinates (latitude/longitude) need to be transformed into 2D Cartesian coordinates suitable for SVG paths. Libraries like D3.js have built-in projection capabilities to handle this complexe task. For simple illustrative maps, manual path creation or simplified shapes are common.
知っていましたか?正確なSVG地図を作成するには、しばしば地図投影法を扱う必要があります。現実世界の地理座標(緯度・経度)は、SVGパスに適した2次元のデカルト座標に変換する必要があります。D3.jsのようなライブラリは、この複雑なタスクを処理するための組み込みの投影機能を持っています。簡単な説明用の地図では、手動でのパス作成や単純化された形状が一般的です。
まとめ
SVGとJavaScriptを組み合わせることで、視覚的に分かりやすく、ユーザーが操作できるインタラクティブな地図コンテンツを作成できます。このサンプルでは基本的なハイライト、ツールチップ、情報表示機能を実装しましたが、ここからさらに発展させて、データの可視化(コロプレス図など)やズーム・パン機能などを追加することも可能です。
地図データそのものの準備(パスデータの作成や取得)がプロジェクトの規模によっては大変な作業になりますが、SVGの柔軟性がそれをインタラクティブにする強力な手段を提供します。次は、「付録A3: 動的なデータビジュアライゼーション」で、データとSVGを連携させる別の例を見ていきましょう。
このページの要約
日本語
このページでは、SVGとJavaScriptを使ってインタラクティブな地図を作成するサンプルを紹介しました。各地域をSVGの<path>
要素で表現し、マウスオーバーでハイライト、クリックで関連情報を表示する機能を実装しました。CSSで見た目を制御し、JavaScriptでイベント処理(マウスイベント)とDOM操作(属性変更、テキスト更新)、ツールチップ表示を行っています。data-*
属性を利用して要素に関連情報を保持させています。
English
This page demonstrated creating an interactive map using SVG and JavaScript. Each region was represented by an SVG <path>
element, with features implemented to highlight on mouseover and display related information on click. CSS controlled the appearance, while JavaScript handled event processing (mouse events), DOM manipulation (attribute changes, text updates), and tooltip display. data-*
attributes were used to store relevant information with the elements.
Español
Esta página demostró la creación de un mapa interactivo usando SVG y JavaScript. Cada región fue representada por un elemento <path>
de SVG, con funciones implementadas para resaltar al pasar el mouse por encima y mostrar información relacionada al hacer clic. CSS controló la apariencia, mientras que JavaScript manejó el procesamiento de eventos (eventos del mouse), la manipulación del DOM (cambios de atributos, actualizaciones de texto) y la visualización de información sobre herramientas. Se utilizaron atributos data-*
para almacenar información relevante con los elementos.
中文
本页演示了如何使用SVG和JavaScript创建交互式地图。每个区域由SVG的<path>
元素表示,并实现了鼠标悬停时高亮显示和点击时显示相关信息的功能。CSS控制外观,而JavaScript处理事件(鼠标事件)、DOM操作(属性更改、文本更新)和工具提示显示。使用data-*
属性将相关信息存储在元素中。