首页 > 其他分享 >天地图添加多个覆盖物,点击切换选中icon

天地图添加多个覆盖物,点击切换选中icon

时间:2022-08-19 16:34:53浏览次数:81  
标签:map const 覆盖物 item 选中 import new any icon

天地图添加多个覆盖物,点击覆盖物,切换选中的icon,移除之前的icon,再次点击移除之前的。。。

import React, { useState, useEffect, useRef } from 'react';
import { useUpdateEffect, useEffectOnce, useSize } from 'react-use';
//@ts-ignore
import T from 'TMap';
import { isEmpty } from 'lodash';
// 请求
import { RequestObj } from '@/services/publicPowerWarning';
// 图片
import map_green from '@/assets/publicPowerWarning/map_green.png';
import map_red from '@/assets/publicPowerWarning/map_red.png';
import map_yellow from '@/assets/publicPowerWarning/map_yellow.png';
import map_active from '@/assets/publicPowerWarning/map_active.png';
import map_red_and_yellow from '@/assets/publicPowerWarning/map_red_and_yellow.png';
// style
import stylesMap from './tdMapCustom.less';
import styles from '../index.less';

const MapBox = () => {
  const mapRef = useRef<any>();
  const [initDataMap, setInitDataMap] = useState({
    centerCity: '滨江区',
    defaultZoom: 13,
    centerPoint: { lng: 120.195335, lat: 30.181746 },
  });
  const [zoom, setZoom] = useState<any>(13);
  const [flag, setFlag] = useState(true);

  const getEarlyWarningProjectMap = (params: any) => {
    RequestObj.earlyWarningProjectMap(params).then((res: any) => {
      if (res.code === 200) {
        if (flag) {
          initMap(res.data);
          setFlag(false);
        } else {
          mapRef?.current.clearOverLays();
          setCircleMarker(res.data, mapRef?.current);
        }
      }
    });
  };

  // 设置显示地图的中心点和级别
  const setCenterCity = (city: string, map: any) => {
    const { defaultZoom } = initDataMap;
    if (city) {
      new T.LocalSearch(map, {
        pageCapacity: 10,
        onSearchComplete: (result: any) => {
          const { lonlat } = result.area || {};
          if (lonlat) {
            const ll = lonlat.split(',');
            map.setStyle('indigo');
            map.centerAndZoom(new T.LngLat(120.195335, 30.181746), defaultZoom);
          }
        },
      }).search(city);
    } else {
      new T.LocalCity().location(function(e: any) {
        map.centerAndZoom(e.lnglat, defaultZoom);
      });
    }
  };

  // 设置项目级的marker
  const setCircleMarker = (markers: any[], map: any) => {
    if (mapRef.current && markers instanceof Array) {
      const markerInfoWin = new T.InfoWindow('', {
        // maxHeight: 250,
        maxWidth: 500,
        autoPan: true,
        closeButton: false,
        closeOnClick: true,
        offset: new T.Point(0, -15),
      });

      let pointColorFlag = false;

      let markerActive = ''
      let markerOld = ''
      markers
        .filter(item => item.lng && item.lat)
        .map((item, index) => {
          let bgUrl: any = null;
          let borderColor: any = null;
          if (item?.alarmColor === 1) {
            bgUrl = map_green;
            borderColor = `
              background: rgba(0,0,0,0.80);
              border: 2px solid #44F35F;
              box-shadow: inset 0 1px 60px 0 rgba(12,161,255,0.50);
            `;
          }
          if (item?.alarmColor === 2) {
            bgUrl = map_yellow;
            borderColor = `
              background: rgba(0,0,0,0.80);
              border: 2px solid #F7D93F;
              box-shadow: inset 0 1px 60px 0 rgba(12,161,255,0.50);
            `;
          }
          if (item?.alarmColor === 3) {
            bgUrl = map_red;
            borderColor = `
              background: rgba(0,0,0,0.80);
              border: 2px solid #FF3B3B;
              box-shadow: inset 0 1px 60px 0 rgba(12,161,255,0.50);
            `;
          }
          if (item?.alarmColor === 4) {
            bgUrl = map_red_and_yellow;
            borderColor = `
              background: rgba(0,0,0,0.80);
              border: 2px solid;
              border-image: linear-gradient(to bottom, #FF3B3B, #F7D93F) 1;
              box-shadow: inset 0 1px 60px 0 rgba(12,161,255,0.50);
            `;
          }
          let bgHoverUrl = map_active;

          const lnglat = new T.LngLat(item.lng, item.lat);
          let marker = new T.Marker(lnglat, {
            icon: new T.Icon({ iconUrl: bgUrl, iconSize: new T.Point(24, 24) }),
          });
          map.addOverLay(marker);
          
          markerInfoWin.setContent(`
            <div key=${index} style="position:relative;width:calc(100% + 18px);padding: 12px 8px;color:#fff;border-radius: 10px;${borderColor}">
              <div style="font-size:16px;font-weight:bold;color:#03FCFE">${item.projectName}</div>
              <div style="font-size:14px;font-weight:400;">施工许可证号:${item.builderLicenseNumber}</div>
              <div style="font-size:14px;font-weight:400;">建设单位:${item.buildNames || ''}</div>
              <div style="font-size:14px;font-weight:400;">总承包单位:${item.contractNames || ''}</div>
              <div style="font-size:14px;font-weight:400;">监理单位:${item.supervisorNames || ''}</div>
              <div style="font-size:14px;font-weight:400;">设计单位:${item.designNames || ''}</div>
              <div style="font-size:14px;font-weight:400;">勘查单位:${item.surveyNames || ''}</div>
              <div style="font-size:14px;font-weight:400;color:#FF3B3B;">红色预警:${item.redAlarmNum}</div>
              <div style="font-size:14px;font-weight:400;color:#F7D93F;">黄色预警:${item.yellowAlarmNum}</div>
            </div>`);

          marker.addEventListener('mouseover', (event:any) => {});
          marker.addEventListener('mouseout', () => {});

          marker.addEventListener('click', (event: any) => {
            marker.openInfoWindow(markerInfoWin);
            if (pointColorFlag) {
              map.removeOverLay(markerActive);
              pointColorFlag = false;
              map.addOverLay(markerOld);
            }
            markerOld = event.target;
            map.removeOverLay(markerOld);
            const lnglat1 = new T.LngLat(event.lnglat.lng, event.lnglat.lat);
            markerActive = new T.Marker(lnglat1, {
              icon: new T.Icon({ iconUrl: bgHoverUrl, iconSize: new T.Point(36, 30) }),
            });
            map.addOverLay(markerActive);
            pointColorFlag = true;
          });

          map.addEventListener('click', () => {
            marker.setIcon(new T.Icon({ iconUrl: bgUrl, iconSize: new T.Point(24, 24) }));
            map.addOverLay(markerOld);
            map.removeOverLay(markerActive);
          });
        });
    }
  };
  //初始化地图
  const initMap = (paramsData: any) => {
    const { centerCity, defaultZoom, centerPoint } = initDataMap;
    const map = new T.Map('mapDiv', { minZoom: 12, maxZoom: 18 }); // maxBounds:new T.LngLatBounds([30,120],[31,120.7])
    map.centerAndZoom(new T.LngLat(centerPoint.lng, centerPoint.lat), defaultZoom);
    map.setStyle('indigo');
    mapRef.current = map;
    map.addEventListener('zoomend', ({ type, target }: any) => {
      setZoom(target.getZoom());
    });
    setCenterCity(centerCity, map);
    setCircleMarker(paramsData, map);
  };

  useEffect(() => {
    getEarlyWarningProjectMap({}); // 获取点位
  }, []);

  return (
    <div className={styles.tianDiMapBox}>
      <div className={styles.map_box_position}>
        <div id="mapDiv" style={{ width: '100%', height: 515 }} className={stylesMap.tdt} />
      </div>
    </div>
  );
};
export default MapBox;

 

标签:map,const,覆盖物,item,选中,import,new,any,icon
From: https://www.cnblogs.com/dreamtt/p/16602429.html

相关文章