<!-- 
 | 
  描述:拖放地图组件,默认尺寸是 500 * 300 
 | 
  
 | 
  接收属性参数: 
 | 
    lat: 纬度 
 | 
    lng: 经度 
 | 
  
 | 
  自定义事件: 
 | 
    drag: 拖放完成事件 
 | 
  
 | 
  示例: 
 | 
    <mapDrag @drag="dragMap" lat="22.574405" lng="114.095388"></mapDrag> 
 | 
--> 
 | 
<template> 
 | 
  <div class="m-map"> 
 | 
    <div class="search"> 
 | 
      <el-form @submit.native.prevent> 
 | 
        <input 
 | 
          :id="search_id" 
 | 
          v-model="input" 
 | 
          type="text" 
 | 
          placeholder="请输入关键字" 
 | 
          autocomplete="off" 
 | 
        > 
 | 
        <input type="text" style="display: none"> 
 | 
        <button type="primary" @click="searchMap">搜索</button> 
 | 
      </el-form> 
 | 
      <div v-show="searchKey" id="js-result" class="result" /> 
 | 
    </div> 
 | 
    <!-- <div id="panel" /> --> 
 | 
    <!-- 搜索结果栏 --> 
 | 
    <div v-if="showsearchResult" class="tool_search_result"> 
 | 
      <ul> 
 | 
        <li 
 | 
          v-for="(item, index) in poiList" 
 | 
          :key="index" 
 | 
          @click="markerResult(item)" 
 | 
        > 
 | 
          {{ item.name }} 
 | 
        </li> 
 | 
      </ul> 
 | 
    </div> 
 | 
    <div id="js-container" class="map">正在加载数据 ...</div> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
// import remoteLoad from '@/utils/remoteLoad.js' 
 | 
import bus from '@/eventBus/eventBus.js' 
 | 
// import { MapKey, securityJsCode } from '@/api/config' 
 | 
import AMapLoader from '@amap/amap-jsapi-loader' 
 | 
const MapKey = 'c477e250c63cde947d7e9072bdcf9e65' 
 | 
const securityJsCode = '746ae93f3f20c7fc30134109bd55fd19' 
 | 
export default { 
 | 
  props: { 
 | 
    lat: { 
 | 
      type: String, 
 | 
      default: '' 
 | 
    }, 
 | 
    lng: { 
 | 
      type: String, 
 | 
      default: '' 
 | 
    } 
 | 
  }, 
 | 
  data() { 
 | 
    return { 
 | 
      autoOptions: { 
 | 
        input: '' 
 | 
      }, 
 | 
      showsearchResult: false, 
 | 
      search_id: 'searchId', 
 | 
      input: '', 
 | 
      searchPlaceInput: '', 
 | 
      searchKey: '', 
 | 
      placeSearch: null, 
 | 
      dragStatus: false, 
 | 
      AMapUI: null, 
 | 
      AMap: null, 
 | 
      positionImage: require('@/assets/icons/position.png'), 
 | 
      marker: {}, 
 | 
      map: null, 
 | 
      poiList: [] 
 | 
    } 
 | 
  }, 
 | 
  watch: { 
 | 
    searchPlaceInput(newValue) { 
 | 
      if (newValue != null) { 
 | 
        // this.placeSearch.search(newValue) 
 | 
      } 
 | 
    } 
 | 
  }, 
 | 
  created() { 
 | 
    bus.$on('share_id', val => { 
 | 
      this.autoOptions.input = val 
 | 
    }) 
 | 
    bus.$on('share', val => { 
 | 
      this.searchPlaceInput = val 
 | 
    }) 
 | 
  }, 
 | 
  mounted() { 
 | 
    this.initMap() 
 | 
    this.sendId() 
 | 
  }, 
 | 
  methods: { 
 | 
    sendMsg() { 
 | 
      bus.$emit('share', this.input) 
 | 
    }, 
 | 
    sendId() { 
 | 
      bus.$emit('share_id', this.search_id) 
 | 
    }, 
 | 
    // 实例化地图 
 | 
    initMap() { 
 | 
      window._AMapSecurityConfig = { securityJsCode } 
 | 
      AMapLoader.load({ 
 | 
        key: MapKey, // 申请好的Web端开发者Key,首次调用 load 时必填 
 | 
        version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 
 | 
        plugins: ['AMap.ToolBar', 'AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.MapType', 'AMap.HawkEye', 'AMap.Scale', 'AMap.AutoComplete'] // 需要使用的的插件列表,如比例尺'AMap.Scale'等 
 | 
      }).then((AMap) => { 
 | 
        this.map = new AMap.Map('js-container', { // 设置地图容器id 
 | 
          viewMode: '3D', // 是否为3D地图模式 
 | 
          zoom: 11, // 初始化地图级别 
 | 
          center: [117.279952, 31.850109] // 初始化地图中心点位置 
 | 
        }) 
 | 
        this.map.addControl(new AMap.ToolBar()) 
 | 
        this.mapOn(AMap) 
 | 
      }).catch(e => { 
 | 
        console.log(e) 
 | 
      }) 
 | 
    }, 
 | 
    searchMap() { 
 | 
      var placeSearch = new AMap.PlaceSearch({ 
 | 
        // 构造地点查询类 
 | 
        pageSize: 30, // 单页显示结果条数 
 | 
        pageIndex: 1, // 页码 
 | 
        citylimit: false, // 是否强制限制在设置的城市内搜索 
 | 
        map: this.map, // 展现结果的地图实例 
 | 
        // panel: 'panel', // 结果列表将在此容器中进行展示。 
 | 
        autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围 
 | 
      }) 
 | 
      // 关键字查询 
 | 
      const cur = this 
 | 
      placeSearch.search(this.input, (status, result) => { 
 | 
        // 查询成功时,result即对应匹配的POI信息 
 | 
        console.log(status) 
 | 
        console.log(result) 
 | 
        if (status === 'complete' && result.info === 'OK') { 
 | 
          cur.showsearchResult = true 
 | 
          cur.poiList = result.poiList.pois 
 | 
        } else { 
 | 
          cur.showsearchResult = false 
 | 
          cur.poiList = [] 
 | 
          cur.$message({ 
 | 
            message: '没有查到结果', 
 | 
            type: 'warning' 
 | 
          }) 
 | 
        } 
 | 
      }) 
 | 
    }, 
 | 
    markerResult(data) { 
 | 
      // this.input = data.name 
 | 
      // this.searchMap() 
 | 
      const that = this 
 | 
      const { lat, lng } = data.location 
 | 
      window._AMapSecurityConfig = { securityJsCode } 
 | 
      AMapLoader.load({ 
 | 
        key: MapKey, // 申请好的Web端开发者Key,首次调用 load 时必填 
 | 
        version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 
 | 
        plugins: ['AMap.ToolBar', 'AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.MapType', 'AMap.HawkEye', 'AMap.Scale', 'AMap.AutoComplete'] // 需要使用的的插件列表,如比例尺'AMap.Scale'等 
 | 
      }).then((AMap) => { 
 | 
        this.map = new AMap.Map('js-container', { // 设置地图容器id 
 | 
          viewMode: '3D', // 是否为3D地图模式 
 | 
          zoom: 18, // 初始化地图级别 
 | 
          center: [lng, lat] // 初始化地图中心点位置 
 | 
        }) 
 | 
        this.map.addControl(new AMap.ToolBar()) 
 | 
        const address = data.name 
 | 
        const marker = new AMap.Marker({ 
 | 
          position: new AMap.LngLat(lng, lat), 
 | 
          icon: that.positionImage, 
 | 
          anchor: 'bottom-center' 
 | 
        }) 
 | 
        // map.remove(that.marker) 
 | 
        this.map.add(marker) 
 | 
        that.marker = marker 
 | 
        that.showsearchResult = false 
 | 
        that.$emit('center', { lnglat: lng + ',' + lat, address }) 
 | 
        this.mapOn(AMap) 
 | 
      }).catch(e => { 
 | 
        console.log(e) 
 | 
      }) 
 | 
      // var marker = new AMap.Marker({ 
 | 
      //   position: [Number(data.location.lng), Number(data.location.lat)], 
 | 
      //   cursor: 'pointer', 
 | 
      //   // icon: carIcon, 
 | 
      //   autoRotation: true, 
 | 
      //   angle: 0, 
 | 
      //   offset: new AMap.Pixel(-36, -30), 
 | 
      // }) 
 | 
      // marker.setMap(this.mapall) 
 | 
      // this.mapall.setFitView(); 
 | 
    }, 
 | 
    // 地图事件监听 
 | 
    mapOn(AMap) { 
 | 
      const { map } = this 
 | 
      const that = this 
 | 
      const geocoder = new AMap.Geocoder() 
 | 
      let address = '' 
 | 
      // 监听地图点击事件 
 | 
      map.on('click', function(e) { 
 | 
        // 获取点击位置坐标 
 | 
        const { lat, lng } = e.lnglat 
 | 
        // 设置标记点 
 | 
        const marker = new AMap.Marker({ 
 | 
          position: new AMap.LngLat(lng, lat), 
 | 
          icon: that.positionImage, 
 | 
          anchor: 'bottom-center' 
 | 
        }) 
 | 
        map.remove(that.marker) 
 | 
        map.add(marker) 
 | 
        that.marker = marker 
 | 
        geocoder.getAddress([lng, lat], function(status, result) { 
 | 
          address = result.regeocode.formattedAddress 
 | 
          that.showsearchResult = false 
 | 
          that.$emit('center', { lng, lat, address }) 
 | 
        }) 
 | 
      }) 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</script> 
 | 
  
 | 
<style lang="css"> 
 | 
.m-map { 
 | 
  min-width: 500px; 
 | 
  min-height: 300px; 
 | 
  position: relative; 
 | 
} 
 | 
.m-map .map { 
 | 
  width: 100%; 
 | 
  height: 100%; 
 | 
} 
 | 
.m-map .search { 
 | 
  position: absolute; 
 | 
  top: 10px; 
 | 
  left: 10px; 
 | 
  width: 285px; 
 | 
  z-index: 1; 
 | 
} 
 | 
.m-map .search input { 
 | 
  width: 220px; 
 | 
  border: 1px solid #ccc; 
 | 
  height: 30px; 
 | 
  box-sizing: border-box; 
 | 
  line-height: 20px; 
 | 
  padding: 5px; 
 | 
  outline: none; 
 | 
} 
 | 
.m-map .search button { 
 | 
  line-height: 26px; 
 | 
  background: #fff; 
 | 
  border: 1px solid #ccc; 
 | 
  width: 50px; 
 | 
  text-align: center; 
 | 
} 
 | 
.m-map .result { 
 | 
  max-height: 300px; 
 | 
  overflow: auto; 
 | 
  margin-top: 10px; 
 | 
} 
 | 
#panel { 
 | 
  position: absolute; 
 | 
  top: 50px; 
 | 
  left: 10px; 
 | 
  width: 270px; 
 | 
  z-index: 1; 
 | 
} 
 | 
.tool_search_result { 
 | 
  position: absolute; 
 | 
  top: 40px; 
 | 
  left: 10px; 
 | 
  width: 270px; 
 | 
  height: 300px; 
 | 
  overflow: auto; 
 | 
  z-index: 1; 
 | 
  border: 1px solid rgb(175, 175, 173); 
 | 
  border-top: none; 
 | 
  background: #fff; 
 | 
  opacity: 0.8; 
 | 
  bottom: auto; 
 | 
  z-index: 12; 
 | 
  position: absolute; 
 | 
  text-align: left; 
 | 
  font-size: 14px; 
 | 
  
 | 
} 
 | 
.tool_search_result ul { 
 | 
  width: 100%; 
 | 
  list-style: none; 
 | 
  margin: 0; 
 | 
  padding: 0; 
 | 
} 
 | 
.tool_search_result ul li { 
 | 
  font-size: 12px; 
 | 
  cursor: pointer; 
 | 
  color: rgb(23, 40, 75); 
 | 
  text-align: center; 
 | 
  width: 100%; 
 | 
  line-height: 2; 
 | 
  padding: 5px 10px; 
 | 
  box-sizing: border-box; 
 | 
  border-bottom: 1px dashed rgb(170, 170, 172); 
 | 
  display: block; 
 | 
  white-space: nowrap; 
 | 
  overflow: hidden; 
 | 
  text-overflow: ellipsis; 
 | 
} 
 | 
.tool_search_result ul li:last-child { 
 | 
  border: none; 
 | 
} 
 | 
</style> 
 |