route.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. import store from '@/store/index'
  7. var toggleFlag = store.state.mapControlRoute
  8. export default {
  9. cpMarkLayerGroup: null, // 检查点标记图层组
  10. cpMemoLayerGroup: null, // 检查点备注图层组
  11. cpPathLayerGroup: null, // 检查点路线图层组
  12. init() {
  13. this.cpMarkLayerGroup = new L.featureGroup()
  14. this.cpMemoLayerGroup = new L.featureGroup()
  15. this.cpPathLayerGroup = new L.featureGroup()
  16. },
  17. // 即将开始地图缩放时触发本方法
  18. onZoomStart(e) {
  19. // this.cpMarkLayerGroup.remove()
  20. this.cpMemoLayerGroup.remove()
  21. this.cpPathLayerGroup.remove()
  22. },
  23. // 地图发生缩放时触发本方法
  24. onZoom(e) {},
  25. // 地图缩放结束时触发本方法
  26. onZoomEnd(e) {
  27. if (toggleFlag) {
  28. this.drawAllPath()
  29. // this.cpMarkLayerGroup.addTo(global.map)
  30. this.cpMemoLayerGroup.addTo(global.map)
  31. this.cpPathLayerGroup.addTo(global.map)
  32. this.cpMarkLayerGroup.bringToBack()
  33. this.cpMemoLayerGroup.bringToBack()
  34. this.cpPathLayerGroup.bringToBack()
  35. }
  36. },
  37. toggle(flag) {
  38. // console.log('toggle:', flag)
  39. if (flag != null) {
  40. toggleFlag = !flag
  41. }
  42. if (toggleFlag) {
  43. this.cpMarkLayerGroup.removeFrom(global.map)
  44. this.cpMemoLayerGroup.removeFrom(global.map)
  45. this.cpPathLayerGroup.removeFrom(global.map)
  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. }
  54. toggleFlag = !toggleFlag
  55. // console.log('toggleFlag:', toggleFlag)
  56. store.commit('setMapControlRoute', toggleFlag)
  57. },
  58. drawAllRoutes() {
  59. // console.log("[drawAllRoutes] routes", global.routes)
  60. if (this.cpMarkLayerGroup != null)
  61. this.cpMarkLayerGroup.clearLayers()
  62. if (this.cpMemoLayerGroup != null)
  63. this.cpMemoLayerGroup.clearLayers()
  64. for (let i = 0; i < global.routes.length; i++) {
  65. this.drawOneRoute(global.routes[i].id)
  66. }
  67. },
  68. drawOneRoute(rtId) {
  69. // var that = this
  70. var cpList = global.getRouteById(rtId).control_point_sorted_list
  71. if (cpList == null) {
  72. console.warn('[drawOneRoute] 关键数据为空', cpList)
  73. return
  74. }
  75. // console.log('[drawOneRoute] cpList', cpList)
  76. var type = ''
  77. for (var i = 0; i < cpList.length; i++) {
  78. if (i == 0) {
  79. type = 'start'
  80. } else if (i == cpList.length - 1) {
  81. type = 'end'
  82. } else {
  83. type = ''
  84. }
  85. let res = this.drawOnePoint(cpList[i], type)
  86. cpList[i].marker = res.marker
  87. cpList[i].markerMemo = res.markerMemo
  88. }
  89. },
  90. drawOnePoint(data, type="") {
  91. // console.log('[drawOnePoint] data', data)
  92. if (data == null) {
  93. console.warn('[drawOnePoint] 关键数据为空', data)
  94. return
  95. }
  96. var position = data.ciPosition
  97. var radius = config.gStyle.checkPoint.default.radius
  98. var iconSize = [radius*2, radius*2]
  99. var html = ""
  100. var iconUrl = ""
  101. var marker = ""
  102. if (type == "start") {
  103. // html = '<div>开始点</div>'
  104. iconUrl = "static/map/point_start.png"
  105. var markerIcon = L.icon({
  106. iconUrl: iconUrl,
  107. iconSize: iconSize,
  108. // iconSize: [30, 30],
  109. // iconAnchor: [10, 30]
  110. });
  111. var marker = L.marker([position.latitude, position.longitude], {
  112. icon: markerIcon
  113. })
  114. .addTo(this.cpMarkLayerGroup)
  115. } else if (type == "end") {
  116. // html = '<div>结束点</div>'
  117. // html = '<div>' + data.orderNO + '</div>'
  118. iconUrl = "static/map/point_end.png"
  119. var markerIcon = L.icon({
  120. iconUrl: iconUrl,
  121. iconSize: iconSize,
  122. // iconSize: [30, 30],
  123. // iconAnchor: [10, 30]
  124. });
  125. var marker = L.marker([position.latitude, position.longitude], {
  126. icon: markerIcon
  127. })
  128. .addTo(this.cpMarkLayerGroup)
  129. }
  130. else { // 中间点
  131. // html = '<div>' + data.sn + '</div>'
  132. html = '<div>' + data.orderNO + '</div>'
  133. iconUrl = "static/map/point.png"
  134. var markerIcon = L.icon({
  135. iconUrl: iconUrl,
  136. iconSize: iconSize,
  137. // iconSize: [30, 30],
  138. // iconAnchor: [10, 30]
  139. });
  140. var marker = L.marker([position.latitude, position.longitude], {
  141. icon: markerIcon
  142. })
  143. .addTo(this.cpMarkLayerGroup)
  144. // marker = L.circleMarker([position.latitude, position.longitude], config.gStyle.checkPoint.default)
  145. // .addTo(this.cpMarkLayerGroup)
  146. }
  147. var myIcon = L.divIcon({
  148. html: html,
  149. className: 'my-div-icon',
  150. iconSize: [60, 20], //宽高
  151. iconAnchor: [30, 30] //文字标注相对位置
  152. });
  153. var markerMemo = L.marker([position.latitude, position.longitude], {
  154. icon: myIcon,
  155. // zIndexOffset: -100
  156. })
  157. .addTo(this.cpMemoLayerGroup)
  158. // this.cpMarkLayerGroup.addTo(global.map)
  159. // this.cpMemoLayerGroup.addTo(global.map)
  160. this.cpMarkLayerGroup.bringToBack()
  161. this.cpMemoLayerGroup.bringToBack()
  162. return {
  163. marker: marker,
  164. markerMemo: markerMemo
  165. }
  166. },
  167. drawAllPath() {
  168. // console.log("[drawAllPath] routes", global.routes)
  169. if (this.cpPathLayerGroup != null) {
  170. this.cpPathLayerGroup.clearLayers()
  171. }
  172. for (let i = 0; i < global.routes.length; i++) {
  173. this.drawOnePath(global.routes[i].id)
  174. }
  175. },
  176. drawOnePath(rtId) {
  177. var cpList = global.getRouteById(rtId).control_point_sorted_list
  178. // console.log("[drawOnePath] cpList", cpList)
  179. var latlngs = []
  180. for (var i = 0; i < cpList.length; i++) {
  181. var position = cpList[i].ciPosition
  182. if (position.latitude != null && position.longitude != null) {
  183. latlngs.push([position.latitude, position.longitude])
  184. }
  185. }
  186. var radius = config.gStyle.checkPoint.default.radius
  187. var Lines = this.getIntersection(latlngs, radius) // 获取(圆与路线的)交叉点坐标
  188. // var polyline = L.polyline(latlngs, config.gStyle.checkPointPath.default)
  189. var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default)
  190. .addTo(this.cpPathLayerGroup)
  191. // this.cpPathLayerGroup.addTo(global.map)
  192. this.cpPathLayerGroup.bringToBack()
  193. },
  194. // 获取(圆与路线的)交叉点坐标
  195. getIntersection(LatLngArry, radius) {
  196. // var LatLngArry = [
  197. // [36.672562, 117.127572],
  198. // [36.67165, 117.129262],
  199. // [36.671409, 117.126752]
  200. // ]
  201. var PointArry = []
  202. // var Circles = []
  203. // var radius = 20 // 圆的半径 px
  204. var DistanceArry = []
  205. var Lines = []
  206. for (let i = 0; i < LatLngArry.length; i++) {
  207. // 给定地理坐标,返回相应的像素坐标 (相对于原点像素)
  208. let point = global.map.latLngToLayerPoint(LatLngArry[i])
  209. PointArry.push(point)
  210. // let circle = L.circle(LatLngArry[i], {
  211. // radius: radius
  212. // }).addTo(global.map);
  213. // Circles.push(circle)
  214. if (i > 0) {
  215. // 计算相邻两个点之间的距离
  216. let distance = L.point(PointArry[i]).distanceTo(L.point(PointArry[i - 1]))
  217. DistanceArry.push(distance)
  218. // 计算圆半径占比
  219. let per = parseFloat(radius.toFixed(16) / distance.toFixed(16)).toFixed(16)
  220. // console.log('per:', per, i)
  221. // console.log('PointArry:', PointArry[i])
  222. let offsetX = parseFloat((PointArry[i].x.toFixed(16) - PointArry[i - 1].x.toFixed(16)) * per).toFixed(
  223. 16)
  224. let offsetY = parseFloat((PointArry[i].y.toFixed(16) - PointArry[i - 1].y.toFixed(16)) * per).toFixed(
  225. 16)
  226. // console.log('offset:', offsetX, offsetY)
  227. // 给定相对于原点像素的像素坐标, 返回相应的地理坐标(对于当前缩放级别)
  228. let line = [
  229. global.map.layerPointToLatLng([
  230. parseFloat(PointArry[i - 1].x) + parseFloat(offsetX),
  231. parseFloat(PointArry[i - 1].y) + parseFloat(offsetY)
  232. ]),
  233. global.map.layerPointToLatLng([
  234. parseFloat(PointArry[i].x) - parseFloat(offsetX),
  235. parseFloat(PointArry[i].y) - parseFloat(offsetY)
  236. ])
  237. ]
  238. Lines.push(line)
  239. }
  240. }
  241. // console.log('DistanceArry', DistanceArry)
  242. // console.log('Lines', Lines)
  243. // var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default).addTo(global.map)
  244. return Lines
  245. },
  246. test() {},
  247. free() {}
  248. }