@hzab/map-combine 0.2.7 → 0.3.0-beta

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,143 @@
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
+ }
@@ -0,0 +1,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
+ 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
+ }
@@ -0,0 +1,186 @@
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
+ console.log("onPointerIn", status);
17
+ status == 2 && polyline.event.trigger("pointer-in");
18
+ },
19
+ onPointerOut() {
20
+ status == 2 && polyline.event.trigger("pointer-out");
21
+ },
22
+ onLClick() {
23
+ status == 2 && polyline.event.trigger("left-click");
24
+ },
25
+ onRClick(e) {
26
+ event.canvas = [e.pixel.x, e.pixel.y];
27
+ if (polyline.menu) {
28
+ map.menu.show(polyline.menu);
29
+ }
30
+ status == 2 && polyline.event.trigger("right-click");
31
+ },
32
+ onDbClick() {
33
+ polyline.editable &&
34
+ status == 2 &&
35
+ setTimeout(() => {
36
+ aMapPolylineEditor.setTarget(target);
37
+ aMapPolylineEditor.open();
38
+ polyline.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
+ aMapPolylineEditor = new LbsAMap.PolylineEditor(viewer, undefined, {
52
+ createOptions: {
53
+ strokeColor: polyline.stroke,
54
+ strokeWeight: polyline.lineWidth,
55
+ strokeStyle: polyline.dash ? "dashed" : "solid",
56
+ strokeDasharray: [10, 10],
57
+ },
58
+ editOptions: {
59
+ strokeColor: polyline.stroke,
60
+ strokeWeight: polyline.lineWidth,
61
+ strokeStyle: polyline.dash ? "dashed" : "solid",
62
+ strokeDasharray: [10, 10],
63
+ },
64
+ });
65
+
66
+ aMapPolylineEditor.on("add", (e) => {
67
+ status = 3;
68
+ target = e.target;
69
+ bindEvent(target);
70
+ // polygon.event.trigger("data-loaded");
71
+ });
72
+
73
+ if (polyline.coordinates) {
74
+ status = 2;
75
+ target = new LbsAMap.Polyline({
76
+ path: polyline.coordinates,
77
+ strokeColor: polyline.stroke,
78
+ strokeWeight: polyline.lineWidth,
79
+ strokeStyle: polyline.dash ? "dashed" : "solid",
80
+ strokeDasharray: [10, 10],
81
+ });
82
+ viewer.add(target);
83
+ bindEvent(target);
84
+ } else {
85
+ aMapPolylineEditor.close();
86
+ aMapPolylineEditor.setTarget();
87
+ aMapPolylineEditor.open();
88
+ }
89
+ const onUpdate = (e: Set<string>) => {
90
+ if (skip) {
91
+ skip--;
92
+ return;
93
+ }
94
+
95
+ e.forEach((key) => {
96
+ switch (key) {
97
+ case "show":
98
+ if (polyline.show) {
99
+ target.show();
100
+ } else {
101
+ target.hide();
102
+ }
103
+ break;
104
+ case "editable":
105
+ break;
106
+ case "coordinates":
107
+ if (polyline.coordinates) {
108
+ target.setPath(polyline.coordinates);
109
+ target.setzIndex(polyline.coordinates[2]);
110
+ target.show();
111
+ status = 2;
112
+ } else {
113
+ target.hide();
114
+ status = 0;
115
+ }
116
+ break;
117
+
118
+ case "lineWidth":
119
+ target.setOptions({
120
+ strokeWeight: polyline.lineWidth,
121
+ });
122
+ break;
123
+ case "stroke":
124
+ target.setOptions({
125
+ strokeColor: polyline.stroke,
126
+ });
127
+ break;
128
+ case "dash":
129
+ target.setOptions({
130
+ strokeStyle: polyline.dash ? "dashed" : "solid",
131
+ });
132
+ break;
133
+ default:
134
+ throw new Error(`${key} 还不支持修改`);
135
+ }
136
+ });
137
+ };
138
+ const onDbClick = () => {
139
+ switch (status) {
140
+ case 1:
141
+ status = 2;
142
+ skip++;
143
+ polyline.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
144
+ polyline.event.trigger("data-loaded");
145
+ polyline.event.trigger("pointer-in");
146
+ break;
147
+ case 3:
148
+ polyline.event.trigger("stop-edit");
149
+ aMapPolylineEditor.setTarget();
150
+ aMapPolylineEditor.close();
151
+ break;
152
+ }
153
+ };
154
+ const onStartEdit = () => {
155
+ switch (status) {
156
+ case 2:
157
+ status = 3;
158
+ break;
159
+ }
160
+ };
161
+
162
+ const onStopEdit = () => {
163
+ if (status == 3) {
164
+ status = 2;
165
+ skip++;
166
+ polyline.coordinates = target.getPath().map((item) => [item.lng, item.lat]);
167
+ }
168
+ };
169
+
170
+ const onDestroy = () => {
171
+ viewer.remove(target);
172
+ aMapPolylineEditor.close();
173
+ aMapPolylineEditor.setTarget();
174
+ event.off("double-click", onDbClick);
175
+ polyline.event.off("update", onUpdate);
176
+ polyline.event.off("start-edit", onStartEdit);
177
+ polyline.event.off("stop-edit", onStopEdit);
178
+ polyline.event.off("destroy", onDestroy);
179
+ };
180
+
181
+ event.on("double-click", onDbClick);
182
+ polyline.event.on("update", onUpdate);
183
+ polyline.event.on("start-edit", onStartEdit);
184
+ polyline.event.on("stop-edit", onStopEdit);
185
+ polyline.event.on("destroy", onDestroy);
186
+ }
@@ -0,0 +1,58 @@
1
+ const defaultVersion = "2.0";
2
+ const defaultPlugins = ["AMap.Geocoder", "AMap.AutoComplete", "AMap.PolygonEditor", "AMap.PolylineEditor"];
3
+
4
+ if (!window._AMapLoaderTemp) {
5
+ window._AMapLoaderTemp = {};
6
+ }
7
+
8
+ window._AMapLoaderTemp.loading = false;
9
+
10
+ function Loader(opt) {
11
+ if (!window.AMap) {
12
+ window._AMapSecurityConfig = {
13
+ securityJsCode: opt.securityJsCode || window._AMapLoaderTemp.securityJsCode,
14
+ };
15
+ }
16
+ const { key, version, plugins } = opt || {};
17
+ return new Promise((resolve, reject) => {
18
+ // 判断是否有进行中的加载器
19
+ if (window._AMapLoaderTemp.loading && window._AMapLoaderTemp.promise) {
20
+ window._AMapLoaderTemp.promise.then((AMap) => {
21
+ resolve(window.AMap);
22
+ });
23
+ return;
24
+ }
25
+ // 判断是否存在 AMap,且入参 plugins 是否改变
26
+ if (
27
+ (window.AMap && !plugins) ||
28
+ (window.AMap && plugins && JSON.stringify(window._AMapLoaderTemp.plugins) === JSON.stringify(plugins))
29
+ ) {
30
+ resolve(window.AMap);
31
+ return;
32
+ }
33
+
34
+ window._AMapLoaderTemp.plugins = plugins ? [...defaultPlugins, ...(plugins || [])] : defaultPlugins;
35
+
36
+ // 不用地图组件时可以不安装 "@amap/amap-jsapi-loader"
37
+ const AMapLoader = require("@amap/amap-jsapi-loader");
38
+
39
+ window._AMapLoaderTemp.loading = true;
40
+ window._AMapLoaderTemp.promise = AMapLoader.load({
41
+ key: key || window._AMapLoaderTemp.key, // 申请好的Web端开发者Key,首次调用 load 时必填
42
+ version: version || defaultVersion, // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
43
+ plugins: window._AMapLoaderTemp.plugins, // 需要使用的的插件列表,如比例尺'AMap.Scale'等
44
+ })
45
+ .then((AMap) => {
46
+ window.AMap = AMap;
47
+ resolve(window.AMap);
48
+ window._AMapLoaderTemp.loading = false;
49
+ return AMap;
50
+ })
51
+ .catch((e) => {
52
+ reject(e);
53
+ console.error("AMap loader: ", e);
54
+ });
55
+ });
56
+ }
57
+
58
+ export default Loader;