Newer
Older
smartwell_front / src / views / wellManage / detailMapLonLat.vue
lyg on 29 May 2024 4 KB 权属单位树形下拉框
<template>
  <el-dialog
    append-to-body
    title="选择位置"
    :visible.sync="dialogFormVisible"
  >
    <el-row>
      <el-col :span="24" class="overview-map-container">
        <a-map-container
          v-if="dialogFormVisible"
          ref="map"
          :center="center"
          :zoom="zoom"
          :base-layer="baseLayer"
          style="height: 300px"
          vid="choose-position"
          class="map-demo"
          @ready="mapReady"
        />
      </el-col>
    </el-row>
    <el-row :gutter="10">
      <el-col :span="5">
        <el-input
          v-model.trim="positionForm.longitude"
          type="text"
          placeholder="经度"
          disabled
        />
      </el-col>
      <el-col :span="5">
        <el-input
          v-model.trim="positionForm.latitude"
          type="text"
          placeholder="纬度"
          disabled
        />
      </el-col>
      <el-col :span="14">
        <el-input
          v-model.trim="positionForm.position"
          type="text"
          placeholder="详细地址"
          disabled
        />
      </el-col>
    </el-row>
    <div
      slot="footer"
      class="dialog-footer"
    >
      <el-button type="primary" @click="saveData">
        确定
      </el-button>
      <el-button @click="dialogFormVisible = false">
        取消
      </el-button>
    </div>
  </el-dialog>
</template>

<script>
import { mapGetters } from 'vuex'
import AMapContainer from '@/components/Amap/AMapContainer'
import { toSize, reverseLnglat } from '@/components/Amap/utils/convert-helper'
export default {
  name: 'DetailMapLonLat',
  components: { AMapContainer },
  props: {
    position: {
      type: Array,
      default: null
    }
  },
  data() {
    return {
      searchResultIcon: require('@/assets/overview/pure-position-icon.png'), // 图标
      searchResultSize: [24, 30],
      marker: null,
      locationMarker: '',
      positionForm: {
        longitude: '', // 经度
        latitude: '', // 纬度
        qu: '', // 区编码
        area: '', // 街道编码
        position: '' // 详细地址
      },
      map: null, // 地图对象
      baseLayer: 'gaode_vec', // 底图图层
      center: [this.$store.getters.lng, this.$store.getters.lat], // 地图中心
      zoom: 12,
      dialogFormVisible: false // 对话框是否显示
    }
  },
  computed: {
    ...mapGetters([
      'bodyHeight'
    ])
  },
  methods: {
    // 初始化放这里
    mapReady(map) {
      this.map = map
      const { searchResultIcon, searchResultSize } = this
      this.center = this.position ? this.position : [this.$store.getters.lng, this.$store.getters.lat]
      if (this.center) {
        this.positionForm.longitude = this.center[0]
        this.positionForm.latitude = this.center[1]
        reverseLnglat(this.center).then(res => {
          this.positionForm.position = res.formattedAddress
          this.positionForm.qu = res.addressComponent.adcode
        })
      }
      const icon = new window.AMap.Icon({
        size: toSize(searchResultSize), // 图标尺寸
        image: searchResultIcon, // Icon的图像
        imageSize: toSize(searchResultSize) // 根据所设置的大小拉伸或压缩图片
      })
      this.locationMarker = new window.AMap.Marker({
        icon: icon,
        position: this.position ? this.position : [this.$store.getters.lng, this.$store.getters.lat],
        draggable: true,
        cursor: 'move'
      })
      this.locationMarker.setMap(this.map)
      this.locationMarker.on('dragend', e => {
        this.positionForm.longitude = e.lnglat.lng
        this.positionForm.latitude = e.lnglat.lat
        this.reverse([e.lnglat.lng, e.lnglat.lat])
      })
    },
    // 转换地址
    reverse(lnglat) {
      reverseLnglat(lnglat).then(res => {
        this.positionForm.position = res.formattedAddress
        this.positionForm.qu = res.addressComponent.adcode // 获取区
        // TODO:目前缺根据区和街道名称获取街道号接口
      })
    },
    initDialog() {
      this.dialogFormVisible = true
    },
    saveData() {
      this.$emit('getLonLat', this.positionForm)
      this.dialogFormVisible = false
    }
  }
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.overview-map-container{
  width: 100%;
  margin-bottom: 10px;
}
</style>