leafletHelper.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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(mapid, minZoom = 15, maxZoom = 20) {
  74. var url = 'static/map/' + mapid + '/{z}/{x}/{y}.png'
  75. global.map_layer = L.tileLayer(url, {
  76. minZoom: minZoom,
  77. maxZoom: maxZoom,
  78. tms: false, // 是否反转Y轴坐标
  79. attribution: '版权所有'
  80. }).addTo(global.map);
  81. },
  82. extendControl() {
  83. var that = this
  84. L.Control.Search = L.Control.extend({
  85. options: {
  86. position: 'topleft' //初始位置
  87. },
  88. // _container: null,
  89. // elCheckPoint: null,
  90. // elTrail: null,
  91. initialize: function(options) {
  92. L.Util.extend(this.options, options)
  93. },
  94. onAdd: function(map) {
  95. // console.log('onAdd', map)
  96. var caller = global._caller
  97. //创建Dom元素 L.DomUtil.create('元素类型', 'class类名')
  98. // this._container = L.DomUtil.create('div', 'leaflet-control-container')
  99. this._container = L.DomUtil.create('div', 'leaflet-bar leaflet-control')
  100. // var inp = L.DomUtil.create('div', 'leaflet-control-input')
  101. // var btn = L.DomUtil.create('button', 'leaflet-control-button')
  102. //设置Dom元素的内容
  103. // inp.id='inp' //可以为元素设置id
  104. // inp.innerHTML =
  105. // ' <input placeholder="天安门" ref="a" id="boox" style="width:150px;margin-right:20px;" /> '
  106. // btn.innerText = '搜索'
  107. this.elCheckPoint = L.DomUtil.create('a', 'leaflet-control-common')
  108. this.elCheckPoint.innerHTML = '<span>点位</span>'
  109. this.elPlayer = L.DomUtil.create('a', 'leaflet-control-common')
  110. this.elPlayer.innerHTML = '<span>玩家</span>'
  111. this.elPlayerTooltip = L.DomUtil.create('a', 'leaflet-control-common')
  112. this.elPlayerTooltip.innerHTML = '<span>提示</span>'
  113. this.elPlayerTrail = L.DomUtil.create('a', 'leaflet-control-common')
  114. this.elPlayerTrail.innerHTML = '<span>轨迹</span>'
  115. this.elList = L.DomUtil.create('a', 'leaflet-control-common')
  116. this.elList.innerHTML = '<span>列表</span>'
  117. // this._container.style.display = 'flex'
  118. this._container.appendChild(this.elCheckPoint)
  119. this._container.appendChild(this.elPlayer)
  120. this._container.appendChild(this.elPlayerTooltip)
  121. this._container.appendChild(this.elPlayerTrail)
  122. this._container.appendChild(this.elList)
  123. //注册事件
  124. L.DomEvent.addListener(this.elCheckPoint, 'click', function (ev) {
  125. L.DomEvent.stopPropagation(ev)
  126. L.DomEvent.preventDefault(ev)
  127. that.checkPoint.toggle()
  128. }, that.checkPoint)
  129. L.DomEvent.addListener(this.elPlayer, 'click', function (ev) {
  130. L.DomEvent.stopPropagation(ev)
  131. L.DomEvent.preventDefault(ev)
  132. that.player.togglePlayer()
  133. }, that.player)
  134. L.DomEvent.addListener(this.elPlayerTooltip, 'click', function (ev) {
  135. L.DomEvent.stopPropagation(ev)
  136. L.DomEvent.preventDefault(ev)
  137. that.player.toggleTooltip()
  138. }, that.player)
  139. L.DomEvent.addListener(this.elPlayerTrail, 'click', function (ev) {
  140. L.DomEvent.stopPropagation(ev)
  141. L.DomEvent.preventDefault(ev)
  142. that.player.toggleTrail()
  143. }, that.player)
  144. L.DomEvent.addListener(this.elList, 'click', function (ev) {
  145. L.DomEvent.stopPropagation(ev)
  146. L.DomEvent.preventDefault(ev)
  147. global._caller.popup('bottom')
  148. }, this)
  149. // L.DomEvent.preventDefault('click')
  150. //返回这个主元素
  151. return this._container
  152. },
  153. onRemove: function(map) {
  154. // Clean up the DOM
  155. }
  156. })
  157. //在L.control上添加一个search(封装好的函数)
  158. L.control.Search = function(options) {
  159. return new L.Control.Search(options)
  160. }
  161. //将自定义控件添加到地图上
  162. L.control.Search().addTo(global.map)
  163. },
  164. test() {
  165. console.log("test ok")
  166. },
  167. free() {
  168. player.free()
  169. checkPoint.free()
  170. }
  171. }