leafletHelper.js 6.8 KB

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