@hzab/map-combine 0.4.2-alpha.1 → 0.4.2-alpha.11

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,54 +1,110 @@
1
- import { AMap } from "./AMap";
2
-
3
- /**
4
- * 高德地图事件
5
- * 高德地图 元素事件由各自元素处理
6
- * @param map
7
- */
8
- export function bindEvent(map: AMap) {
9
- const { event, viewer, container } = map;
10
-
11
- const frame = () => {
12
- if (map.isAlive) {
13
- requestAnimationFrame(frame);
14
- event.trigger("view-preRender");
15
- }
16
- };
17
- frame();
18
-
19
- viewer.on("moveend", (e) => {
20
- event.trigger("view-moveEnd");
21
- event.trigger("view-change");
22
- });
23
-
24
- container.addEventListener("mousedown", (e) => {
25
- event.trigger("pointer-down");
26
- });
27
-
28
- container.addEventListener("mouseup", (e) => {
29
- event.trigger("pointer-up");
30
- });
31
-
32
- // 解决 ReactPoint 点击事件无法触发的问题
33
- container.addEventListener("click", (e) => {
34
- event.trigger("left-click");
35
- });
36
-
37
- viewer.on("mousemove", (e) => {
38
- event.trigger("pointer-move");
39
- event.canvas = [e.pixel.x, e.pixel.y];
40
- event.geography = [e.lnglat.lng, e.lnglat.lat];
41
- });
42
-
43
- viewer.on("mapmove", () => {
44
- event.trigger("view-change");
45
- });
46
-
47
- viewer.on("click", (e) => {
48
- event.trigger("left-click");
49
- });
50
-
51
- viewer.on("dblclick", (e) => {
52
- map.event.trigger("double-click");
53
- });
54
- }
1
+ import { pointToLineDistance } from "@turf/turf";
2
+
3
+ import { AMap } from "./AMap";
4
+
5
+ /**
6
+ * 高德地图事件
7
+ * 高德地图 元素事件由各自元素处理
8
+ * @param map
9
+ */
10
+ export function bindEvent(map: AMap) {
11
+ const { event, viewer, container } = map;
12
+
13
+ const frame = () => {
14
+ if (map.isAlive) {
15
+ requestAnimationFrame(frame);
16
+ event.trigger("view-preRender");
17
+ map.bussinesses.forEach((e) => e.show && e.onFrame?.());
18
+ }
19
+ };
20
+ frame();
21
+
22
+ viewer.on("moveend", (e) => {
23
+ event.trigger("view-moveEnd");
24
+ event.trigger("view-change");
25
+ });
26
+
27
+ container.addEventListener("mousedown", (e) => {
28
+ event.trigger("pointer-down");
29
+ });
30
+
31
+ container.addEventListener("mouseup", (e) => {
32
+ event.trigger("pointer-up");
33
+ });
34
+
35
+ // 解决 ReactPoint 点击事件无法触发的问题
36
+ container.addEventListener("click", (e) => {
37
+ event.trigger("left-click");
38
+ });
39
+
40
+ viewer.on("mousemove", (e) => {
41
+ event.trigger("pointer-move");
42
+ event.canvas = [e.pixel.x, e.pixel.y];
43
+ event.geography = [e.lnglat.lng, e.lnglat.lat];
44
+ });
45
+
46
+ viewer.on("mapmove", () => {
47
+ event.trigger("view-change");
48
+ });
49
+
50
+ viewer.on("click", (e) => {
51
+ event.trigger("left-click");
52
+
53
+ // "drill-pick" 获取点击位置的元素
54
+ const clickPosition = e.lnglat;
55
+ const position = [clickPosition.lng, clickPosition.lat];
56
+ const allOverlays = viewer.getAllOverlays(); // 获取所有覆盖物
57
+ const pickedObjects = [];
58
+
59
+ // 遍历所有覆盖物,检查点击位置是否在覆盖物内
60
+ allOverlays.forEach((overlay) => {
61
+ // 判断是否为多边形
62
+ if (overlay instanceof map.LbsAMap.Polygon) {
63
+ // 使用 contains 方法判断点是否在多边形内
64
+ if (overlay.contains(clickPosition)) {
65
+ pickedObjects.push(overlay);
66
+ }
67
+ }
68
+ // 判断是否为折线
69
+ else if (overlay instanceof map.LbsAMap.Polyline) {
70
+ // 使用点线距离计算
71
+ const path = overlay.getPath();
72
+ const coords = path.map((p) => [p.getLng(), p.getLat()]);
73
+ const distance = pointToLineDistance(position, coords, { units: "meters" });
74
+
75
+ // 获取当前地图的分辨率(米/像素) 每像素代表多少米
76
+ const resolution = viewer.getResolution();
77
+ // 计算线宽对应的地理距离(单边)
78
+ const halfWidthInMeters = (overlay.getOptions().strokeWeight / 2) * resolution;
79
+
80
+ // 根据距离判断是否点击
81
+ if (distance < halfWidthInMeters + 2) {
82
+ pickedObjects.push(overlay);
83
+ }
84
+ }
85
+ // 判断是否为 Marker
86
+ else if (overlay instanceof map.LbsAMap.Marker) {
87
+ const position = overlay.getPosition();
88
+ const distance = map.LbsAMap.GeometryUtil.distance(position, clickPosition);
89
+ if (distance < 20) {
90
+ // 点击位置距离 Marker 小于 20 像素
91
+ pickedObjects.push(overlay);
92
+ }
93
+ }
94
+ });
95
+
96
+ // 按 zIndex 从高到低排序
97
+ pickedObjects.sort((a, b) => (b.getzIndex?.() || 0) - (a.getzIndex?.() || 0));
98
+
99
+ event.trigger("drill-pick", {
100
+ event: e,
101
+ pickedTargets: pickedObjects.map((it) => it.getOptions()?.extData?.target),
102
+ sourceObjects: pickedObjects,
103
+ position: position,
104
+ });
105
+ });
106
+
107
+ viewer.on("dblclick", (e) => {
108
+ map.event.trigger("double-click");
109
+ });
110
+ }
@@ -1,143 +1,140 @@
1
- import { Point } from "../basic/Point";
2
- import { AMap } from "./AMap";
3
-
4
- const RD = 0.017453292519943295;
5
-
6
- export function drawPoint(map: AMap, point: Point<unknown>) {
7
- const { viewer, event, LbsAMap } = map;
8
- let status = 0;
9
- let marker = null;
10
- const _event = {
11
- onPointerIn() {
12
- point.event.trigger("pointer-in");
13
- },
14
- onPointerOut() {
15
- point.event.trigger("pointer-out");
16
- },
17
- onLClick() {
18
- point.event.trigger("left-click");
19
- },
20
- onRClick(e) {
21
- event.canvas = [e.pixel.x, e.pixel.y];
22
- point.event.trigger("right-click");
23
- },
24
- onPointerDown() {
25
- if (point.editable && status == 2) {
26
- status = 3;
27
- map.moveable = false;
28
- }
29
- },
30
- onPointerUp() {
31
- if (point.editable && status == 3) {
32
- status = 2;
33
- map.moveable = true;
34
- point.coordinates = [event.geography[0], event.geography[1], point.height];
35
- point.event.trigger("data-update");
36
- }
37
- },
38
- };
39
-
40
- const bindEvent = (graphical) => {
41
- graphical.on("click", _event.onLClick);
42
- graphical.on("rightclick", _event.onRClick);
43
- graphical.on("mouseover", _event.onPointerIn);
44
- graphical.on("mouseout", _event.onPointerOut);
45
- };
46
-
47
- const darwMarker = (opt) => {
48
- marker = new LbsAMap.Marker({
49
- ...opt,
50
- title: point._option.name,
51
- icon: new LbsAMap.Icon({
52
- image: point.src,
53
- size: point.size,
54
- imageSize: point.size,
55
- }),
56
- angle: point.rotation * RD,
57
- anchor: point.center,
58
- draggable: point.editable,
59
- extData: {
60
- cursor: point.cursor,
61
- silent: point.silent,
62
- },
63
- });
64
- bindEvent(marker);
65
- viewer.add([marker]);
66
- };
67
-
68
- const eventMarker = (e) => {
69
- darwMarker({ position: new LbsAMap.LngLat(e.lnglat.lng, e.lnglat.lat) });
70
- viewer.off("click", eventMarker);
71
- };
72
-
73
- if (point.coordinates) {
74
- darwMarker({ position: new LbsAMap.LngLat(...point.coordinates) });
75
- } else {
76
- viewer.on("click", eventMarker);
77
- }
78
-
79
- const onUpdate = (e: Set<string>) => {
80
- const keys = new Set();
81
- e.forEach((key) => {
82
- switch (key) {
83
- case "show":
84
- if (status) {
85
- if (point.show) {
86
- marker.show();
87
- } else {
88
- marker.hide();
89
- }
90
- }
91
- break;
92
- case "editable":
93
- marker.setDraggable(point.editable);
94
- break;
95
- case "coordinates":
96
- if (point.coordinates) {
97
- marker.setPosition(point.coordinates);
98
- marker.setzIndex(point.coordinates[2]);
99
- marker.show();
100
- status = 2;
101
- } else {
102
- marker.hide();
103
- status = 0;
104
- }
105
- break;
106
- case "src":
107
- keys.add("icon");
108
- break;
109
- case "size":
110
- keys.add("icon");
111
- break;
112
- case "center":
113
- marker.setAnchor(point.center);
114
- break;
115
- case "rotation":
116
- marker.setAngle(point.rotation * RD);
117
- break;
118
- default:
119
- throw new Error(`${key} 还不支持修改`);
120
- }
121
- });
122
-
123
- keys.forEach((e) => {
124
- switch (e) {
125
- case "icon":
126
- marker.setIcon(
127
- new LbsAMap.Icon({
128
- image: point.src,
129
- size: point.size,
130
- imageSize: point.size,
131
- }),
132
- );
133
- break;
134
- }
135
- });
136
- };
137
-
138
- const onDestroy = () => {
139
- marker.remove();
140
- point.event.off("update", onUpdate);
141
- point.event.off("destroy", onDestroy);
142
- };
143
- }
1
+ import { Point } from "../basic/Point";
2
+ import { AMap } from "./AMap";
3
+
4
+ export function drawPoint(map: AMap, point: Point<unknown>) {
5
+ const { viewer, event, LbsAMap } = map;
6
+ let status = 0;
7
+ let skip = 0;
8
+
9
+ const { size, center } = point;
10
+ const pointOffset = [-size[0] * center[0], -size[1] * center[1]];
11
+ const marker = new LbsAMap.Marker({
12
+ position: new LbsAMap.LngLat(0, 0),
13
+ height: point.height,
14
+ title: point._option.name,
15
+ icon: new LbsAMap.Icon({
16
+ image: point.src,
17
+ size: point.size,
18
+ imageSize: point.size,
19
+ }),
20
+ angle: point.rotation,
21
+ anchor: point.center,
22
+ draggable: point.editable,
23
+ bubble: true,
24
+ extData: {
25
+ userdata: point.userdata,
26
+ cursor: point.cursor,
27
+ silent: point.silent,
28
+ target: point,
29
+ },
30
+ offset: pointOffset,
31
+ });
32
+ setIcon();
33
+ viewer.add([marker]);
34
+
35
+ if (point.coordinates) {
36
+ status = 2;
37
+ marker.setPosition(point.coordinates);
38
+ if (point.show) {
39
+ marker.show();
40
+ } else {
41
+ marker.hide();
42
+ }
43
+ }
44
+
45
+ const onMouseMove = () => {
46
+ switch (status) {
47
+ case 0:
48
+ status = 1;
49
+ marker.setPosition(event.geography);
50
+ if (point.show) {
51
+ marker.show();
52
+ } else {
53
+ marker.hide();
54
+ }
55
+ break;
56
+ case 1:
57
+ case 3:
58
+ marker.setPosition(event.geography);
59
+ break;
60
+ }
61
+ };
62
+
63
+ const onClick = () => {
64
+ if (status == 1) {
65
+ status = 2;
66
+ skip++;
67
+ point.coordinates = event.geography;
68
+ point.event.trigger("pointer-in");
69
+ }
70
+ };
71
+
72
+ const onUpdate = (e: Set<string>) => {
73
+ if (skip) {
74
+ skip--;
75
+ return;
76
+ }
77
+ e.forEach((key) => {
78
+ switch (key) {
79
+ case "show":
80
+ if (status) {
81
+ if (point.show) {
82
+ marker.show();
83
+ } else {
84
+ marker.hide();
85
+ }
86
+ }
87
+ break;
88
+ case "editable":
89
+ marker.setDraggable(point.editable);
90
+ break;
91
+ case "coordinates":
92
+ if (point.coordinates) {
93
+ marker.setPosition(point.coordinates);
94
+ marker.setzIndex(point.coordinates[2]);
95
+ marker.show();
96
+ status = 2;
97
+ } else {
98
+ marker.hide();
99
+ status = 0;
100
+ }
101
+ break;
102
+ case "src":
103
+ setIcon();
104
+ break;
105
+ case "size":
106
+ setIcon();
107
+ break;
108
+ case "center":
109
+ marker.setAnchor(point.center);
110
+ break;
111
+ case "rotation":
112
+ marker.setAngle(point.rotation);
113
+ break;
114
+ default:
115
+ throw new Error(`${key} 还不支持修改`);
116
+ }
117
+ });
118
+ };
119
+
120
+ function setIcon() {
121
+ marker.setIcon(
122
+ new LbsAMap.Icon({
123
+ image: point.src,
124
+ size: point.size,
125
+ imageSize: point.size,
126
+ }),
127
+ );
128
+ }
129
+
130
+ const onDestroy = () => {
131
+ marker.remove();
132
+ point.event.off("update", onUpdate);
133
+ point.event.off("destroy", onDestroy);
134
+ };
135
+
136
+ event.on("pointer-move", onMouseMove);
137
+ event.on("left-click", onClick);
138
+ point.event.on("update", onUpdate);
139
+ point.event.on("destroy", onDestroy);
140
+ }