Canvas如何实现矢量数据图形缩放?

Canvas 本身并不直接支持矢量图形的缩放,但你可以通过操作矢量数据本身来实现缩放效果。在 Canvas 上绘制矢量图形通常意味着你有一组描述图形形状的数据(如路径、点、线等),而不是一个已经渲染好的位图图像。

要实现矢量图形的缩放,你可以按照以下步骤进行:
1、定义矢量数据。

2、缩放变换。

3、图层渲染。

类的设计

定义矢量数据源:VectorDataSource类

什么是VectorDataSource?

当我们想在图形界面上展示几何对象、文本或图像时,我们需要一个能够提供这些数据的地方,这个地方就是VectorDataSource。简单说,它就是矢量图层的数据来源。

如何初始化VectorDataSource?

当我们想要创建一个VectorDataSource对象时,我们需要给它提供一些信息。这些信息被放在一个对象里,然后传递给VectorDataSource的构造函数。这个对象可以包含以下内容:

  • format:告诉VectorDataSource如何解析数据的格式。
  • fileUrl:如果数据存在一个文件中,这里可以告诉VectorDataSource文件的地址。
  • data:如果数据已经准备好了,可以直接放在这里。
  • projection:如果数据使用了某种特定的投影方式,这里可以指定。

一些有用的属性

  • dataBuffer:存放所有的矢量数据。
  • imageBuffer:存放所有的图像数据。
  • quadTree:帮助快速查找空间位置的对象。
  • format:之前提到的数据格式对象。

常用的方法

  • add(geom):当你有了一个新的几何对象想要加入数据源时,可以使用这个方法。
  • loadFile(fileUrl, success, failure):从指定的文件地址读取数据。
  • loadData(features):直接加载准备好的数据。
  • clearData(id):清除指定ID的数据。

一个简单的例子

假设我们有一个JSON文件,里面存放了我们的矢量数据,并且我们知道这个文件的地址。那么,我们可以这样创建一个VectorDataSource对象,并加载数据:

1
2
3
let source = new VectorDataSource({
"fileUrl": "../../../data/geom.json"
});

之后,我们就可以把这个数据源赋给一个图层,然后渲染出来。

示例效果与源代码:

运行效果

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
<!DOCTYPE html>
<html>

<head>
<title>LoadData</title>
<meta charset="UTF-8">
<script type="module">
import { Graph, Layer, VectorSource, debug } from "/examples/src/index.js";

// 初始化graph对象
let graph = new Graph({
"target": "graphWrapper"
});

// 显示辅助网格
debug.generateGrid(Object.assign({ "interval": 10, "graph": graph }, graph.getSize()));

// 增加数据层
let layer = graph.addLayer({"name":"数据层"});
layer.getSource().loadData([
{ "type": "Polygon", "coords": [[1, 1], [161, 1], [81, 81]], "style": { "fillStyle": 1, "fillColor": "#caff67" } },
{ "type": "Polygon", "coords": [[1, 2], [81, 82], [1, 162]], "style": { "fillStyle": 1, "fillColor": "#67becf" } },
{ "type": "Polygon", "coords": [[162, 1], [162, 81], [122, 121], [122, 41]], "style": { "fillStyle": 1, "fillColor": "#ef3d61" } },
{ "type": "Polygon", "coords": [[121, 42], [121, 122], [81, 82]], "style": { "fillStyle": 1, "fillColor": "#f9f51a" } },
{ "type": "Polygon", "coords": [[82, 82], [122, 122], [82, 162], [42, 122]], "style": { "fillStyle": 1, "fillColor": "#a54c09" } },
{ "type": "Polygon", "coords": [[42, 122], [82, 162], [2, 162]], "style": { "fillStyle": 1, "fillColor": "#fa8ccc" } },
{ "type": "Polygon", "coords": [[162, 82], [162, 162], [82, 162]], "style": { "fillStyle": 1, "fillColor": "#f6ca29" } }
]);

// 图形渲染
graph.render();
</script>
</head>

<body style="overflow: hidden; margin:10px;">
<div id="graphWrapper" style="width:800px; height:400px; border:solid 1px #CCC;"></div>
</body>
</html>

尝试一下 »