route.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. onZoomEnd(e) {
  26. if (toggleFlag) {
  27. this.drawAllPath()
  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. },
  36. toggle(flag) {
  37. // console.log('toggle:', flag)
  38. if (flag != null) {
  39. toggleFlag = !flag
  40. }
  41. if (toggleFlag) {
  42. this.cpMarkLayerGroup.removeFrom(global.map)
  43. this.cpMemoLayerGroup.removeFrom(global.map)
  44. this.cpPathLayerGroup.removeFrom(global.map)
  45. toggleFlag = false
  46. } else {
  47. this.cpMarkLayerGroup.addTo(global.map)
  48. this.cpMemoLayerGroup.addTo(global.map)
  49. this.cpPathLayerGroup.addTo(global.map)
  50. this.cpMarkLayerGroup.bringToBack()
  51. this.cpMemoLayerGroup.bringToBack()
  52. this.cpPathLayerGroup.bringToBack()
  53. toggleFlag = true
  54. }
  55. },
  56. drawAllRoutes() {
  57. // console.log("[drawAllRoutes] routes", global.routes)
  58. if (this.cpMarkLayerGroup != null)
  59. this.cpMarkLayerGroup.clearLayers()
  60. if (this.cpMemoLayerGroup != null)
  61. this.cpMemoLayerGroup.clearLayers()
  62. for (let i = 0; i < global.routes.length; i++) {
  63. this.drawOneRoute(global.routes[i].id)
  64. }
  65. },
  66. drawOneRoute(rtId) {
  67. // var that = this
  68. var cpList = global.getRouteById(rtId).controlPointSortedListList
  69. if (cpList == null) {
  70. console.warn('[drawOneRoute] 关键数据为空', cpList)
  71. return
  72. }
  73. // console.warn('[drawOneRoute] cpList', cpList)
  74. for (var i = 0; i < cpList.length; i++) {
  75. let res = this.drawOnePoint(cpList[i])
  76. cpList[i].marker = res.marker
  77. cpList[i].markerMemo = res.markerMemo
  78. }
  79. },
  80. drawOnePoint(data) {
  81. // console.warn('[drawOnePoint] data', data)
  82. if (data == null) {
  83. console.warn('[drawOnePoint] 关键数据为空', data)
  84. return
  85. }
  86. var position = data.ciposition
  87. var marker = L.circleMarker([position.latitude, position.longitude], config.gStyle.checkPoint.default)
  88. .addTo(this.cpMarkLayerGroup)
  89. // .addTo(global.map)
  90. // .bindPopup("Hello, I'm a Marker!<br><img src='my-image.png' width='100'>").openPopup();
  91. // .bindTooltip(`检查点:${route.serial_num}`, config.gStyle.checkPoint.tooltip)
  92. var myIcon = L.divIcon({
  93. html: '<div>' + data.sn + '</div>',
  94. className: 'my-div-icon',
  95. iconSize: [60, 20], //宽高
  96. iconAnchor: [30, 35] //文字标注相对位置
  97. });
  98. var markerMemo = L.marker([position.latitude, position.longitude], {
  99. icon: myIcon,
  100. // zIndexOffset: -100
  101. })
  102. .addTo(this.cpMemoLayerGroup)
  103. // this.cpMarkLayerGroup.addTo(global.map)
  104. // this.cpMemoLayerGroup.addTo(global.map)
  105. this.cpMarkLayerGroup.bringToBack()
  106. this.cpMemoLayerGroup.bringToBack()
  107. return {
  108. marker: marker,
  109. markerMemo: markerMemo
  110. }
  111. },
  112. drawAllPath() {
  113. // console.log("[drawAllPath] routes", global.routes)
  114. if (this.cpPathLayerGroup != null) {
  115. this.cpPathLayerGroup.clearLayers()
  116. }
  117. for (let i = 0; i < global.routes.length; i++) {
  118. this.drawOnePath(global.routes[i].id)
  119. }
  120. },
  121. drawOnePath(rtId) {
  122. var cpList = global.getRouteById(rtId).controlPointSortedListList
  123. // console.log("[drawOnePath] cpList", cpList)
  124. var latlngs = []
  125. for (var i = 0; i < cpList.length; i++) {
  126. var position = cpList[i].ciposition
  127. if (position.latitude != null && position.longitude != null) {
  128. latlngs.push([position.latitude, position.longitude])
  129. }
  130. }
  131. var radius = config.gStyle.checkPoint.default.radius
  132. // var Lines = this.getIntersection(latlngs, radius) // 获取(圆与路线的)交叉点坐标
  133. // // var polyline = L.polyline(latlngs, config.gStyle.checkPointPath.default)
  134. // var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default)
  135. // .addTo(this.cpPathLayerGroup)
  136. // // this.cpPathLayerGroup.addTo(global.map)
  137. // this.cpPathLayerGroup.bringToBack()
  138. },
  139. // 获取(圆与路线的)交叉点坐标
  140. getIntersection(LatLngArry, radius) {
  141. // var LatLngArry = [
  142. // [36.672562, 117.127572],
  143. // [36.67165, 117.129262],
  144. // [36.671409, 117.126752]
  145. // ]
  146. var PointArry = []
  147. // var Circles = []
  148. var radius = 20 // 圆的半径 px
  149. var DistanceArry = []
  150. var Lines = []
  151. for (let i = 0; i < LatLngArry.length; i++) {
  152. // 给定地理坐标,返回相应的像素坐标 (相对于原点像素)
  153. let point = global.map.latLngToLayerPoint(LatLngArry[i])
  154. PointArry.push(point)
  155. // let circle = L.circle(LatLngArry[i], {
  156. // radius: radius
  157. // }).addTo(global.map);
  158. // Circles.push(circle)
  159. if (i > 0) {
  160. // 计算相邻两个点之间的距离
  161. let distance = L.point(PointArry[i]).distanceTo(L.point(PointArry[i - 1]))
  162. DistanceArry.push(distance)
  163. // 计算圆半径占比
  164. let per = parseFloat(radius.toFixed(16) / distance.toFixed(16)).toFixed(16)
  165. // console.log('per:', per, i)
  166. // console.log('PointArry:', PointArry[i])
  167. let offsetX = parseFloat((PointArry[i].x.toFixed(16) - PointArry[i - 1].x.toFixed(16)) * per).toFixed(
  168. 16)
  169. let offsetY = parseFloat((PointArry[i].y.toFixed(16) - PointArry[i - 1].y.toFixed(16)) * per).toFixed(
  170. 16)
  171. // console.log('offset:', offsetX, offsetY)
  172. // 给定相对于原点像素的像素坐标, 返回相应的地理坐标(对于当前缩放级别)
  173. let line = [
  174. global.map.layerPointToLatLng([
  175. parseFloat(PointArry[i - 1].x) + parseFloat(offsetX),
  176. parseFloat(PointArry[i - 1].y) + parseFloat(offsetY)
  177. ]),
  178. global.map.layerPointToLatLng([
  179. parseFloat(PointArry[i].x) - parseFloat(offsetX),
  180. parseFloat(PointArry[i].y) - parseFloat(offsetY)
  181. ])
  182. ]
  183. Lines.push(line)
  184. }
  185. }
  186. // console.log('DistanceArry', DistanceArry)
  187. // console.log('Lines', Lines)
  188. // var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default).addTo(global.map)
  189. return Lines
  190. },
  191. test() {},
  192. free() {}
  193. }