天地图添加多个覆盖物,点击覆盖物,切换选中的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. RocketMQ 端云一体化设计与实践

    简介:本文首先介绍了端云消息场景一体化的背景,然后重点分析了终端消息场景特点,以及终端消息场景支撑模型,最后对架构和存储内核进行了阐述.我们期望基于 RocketMQ 统一内核一体化支持终端和服务端不 ...

  2. PolarDB for PostgreSQL 开源路线图

    ​简介:作者:蔡乐 本文主要分享一下Polar DB for PG的开源路线图,虽然路线图已经拟定,但是作为开源产品,所有参与者都能提出修改意见,包括架构核心特性的技术以及周边生态和工具等,希望大家能 ...

  3. HMS数据库设置和优化

    简介:Hive Metastore (HMS) 是一种服务,用于在后端 RDBMS(例如 MySQL 或 PostgreSQL)中存储与 Apache Hive 和其他服务相关的元数据.本文主要分享H ...

  4. 干货|一文读懂阿里云数据库Autoscaling是如何工作的

    简介: 阿里云数据库实现了其特有的Autosaling能力,该能力由数据库内核.管控及DAS(数据库自治服务)团队共同构建,内核及管控团队提供了数据库Autoscaling的基础能力,DAS则负责性能 ...

  5. [Py] Python 接口数据用 pandas 高效写入 csv

    通过 pandas 把 dict 数据封装,调用接口方法写入 csv 文件. import pandas as pd data = [{"name": "a"} ...

  6. dotnet SemanticKernel 入门 调用原生本机技能

    本文将告诉大家如何在 SemanticKernel 里面调用原生本机技能,所谓原生本机技能就是使用 C# 代码编写的原生本地逻辑技能,这里的技能可讲的可不是游戏角色里面的技能哈,指的是实现某个功能的技 ...

  7. 如何用python运用ocr技术来识别文字

    要先安装ocr技术,也就是光学符号识别,通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其他印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的文本的技术(我在百度百科抄的), ...

  8. R3_Elasticsearch Index Setting

    索引的配置项按是否可以更改分为static属性与动态配置,所谓的静态配置即索引创建后不能修改.目录如下:生产环境中某索引结构(7.X后有变化) 索引静态配置 1.分片与压缩 index.number_ ...

  9. WebKit中WTFMove实现

    WTFMove定义位置: WTF/Source/wtf/StdLibExtras.h,其定义如下: #define WTFMove(value) std::move<WTF::CheckMove ...

  10. Windows server 2012 R2开机进入cmd,关闭后黑屏

    出现此问题,一般只有两种情况,操作系统装置前和操作系统装置后出现: 第一种: 装置操作系统的时候没有选择"Windows Server 2012 R2 Strandard( 带有GUI的服务 ...