@hzab/map-combine 0.3.1-alpha.0 → 0.4.0-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.
@@ -1,185 +1,185 @@
1
- import { AMap } from "./AMap";
2
- import { Polyline } from "../basic/Polyline";
3
-
4
- export function drawPolyline(map: AMap, polyline: Polyline<unknown>) {
5
- const { event, viewer, LbsAMap } = map;
6
-
7
- let status = 0;
8
- let skip = 0;
9
- let target = null;
10
- let aMapPolylineEditor = null;
11
-
12
- const _event = {
13
- cursor: polyline.cursor,
14
- silent: polyline.silent,
15
- onPointerIn() {
16
- status == 2 && polyline.event.trigger("pointer-in");
17
- },
18
- onPointerOut() {
19
- status == 2 && polyline.event.trigger("pointer-out");
20
- },
21
- onLClick() {
22
- status == 2 && polyline.event.trigger("left-click");
23
- },
24
- onRClick(e) {
25
- event.canvas = [e.pixel.x, e.pixel.y];
26
- if (polyline.menu) {
27
- map.menu.show(polyline.menu);
28
- }
29
- status == 2 && polyline.event.trigger("right-click");
30
- },
31
- onDbClick() {
32
- polyline.editable &&
33
- status == 2 &&
34
- setTimeout(() => {
35
- aMapPolylineEditor.setTarget(target);
36
- aMapPolylineEditor.open();
37
- polyline.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
- aMapPolylineEditor = new LbsAMap.PolylineEditor(viewer, undefined, {
51
- createOptions: {
52
- strokeColor: polyline.stroke,
53
- strokeWeight: polyline.lineWidth,
54
- strokeStyle: polyline.dash ? "dashed" : "solid",
55
- strokeDasharray: [10, 10],
56
- },
57
- editOptions: {
58
- strokeColor: polyline.stroke,
59
- strokeWeight: polyline.lineWidth,
60
- strokeStyle: polyline.dash ? "dashed" : "solid",
61
- strokeDasharray: [10, 10],
62
- },
63
- });
64
-
65
- aMapPolylineEditor.on("add", (e) => {
66
- status = 3;
67
- target = e.target;
68
- bindEvent(target);
69
- // polygon.event.trigger("data-loaded");
70
- });
71
-
72
- if (polyline.coordinates) {
73
- status = 2;
74
- target = new LbsAMap.Polyline({
75
- path: polyline.coordinates,
76
- strokeColor: polyline.stroke,
77
- strokeWeight: polyline.lineWidth,
78
- strokeStyle: polyline.dash ? "dashed" : "solid",
79
- strokeDasharray: [10, 10],
80
- });
81
- viewer.add(target);
82
- bindEvent(target);
83
- } else {
84
- aMapPolylineEditor.close();
85
- aMapPolylineEditor.setTarget();
86
- aMapPolylineEditor.open();
87
- }
88
- const onUpdate = (e: Set<string>) => {
89
- if (skip) {
90
- skip--;
91
- return;
92
- }
93
-
94
- e.forEach((key) => {
95
- switch (key) {
96
- case "show":
97
- if (polyline.show) {
98
- target.show();
99
- } else {
100
- target.hide();
101
- }
102
- break;
103
- case "editable":
104
- break;
105
- case "coordinates":
106
- if (polyline.coordinates) {
107
- target.setPath(polyline.coordinates);
108
- target.setzIndex(polyline.coordinates[2]);
109
- target.show();
110
- status = 2;
111
- } else {
112
- target.hide();
113
- status = 0;
114
- }
115
- break;
116
-
117
- case "lineWidth":
118
- target.setOptions({
119
- strokeWeight: polyline.lineWidth,
120
- });
121
- break;
122
- case "stroke":
123
- target.setOptions({
124
- strokeColor: polyline.stroke,
125
- });
126
- break;
127
- case "dash":
128
- target.setOptions({
129
- strokeStyle: polyline.dash ? "dashed" : "solid",
130
- });
131
- break;
132
- default:
133
- throw new Error(`${key} 还不支持修改`);
134
- }
135
- });
136
- };
137
- const onDbClick = () => {
138
- switch (status) {
139
- case 1:
140
- status = 2;
141
- skip++;
142
- polyline.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
143
- polyline.event.trigger("data-loaded");
144
- polyline.event.trigger("pointer-in");
145
- break;
146
- case 3:
147
- polyline.event.trigger("stop-edit");
148
- aMapPolylineEditor.setTarget();
149
- aMapPolylineEditor.close();
150
- break;
151
- }
152
- };
153
- const onStartEdit = () => {
154
- switch (status) {
155
- case 2:
156
- status = 3;
157
- break;
158
- }
159
- };
160
-
161
- const onStopEdit = () => {
162
- if (status == 3) {
163
- status = 2;
164
- skip++;
165
- polyline.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
166
- }
167
- };
168
-
169
- const onDestroy = () => {
170
- viewer.remove(target);
171
- aMapPolylineEditor.close();
172
- aMapPolylineEditor.setTarget();
173
- event.off("double-click", onDbClick);
174
- polyline.event.off("update", onUpdate);
175
- polyline.event.off("start-edit", onStartEdit);
176
- polyline.event.off("stop-edit", onStopEdit);
177
- polyline.event.off("destroy", onDestroy);
178
- };
179
-
180
- event.on("double-click", onDbClick);
181
- polyline.event.on("update", onUpdate);
182
- polyline.event.on("start-edit", onStartEdit);
183
- polyline.event.on("stop-edit", onStopEdit);
184
- polyline.event.on("destroy", onDestroy);
185
- }
1
+ import { AMap } from "./AMap";
2
+ import { Polyline } from "../basic/Polyline";
3
+
4
+ export function drawPolyline(map: AMap, polyline: Polyline<unknown>) {
5
+ const { event, viewer, LbsAMap } = map;
6
+
7
+ let status = 0;
8
+ let skip = 0;
9
+ let target = null;
10
+ let aMapPolylineEditor = null;
11
+
12
+ const _event = {
13
+ cursor: polyline.cursor,
14
+ silent: polyline.silent,
15
+ onPointerIn() {
16
+ status == 2 && polyline.event.trigger("pointer-in");
17
+ },
18
+ onPointerOut() {
19
+ status == 2 && polyline.event.trigger("pointer-out");
20
+ },
21
+ onLClick() {
22
+ status == 2 && polyline.event.trigger("left-click");
23
+ },
24
+ onRClick(e) {
25
+ event.canvas = [e.pixel.x, e.pixel.y];
26
+ if (polyline.menu) {
27
+ map.menu.show(polyline.menu);
28
+ }
29
+ status == 2 && polyline.event.trigger("right-click");
30
+ },
31
+ onDbClick() {
32
+ polyline.editable &&
33
+ status == 2 &&
34
+ setTimeout(() => {
35
+ aMapPolylineEditor.setTarget(target);
36
+ aMapPolylineEditor.open();
37
+ polyline.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
+ aMapPolylineEditor = new LbsAMap.PolylineEditor(viewer, undefined, {
51
+ createOptions: {
52
+ strokeColor: polyline.stroke,
53
+ strokeWeight: polyline.lineWidth,
54
+ strokeStyle: polyline.dash ? "dashed" : "solid",
55
+ strokeDasharray: [10, 10],
56
+ },
57
+ editOptions: {
58
+ strokeColor: polyline.stroke,
59
+ strokeWeight: polyline.lineWidth,
60
+ strokeStyle: polyline.dash ? "dashed" : "solid",
61
+ strokeDasharray: [10, 10],
62
+ },
63
+ });
64
+
65
+ aMapPolylineEditor.on("add", (e) => {
66
+ status = 3;
67
+ target = e.target;
68
+ bindEvent(target);
69
+ // polygon.event.trigger("data-loaded");
70
+ });
71
+
72
+ if (polyline.coordinates) {
73
+ status = 2;
74
+ target = new LbsAMap.Polyline({
75
+ path: polyline.coordinates,
76
+ strokeColor: polyline.stroke,
77
+ strokeWeight: polyline.lineWidth,
78
+ strokeStyle: polyline.dash ? "dashed" : "solid",
79
+ strokeDasharray: [10, 10],
80
+ });
81
+ viewer.add(target);
82
+ bindEvent(target);
83
+ } else {
84
+ aMapPolylineEditor.close();
85
+ aMapPolylineEditor.setTarget();
86
+ aMapPolylineEditor.open();
87
+ }
88
+ const onUpdate = (e: Set<string>) => {
89
+ if (skip) {
90
+ skip--;
91
+ return;
92
+ }
93
+
94
+ e.forEach((key) => {
95
+ switch (key) {
96
+ case "show":
97
+ if (polyline.show) {
98
+ target.show();
99
+ } else {
100
+ target.hide();
101
+ }
102
+ break;
103
+ case "editable":
104
+ break;
105
+ case "coordinates":
106
+ if (polyline.coordinates) {
107
+ target.setPath(polyline.coordinates);
108
+ target.setzIndex(polyline.coordinates[2]);
109
+ target.show();
110
+ status = 2;
111
+ } else {
112
+ target.hide();
113
+ status = 0;
114
+ }
115
+ break;
116
+
117
+ case "lineWidth":
118
+ target.setOptions({
119
+ strokeWeight: polyline.lineWidth,
120
+ });
121
+ break;
122
+ case "stroke":
123
+ target.setOptions({
124
+ strokeColor: polyline.stroke,
125
+ });
126
+ break;
127
+ case "dash":
128
+ target.setOptions({
129
+ strokeStyle: polyline.dash ? "dashed" : "solid",
130
+ });
131
+ break;
132
+ default:
133
+ throw new Error(`${key} 还不支持修改`);
134
+ }
135
+ });
136
+ };
137
+ const onDbClick = () => {
138
+ switch (status) {
139
+ case 1:
140
+ status = 2;
141
+ skip++;
142
+ polyline.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
143
+ polyline.event.trigger("data-loaded");
144
+ polyline.event.trigger("pointer-in");
145
+ break;
146
+ case 3:
147
+ polyline.event.trigger("stop-edit");
148
+ aMapPolylineEditor.setTarget();
149
+ aMapPolylineEditor.close();
150
+ break;
151
+ }
152
+ };
153
+ const onStartEdit = () => {
154
+ switch (status) {
155
+ case 2:
156
+ status = 3;
157
+ break;
158
+ }
159
+ };
160
+
161
+ const onStopEdit = () => {
162
+ if (status == 3) {
163
+ status = 2;
164
+ skip++;
165
+ polyline.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
166
+ }
167
+ };
168
+
169
+ const onDestroy = () => {
170
+ viewer.remove(target);
171
+ aMapPolylineEditor.close();
172
+ aMapPolylineEditor.setTarget();
173
+ event.off("double-click", onDbClick);
174
+ polyline.event.off("update", onUpdate);
175
+ polyline.event.off("start-edit", onStartEdit);
176
+ polyline.event.off("stop-edit", onStopEdit);
177
+ polyline.event.off("destroy", onDestroy);
178
+ };
179
+
180
+ event.on("double-click", onDbClick);
181
+ polyline.event.on("update", onUpdate);
182
+ polyline.event.on("start-edit", onStartEdit);
183
+ polyline.event.on("stop-edit", onStopEdit);
184
+ polyline.event.on("destroy", onDestroy);
185
+ }
@@ -2,6 +2,7 @@ import { ContextMenu } from "./ContextMenu";
2
2
  import { MapElement } from "./MapElement";
3
3
  import { MapEvent } from "./MapEvent";
4
4
  import { Point, PointOption } from "./Point";
5
+ import { PointAggregation, PointAggregationOption } from "./PointAggregation";
5
6
  import { Polygon, PolygonOption } from "./Polygon";
6
7
  import { Polyline, PolylineOption } from "./Polyline";
7
8
  import { ReactPoint, ReactPointOption, drawReactPoint } from "./ReactPoint";
@@ -62,6 +63,9 @@ export abstract class MapCombine {
62
63
  */
63
64
  abstract createPoint<K>(option?: Partial<PointOption<K>>): Point<K>;
64
65
 
66
+ /** 聚合点 */
67
+ abstract createPointAggregation(option?: PointAggregationOption): PointAggregation;
68
+
65
69
  abstract createPolyline<K>(option?: Partial<PolylineOption<K>>): Polyline<K>;
66
70
 
67
71
  abstract createPolygon<K>(option?: Partial<PolygonOption<K>>): Polygon<K>;
@@ -1,5 +1,5 @@
1
1
  import { ReactElement } from "react";
2
- import { throttle } from 'lodash';
2
+ import { throttle } from "lodash";
3
3
 
4
4
  import { LATTOONE, LONTOONE } from "../utils/static";
5
5
  import { getUUID, setValue } from "../utils";
@@ -11,13 +11,16 @@ export interface PointAggregationOption {
11
11
  name: string;
12
12
  /** 组件是否显示 */
13
13
  show: boolean;
14
+ /** 数据点 */
14
15
  datas: any[];
15
16
  /** 小于该值的等级下会聚合 */
16
17
  maxZoomLevel?: number;
17
18
  /** 值越大聚合点的间距越小 */
18
19
  density?: number;
19
- element(e: any[], p: number[]): ReactElement;
20
- location(e: any): number[];
20
+ /** 点的展示元素 */
21
+ element(datas: any[], p: number[]): ReactElement;
22
+ /** 坐标处理回调 */
23
+ location(lonlat: number[]): number[];
21
24
  }
22
25
 
23
26
  class TileNode {
@@ -41,7 +44,7 @@ class TileNode {
41
44
  const option = {
42
45
  show: true,
43
46
  name: getUUID(),
44
- element: () => (this._element),
47
+ element: () => this._element,
45
48
  center: [0.5, 0.5],
46
49
  coordinates: [this._location[0], this._location[1], 0],
47
50
  editable: false,
@@ -53,12 +56,12 @@ class TileNode {
53
56
  } else {
54
57
  if (this.marker) {
55
58
  this.marker.destroy();
59
+ this.marker = undefined;
56
60
  }
57
61
  }
58
62
  }
59
63
  }
60
64
 
61
-
62
65
  export class PointAggregation {
63
66
  private readonly _cache = new Map<number, TileNode[]>();
64
67
  private _current = 0;
@@ -88,7 +91,7 @@ export class PointAggregation {
88
91
  const { event } = map;
89
92
  this.onAfterViewChange();
90
93
  event.on("view-moveEnd", () => {
91
- this.onAfterViewChange()
94
+ this.onAfterViewChange();
92
95
  });
93
96
  }
94
97
 
@@ -102,7 +105,7 @@ export class PointAggregation {
102
105
  const grid = new Map();
103
106
  const max = Math.pow(2, zoom) * (_option.density ?? 1);
104
107
  _option.datas.forEach((data) => {
105
- const location = _option.location(data);
108
+ const location = typeof _option.location === "function" ? _option.location(data) : data;
106
109
  const x = Math.floor(LONTOONE.forward(location[0]) * max * 2);
107
110
  const y = Math.floor(LATTOONE.forward(location[1]) * max);
108
111
  const k = `${x}_${y}`;
@@ -113,10 +116,11 @@ export class PointAggregation {
113
116
  grid.set(k, [data]);
114
117
  }
115
118
  });
119
+ // 处理聚合点坐标
116
120
  grid.forEach((e) => {
117
121
  const { lon, lat } = e.reduce(
118
122
  (a, b) => {
119
- const loaction = _option.location(b);
123
+ const loaction = typeof _option.location === "function" ? _option.location(b) : b;
120
124
  a.lon += loaction[0];
121
125
  a.lat += loaction[1];
122
126
  return a;