在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文件,对于每一个城市,创建一个圆形的标记,颜色根据访问次数决定。当点击标记时,弹出一个包含城市名称和图片的窗口。
至此,你的博客就成功地添加了一个交互式的足迹地图页面。