JavaScriptを用いて東京都のインタラクティブな地図を作成する

出版日: 2024年6月17日

JavaScriptを用いて東京都のインタラクティブな地図を作成する

背景

現在のほとんどのアプリは、マップ内の要素をクリックまたはホバーすることで、インタラクティブなSVGマップを持っています。

フルフレッジのウェブ開発者になるためには、SVGやJavaScriptなどのシンプルなツールを使って、このようなインタラクティブなマップを作成する方法を知ることが重要です。

目的

このブログでは、東京都のSVGマップを使用し、市内の自治体にホバーすると情報が表示されるようにします。

このコードをあらゆる種類のSVGマップに適用することができます。東京である必要はまったくありません。

東京都を選んだ理由は、その自治体のSVGマップと、自治体にホバーしたときに表示できるランダムなデータを見つけることができたからです。

このコードでは主にJavaScriptと少しのSvelteを使用します。Svelteは使いやすさから選ばれましたが、その構文は簡単に純粋なバニラJavaScriptに戻すことができます。

自治体にホバーしたときに情報を表示するために使用するツールチップ関数には、ライブラリはインポートされていません。

方法

SVGファイル

東京のSVGマップから始めます。ここに、インターネット上のさまざまなソースを使用して作成したマップがあります。それは13KBのシンプルなSVGファイルで、自治体の地形、名前、自治体コードを提供します:

SVGファイル

以下は実際のSVGです。

23特別区はbluevioletで塗られていますが、他の自治体はsteelblueで塗られています。私の2つの好きな色です :)

各自治体に名前とコードが割り当てられていることで、どの自治体にマウスがホバーしているかを特定できます。

SVGファイルはこちらで見つけることができます。

補足データ

現在、SVGファイルがあるので、ユーザーが自治体にホバーしたときに表示するデータが必要です。これには、統計局が提供する人口と世帯数のデータを使用しました。データは以下のようになります:

人口データ

数字だけを表示するのは退屈なので、各自治体に写真を追加して、少し工夫しました。写真はWikipediaから取得しています(スクロールしてすべて見ることができます)。

千代田区

千代田区

中央区

中央区

港区

港区

新宿区

新宿区

文京区

文京区

台東区

台東区

墨田区

墨田区

江東区

江東区

品川区

品川区

目黒区

目黒区

大田区

大田区

世田谷区

世田谷区

渋谷区

渋谷区

中野区

中野区

杉並区

杉並区

豊島区

豊島区

北区

北区

荒川区

荒川区

板橋区

板橋区

練馬区

練馬区

足立区

足立区

葛飾区

葛飾区

江戸川区

江戸川区

八王子市

八王子市

立川市

立川市

武蔵野市

武蔵野市

三鷹市

三鷹市

青梅市

青梅市

府中市

府中市

昭島市

昭島市

調布市

調布市

町田市

町田市

小金井市

小金井市

小平市

小平市

日野市

日野市

東村山市

東村山市

国分寺市

国分寺市

国立市

国立市

福生市

福生市

狛江市

狛江市

東大和市

東大和市

清瀬市

清瀬市

東久留米市

東久留米市

武蔵村山市

武蔵村山市

多摩市

多摩市

稲城市

稲城市

羽村市

羽村市

あきる野市

あきる野市

西東京市

西東京市

西多摩郡瑞穂町

西多摩郡瑞穂町

西多摩郡日の出町

西多摩郡日の出町

西多摩郡檜原村

西多摩郡檜原村

西多摩郡奥多摩町

西多摩郡奥多摩町

大島町

大島町

利島村

利島村

新島村

新島村

神津島村

神津島村

三宅島三宅村

三宅島三宅村

御蔵島村

御蔵島村

八丈島八丈町

八丈島八丈町

青ヶ島村

青ヶ島村

小笠原村

小笠原村

この写真のビューがとても気に入っています。スクロールすると、東京が都市から田舎、そして最後に島へと移り変わる様子を見ることができます。

東京が23の高度に都市化された区だけで構成されているわけではないと知ることは新鮮です。

人口データと写真を混ぜ合わせて、最終的なJSONファイルが以下のようになります。

最終JSONファイル

フロントエンド - SVG

各パスが自治体を示すSVGマップができたので、パスにホバーしたときに関数をトリガーする機能を追加しましょう:

<script>
let data = [
	{
		code: 13102,
		name: '中央区',
		population: { m: 53336, f: 58124 },
		household: 64206,
		image: 'https://upload.wikimedia...'
	}, // ... 
]

function handleMouseover(key) {
	// Get the municipality that is hovered
	entity = data.filter((d) => d.code === key)[0];
}
</script>

<svg>
	<path
		on:mouseover={() => handleMouseover(13102)}
		d="m 636,223 7,5 8,1 9,-12 -2,-6 11,-8 -9,-8 -2,5 -17,-3 -11,13 v 7 z"
	/>
	<!-- ... -->
</svg>

上記の関数は、SVGファイル内のすべてのパスに添付されています。これで、ユーザーがどの自治体にホバーしているかを把握できます。

フロントエンド - インフォパネル

次に、ユーザーがホバーしている自治体の情報を表示するインフォパネルを作成しましょう。

Tailwindを使用することをお勧めします。これにより、スタイリングが非常に簡単になります。詳細は私の記事をご覧ください。

以下は、インフォパネルを作成するために使用するコードです:

<div class="flex rounded-xl overflow-hidden shadow-xl mx-auto my-8">
	<img
		class="h-100 w-[150px] min-w-[150px] max-w-[150px] object-cover"
		src="https://upload.wikimedia..."
		alt="中央区"
	/>
	<div class="px-8 py-4 flex gap-2 flex-col bg-white">
		<p class="text-3xl font-bold text-center">中央区</p>
		<div>
			<p class="text-xs text-slate-500 font-bold text-center">Population</p>
			<p class="text-xl text-center">111,460</p>
		</div>
		<div>
			<p class="text-xs text-slate-500 font-bold text-center"># Households</p>
			<p class="text-xl text-center">64,206</p>
		</div>
	</div>
</div>

このコードは、以下のような見栄えの良いパネルを生成します。これは、自治体にホバーしたときに表示するものです。

中央区

中央区

人口

111,460

世帯数

64,206

フロントエンド - ツールチップ

SVGとインフォパネルが準備できたので、残るは自治体にホバーしたときにインフォパネルを表示することだけです。

また、これをマウスの隣に「ツールチップ」形式で表示したいです。

以下のコードは、バニラJavaScriptを使用してツールチップを実装するためのものです。このコードの良い点は、画面を4つの象限に分割し、マウスの位置に応じてツールチップの位置を計算することです。

これは、ツールチップが画面外に出ないようにするためです。たとえば、マウスが画面の下部に近い場合、ツールチップはマウスの上に表示されます。一方、上部に近い場合は、ツールチップはマウスの下に表示されます。

この実装については別の記事を書きますので、興味がある方は後で私のブログをご覧ください。

<script>
function handleMouseMove(event) {
	let x = event.clientX;
	let y = event.clientY;
	let rect = container.getBoundingClientRect();

	info.style.top = y < innerHeight / 2 ? y - rect.top + 10 + 'px' : '';
	info.style.bottom = y < innerHeight / 2 ? '' : rect.bottom - y + 10 + 'px';

	info.style.left = x < innerWidth / 2 ? x - rect.left + 10 + 'px' : '';
	info.style.right = x < innerWidth / 2 ? '' : rect.right - x + 10 + 'px';
}
</script>

<svelte:window
	bind:innerWidth
	bind:innerHeight
	on:mousemove={(e) => handleMouseMove(e)}
/>

結果

すべての必要なステップを実装したので、私たちの作品を見てみましょう。

以下のSVGにホバーして、画像、人口、および世帯数を確認してください:

スリムな情報パネルとツールチップで見た目が美しいですね。

結論

このブログ記事では、Svelte、SVG、JavaScript、およびTailwindを使用して、いくつかの人口統計データを表示するためのインタラクティブなマップを開発しました。

これを達成するために、東京のSVGファイルを作成し、人口や画像などの関連情報を収集し、最終的にツールチップや情報パネルなどのフロントエンド要素を開発しました。

この種の機能はダッシュボードでよく使用されるため、フロントエンド/フルスタックエンジニアとして実装方法を知っておくと良いでしょう。

質問がありますか?下にコメントしてください。

次のブログまで、ハッキングを楽しんでください!

このブログは英語からChatGPTによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。

コメントを残す

コメント

その他のブログ

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

2024/06/19

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

JavaScriptSvelteTooltip動的シンプルツールチップフロントエンド
Matplotlibで日本語文字化けを解決できる簡単な方法

2024/06/14

Matplotlibで日本語文字化けを解決できる簡単な方法

MatplotlibグラフチャートPython日本語文字化け問題バグ
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

2024/06/13

書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

書評トーキング・トゥ・ストレンジャーズ「よく知らない人」について私たちが知っておくべきことマルコム・グラッドウェル
日本語で最もよく使われる3000字の漢字

2024/06/07

日本語で最もよく使われる3000字の漢字

3000よく使う準漢字使用回数漢字日本語漢字リスト漢字普及率日本語能力試験独学勉強単語
VSCodeでRegexを使用してReplaceする方法

2024/06/07

VSCodeでRegexを使用してReplaceする方法

VSCodeRegex検索置き換える条件付き置換FindReplaceConditional Replace
SvelteではReadable Storeを使用するな

2024/06/06

SvelteではReadable Storeを使用するな

SvelteReadableWritableステート管理ストアStore速度メモリファイルサイズ
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

2024/06/05

GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

Gzip圧縮PakoWebサイトローディング速度SvelteKit
JavaScriptを使用してWebページ上でマウスが指している単語を特定する

2024/05/31

JavaScriptを使用してWebページ上でマウスが指している単語を特定する

JavascriptマウスPointerHoverWeb開発
SvelteとSVGを用いてインタラクティブな地図を作成する

2024/05/29

SvelteとSVGを用いてインタラクティブな地図を作成する

SvelteSVGインタラクティブな地図フロントエンド
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

2024/05/28

書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

書評Originals誰もが「人と違うこと」ができる時代アダム・グラント & シェリル・サンドバーグ
Javascriptを使用して数独を解く方法

2024/05/27

Javascriptを使用して数独を解く方法

数独を解くアルゴリズムJavaScriptコーディング
ウェブサイトへのトラフィックを1か月で10倍に増やした方法

2024/05/26

ウェブサイトへのトラフィックを1か月で10倍に増やした方法

ウェブサイトへのトラフィック増加クリックインプレッションGoogle Search Console
人生はサイクリングに似ている

2024/05/24

人生はサイクリングに似ている

サイクリング人生哲学成功
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

2024/05/19

JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

数独バックトラッキング・アルゴリズム完全なグリッドJavaScript
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

2024/05/16

Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

Tailwind素晴らしいフロントエンドWeb開発
PythonとGitフックを使用してサイトマップを自動的に生成する

2024/05/15

PythonとGitフックを使用してサイトマップを自動的に生成する

GitフックPythonサイトマップSvelteKit
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

2024/05/14

書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

書評Range (レンジ)David Epstein (デイビッド・エプスタイン)知識の「幅」が最強の武器になる
SvelteとSvelteKitはなんですか?

2024/05/13

SvelteとSvelteKitはなんですか?

SvelteSvelteKitFront-endVite
SvelteKitで国際化(多言語化)

2024/05/12

SvelteKitで国際化(多言語化)

国際化多言語SvelteKitI18N
SvelteでCachingを用いてDeploy時間を短縮する方法

2024/05/11

SvelteでCachingを用いてDeploy時間を短縮する方法

SvelteEnhanced ImageCachingDeploy Time
SvelteとIntersection Oberverによるレイジーローディング

2024/05/10

SvelteとIntersection Oberverによるレイジーローディング

レイジーローディングウェブサイト速度の最適化SvelteIntersection Observer
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

2024/05/10

遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

株式書状ポートフォリ最適化遺伝的アルゴリズムPython
Pythonを用いてShapeFileをSVGに変換できる方法

2024/05/09

Pythonを用いてShapeFileをSVGに変換できる方法

ShapeFileSVGPythonGeoJSON
Svelteの反応性:変数、バインディング、およびキー関数

2024/05/08

Svelteの反応性:変数、バインディング、およびキー関数

Svelte反応性バインディングキー関数
書評 | 孫子の兵法

2024/05/07

書評 | 孫子の兵法

書評The Art Of War (兵法)Sun Tzu (孫子)Thomas Cleary
スペシャリストは終了。ゼネラリスト万歳!

2024/05/06

スペシャリストは終了。ゼネラリスト万歳!

専門家ジェネラリストパラダイムシフトソフトウエア・エンジニアリング
トルコ人の有権者の投票行動をPythonでの分析

2024/05/03

トルコ人の有権者の投票行動をPythonでの分析

トルコ投票者年齢分析国家投票有権者行動分析
Seleniumを用いてトルコ投票データベースを作る方法

2024/05/01

Seleniumを用いてトルコ投票データベースを作る方法

PythonSeleniumWeb Scrapingトルコ国家投票
SvelteとTailwindを使用してInfinite Scrollできる方法

2024/04/30

SvelteとTailwindを使用してInfinite Scrollできる方法

SvelteTailwindInfinite ScrollFront-end
1年間以内で日本語を駆使できるようになるための方法

2024/04/29

1年間以内で日本語を駆使できるようになるための方法

日本語短時間言語学習日本語能力試験ビジネス日本語
SvelteとTailwindを用いたWebサイトテンプレート

2024/04/25

SvelteとTailwindを用いたWebサイトテンプレート

Web開発フロントエンドSvelteTailwind
怠惰なエンジニアとひどいデザイン

2024/01/29

怠惰なエンジニアとひどいデザイン

怠け者エンジニア質の悪い製品StarbucksSBI証券
偉大さについて

2024/01/28

偉大さについて

雄大さ人生の意味満足できる人生目的
MacBook で PDF を PNG に変換する

2024/01/28

MacBook で PDF を PNG に変換する

PDFPNGMacBookAutomator
2023年振り返り:24冊の読んだ本のまとめ

2023/12/31

2023年振り返り:24冊の読んだ本のまとめ

読書 2023振り返り
Python PILを使用して写真コラージュを作成する方法

2023/12/30

Python PILを使用して写真コラージュを作成する方法

PythonPIL画像処理コラージュ
ウェブサイトの訪問者のデバイスとブラウザを検出する方法

2024/01/09

ウェブサイトの訪問者のデバイスとブラウザを検出する方法

Javascript端末検知ブラウザ検知Website分析
ChatGPT回答の解析

2024/01/19

ChatGPT回答の解析

ChatGPT大規模言語モデル機械学習生成AI