flight-area.vue 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <div class="project-flight-area-wrapper height-100">
  3. <a-spin :spinning="loading" :delay="300" tip="loading" size="large" class="height-100">
  4. <Title title="Custom Flight Area" />
  5. <FlightAreaPanel :data="flightAreaList" @location-area="clickArea" @delete-area="deleteAreaById"/>
  6. <DividerLine />
  7. <FlightAreaSyncPanel />
  8. </a-spin>
  9. </div>
  10. </template>
  11. <script lang="ts" setup>
  12. import { onMounted, ref } from 'vue'
  13. import Title from '/@/components/workspace/Title.vue'
  14. import DividerLine from '/@/components/workspace/DividerLine.vue'
  15. import FlightAreaPanel from '/@/components/flight-area/FlightAreaPanel.vue'
  16. import FlightAreaSyncPanel from '/@/components/flight-area/FlightAreaSyncPanel.vue'
  17. import { GetFlightArea, deleteFlightArea, getFlightAreaList } from '/@/api/flight-area'
  18. import { useGMapCover } from '/@/hooks/use-g-map-cover'
  19. import { useMapTool } from '/@/hooks/use-map-tool'
  20. import { EFlightAreaType, EGeometryType, FlightAreaUpdate } from '/@/types/flight-area'
  21. import { useFlightArea } from '/@/components/flight-area/use-flight-area'
  22. import { useFlightAreaUpdateEvent } from '/@/components/flight-area/use-flight-area-update'
  23. const loading = ref(false)
  24. const flightAreaList = ref<GetFlightArea[]>([])
  25. let useGMapCoverHook = useGMapCover()
  26. let useMapToolHook = useMapTool()
  27. onMounted(() => {
  28. getDataList()
  29. })
  30. const { getGcj02 } = useFlightArea()
  31. const initMapFlightArea = () => {
  32. useMapToolHook = useMapTool()
  33. useGMapCoverHook = useGMapCover()
  34. flightAreaList.value.forEach(area => {
  35. updateMapFlightArea(area)
  36. })
  37. }
  38. const updateMapFlightArea = (area: GetFlightArea) => {
  39. switch (area.content.geometry.type) {
  40. case EGeometryType.CIRCLE:
  41. useGMapCoverHook.updateFlightAreaCircle(area.area_id, area.name, area.content.geometry.radius, getGcj02(area.content.geometry.coordinates), area.status, area.type)
  42. break
  43. case 'Polygon':
  44. useGMapCoverHook.updateFlightAreaPolygon(area.area_id, area.name, getGcj02(area.content.geometry.coordinates[0]), area.status, area.type)
  45. break
  46. }
  47. }
  48. const getDataList = () => {
  49. loading.value = true
  50. getFlightAreaList().then(res => {
  51. flightAreaList.value = res.data
  52. setTimeout(initMapFlightArea, 2000)
  53. }).finally(() => {
  54. loading.value = false
  55. })
  56. }
  57. const deleteAreaById = (areaId: string) => {
  58. deleteFlightArea(areaId)
  59. }
  60. const deleteArea = (area: FlightAreaUpdate) => {
  61. flightAreaList.value = flightAreaList.value.filter(data => data.area_id !== area.area_id)
  62. useGMapCoverHook.removeCoverFromMap(area.area_id)
  63. }
  64. const updateArea = (area: FlightAreaUpdate) => {
  65. flightAreaList.value = flightAreaList.value.map(data => data.area_id === area.area_id ? area : data)
  66. updateMapFlightArea(area as GetFlightArea)
  67. }
  68. const addArea = (area: FlightAreaUpdate) => {
  69. flightAreaList.value.push(area as GetFlightArea)
  70. updateMapFlightArea(area as GetFlightArea)
  71. }
  72. useFlightAreaUpdateEvent(addArea, deleteArea, updateArea)
  73. const clickArea = (area: GetFlightArea) => {
  74. let coordinate
  75. switch (area.content.geometry.type) {
  76. case EGeometryType.CIRCLE:
  77. coordinate = getGcj02(area.content.geometry.coordinates)
  78. break
  79. case 'Polygon':
  80. coordinate = useGMapCoverHook.calcPolygonPosition(getGcj02(area.content.geometry.coordinates[0]))
  81. break
  82. }
  83. useMapToolHook.panTo(coordinate)
  84. }
  85. </script>