天地图添加多个覆盖物,点击覆盖物,切换选中的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. 针对数据库连接池到DRDS连接探活的优化

    简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下.使⽤过DRDS产品的 ...

  2. 实时数仓入门训练营:实时计算 Flink 版 SQL 实践

    ​简介: <实时数仓入门训练营>由阿里云研究员王峰.阿里云资深技术专家金晓军.阿里云高级产品专家刘一鸣等实时计算 Flink 版和 Hologres 的多名技术/产品一线专家齐上阵,合力搭 ...

  3. 全球首款乘云而来的存储产品CDS诞生!

    ​9月22日,阿里云发布全球首款"云定义存储"(Cloud Defined Storage,CDS)产品.作为一款本地部署的分布式存储产品,阿里云CDS拥有与公共云存储相同的技术架 ...

  4. python语言中的装饰器详解

        装饰器是一个用于封装函数或类的代码的工具.它显式地将封装器应用到函数或类上,从而使它们选择加入到装饰器的功能中.对于在函数运行前处理常见前置条件(例如确认授权),或在函数运行后确保清理(例如输 ...

  5. .NET周刊【4月第2期 2024-04-21】

    国内文章 他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk[Homekit.Net]1.0.0发布,快来打造你的私人智能家居吧 https://www.cnblogs.com/h ...

  6. [Go] golang 两个数组 list 的合并方式

    s := append([]int{1, 2}, []int{3, 4}...) Tool:在线Golang代码运行 Cool:在线 AI 编程助手 https://stackoverflow.com ...

  7. 2018-12-27-WPF-从-DrawingVisual-转-BitmapImage-图片

    title author date CreateTime categories WPF 从 DrawingVisual 转 BitmapImage 图片 lindexi 2018-12-27 11:3 ...

  8. 基于EPCLYPSE的DDS控制器(一)

    软硬件平台 操作系统:windows11 软件平台:vivado2021.1 开发套件 硬件平台:Digilent Eclypse-Z7 Zmod开发套件 vivado 工程搭建 ①直接拉取笔者的三个 ...

  9. 13.prometheus监控tengine(无用)

    一.环境准备 1.1 docker安装tengine带nginx-module-vts模块(二选一) mkdir /data/ -p cd /data/ # 通过git clone下载已经创建好的do ...

  10. 钉消息Markdown语法

    支持的Markdown语法 1 标题 2 # 一级标题 3 ## 二级标题 4 ### 三级标题 5 #### 四级标题 6 ##### 五级标题 7 ###### 六级标题 8 9 引用 10 &g ...