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

这个是react写的,先是确定中心位置,然后渲染点位,添加覆盖物,选中icon的不同,

主要看函数:  marker.addEventListener('click', (event: any) => {});   这个函数是主要的

看先效果:

json数据:参考网站

http://datav.aliyun.com/portal/school/atlas/area_selector?spm=a2crr.23498931.0.0.685915dd8QQdlv

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); function callbacks () {
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.openInfoWindow(markerInfoWin);
} marker.addEventListener('mouseover', (event:any) => {});
marker.addEventListener('mouseout', () => {}); marker.addEventListener('click', (event: any) => {
callbacks()
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);
});
});
}
}; // 根据levelCode向地图中画一个区域轮廓
const addAreaCoordinate = (map: any, isResetCenter?: boolean) => { const obj = gs_json || ''; // 这个是一个区域的json数据,可以下载json,参考网站 http://datav.aliyun.com/portal/school/atlas/area_selector?spm=a2crr.23498931.0.0.685915dd8QQdlv if (isResetCenter) {
const center = obj?.features[0]?.properties?.center;
map.centerAndZoom(
new T.LngLat(center[0], center[1]),
map.getZoom()
);
} const points: any[] = [];
obj?.features[0]?.geometry?.coordinates[0][0].map((item: any) => {
points.push(new T.LngLat(item[0], item[1]));
});
// 创建面对象
let polygon = new T.Polygon(points, {
color: '#1CB9FF',
weight: 3,
opacity: 1,
fillColor: '#1CB9FF',
fillOpacity: 0.1,
}); polygon.addEventListener('mouseover', () => {
polygon = new T.Polygon(points, {
color: '#1CB9FF',
weight: 3,
opacity: 0.5,
fillColor: '#1CB9FF',
fillOpacity: 0.05,
});
}); polygon.addEventListener('mouseout', () => {
polygon = new T.Polygon(points, {
color: '#1CB9FF',
weight: 3,
opacity: 0.5,
fillColor: '#1CB9FF',
fillOpacity: 0.05,
});
});
// map.clearOverLays();
// setCircleMarker(handleMarkerData('projectMarkers'));
// 向地图上添加面
map.addOverLay(polygon); }; //初始化地图
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);
addAreaCoordinate(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;

天地图添加多个覆盖物,点击切换选中icon的更多相关文章

  1. Taro button点击切换选中状态

    1.引入组件 2.state中设置选中状态 // button按钮的默认选中,0代表选中 state = { currentIndex: 0 } 3.设置class的样式,点击更改选中 selectN ...

  2. 用js实现超链接导航菜单点击切换选中时的状态

    项目中使用到点解导航切换不同的颜色,如果只是li选项卡还好办,这次用到的超链接选项卡,因为a链接每次点击都会刷新,所以浏览器记不住点击的状态,也没法切换点击状态,因为项目中有好多地方要用到,在网上找了 ...

  3. 用js实现导航菜单点击切换选中时高亮状态

    随着用户点击导航或菜单上不同的页面,出现此选项高亮显示或变为一个新的样式是经常用到的.实现它所用的原理就是通过js中的location.href得到当前页面的地址,然后在与导航上的链接地址匹对,相同的 ...

  4. jquery——左右按钮点击切换一组图片功能

    一.最终效果 二.功能分析 1.需求分析 点击左边pre按钮,显示前面三个图片,点击右边的next按钮,显示后面的一组(三个)图片.初始化只显示next按钮,到最后一组只显示pre按钮,中间过程两按钮 ...

  5. 仿美团外卖,饿了吗 两个ListView联动,左边点击切换右边,右边滑动切换左边

    先上效果图: 实现思路: 1.先说右边标题: 首先,右边的数据源集合中的Javabean中含有三个属性name,type,title,而每个条目中会默认含有一个标题. 如果这是第一个条目,就让标题显示 ...

  6. jquery插件jquery.LightBox.js之点击放大图片并左右点击切换图片(仿相册插件)

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的点击放大图片并左右点击切换图片的效果,您可以根据自己的实 ...

  7. jQuery_$方法、属性、点击切换

    jQuery_$方法 1.$.each():遍历数组或对象中的数据 2.$.trim():去除字符串两边的空格 3.$.type(obj):得到数据的类型 4.$.isArray(obj):判断是否为 ...

  8. 1.横向滚动条,要设置两个div包裹. 2. 点击切换视频或者图片. overflow . overflow-x

    1.横向滚动条. div.1 > div.2 > img img  img 第一: 设置 div.1 一个固定的宽度 和高度  . 例如宽度 700px;  高度是 120px; 设置 o ...

  9. angular ng-repeat点击切换样式,浅谈track by $index

    前言 angular ng-repeat点击切换样式,ng-repeat点击切换class样式,巧用ng-repeat track by $index. 1.问题 一个ul包含多个li,li通过ng- ...

  10. JavaScript banner轮播 左右切换 圆点点击切换

    1.效果如下图: 2.源码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

随机推荐

  1. [GPT] AI大模型背景下,小模型还有优势吗?

      在AI大模型背景下,小的模型仍然具有一些优势. 以下是一些可能的优势: 速度和效率:相比于大模型,小模型需要更少的计算资源和时间,能够更快地完成训练和预测,并且能够在较低的硬件配置上运行. 灵活性 ...

  2. 重回铁王座!时隔5年!Quill 2.0 终于发布啦🎉

    你好,我是 Kagol. 2024年4月17日,Quill 2.0 正式发布 最后一个 1.0 版本 1.3.7 发布于 2019年9月9日,时隔4年零7个月. 富文本编辑器拥有非常丰富的使用场景,我 ...

  3. SQL如何删除所有字段都相同的重复数据?

    SQL Server数据库:有时候在处理数据时会遇到不加主键的表,导致数据表内出现了一模一样的数据,刚开始第一时间想到的方式是,把两条数据全部删除,然后再插入一条,但是这种可能数据量比较少的话,还可以 ...

  4. 后台生成单个Word文档

    在实际项目开发中经常会遇到一种场景,客户希望点击页面上的生成文件按钮,执行程序动态填充数据到Word模板,直接在后台生成Word文档,而无需显示Word文档.目前网上有一些针对此需求的方案,但每个方案 ...

  5. kubernetes之python调用

    安装 sudo pip3 install kubernetes 认证 首先引入SDK支持库.然后将 ~/.kube 的config文件的内容复制到本地目录,保存为文件kubeconfig.yaml,然 ...

  6. 安装anaconda3卡在Unpacking payload ...

    ananconda3在centos7虚拟机上,直接进行ananconda3安装但是始终卡在Unpacking payload ..., 虚拟机的核心数调到2或者2以上即可解决

  7. GPU简介

    摘自:https://zhidao.baidu.com/question/1765722944085349980.html 其发起者和主导者是baiNVIDIA(英伟达)公司. 1999年,duNVI ...

  8. vue4 项目的创建

    1,安装vue cli 脚手架,是全局安装npm install -g @vue/cli 可以在输出信息中看到安装位置,例如:C:\Users\xiaochangjian\AppData\Roamin ...

  9. BigDecimal类的基本使用

    概述 java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的 ...

  10. 简单粗暴通过 Binlog 日志来恢复 MySQL 数据

    引言 Binlog 日志的主要作用: 1.增量备份. 2.主从复制. 操作步骤 1.登录 MySQL -> 执行 show variables like '%log_bin%'; 查询 binl ...