@hzab/map-combine 0.3.0-beta → 0.3.1-alpha.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.
package/CHANGELOG.md CHANGED
@@ -1,7 +1,9 @@
1
- # @hzab/map-combine0.3.0
1
+ # @hzab/map-combine1.0.0
2
2
 
3
3
  fix: reactpoint 添加高德地图引擎并添加相应点线面绘制
4
4
  feat: 高德地图支持 ReactPoint
5
+ feat: 增加 loadPromise 参数,用于地图异步加载判断是否加载完成
6
+ fix: 解决 ReactPoint 点击事件无法触发的问题
5
7
 
6
8
  # @hzab/map-combine0.2.8
7
9
 
package/package.json CHANGED
@@ -1,12 +1,19 @@
1
1
  {
2
2
  "name": "@hzab/map-combine",
3
- "version": "0.3.0-beta",
3
+ "version": "0.3.1-alpha.0",
4
4
  "description": "地图组件",
5
5
  "main": "src",
6
6
  "scripts": {
7
7
  "dev": "npm run prepare && webpack serve -c ./config/webpack.config.js --env local",
8
8
  "build": "webpack -c ./config/webpack.config.js --env production",
9
- "publish-beta": "npm publish --beta",
9
+ "version:alpha": "npm version prerelease --preid=alpha",
10
+ "publish:alpha": "npm publish --tag alpha",
11
+ "version:beta": "npm version prerelease --preid=beta",
12
+ "publish:beta": "npm publish --tag beta",
13
+ "version:patch": "npm version patch",
14
+ "version:minior": "npm version minor",
15
+ "version:major": "npm version major",
16
+ "publish:stable": "npm publish --access public",
10
17
  "publish-patch": "npm version patch && npm publish --access public",
11
18
  "publish-minor": "npm version minor && npm publish --access public",
12
19
  "publish-major": "npm version major && npm publish --access public",
@@ -22,11 +29,11 @@
22
29
  "author": "CaiYansong",
23
30
  "license": "ISC",
24
31
  "devDependencies": {
25
- "ol": "^7.4.0",
26
32
  "@amap/amap-jsapi-loader": "^1.0.1",
27
33
  "@hzab/permissions": "0.1.1",
28
34
  "@hzab/webpack-config": "^0.2.1",
29
35
  "@turf/turf": "6.5",
36
+ "@types/amap-js-api": "^1.4.16",
30
37
  "@types/react": "^17.0.62",
31
38
  "@types/react-dom": "^17.0.20",
32
39
  "antd": "^4.14.0",
@@ -36,6 +43,7 @@
36
43
  "lil-gui": "^0.19.2",
37
44
  "mobx": "^6.7.0",
38
45
  "mobx-react": "^7.6.0",
46
+ "ol": "^7.4.0",
39
47
  "react": "^17.0.2",
40
48
  "react-dom": "^17.0.2",
41
49
  "react-router-dom": "^6.14.1",
@@ -56,5 +64,6 @@
56
64
  "**.{js,jsx,ts,tsx,css,scss,less,json,html}": [
57
65
  "prettier --write"
58
66
  ]
59
- }
67
+ },
68
+ "dependencies": {}
60
69
  }
package/src/amap/AMap.ts CHANGED
@@ -12,7 +12,7 @@ import { drawPolyline } from "./AMapPolyline";
12
12
  import { drawPolygon } from "./AMapPolygon";
13
13
 
14
14
  export interface IAMapOption {
15
- container;
15
+ container: HTMLDivElement;
16
16
  url?: string | string[];
17
17
  center?: number[];
18
18
  zoom?: number;
@@ -26,6 +26,10 @@ export interface IAMapOption {
26
26
  securityJsCode: string;
27
27
  /** 加载的插件列表 */
28
28
  plugins?: [string];
29
+ /** loader 配置参数 */
30
+ loaderOpt?: Object;
31
+ /** 地图初始化 配置参数 */
32
+ mapOpt?: Object;
29
33
  }
30
34
 
31
35
  export interface IFlyToViewerOpt {
@@ -37,17 +41,20 @@ export interface IFlyToViewerOpt {
37
41
  * (Array<number> = [0,0,0,0]) 距离边框的内边距,顺序:上、下、左、右
38
42
  */
39
43
  avoid?: [number, number, number, number];
44
+ /**
45
+ * 最大缩放级别
46
+ */
47
+ maxZoom?: number;
40
48
  }
41
49
 
42
50
  export class AMap extends MapCombine {
43
- loadPromise;
44
51
  viewer: any;
45
- container: HTMLDivElement;
46
- option;
52
+ container: HTMLDivElement = null;
53
+ option: any = {};
47
54
  offset: number[];
48
55
  fov = 0.9272952180016121;
49
56
  isFromLonLat = true;
50
- LbsAMap;
57
+ LbsAMap: any;
51
58
  get cursor(): string {
52
59
  return this.container.style.cursor;
53
60
  }
@@ -109,6 +116,7 @@ export class AMap extends MapCombine {
109
116
 
110
117
  this.loadPromise = new Promise((resolve, reject) => {
111
118
  AMapLoader({
119
+ ...opt.loaderOpt,
112
120
  key,
113
121
  securityJsCode,
114
122
  plugins,
@@ -117,6 +125,7 @@ export class AMap extends MapCombine {
117
125
  this.LbsAMap = LbsAMap;
118
126
  let _urls = Array.isArray(url) ? url : [url];
119
127
  this.viewer = new LbsAMap.Map(container, {
128
+ ...opt.mapOpt,
120
129
  zoom: zoom || 14,
121
130
  center: center || [120.160217, 30.243861],
122
131
  doubleClickZoom: false,
@@ -139,11 +148,11 @@ export class AMap extends MapCombine {
139
148
  : undefined,
140
149
  });
141
150
  this.viewer.on("complete", () => {
142
- resolve(this.viewer);
151
+ resolve(this);
143
152
  });
144
153
 
145
154
  this._initParamsEvent(this.viewer);
146
- return this.viewer;
155
+ return this;
147
156
  })
148
157
  .catch(reject);
149
158
  });
@@ -243,7 +252,50 @@ export class AMap extends MapCombine {
243
252
  opt?.immediately,
244
253
  opt?.avoid,
245
254
  );
255
+
256
+ var currentZoom = this.viewer.getZoom();
257
+
258
+ if (opt.maxZoom && currentZoom > opt.maxZoom) {
259
+ // 如果当前缩放级别超过限制,则手动设置回最大允许级别
260
+ this.viewer.setZoom(opt.maxZoom);
261
+ }
246
262
  });
247
263
  }
264
+
265
+ /**
266
+ * 将点集视野调整至容器内,支持相对边距(百分比)
267
+ * @param {number[][]} points - 经纬度数组 [[lng, lat], ...]
268
+ * @param {Object} opt
269
+ * @param {number[]} opt.avoid - 相对边距 [上, 下, 左, 右],取值范围 0~1,默认 [0,0,0,0]
270
+ * @param {boolean} opt.immediately - 是否立即跳转,默认 false(带动画)
271
+ */
272
+ flyToViewerPercent(points: number[][], opt = { avoid: [0, 0, 0, 0], immediately: false }) {
273
+ if (!points?.length) return;
274
+
275
+ // 计算原始经纬度范围
276
+ let west = Infinity,
277
+ east = -Infinity,
278
+ south = Infinity,
279
+ north = -Infinity;
280
+ points.forEach(([lng, lat]) => {
281
+ west = Math.min(west, lng);
282
+ east = Math.max(east, lng);
283
+ south = Math.min(south, lat);
284
+ north = Math.max(north, lat);
285
+ });
286
+
287
+ // 应用相对边距
288
+ const [top, bottom, left, right] = opt.avoid;
289
+ const lngSpan = east - west;
290
+ const latSpan = north - south;
291
+
292
+ const bounds = this.LbsAMap.Bounds(
293
+ [west - lngSpan * left, south - latSpan * bottom],
294
+ [east + lngSpan * right, north + latSpan * top],
295
+ );
296
+
297
+ this.viewer.setBounds(bounds, opt.immediately);
298
+ }
299
+
248
300
  flyTo() {}
249
301
  }
@@ -24,8 +24,15 @@ export function bindEvent(map: AMap) {
24
24
  event.trigger("pointer-up");
25
25
  });
26
26
 
27
- viewer.on("mousemove", () => {
27
+ // 解决 ReactPoint 点击事件无法触发的问题
28
+ container.addEventListener("click", (e) => {
29
+ event.trigger("left-click");
30
+ });
31
+
32
+ viewer.on("mousemove", (e) => {
28
33
  event.trigger("pointer-move");
34
+ event.canvas = [e.pixel.x, e.pixel.y];
35
+ event.geography = [e.lnglat.lng, e.lnglat.lat];
29
36
  });
30
37
 
31
38
  viewer.on("mapmove", () => {
@@ -1,196 +1,195 @@
1
- import { AMap } from "./AMap";
2
- import { Polygon } from "../basic/Polygon";
3
-
4
- export function drawPolygon(map: AMap, polygon: Polygon<unknown>) {
5
- const { event, viewer, LbsAMap } = map;
6
-
7
- let status = 0;
8
- let skip = 0;
9
- let target = null;
10
- let aMapPolygonEditor = null;
11
-
12
- const _event = {
13
- cursor: polygon.cursor,
14
- silent: polygon.silent,
15
- onPointerIn() {
16
- console.log("onPointerIn", status);
17
- status == 2 && polygon.event.trigger("pointer-in");
18
- },
19
- onPointerOut() {
20
- status == 2 && polygon.event.trigger("pointer-out");
21
- },
22
- onLClick() {
23
- status == 2 && polygon.event.trigger("left-click");
24
- },
25
- onRClick(e) {
26
- event.canvas = [e.pixel.x, e.pixel.y];
27
- if (polygon.menu) {
28
- map.menu.show(polygon.menu);
29
- }
30
- status == 2 && polygon.event.trigger("right-click");
31
- },
32
- onDbClick() {
33
- polygon.editable &&
34
- status == 2 &&
35
- setTimeout(() => {
36
- aMapPolygonEditor.setTarget(target);
37
- aMapPolygonEditor.open();
38
- polygon.event.trigger("start-edit");
39
- });
40
- },
41
- };
42
-
43
- const bindEvent = (graphical) => {
44
- graphical.on("click", _event.onLClick);
45
- graphical.on("rightclick", _event.onRClick);
46
- graphical.on("dblclick", _event.onDbClick);
47
- graphical.on("mouseover", _event.onPointerIn);
48
- graphical.on("mouseout", _event.onPointerOut);
49
- };
50
-
51
- aMapPolygonEditor = new LbsAMap.PolygonEditor(viewer, undefined, {
52
- createOptions: {
53
- strokeColor: polygon.stroke,
54
- strokeWeight: polygon.lineWidth,
55
- fillOpacity: 0.4,
56
- fillColor: polygon.fill,
57
- strokeStyle: polygon.dash ? "dashed" : "solid",
58
- strokeDasharray: [10, 10],
59
- },
60
- editOptions: {
61
- strokeColor: polygon.stroke,
62
- strokeWeight: polygon.lineWidth,
63
- fillOpacity: 0.4,
64
- fillColor: polygon.fill,
65
- strokeStyle: polygon.dash ? "dashed" : "solid",
66
- strokeDasharray: [10, 10],
67
- },
68
- });
69
-
70
- aMapPolygonEditor.on("add", (e) => {
71
- status = 3;
72
- target = e.target;
73
- bindEvent(target);
74
- // polygon.event.trigger("data-loaded");
75
- });
76
- if (polygon.coordinates) {
77
- status = 2;
78
- target = new LbsAMap.Polygon({
79
- path: polygon.coordinates,
80
- strokeColor: polygon.stroke,
81
- strokeWeight: polygon.lineWidth,
82
- fillOpacity: 0.4,
83
- fillColor: polygon.fill,
84
- strokeStyle: polygon.dash ? "dashed" : "solid",
85
- strokeDasharray: [10, 10],
86
- });
87
- viewer.add(target);
88
- bindEvent(target);
89
- } else {
90
- aMapPolygonEditor.close();
91
- aMapPolygonEditor.setTarget();
92
- aMapPolygonEditor.open();
93
- }
94
- const onUpdate = (e: Set<string>) => {
95
- if (skip) {
96
- skip--;
97
- return;
98
- }
99
-
100
- e.forEach((key) => {
101
- switch (key) {
102
- case "show":
103
- if (polygon.show) {
104
- target.show();
105
- } else {
106
- target.hide();
107
- }
108
- break;
109
- case "editable":
110
- break;
111
- case "coordinates":
112
- if (polygon.coordinates) {
113
- target.setPath(polygon.coordinates);
114
- target.setzIndex(polygon.coordinates[2]);
115
- target.show();
116
- status = 2;
117
- } else {
118
- target.hide();
119
- status = 0;
120
- }
121
- break;
122
-
123
- case "lineWidth":
124
- target.setOptions({
125
- strokeWeight: polygon.lineWidth,
126
- });
127
- break;
128
- case "fill":
129
- target.setOptions({
130
- fillColor: polygon.fill,
131
- });
132
- break;
133
- case "stroke":
134
- target.setOptions({
135
- strokeColor: polygon.stroke,
136
- });
137
- break;
138
- case "dash":
139
- target.setOptions({
140
- strokeStyle: polygon.dash ? "dashed" : "solid",
141
- });
142
- break;
143
- default:
144
- throw new Error(`${key} 还不支持修改`);
145
- }
146
- });
147
- };
148
- const onDbClick = () => {
149
- switch (status) {
150
- case 1:
151
- status = 2;
152
- skip++;
153
- polygon.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
154
- polygon.event.trigger("data-loaded");
155
- polygon.event.trigger("pointer-in");
156
- break;
157
- case 3:
158
- polygon.event.trigger("stop-edit");
159
- aMapPolygonEditor.setTarget();
160
- aMapPolygonEditor.close();
161
- break;
162
- }
163
- };
164
- const onStartEdit = () => {
165
- switch (status) {
166
- case 2:
167
- status = 3;
168
- break;
169
- }
170
- };
171
-
172
- const onStopEdit = () => {
173
- if (status == 3) {
174
- status = 2;
175
- skip++;
176
- polygon.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
177
- }
178
- };
179
-
180
- const onDestroy = () => {
181
- viewer.remove(target);
182
- aMapPolygonEditor.close();
183
- aMapPolygonEditor.setTarget();
184
- event.off("double-click", onDbClick);
185
- polygon.event.off("update", onUpdate);
186
- polygon.event.off("start-edit", onStartEdit);
187
- polygon.event.off("stop-edit", onStopEdit);
188
- polygon.event.off("destroy", onDestroy);
189
- };
190
-
191
- event.on("double-click", onDbClick);
192
- polygon.event.on("update", onUpdate);
193
- polygon.event.on("start-edit", onStartEdit);
194
- polygon.event.on("stop-edit", onStopEdit);
195
- polygon.event.on("destroy", onDestroy);
196
- }
1
+ import { AMap } from "./AMap";
2
+ import { Polygon } from "../basic/Polygon";
3
+
4
+ export function drawPolygon(map: AMap, polygon: Polygon<unknown>) {
5
+ const { event, viewer, LbsAMap } = map;
6
+
7
+ let status = 0;
8
+ let skip = 0;
9
+ let target = null;
10
+ let aMapPolygonEditor = null;
11
+
12
+ const _event = {
13
+ cursor: polygon.cursor,
14
+ silent: polygon.silent,
15
+ onPointerIn() {
16
+ status == 2 && polygon.event.trigger("pointer-in");
17
+ },
18
+ onPointerOut() {
19
+ status == 2 && polygon.event.trigger("pointer-out");
20
+ },
21
+ onLClick() {
22
+ status == 2 && polygon.event.trigger("left-click");
23
+ },
24
+ onRClick(e) {
25
+ event.canvas = [e.pixel.x, e.pixel.y];
26
+ if (polygon.menu) {
27
+ map.menu.show(polygon.menu);
28
+ }
29
+ status == 2 && polygon.event.trigger("right-click");
30
+ },
31
+ onDbClick() {
32
+ polygon.editable &&
33
+ status == 2 &&
34
+ setTimeout(() => {
35
+ aMapPolygonEditor.setTarget(target);
36
+ aMapPolygonEditor.open();
37
+ polygon.event.trigger("start-edit");
38
+ });
39
+ },
40
+ };
41
+
42
+ const bindEvent = (graphical) => {
43
+ graphical.on("click", _event.onLClick);
44
+ graphical.on("rightclick", _event.onRClick);
45
+ graphical.on("dblclick", _event.onDbClick);
46
+ graphical.on("mouseover", _event.onPointerIn);
47
+ graphical.on("mouseout", _event.onPointerOut);
48
+ };
49
+
50
+ aMapPolygonEditor = new LbsAMap.PolygonEditor(viewer, undefined, {
51
+ createOptions: {
52
+ strokeColor: polygon.stroke,
53
+ strokeWeight: polygon.lineWidth,
54
+ fillOpacity: 0.4,
55
+ fillColor: polygon.fill,
56
+ strokeStyle: polygon.dash ? "dashed" : "solid",
57
+ strokeDasharray: [10, 10],
58
+ },
59
+ editOptions: {
60
+ strokeColor: polygon.stroke,
61
+ strokeWeight: polygon.lineWidth,
62
+ fillOpacity: 0.4,
63
+ fillColor: polygon.fill,
64
+ strokeStyle: polygon.dash ? "dashed" : "solid",
65
+ strokeDasharray: [10, 10],
66
+ },
67
+ });
68
+
69
+ aMapPolygonEditor.on("add", (e) => {
70
+ status = 3;
71
+ target = e.target;
72
+ bindEvent(target);
73
+ // polygon.event.trigger("data-loaded");
74
+ });
75
+ if (polygon.coordinates) {
76
+ status = 2;
77
+ target = new LbsAMap.Polygon({
78
+ path: polygon.coordinates,
79
+ strokeColor: polygon.stroke,
80
+ strokeWeight: polygon.lineWidth,
81
+ fillOpacity: 0.4,
82
+ fillColor: polygon.fill,
83
+ strokeStyle: polygon.dash ? "dashed" : "solid",
84
+ strokeDasharray: [10, 10],
85
+ });
86
+ viewer.add(target);
87
+ bindEvent(target);
88
+ } else {
89
+ aMapPolygonEditor.close();
90
+ aMapPolygonEditor.setTarget();
91
+ aMapPolygonEditor.open();
92
+ }
93
+ const onUpdate = (e: Set<string>) => {
94
+ if (skip) {
95
+ skip--;
96
+ return;
97
+ }
98
+
99
+ e.forEach((key) => {
100
+ switch (key) {
101
+ case "show":
102
+ if (polygon.show) {
103
+ target.show();
104
+ } else {
105
+ target.hide();
106
+ }
107
+ break;
108
+ case "editable":
109
+ break;
110
+ case "coordinates":
111
+ if (polygon.coordinates) {
112
+ target.setPath(polygon.coordinates);
113
+ target.setzIndex(polygon.coordinates[2]);
114
+ target.show();
115
+ status = 2;
116
+ } else {
117
+ target.hide();
118
+ status = 0;
119
+ }
120
+ break;
121
+
122
+ case "lineWidth":
123
+ target.setOptions({
124
+ strokeWeight: polygon.lineWidth,
125
+ });
126
+ break;
127
+ case "fill":
128
+ target.setOptions({
129
+ fillColor: polygon.fill,
130
+ });
131
+ break;
132
+ case "stroke":
133
+ target.setOptions({
134
+ strokeColor: polygon.stroke,
135
+ });
136
+ break;
137
+ case "dash":
138
+ target.setOptions({
139
+ strokeStyle: polygon.dash ? "dashed" : "solid",
140
+ });
141
+ break;
142
+ default:
143
+ throw new Error(`${key} 还不支持修改`);
144
+ }
145
+ });
146
+ };
147
+ const onDbClick = () => {
148
+ switch (status) {
149
+ case 1:
150
+ status = 2;
151
+ skip++;
152
+ polygon.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
153
+ polygon.event.trigger("data-loaded");
154
+ polygon.event.trigger("pointer-in");
155
+ break;
156
+ case 3:
157
+ polygon.event.trigger("stop-edit");
158
+ aMapPolygonEditor.setTarget();
159
+ aMapPolygonEditor.close();
160
+ break;
161
+ }
162
+ };
163
+ const onStartEdit = () => {
164
+ switch (status) {
165
+ case 2:
166
+ status = 3;
167
+ break;
168
+ }
169
+ };
170
+
171
+ const onStopEdit = () => {
172
+ if (status == 3) {
173
+ status = 2;
174
+ skip++;
175
+ polygon.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
176
+ }
177
+ };
178
+
179
+ const onDestroy = () => {
180
+ viewer.remove(target);
181
+ aMapPolygonEditor.close();
182
+ aMapPolygonEditor.setTarget();
183
+ event.off("double-click", onDbClick);
184
+ polygon.event.off("update", onUpdate);
185
+ polygon.event.off("start-edit", onStartEdit);
186
+ polygon.event.off("stop-edit", onStopEdit);
187
+ polygon.event.off("destroy", onDestroy);
188
+ };
189
+
190
+ event.on("double-click", onDbClick);
191
+ polygon.event.on("update", onUpdate);
192
+ polygon.event.on("start-edit", onStartEdit);
193
+ polygon.event.on("stop-edit", onStopEdit);
194
+ polygon.event.on("destroy", onDestroy);
195
+ }