123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- import * as L from 'leaflet'
- import 'leaflet/dist/leaflet.css'
- import 'leaflet-editable/src/Leaflet.Editable'
- import 'leaflet-draw/dist/leaflet.draw'
- import 'leaflet-draw/dist/leaflet.draw.css'
- import visualization_icon_camera from '@/assets/images/visualControl/visualization_icon_camera.png'
- import visualization_icon_equipments from '@/assets/images/visualControl/visualization_icon_equipments.png'
- export default function(config) {
- const defaultConfig = {
- el: 'map',
- defaultColor: '#11b9e8',
- activeColor: 'orange',
- addColor: '#f90',
- editColor: '#ff0000',
- maxBounds: [[-40000, -40000], [40000, 40000]],
- mapReadonly: false,
- zoomControl: true,
- updateDataEvent: function() {
- return true
- },
- clickDataEvent: function() {
- },
- contextmenu: function() {
- },
- saveResult: function() {
- },
- mapclick: function() {
- }
- }
- const currentConfig = {}
- for (const key in defaultConfig) {
- try {
- if (config[key] !== undefined) {
- currentConfig[key] = config[key]
- } else {
- currentConfig[key] = defaultConfig[key]
- }
- } catch (e) {
- currentConfig[key] = defaultConfig[key]
- }
- }
- const _this = this
- const DATA_CONST = {
- READ_ONLY: -1,
- DEFAULT: 0,
- ADD: 1,
- EDITOR: 2
- }
- this.editType = 0
- let currentEditorCover = null
- if (currentConfig.mapReadonly) {
- this.editType = DATA_CONST.READ_ONLY
- }
- function setCurrentEditorCover(editorCover) {
- if (editorCover) {
- currentEditorCover = editorCover
- }
- }
- function disableCurrentEditorCover() {
- if (currentEditorCover) {
- currentEditorCover.disableEdit()
- }
- }
- function getDataMap(layerItem) {
- const dataMap = new LayerItem()
- dataMap.set('type', layerItem.options.type)
- dataMap.set('options', layerItem.options)
- switch (layerItem.options.type) {
- case 'polygon': // 多边形
- dataMap.set('latlngs', layerItem._latlngs[0])
- break
- case 'marker':
- dataMap.set('latlngs', layerItem._latlngs || layerItem['_latlng'])
- break
- }
- return dataMap
- }
- this.saveEditorCover = function(callback) {
- const dataMap = new LayerItem()
- var type = 'polygon'
- var latlngs = null
- if (_this.layerType === 'facility' || _this.layerType === 'camera' || _this.layerType === 'marker') {
- type = 'marker'
- latlngs = currentEditorCover._latlng
- } else {
- latlngs = currentEditorCover._latlngs[0]
- }
- dataMap.set('type', type)
- dataMap.set('latlngs', latlngs)
- dataMap.set('options', currentEditorCover.options)
- dataMap.set('layerType', _this.layerType)
- currentConfig.updateDataEvent(dataMap).then((flag) => {
- if (flag) {
- disableCurrentEditorCover()
- _this.editType = DATA_CONST.DEFAULT
- arr.push(dataMap)
- if (callback) {
- callback(dataMap)
- return
- }
- addData()
- }
- })
- }
- this.getEditType = function() {
- return _this.editType
- }
- this.addArea = function() {
- _this.layerType = 'area'
- _this.editType = DATA_CONST.ADD
- }
- /** 更换标记点 */
- this.changeLayerType = function(type, _editType = DATA_CONST.ADD) {
- _this.layerType = type
- _this.editType = _editType
- }
- this.setEditType = function(type) {
- _this.editType = type
- }
- const map = L.map(currentConfig.el, {
- crs: L.CRS.Simple, // 一个简单的CRS,可将经度和纬度直接映射到x其中y。可用于平面地图(例如游戏地图)
- zoom: 0,
- center: L.latLng(0, 0),
- maxBounds: currentConfig.maxBounds,
- doubleClickZoom: false,
- drawControl: false,
- attributionControl: false,
- zoomControl: currentConfig.zoomControl,
- editable: true
- })
- // L.EditControl = L.Control.extend({
- //
- // options: {
- // position: 'topleft',
- // callback: null,
- // kind: '',
- // html: ''
- // },
- //
- // onAdd: function (mapLayer) {
- // var container = L.DomUtil.create('div', 'leaflet-control leaflet-bar'),
- // link = L.DomUtil.create('a', '', container);
- //
- // link.href = '#';
- // link.title = 'Create a new ' + this.options.kind;
- // link.innerHTML = this.options.html;
- // L.DomEvent.on(link, 'click', L.DomEvent.stop)
- // .on(link, 'click', function () {
- // window.LAYER = this.options.callback.call(mapLayer.editTools);
- // }, this);
- //
- // return container;
- // }
- //
- // });
- //
- //
- // var drawnItems = new L.FeatureGroup();
- // mapLayer.addLayer(drawnItems);
- // var drawControl = new L.Control.Draw({
- // edit: {
- // featureGroup: drawnItems
- // }
- // });
- // mapLayer.addControl(drawControl);
- let arr = []
- function LayerItem() {
- this.type = null
- this.latlngs = null
- this.options = null
- this.set = (key, value) => {
- this[key] = value
- }
- this.get = (key) => {
- return this[key]
- }
- }
- var layerGroup = L.layerGroup().addTo(map)
- var layerImageCoverGroup = L.layerGroup().addTo(map)
- this.setRasterLayer = function(imagePath) {
- const imageFile = new Image()
- imageFile.src = imagePath
- imageFile.onload = function() {
- // 设定图片视图的范围为当前的图片宽高
- const height = imageFile.height; const width = imageFile.width
- const imageOverlay = L.imageOverlay(imagePath, [[-(height / 2), -(width / 2)], [(height / 2), (width / 2)]])
- layerImageCoverGroup.clearLayers()
- imageOverlay.addTo(layerImageCoverGroup)
- }
- clearData()
- }
- this.setMapData = function(layerArr) {
- arr = []
- layerArr.forEach((item) => {
- const tempLayerItem = new LayerItem()
- for (const k in item) {
- tempLayerItem.set(k, item[k])
- }
- arr.push(tempLayerItem)
- })
- addData(arr)
- }
- // mapLayer.on(L.Draw.Event.CREATED, function (e) {
- // var type = e.layerType,
- // layer = e.layer;
- // let dataMap = new Map();
- // dataMap.set("type", type);
- // switch (type) {
- // case 'polyline':
- // case 'polygon':
- // case 'rectangle':
- // dataMap.set("latlngs", layer._latlngs);
- // break;
- // case 'marker':
- // case 'circlemarker':
- // dataMap.set("latlngs", layer._latlng);
- // break;
- // case 'circle':
- // dataMap.set("latlngs", layer._latlng);
- // dataMap.set("radius", layer._mRadius);
- // break;
- // }
- // arr.push(dataMap);
- // console.log(e.layer)
- // console.log(type)
- // // 由于部分其他效果直接每次重绘
- // addData();
- //
- // // 图层组
- // // layerGroup.addLayer(layer)
- // // 直接在地图添加不方便管理,所以选择图层组存放数据
- // // mapLayer.addLayer(layer);
- // });
- function clearData() {
- layerGroup.clearLayers()
- L.popup()
- .setLatLng([1, 2])
- .setContent(`<p>1212</p>`)
- .openOn(map)
- .remove()
- }
- function addData() {
- // 默认先清楚数据
- clearData()
- const fn = function(ary, key) {
- return ary.reduce((total, next) => {
- const index = total.findIndex((item) => {
- return item[key] === 'marker'
- })
- return index === -1 ? total.push(next) && total : total.splice(index, 0, next) && total
- }, [])
- }
- arr = fn(arr, 'type')// 按照类型组合arr
- var items = document.getElementById(currentConfig.el)
- .getElementsByClassName('leaflet-interactive')
- for (let i = 0; i < arr.length; i++) {
- switch (arr[i].get('type')) {
- case 'polyline': // 折线
- L.polyline(arr[i].get('latlngs'), { color: 'red' }).addTo(layerGroup)
- break
- case 'marker': // 标记
- // eslint-disable-next-line no-case-declarations
- const layerType = arr[i].layerType
- // eslint-disable-next-line no-case-declarations
- const title = layerType === 'camera' ? '摄像头' : '设备'
- var myimage = L.icon({
- iconUrl: layerType === 'camera' ? visualization_icon_camera : visualization_icon_equipments,
- iconSize: [38, 38],
- popupAnchor: [50, 0]
- })
- L.marker(arr[i].get('latlngs'), {
- layerId: arr[i].get('layerId'),
- id: arr[i].get('id'),
- equipId: arr[i].get('equipId'),
- icon: myimage,
- title: title
- // draggable:true
- }).on('click', function(item) {
- for (let j = 0; j < items.length; j++) {
- items[j].classList.remove('stroke-dasharray')
- }
- this.options.type = 'marker'
- const tempDataMap = getDataMap(this)
- currentConfig.clickDataEvent(tempDataMap)
- L.popup()
- .setLatLng(item.latlng)
- .setContent(`<p>${title}</p>`)
- .openOn(map)
- }).on('mouseover', function() {
- // L.popup()
- // .setLatLng(item.latlng)
- // .setContent('<p>Hello world!<br />This is a nice popup.</p>')
- // .openOn(mapLayer);
- }).on('dragend', function() {
- // 拖拽回调
- // let latlng=item.target['_latlng'];
- // this.setLatLng([latlng.lat,latlng.lng]);
- // setCurrentEditorCover(this)
- // _this.layerType='marker';
- // currentConfig.saveResult();
- })
- .addTo(layerGroup)
- break
- case 'polygon':
- break
- case 'rectangle': // 矩形
- L.rectangle(arr[i].get('latlngs'), { color: 'red' }).addTo(layerGroup)
- break
- case 'circle': // 圆圈
- L.circle(arr[i].get('latlngs'), { radius: arr[i].get('radius') }).addTo(layerGroup)
- break
- case 'circlemarker': // 圆圈标记
- L.circleMarker(arr[i].get('latlngs'), { radius: 10 }).addTo(layerGroup)
- break
- default:
- break
- }
- }
- }
- // 点击添加点位
- map.on('click', function(ev) {
- const x1 = {
- lat: ev.latlng.lat - 50,
- lng: ev.latlng.lng
- }
- const x2 = {
- lat: ev.latlng.lat + 50,
- lng: ev.latlng.lng
- }
- const y1 = {
- lat: ev.latlng.lat,
- lng: ev.latlng.lng - 50
- }
- const y2 = {
- lat: ev.latlng.lat,
- lng: ev.latlng.lng + 50
- }
- const latlngs = []
- latlngs.push(x1)
- latlngs.push(y1)
- latlngs.push(x2)
- latlngs.push(y2)
- if (_this.editType === DATA_CONST.ADD) {
- const layerType = _this.layerType
- console.log(layerType)
- if (layerType === 'facility' || layerType === 'camera' || layerType === 'marker') {
- var myimage = L.icon({
- iconUrl: layerType === 'camera' ? visualization_icon_camera : visualization_icon_equipments,
- iconSize: [38, 38],
- popupAnchor: [50, 0]
- })
- var marker = L.marker([ev.latlng.lat, ev.latlng.lng], {
- icon: myimage,
- title: layerType === 'camera' ? '摄像头' : '设备点',
- // draggable:true,
- type: _this.layerType
- }).addTo(layerGroup)
- setCurrentEditorCover(marker)
- currentConfig.mapclick({ marker, type: 'marker', layerType: layerType, remove: function() {
- marker.remove()
- } })
- } else {
- const polygon = L.polygon(latlngs, { color: currentConfig.addColor }).on('click', function() {
- }).on('dblclick', function() {
- if (_this.editType === DATA_CONST.EDITOR) {
- this.disableEdit()
- this.enableEdit()
- this.setStyle({
- color: currentConfig.editColor
- })
- this.redraw()
- }
- })
- .addTo(layerGroup)
- setCurrentEditorCover(polygon)
- currentConfig.mapclick({ polygon, type: 'polygon' })
- }
- _this.editType = DATA_CONST.EDITOR
- }
- })
- }
|