学习leaflet总结相关内容,若有不足,请谅解。
在实际工作中使用webGis技术leaflet绘制折线图层很常用,现在分享用L.polyline和L.geoJSON分别绘制折线图层的方法。
一、leaflet官网关于L.polyline方法使用介绍
参考链接:Documentation - Leaflet - 一个交互式地图 JavaScript 库https://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绘制折线图层时,根据实际情况选择对应的方法,折线参数也是根据实际选择。
五、效果展示