@hzab/map-combine 0.2.7 → 0.3.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.
@@ -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,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
+ 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
+ }
@@ -0,0 +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
+ }
@@ -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;
@@ -28,6 +28,8 @@ export abstract class MapCombine {
28
28
  abstract get zoom(): number;
29
29
  abstract set zoom(val);
30
30
 
31
+ loadPromise: Promise<this> = Promise.resolve(this);
32
+
31
33
  bussinesses = new Map<string, BasicBusiness<BasicBusinessOption>>();
32
34
 
33
35
  /** 地图是否存在 */