import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import { render } from 'react-dom';
import { message, Tooltip } from 'antd';
import FireAddForm from '../components/alarm-add'
import LoacationSelect from '../components/location-select';
import moment from 'moment'
import './gis.less'
const MAPDOMID = 'fs-amap-container-fire';
let map = null;
const tabs = [
{ name: '应急物资', tab: 'xfyjwz', className: 'emergency_button' },
{ name: '消防救援', tab: 'xfjy', className: 'emergency_button' },
{ name: '人民武装部', tab: 'rmwzb', className: 'emergency_button' },
{ name: '医疗救援', tab: 'yljy', className: 'emergency_button' },
{ name: '应急避难场所', tab: 'yjbns', className: 'emergency_button' },
]
function Map(props) {
const { dispatch, actions, emergencyList, propTab, setLongitudeLatitude } = props;
const [delay, setDelay] = useState(true)
const [tab, setTab] = useState('xfyjwz')
const [visible, setVisible] = useState(false)
const [level, setLevel] = useState('I')
const [alarmData, setAlarmData] = useState()
const [locationVisible, setLocationVisible] = useState(false)
const [location, setLocation] = useState({})
const [alarmList, setAlarmList] = useState()
//查询告警列表数据
const getData = () => {
dispatch(actions?.firecontrol?.getFireAlarmList()).then(res => {
if (res?.payload?.data) {
setAlarmList(res?.payload?.data)
}
})
}
// 初始化GIS 组件销毁清空定时器
useEffect(() => {
loadMap();
getData()
}, []);
useEffect(() => {
if (alarmData) renderAlarmInfowindow(alarmData)
}, [level])
useEffect(() => {
if (propTab == 'overview') getData()
}, [propTab])
const setMapInitFit = () => {
map.setZoom(10.3)
map.setCenter([116.054664, 28.538966])
map.setPitch(22.9)
map.setRotation(0)
}
useEffect(() => {
if (!delay && (alarmList?.length > 0 || emergencyList['xfjy'])) {
map.clearMap()
map && renderMarkers()
map && renderAlarms()
setMapInitFit()
}
}, [delay, alarmList, emergencyList, propTab])
const renderMarkers = () => {
const data = emergencyList['xfjy']
data?.map((x, index) => {
var marker = new AMap.Marker({
position: new AMap.LngLat(x.location?.split(',')[0], x.location?.split(',')[1]),
// 将一张图片的地址设置为 icon
icon: '/assets/images/homepage/fire/rescue_icon.png',
// 设置了 icon 以后,设置 icon 的偏移量,以 icon 的 [center bottom] 为原点
offset: new AMap.Pixel(-13, -30),
zooms: [3, 19],
zIndex: 12,
});
marker.setTitle(x.teamName);
map.add(marker);
marker.setLabel({
zIndex: 13,
direction: 'right',
offset: new AMap.Pixel(-90, -40), //设置文本标注偏移量
content: "
" + x.teamName + "
", //设置文本标注内容
});
})
}
// 地图初始化
const loadMap = () => {
// 图片图层 实现瓦片地图中国地图样式 bounds 第一个点为左下角 第二个点为右上角
const imageLayer = new AMap.ImageLayer({
url: '/assets/images/map.svg',
bounds: new AMap.Bounds(
[115.800221, 28.265659],
[116.334849, 28.973298],
),
zooms: [3, 14],
});
map = new AMap.Map(MAPDOMID, {
center: [116.054664, 28.538966],
zoomEnable: true,
dragEnable: true,
viewMode: '3D',
pitch: 22.9,
labelzIndex: 130,
zoom: 10.3,
cursor: 'pointer',
mapStyle: 'amap://styles/4eb48d1ef0a024c73376fd2256d0b5a5',
layers: [
AMap.createDefaultLayer(),
imageLayer,
],
});
map.on('complete', () => {
// map.setZoom(17.4)
// map.setCenter([115.922069, 28.554867])
// map.setPitch(47.30)
// map.setRotation(1.7000)
setTimeout(() => {
setDelay(false)
}, 1000);
});
map.on('click', (e) => {
if (!e && !e.lnglat) {
return
}
const zoom = map.getZoom();
const pitch = map.getPitch();
const center = map.getCenter();
const Rotation = map.getRotation();
console.log('zoom' + zoom)
console.log('pitch' + pitch)
console.log('center' + center)
console.log('Rotation' + Rotation)
console.log('e.lnglat' + e.lnglat)
})
};
const renderAlarms = () => {
alarmList
?.filter(s => s.state == 1)
?.map((x, index) => {
var marker = new AMap.Marker({
position: new AMap.LngLat(x.longitude, x.latitude),
// 将一张图片的地址设置为 icon
icon: '/assets/images/homepage/communtity/markeralarm.png',
// 设置了 icon 以后,设置 icon 的偏移量,以 icon 的 [center bottom] 为原点
offset: new AMap.Pixel(-13, -30),
zooms: [3, 19],
zIndex: 14,
});
marker.setTitle(x.location);
map.add(marker);
// var circle = new AMap.Circle({
// center: [x.longitude, x.latitude],
// radius: 5000, //半径
// borderWeight: 3,
// strokeColor: "#AE0000",
// strokeOpacity: 1,
// strokeWeight: 6,
// strokeOpacity: 0.8,
// fillOpacity: 0.2,
// // strokeStyle: 'dashed',
// strokeDasharray: [10, 10],
// // 线样式还支持 'dashed'
// fillColor: 'rgba(243, 0, 0, 0.15)',
// zIndex: 50,
// })
// map.add(circle);
let infowindow = new AMap.InfoWindow({
isCustom: true, //使用自定义窗体
content: ``,
offset: new AMap.Pixel(233, 260)
});
marker.on('click', () => {
let position = marker.getPosition ? marker.getPosition() : marker.getCenter();
infowindow.open(map, position);
map.setCenter(position)
// map.setZoom(17.4)
// map.setPitch(47.30)
// map.setRotation(1.7000)
setAlarmData(x)
setTimeout(() => {
if (document.getElementById(`alarmcontentid${x.location}`)) {
renderAlarmInfowindow(x)
}
}, 50)
setLongitudeLatitude({ longitude: x.longitude, latitude: x.latitude })
})
})
}
//驾车路线规划
const drawDrivings = (location1, location2, alarmInfo, rescueInfo) => {
var driving = new AMap.Driving({});
// 根据起终点经纬度规划驾车导航路线
driving.search(new AMap.LngLat(location1[0], location1[1]), new AMap.LngLat(location2[0], location2[1]), function (status, result) {
// result 即是对应的驾车导航信息,相关数据结构文档请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult
if (status === 'complete') {
if (result.routes && result.routes.length) {
// 绘制第一条路线,也可以按需求绘制其它几条路线
drawRoute(result.routes[0])
props.routeCallback({ routes: result.routes[0] })
}
} else {
}
});
// driving.clear() //清除路线
}
function drawRoute(route) {
var path = parseRouteToPath(route)
var routeLine = new AMap.Polyline({
path: path,
isOutline: true,
outlineColor: 'rgba(118, 38, 63, 1)',
borderWeight: 2,
strokeWeight: 5,
strokeOpacity: 0.9,
strokeColor: 'rgba(118, 38, 63, 1)',
lineJoin: 'round'
})
map.add(routeLine);
// 调整视野达到最佳显示区域
map.setFitView([routeLine], false, [150, 150, 400, 400])
// setTimeout(() => {
// map.setZoom(map.getZoom() - 1)
// }, 1000);
}
//计算两点距离
function computeDis(p1, p2) {
return Math.round(p1.distance(p2));
}
// 解析DrivingRoute对象,构造成AMap.Polyline的path参数需要的格式
// DrivingResult对象结构参考文档 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DriveRoute
function parseRouteToPath(route) {
var path = []
for (var i = 0, l = route.steps.length; i < l; i++) {
var step = route.steps[i]
for (var j = 0, n = step.path.length; j < n; j++) {
path.push(step.path[j])
}
}
return path
}
const renderAlarmInfowindow = (x) => {
return x && render(
{
map.setCenter([116.054664, 28.538966])
map.setZoom(10.3)
map.setPitch(22.9)
map.setRotation(0)
map.clearInfoWindow();
}} />
事件时间
{moment(x?.createTime).format('YYYY-MM-DD HH:mm:ss')}
地址信息
{x?.location?.length > 20 ? x?.location?.substring(0, 20) + '...' : x?.location}
{
propTab == 'overview' &&
{
map.clearInfoWindow();
if (emergencyList['xfjy']?.length > 0) {
const list = emergencyList['xfjy'].sort((b, a) => computeDis(
new AMap.LngLat(x.longitude, x.latitude),
new AMap.LngLat(b.location?.split(',')[0], b.location?.split(',')[1])
) - computeDis(
new AMap.LngLat(x.longitude, x.latitude),
new AMap.LngLat(a.location?.split(',')[0], a.location?.split(',')[1])
))
const location = list[0]?.location
drawDrivings([x.longitude, x.latitude], location.split(','), x, list[0])
props.alarmOk({
alarmInfo: { ...x },
rescueInfo: list[0]
})
setTimeout(() => {
drawDrivings([x.longitude, x.latitude], location.split(','), x, list[0])
}, 200);
}
}}
>一键护航
}
,
document.getElementById(`alarmcontentid${x.location}`));
}
const renderLeftTop = () => {
return
{ setVisible(true) }} />
}
const onFinish = (values) => {
setLocation({})
dispatch(actions.firecontrol.addFireAlarm(
{
...values,
state: 1,
location: location?.location,
longitude: location?.lnglat?.split(',')[0],
latitude: location?.lnglat?.split(',')[1],
}
)).then(res => {
getData()
message.success('新增上报信息成功')
setVisible(false)
})
}
return (
<>
{/* 延缓加载遮罩 */}
{delay &&
}
{/* 地图容器 */}
{/* 底部按钮 */}
{props.propTab == 'item' && tabs.map((s, index) => {
return <>
{
setTab(s.tab)
s.className ? props.changeEmengencyTab(s.tab) : props.changeTab(s.tab)
if (s.tab == 'emergency') {
setTab('yjwz')
props.changeEmengencyTab('yjwz')
}
}}
>
{s.name}
{s.className &&
{emergencyList[s.tab]?.length}
}
>
})}
{/* 左上角图例 */}
{props.propTab == 'overview' && renderLeftTop()}
{/* 四周遮罩 */}
{/* 新增告警 */}
setVisible(false)}
locationClick={() => setLocationVisible(true)}
location={location}
onFinish={onFinish}
/>
{/* 位置选点 */}
setLocationVisible(false)}
locationSelect={(location) => {
setLocation(location)
setLocationVisible(false)
}}
/>
>
);
}
export default connect()(Map);