UNPKG

15.7 kBJavaScriptView Raw
1var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
2
3// BaiduMap 百度地图使用库
4var BaiduMap = function BaiduMap(id, params) {
5 if (!window._seeds_lang) window._seeds_lang = {}; // 国际化数据
6 if (!document.querySelector('#' + id)) {
7 console.log('SeedsUI Error:未找到BaiduMap的DOM对象,请检查id是否存在');
8 return;
9 }
10 /* --------------------
11 Model
12 -------------------- */
13 var defaults = {
14 styleOptions: {
15 strokeColor: '#0C8EFF', //边线颜色
16 strokeWeight: 1, //边线的宽度,以像素为单位
17 strokeOpacity: 0.8, //边线透明度,取值范围0 - 1
18 strokeStyle: 'solid', //边线的样式,solid或dashed
19 fillColor: '#0C8EFF', //填充颜色。当参数为空时,圆形将没有填充效果
20 fillOpacity: 0.6 //填充的透明度,取值范围0 - 1
21 },
22 labelStyleOptions: {
23 color: 'red',
24 fontSize: '12px',
25 height: '20px',
26 lineHeight: '20px',
27 fontFamily: '微软雅黑'
28 /* callback
29 onSubmit:function(selected)
30 */
31 } };
32 params = params || {};
33 for (var def in defaults) {
34 if (params[def] === undefined) {
35 params[def] = defaults[def];
36 }
37 }
38
39 // BaiduMap
40 var s = this;
41
42 // Params
43 s.params = params;
44
45 s.map = null;
46 s.drawingManager = null;
47 var _window = window,
48 BMap = _window.BMap,
49 BMapLib = _window.BMapLib,
50 BMAP_ANCHOR_BOTTOM_LEFT = _window.BMAP_ANCHOR_BOTTOM_LEFT,
51 BMAP_ANCHOR_BOTTOM_RIGHT = _window.BMAP_ANCHOR_BOTTOM_RIGHT,
52 BMAP_ANCHOR_TOP_RIGHT = _window.BMAP_ANCHOR_TOP_RIGHT,
53 BMAP_DRAWING_POLYGON = _window.BMAP_DRAWING_POLYGON,
54 BMAP_NAVIGATION_CONTROL_ZOOM = _window.BMAP_NAVIGATION_CONTROL_ZOOM;
55
56 // 渲染地图
57
58 s.createMap = function () {
59 s.map = new BMap.Map('map');
60 s.map.centerAndZoom(new BMap.Point(116.404, 39.915), 12); // 初始化地图,设置中心点坐标和地图级别
61 s.map.setCurrentCity('北京'); // 设置地图显示的城市 此项是必须设置的
62 s.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
63 };
64 s.createMap();
65
66 // 创建鼠标绘制管理类
67 s.createDrawingManager = function () {
68 s.drawingManager = new BMapLib.DrawingManager(s.map, {
69 isOpen: false, // 是否开启绘制模式
70 drawingToolOptions: {
71 anchor: BMAP_ANCHOR_TOP_RIGHT, // 位置
72 offset: new BMap.Size(5, 5) // 偏离值
73 },
74 circleOptions: s.params.styleOptions, // 圆的样式
75 polylineOptions: s.params.styleOptions, // 线的样式
76 polygonOptions: s.params.styleOptions, // 多边形的样式
77 rectangleOptions: s.params.styleOptions // 矩形的样式
78 });
79 };
80 s.createDrawingManager();
81
82 /* --------------------
83 多边形算法工具类
84 -------------------- */
85
86 /* --------------------
87 Method
88 -------------------- */
89 // 格式化points, 将[[lng, lat], [lng, lat]]转为[{lng: '', lat: ''}]
90 s.formatPoints = function (points) {
91 if (!points || !Array.isArray(points)) return [];
92 if (JSON.stringify(points).indexOf('lng') !== -1) return points;
93 if (!Array.isArray(points[0]) || !points[0][0] || !points[0][1]) return [];
94 return points.map(function (point) {
95 var lng = point[0];
96 var lat = point[1];
97 if (point[0] < point[1]) {
98 lng = point[1];
99 lat = point[0];
100 }
101 return {
102 lng: lng, lat: lat
103 };
104 });
105 };
106 // 显示放大缩小控件
107 s.showScale = function () {
108 s.map.addControl(new BMap.ScaleControl({ anchor: BMAP_ANCHOR_BOTTOM_LEFT }));
109 };
110 // 显示标尺控件
111 s.showNavigation = function () {
112 s.map.addControl(new BMap.NavigationControl({ anchor: BMAP_ANCHOR_BOTTOM_RIGHT, type: BMAP_NAVIGATION_CONTROL_ZOOM }));
113 };
114 // 启用手动绘制
115 // 设置当前的绘制模式,参数DrawingType,为5个可选常量:
116 // BMAP_DRAWING_MARKER 画点
117 // BMAP_DRAWING_CIRCLE 画圆
118 // BMAP_DRAWING_POLYLINE 画线
119 // BMAP_DRAWING_POLYGON 画多边形
120 // BMAP_DRAWING_RECTANGLE 画矩形
121 // circlecomplete(overlay) {Circle} 绘制圆完成后,派发的事件接口
122 // markercomplete(overlay) {Marker} 绘制点完成后,派发的事件接口
123 // overlaycomplete(e) {Event Object} 鼠标绘制完成后,派发总事件的接口
124 // polygoncomplete(overlay) {Polygon} 绘制多边形完成后,派发的事件接口
125 // polylinecomplete(overlay) {Polyline} 绘制线完成后,派发的事件接口
126 // rectanglecomplete(overlay) {Polygon} 绘制矩形完成后,派发的事件接口
127 s.enableManualDraw = function (type) {
128 if (s.drawingManager) {
129 s.drawingManager.open();
130 s.drawingManager.setDrawingMode(type || BMAP_DRAWING_POLYGON); // 默认多边形
131 }
132 };
133 // 自动切换到有覆盖物的视图
134 s.autoViewport = function () {
135 var overlays = s.map.getOverlays();
136 var points = [];
137 for (var i = 0; i < overlays.length; i++) {
138 var overlay = overlays[i];
139 if (overlay instanceof BMap.Polygon) {
140 points = points.concat(overlay.getPath());
141 }
142 }
143 s.map.setViewport(points);
144 };
145 // 点转多边形points:[[lng, lat], [lng, lat]]
146 s.pointsToPolygon = function (argPoints) {
147 var points = s.formatPoints(argPoints);
148 var ps = [];
149 for (var _iterator = points, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
150 var _ref;
151
152 if (_isArray) {
153 if (_i >= _iterator.length) break;
154 _ref = _iterator[_i++];
155 } else {
156 _i = _iterator.next();
157 if (_i.done) break;
158 _ref = _i.value;
159 }
160
161 var point = _ref;
162
163 ps.push(new BMap.Point(point.lng, point.lat));
164 }
165 return new BMap.Polygon(ps);
166 };
167 // 点转多边形points:[[ [lng, lat], [lng, lat] ], [ [lng, lat], [lng, lat] ]]
168 s.pointsToPolygons = function (argPointss) {
169 var polygons = [];
170 for (var i = 0; i < argPointss.length; i++) {
171 var polygon = s.pointsToPolygon(argPointss[i]);
172 polygons.push(polygon);
173 }
174 return polygons;
175 };
176 // 绘制省市区域
177 s.drawBoundary = function () {
178 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
179 // {area: '江苏省南京市建邺区', styleOptions: {}, onSuccess: func(), onError: func()}
180 var boundary = new BMap.Boundary();
181 if (!options.area) {
182 console.warn((window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + 'area, ' + (window._seeds_lang['hint_for_example_address'] || '例如“江苏省南京市建邺区”'));
183 options.onError && options.onError({
184 errMsg: (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + 'area, ' + (window._seeds_lang['hint_for_example_address'] || '例如“江苏省南京市建邺区”')
185 });
186 return;
187 }
188 boundary.get(options.area, function (res) {
189 // 获取行政区域
190 var count = res.boundaries.length; // 行政区域的点有多少个
191 if (count === 0) {
192 console.warn((window._seeds_lang['hint_pass_in_correct_parameters'] || '请传入正确的参数') + 'area');
193 options.onError && options.onError({
194 errMsg: (window._seeds_lang['hint_pass_in_correct_parameters'] || '请传入正确的参数') + 'area'
195 });
196 return;
197 }
198 var polygons = [];
199 var polygonsPath = [];
200 for (var i = 0; i < count; i++) {
201 polygons[i] = new BMap.Polygon(res.boundaries[i], options.styleOptions || s.params.styleOptions);
202 s.map.addOverlay(polygons[i]); // 添加覆盖物
203 polygonsPath = polygonsPath.concat(polygons[i].getPath());
204 }
205 // s.map.setViewport(pointArray) //调整视野
206 options.onSuccess && options.onSuccess(_extends({}, res, { polygons: polygons, polygonsPath: polygonsPath }));
207 });
208 return boundary;
209 };
210 // 绘制多边形
211 s.drawPolygon = function () {
212 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
213 // {polygon: Object, points: [], styleOptions: {}}
214 var polygon = null;
215 if (options.polygon && Object.keys(options.polygon) && Object.keys(options.polygon).length) {
216 polygon = options.polygon;
217 if (!options.styleOptions) options.styleOptions = {};
218 // 设置多边型的边线颜色,参数为合法的CSS颜色值
219 polygon.setStrokeColor(options.styleOptions.strokeColor || s.params.styleOptions.strokeColor);
220 // 设置多边形边线的宽度,取值为大于等于1的整数
221 polygon.setStrokeWeight(options.styleOptions.strokeWeight || s.params.styleOptions.strokeWeight);
222 // 设置圆形的边线透明度,取值范围0 - 1
223 polygon.setStrokeOpacity(options.styleOptions.strokeOpacity || s.params.styleOptions.strokeOpacity);
224 // 设置圆形边线样式为实线或虚线,取值solid或dashed
225 polygon.setStrokeStyle(options.styleOptions.strokeStyle || s.params.styleOptions.strokeStyle);
226 // 设置矢量图标的填充颜色。支持颜色常量字符串、十六进制、RGB、RGBA等格式
227 polygon.setFillColor(options.styleOptions.fillColor || s.params.styleOptions.fillColor);
228 // 设置矢量图标填充透明度,opacity范围0~1
229 polygon.setFillOpacity(options.styleOptions.fillOpacity || s.params.styleOptions.fillOpacity);
230 } else if (Array.isArray(options.points) && options.points.length) {
231 polygon = new BMap.Polygon(s.formatPoints(options.points), options.styleOptions || s.params.styleOptions);
232 }
233 if (polygon) {
234 s.map.addOverlay(polygon); // 添加覆盖物
235 options.onSuccess && options.onSuccess(polygon);
236 } else {
237 console.warn('drawPolygon: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{polygon: {}}' + (window._seeds_lang['or'] || '或者') + '{points: []}');
238 options.onError && options.onError({
239 errMsg: 'drawPolygon: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{polygon: {}}' + (window._seeds_lang['or'] || '或者') + '{points: []}'
240 });
241 }
242 return polygon;
243 };
244 // 绘制多边形
245 s.drawPolygons = function () {
246 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
247 // [{polygon: Object, points: [], styleOptions: {}}]
248 var polygons = [];
249 for (var _iterator2 = options, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
250 var _ref2;
251
252 if (_isArray2) {
253 if (_i2 >= _iterator2.length) break;
254 _ref2 = _iterator2[_i2++];
255 } else {
256 _i2 = _iterator2.next();
257 if (_i2.done) break;
258 _ref2 = _i2.value;
259 }
260
261 var option = _ref2;
262
263 polygons.push(s.drawPolygon(option));
264 }
265 return polygons;
266 };
267 // 绘制Label
268 s.drawLabel = function () {
269 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
270 // {point: {}, styleOptions: {}}
271 if (!options.point) {
272 console.warn('drawLabel: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{point: }');
273 options.onError && options.onError({
274 errMsg: 'drawLabel: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{point: }'
275 });
276 return;
277 }
278 var opts = {
279 position: options.point, // 指定文本标注所在的地理位置
280 offset: new BMap.Size(0, 0) // 设置文本偏移量
281 };
282 var label = new BMap.Label(JSON.stringify(options.point), opts); // 创建文本标注对象
283 label.setStyle(options.styleOptions || s.params.labelStyleOptions);
284 s.map.addOverlay(label);
285 options.onSuccess && options.onSuccess(label);
286 return label;
287 };
288 // 绘制标记
289 s.drawMarker = function () {
290 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
291 // {point: {lng: ,lat: }, styleOptions: {}}
292 if (!options.point) {
293 console.warn('drawMarker: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{point: }');
294 options.onError && options.onError({
295 errMsg: 'drawMarker: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{point: }'
296 });
297 return;
298 }
299 if (!options.point.lng || !options.point.lat) {
300 console.warn('drawMarker: ' + (window._seeds_lang['hint_pass_in_correct_parameters'] || '请传入正确的参数') + '{point: {lng: ,lat: }}');
301 options.onError && options.onError({
302 errMsg: 'drawMarker: ' + (window._seeds_lang['hint_pass_in_correct_parameters'] || '请传入正确的参数') + '{point: {lng: ,lat: }}'
303 });
304 return;
305 }
306 var point = new BMap.Point(options.point.lng, options.point.lat);
307 var marker = new BMap.Marker(point, {
308 icon: new BMap.Icon(options.icon || 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAwCAMAAABHcohdAAAAOVBMVEUAAAAMjv8Njv8NkP8Nj/8MkP8Nkf8gn/8Nj/8Njv8Mj/8Mj/8Mjv+ZmZn////n8/+Nyv8hj+8vkeUvlTkDAAAADHRSTlMA5oyFdlM8CPPZv6h2+xS8AAAAs0lEQVQ4y+2TWw6EIAxFaQUEvDOo+1/sIFEjKDSZb89vD7TpQ12wHLxzPrBVD4yacEJ6rOOGUECmjA+4MVzjEx6YqvedPwwSc4xzbZi9ftri30Rt0JgFjUTchIgKnQVqC5T7BxQpCraeMnAWeYOTENAhJMH3BJ8E1xOcLMgp5CK5J3BuVAe7t7oF7cNqoo9xN6DxWJgGRlo5aWmltZcORz69O5bXBVhWtqrFJ6PUK7zCv8IP6rMmSWrDD8kAAAAASUVORK5CYII=', new BMap.Size(16, 24), {
309 imageSize: new BMap.Size(16, 24) // 设置偏移量
310 })
311 }, {
312 offset: new BMap.Size(8, 12)
313 });
314 s.map.addOverlay(marker);
315 options.onSuccess && options.onSuccess(marker);
316 return marker;
317 };
318 // 添加右键菜单
319 s.addContextMenu = function (overlay) {
320 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
321 // options: {menus: [{text: '', handler: func()}]}
322 if (!overlay) {
323 console.warn('addContextMenu: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + 'overlay');
324 options.onError && options.onError({
325 errMsg: 'addContextMenu: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + 'overlay'
326 });
327 return;
328 }
329 if (!options.menus || !Array.isArray(options.menus) || !options.menus[0] || !options.menus[0].text) {
330 console.warn('addContextMenu: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{menus: [{text: "", handler: func()}]}');
331 options.onError && options.onError({
332 errMsg: 'addContextMenu: ' + (window._seeds_lang['hint_pass_in_parameters'] || '请传入参数') + '{menus: [{text: "", handler: func()}]}'
333 });
334 return;
335 }
336 var markerMenu = new BMap.ContextMenu();
337
338 var _loop = function _loop(index, opt) {
339 markerMenu.addItem(new BMap.MenuItem(opt.text || window._seeds_lang['menu'] || '菜单', function () {
340 opt.handler(opt, index);
341 }));
342 };
343
344 for (var _iterator3 = options.menus.entries(), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
345 var _ref4;
346
347 if (_isArray3) {
348 if (_i3 >= _iterator3.length) break;
349 _ref4 = _iterator3[_i3++];
350 } else {
351 _i3 = _iterator3.next();
352 if (_i3.done) break;
353 _ref4 = _i3.value;
354 }
355
356 var _ref3 = _ref4;
357 var index = _ref3[0];
358 var opt = _ref3[1];
359
360 _loop(index, opt);
361 }
362 overlay.addContextMenu(markerMenu);
363 return markerMenu;
364 };
365};
366
367export default BaiduMap;
\No newline at end of file