You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Google Sheet数据为Leaflet地图添加标记、折线及相关扩展功能

Leaflet地图联动Google Sheet完整实现代码

下面是整合了你需要的所有功能的完整代码,直接替换你原有代码即可运行:

<!DOCTYPE html>
<html>
<head>
  <script src='//cdn.jsdelivr.net/npm/tabletop@1.5.2/src/tabletop.min.js'></script>
  <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" />
  <script src="//unpkg.com/leaflet@1.3.4/dist/leaflet.js"></script>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    /* 侧边路线面板样式 */
    #route-panel {
      position: absolute;
      left: 0;
      top: 0;
      width: 300px;
      height: 100%;
      background: #fff;
      padding: 15px;
      overflow-y: auto;
      z-index: 1000;
      box-shadow: 2px 0 10px rgba(0,0,0,0.1);
    }
    #route-panel h3 {
      margin-bottom: 15px;
      padding-bottom: 10px;
      border-bottom: 1px solid #eee;
    }
    .route-item {
      padding: 10px;
      margin-bottom: 8px;
      background: #f5f5f5;
      border-radius: 4px;
      cursor: pointer;
      transition: background 0.2s;
    }
    .route-item:hover {
      background: #e9e9e9;
    }
    /* 地图容器样式,预留左侧面板宽度 */
    #map-div {
      position: absolute;
      left: 300px;
      top: 0;
      height: 100%;
      width: calc(100% - 300px);
    }
  </style>
</head>
<body>
  <div id="route-panel">
    <h3>目的地列表</h3>
    <div id="route-list"></div>
  </div>
  <div id="map-div"></div>
  <script>
    var map = L.map('map-div').setView([60.1682653, 24.9422078], 5);
    var basemap = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
      attribution: 'Basemap (c) <a href="http://openstreetmap.org">OpenStreetMap</a>',
      minZoom: 2,
      maxZoom: 18
    });
    basemap.addTo(map);

    function addPoints(data, tabletop) {
      // 存储所有坐标点,用于绘制折线和适配视野
      var pointList = [];
      // 存储所有标记实例,用于列表点击联动
      var markerList = [];
      // 获取路线列表容器
      var routeListDom = document.getElementById('route-list');
      // 清空之前的列表内容
      routeListDom.innerHTML = '';

      for (var i = 0; i < data.length; i++) {
        var row = data[i];
        var latLng = [Number(row.Latitude), Number(row.Longitude)];
        // 添加标记
        var marker = L.marker(latLng).addTo(map);
        marker.bindPopup('<strong>' + row.Info + '</strong>');
        // 把坐标加入点集合
        pointList.push(latLng);
        // 把标记加入标记集合
        markerList.push(marker);

        // 往路线面板添加列表项
        var itemDom = document.createElement('div');
        itemDom.className = 'route-item';
        itemDom.innerText = (i+1) + '. ' + row.Info;
        // 列表项点击事件:定位到对应标记,打开弹窗
        itemDom.addEventListener('click', (function(idx) {
          return function() {
            map.panTo(pointList[idx]);
            markerList[idx].openPopup();
          }
        })(i));
        routeListDom.appendChild(itemDom);
      }

      // 绘制标记间的折线
      if (pointList.length >= 2) {
        L.polyline(pointList, {
          color: '#2196F3',
          weight: 3,
          opacity: 0.7
        }).addTo(map);
      }

      // 自动缩放适配所有标记
      if (pointList.length > 0) {
        var bounds = L.latLngBounds(pointList);
        map.fitBounds(bounds, {padding: [20, 20]});
      }
    }

    function init() {
      Tabletop.init({
        key: 'https://docs.google.com/spreadsheets/d/1Rs6xPlJ8pU4UFfmokjATaf4dArMWxQxZcyS-xRIIFuY/edit?usp=sharing',
        callback: addPoints,
        simpleSheet: true
      })
    }
    init()
  </script>
</body>
</html>

功能说明
  • 标记间折线绘制:按照Google Sheet里的行顺序依次连接所有坐标点,修改Sheet内的行排序即可调整路线顺序,折线的颜色、粗细、透明度可在L.polyline的配置参数里自定义。
  • 自动缩放适配:加载完所有数据后会自动计算所有标记的边界范围,调整地图视野让所有标记完整展示,fitBounds的padding参数可控制标记和地图边缘的留白距离。
  • 目的地概览列表:左侧固定展示所有目的地的列表,点击任意列表项会自动把地图定位到对应标记位置并打开信息弹窗,列表样式可通过修改CSS自定义调整。

所有功能都支持Google Sheet作为外部数据源动态更新,修改Sheet内容后刷新页面即可同步更新地图数据。

内容的提问来源于stack exchange,提问作者Enounce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 22:06:08