Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 核心基类

  • Control控件篇

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

  • Layer图层篇

  • Renderer篇

  • Feature篇

  • style样式篇

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

ZoomToExtent控件源码分析

# 概述

在 Openlayers 中,ZoomToExtent控件可能用的不是很多,它主要用于将地图视图缩放到指定范围,应用场景就是重置地图、恢复初始状态。但是一般情况下,重置地图可能还会有其它操作,比如清除地图上绘制的点线面或者显示隐藏某些图层或者面板等等,但是我们可以了解下ZoomToExtent控件实现的原理。

# 源码分析

ZoomToExtent控件实现如下:

class ZoomToExtent extends Control {
  constructor(options) {
    options = options ? options : {};

    super({
      element: document.createElement("div"),
      target: options.target,
    });

    this.extent = options.extent ? options.extent : null;

    const className =
      options.className !== undefined ? options.className : "ol-zoom-extent";

    const label = options.label !== undefined ? options.label : "E";
    const tipLabel =
      options.tipLabel !== undefined ? options.tipLabel : "Fit to extent";
    const button = document.createElement("button");
    button.setAttribute("type", "button");
    button.title = tipLabel;
    button.appendChild(
      typeof label === "string" ? document.createTextNode(label) : label
    );

    button.addEventListener(
      EventType.CLICK,
      this.handleClick_.bind(this),
      false
    );

    const cssClasses =
      className + " " + CLASS_UNSELECTABLE + " " + CLASS_CONTROL;
    const element = this.element;
    element.className = cssClasses;
    element.appendChild(button);
  }

  handleClick_(event) {
    event.preventDefault();
    this.handleZoomToExtent();
  }

  handleZoomToExtent() {
    const map = this.getMap();
    const view = map.getView();
    const extent = !this.extent
      ? view.getProjection().getExtent()
      : fromUserExtent(this.extent, view.getProjection());
    view.fitInternal(polygonFromExtent(extent));
  }
}
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

# ZoomToExtent控件的构造函数

ZoomToExtent控件的构造函数接受一个参数options对象,该参数包含如下属性:

  • target: 控件添加的目标容器,默认不存在,会添加到overlay container中
  • extent:数组,边界范围,默认为null
  • label:控件标签,默认E
  • className:控件类名,默认ol-zoom-extent
  • tipLabel:控件hover聚焦时显示

ZoomToExtent控件的构造函数就是在实例化时会创建并添加元素,绑定元素的click事件监听,回调函数是handleClick_

# ZoomToExtent控件的方法

ZoomToExtent控件主要的方法就是handleZoomToExtent,该方法会在handleClick_中调用,即点击控件时会触发。

handleZoomToExtent方法实现如下:

handleZoomToExtent() {
    const map = this.getMap();
    const view = map.getView();
    const extent = !this.extent
      ? view.getProjection().getExtent()
      : fromUserExtent(this.extent, view.getProjection());
    view.fitInternal(polygonFromExtent(extent));
}
1
2
3
4
5
6
7
8

handleZoomToExtent方法就是获取对象的地图实例以及视图对象,然后判断this.extent,即options参数中是否传了extent,若没传,则取对象的视图对象投影下的范围;否则调用fromUserExtent方法将this.extent转为当前投影下合适的范围;然后调用polygonFromExtent将extent转为集合多边形,最后调用view.fitInternal内部方法来调整视图的可视范围,以适应给定的几何对象。fitInternal方法会根据提供的几何对象重新设置地图的视图,确保这个范围能够完全显示在当前视图中。

# 总结

本文主要介绍了ZoomToExtent控件的实现原理,核心是通过view.fitInternal内部方法调整地图视图。

编辑 (opens new window)
上次更新: 2024/12/12, 03:44:02
Rotate旋转控件源码分析
ZoomSlider滑块缩放控件源码分析

← Rotate旋转控件源码分析 ZoomSlider滑块缩放控件源码分析→

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