一、文档资料:
MineData开放平台:
https://minedata.cn/md-platform/login/login
MineData V2.1.0 接口文档:
http://113.108.157.29:7070/support/static/api/doc/js/v2.1.0/api-reference/index.html#map
MineData 在线实例:
http://113.108.157.29:7070/support/api/demo/js-api/zh/map/base/map-show
二、上手案例:
- 1、引入方式:
1、可以直接在打包的index.html页面写script脚本接入
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>projectName</title> <script type="text/javascript" src="static/config.js"></script> <!-- 引入MineMap API插件 --> <link rel="stylesheet" href="http://minedata.cn/minemapapi/v2.1.1/minemap.css"> <script src="http://minedata.cn/minemapapi/v2.1.1/minemap.js"></script> </head> <body style="background: #f5f7f8"> <div id="app"></div> </body> </html>
2、或者在Vue编写动态接入的方法 import-js.js
import axios from 'axios' const loadJs = src => { return new Promise((resolve, reject) => { const script = document.createElement('script') script.type = 'text/javascript' script.src = src document.body.appendChild(script) script.onload = () => { resolve(script) } script.onerror = err => { console.log(`loadJsFail: ${err}`) reject() } }) } const loadCss = src => { return new Promise((resolve, reject) => { axios.get(src).then(res => { const css = document.createElement('style') css.type = 'text/css' css.innerHTML = res.data document.head.appendChild(css) resolve(css) }).catch(err => { console.log(`loadCssFail: ${err}`) reject() }) }) } export { loadJs, loadCss }
在具体某个需要使用的组件中初始化资源:
import { loadCss, loadJs } from './存放路径/import-js.js' async created() { await loadCss('http://minedata.cn/minemapapi/v2.1.1/minemap.css') await loadJs('http://minedata.cn/minemapapi/v2.1.1/minemap.js') }
- 2、地图初始化:
需要先赋值默认的参数变量,这里先用配置文件放好加载的变量 config.js
window._config = { MAP_LAT: 29.670908, MAP_LNG: 115.963214, minemapKey: '应用key,开放平台账号创建', minemapWhiteSolution: '地图样式id', minemapBlackSolution: '地图样式id', minemapDomainUrl: 'https://minemap.minedata.cn', minemapDataDomainUrl: 'https://minemap.minedata.cn', minemapServerDomainUrl: 'https://sd-data.minedata.cn', minemapSpriteUrl: 'https://minemap.minedata.cn/minemapapi/v2.1.1/sprite/sprite', minemapServiceUrl: 'https://service.minedata.cn/service' }
地图初始化还是基于dom对象创建的,所以所有关于地图加载的方法一定要放到mounted周期下执行
mounted() { this.initialMapContainer() }, methods: { async initialMapContainer() { window.minemap.domainUrl = window._config.minemapDomainUrl window.minemap.dataDomainUrl = window._config.minemapDataDomainUrl window.minemap.serverDomainUrl = window._config.minemapServerDomainUrl window.minemap.spriteUrl = window._config.minemapSpriteUrl window.minemap.serviceUrl = window._config.minemapServiceUrl window.minemap.key = window._config.minemapKey window.minemap.solution = window._config.minemapBlackSolution this.mapInstance = new window.minemap.Map({ container: 'mapContainer', style: `https://service.minedata.cn/map/solu/style/${window.minemap.solution}`, center: [window._config.MAP_LNG, window._config.MAP_LAT], zoom: 12, pitch: 0 }) } }
- 3、打点位:
addStationMarker(station) { // 创建点位的元素 const isOnline = station['runStatus'] === 1 const markerDom = window.document.createElement('div') markerDom.id = `station${station.id}` markerDom.style['background-image'] = `url(${isOnline ? this.stationIconPath2 : this.stationIconPath})` markerDom.style.width = '50px' markerDom.style.height = '50px' markerDom.style['border-radius'] = '2px' // 入参dom元素, 和元素的偏离参数(基于图标像素调整) const mineMarker = new window.minemap.Marker(markerDom, { offset: [-25, -50] }) // 点位经纬度参数对象 const markerLngLat = new window.minemap.LngLat(station.longitude, station.latitude) mineMarker.setLngLat(markerLngLat) // addTo方法将点位展示在地图上 mineMarker.addTo(this.mapInstance) }
图片资源我使用require直接转为具体对象来渲染的
stationIconPath: require('@/assets/image/station-point-1.png'), stationIconPath2: require('@/assets/image/station-point-2.png'),
如果在非打包的public目录下,可以直接写路径访问
- 4、创建点位信息窗体:
在点位创建的基础上追加弹窗窗体
addStationPopup(station, mineMarker) { const isOnline = station['runStatus'] === 1 const markerLngLat = new window.minemap.LngLat(station.longitude, station.latitude) // 参数说明: // (1)closeButton,true表示会展示一个关闭按钮; // (2)closeOnClick,设置为true表示当地图被点击时该信息窗体会被关闭; // (3)offset,参数为点位置相对于其左上角偏移像素大小; // (4)anchor,停靠点,值域为[top,bottom,left,right,top-left,top-right,bottom-left,bottom-right],如果不设置该参数,则会根据map container动态调整。 // (5)autoPan,设置为true时,当地图拖动到看不到popup的时候,自动将地图平移到可以看到popup,此参数只对固定popup有效; const stationPopup = new window.minemap.Popup({ closeOnClick: false, closeButton: true, anchor: 'bottom', offset: [0, -40], autoPan: false }) stationPopup.setLngLat(markerLngLat) // 弹窗内容创建 const popupContent = window.document.createElement('div') popupContent.className = isOnline ? 'station-popup online' : 'station-popup offline' popupContent.innerHTML = ` <h3>${station.stationName} ${station['stationLocation']}</h3> <p>区域编码:${station.regionCode}</p> <p>站点编号:${station.stationNo}</p> <p>站点状态:${station['runStatus'] === 1 ? '在线' : '离线'}</p> ` stationPopup.setDOMContent(popupContent) // stationPopup.addTo(this.mapInstance) /* 默认不打开弹窗 */ mineMarker.setPopup(stationPopup) }
预览内容:
窗体的样式可以直接修改:
/* mineMap地图窗体样式设置 */ /deep/ .minemap-popup-content { background: rgba(26,32,62,.7) !important; min-height: 100px; padding-top: 10px; overflow-y: auto; min-width: 200px; max-width: 500px !important; color: #D0D3DA; } /* 关闭按钮调整 */ /deep/ .minemap-popup-close-button { font-size: 20px; color: #D0D3DA; right: 8px; top: 6px; } /* 窗体下标箭头的颜色调整 */ /deep/ .minemap-popup-tip { border-top-color: rgba(26,32,62,.7) !important; } /* 窗体内部容器元素样式设置 */ /deep/ .station-popup { padding: 5px; width: 250px; font-size: 14px; } /deep/ .station-popup > p { margin-top: 10px; }
- 3.1 移动居中的点位:
地图平移API,有两种,相对平移和绝对平移:
http://113.108.157.29:7070/support/api/demo/js-api/zh/map/state/map-move
panBy基于相对位置平移,panTo基于点位绝对平移
function moveMap(vPixel, hPixel) { if (map) { map.panBy([vPixel, hPixel]); } } function moveMapCenter() { if (map) { map.panTo([116.46, 39.92]); } }
- 4.1 特殊窗体信息样式开发:
真是想不通为啥一定要这个样式,写起来真麻烦
可以发现这里是需要两种窗体样式的,一个是入口样式,一个是出口展示
所以不能直接对mineData的样式设置的,这样就不支持两种或多个窗体样式了
解决思路也是参考原型系统来的,我发现原型系统的默认弹窗是隐藏不展示的
这样就按我们自己声明的类名实现动态效果
第一步先把mineData的信息弹窗隐藏
/* 弹窗信息弹层不支持动态样式,隐藏展示 */ /deep/ .minemap-popup-content { max-width: none; /* 移除最大宽度 */ overflow: visible !important; /* 溢出的时直接展示,不要滚动条 */ background: none; /* 元素无背景 */ box-shadow: none; /* 元素无阴影 */ padding: 0; /* 内边距0 */ }
然后再是弹窗边框,内部布局这些内容:
/* 驶入弹窗边框 */ /deep/ .drive-in{ border: 1px solid #62b500; box-shadow: 0 0 10px 0 #62b50045; } /* 驶入小箭头 */ /deep/ .station-popup.drive-in:after { border-color: #62b500 transparent transparent transparent; } /* 驶出弹窗边框 */ /deep/ .drive-out{ border: 1px solid #f54336; box-shadow: 0 0 10px 0 #f5433645; } /* 驶出小箭头 */ /deep/ .station-popup.drive-out:after { border-color: #f54336 transparent transparent transparent; } /* 移除默认的下标箭头 */ /deep/ .minemap-popup-tip { display: none; } /* 入 */ /deep/ .station-popup.drive-in > div:first-child { background: #62b500; color: white; width: 40px; float: left; line-height: 120px; text-align: center; font-size: 16px; } /* 出 */ /deep/ .station-popup.drive-out > div:first-child { background: #f54336; width: 40px; color: white; line-height: 120px; text-align: center; font-size: 16px; } /deep/ .sfz_name { font-weight: 800; } /deep/ .station-pop-info { padding: 5px; } /* 关闭按钮调整 */ /deep/ .minemap-popup-close-button { font-size: 18px; right: 0; top: 5px; }
弹窗初始化方法:
addStationPopup(station, mineMarker) { const isDriveIn = station.type === '1' const markerLngLat = new window.minemap.LngLat(station.longitude, station.latitude) const stationPopup = new window.minemap.Popup({ closeOnClick: false, closeButton: true, anchor: 'bottom', offset: [0, isDriveIn ? -48 : -51], autoPan: false /* 关闭自动拖动 */ }) stationPopup.setLngLat(markerLngLat) const popupContent = window.document.createElement('div') popupContent.className = isDriveIn ? 'station-popup drive-in' : 'station-popup drive-out' popupContent.innerHTML = ` <div>${isDriveIn ? '入' : '出'}</div> <div class="station-pop-info"> <p class="sfz_name">${isDriveIn ? this.record.cashName : this.record.outCashName}</p> <p><span>所在区划:</span>${isDriveIn ? this.record.cashArea : this.record.outCashArea}</p> <p><span>所在高速:</span>${isDriveIn ? this.record.highwayName : this.record.outHighwayName}</p> <p>时间:${isDriveIn ? this.record.driveTime : this.record.outDriveTime}</p> </div> ` stationPopup.setDOMContent(popupContent) stationPopup.addTo(this.mapInstance) mineMarker.setPopup(stationPopup) }