Jinuss's blog Jinuss's blog
首页
  • 源码合集

    • Leaflet源码分析
    • Openlayers源码合集
    • vue3源码
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

Web、WebGIS技术博客
首页
  • 源码合集

    • Leaflet源码分析
    • Openlayers源码合集
    • vue3源码
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 核心基类

  • Control控件篇

    • Control基类介绍
      • 概述
      • 源码剖析
        • Control类的构造函数
        • Control类的主要方法
      • 总结
    • 默认Controls控件渲染过程
    • Zoom缩放控件源码分析
    • Rotate旋转控件源码分析
    • ZoomToExtent控件源码分析
    • ZoomSlider滑块缩放控件源码分析
    • ScaleLine比例尺控件源码分析
    • Attribution属性控件源码分析
    • FullScreen全屏控件源码分析
    • OverviewMap鹰眼控件源码分析
    • MousePosition鼠标位置控件源码分析
  • Geom几何图形篇

  • Layer图层篇

  • Renderer篇

  • Feature篇

  • style样式篇

  • 《Openlayers源码》笔记
  • Control控件篇
东流
2024-12-10
目录

Control基类介绍

# 概述

Openlayers 中内置了9类控件,这9类控件都是基于Control类,而Control类则是继承于BaseObject类,如下图所示:

如上,这9类控件分别是:

  • Attribution:属性控件
  • FullScreen:全屏控件
  • MousePosition:鼠标位置控件
  • OverviewMap:鹰眼控件
  • Rotate:旋转控件
  • ScaleLine:比例尺控件
  • Zoom:缩放控件
  • ZoomSlider:滑动缩放控件
  • ZoomToExtent:缩放到指定视图范围控件

本文主要介绍控件的基类Control类。

# 源码剖析

Control类的实现如下:

class Control extends BaseObject {
  constructor(options) {
    super();
    const element = options.element;
    if (element && !options.target && !element.style.pointerEvents) {
      element.style.pointerEvents = "auto";
    }

    this.element = element ? element : null;

    this.target_ = null;
    this.map_ = null;

    this.listenerKeys = [];

    if (options.render) {
      this.render = options.render;
    }

    if (options.target) {
      this.setTarget(options.target);
    }
  }
  disposeInternal() {
    this.element?.remove();
    super.disposeInternal();
  }
  getMap() {
    return this.map_;
  }
  setMap(map) {
    if (this.map_) {
      this.element?.remove();
    }
    for (let i = 0, ii = this.listenerKeys.length; i < ii; ++i) {
      unlistenByKey(this.listenerKeys[i]);
    }
    this.listenerKeys.length = 0;
    this.map_ = map;
    if (map) {
      const target = this.target_ ?? map.getOverlayContainerStopEvent();
      target.appendChild(this.element);
      if (this.render !== VOID) {
        this.listenerKeys.push(
          listen(map, MapEventType.POSTRENDER, this.render, this)
        );
      }
      map.render();
    }
  }

  render(mapEvent) {}
  setTarget(target) {
    this.target_ =
      typeof target === "string" ? document.getElementById(target) : target;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# Control类的构造函数

Control类的构造函数接受一个参数对象options,先是判断options.element、!element.style.pointerEvents以及!options.target是否存在,若为true,则修改element元素的样式,element对应的就是控件的HTML Element;然后初始化this.element,若options.element不存在,则this.element为null,反之为options.element;初始化this.target_和this.map_为null;初始化this.listenerKeys为[];最后判断options.render是否存在,若存在则覆盖this.render方法;判断options.target是否存在,若存在,则调用this.setTarget方法。

# Control类的主要方法

Control类作为控件基类,它定义的方法很少,主要有如下几个:

  • setTarget:接受一个参数target,若target是一个字符串,则调用document.getElementById获取DOM节点,否则直接赋值,默认情况下,控件是会添加到overlay container中,这个方法会改变这个一默认行为

  • getMap: 获取this.map_

  • setMap:Control类的核心方法,接受一个参数map对象,若this.map_存在该控件元素,则移除元素;并且循环遍历this.listenerKeys移除注册的事件监听,并且清空this.listenerKeys,设置this.map_的值;然后判断参数map是否存在,若存在,则重新添加控件元素到overlay container中,然后判断this.render是否是空方法,若不为空方法,则调用listen方法注册postrender类型的事件监听,this.render方法即为注册的回调函数,本质上它是子类中定义的一个方法;最后调用map.render方法。

  • render方法:空函数,会被Control的子类覆盖

  • disposeInternal方法:清除方法,会移除控件元素,调用父类的disposeInternal方法移除监听

# 总结

本文主要介绍了 Openlayers 中的控件类型分类以及控件基类Control类的实现。

编辑 (opens new window)
上次更新: 2024/12/11, 10:30:03
BaseObject类
默认Controls控件渲染过程

← BaseObject类 默认Controls控件渲染过程→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式