leaflet+天地图+更换地图主题

先弄清楚leaflet和天地图充当的角色

  • leaflet是用来在绘制、交互地图的
  • 天地图是纯粹用来当个底图的,相当于在leaflet中底部的一个图层而已
  • 进行Marker打点、geojson绘制等操作都是使用leaflet实现

1. 使用天地图当底图

  • 在token处填自己的token
  • 我这里用的是天地图的影像底图,如果需要可自行更换或添加底图
  • 天地图底图网址:lbs.tianditu.gov.cn/server/MapS...
  • 只用替换我代码里的天地图链接里的http://{s}.tianditu.com/img_c/里的img_c为我图中圈起来的编号,其他不用动
js 复制代码
const token = "填自己的天地图token";
// 底图
const VEC_C ="http://{s}.tianditu.com/img_c/wmts?layer=vec&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=";
// 文字标注
// const CVA_C = "http://{s}.tianditu.com/cia_c/wmts?layer=cva&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=";
let map = L.map("map", {
  minZoom: 3,
  maxZoom: 17,
  center: [34.33213, 109.00945],
  zoomSnap: 0.1,
  zoom: 3.5,
  zoomControl: false,
  attributionControl: false,
  crs: L.CRS.EPSG4326,
});
L.tileLayer(VEC_C + token, {
  zoomOffset: 1,
  subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
  opacity: 0.2,
}).addTo(map);
// 添加文字标注
// L.tileLayer(CVA_C + token, {
//   tileSize: 256,
//   zoomOffset: 1,
//   subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
// }).addTo(map);

2. 绘制中国地图geojson

  • 这里我需要国的边界和省的边界线颜色不一样,所以用了一个国的geojson和另一个包含省的geojson叠加来实现
  • 获取geojson数据网站:datav.aliyun.com/portal/scho...
js 复制代码
L.geoJson(sheng, {
 style: {
    color: "#0c9fb8",
    weight: 1,
    fillColor: "#028297",
    fillOpacity: 0.1,
  },
}).addTo(map);
L.geoJson(guo, {
  style: {
    color: "#b8c3c8",
    weight: 2,
    fillOpacity: 0,
  },
}).addTo(map);

3. 更换背景主题色

我的实现思路比较简单粗暴,直接给天地图的图层设置透明度,对div元素设置背景色,如果UI配合,可以叫UI给个遮罩层的背景图,比如我这里就是用了四周有黑边渐变阴影,中间是透明的背景图。

html 复制代码
<div id="map"></div>
<div class="mask"></div>

#map {
  height: 100vh;
  width: 100vw;
  background: #082941;
  z-index: 2;
}

.mask {
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  background: url("./mask.png") no-repeat;
  background-size: 100% 100%;
  z-index: 1;
}

4. 完整代码

  • 写自己天地图的token
  • 自己下载geojson文件
  • 自己看需要搞个遮罩层背景图,不需要就注释掉mask
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link
      href="https://cdn.bootcdn.net/ajax/libs/leaflet/1.9.4/leaflet.css"
      rel="stylesheet"
    />
  </head>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    #map {
      height: 100vh;
      width: 100vw;
      background: #082941;
      z-index: 2;
    }

    .mask {
      width: 100%;
      height: 100%;
      position: absolute;
      left: 0;
      top: 0;
      background: url("./mask.png") no-repeat;
      background-size: 100% 100%;
      z-index: 1;
    }
  </style>
  <body>
    <div id="map"></div>
    <div class="mask"></div>
  </body>
  <script src="https://cdn.bootcdn.net/ajax/libs/leaflet/1.9.4/leaflet.js"></script>
  <script src="./china.js"></script>
  <script src="./guo.js"></script>

  <script>
    const token = "写自己天地图的token";
    // 底图
    const VEC_C =
      "http://{s}.tianditu.com/img_c/wmts?layer=vec&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=";
    //   文字标注
    // const CVA_C =
    //   "http://{s}.tianditu.com/cia_c/wmts?layer=cva&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=";

    let map = L.map("map", {
      minZoom: 3,
      maxZoom: 17,
      center: [34.33213, 109.00945],
      zoomSnap: 0.1,
      zoom: 3.5,
      zoomControl: false,
      attributionControl: false, //版权控制器
      crs: L.CRS.EPSG4326,
    });
    L.tileLayer(VEC_C + token, {
      zoomOffset: 1,
      subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
      opacity: 0.2,
    }).addTo(map);
    // L.tileLayer(CVA_C + token, {
    //   tileSize: 256,
    //   zoomOffset: 1,
    //   subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
    // }).addTo(map);

    L.geoJson(sheng, {
      style: {
        color: "#0c9fb8",
        weight: 1,
        fillColor: "#028297",
        fillOpacity: 0.1,
      },
    }).addTo(map);
    L.geoJson(guo, {
      style: {
        color: "#b8c3c8",
        weight: 2,
        fillOpacity: 0,
      },
    }).addTo(map);
  </script>
</html>
相关推荐
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60616 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅7 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax