<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>码农明明桑</title><image><url>https://isming.me/tags/%E5%8D%9A%E5%AE%A2/avatar.png</url><title>码农明明桑</title><link>https://isming.me/tags/%E5%8D%9A%E5%AE%A2/</link></image><link>https://isming.me/tags/%E5%8D%9A%E5%AE%A2/?utm_source=rss</link><description>码农明明桑，一个程序员的生活和技术内容记录。</description><generator>Hugo -- gohugo.io</generator><language>zh</language><copyright>&lt;a href="https://isming.me">码农明明桑的博客&lt;/a>所有内容遵循&lt;a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans">「CC BY-NC-SA 4.0」&lt;/a>协议，转载请保留署名并注明来源。</copyright><lastBuildDate>Sun, 09 Feb 2025 11:40:56 +0800</lastBuildDate><atom:link href="https://isming.me/tags/%E5%8D%9A%E5%AE%A2/index.xml" rel="self" type="application/rss+xml"/><item><title>使用Leafletjs实现足迹地图功能</title><link>https://isming.me/2025-02-09-leaflet-map-use/?utm_source=rss</link><pubDate>Sun, 09 Feb 2025 11:40:56 +0800</pubDate><guid>https://isming.me/2025-02-09-leaflet-map-use/</guid><description>
&lt;p>我的博客上面挂着一个使用Leaflet实现的足迹地图功能，最近又给他添加了一些功能并且进行了一些美化。之前也有人问题这个怎么实现的，趁着刚折腾完来分享一下。
&lt;img loading='lazy' decoding="async" src="https://img.isming.me/image/myfootmap.jpg" alt="" />
&lt;/p>
&lt;h3 id="代码库的选择">代码库的选择&lt;/h3>
&lt;p>早前一直想要做一个足迹的功能，像是国内的百度地图和阿里地图都有js的sdk，但是他们的sdk使用不简单，并且他们的地图只有国内的。后来了解过google map以及mapbox，但是都没有深入研究。后来看到博主水八口记使用了&lt;a href="https://leafletjs.com/examples/quick-start/">leaflet&lt;/a>还比较简单，就使用这个库来实现了我的足迹功能。&lt;/p>
&lt;h3 id="地图图层">地图图层&lt;/h3>
&lt;p>使用leaflet的一大好处是，你可以自由使用你想要的地图图层，对于符合Leaflet的地图瓦片地址我们是可以直接使用的，通常是类似这种格式的地址： &lt;code>https://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png&lt;/code>，其中的&lt;code>{z}/{x}/{y}&lt;/code>是必须要支持的，leaflet会在运行的时候替换具体的值，从而请求对应的放大级别（z,zoom）, 对应坐标(x, y)的瓦片进行渲染。&lt;/p>
&lt;p>一般使用cartocdn提供的openstreetmap的地图时，是可以直接使用的，但是我们如果想要使用mapbox地图或者其他地图供应商的时候，就需要借助插件了，可以在这个页面看看有没有&lt;a href="https://leafletjs.com/plugins.html#basemap-providers">Plugins - Leaflet - a JavaScript library for interactive maps&lt;/a>。&lt;/p>
&lt;p>对于地图图层，leaflet是支持同时加载多个图层的，比如说我可以添加一层底图再添加一层天气卫星图。&lt;/p>
&lt;p>我们这里先看一下如何创建一个地图并且设置我们的地图图层.
首先需要引入leaflet的css和js文件&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">link&lt;/span> &lt;span class="na">rel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;stylesheet&amp;#34;&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;#34;&lt;/span> &lt;span class="na">integrity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=&amp;#34;&lt;/span> &lt;span class="na">crossorigin&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- js引入一定要放到css的后面 --&amp;gt;&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;#34;&lt;/span> &lt;span class="na">integrity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=&amp;#34;&lt;/span> &lt;span class="na">crossorigin&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>之后，在我们需要显示地图的位置放一个div元素，并且设置一个id，这样我们在后面的js代码中才能控制它：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;footprintmap&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>同时我们可以通过css设置这个容器的宽度高度：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="p">#&lt;/span>&lt;span class="nn">footprintmap&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">180&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>这些做完之后就可以在javascript中去创建地图对象，并且给它添加地图图层了：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="nx">script&lt;/span> &lt;span class="nx">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text/javascript&amp;#34;&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//地图的版权声明，使用三方地图数据出于对版权的尊重最好加一下
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>      &lt;span class="kd">var&lt;/span> &lt;span class="nx">cartodbAttribution&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;&amp;amp;copy; &amp;lt;a href=&amp;#34;https://www.openstreetmap.org/copyright&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;OpenStreetMap&amp;lt;/a&amp;gt; contributors, &amp;amp;copy; &amp;lt;a href=&amp;#34;https://carto.com/attribution&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;CARTO&amp;lt;/a&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">      &lt;span class="kd">var&lt;/span> &lt;span class="nx">map&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;map&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nx">gestureHandling&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">minZoom&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">maxZoom&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">}).&lt;/span>&lt;span class="nx">setView&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mf">33.3007613&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">117.2345622&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//创建地图，设置最大最小放大级别，setView设置地图初始化时候的中心点坐标和放大级别
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>      &lt;span class="nx">map&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">zoomControl&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">setPosition&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;topright&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//设置放大控制按钮的位置
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>      &lt;span class="nx">map&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createPane&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;labels&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">      &lt;span class="nx">map&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getPane&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;labels&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">zIndex&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">650&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">      &lt;span class="nx">map&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getPane&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;labels&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">pointerEvents&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;none&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">      &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">tileLayer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">attribution&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">cartodbAttribution&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}).&lt;/span>&lt;span class="nx">addTo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//添加地图图层到map对象当中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="err">/script&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="添加足迹点到地图中">添加足迹点到地图中&lt;/h3>
&lt;p>经过以上的步骤我们就可以在网页上展示一个地图了，而我们实现足迹功能一般会给我们去过的地点打上标记。一种方法是给去过的城市做一个蒙层，一种方式是加一些点标记。这里先看加点标记的方法。&lt;/p>
&lt;p>标记在Leaflet中称为Marker, 我们可以使用以下代码添加默认的Market：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">marker&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">marker&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mf">33.3007613&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">117.2345622&lt;/span>&lt;span class="p">]).&lt;/span>&lt;span class="nx">bindPopup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;popup text&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">addTo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>效果如下:
&lt;img loading='lazy' decoding="async" src="https://img.isming.me/image/leaflet-default-marker.jpg" alt="" />
&lt;/p>
&lt;p>在上面我们通过bindPopup来设置点击Marker之后弹出的内容，其中我们是可以设置HTML元素的，因此我们就可以显示图片或者超链接之类的内容了。&lt;/p>
&lt;p>如果不喜欢这个默认的蓝色Marker，也可以替换为图片。比如我用如下的代码就设置类一个svg图片作为Market标记图：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">colorMarker&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="kr">const&lt;/span> &lt;span class="nx">svgTemplate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">    &amp;lt;svg xmlns=&amp;#34;http://www.w3.org/2000/svg&amp;#34; viewBox=&amp;#34;0 0 32 32&amp;#34; class=&amp;#34;marker&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">      &amp;lt;path fill-opacity=&amp;#34;.25&amp;#34; d=&amp;#34;M16 32s1.427-9.585 3.761-12.025c4.595-4.805 8.685-.99 8.685-.99s4.044 3.964-.526 8.743C25.514 30.245 16 32 16 32z&amp;#34;/&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">      &amp;lt;path stroke=&amp;#34;#fff&amp;#34; fill=&amp;#34;#ff471a&amp;#34; d=&amp;#34;M15.938 32S6 17.938 6 11.938C6 .125 15.938 0 15.938 0S26 .125 26 11.875C26 18.062 15.938 32 15.938 32zM16 6a4 4 0 100 8 4 4 0 000-8z&amp;#34;/&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">    &amp;lt;/svg&amp;gt;`&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="kr">const&lt;/span> &lt;span class="nx">icon&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">divIcon&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">className&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;marker&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">html&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">svgTemplate&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">iconSize&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">28&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">28&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">iconAnchor&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">24&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">popupAnchor&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="k">return&lt;/span> &lt;span class="nx">icon&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">marker&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">marker&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="nx">lat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">lng&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">icon&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">colorMarker&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="p">}).&lt;/span>&lt;span class="nx">bindPopup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">popupText&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">addTo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>主要是在前面创建marker的时候传的这个icon,你也可以传普通的图片。&lt;/p>
&lt;p>如果我们需要展示多个点的时候，我们可以把这些点的数据存储成一个json，并且把他作为一个JavaScript对象加载，再读取他把每个点添加到地图中。
我就创建了一个&lt;code>points.js&lt;/code>的文件保存所有的点：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">let&lt;/span> &lt;span class="nx">points&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;b&amp;gt;北京&amp;lt;/b&amp;gt;&amp;lt;i&amp;gt;Beijing&amp;lt;/i&amp;gt;&amp;lt;a href=&amp;#39;/2025-01-beijing/&amp;#39;&amp;gt;&amp;lt;img src=&amp;#39;https://img.isming.me/photo/IMG_20250101_133455.jpg&amp;#39; /&amp;gt;北京游流水账&amp;lt;/a&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">40.190632&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">116.412144&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;b&amp;gt;广州&amp;lt;/b&amp;gt;&amp;lt;i&amp;gt;Guangzhou&amp;lt;/i&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">23.1220615&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">113.3714803&lt;/span>&lt;span class="p">],];&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>内容大概如上：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!--&lt;/span>&lt;span class="nx">加载点数据&lt;/span>&lt;span class="err">，&lt;/span>&lt;span class="nx">这样我们在javascript环境中就可以拿到points这个数组&lt;/span>&lt;span class="o">--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="nx">script&lt;/span> &lt;span class="nx">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text/javascript&amp;#34;&lt;/span> &lt;span class="nx">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/points.js&amp;#34;&lt;/span>&lt;span class="o">&amp;gt;&amp;lt;&lt;/span>&lt;span class="err">/script&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>以上加载了点数据，通过下面的代码来读取并且添加点：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kd">let&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="nx">points&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//循环遍历所有点，并且保存到如下三个变量中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>  &lt;span class="kr">const&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nx">popupText&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">lat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">lng&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">points&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="nx">marker&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">marker&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="nx">lat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">lng&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="nx">icon&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">colorMarker&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="p">}).&lt;/span>&lt;span class="nx">bindPopup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">popupText&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">addTo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>到此为止就完成了足迹点功能的开发。&lt;/p>
&lt;h3 id="去过的区域图层开发">去过的区域图层开发&lt;/h3>
&lt;p>而我们要实现去过的城市标记，这个时候就不是一个一个的点了，我们可能给去过的城市添加遮罩，这个其实就是给地图上画一个新的图层。每一个城市本质上就是许多个点围成的多边形，我们可以使用Leaflet提供的&lt;code>polygon&lt;/code>方法来绘制，但是我们需要给把每个城市的多边形的各个顶点找到并且组织成一个数组，工作量真的是巨大的。&lt;/p>
&lt;p>这样的难题我们不是第一个遇到的，前人已经遇到并且帮我们解决了。在2015年就有了GeoJson这种用Json描述的地理空间数据交换格式，他支持描述点，线，多边形。而Leaflet对齐也有支持。因此，我们只需要找到我们所需要的城市的geojson数据的MultiPolygon或者Polygon数据，就可以在Leaflet中进行绘制了。&lt;/p>
&lt;p>对于中国的数据，我们可以在阿里云的&lt;a href="https://datav.aliyun.com/portal/school/atlas/area_selector">datev平台&lt;/a>进行下载，你可以省份数据或者按照城市甚至更小的行政单位下载数据。对于国外的数据可以到github上面去查找，这里是一份国家数据: &lt;a href="https://github.com/datasets/geo-countries">datasets/geo-countries: Country polygons as GeoJSON in a datapackage&lt;/a>&lt;/p>
&lt;p>对于我们下载的中国的geojson数据，因为比较详细，也就比较大，我们可以使用&lt;a href="https://mapshaper.org/">mapshaper&lt;/a>这个工具来对数据进行一些处理，直接使用Simplify功能，使用它减少点的数量，从而减少我们的文件的大小。&lt;/p>
&lt;p>按照geojson文件格式，我们对于多个城市需要组成一个类似如下的json：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;FeatureCollection&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="err">features:&lt;/span> &lt;span class="err">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">{&lt;/span>&lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Feature&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;geometry&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Polygon&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[[[&lt;/span>&lt;span class="mf">88.40590939643968&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.55522906690669&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.36498482718275&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.494854169816982&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.28898205570562&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.51497913551355&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.2714429545955&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.55235407180718&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.32990662496253&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.55235407180718&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.36498482718275&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.60410398359836&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.35913846014606&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.62997893949395&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.38837029532957&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.62710394439444&lt;/span>&lt;span class="p">],[&lt;/span>&lt;span class="mf">88.40590939643968&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">22.55522906690669&lt;/span>&lt;span class="p">]]]}}&lt;/span>&lt;span class="err">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>对于这样的一个json对象，我们就可以直接使用Leaflet的geojson文件进行加载，代码如下：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">onEachFeature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">feature&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">layer&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="c1">// does this feature have a property named popupContent?
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">feature&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">properties&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nx">feature&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">properties&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">popupContent&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">layer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bindPopup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">feature&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">properties&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">popupContent&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//从json文件中读取属性进行popup展示
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">geojson&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">L&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">geoJSON&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">areas&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">onEachFeature&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">onEachFeature&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="nx">style&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">geoJsonFeature&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">    &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">      &lt;span class="nx">color&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;#ffcc80&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">//设置遮罩的颜色
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>      &lt;span class="nx">fillOpacity&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mf">0.4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">//设置透明度
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>      &lt;span class="nx">stroke&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">//是否要显示边缘线
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>    &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}).&lt;/span>&lt;span class="nx">addTo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>对于geojson我们也可以在properties中设置弹框的内容进行展示。&lt;/p>
&lt;h3 id="总结">总结&lt;/h3>
&lt;p>到这里我们就完成了基于leaflet的一个足迹地图，既包括足迹点，也包括去过的城市的遮罩。而geojson和Leaflet的功能远远不止这些，感兴趣的可以去看相关文档。另外因为我使用的地图是openstreetmap的数据，关于中国领土有争议的部分标记不正确，这个不在我的解决能力范围之内，只能暂且使用，但是不代表本人观点。&lt;/p>
&lt;p>参考资料：&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://leafletjs.com/examples.html">Tutorials - Leaflet - a JavaScript library for interactive maps&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tomickigrzegorz.github.io/leaflet-examples/">https://tomickigrzegorz.github.io/leaflet-examples/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://zh.wikipedia.org/zh-cn/GeoJSON">GeoJSON - 维基百科，自由的百科全书&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://datav.aliyun.com/portal/school/atlas/area_selector">DataV.GeoAtlas地理小工具系列&lt;/a>&lt;/li>
&lt;/ol>&lt;p>&lt;h4>&lt;a href="https://isming.me/2025-02-09-leaflet-map-use/?utm_source=rss#commentsanchor">看完评论一下吧&lt;a>&lt;/h4>&lt;/p></description><comments>https://isming.me/2025-02-09-leaflet-map-use/?utm_source=rss#commentsanchor</comments><category domain="https://isming.me/tags/%E6%8A%98%E8%85%BE/?utm_source=rss">折腾</category><category domain="https://isming.me/tags/%E5%8D%9A%E5%AE%A2/?utm_source=rss">博客</category><category domain="https://isming.me/tags/%E6%8A%80%E6%9C%AF/?utm_source=rss">技术</category></item><follow_challenge><feedId>55157116408461322</feedId><userId>61227089652190208</userId></follow_challenge></channel></rss>