自定义openlayers的controls
第一步:
首先创建了一个新的[类继承]了原本的Control
第二步:
给super方法的element指定一个htmlElement对象
第三步:
给element对象绑定事件
关于target的参数的传递,如果不传或者是像例子中传递target:opt_options.target
,则自定义的控件被插入到如图位置
image.png
target也可以传递一个自己的指定位置,例如target:upRef.value,
,
<div ref="outBtnRef" class="north-btn">
核心代码是:
<div ref="outBtnRef" class="north-btn">
<button @click="handleRotateNorth">指北</button>
</div>
let northRef = ref()
class RotateNorthControl extends Control {
constructor(opt_options: any) {
super({
element: outBtnRef.value
})
}
}
function handleRotateNorth() {
openlayerMap.getView().setRotation(0)
}
以下是完整代码:
<!-- eslint-disable vue/multi-word-component-names -->
// eslint-disable-next-line vue/multi-word-component-names
<template>
<div>
<div ref="upRef" style="background-color: pink;width:100%;height: 20px;"></div>
<div ref="outBtnRef" class="north-btn">
<button @click="handleRotateNorth">指北</button>
</div>
<div ref="mapRef" style="width: 512px; height: 512px" tabindex="0" class="map-container"></div>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import 'ol/ol.css'
import Map from 'ol/Map.js'
import TileLayer from 'ol/layer/Tile.js'
import View from 'ol/View.js'
import { Control, defaults as defaultControls } from 'ol/control.js'
import StadiaMaps from 'ol/source/StadiaMaps'
let outBtnRef = ref()
let openlayerMap: Map
let mapRef = ref()
let upRef=ref()
const view3857 = new View({
projection: 'EPSG:3857',
center: [0, 0],
zoom: 3,
rotation: 1
})
function getStamenWatercolorSource() {
return new StadiaMaps({
layer: 'stamen_watercolor'
// apiKey: 'OPTIONAL'
})
}
function getStamenWatercolorLayer() {
const source = getStamenWatercolorSource()
return new TileLayer({
source
})
}
class RotateNorthControl extends Control {
/**
* @param {Object} [opt_options] Control options.
*/
constructor(opt_options: any) {
super({
element: outBtnRef.value,
//target:opt_options.target
target:upRef.value,
})
}
}
function handleRotateNorth() {
openlayerMap.getView().setRotation(0)
}
onMounted(() => {
const layers = getStamenWatercolorLayer()
openlayerMap = new Map({
controls: defaultControls({ rotate: false }).extend([new RotateNorthControl({})]),
layers: [layers],
target: mapRef.value,
view: view3857
})
})
</script>
<style scoped>
.map-container:focus {
outline: #4a74a8 solid 0.15em;
}
.north-btn{
position: relative;
float: right;
}
</style>