vislite 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,159 @@
1
+ # 坐标投影 API
2
+
3
+ VISLite 提供多种地图坐标投影算法,用于地图可视化开发。
4
+
5
+ ## Mercator 墨卡托投影
6
+
7
+ 墨卡托投影是航海和航空中常用的投影方式。
8
+
9
+ ### 引入
10
+
11
+ ```js
12
+ import { Mercator } from 'vislite';
13
+ ```
14
+
15
+ ### 初始化
16
+
17
+ ```js
18
+ var mercator = new Mercator(scale, center);
19
+ ```
20
+
21
+ ### 参数说明
22
+
23
+ - **scale**: 缩放比例,默认7
24
+ - **center**: 投影中心经纬度 `[经度, 纬度]`,默认 `[107, 36]`(中国中心附近)
25
+
26
+ ### 使用方法
27
+
28
+ ```js
29
+ var mercator = new Mercator(7, [107, 36]);
30
+
31
+ // 将经纬度转换为平面坐标
32
+ var [x, y, z] = mercator.use(经度, 纬度);
33
+ ```
34
+
35
+ ### 使用示例
36
+
37
+ ```js
38
+ var mercator = new Mercator(7, [116.4, 39.2]); // 北京
39
+
40
+ // 北京的经纬度
41
+ var [x, y] = mercator.use(116.4, 39.2);
42
+ console.log(x, y); // 输出平面坐标
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Eoap 等角斜方位投影
48
+
49
+ 等角斜方位投影是一种适合显示以某点为中心区域的投影方式。
50
+
51
+ ### 引入
52
+
53
+ ```js
54
+ import { Eoap } from 'vislite';
55
+ ```
56
+
57
+ ### 初始化
58
+
59
+ ```js
60
+ var eoap = new Eoap(scale, center);
61
+ ```
62
+
63
+ ### 参数说明
64
+
65
+ - **scale**: 缩放比例,默认7
66
+ - **center**: 投影中心经纬度 `[经度, 纬度]`,默认 `[107, 36]`
67
+
68
+ ### 使用方法
69
+
70
+ ```js
71
+ var eoap = new Eoap(7, [116.4, 39.2]);
72
+
73
+ // 将经纬度转换为平面坐标
74
+ var [x, y, z] = eoap.use(经度, 纬度);
75
+ ```
76
+
77
+ ### 特点
78
+
79
+ - 以投影中心为原点,周围的区域变形较小
80
+ - 适合绘制局部地图(如某个国家或城市)
81
+ - 保持了角度的正确性
82
+
83
+ ---
84
+
85
+ ## MapCoordinate 地图坐标系
86
+
87
+ MapCoordinate 用于处理地图坐标转换和边界计算。
88
+
89
+ ### 引入
90
+
91
+ ```js
92
+ import { MapCoordinate } from 'vislite';
93
+ ```
94
+
95
+ ### 初始化
96
+
97
+ ```js
98
+ var mapCoord = new MapCoordinate(projection, option);
99
+ ```
100
+
101
+ ### 参数说明
102
+
103
+ - **projection**: 投影对象(Mercator 或 Eoap)
104
+ - **option**: 配置项
105
+ - `width`, `height`: 画布尺寸
106
+ - `x`, `y`: 偏移量
107
+
108
+ ### 主要功能
109
+
110
+ ```js
111
+ // 经纬度转屏幕坐标
112
+ mapCoord.lonlatToScreen(lon, lat);
113
+
114
+ // 屏幕坐标转经纬度
115
+ mapCoord.screenToLonlat(x, y);
116
+
117
+ // 获取地图边界
118
+ mapCoord.getBoundary();
119
+ ```
120
+
121
+ ### 使用示例
122
+
123
+ ```js
124
+ var mercator = new Mercator(7, [107, 36]);
125
+ var mapCoord = new MapCoordinate(mercator, {
126
+ width: 800,
127
+ height: 600
128
+ });
129
+
130
+ // 绘制地图
131
+ geoJson.features.forEach(feature => {
132
+ feature.geometry.coordinates.forEach(polygon => {
133
+ painter.beginPath();
134
+ polygon[0].forEach((point, i) => {
135
+ var [x, y] = mapCoord.lonlatToScreen(point[0], point[1]);
136
+ if (i === 0) painter.moveTo(x, y);
137
+ else painter.lineTo(x, y);
138
+ });
139
+ painter.closePath().fill();
140
+ });
141
+ });
142
+ ```
143
+
144
+ ---
145
+
146
+ ## 投影对比
147
+
148
+ | 特性 | Mercator | Eoap |
149
+ |------|----------|------|
150
+ | 适用场景 | 全球航海图 | 局部区域图 |
151
+ | 中心点 | 固定赤道 | 可自定义 |
152
+ | 变形 | 高纬度变形大 | 中心区域变形小 |
153
+ | 角度 | 保持方向 | 保持角度 |
154
+
155
+ ## 选择建议
156
+
157
+ - **全球地图或航海图**: 使用 Mercator
158
+ - **某个国家/城市的局部图**: 使用 Eoap
159
+ - **复杂地图交互**: 使用 MapCoordinate 配合投影
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: vislite-lib
3
+ description: "VISLite数据可视化库开发助手。当用户需要创建Canvas/SVG/WebGL图表、实现树布局/饼图/柱状图布局、使用坐标投影(墨卡托/等角斜方位)、矩阵变换、插值函数等可视化算法时使用。"
4
+ ---
5
+
6
+ # VISLite 数据可视化库
7
+
8
+ VISLite 是一款轻量、优雅的跨端数据可视化解决方案,支持 Web、uni-app、微信小程序、支付宝小程序等多平台。
9
+
10
+ **官网**: [https://oi-contrib.github.io/VISLite](https://oi-contrib.github.io/VISLite)
11
+
12
+ **GitHub**: [https://github.com/oi-contrib/VISLite](https://github.com/oi-contrib/VISLite)
13
+
14
+ ## 安装
15
+
16
+ ```bash
17
+ npm install --save vislite
18
+ ```
19
+
20
+ ## 模块索引
21
+
22
+ ### 画笔 (Brushes)
23
+
24
+ #### 跨平台 Canvas(H5 / 微信 / 支付宝 / uni-app)
25
+ - [Canvas.md](Canvas.md) - 统一 API,初始化方式因平台而异
26
+ - [minialipay/ui-canvas.md](minialipay/ui-canvas.md) - 支付宝小程序 Canvas 组件
27
+ - [miniprogram/ui-canvas.md](miniprogram/ui-canvas.md) - 微信小程序 Canvas 组件
28
+ - [uniapp/ui-canvas.md](uniapp/ui-canvas.md) - uni-app 跨平台使用指南
29
+
30
+ #### H5 专用画笔
31
+ - [SVG.md](SVG.md) - SVG 矢量图形绘制(仅 H5)
32
+ - [WebGL.md](WebGL.md) - WebGL 3D 图形渲染(仅 H5)
33
+
34
+ ### 布局算法 (Layouts)
35
+
36
+ - [TreeLayout.md](TreeLayout.md) - 树状布局,支持 TB/LR/RL/BT 方向
37
+ - [PieLayout.md](PieLayout.md) - 饼图/环形图布局
38
+ - [BarLayout.md](BarLayout.md) - 柱状图/条形图布局
39
+
40
+ ### 坐标投影 (Projections)
41
+
42
+ - [Projections.md](Projections.md) - Mercator 墨卡托投影、Eoap 等角斜方位投影、MapCoordinate 地图坐标系
43
+
44
+ ### 变换与插值
45
+
46
+ - [Matrix.md](Matrix.md) - 4x4 矩阵变换(平移/旋转/缩放)
47
+ - [Interpolation.md](Interpolation.md) - Cardinal/Hermite 三次插值函数
48
+
49
+ ### 工具函数
50
+
51
+ - [Utilities.md](Utilities.md) - ruler 刻度尺、animation 动画、getLoopColors 循环颜色、throttle 节流
52
+
53
+ ## 画笔平台支持说明
54
+
55
+ | 画笔 | H5 | 微信小程序 | 支付宝小程序 | uni-app |
56
+ |------|-----|-----------|-------------|----------|
57
+ | Canvas | ✅ `new Canvas(el)` | ✅ 组件方式 | ✅ 组件方式 | ✅ 组件方式 |
58
+ | SVG | ✅ `new SVG(el)` | ❌ | ❌ | ❌ |
59
+ | WebGL | ✅ `getWebGLContext()` | ❌ | ❌ | ❌ |
60
+ | RawCanvas | ✅ | ✅ | ✅ | ✅ |
61
+
62
+ **注意**: SVG 和 WebGL 仅支持 H5 端。Canvas 在不同平台的 API 完全一致,但初始化方式不同:
63
+ - **H5**: `new Canvas(domElement)`
64
+ - **小程序**: 通过 ui-canvas 组件的 `fetch()` 方法获取实例
65
+
66
+ ## 快速使用
67
+
68
+ ### H5 端使用 Canvas
69
+
70
+ ```js
71
+ import { Canvas } from 'vislite';
72
+
73
+ var painter = new Canvas(document.getElementById('root'));
74
+
75
+ painter.config({
76
+ fillStyle: "red"
77
+ }).fillCircle(200, 150, 100);
78
+
79
+ // 设置区域用于交互
80
+ painter.setRegion('circle');
81
+ painter.bind('click', (regionName, x, y) => {
82
+ console.log(regionName, x, y);
83
+ });
84
+ ```
85
+
86
+ ### 小程序端使用 Canvas
87
+
88
+ 详见各小程序平台的文档:
89
+ - [微信小程序 Canvas](miniprogram/ui-canvas.md)
90
+ - [支付宝小程序 Canvas](minialipay/ui-canvas.md)
91
+ - [uni-app Canvas](uniapp/ui-canvas.md)
92
+
93
+ ### 树布局
94
+
95
+ ```js
96
+ import { Canvas, TreeLayout } from 'vislite';
97
+
98
+ var treeLayout = new TreeLayout();
99
+ treeLayout.setOption({
100
+ type: "rect",
101
+ direction: "TB",
102
+ x: 250,
103
+ y: 20,
104
+ width: 500,
105
+ height: 260
106
+ });
107
+
108
+ var tree = treeLayout.use(data);
109
+
110
+ // 绘制连线
111
+ for (var key in tree.node) {
112
+ var pid = tree.node[key].pid;
113
+ if (pid) {
114
+ painter.beginPath()
115
+ .moveTo(tree.node[key].left, tree.node[key].top)
116
+ .bezierCurveTo(...)
117
+ .stroke();
118
+ }
119
+ }
120
+
121
+ // 绘制节点
122
+ painter.fullCircle(tree.node[key].left, tree.node[key].top, 10);
123
+ ```
124
+
125
+ ## 核心导出
126
+
127
+ ```js
128
+ import {
129
+ // 画笔
130
+ Canvas, // 跨平台(初始化方式不同)
131
+ SVG, // 仅 H5
132
+ RawCanvas, // 跨平台
133
+
134
+ // 布局
135
+ TreeLayout,
136
+ PieLayout,
137
+ BarLayout,
138
+
139
+ // 投影
140
+ Mercator,
141
+ Eoap,
142
+ MapCoordinate,
143
+
144
+ // 变换
145
+ Matrix4,
146
+ rotate,
147
+ move,
148
+ scale,
149
+
150
+ // 插值
151
+ Cardinal,
152
+ Hermite,
153
+
154
+ // 工具
155
+ ruler,
156
+ animation,
157
+ getLoopColors,
158
+ throttle,
159
+ assemble,
160
+
161
+ // WebGL(仅 H5)
162
+ getWebGLContext,
163
+ Shader,
164
+ Texture,
165
+ Buffer
166
+ } from 'vislite';
167
+ ```
168
+
169
+ ## 典型场景
170
+
171
+ - 创建跨平台图表(柱状图、饼图、树图)
172
+ - 地图可视化(墨卡托/等角斜方位投影)
173
+ - 画布/SVG/WebGL 图形绑制
174
+ - 数据可视化算法应用
175
+ - 矩阵变换与插值计算
176
+ - 小程序/uni-app 多端开发
@@ -0,0 +1,138 @@
1
+ # SVG 画笔 API
2
+
3
+ SVG 画笔用于绘制矢量图形,支持导出为图片。**仅支持 H5 端**。
4
+
5
+ ## 初始化
6
+
7
+ ```js
8
+ import { SVG } from 'vislite';
9
+
10
+ var painter = new SVG(document.getElementById('root'));
11
+ ```
12
+
13
+ ## 配置项 (config)
14
+
15
+ ```js
16
+ painter.config({
17
+ fillStyle: 'red', // 填充色
18
+ strokeStyle: 'black', // 轮廓色
19
+ lineWidth: 1, // 线宽
20
+ lineCap: 'butt', // 线端点类型
21
+ lineJoin: 'miter', // 线拐角类型
22
+ lineDash: [], // 虚线样式
23
+ textAlign: 'left', // 文字水平对齐
24
+ textBaseline: 'middle', // 文字垂直对齐
25
+ fontSize: 16, // 字体大小
26
+ fontFamily: 'sans-serif', // 字体
27
+ opacity: 1 // 透明度
28
+ });
29
+ ```
30
+
31
+ ## 节点操作
32
+
33
+ ```js
34
+ // 标记当前应用节点
35
+ painter.useEl(el);
36
+
37
+ // 获取当前应用节点
38
+ painter.getEl();
39
+
40
+ // 追加节点(el可以是元素或字符串如'text')
41
+ painter.appendEl(el, context);
42
+
43
+ // 追加绘制板(自动创建对应类型的SVG元素)
44
+ painter.appendBoard('text'); // 文字
45
+ painter.appendBoard('circle'); // 圆形
46
+ painter.appendBoard('path'); // 路径
47
+ painter.appendBoard('arc'); // 弧形
48
+ painter.appendBoard('rect'); // 矩形
49
+
50
+ // 删除当前节点
51
+ painter.remove();
52
+
53
+ // 设置/获取节点属性
54
+ painter.attr({ x: 10, y: 20 });
55
+ var x = painter.attr('x');
56
+ ```
57
+
58
+ ## 文字绘制
59
+
60
+ ```js
61
+ painter.fillText(text, x, y, deg); // 填充文字
62
+ painter.strokeText(text, x, y, deg); // 轮廓文字
63
+ painter.fullText(text, x, y, deg); // 填充+轮廓文字
64
+ ```
65
+
66
+ ## 路径操作
67
+
68
+ ```js
69
+ painter.beginPath();
70
+ painter.closePath();
71
+ painter.moveTo(x, y);
72
+ painter.lineTo(x, y);
73
+ painter.arc(x, y, r, beginDeg, deg);
74
+ painter.quadraticCurveTo(cpx, cpy, x, y);
75
+ painter.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
76
+ painter.stroke();
77
+ painter.fill();
78
+ painter.full();
79
+ ```
80
+
81
+ ## 图形绘制
82
+
83
+ ```js
84
+ // 弧形
85
+ painter.fillArc(cx, cy, r1, r2, beginDeg, deg);
86
+ painter.strokeArc(cx, cy, r1, r2, beginDeg, deg);
87
+ painter.fullArc(cx, cy, r1, r2, beginDeg, deg);
88
+
89
+ // 圆形
90
+ painter.fillCircle(cx, cy, r);
91
+ painter.strokeCircle(cx, cy, r);
92
+ painter.fullCircle(cx, cy, r);
93
+
94
+ // 矩形
95
+ painter.fillRect(x, y, w, h);
96
+ painter.strokeRect(x, y, w, h);
97
+ painter.fullRect(x, y, w, h);
98
+ ```
99
+
100
+ ## 渐变色
101
+
102
+ ```js
103
+ // 线性渐变
104
+ painter.createLinearGradient(x1, y1, x2, y2);
105
+
106
+ // 环形渐变
107
+ painter.createRadialGradient(cx, cy, r);
108
+
109
+ // 使用方式同 Canvas
110
+ ```
111
+
112
+ ## 变换
113
+
114
+ ```js
115
+ // 平移
116
+ painter.translate(x, y);
117
+
118
+ // 旋转(deg为角度值)
119
+ painter.rotate(deg);
120
+
121
+ // 缩放
122
+ painter.scale(x, y);
123
+ ```
124
+
125
+ ## 导出
126
+
127
+ ```js
128
+ // 导出为图片
129
+ painter.toDataURL().then(dataUrl => {
130
+ // dataUrl 即为 base64 图片
131
+ });
132
+ ```
133
+
134
+ ## 重置
135
+
136
+ ```js
137
+ painter.reset(config);
138
+ ```
@@ -0,0 +1,177 @@
1
+ # TreeLayout 树布局
2
+
3
+ TreeLayout 用于绘制树状图,支持多种布局方向和交互。
4
+
5
+ ## 引入
6
+
7
+ ```js
8
+ import { TreeLayout } from 'vislite';
9
+ ```
10
+
11
+ ## 初始化
12
+
13
+ ```js
14
+ var treeLayout = new TreeLayout(config);
15
+ ```
16
+
17
+ ### config 配置
18
+
19
+ ```js
20
+ {
21
+ // 获取根节点方法
22
+ root: function(initTree) {
23
+ return initTree;
24
+ },
25
+
26
+ // 获取子节点方法
27
+ children: function(parentTree, initTree) {
28
+ return parentTree.children;
29
+ },
30
+
31
+ // 获取节点ID方法
32
+ id: function(treedata) {
33
+ return treedata.name;
34
+ }
35
+ }
36
+ ```
37
+
38
+ ## setOption 设置布局行为
39
+
40
+ ```js
41
+ treeLayout.setOption({
42
+ offsetX: 0, // 水平方向隐藏节点偏差
43
+ offsetY: 0, // 垂直方向隐藏节点偏差
44
+ duration: 500, // 切换动画时长(ms)
45
+ type: 'rect', // 树图类型:plain|rect|circle
46
+ direction: 'LR', // 方向:LR|RL|TB|BT
47
+ x: 250, // 根一侧的中间位置x坐标
48
+ y: 20, // 根一侧的中间位置y坐标
49
+ width: 500, // 矩形树图宽度(type=rect时有效)
50
+ height: 260, // 矩形树图高度(type=rect时有效)
51
+ radius: 100 // 圆树图半径(type=circle时有效)
52
+ });
53
+ ```
54
+
55
+ ### type 类型
56
+
57
+ - **plain**: 普通树图(默认)
58
+ - **rect**: 矩形树图
59
+ - **circle**: 圆树图
60
+
61
+ ### direction 方向
62
+
63
+ - **LR**: 从左往右
64
+ - **RL**: 从右往左
65
+ - **TB**: 从上往下(默认)
66
+ - **BT**: 从下往上
67
+
68
+ ## use 坐标计算
69
+
70
+ ```js
71
+ var tree = treeLayout.use(initTree, noOpens);
72
+ ```
73
+
74
+ ### 返回值 tree 结构
75
+
76
+ ```js
77
+ {
78
+ node: {
79
+ '节点ID': {
80
+ left: x坐标,
81
+ top: y坐标,
82
+ pid: 父节点ID,
83
+ show: 是否显示,
84
+ deg: 旋转角度(circle类型时)
85
+ }
86
+ },
87
+ size: 节点数量,
88
+ deep: 深度
89
+ }
90
+ ```
91
+
92
+ ### noOpens 参数
93
+
94
+ 控制节点展开/闭合状态:
95
+
96
+ ```js
97
+ treeLayout.use(initTree, {
98
+ 'nodeId1': false, // 闭合
99
+ 'nodeId2': true // 打开
100
+ });
101
+ ```
102
+
103
+ ## bind 绑定渲染
104
+
105
+ ```js
106
+ treeLayout.bind(initTree, function(tree) {
107
+ // 绘制树图
108
+ for (var key in tree.node) {
109
+ var node = tree.node[key];
110
+ // 绘制节点...
111
+ }
112
+ }, noOpens);
113
+ ```
114
+
115
+ ## 交互方法
116
+
117
+ ```js
118
+ // 关闭节点
119
+ treeLayout.closeNode('nodeId');
120
+
121
+ // 打开节点
122
+ treeLayout.openNode('nodeId');
123
+
124
+ // 切换节点状态
125
+ treeLayout.toggleNode('nodeId');
126
+
127
+ // 更新布局
128
+ treeLayout.doUpdate();
129
+
130
+ // 解绑
131
+ treeLayout.unbind();
132
+ ```
133
+
134
+ ## 使用示例
135
+
136
+ ```js
137
+ var treeLayout = new TreeLayout();
138
+
139
+ treeLayout.setOption({
140
+ type: 'rect',
141
+ direction: 'TB',
142
+ x: 250,
143
+ y: 20,
144
+ width: 500,
145
+ height: 260
146
+ });
147
+
148
+ var data = {
149
+ name: '前端',
150
+ children: [{
151
+ name: '基础',
152
+ children: [{ name: 'HTML' }, { name: 'CSS' }]
153
+ }, {
154
+ name: '框架'
155
+ }]
156
+ };
157
+
158
+ var tree = treeLayout.use(data);
159
+
160
+ // 绘制连线
161
+ painter.config({ strokeStyle: 'red' });
162
+ for (var key in tree.node) {
163
+ var pid = tree.node[key].pid;
164
+ if (pid) {
165
+ painter
166
+ .beginPath()
167
+ .moveTo(tree.node[key].left, tree.node[key].top)
168
+ .bezierCurveTo(...)
169
+ .stroke();
170
+ }
171
+ }
172
+
173
+ // 绘制节点
174
+ for (var key in tree.node) {
175
+ painter.fullCircle(tree.node[key].left, tree.node[key].top, 10);
176
+ }
177
+ ```