ZhangXianQiang
2024-03-08 dfa2e66389df106ef38a4fd621f2e3e0cf91ace8
src/views/daoAnOffice/center/map.vue
@@ -24,16 +24,36 @@
        <img src="@/assets/img/sslk.png" alt="" class="item-tb-img">
        <p class="item-tb-p">实时路况</p>
      </div>
    </div>
    <!-- 导入自定义弹窗 -->
    <div class="dialog-container dialog">
      <DialogType1 ref="dtype1"></DialogType1>
      <DialogType2 ref="dtype2"></DialogType2>
      <DialogType3 ref="dtype3"></DialogType3>
      <DialogType4 ref="dtype4"></DialogType4>
      <DialogType5 ref="dtype5"></DialogType5>
      <DialogType6 ref="dtype6"></DialogType6>
      <DialogType7 ref="dtype7"></DialogType7>
      <DialogType8 ref="dtype8"></DialogType8>
      <DialogType9 ref="dtype9"></DialogType9>
    </div>
  </div>
</template>
<script setup>
import { onMounted, ref } from 'vue';
import { onMounted, ref,getCurrentInstance } from 'vue';
import AMapLoader from '@amap/amap-jsapi-loader';
import { require } from '@/utils/require.js';
import DialogType1 from './dialog/dialog-type1.vue';
import DialogType2 from './dialog/dialog-type2.vue';
import DialogType3 from './dialog/dialog-type3.vue';
import DialogType4 from './dialog/dialog-type4.vue';
import DialogType5 from './dialog/dialog-type5.vue';
import DialogType6 from './dialog/dialog-type6.vue';
import DialogType7 from './dialog/dialog-type7.vue';
import DialogType8 from './dialog/dialog-type8.vue';
import DialogType9 from './dialog/dialog-type9.vue';
import icon1 from '@/assets/img/icon/icon1.png';
import icon2 from '@/assets/img/icon/icon2.png';
@@ -45,8 +65,23 @@
import icon8 from '@/assets/img/icon/icon8.png';
import icon9 from '@/assets/img/icon/icon9.png';
const dtype1 = ref(null);
const dtype2 = ref(null);
const dtype3 = ref(null);
const dtype4 = ref(null);
const dtype5 = ref(null);
const dtype6 = ref(null);
const dtype7 = ref(null);
const dtype8 = ref(null);
const dtype9 = ref(null);
const map = ref(null);
// dialog集合
const dialogList = ref({});
// 获取当前实例
const {ctx} = getCurrentInstance();
let mapInstance = null;
let trafficLayer = null;;
@@ -55,6 +90,9 @@
// 地图的图标数组
const markers = [];
// 信息弹窗
let infoWindow = null;
// 图列
const legendList = ref([
@@ -164,14 +202,29 @@
// 过滤图列
const filterLegend = (item) => {
  const { icon, positions, type } = item;
  const dialog = dialogList.value[type].$refs.dialog;
  const tempList = [];
  positions.map(position => {
    const markerIcon = createIcon(icon);
    const marker = ceateMarker(markerIcon, position);
    const marker = ceateMarker(type, markerIcon, position);
    tempList.push(marker);
    marker.on('click', (markerEvent) => {
      infoWindow.setContent(dialog);
      infoWindow.open(mapInstance, markerEvent.target.getPosition());
      // console.log(dialogList.value[type]);
    });
  });
  markers.push({ type: type, markerList: tempList })
  mapInstance.add(tempList);
}
// 创建弹窗
const createInfoWindow = () => {
  infoWindow = new AMap.InfoWindow({
    isCustom: true,
    closeWhenClickMap: true,
    offset: new AMap.Pixel(20, -20),
  });
}
// 创建图标
@@ -185,11 +238,12 @@
// 创建marker
const ceateMarker = (icon, position) => {
const ceateMarker = (type, icon, position) => {
  return new AMap.Marker({
    icon: icon,
    position: new AMap.LngLat(position[0], position[1]),
    zooms: [2, 20],
    extData: type
  });
}
@@ -222,6 +276,14 @@
}
// 弹窗与组件映射
const mapComponentInstance = () => {
  legendList.value.map((item) => {
    dialogList.value[item.id] = ctx.$refs[`dtype${item.id}`];
  })
}
onMounted(() => {
  AMapLoader.load({
    key: "2898109c22191c3969957500934169dc", //申请好的 Web 端开发者 Key,首次调用 load 时必填
@@ -243,9 +305,56 @@
      trafficLayer.setMap(mapInstance);
      // test();
      // console.log(markers.value[0]);
      // mapInstance.add(markers.value[0].markerList);
      // 限制一个区域轮廓
      const options = {
        subdistrict: 0,
        extensions: "all",
        level: "district",
      };
      AMap.plugin("AMap.DistrictSearch", function () {
        //在回调函数中实例化插件,并使用插件功能
        const district = new AMap.DistrictSearch(options);
        district.search("都江堰市", (status, result) => {
          const outer = [
            new AMap.LngLat(-360, 90, true),
            new AMap.LngLat(-360, -90, true),
            new AMap.LngLat(360, -90, true),
            new AMap.LngLat(360, 90, true),
          ];
          const holes = result.districtList[0].boundaries;
          const pathArray = [outer];
          pathArray.push.apply(pathArray, holes);
          const polygon = new AMap.Polygon({
            pathL: pathArray,
            //线条颜色,使用16进制颜色代码赋值。默认值为#006600
            strokeColor: "rgb(20,164,173)",
            strokeWeight: 4,
            //轮廓线透明度,取值范围[0,1],0表示完全透明,1表示不透明。默认为0.9
            strokeOpacity: 0.5,
            //多边形填充颜色,使用16进制颜色代码赋值,如:#FFAA00
            fillColor: "rgba(0,0,0)",
            //多边形填充透明度,取值范围[0,1],0表示完全透明,1表示不透明。默认为0.9
            fillOpacity: 1,
            //轮廓线样式,实线:solid,虚线:dashed
            strokeStyle: "solid",
            /*勾勒形状轮廓的虚线和间隙的样式,此属性在strokeStyle 为dashed 时有效, 此属性在
            ie9+浏览器有效 取值:
            实线:[0,0,0]
            虚线:[10,10] ,[10,10] 表示10个像素的实线和10个像素的空白(如此反复)组成的虚线
            点画线:[10,2,10], [10,2,10] 表示10个像素的实线和2个像素的空白 + 10个像素的实
            线和10个像素的空白 (如此反复)组成的虚线*/
            strokeDasharray: [10, 2, 10],
          });
          polygon.setPath(pathArray);
          mapInstance.add(polygon);
        });
      });
      // 创建infowindow
      createInfoWindow();
      // 映射组件
      mapComponentInstance();
    })
    .catch((e) => {
      console.log(e);
@@ -322,7 +431,7 @@
.road {
  position: absolute;
  bottom: 202px;
  bottom: 180px;
  left: 2434px;
  z-index: 999;
  width: 65px;
@@ -355,4 +464,10 @@
:deep(.amap-copyright) {
  visibility: hidden !important;
}
.dialog {
  opacity: 0;
  position: absolute;
  left: -500px;
}
</style>