mapSetting.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <tlbs-map
  3. ref="mapRef"
  4. api-key="KFEBZ-P2GKZ-A5PX4-7Q6Y7-KXOBF-XCB4C"
  5. :center="center"
  6. :zoom="zoom"
  7. :control="control"
  8. @click="handleClick"
  9. @map_inited="onMapInited"
  10. >
  11. <div style="position: absolute; top: 0; left: 0; z-index: 2000">
  12. <button @click.stop="mode = 'draw'">设置绘制模式</button>
  13. <button @click.stop="mode = 'edit'">设置编辑模式</button>
  14. <button @click.stop="activeId = 'polygon'">设置画多边形</button>
  15. <button @click.stop="activeId = 'circle'">设置画圆形</button>
  16. <button @click.stop="getOverlayList">获取图层列表</button>
  17. <button @click.stop="onSelectGeometry">选中图形</button>
  18. <button @click.stop="onGetSelectedList">获取选中集合图形</button>
  19. <button @click.stop="onClear">清空选中</button>
  20. <button @click.stop="onSavePointList">保存地址</button>
  21. </div>
  22. <!--vue2使用:active-overlay-id.sync="activeId" -->
  23. <tlbs-geometry-editor
  24. ref="editorRef"
  25. v-model:active-overlay-id="activeId"
  26. :action-mode="mode"
  27. polygon-id="polygon"
  28. :default-polygon-geometries="geometries"
  29. :polygon-styles="styles"
  30. selectable
  31. @select="onSelect"
  32. @draw_complete="onDrowComplet"
  33. @adjust_complete="onAdjustComplete"
  34. @draw_error="onDrawError"
  35. />
  36. </tlbs-map>
  37. </template>
  38. <script setup>
  39. import { ref, watch, onMounted, getCurrentInstance } from 'vue'
  40. import { getMapCoder } from '@/api/map'
  41. import { updateDept } from '@/api/system/dept'
  42. import { useRoute } from 'vue-router'
  43. const { proxy } = getCurrentInstance()
  44. const route = useRoute()
  45. const deptForm = ref({})
  46. onMounted(() => {
  47. const row = localStorage.getItem('mapDeptRow')
  48. if (row) {
  49. deptForm.value = JSON.parse(row)
  50. }
  51. })
  52. const paths = [
  53. { lat: 40.041117253378246, lng: 116.2722415837743 },
  54. { lat: 40.03942536171407, lng: 116.2726277820093 },
  55. { lat: 40.03970460886076, lng: 116.27483769345417 },
  56. { lat: 40.041404706498625, lng: 116.27443003983899 },
  57. ]
  58. const mapRef = ref(null)
  59. const center = ref({ lat: 40.040452, lng: 116.273486 })
  60. const zoom = ref(17)
  61. const editorRef = ref(null)
  62. const mode = ref('edit')
  63. const activeId = ref('polygon')
  64. const latestPointList = ref([])
  65. const onToggleMode = () => {
  66. mode.value = mode.value === 'draw' ? 'edit' : 'draw'
  67. }
  68. const onSelect = (e) => {
  69. console.log('select', e)
  70. }
  71. const onDrowComplet = (geomeytry) => {
  72. // 兼容 geomeytry 里可能的 paths 字段
  73. const pointList = geomeytry.paths || geomeytry.pointList || [];
  74. latestPointList.value = pointList;
  75. console.log({ pointList }, '这是地址获取到的数据');
  76. }
  77. const onAdjustComplete = (geomeytry) => {
  78. // 兼容 geomeytry 里可能的 paths 字段
  79. const pointList = geomeytry.paths || geomeytry.pointList || [];
  80. latestPointList.value = pointList;
  81. console.log({ pointList }, '这是地址获取到的数据');
  82. }
  83. const onDrawError = (e) => {
  84. console.log(e)
  85. }
  86. const getOverlayList = () => {
  87. console.log(editorRef.value.editor.getOverlayList())
  88. }
  89. const onMapInited = () => {
  90. // 地图加载完成后,可以获取地图实例,调用地图实例方法
  91. console.log(mapRef.value.map)
  92. }
  93. const control = {
  94. scale: {},
  95. zoom: {
  96. position: 'topRight',
  97. },
  98. }
  99. const geometries = [
  100. {
  101. id: 'firstPolygon',
  102. styleId: 'polygon', // 样式id
  103. paths, // 多边形的位置信息
  104. properties: {
  105. // 多边形的属性数据
  106. title: 'polygon',
  107. },
  108. },
  109. ]
  110. const styles = {
  111. polygon: {
  112. color: '#3777FF', // 面填充色
  113. showBorder: false, // 是否显示拔起面的边线
  114. borderColor: '#00FFFF', // 边线颜色
  115. },
  116. }
  117. function handleClick(e) {
  118. console.log(e)
  119. }
  120. function onClear() {
  121. editorRef.value.editor.select([])
  122. }
  123. function onSelectGeometry() {
  124. editorRef.value.editor.select(['firstPolygon'])
  125. }
  126. function onGetSelectedList() {
  127. console.log(editorRef.value.editor.getSelectedList())
  128. }
  129. function onSavePointList() {
  130. if (!latestPointList.value.length) {
  131. proxy.$modal.msgError('请先绘制或调整图形');
  132. return;
  133. }
  134. // 合并所有部门字段和 pointList
  135. const payload = {
  136. ...deptForm.value,
  137. pointList: JSON.stringify(latestPointList.value)
  138. }
  139. updateDept(payload).then((response) => {
  140. if (response.code === 200) {
  141. proxy.$modal.msgSuccess('地址保存成功');
  142. open.value = false;
  143. getList();
  144. } else {
  145. proxy.$modal.msgError(response.msg || '地址保存失败');
  146. }
  147. })
  148. }
  149. </script>
  150. <style>
  151. .map-container {
  152. width: 100%;
  153. height: 100%;
  154. }
  155. </style>
  156. <style scoped>
  157. .control-container {
  158. position: absolute;
  159. top: 0;
  160. left: 0;
  161. z-index: 1001;
  162. display: flex;
  163. align-items: center;
  164. }
  165. button {
  166. padding: 4px;
  167. background-color: #fff;
  168. margin-right: 5px;
  169. border: 1px solid #ddd;
  170. }
  171. </style>