leafletHelper.js 6.3 KB

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