本文将介绍openlayers中地图图层控制的组件制作方法,图层切换,显示隐藏,图层排序,在vue3中使用element,tree等组件。
(本专辑持续更新中)
function getTDXYZUrl(type: string) {
return (
"http://t" +
Math.round(Math.random() * 7) +
".tianditu.com/DataServer?T=" +
type +
"&x={x}&y={y}&l={z}&tk=" +
myTDkey
);
}
const layersData = [
{
id: "1",
label: "天地图",
url: "",
opacity: 100,
visible:true,
children: [
{
id: "4",
label: "矢量注记",
url: getTDXYZUrl("cva_w"),
opacity: 100,
visible:true,
children: [],
},
{
id: "3",
label: "矢量底图",
url: getTDXYZUrl("vec_w"),
opacity: 80,
visible:true,
children: [],
},
],
},
{
id: "2",
label: "影像底图",
url: getTDXYZUrl("img_w"),
opacity: 100,
visible:true,
children: [],
},
];
function makeTree(layersData: Array<IlayersData>) {
let rootLayers: (LayerGroup | TileLayer<XYZ>)[] = [];
layersData.forEach((e) => {
if (e.children.length > 0) {
let group = new LayerGroup({
properties: {
label: e.label,
},
opacity: e.opacity!/100,
layers: makeTree(e.children),
visible:e.visible,
});
rootLayers.unshift(group);
} else {
let layer = new TileLayer({
source: new XYZ({
url: e.url,
projection: e.projection ?? "EPSG:3857",
}),
opacity: e.opacity!/100,
properties: {
label: e.label,
},
});
rootLayers.unshift(layer)
}
});
return rootLayers
}
let layers = makeTree(layersData)
function initMap(optons: { target: HTMLElement }) {
return new Map({
layers: layers,
target: optons.target as HTMLElement,
view: new View({
center: [0, 0],
zoom: 2,
}),
});
}
export {
initMap,layersData
}
<div class="whr-vertical-control " ref="my-vertical-control">
<el-popover placement="left" :width="300" trigger="hover">
<template #reference>
<el-button type="primary" icon="CopyDocument"/>
template>
<template #default>
<div>
<div class="whr-popover-title">
<div class="yigeshu">div>
<div class="" style="margin-left: 5px;">图层控制div>
div>
<el-divider/>
<div class="whr-popover-body">
<el-tree node-key="label" :data="layerTreeData" :props="defaultProps" @check-change="layerVisibleControl"
:default-checked-keys="defaultCheckedLayers"
show-checkbox>
<template #default="{ node, data }">
<span class="custom-tree-node">
<span>{{ node.label }}span>
<span style="width: 100px;" v-if="data.children.length == 0">
<el-slider v-model="data.opacity" size="small" @change="layerOpacityChange($event,data)" />
span>
span>
template>
el-tree>
div>
div>
template>
el-popover>
div>
class MyVerticalControl extends Control {
constructor(opt_options: any) {
const options = opt_options || {};
super({
element: self.$refs["my-vertical-control"] as HTMLElement,
target: options.target,
});
}
}
this.vercontrol = new MyVerticalControl({})
this.map = initMap({target: this.$refs.map as HTMLElement})
(this.map as Map).addControl(this.vercontrol as Control)
如果需要地图组件保活,可以把添加控件写在activated钩子里。
activated() {
(this.map as Map).addControl(this.vercontrol as Control);
},
layerVisibleControl(data: Tree,
checked: boolean,
indeterminate: boolean) {
console.log(data, checked, indeterminate)
let currentLayer = this.map!.getAllLayers().filter(e => {
return e.getProperties().label == data.label
})
if (currentLayer.length > 0) {
currentLayer[0].setVisible(checked)
}
},
layerOpacityChange($event,data){
console.log($event,data)
let currentLayer = this.map!.getAllLayers().filter(e => {
return e.getProperties().label == data.label
})
if (currentLayer.length > 0) {
currentLayer[0].setOpacity($event/100)
}
}