You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

371 lines
8.7 KiB

<template>
<navigation-general :title="title">
<template v-slot:right>
<view class="nav-right">
<view class="right-item">{{buildData.length}}</view>
<view class="right-item">该层未排查{{weiPaimo}}</view>
</view>
</template>
<view class="floor-list" :style="{top:boxTop + 'rpx'}" :msg="mapData" :change:msg="leaflet.receiveMsg">
<view :class="currentIndex == index ? 'active-foolt' : ''" v-for="(item, index) in list" :key="index"
@click="clickFoort(item,index)">
{{ item.name }}
</view>
</view>
<view id="map" class="map"></view>
</navigation-general>
</template>
//逻辑层级
<script>
import {
handleColor
} from '@/utils/handlerColor.js'
import buildjson from "./buildjson/buildjson";
import {
getNumNew
} from "@/api/taicangpop/data";
export default {
data() {
return {
currentIndex: null,
boxTop: 0,
title: '',
deptname: '',
weiPaimo: 0,
totalHouse: 0,
mapData: null,
buildData: [],
}
},
onLoad(opt) {
const systemData = this.$u.sys()
this.boxTop = (systemData.statusBarHeight + 44) * 2 + 20
this.title = opt.name
this.deptname = opt.deptname + opt.name
this.buildingId = opt.buildingId
},
onShow(){
this.currentIndex = this.currentIndex ? this.currentIndex : 0
this.getBuildData(this.currentIndex)
},
methods: {
// 获取该楼层数据
async getBuildData(index) {
this.list = buildjson[this.deptname.replace("幢", "")];
let res = await getNumNew({
buildingId: this.buildingId,
});
this.buildData = res.data
this.clickFoort(this.list[index],index)
},
filterListData(index) {
this.weiPaimo = 0
this.list[index].json.features.map(item => {
let houseItem = this.buildData.find(
(it) =>
it.name.replace("室", "") == item.properties.TextString
);
if (houseItem && houseItem.id) {
if (item.daycount > 0) {
this.weiPaimo = item.weiPaimo + 1
}
houseItem = handleColor([houseItem])[0]
item.properties = {
...item.properties,
...houseItem
};
}
})
},
clickFoort(item, index) {
this.filterListData(index)
this.mapData = item
this.currentIndex = index
},
// 接收renderjs发回的数据
reciveMessage(val) {
if (val.isNoHouse) {
uni.showToast({
title: val.title,
icon: 'none'
})
} else if (val.isRouter) {
this.$u.route({
url: 'pages/house/house',
params: val.params
})
}
console.log('receiveRenderData-->', val);
}
}
}
</script>
//试图层级
<script module="leaflet" lang="renderjs">
import "leaflet/dist/leaflet.css"
import L from "leaflet"
let globalMap = null
export default {
data() {
return {
mapData: null,
mapLayer: {
geoJsonLayer: null,
},
geojson: null,
previousLayer: null,
highlightStyle: {
fill: true,
fillColor: "#FD873F",
fillOpacity: 0.9,
color: "#02F5FF", //描边颜色
weight: 2, //描边宽度
},
}
},
mounted() {
this.initMap()
},
methods: {
initMap() {
globalMap = L.map('map', {
center: [31.47687, 121.11881], // 地图中心[纬度,经度]
zoom: 11, // 地图层级
maxZoom: 22,
minZoom: 11,
zoomControl: false, // 放大缩小按钮
attributionControl: false, // 右下角leaflet图标
})
// L.tileLayer(
// 'http://t0.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=9813be7882272b227babab98c39a64b6')
// .addTo(globalMap)
globalMap.createPane("geoJsonLayer");
globalMap.getPane("geoJsonLayer").style.zIndex = 502;
globalMap.getPane("geoJsonLayer").style.pointerEvents = "none";
this.mapLayer.geoJsonLayer = L.featureGroup().addTo(globalMap);
globalMap.createPane("marker");
globalMap.getPane("marker").style.zIndex = 503;
globalMap.getPane("marker").style.pointerEvents = "none";
this.mapLayer.marker = L.featureGroup().addTo(globalMap);
globalMap.on("zoomend", (e) => {
let zoom = globalMap.getZoom();
if (zoom <= 19) {
globalMap.removeLayer(this.mapLayer.marker);
} else {
globalMap.addLayer(this.mapLayer.marker);
}
});
},
// 接收逻辑层发送的数据
receiveMsg(newValue, oldValue, ownerVm, vm) {
console.log('ssss', newValue)
if (!newValue) return
this.clickFloor(newValue)
//数据变化
},
clickFloor(item) {
if (item && item.disable) {
this.sendMsg({
isNoHouse: true,
title: '该楼层功能正在开发中!'
})
return;
}
this.mapLayer.geoJsonLayer.clearLayers();
this.mapLayer.marker.clearLayers();
this.geojson = null;
this.initPolygon(item.json);
},
// 渲染面
initPolygon(json) {
this.geojson = L.geoJSON(json, {
pane: "geoJsonLayer",
style: {
fill: true,
fillColor: "#0B3369",
fillOpacity: 0.9,
color: "#02F5FF", //描边颜色
weight: 2, //描边宽度
},
onEachFeature: (feature, layer) => {
const attr = feature.properties;
// console.log(attr, 'ssss')
const point = layer._bounds.getCenter();
this.addTextMarker(attr, point);
layer.on("click", (e) => {
const item = e.target.feature.properties;
if (item.TextString == null) return;
if (!item.id) {
this.sendMsg({
isNoHouse: true,
title: '该户数据缺失,请联系管理员!'
})
return;
}
if (this.previousLayer) {
this.geojson.resetStyle(this.previousLayer);
}
this.previousLayer = layer;
layer.setStyle(this.highlightStyle);
this.sendMsg({
isRouter: true,
params: {
buildingId: item.building_id,
houseId: item.id,
deptId: item.dept_id,
houseName: item.name
}
})
});
},
}).addTo(this.mapLayer.geoJsonLayer);
globalMap.fitBounds(this.geojson.getBounds());
},
addTextMarker(attr, point) {
if (attr.TextString == null) return;
var myIcon = L.divIcon({
className: "building-marker",
html: `<div class="houser">
<div class="point-color">
<div style="background: red;display:${
attr.daycount > 0 ? "block" : "none"
}"></div>
<div style="background: green;display:${
attr.daycount == 0 ? "block" : "none"
}"></div>
</div>
<div class="house-is">
<div class="is_d is_type" style="display:${attr.is_d ? "block" : "none"}"> </div>
<div class="is_j is_type" style="display:${attr.is_j ? "block" : "none"}"> </div>
<div class="is_k is_type" style="display:${attr.is_k ? "block" : "none"}"> </div>
<div class="is_x is_type" style="display:${attr.is_x ? "block" : "none"}"> </div>
</div>
<div class="house-name">${attr.TextString}</div>
<div class="left-color" style="background:${attr.leftColor}"></div>
<div class="right-color">
<div style=" background: ${attr.rightTopColor} "></div>
<div
class="rigth-bottom"
style="display:${
attr.color == "HF" || attr.color == "NF" ? "block" : "none"
}"
></div>
</div>
</div>`,
});
L.marker([point.lat, point.lng], {
icon: myIcon,
interactive: false, //禁止marker交互防止遮挡点不到面
}).addTo(this.mapLayer.marker);
},
sendMsg(item) {
// 向页面传参
this.$ownerInstance.callMethod('reciveMessage', item)
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
position: relative;
.nav-right {
margin-right: 14rpx;
display: flex;
flex-direction: column;
align-items: center;
.right-item {
box-sizing: border-box;
padding: 0 6rpx;
font-size: 22rpx;
background: #fff;
color: red;
}
.right-item:last-child {
margin-top: 4rpx;
background-color: red;
color: #fff;
}
}
.floor-list {
position: absolute;
left: 0;
z-index: 600;
width: 260rpx;
display: grid;
grid-template-columns: repeat(2, 1fr);
/* 每行两个元素 */
gap: 10px;
/* 元素之间的间距 */
padding: 16rpx;
/* 容器内边距 */
&>view {
text-align: center;
color: #fff;
cursor: pointer;
padding: 8rpx 12rpx;
font-size: 30rpx;
border: 1px solid #0075b7;
border-radius: 6px;
margin-bottom: 6px;
background: #031c3c;
}
&>div:hover,
.active-foolt {
background: #1292c7 !important;
}
}
}
.map {
width: 100%;
height: 100vh;
}
</style>