tool.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <div class="tool-com __box-shadow">
  3. <div class="item" @click="mapFunc.measure('line')">
  4. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-cjl.png" alt=""/>测距离
  5. </div>
  6. <div class="item" @click="mapFunc.measure('circle')">
  7. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-cymj.png" alt=""/>测圆面积
  8. </div>
  9. <div class="item" @click="mapFunc.measure('rectangle')">
  10. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-cjxmj.png" alt=""/>测矩形面积
  11. </div>
  12. <div class="item" @click="handleDraw({featureType: 'Point'})">
  13. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-bz.png" alt=""/>标注
  14. </div>
  15. <div class="item" @click="handleDraw({featureType: 'LineString'})">
  16. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-hx.png" alt=""/>画线
  17. </div>
  18. <div class="item" @click="handleDraw({featureType: 'Polygon', rectangle: true})">
  19. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-hjx.png" alt=""/>画矩形
  20. </div>
  21. <div class="item" @click="handleDraw({featureType: 'Polygon'})">
  22. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-hdbx.png" alt=""/>画多边形
  23. </div>
  24. <div class="item" @click="handleDraw({featureType: 'Circle'})">
  25. <img src="@/assets/images/gis-layout/gis-layout-tools_tool-hy.png" alt=""/>画圆
  26. </div>
  27. <div class="close-dom" ref="ref_close">
  28. <img src="@/components/easyMap/images/close.png" alt="" class="__hover" @click="onClose"/>
  29. </div>
  30. </div>
  31. </template>
  32. <script lang="ts">
  33. import {
  34. defineComponent,
  35. computed,
  36. onMounted,
  37. ref,
  38. reactive,
  39. watch,
  40. getCurrentInstance,
  41. ComponentInternalInstance,
  42. toRefs,
  43. nextTick
  44. } from 'vue'
  45. import {useStore} from 'vuex'
  46. import {useRouter, useRoute} from 'vue-router'
  47. import {ElMessage, ElMessageBox} from "element-plus";
  48. import './map.scss'
  49. import * as ToolDraw from './tool-draw'
  50. import * as ol from "ol";
  51. import store from "@/store";
  52. export default defineComponent({
  53. name: '',
  54. components: {},
  55. props: {
  56. map: {
  57. required: true
  58. },
  59. mapFunc: {
  60. required: true
  61. }
  62. },
  63. setup(props, {emit}) {
  64. const store = useStore();
  65. const router = useRouter();
  66. const route = useRoute();
  67. const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
  68. const state = reactive({
  69. closeOverlay: <any>null,
  70. tempUUID: ''
  71. })
  72. const ref_close = ref()
  73. const handleDraw = (obj) => {
  74. const config = Object.assign(ToolDraw.getBaseDrawConfig(), obj)
  75. if (config.featureType === 'Point') {
  76. config.isPoint = true
  77. } else if (config.featureType === 'LineString') {
  78. config.isLineString = true
  79. } else if (config.featureType === 'Polygon') {
  80. config.isPolygon = true
  81. }
  82. ToolDraw.draw(props.map, config)
  83. }
  84. const onClose = () => {
  85. const l = props.map?.getLayers().getArray().filter(v => v.get('layerName') === 'toolDrawViewsLayer')?.[0]
  86. if (l) {
  87. const feat = l.getSource().getFeatureById(state.tempUUID)
  88. if (feat) {
  89. l.getSource().removeFeature(feat)
  90. state.tempUUID = ''
  91. state.closeOverlay.getElement().style.display = 'none'
  92. state.closeOverlay.setPosition(undefined)
  93. ToolDraw.refreshModify(props.map, l.getSource())
  94. }
  95. }
  96. }
  97. onMounted(() => {
  98. store.commit('gis/SET_IS_TOOLING', false)
  99. const id = 'toolOverlay'
  100. if (props.map?.getOverlayById(id)) {
  101. state.closeOverlay = props.map?.getOverlayById(id)
  102. } else {
  103. state.closeOverlay = new ol.Overlay({
  104. id: id,
  105. element: ref_close.value,
  106. autoPan: false,
  107. offset: [0, -10],
  108. positioning: 'bottom-center',
  109. stopEvent: true,
  110. autoPanAnimation: {
  111. duration: 250
  112. }
  113. })
  114. props.map?.addOverlay(state.closeOverlay)
  115. props.map?.on('singleclick', (e) => {
  116. let flag = false
  117. props.map?.forEachFeatureAtPixel(e.pixel, (f) => {
  118. if (!flag && f.get('layerName') === 'toolDrawViewsLayer' && f.get('isInit')) {
  119. flag = true
  120. if (state.tempUUID !== f.getId()) {
  121. state.tempUUID = f.getId()
  122. state.closeOverlay.getElement().style.display = 'unset'
  123. state.closeOverlay.setPosition(e.coordinate)
  124. } else {
  125. state.tempUUID = ''
  126. state.closeOverlay.setPosition(undefined)
  127. }
  128. }
  129. }, {
  130. hitTolerance: 0,
  131. });
  132. })
  133. }
  134. })
  135. return {
  136. ...toRefs(state),
  137. handleDraw,
  138. ref_close,
  139. onClose
  140. }
  141. },
  142. })
  143. </script>
  144. <style scoped lang="scss">
  145. .tool-com {
  146. padding: 12px 18px;
  147. background-color: #FFFFFF;
  148. .item {
  149. width: 100%;
  150. height: 36px;
  151. display: flex;
  152. align-items: center;
  153. border-radius: 4px;
  154. margin: 4px 0;
  155. cursor: pointer;
  156. &:hover {
  157. background-color: rgba(170, 198, 238, 0.2);
  158. }
  159. >img {
  160. margin: 0 10px;
  161. }
  162. }
  163. }
  164. .close-dom {
  165. width: 16px;
  166. height: 16px;
  167. display: none;
  168. }
  169. </style>