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控件篇

  • Geom几何图形篇

  • Layer图层篇

  • Renderer篇

  • Feature篇

  • style样式篇

    • Style类
      • 概述
      • 源码分析
        • Style类的源码实现
        • Style类的构造函数和属性
        • 构造函数 (constructor(options))
        • 属性
        • Style类的主要方法
        • 克隆方法
        • 获取/设置方法:
        • 设置几何对象
      • 总结
    • Fill类
    • Stroke类
    • Text类
    • ImageStyle类
    • Icon类
    • RegularShape类
    • Circle类
    • IconImage类
    • IconImageCache类
  • 《Openlayers源码》笔记
  • style样式篇
东流
2025-01-17
目录

Style类

# 概述

Style 类是 Openlayers 中用于定义地图元素样式的类。这个类可以用来描述如何渲染地图上的不同类型的要素(例如点、线、多边形等)。Style 类的实例定义了一个具体的样式,包括几何形状、填充、描边、图像、文本等属性。它可以应用到不同类型的图层或要素上,使得这些要素在地图上呈现不同的视觉效果。

# 源码分析

# Style类的源码实现

Style类的源码实现如下:

class Style {
  constructor(options) {
    options = options || {};
    this.geometry_ = null;
    this.geometryFunction_ = defaultGeometryFunction;
    if (options.geometry !== undefined) {
      this.setGeometry(options.geometry);
    }
    this.fill_ = options.fill !== undefined ? options.fill : null;
    this.image_ = options.image !== undefined ? options.image : null;
    this.renderer_ = options.renderer !== undefined ? options.renderer : null;
    this.hitDetectionRenderer_ =
      options.hitDetectionRenderer !== undefined
        ? options.hitDetectionRenderer
        : null;
    this.stroke_ = options.stroke !== undefined ? options.stroke : null;
    this.text_ = options.text !== undefined ? options.text : null;
    this.zIndex_ = options.zIndex;
  }
  clone() {
    let geometry = this.getGeometry();
    if (geometry && typeof geometry === "object") {
      geometry = geometry.clone();
    }
    return new Style({
      geometry: geometry ?? undefined,
      fill: this.getFill() ? this.getFill().clone() : undefined,
      image: this.getImage() ? this.getImage().clone() : undefined,
      renderer: this.getRenderer() ?? undefined,
      stroke: this.getStroke() ? this.getStroke().clone() : undefined,
      text: this.getText() ? this.getText().clone() : undefined,
      zIndex: this.getZIndex(),
    });
  }

  getRenderer() {
    return this.renderer_;
  }

  setRenderer(renderer) {
    this.renderer_ = renderer;
  }

  setHitDetectionRenderer(renderer) {
    this.hitDetectionRenderer_ = renderer;
  }

  getHitDetectionRenderer() {
    return this.hitDetectionRenderer_;
  }

  getGeometry() {
    return this.geometry_;
  }

  getGeometryFunction() {
    return this.geometryFunction_;
  }

  getFill() {
    return this.fill_;
  }

  setFill(fill) {
    this.fill_ = fill;
  }

  getImage() {
    return this.image_;
  }

  setImage(image) {
    this.image_ = image;
  }

  getStroke() {
    return this.stroke_;
  }
  setStroke(stroke) {
    this.stroke_ = stroke;
  }
  getText() {
    return this.text_;
  }

  setText(text) {
    this.text_ = text;
  }

  getZIndex() {
    return this.zIndex_;
  }

  setGeometry(geometry) {
    if (typeof geometry === "function") {
      this.geometryFunction_ = geometry;
    } else if (typeof geometry === "string") {
      this.geometryFunction_ = function (feature) {
        return feature.get(geometry);
      };
    } else if (!geometry) {
      this.geometryFunction_ = defaultGeometryFunction;
    } else if (geometry !== undefined) {
      this.geometryFunction_ = function () {
        return geometry;
      };
    }
    this.geometry_ = geometry;
  }

  setZIndex(zIndex) {
    this.zIndex_ = zIndex;
  }
}
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

# Style类的构造函数和属性

# 构造函数 (constructor(options))

构造函数接收一个 options 对象,初始化样式的各个属性。options 对象可以包括以下属性:

  • geometry: 用于指定几何体(例如点、线或面),或者是一个函数,返回几何体的函数。

  • fill: 填充样式,通常用于设置填充颜色或纹理(适用于面样式)。

  • image: 图像样式,通常用于点样式,用来设置图标或符号的图像。

  • renderer: 渲染器,通常用于指定自定义渲染方法。

  • hitDetectionRenderer: 用于自定义击中检测的渲染器。

  • stroke: 描边样式,通常用于线条或面的边缘。

  • text: 文本样式,通常用于设置标签或文字的样式。

  • zIndex: z轴索引,用于设置样式的层级顺序。

# 属性

  • geometry_: 存储样式的几何体信息,决定要素的形状。

  • geometryFunction_: 几何体函数,决定如何从要素中获取几何体。

  • fill_: 填充样式,定义要素的内部填充。

  • image_: 图像样式,定义点要素的图标或图片。

  • renderer_: 渲染器,用于自定义要素的渲染方式。

  • hitDetectionRenderer_: 击中检测渲染器,用于自定义点击检测。

  • stroke_: 描边样式,定义线条或面的边缘样式。

  • text_: 文本样式,定义要素标签的文本样式。

  • zIndex_: z轴的层级,用来控制样式的绘制顺序。

# Style类的主要方法

# 克隆方法

  • clone(): 克隆当前样式实例,返回一个新的 Style 对象。克隆时会复制每个属性的值。

# 获取/设置方法:

  • getRenderer() 和 setRenderer(renderer): 获取或设置渲染器。

  • getHitDetectionRenderer() 和 setHitDetectionRenderer(renderer): 获取或设置击中检测渲染器。

  • getGeometry() 和 setGeometry(geometry)`: 获取或设置几何体。几何体可以是直接提供的几何对象,或者是一个函数,返回几何体。

  • getFill() 和 setFill(fill): 获取或设置填充样式。

  • getImage() 和 setImage(image): 获取或设置图像样式。

  • getStroke() 和 setStroke(stroke): 获取或设置描边样式。

  • getText() 和 setText(text): 获取或设置文本样式。

  • getZIndex() 和 setZIndex(zIndex): 获取或设置 z-index 层级。

# 设置几何对象

在构造函数中,setGeometry() 方法会根据传入的参数设置 geometry_ 和 geometryFunction_:

  • 如果 geometry 是一个函数,geometryFunction_ 会设置为该函数。

  • 如果 geometry 是一个字符串,geometryFunction_ 会创建一个函数,该函数从要素中获取指定名称的属性作为几何体。

  • 如果 geometry 是 null 或 undefined,则使用默认的几何函数 defaultGeometryFunction。

  • 如果 geometry 是一个对象,则 geometryFunction_ 会直接返回这个几何体。

  • defaultGeometryFunction 是 Openlayers 中的一个默认函数,通常返回要素的几何体。

# 总结

Style 类在 Openlayers 中非常重要,它允许用户定制地图上各类要素的样式。通过使用 Style 类,可以设置填充、描边、图像、文本等属性,并且通过几何体函数自定义如何获取要素的几何体。这为地图的可视化和交互提供了极大的灵活性

编辑 (opens new window)
上次更新: 2025/01/17, 10:35:59
RenderFeature类
Fill类

← RenderFeature类 Fill类→

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