在Blog中添加可交互式足迹地图
这篇文章将向你展示如何在基于Hexo和Next的GitHub Pages博客中创建一个交互式的世界地图页面,这个地图将展示你曾经访问过的城市,你可以根据你对每个城市访问的频率在地图上显示不同颜色的标记,你还可以点击这些标记来显示更多关于这个城市的信息。
准备工作
你需要安装以下工具:
确保你的博客已经被部署到GitHub Pages,并且你在本地的开发环境已经正确设置。
步骤一:创建新页面
在你的Hexo项目的根目录下,运行以下命令:
这个命令将在source目录下创建一个名为”travel”的文件夹,并在该文件夹下创建一个index.md文件。
步骤二:安装 Leaflet
在你的Hexo项目的根目录下,运行以下命令:
然后在index.md文件的最顶部引入Leaflet的CSS和JS:
1 2 3 4 5 6 7 8 9
| --- title: Travel ---
<!-- 引入 Leaflet 的 CSS --> <link rel="stylesheet" href="/node_modules/leaflet/dist/leaflet.css" />
<!-- 引入 Leaflet 的 JavaScript 文件 --> <script src="/node_modules/leaflet/dist/leaflet.js"></script>
|
步骤三:创建地图容器
在index.md中,创建一个用来承载地图的<div>元素,然后通过CSS给它设置一个明确的高度:
1 2 3 4 5 6 7 8 9
| <style> #map { height: 500px; width: 100%; position: relative; } </style>
<div id="map"></div>
|
步骤四:初始化地图
使用Leaflet的API初始化地图,并将其中心设置为经度0,纬度0(大西洋中部),并设置初始的缩放级别为2。
1 2 3 4 5 6 7 8 9
| <script> document.addEventListener('DOMContentLoaded', function() { var map = L.map('map').setView([0, 0], 2);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, }).addTo(map); }); </script>
|
步骤五:添加城市数据
创建一个GeoJSON文件来存储城市的数据,包括城市的名称,经纬度,你访问的次数,以及一个图片的URL。文件的格式应该如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "name": "北京", "visits": 3, "image": "https://your-image-url.com" }, "geometry": { "type": "Point", "coordinates": [116.4074, 39.9042] } }, ... ] }
|
将此文件保存在你的Hexo项目的source目录下,例如,你可以命名为cities.json。
步骤六:加载数据并显示在地图上
在index.md文件中,添加以下代码来加载GeoJSON文件,然后在地图上显示数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <script> document.addEventListener('DOMContentLoaded', function() { var map = L.map('map').setView([0, 0], 2);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, }).addTo(map);
fetch('/travel/cities.json') .then(response => response.json()) .then(data => { L.geoJSON(data, { pointToLayer: function (feature, latlng) { var color = getColor(feature.properties.visits); return L.circleMarker(latlng, { fillColor: color, fillOpacity: 0.5 }); }, onEachFeature: function (feature, layer) { layer.bindPopup(`<h2>${feature.properties.name}</h2><img src="${feature.properties.image}" width="200">`); } }).addTo(map); });
function getColor(visits) { // 根据你访问的次数返回不同的颜色 return visits > 10 ? '#800026' : visits > 5 ? '#BD0026' : visits > 2 ? '#E31A1C' : visits > 1 ? '#FC4E2A' : '#FFEDA0'; }
// 强制Leaflet重新计算地图的尺寸 setTimeout(function() { map.invalidateSize(); }, 100); }); </script>
|
以上的JavaScript代码在页面加载完成后会运行,首先初始化地图,然后加载并解析GeoJSON文件,对于每一个城市,创建一个圆形的标记,颜色根据访问次数决定。当点击标记时,弹出一个包含城市名称和图片的窗口。
至此,你的博客就成功地添加了一个交互式的足迹地图页面。