vue3+ts+leaflet使用L.polyline和L.geoJSON分别绘制折线图层,可用于航线,交通路线等方面

学习leaflet总结相关内容,若有不足,请谅解。

在实际工作中使用webGis技术leaflet绘制折线图层很常用,现在分享用L.polyline和L.geoJSON分别绘制折线图层的方法。

一、leaflet官网关于L.polyline方法使用介绍

参考链接:Documentation - Leaflet - 一个交互式地图 JavaScript 库icon-default.png?t=N7T8https://leafletjs.cn/reference.html#polyline

二、使用L.polyline绘制折线图层

具体代码如下,加载的地图是天地图,在使用L.polyline绘制折线图层,需要先将原有json格式数据转换成经纬度数组,数组中展示的数据类型是[维度,经度],转换的时候注意,L.polyline适合数据已经是经纬度数组类型的数据,如果给定的数据是样例中的geojson类型数据,建议使用L.geoJSON来绘制图层。


<template>
  <div ref="mapContainer" class="map-container"></div>
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref, onUnmounted } from 'vue';
import L, { LatLngExpression, Polyline } from 'leaflet'; // 导入Leaflet库,用于地图功能
import 'leaflet/dist/leaflet.css'; // Leaflet样式

// 定义DOM引用
const mapContainer = ref(null); // 地图容器DOM引用
const map = ref(null); // 地图实例引用
const center = ref([30.48, 114.27]); // 地图初始中心点坐标

/**** 图层 start *****/

let polylineLayer = null; // 折线图层

/**** 图层 end *****/

// 初始化地图
const TianDiTuKey = '你的key';
// 天地图访问地址
const TianDiTu = reactive({
  Normal: {
    Map:
      'https://t{s}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=' +
      TianDiTuKey,
    Annotion:
      'https://t{s}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=' +
      TianDiTuKey,
  },
});
// 折线数据
const polylineArray = ref({
  type: 'FeatureCollection',
  features: [
    {
      type: 'Feature',
      properties: {  },
      geometry: {
        type: 'LineString',
        coordinates: [
          [106, 29],
          [104, 26],
        ],
      },
    },
    {
      type: 'Feature',
      properties: { },
      geometry: {
        type: 'LineString',
        coordinates: [
          [114.20, 30],
          [111.6399, 29],
          [109.496, 28],
          [106.028, 27],
          [103.2901, 25.4499],
        ],
      },
    },
    {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [116, 40],
          [116, 40],
          [116, 40],
          [116, 41],
          [111, 43],
        ],
      },
    },
    {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [116, 39],
          [115, 37],
          [114, 36],
          [114, 33],
          [114, 31],
          [114, 30],
          [114, 30],
          [113, 29],
          [113, 27],
          [113, 24],
          [113, 23],
          [113, 23],
          [113, 23],
        ],
      },
    },
  ],
});
const initMap = () => {
  // 设置天地图图层加载参数
  const options = {
    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
  };
  // 通过 QXStore 获取天地图矢量图层和注记图层
  const mapVec = L.tileLayer(TianDiTu.Normal.Map, options);
  const mapCva = L.tileLayer(TianDiTu.Normal.Annotion, options);
  // 将两个图层组合成一个Layer Group
  const layers = L.layerGroup([mapVec, mapCva]);
  // 实例化地图对象,设置中心点、缩放级别、最小最大缩放限制等配置
  map.value = L.map(mapContainer.value, {
    center: center.value, // 中心点坐标
    zoom: 5, // 初始缩放级别
    minZoom: 3, // 最小缩放级别
    maxZoom: 22, // 最大缩放级别
    noWrap: true, // 禁止地图水平滚动
    layers: [layers], // 加载图层组
    zoomControl: true, // 显示缩放控制
    attributionControl: false, // 隐藏版权信息
  });
};

/*** 初始化折线图层 start */
const initLine = () => {
  let pdata = [];
  if (!polylineLayer) {
    // 数据处理
    polylineArray.value.features.forEach((feature: any) => {
      const polylineData = feature.geometry.coordinates;
      // 转换坐标格式
      const latLngs: LatLngExpression[] = polylineData.map(([lng, lat]) => [lat, lng]);
      pdata.push(latLngs);
    });
    // 折线参数,可根据实际情况设置
    const options = reactive({
      color: 'blue', //  线的颜色
      weight: 3, // 线的宽度
      opacity: 0.6, // 线的透明度
    });
    // 添加到地图
    polylineLayer = L.polyline(pdata, {
      color: options.color, //  线的颜色
      weight: options.weight, // 线的宽度
      opacity: options.opacity, // 线的透明度
      lineCap: options.lineCap, // 线端点的样式 'butt' | 'round' | 'square';
      lineJoin: options.lineJoin, // 线连接处的样式
      dashArray: options.dashArray, // 虚线模式
      dashOffset: options.dashOffset, // 虚线偏移量
      fill: options.fill, // 填充颜色
      fillColor: options.fillColor, // 填充颜色
      fillOpacity: options.fillOpacity, // 填充透明度
      fillRule: options.fillRule, //  填充规则
      bubblingMouseEvents: options.bubblingMouseEvents, //  是否冒泡鼠标事件
      smoothFactor: options.smoothFactor, // 平滑因子
    }).addTo(map.value);
  }
};

// 组件挂载完成后初始化地图
onMounted(async () => {
  // 初始化地图
  initMap();
  // 初始化折线图层
  initLine();
});
// 组件卸载前清理地图和图表资源,防止内存泄漏
onUnmounted(() => {
  map.value?.remove();
});
</script>
<style lang="scss" scoped>
.map-container {
  position: relative;
  width: 100%;
  height: 95vh;
  z-index: 1;
}
::v-deep {
  .leaflet-bottom {
    margin-bottom: 100px;
    bottom: 1ch;
  }
  .leaflet-right {
    margin-right: 100px;
    right: 1ch;
  }
}
</style>

二、使用L.geoJSON绘制折线图层

代码如下:


// 折线数据
const polylineArray = ref({
  type: 'FeatureCollection',
  features: [
    {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [106, 29],
          [104, 26],
        ],
      },
    },
    {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [114.2, 30],
          [111.6399, 29],
          [109.496, 28],
          [106.028, 27],
          [103.2901, 25.4499],
        ],
      },
    },
    {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [116, 40],
          [116, 40],
          [116, 40],
          [116, 41],
          [111, 43],
        ],
      },
    },
    {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [116, 39],
          [115, 37],
          [114, 36],
          [114, 33],
          [114, 31],
          [114, 30],
          [114, 30],
          [113, 29],
          [113, 27],
          [113, 24],
          [113, 23],
          [113, 23],
          [113, 23],
        ],
      },
    },
  ],
});
const initMap = () => {
  // 设置天地图图层加载参数
  const options = {
    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
  };
  // 通过 QXStore 获取天地图矢量图层和注记图层
  const mapVec = L.tileLayer(TianDiTu.Normal.Map, options);

  const mapCva = L.tileLayer(TianDiTu.Normal.Annotion, options);
  // 将两个图层组合成一个Layer Group
  const layers = L.layerGroup([mapVec, mapCva]);
  // 实例化地图对象,设置中心点、缩放级别、最小最大缩放限制等配置
  map.value = L.map(mapContainer.value, {
    center: center.value, // 中心点坐标
    zoom: 5, // 初始缩放级别
    minZoom: 3, // 最小缩放级别
    maxZoom: 22, // 最大缩放级别
    noWrap: true, // 禁止地图水平滚动
    layers: [layers], // 加载图层组
    zoomControl: true, // 显示缩放控制
    attributionControl: false, // 隐藏版权信息
  });
};

/*** 初始化折线图层 start */
const initLine = () => {
    // 折线参数,可根据实际情况设置
    const options = reactive({
      color: 'blue', //  线的颜色
      weight: 3, // 线的宽度
      opacity: 0.6, // 线的透明度
    });
    // 添加到地图
    polylineLayer = L.geoJSON(polylineArray.value, {
      color: options.color, //  线的颜色
      weight: options.weight, // 线的宽度
      opacity: options.opacity, // 线的透明度
      lineCap: options.lineCap, // 线端点的样式 'butt' | 'round' | 'square';
      lineJoin: options.lineJoin, // 线连接处的样式
      dashArray: options.dashArray, // 虚线模式
      dashOffset: options.dashOffset, // 虚线偏移量
      fill: options.fill, // 填充颜色
      fillColor: options.fillColor, // 填充颜色
      fillOpacity: options.fillOpacity, // 填充透明度
      fillRule: options.fillRule, //  填充规则
      bubblingMouseEvents: options.bubblingMouseEvents, //  是否冒泡鼠标事件
      smoothFactor: options.smoothFactor, // 平滑因子
    }).addTo(map.value);
  }
};

四、总结

leafelt绘制折线图层时,根据实际情况选择对应的方法,折线参数也是根据实际选择。

五、效果展示

https://i-blog.csdnimg.cn/direct/f1f0c168c8e940208425077f32328bdf.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值