<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>amap on Kohsruhe</title><link>https://www.kohsruhe.com/zh/tag/amap/</link><description>Recent content in amap on Kohsruhe</description><generator>Hugo -- gohugo.io</generator><language>zh</language><managingEditor>kohsruhe@outlook.com (Leehyon HNG)</managingEditor><webMaster>kohsruhe@outlook.com (Leehyon HNG)</webMaster><lastBuildDate>Mon, 07 Sep 2026 17:10:50 +0800</lastBuildDate><atom:link href="https://www.kohsruhe.com/zh/tag/amap/index.xml" rel="self" type="application/rss+xml"/><item><title>给博客加了一张旅行地图</title><link>https://www.kohsruhe.com/zh/2026/09/travel-map-on-about/</link><pubDate>Mon, 07 Sep 2026 17:10:50 +0800</pubDate><author>kohsruhe@outlook.com (Leehyon HNG)</author><guid>https://www.kohsruhe.com/zh/2026/09/travel-map-on-about/</guid><description>&lt;p&gt;「关于」页之前只有干巴巴的文字介绍，总觉得单调，便补了一张旅行地图，标记一下自己去过的地方。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本功能是 Vibe 出来的，用的是 MiniMax M3 模型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="准备工作"&gt;准备工作&lt;/h2&gt;
&lt;p&gt;去年在做婚礼请帖时，也就是「&lt;a href="https://wedding.kohsruhe.com/"&gt;👩‍❤️‍👨 我们结婚啦&lt;/a&gt;」这个站点，有用过高德地图的 API，所以这次还是用它。如果你是第一次接入，要先去 &lt;a href="lbs.amap.com"&gt;高德开放平台&lt;/a&gt; 注册开发者账号、申请 Web 端 JS API 的 Key。&lt;/p&gt;</description><content:encoded><![CDATA[<p>「关于」页之前只有干巴巴的文字介绍，总觉得单调，便补了一张旅行地图，标记一下自己去过的地方。</p>
<blockquote>
<p>本功能是 Vibe 出来的，用的是 MiniMax M3 模型。</p>
</blockquote>
<h2 id="准备工作">准备工作</h2>
<p>去年在做婚礼请帖时，也就是「<a href="https://wedding.kohsruhe.com/">👩‍❤️‍👨 我们结婚啦</a>」这个站点，有用过高德地图的 API，所以这次还是用它。如果你是第一次接入，要先去 <a href="lbs.amap.com">高德开放平台</a> 注册开发者账号、申请 Web 端 JS API 的 Key。</p>
<p>Key 准备好之后，剩下的工作就交给 AI 了。</p>
<h2 id="数据驱动">数据驱动</h2>
<p>旅行数据单独放在 <code>data/travel.yaml</code>，每条记录包含城市名、经纬度、访问时间、可选备注：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Karlsruhe</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">lng</span><span class="p">:</span><span class="w"> </span><span class="m">8.403653</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">lat</span><span class="p">:</span><span class="w"> </span><span class="m">49.006889</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">visited</span><span class="p">:</span><span class="w"> </span><span class="m">2016-04</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">note</span><span class="p">:</span><span class="w"> </span><span class="l">KIT 求学岁月</span><span class="w">
</span></span></span></code></pre></div><p>新增一个城市就在文件末尾追加一条，<code>hugo</code> 重新 build 后地图自动多一个绿点。</p>
<h2 id="hugo-shortcode">Hugo Shortcode</h2>
<p>为了让以后别的页面也能复用，写了一个 <code>amap</code> shortcode。它从 <code>data/travel.yaml</code> 读出城市列表，渲染成一个 map 容器加一份 JSON payload，后面的渲染逻辑交给一个独立 JS 文件。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;amap-container&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;amap-container&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;application/json&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;amap-travel-data&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">{{</span><span class="o">-</span> <span class="nx">$travel</span> <span class="o">|</span> <span class="nx">jsonify</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><h2 id="渲染">渲染</h2>
<p>地图本身的逻辑用一个 IIFE 包起来，关键几步：</p>
<ol>
<li>解析 JSON payload。<code>Hugo jsonify</code> 模板输出的 JSON 字符串放在 <code>&lt;script type=&quot;application/json&quot;&gt;</code> 里时，<code>.textContent</code> 会拿到外层带引号的字符串，需要 <code>JSON.parse</code> 两次</li>
<li>每个城市创建 <code>AMap.Marker</code>。<code>content</code> 字段直接传一段 HTML 字符串（24px 绿圆点 + 白边）</li>
<li>计算所有 markers 的边界，<code>map.setFitView</code> 自动框选到合适缩放</li>
<li>点击 marker 弹 <code>InfoWindow</code> 显示城市名、访问时间、备注</li>
</ol>
<p>为了避免每个 marker 都重复字符串拼接，加了一个 <code>visitCount</code> 字典，同一城市多次访问时显示一个红色小角标。</p>
<h2 id="结论">结论</h2>
<p>之前把 Key 写死在 <code>hugo.toml</code> 里，后来发现不太安全，改成读取 <code>HUGO_AMAP_KEY</code> 环境变量，同时在 Cloudflare Pages 里配成 Secret，本地开发用 <code>hugo.toml</code> 测试。</p>
<p>地图在「<a href="https://www.kohsruhe.com/zh/about/">关于</a>」页都能看到。点击绿色圆点会弹一个小窗显示城市名、访问时间、备注。</p>
<p>目前只是实现了功能，实际去过的地方还要再整理，有些地方确实年代久远，一时半会儿想不起来。</p>
]]></content:encoded></item></channel></rss>