leafletHelper.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. // leaflet 地图组件
  2. // author: wzx
  3. // version: 1.0
  4. import L from 'leaflet'
  5. // import 'leaflet.motion/dist/leaflet.motion.min.js'
  6. import patch from '@/utils/map/sub/patch'
  7. import config from '@/utils/map/sub/config'
  8. import global from '@/utils/map/sub/global'
  9. import player from '@/utils/map/sub/player'
  10. import checkPoint from '@/utils/map/sub/checkPoint'
  11. import route from '@/utils/map/sub/route'
  12. export default {
  13. global: global,
  14. config: config,
  15. player: player,
  16. checkPoint: checkPoint,
  17. route: route,
  18. // 地图初始化
  19. // mapid <string> 地图容器的id
  20. // centPoint <array> 地图的初始地理中心坐标
  21. // zoomNum <int> 初始地图缩放级别
  22. init(caller, mapid, centPoint, zoomNum = 17) {
  23. patch.run()
  24. global.init()
  25. global.setCaller(caller)
  26. global.map = L.map(mapid, {
  27. center: centPoint,
  28. zoom: zoomNum,
  29. zoomControl: true,
  30. updateWhenIdle: false,
  31. updateInterval: 10,
  32. keepBuffer: 1024,
  33. attributionControl: false
  34. });
  35. // global.map = L.map(mapid, {
  36. // attributionControl: false
  37. // }).setView(centPoint, zoomNum);
  38. L.control.attribution({
  39. // prefix: '&copy; 小飞龙定向', // 地图右下角属性文本的前缀内容
  40. prefix: false // 地图右下角属性文本的前缀内容
  41. }).addTo(global.map);
  42. L.control.scale({
  43. maxWidth: 120, // 控件的最大宽度,单位是像素
  44. metric: true, // 是否显示公制比例线(米/公里)
  45. imperial: false, // 是否显示英制比例线(英里/英尺)
  46. position: 'topright' // 控件的位置(地图的一个角)。可能的值是 ‘topleft’、 ‘topright’、 ‘bottomleft’ 或 ‘bottomright’
  47. }).addTo(global.map)
  48. this.extendControl()
  49. // 添加地图点击弹窗
  50. global.map.on('click', (e) => {
  51. console.log("坐标", e.latlng.toString())
  52. // L.popup().setLatLng(e.latlng)
  53. // .setContent("坐标:" + e.latlng.toString())
  54. // .openOn(global.map);
  55. });
  56. global.map.on('zoomstart', (e) => {
  57. // console.log("[zoomstart] 即将开始地图缩放", e)
  58. player.onZoomStart(e)
  59. checkPoint.onZoomStart(e)
  60. route.onZoomStart(e)
  61. });
  62. global.map.on('zoom', (e) => {
  63. // console.log("[zoom] 地图缩放", e)
  64. player.onZoom(e)
  65. checkPoint.onZoom(e)
  66. route.onZoom(e)
  67. });
  68. global.map.on('zoomend', (e) => {
  69. // console.log("[zoomend] 地图缩放结束", e)
  70. player.onZoomEnd(e)
  71. checkPoint.onZoomEnd(e)
  72. route.onZoomEnd(e)
  73. });
  74. // global.map.on('zoomanim', (e) => {
  75. // console.log("地图缩放中...", e)
  76. // // player.onZoomEnd(e)
  77. // // checkPoint.onZoomEnd(e)
  78. // // route.onZoomEnd(e)
  79. // });
  80. player.init()
  81. checkPoint.init()
  82. route.init()
  83. },
  84. addMapLayer(mapurl, minZoom = 16, maxZoom = 18) {
  85. // console.log('[addMapLayer] mapurl', mapurl)
  86. // var mapurl = 'static/map/' + mapid + '/{z}/{x}/{y}.png'
  87. global.map_layer = L.tileLayer(mapurl, {
  88. minZoom: minZoom,
  89. maxZoom: maxZoom,
  90. errorTileUrl: '/static/image/tileMiss.png',
  91. tms: false, // 是否反转Y轴坐标,
  92. keepBuffer: 20, // 平移地图时,在卸载切片之前,请保留这么多行和几列的切片
  93. // attribution: '版权所有'
  94. }).addTo(global.map);
  95. },
  96. extendControl() {
  97. var that = this
  98. L.Control.Search = L.Control.extend({
  99. options: {
  100. position: 'topleft' //初始位置
  101. },
  102. // _container: null,
  103. // elCheckPoint: null,
  104. // elTrail: null,
  105. initialize: function(options) {
  106. L.Util.extend(this.options, options)
  107. },
  108. onAdd: function(map) {
  109. // console.log('onAdd', map)
  110. var caller = global._caller
  111. //创建Dom元素 L.DomUtil.create('元素类型', 'class类名')
  112. // this._container = L.DomUtil.create('div', 'leaflet-control-container')
  113. this._container = L.DomUtil.create('div', 'leaflet-bar')
  114. // var inp = L.DomUtil.create('div', 'leaflet-control-input')
  115. // var btn = L.DomUtil.create('button', 'leaflet-control-button')
  116. //设置Dom元素的内容
  117. // inp.id='inp' //可以为元素设置id
  118. // inp.innerHTML =
  119. // ' <input placeholder="天安门" ref="a" id="boox" style="width:150px;margin-right:20px;" /> '
  120. // btn.innerText = '搜索'
  121. // this.elCheckPoint = L.DomUtil.create('a', 'leaflet-control-common')
  122. // this.elCheckPoint.innerHTML = '<span>点位</span>'
  123. this.elRoute = L.DomUtil.create('a', 'leaflet-control-common')
  124. this.elRoute.innerHTML = '<span>路线</span>'
  125. this.elPlayer = L.DomUtil.create('a', 'leaflet-control-common')
  126. this.elPlayer.innerHTML = '<span>玩家</span>'
  127. this.elPlayerTooltip = L.DomUtil.create('a', 'leaflet-control-common')
  128. this.elPlayerTooltip.innerHTML = '<span>提示</span>'
  129. this.elPlayerTrail = L.DomUtil.create('a', 'leaflet-control-common')
  130. this.elPlayerTrail.innerHTML = '<span>轨迹</span>'
  131. this.elList = L.DomUtil.create('a', 'leaflet-control-common')
  132. this.elList.innerHTML = '<span>列表</span>'
  133. this.elFullScreen = L.DomUtil.create('a', 'leaflet-control-common')
  134. this.elFullScreen.innerHTML = '<span>全屏</span>'
  135. // this._container.style.display = 'flex'
  136. // this._container.appendChild(this.elCheckPoint)
  137. this._container.appendChild(this.elRoute)
  138. this._container.appendChild(this.elPlayer)
  139. this._container.appendChild(this.elPlayerTooltip)
  140. this._container.appendChild(this.elPlayerTrail)
  141. this._container.appendChild(this.elList)
  142. this._container.appendChild(this.elFullScreen)
  143. //注册事件
  144. // L.DomEvent.addListener(this.elCheckPoint, 'click', function (ev) {
  145. // L.DomEvent.stopPropagation(ev)
  146. // L.DomEvent.preventDefault(ev)
  147. // that.checkPoint.toggle()
  148. // }, that.checkPoint)
  149. L.DomEvent.addListener(this.elRoute, 'click dblclick', function (ev) {
  150. L.DomEvent.stopPropagation(ev)
  151. L.DomEvent.preventDefault(ev)
  152. that.route.toggle()
  153. }, that.checkPoint)
  154. L.DomEvent.addListener(this.elPlayer, 'click dblclick', function (ev) {
  155. L.DomEvent.stopPropagation(ev)
  156. L.DomEvent.preventDefault(ev)
  157. that.player.togglePlayer()
  158. }, that.player)
  159. L.DomEvent.addListener(this.elPlayerTooltip, 'click dblclick', function (ev) {
  160. L.DomEvent.stopPropagation(ev)
  161. L.DomEvent.preventDefault(ev)
  162. that.player.toggleTooltip()
  163. }, that.player)
  164. L.DomEvent.addListener(this.elPlayerTrail, 'click dblclick', function (ev) {
  165. L.DomEvent.stopPropagation(ev)
  166. L.DomEvent.preventDefault(ev)
  167. that.player.toggleTrail()
  168. }, that.player)
  169. L.DomEvent.addListener(this.elList, 'click dblclick', function (ev) {
  170. L.DomEvent.stopPropagation(ev)
  171. L.DomEvent.preventDefault(ev)
  172. global._caller.popupToggle()
  173. // global._caller.popup('bottom')
  174. }, this)
  175. L.DomEvent.addListener(this.elFullScreen, 'click dblclick', function (ev) {
  176. L.DomEvent.stopPropagation(ev)
  177. L.DomEvent.preventDefault(ev)
  178. global._caller.fullScreenToggle()
  179. // global._caller.popup('bottom')
  180. }, this)
  181. //返回这个主元素
  182. return this._container
  183. },
  184. onRemove: function(map) {
  185. // Clean up the DOM
  186. }
  187. })
  188. //在L.control上添加一个search(封装好的函数)
  189. L.control.Search = function(options) {
  190. return new L.Control.Search(options)
  191. }
  192. //将自定义控件添加到地图上
  193. L.control.Search().addTo(global.map)
  194. },
  195. test() {
  196. console.log("test ok")
  197. },
  198. free() {
  199. player.free()
  200. checkPoint.free()
  201. route.free()
  202. }
  203. }