confirmArea.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <div class="edit-map">
  3. <custom-header name="确认农场区域"></custom-header>
  4. <div class="edit-map-content">
  5. <div class="edit-map-tip">操作提示:拖动圆点,即可调整地块边界</div>
  6. <div class="map-container" ref="mapContainer"></div>
  7. <div class="edit-map-footer">
  8. <div class="footer-back" @click="goBack">
  9. <img class="back-icon" src="@/assets/img/home/go-back.png" alt="" />
  10. </div>
  11. <div class="footer-address-box">
  12. <div class="footer-address">
  13. <div class="address-title">111</div>
  14. <div class="address-detail">2222</div>
  15. </div>
  16. <div class="address-btn" @click="goBack">修改地址</div>
  17. </div>
  18. <div class="edit-map-footer-btn">
  19. <div class="btn-cancel" @click="goBack">取消</div>
  20. <div class="btn-confirm" @click="confirm">确认</div>
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. <!-- 地形/建模航线提示弹窗(复用 droneConsultPopup:terrainRoute 立即获取 → terrainRouteSuccess 航线已生成) -->
  26. <drone-consult-popup v-model:show="showTerrainRoutePopup" :type="terrainPopupType"
  27. @confirm="onTerrainRouteConfirm" />
  28. </template>
  29. <script setup>
  30. import customHeader from "@/components/customHeader.vue";
  31. import DroneConsultPopup from "@/components/popup/droneConsultPopup.vue";
  32. import { ref, onMounted, onActivated, onDeactivated } from "vue";
  33. import DrawRegionMap from "./map/drawRegionMap.js";
  34. import { useRouter, useRoute } from "vue-router";
  35. import { convertPointToArray } from "@/utils/index";
  36. import { ElMessage, ElMessageBox } from "element-plus";
  37. const router = useRouter();
  38. const route = useRoute();
  39. const mapContainer = ref(null);
  40. const drawRegionMap = new DrawRegionMap();
  41. const type = ref('droneConsult');
  42. const gardenName = ref('荔博园')
  43. const showTerrainRoutePopup = ref(false);
  44. /** 弹窗类型:terrainRoute 立即获取 | terrainRouteSuccess 航线已生成 */
  45. const terrainPopupType = ref("terrainRoute");
  46. onMounted(() => {
  47. const point = route.query.mapCenter || "POINT (113.6142086995688 23.585836479509055)";
  48. drawRegionMap.initMap(point, mapContainer.value);
  49. });
  50. onActivated(() => {
  51. const point = route.query.mapCenter || "POINT (113.6142086995688 23.585836479509055)";
  52. // 先绘制地块
  53. const polygonData = route.query.polygonData;
  54. if (polygonData) {
  55. drawRegionMap.setAreaGeometry(JSON.parse(polygonData)?.geometryArr);
  56. }
  57. // 再设置地图中心位置,确保视图在 mapCenter
  58. drawRegionMap.setMapPosition(convertPointToArray(point));
  59. });
  60. onDeactivated(() => {
  61. drawRegionMap.clearLayer()
  62. })
  63. const goBack = () => {
  64. // drawRegionMap.clearLayer()
  65. router.back()
  66. };
  67. const onTerrainRouteConfirm = () => {
  68. if (terrainPopupType.value === "terrainRoute") {
  69. setTimeout(() => {
  70. terrainPopupType.value = "terrainRouteSuccess";
  71. showTerrainRoutePopup.value = true;
  72. }, 1000);
  73. } else {
  74. showTerrainRoutePopup.value = false;
  75. router.back();
  76. }
  77. };
  78. const confirm = () => {
  79. if (type.value === "droneConsult") {
  80. terrainPopupType.value = "terrainRoute";
  81. showTerrainRoutePopup.value = true;
  82. }
  83. // const polygonData = drawRegionMap.getAreaGeometry();
  84. // sessionStorage.setItem("drawRegionPolygonData", JSON.stringify(polygonData));
  85. // router.back();
  86. };
  87. </script>
  88. <style lang="scss" scoped>
  89. .edit-map {
  90. width: 100%;
  91. height: 100vh;
  92. overflow: hidden;
  93. .edit-map-content {
  94. width: 100%;
  95. height: 100%;
  96. position: relative;
  97. .edit-map-tip {
  98. position: absolute;
  99. top: 23px;
  100. left: calc(50% - 256px / 2);
  101. z-index: 1;
  102. font-size: 12px;
  103. color: #fff;
  104. padding: 9px 20px;
  105. background: rgba(0, 0, 0, 0.5);
  106. border-radius: 20px;
  107. }
  108. .map-container {
  109. width: 100%;
  110. height: 100%;
  111. }
  112. .edit-map-footer {
  113. position: absolute;
  114. bottom: 80px;
  115. left: 12px;
  116. width: calc(100% - 24px);
  117. display: flex;
  118. flex-direction: column;
  119. align-items: flex-end;
  120. .footer-back {
  121. padding: 6px 7px 9px;
  122. background: #fff;
  123. border-radius: 8px;
  124. .back-icon {
  125. width: 20px;
  126. height: 18px;
  127. }
  128. }
  129. .footer-address-box {
  130. width: 100%;
  131. box-sizing: border-box;
  132. margin: 19px 0 14px 0;
  133. display: flex;
  134. justify-content: space-between;
  135. align-items: center;
  136. background: #fff;
  137. border-radius: 14px;
  138. padding: 14px 12px;
  139. .footer-address {
  140. font-size: 12px;
  141. color: rgba(0, 0, 0, 0.6);
  142. .address-title {
  143. font-weight: 500;
  144. font-size: 16px;
  145. color: #000;
  146. }
  147. }
  148. .address-btn {
  149. color: #2199f8;
  150. border: 1px solid #2199f8;
  151. border-radius: 25px;
  152. padding: 6px 10px;
  153. flex: none;
  154. }
  155. }
  156. .edit-map-footer-btn {
  157. display: flex;
  158. justify-content: center;
  159. align-items: center;
  160. width: 100%;
  161. gap: 8px;
  162. div {
  163. flex: 1;
  164. max-width: 100px;
  165. text-align: center;
  166. color: #666666;
  167. font-size: 14px;
  168. padding: 8px 0;
  169. border-radius: 25px;
  170. background: #fff;
  171. }
  172. .btn-confirm {
  173. background: #000;
  174. background-image: linear-gradient(180deg, #76c3ff 0%, #2199f8 100%);
  175. color: #fff;
  176. }
  177. }
  178. }
  179. }
  180. }
  181. </style>