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

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,177 +1,185 @@
1
- import { Point } from "../basic/Point";
2
- import { OpenlayerMap } from "./OpenlayerMap";
3
- import Feature from 'ol/Feature.js'
4
- import OlPoint from 'ol/geom/Point.js'
5
- import { Icon, Style } from 'ol/style.js'
6
- import { fromLonLat } from "ol/proj";
7
- import VectorSource from "ol/source/Vector";
8
- import VectorLayer from "ol/layer/Vector";
9
- const RD = 0.017453292519943295
10
-
11
- export function drawPoint(map: OpenlayerMap, point: Point<unknown>) {
12
- const { viewer, event, getFromLonLat, isFromLonLat } = map
13
- let status = 0
14
-
15
- const source = new VectorSource();
16
- const layer = new VectorLayer({
17
- source,
18
- visible: point.show
19
- })
20
- viewer.addLayer(layer)
21
- const feature = new Feature()
22
- const geometry = new OlPoint([0, 0])
23
- const style = new Style({
24
- image: new Icon({
25
- width: point.size[0],
26
- height: point.size[1],
27
- src: point.src,
28
- rotation: point.rotation * RD,
29
- anchor: point.center,
30
- crossOrigin: 'anonymous'
31
- })
32
- });
33
-
34
- const _event = {
35
- cursor: point.cursor,
36
- silent: point.silent,
37
- onPointerIn() {
38
- point.event.trigger('pointer-in')
39
- },
40
- onPointerOut() {
41
- point.event.trigger('pointer-out')
42
- },
43
- onLClick() {
44
- point.event.trigger('left-click')
45
- },
46
- onRClick() {
47
- point.event.trigger('right-click')
48
- },
49
- onPointerDown() {
50
- if (point.editable && status == 2) {
51
- status = 3
52
- map.moveable = false
53
- }
54
- },
55
- onPointerUp() {
56
- if (point.editable && status == 3) {
57
- status = 2;
58
- map.moveable = true;
59
- point.coordinates = [event.geography[0], event.geography[1], point.height];
60
- point.event.trigger('data-update')
61
- }
62
- }
63
- }
64
-
65
- feature.setGeometry(geometry)
66
- feature.setStyle(style)
67
- feature.set('event', _event, true)
68
- if (point.coordinates) {
69
- status = 2
70
- geometry.setCoordinates(getFromLonLat(point.coordinates, isFromLonLat))
71
- layer.setZIndex(point.coordinates[2] ?? 1)
72
- point.event.trigger('data-loaded')
73
- source.addFeature(feature)
74
- }
75
-
76
-
77
- const onUpdate = (e: Set<string>) => {
78
- const keys = new Set()
79
- e.forEach(key => {
80
- switch (key) {
81
- case 'show':
82
- if (status) {
83
- layer.setVisible(point.show)
84
- }
85
- break;
86
- case 'editable':
87
- break;
88
- case 'coordinates':
89
- if (point.coordinates) {
90
- geometry.setCoordinates(getFromLonLat(point.coordinates, isFromLonLat))
91
- layer.setZIndex(point.coordinates[2])
92
- switch (status) {
93
- case 0:
94
- source.addFeature(feature)
95
- status = 2;
96
- break;
97
- case 1:
98
- status = 2;
99
- break;
100
- }
101
- } else {
102
- source.removeFeature(feature)
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
- keys.add('icon')
114
- break;
115
- case 'rotation':
116
- keys.add('icon')
117
- break;
118
- default:
119
- throw new Error(`${key} 还不支持修改`)
120
- }
121
- })
122
-
123
- keys.forEach(e => {
124
- switch (e) {
125
- case 'icon':
126
- style.setImage(new Icon({
127
- width: point.size[0],
128
- height: point.size[1],
129
- src: point.src,
130
- rotation: point.rotation * RD,
131
- anchor: point.center,
132
- crossOrigin: 'anonymous'
133
- }))
134
- break;
135
- }
136
- })
137
- feature.changed()
138
- }
139
-
140
- const onMouseMove = () => {
141
- const coordinates = [event.geography[0], event.geography[1], point.height];
142
- switch (status) {
143
- case 0:
144
- status = 1
145
- geometry.setCoordinates(getFromLonLat(coordinates, isFromLonLat))
146
- source.addFeature(feature)
147
- break;
148
- case 1:
149
- case 3:
150
- geometry.setCoordinates(getFromLonLat(coordinates, isFromLonLat))
151
- break
152
- }
153
- }
154
-
155
- const onClick = () => {
156
- if (status == 1) {
157
- status = 2
158
- point.coordinates = [event.geography[0], event.geography[1], point.height];
159
- point.event.trigger('pointer-in')
160
- }
161
- }
162
-
163
-
164
- const onDestroy = () => {
165
- source.removeFeature(feature)
166
- event.off('pointer-move', onMouseMove)
167
- event.off('left-click', onClick)
168
- point.event.off('update', onUpdate)
169
- point.event.off('destroy', onDestroy)
170
-
171
- }
172
-
173
- event.on('pointer-move', onMouseMove)
174
- event.on('left-click', onClick)
175
- point.event.on('update', onUpdate)
176
- point.event.on('destroy', onDestroy)
177
- }
1
+ import { Point } from "../basic/Point";
2
+ import { OpenlayerMap } from "./OpenlayerMap";
3
+ import Feature from "ol/Feature.js";
4
+ import OlPoint from "ol/geom/Point.js";
5
+ import { Icon, Style } from "ol/style.js";
6
+ import VectorSource from "ol/source/Vector";
7
+ import VectorLayer from "ol/layer/Vector";
8
+ const RD = 0.017453292519943295;
9
+
10
+ /**
11
+ * 获取点位的 zIndex/height
12
+ * @param point
13
+ * @returns
14
+ */
15
+ function getPointZIndex(point) {
16
+ return point?.coordinates?.[2] ?? point.height ?? 3;
17
+ }
18
+
19
+ export function drawPoint(map: OpenlayerMap, point: Point<unknown>) {
20
+ const { viewer, event, getFromLonLat, isFromLonLat } = map;
21
+ let status = 0;
22
+
23
+ const source = new VectorSource();
24
+ const layer = new VectorLayer({
25
+ source,
26
+ visible: point.show,
27
+ });
28
+ viewer.addLayer(layer);
29
+ const feature = new Feature();
30
+ const geometry = new OlPoint([0, 0]);
31
+ const style = new Style({
32
+ image: new Icon({
33
+ width: point.size[0],
34
+ height: point.size[1],
35
+ src: point.src,
36
+ rotation: point.rotation * RD,
37
+ anchor: point.center,
38
+ crossOrigin: "anonymous",
39
+ }),
40
+ zIndex: 3,
41
+ });
42
+
43
+ const _event = {
44
+ cursor: point.cursor,
45
+ silent: point.silent,
46
+ onPointerIn() {
47
+ point.event.trigger("pointer-in");
48
+ },
49
+ onPointerOut() {
50
+ point.event.trigger("pointer-out");
51
+ },
52
+ onLClick() {
53
+ point.event.trigger("left-click");
54
+ },
55
+ onRClick() {
56
+ point.event.trigger("right-click");
57
+ },
58
+ onPointerDown() {
59
+ if (point.editable && status == 2) {
60
+ status = 3;
61
+ map.moveable = false;
62
+ }
63
+ },
64
+ onPointerUp() {
65
+ if (point.editable && status == 3) {
66
+ status = 2;
67
+ map.moveable = true;
68
+ point.coordinates = [event.geography[0], event.geography[1], getPointZIndex(point)];
69
+ point.event.trigger("data-update");
70
+ }
71
+ },
72
+ };
73
+
74
+ feature.setGeometry(geometry);
75
+ feature.setStyle(style);
76
+ feature.set("event", _event, true);
77
+ if (point.coordinates) {
78
+ status = 2;
79
+ geometry.setCoordinates(getFromLonLat(point.coordinates, isFromLonLat));
80
+ layer.setZIndex(getPointZIndex(point));
81
+ point.event.trigger("data-loaded");
82
+ source.addFeature(feature);
83
+ }
84
+
85
+ const onUpdate = (e: Set<string>) => {
86
+ const keys = new Set();
87
+ e.forEach((key) => {
88
+ switch (key) {
89
+ case "show":
90
+ if (status) {
91
+ layer.setVisible(point.show);
92
+ }
93
+ break;
94
+ case "editable":
95
+ break;
96
+ case "coordinates":
97
+ if (point.coordinates) {
98
+ geometry.setCoordinates(getFromLonLat(point.coordinates, isFromLonLat));
99
+ layer.setZIndex(getPointZIndex(point));
100
+ switch (status) {
101
+ case 0:
102
+ source.addFeature(feature);
103
+ status = 2;
104
+ break;
105
+ case 1:
106
+ status = 2;
107
+ break;
108
+ }
109
+ } else {
110
+ source.removeFeature(feature);
111
+ status = 0;
112
+ }
113
+ break;
114
+ case "src":
115
+ keys.add("icon");
116
+ break;
117
+ case "size":
118
+ keys.add("icon");
119
+ break;
120
+ case "center":
121
+ keys.add("icon");
122
+ break;
123
+ case "rotation":
124
+ keys.add("icon");
125
+ break;
126
+ default:
127
+ throw new Error(`${key} 还不支持修改`);
128
+ }
129
+ });
130
+
131
+ keys.forEach((e) => {
132
+ switch (e) {
133
+ case "icon":
134
+ style.setImage(
135
+ new Icon({
136
+ width: point.size[0],
137
+ height: point.size[1],
138
+ src: point.src,
139
+ rotation: point.rotation * RD,
140
+ anchor: point.center,
141
+ crossOrigin: "anonymous",
142
+ }),
143
+ );
144
+ break;
145
+ }
146
+ });
147
+ feature.changed();
148
+ };
149
+
150
+ const onMouseMove = () => {
151
+ const coordinates = [event.geography[0], event.geography[1], getPointZIndex(point)];
152
+ switch (status) {
153
+ case 0:
154
+ status = 1;
155
+ geometry.setCoordinates(getFromLonLat(coordinates, isFromLonLat));
156
+ source.addFeature(feature);
157
+ break;
158
+ case 1:
159
+ case 3:
160
+ geometry.setCoordinates(getFromLonLat(coordinates, isFromLonLat));
161
+ break;
162
+ }
163
+ };
164
+
165
+ const onClick = () => {
166
+ if (status == 1) {
167
+ status = 2;
168
+ point.coordinates = [event.geography[0], event.geography[1], getPointZIndex(point)];
169
+ point.event.trigger("pointer-in");
170
+ }
171
+ };
172
+
173
+ const onDestroy = () => {
174
+ source.removeFeature(feature);
175
+ event.off("pointer-move", onMouseMove);
176
+ event.off("left-click", onClick);
177
+ point.event.off("update", onUpdate);
178
+ point.event.off("destroy", onDestroy);
179
+ };
180
+
181
+ event.on("pointer-move", onMouseMove);
182
+ event.on("left-click", onClick);
183
+ point.event.on("update", onUpdate);
184
+ point.event.on("destroy", onDestroy);
185
+ }