UNPKG

@web-map-service/map2d-app

Version:

基于openlayer的2D地图应用

76 lines (69 loc) 2.05 kB
import { DrawType, type DrawEmit, createDrawInteractive } from '@web-map-service/map2d' import { App, Plugin } from '../types' function makeTool(app: App) { const { interactiveManager, emitter: sEmitter } = app.map const sDraw = createDrawInteractive(interactiveManager) // 默认使用的元素图层第一位的图层 const layer = app.element.getLayers()?.[0] let useLayerType = layer.type let sElementType: DrawType function createElement(drawData: DrawEmit) { const element = app.element.create({ type: useLayerType, data: drawData.data, sElementType }) app.emitter.emit('draw', element) } const tool = { enabled: false, enable() { if (tool.enabled) return tool.enabled = true sEmitter.on('draw', createElement) tool.use(useLayerType) sDraw.enable() }, use(type: string, drawType?: DrawType) { useLayerType = type const layer = app.element!.getLayerByType(useLayerType) if (!layer) return // 如果图层支持多种元素类型,传入sElementType决定绘制哪一种,默认取第一个 sElementType = drawType ?? layer.sElementType[0] as DrawType if (!sElementType || !layer.sElementType.includes(sElementType)) { // 如果没有sElementType或者图层不支持该sElementType直接跳过 return } sDraw.use(sElementType as DrawType) }, close() { if (!tool.enabled) return tool.enabled = false sEmitter.remove('draw', createElement) sDraw.close() } } return tool } export function createPlugin() { let app: App const plugin: Plugin = { type: 'draw', install(_app: App) { app = _app app.tools.draw = makeTool(app) return app }, } return plugin } declare module './tool' { interface Tools { draw: ReturnType<typeof makeTool> } } declare module '../types' { interface AppEmitterEvent { draw: any } }