checkPoint.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // import L from 'leaflet'
  2. // import 'leaflet-clipper/dist/L.Clipper'
  3. // import * as turf from '@turf/turf'
  4. import config from '@/utils/map/sub/config'
  5. import global from '@/utils/map/sub/global'
  6. var toggleFlag = false
  7. export default {
  8. cpMarkLayerGroup: null, // 检查点标记图层组
  9. cpMemoLayerGroup: null, // 检查点备注图层组
  10. cpPathLayerGroup: null, // 检查点路线图层组
  11. init() {
  12. this.cpMarkLayerGroup = new L.featureGroup()
  13. this.cpMemoLayerGroup = new L.featureGroup()
  14. this.cpPathLayerGroup = new L.featureGroup()
  15. },
  16. // 即将开始地图缩放时触发本方法
  17. onZoomStart(e) {
  18. // this.cpMarkLayerGroup.remove()
  19. this.cpMemoLayerGroup.remove()
  20. this.cpPathLayerGroup.remove()
  21. },
  22. // 地图发生缩放时触发本方法
  23. onZoom(e) {
  24. },
  25. // 地图缩放结束时触发本方法
  26. onZoomEnd(e) {
  27. this.drawPath()
  28. // this.cpMarkLayerGroup.addTo(global.map)
  29. this.cpMemoLayerGroup.addTo(global.map)
  30. this.cpPathLayerGroup.addTo(global.map)
  31. this.cpMarkLayerGroup.bringToBack()
  32. this.cpMemoLayerGroup.bringToBack()
  33. this.cpPathLayerGroup.bringToBack()
  34. },
  35. toggle(flag) {
  36. // console.log('toggle:', flag)
  37. if (flag != null) {
  38. toggleFlag = !flag
  39. }
  40. if (toggleFlag) {
  41. this.cpMarkLayerGroup.removeFrom(global.map)
  42. this.cpMemoLayerGroup.removeFrom(global.map)
  43. this.cpPathLayerGroup.removeFrom(global.map)
  44. toggleFlag = false
  45. } else {
  46. this.cpMarkLayerGroup.addTo(global.map)
  47. this.cpMemoLayerGroup.addTo(global.map)
  48. this.cpPathLayerGroup.addTo(global.map)
  49. this.cpMarkLayerGroup.bringToBack()
  50. this.cpMemoLayerGroup.bringToBack()
  51. this.cpPathLayerGroup.bringToBack()
  52. toggleFlag = true
  53. }
  54. },
  55. drawAllCheckPoints() {
  56. if (this.cpMarkLayerGroup != null)
  57. this.cpMarkLayerGroup.clearLayers()
  58. if (this.cpMemoLayerGroup != null)
  59. this.cpMemoLayerGroup.clearLayers()
  60. for (let i = 0; i < global.checkPoints.length; i++) {
  61. this.drawOneCheckPoint(global.checkPoints[i].cp_id)
  62. }
  63. },
  64. drawOneCheckPoint(cpId) {
  65. // var that = this
  66. var checkPoint = global.getCheckPointById(cpId)
  67. if (checkPoint == null) {
  68. console.warn('[drawOneCheckPoint] 关键数据为空', checkPoint)
  69. return
  70. }
  71. // var marker = L.circle([checkPoint.latitude, checkPoint.longitude], config.gStyle.checkPoint.default)
  72. var marker = L.circleMarker([checkPoint.latitude, checkPoint.longitude], config.gStyle.checkPoint.default)
  73. .addTo(this.cpMarkLayerGroup)
  74. // .addTo(global.map)
  75. // .bindPopup("Hello, I'm a Marker!<br><img src='my-image.png' width='100'>").openPopup();
  76. // .bindTooltip(`检查点:${checkPoint.serial_num}`, config.gStyle.checkPoint.tooltip)
  77. var myIcon = L.divIcon({
  78. html: '<div>CP:' + checkPoint.serial_num + '</div>',
  79. className: 'my-div-icon',
  80. iconSize: [60, 20], //宽高
  81. iconAnchor: [30, 35] //文字标注相对位置
  82. });
  83. var markerMemo = L.marker([checkPoint.latitude, checkPoint.longitude], {
  84. icon: myIcon,
  85. // zIndexOffset: -100
  86. })
  87. .addTo(this.cpMemoLayerGroup)
  88. // this.cpMarkLayerGroup.addTo(global.map)
  89. // this.cpMemoLayerGroup.addTo(global.map)
  90. this.cpMarkLayerGroup.bringToBack()
  91. this.cpMemoLayerGroup.bringToBack()
  92. checkPoint.marker = marker
  93. checkPoint.markerMemo = markerMemo
  94. },
  95. drawPath() {
  96. if (this.cpPathLayerGroup != null) {
  97. this.cpPathLayerGroup.clearLayers()
  98. }
  99. var latlngs = []
  100. for (var i = 0; i < global.checkPoints.length; i++) {
  101. var cp = global.checkPoints[i]
  102. latlngs.push([cp.latitude, cp.longitude])
  103. }
  104. var radius = config.gStyle.checkPoint.default.radius
  105. var Lines = this.getIntersection(latlngs, radius) // 获取(圆与路线的)交叉点坐标
  106. // var polyline = L.polyline(latlngs, config.gStyle.checkPointPath.default)
  107. var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default)
  108. .addTo(this.cpPathLayerGroup)
  109. // this.cpPathLayerGroup.addTo(global.map)
  110. this.cpPathLayerGroup.bringToBack()
  111. },
  112. // 获取(圆与路线的)交叉点坐标
  113. getIntersection(LatLngArry, radius) {
  114. // var LatLngArry = [
  115. // [36.672562, 117.127572],
  116. // [36.67165, 117.129262],
  117. // [36.671409, 117.126752]
  118. // ]
  119. var PointArry = []
  120. // var Circles = []
  121. var radius = 20 // 圆的半径 px
  122. var DistanceArry = []
  123. var Lines = []
  124. for (let i = 0; i < LatLngArry.length; i++) {
  125. // 给定地理坐标,返回相应的像素坐标 (相对于原点像素)
  126. let point = global.map.latLngToLayerPoint(LatLngArry[i])
  127. PointArry.push(point)
  128. // let circle = L.circle(LatLngArry[i], {
  129. // radius: radius
  130. // }).addTo(global.map);
  131. // Circles.push(circle)
  132. if (i > 0) {
  133. // 计算相邻两个点之间的距离
  134. let distance = L.point(PointArry[i]).distanceTo(L.point(PointArry[i-1]))
  135. DistanceArry.push(distance)
  136. // 计算圆半径占比
  137. let per = parseFloat(radius.toFixed(16) / distance.toFixed(16)).toFixed(16)
  138. // console.log('per:', per, i)
  139. // console.log('PointArry:', PointArry[i])
  140. let offsetX = parseFloat((PointArry[i].x.toFixed(16) - PointArry[i-1].x.toFixed(16)) * per).toFixed(16)
  141. let offsetY = parseFloat((PointArry[i].y.toFixed(16) - PointArry[i-1].y.toFixed(16)) * per).toFixed(16)
  142. // console.log('offset:', offsetX, offsetY)
  143. // 给定相对于原点像素的像素坐标, 返回相应的地理坐标(对于当前缩放级别)
  144. let line = [
  145. global.map.layerPointToLatLng([
  146. parseFloat(PointArry[i-1].x) + parseFloat(offsetX),
  147. parseFloat(PointArry[i-1].y) + parseFloat(offsetY)
  148. ]),
  149. global.map.layerPointToLatLng([
  150. parseFloat(PointArry[i].x) - parseFloat(offsetX),
  151. parseFloat(PointArry[i].y) - parseFloat(offsetY)
  152. ])
  153. ]
  154. Lines.push(line)
  155. }
  156. }
  157. // console.log('DistanceArry', DistanceArry)
  158. // console.log('Lines', Lines)
  159. // var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default).addTo(global.map)
  160. return Lines
  161. },
  162. test() {
  163. },
  164. free() {
  165. }
  166. }