8 changed files with 1371 additions and 343 deletions
After Width: | Height: | Size: 1.6 KiB |
@ -0,0 +1,987 @@ |
|||||
|
<template> |
||||
|
<div class="screen-center"> |
||||
|
<div id="map" style="height: 100%;width: 100%;position: relative;min-width:1000px"> |
||||
|
<!-- <div style="position: absolute;left:16%;top: 10px;cursor: pointer;z-index: 100;color: #fff;font-size: 40px;"> |
||||
|
<div style="display: flex;justify-content: space-around;flex-direction: row;width: 30vw;"> |
||||
|
<div v-for="item in topNum" |
||||
|
:key="item.value" |
||||
|
style="background-color: rgba(8, 31, 45, 0.6);padding: 30px;display: flex;flex-direction: column;align-items: center;"> |
||||
|
<div style="padding-bottom: 20px;"> |
||||
|
{{item.value&&getThousandth(item.value)}} |
||||
|
</div> |
||||
|
<div style="border-top: 5px solid #36acd3;padding-top: 20px;display: flex;align-items: center;white-space: nowrap;"> |
||||
|
<el-image style="height: 60px;" |
||||
|
:src="require('../../assets/shuline.png')" |
||||
|
fit="fill"></el-image> |
||||
|
{{item.label||"--" }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> --> |
||||
|
<div @click="initialization" style="position: absolute;left: 100px;bottom: 100px;cursor: pointer;z-index: 100;"> |
||||
|
<el-image style="width: 50px; height: 50px;" :src="require('../../assets/back.png')" fit="fill"></el-image> |
||||
|
</div> |
||||
|
<div |
||||
|
style="position: absolute;right:50px;bottom:50px;z-index: 100;border-radius: 16px;padding:20px; border: 1px solid #045775;font-size: 40px;color: #fff;height: 400px;display: flex;flex-direction: column;justify-content: space-around;"> |
||||
|
<div v-for="item in buttonPiece" :key="item.value" |
||||
|
style="display: flex;align-items: center;cursor: pointer;padding: 8px 0;" |
||||
|
@click="selectType(item.value, item.label)" |
||||
|
:style="{ background: item.value == buttonIndex ? 'linear-gradient(to top, rgba(16, 98, 130,1), rgba(16, 98, 130,0))' : '' }"> |
||||
|
<el-image style="width: 40px; height: 40px;margin-right: 12px;" :src="require('../../assets/ling.png')" |
||||
|
fit="fill"></el-image> |
||||
|
{{ item.label }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div v-if="showFirst" |
||||
|
style="position: absolute;right:1200px;bottom:200px;z-index: 100;padding:20px;font-size: 40px;color: #fff;height: 500px;display: flex;flex-direction: column;justify-content:space-around;border-radius: 16px;padding:20px; border: 1px solid #045775;align-items: center;background-color: rgba(5, 36, 49,0.5);"> |
||||
|
<div |
||||
|
style="margin-bottom: 24px;display: flex;justify-content: space-between;align-items: center;width: 100%;"> |
||||
|
<div> |
||||
|
|
||||
|
</div> |
||||
|
<div> |
||||
|
微网格信息 |
||||
|
</div> |
||||
|
<div style="color: #fff;cursor: pointer;" @click="close"> |
||||
|
x |
||||
|
</div> |
||||
|
</div> |
||||
|
<div v-for="item in microgridArr" :key="item.value" |
||||
|
style="display: flex;flex-direction: row;align-items: center;cursor: pointer;padding: 4px;" |
||||
|
@click="microgridDetails(item)" |
||||
|
:style="{ background: item.value == microgridIndex ? 'linear-gradient(to right, rgba(16, 98, 130,1), rgba(16, 98, 130,0))' : '' }"> |
||||
|
<div style="margin-right:80px"> |
||||
|
<el-image style="width: 40px; height: 40px;margin-right: 12px;vertical-align: text-top;" |
||||
|
:src="require('../../assets/ling.png')" fit="fill"></el-image> |
||||
|
{{ item.label }} |
||||
|
</div> |
||||
|
<div> |
||||
|
> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div v-if="showMicrogridDetails" |
||||
|
style="position: absolute;right:400px;bottom:100px;z-index: 100;padding:20px;font-size: 40px;color: #fff;height: auto;display: flex;flex-direction: column;border-radius: 16px;padding:20px; border: 1px solid #045775;background-color: rgba(7, 100, 133,0.5);"> |
||||
|
<div style="margin-bottom: 38px;"> |
||||
|
<div |
||||
|
style="background: linear-gradient(to right, rgba(6, 227, 218,1), rgba(6, 227, 218,0));display: flex;justify-content: space-between;flex-direction: row;padding: 12px;margin-bottom: 38px;"> |
||||
|
<div> |
||||
|
{{ microgridObj.firstTitle || "--" }} |
||||
|
</div> |
||||
|
<div style="color: #fff;cursor: pointer;" @click="showMicrogridDetails = false"> |
||||
|
x |
||||
|
</div> |
||||
|
</div> |
||||
|
<div> |
||||
|
<div style="margin-bottom: 38px;"> |
||||
|
微网格长:{{ microgridObj.leader }} |
||||
|
</div> |
||||
|
<div style="margin-bottom: 38px;"> |
||||
|
性别:{{ microgridObj.gender }} |
||||
|
</div> |
||||
|
<div style="margin-bottom: 38px;"> |
||||
|
电话:{{ microgridObj.phone }} |
||||
|
</div> |
||||
|
<div style="margin-bottom: 38px;"> |
||||
|
住址:{{ microgridObj.address }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div> |
||||
|
<div |
||||
|
style="background: linear-gradient(to right, rgba(6, 227, 218,1), rgba(6, 227, 218,0));display: flex;justify-content: space-between;flex-direction: row;padding: 12px;margin-bottom: 38px;"> |
||||
|
<div> |
||||
|
{{ microgridObj.secondTitle || "--" }} |
||||
|
</div> |
||||
|
<div> |
||||
|
总数:{{ microgridObj.total || "--" }}户 |
||||
|
</div> |
||||
|
</div> |
||||
|
<div |
||||
|
style="max-width: 700px;min-width: 700px;overflow-x: clip; text-overflow:ellipsis;white-space: nowrap;"> |
||||
|
<div v-for="item in microgridObj.list" :key="item.value" |
||||
|
style="margin-bottom: 30px;cursor: pointer;" :title="item.label"> |
||||
|
<span style="margin-right: 12px;"> |
||||
|
{{ item.value }} |
||||
|
</span> |
||||
|
<span> |
||||
|
{{ item.label }} |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="display: flex;justify-content: flex-end;"> |
||||
|
<el-pagination background layout="prev, pager, next" :total="microgridObj.total" |
||||
|
@current-change="handleCurrentChange"> |
||||
|
</el-pagination> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import markIcon from "@/assets/position.png"; |
||||
|
import markIcons from "@/assets/positions.png"; |
||||
|
import * as turf from '@turf/turf'; |
||||
|
import axios from 'axios'; |
||||
|
import mapboxgl from 'mapbox-gl'; |
||||
|
import 'mapbox-gl/dist/mapbox-gl.css'; |
||||
|
import { mapGetters } from "vuex"; |
||||
|
const md5 = require('blueimp-md5'); |
||||
|
export default { |
||||
|
name: "screen-center", |
||||
|
data() { |
||||
|
return { |
||||
|
map: null, |
||||
|
colorList: ["#F84E2D", "#1372EC", "#44DEA3", "#FFC544", "#6C44FF"], |
||||
|
attrAndColor: [], |
||||
|
shibeiJson: null, |
||||
|
resolutions: [ |
||||
|
156543.03392800014, 78271.516963999937, 39135.758482000092, 19567.879240999919, |
||||
|
9783.9396204999593, 4891.9698102499797, 2445.9849051249898, 1222.9924525624949, 611.49622628137968, |
||||
|
305.74811314055756, 152.87405657041106, 76.437028285073239, 38.21851414253662, 19.10925707126831, |
||||
|
9.5546285356341549, 4.7773142679493699, 2.3886571339746849, 1.1943285668550503, 0.59716428355981721, |
||||
|
0.29858214164761665, 0.149291070823808325, 0.0746455354119041625 |
||||
|
], |
||||
|
hoveredStateId: null, |
||||
|
topNum: [ |
||||
|
{ |
||||
|
label: "用户总数", |
||||
|
value: 330195 |
||||
|
}, |
||||
|
{ |
||||
|
label: "党员总数", |
||||
|
value: 74830 |
||||
|
}, |
||||
|
{ |
||||
|
label: "党群总数", |
||||
|
value: 9501 |
||||
|
}, |
||||
|
{ |
||||
|
label: "话题总数", |
||||
|
value: 286508 |
||||
|
}, |
||||
|
{ |
||||
|
label: "议题总数", |
||||
|
value: 223829 |
||||
|
}, |
||||
|
{ |
||||
|
label: "诉求总数", |
||||
|
value: 215450 |
||||
|
} |
||||
|
], |
||||
|
buttonPiece: [ |
||||
|
{ |
||||
|
value: 1, |
||||
|
label: "居民" |
||||
|
}, |
||||
|
{ |
||||
|
value: 2, |
||||
|
label: "房屋" |
||||
|
}, |
||||
|
{ |
||||
|
value: 3, |
||||
|
label: "党支部" |
||||
|
}, |
||||
|
// { |
||||
|
// value: 4, |
||||
|
// label: "用户" |
||||
|
// }, |
||||
|
// { |
||||
|
// value: 5, |
||||
|
// label: "党员" |
||||
|
// }, |
||||
|
// { |
||||
|
// value: 6, |
||||
|
// label: "事件" |
||||
|
// } |
||||
|
], |
||||
|
buttonIndex: 0, |
||||
|
markerJson: null, |
||||
|
layersIndex: 1, |
||||
|
features: {}, |
||||
|
showFirst: false, |
||||
|
showMicrogridDetails: false, |
||||
|
microgridArr: [ |
||||
|
{ |
||||
|
value: 1, |
||||
|
label: "第一微网格" |
||||
|
}, |
||||
|
{ |
||||
|
value: 2, |
||||
|
label: "第二微网格" |
||||
|
}, |
||||
|
{ |
||||
|
value: 3, |
||||
|
label: "第三微网格" |
||||
|
}, |
||||
|
{ |
||||
|
value: 4, |
||||
|
label: "第四微网格" |
||||
|
}, |
||||
|
{ |
||||
|
value: 5, |
||||
|
label: "第五微网格" |
||||
|
}, |
||||
|
{ |
||||
|
value: 6, |
||||
|
label: "第六微网格" |
||||
|
}, |
||||
|
], |
||||
|
microgridIndex: 0, |
||||
|
microgridObj: { |
||||
|
firstTitle: "", |
||||
|
leader: "张俊凯", |
||||
|
gender: "男", |
||||
|
phone: "15623523200", |
||||
|
address: "市北区", |
||||
|
secondTitle: "包干房屋", |
||||
|
total: 37, |
||||
|
list: [ |
||||
|
{ |
||||
|
value: 1, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 2, |
||||
|
label: "市北区敦化路53号4号楼2单元202" |
||||
|
}, |
||||
|
{ |
||||
|
value: 3, |
||||
|
label: "市北区山东路168号时代国际广场1402号" |
||||
|
}, |
||||
|
{ |
||||
|
value: 4, |
||||
|
label: "市北区山东路120号玫瑰花园6号楼3单元506" |
||||
|
}, |
||||
|
{ |
||||
|
value: 5, |
||||
|
label: "市北区南宁路32号2单元501" |
||||
|
}, |
||||
|
{ |
||||
|
value: 6, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 7, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 8, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 9, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 10, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 11, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 12, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 13, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 14, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 15, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 16, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 17, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 18, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 19, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 20, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
] |
||||
|
}, |
||||
|
microgridObjCopy: { |
||||
|
firstTitle: "", |
||||
|
leader: "张俊凯", |
||||
|
gender: "男", |
||||
|
phone: "15623523200", |
||||
|
address: "市北区", |
||||
|
secondTitle: "包干房屋", |
||||
|
total: 37, |
||||
|
list: [ |
||||
|
{ |
||||
|
value: 1, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 2, |
||||
|
label: "市北区敦化路53号4号楼2单元202" |
||||
|
}, |
||||
|
{ |
||||
|
value: 3, |
||||
|
label: "市北区山东路168号时代国际广场1402号" |
||||
|
}, |
||||
|
{ |
||||
|
value: 4, |
||||
|
label: "市北区山东路120号玫瑰花园6号楼3单元506" |
||||
|
}, |
||||
|
{ |
||||
|
value: 5, |
||||
|
label: "市北区南宁路32号2单元501" |
||||
|
}, |
||||
|
{ |
||||
|
value: 6, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 7, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 8, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 9, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 10, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 11, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 12, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 13, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 14, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 15, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 16, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 17, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 18, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 19, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
{ |
||||
|
value: 20, |
||||
|
label: "市北区台柳路12号4单元101" |
||||
|
}, |
||||
|
] |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
mounted() { |
||||
|
this.shibeiJson = require('./shibei.json'); |
||||
|
console.log(this.shibeiJson); |
||||
|
for (let i in this.shibeiJson.features) { |
||||
|
this.shibeiJson.features[i].properties.resiNum = '88', |
||||
|
this.shibeiJson.features[i].properties.houseNum = '66' |
||||
|
this.shibeiJson.features[i].properties.partNum = '第一党支部' |
||||
|
} |
||||
|
console.log(this.shibeiJson.features); |
||||
|
this.markerJson = require('./markerJson.json'); |
||||
|
this.init() |
||||
|
this.microgridObj.list = JSON.parse(JSON.stringify(this.microgridObjCopy.list)).slice(0, 5) |
||||
|
}, |
||||
|
computed: { |
||||
|
...mapGetters(['shibeiAId', 'shibeiName', 'shibeiAgencyType']), |
||||
|
getThousandth() { |
||||
|
return function (val) { |
||||
|
if (!val) { |
||||
|
return "--" |
||||
|
} |
||||
|
return val.toLocaleString() |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
watch: { |
||||
|
shibeiAId(value) { |
||||
|
this.topNum.forEach((f, i, arr) => { |
||||
|
arr[i]["value"] = f.value - 1000 |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
init() { |
||||
|
// 初始化map对象,加载天地图底图 |
||||
|
mapboxgl.accessToken = "pk.eyJ1IjoiZGp4YyIsImEiOiJjanlxdzNlbW0wNHNyM29yMzZibHczOHlpIn0.TOUXgB6IHHhnmA6RsL6pWw"; |
||||
|
this.map = new mapboxgl.Map({ |
||||
|
container: 'map', // container id |
||||
|
center: [120.38140448734, 36.11044959486], // starting position [lng, lat] |
||||
|
zoom: 12.5, // starting zoom |
||||
|
// maxZoom: 12.5, // 22 |
||||
|
// minZoom: 9, |
||||
|
bearing: 0, |
||||
|
pitch: 40, |
||||
|
style: { |
||||
|
version: 8, |
||||
|
sources: { |
||||
|
}, |
||||
|
glyphs: "mapbox://fonts/mapbox/{fontstack}/{range}.pbf", |
||||
|
layers: [ |
||||
|
], |
||||
|
} |
||||
|
}); |
||||
|
const _this = this; |
||||
|
this.map.on('load', function () { |
||||
|
_this.getPolygonJson(_this.shibeiJson) |
||||
|
_this.map.on('mousemove', 'shibeiPolygonLayer', function (e) { |
||||
|
_this.map.getCanvas().style.cursor = 'pointer'; // 鼠标样式 |
||||
|
|
||||
|
}); |
||||
|
_this.map.on("click", "shibeiPolygonLayer", function (e) { |
||||
|
console.log(e); |
||||
|
const features = _this.map.queryRenderedFeatures(e.point); |
||||
|
console.log(features); |
||||
|
if (_this.layersIndex === 3) { |
||||
|
_this.showFirst = true |
||||
|
} |
||||
|
if (features.length > 0) { |
||||
|
_this.features = features[0] |
||||
|
if (features[0]["properties"]["type"] && features[0]["properties"]["type"] == "marker") { |
||||
|
_this.makeMarker(features[0]) |
||||
|
return |
||||
|
} |
||||
|
if (features[0]["properties"]["name"].indexOf("网格") != -1) { |
||||
|
return |
||||
|
} |
||||
|
_this.getBoundary(features[0]["properties"]["adcode"] || features[0]["properties"]["subId"]) |
||||
|
|
||||
|
_this.map.setZoom(13.5) |
||||
|
_this.map.setCenter(features[0]["geometry"]["coordinates"][0][0]) |
||||
|
|
||||
|
if (_this.map.getLayer("shibeiPolygonLayer")) { |
||||
|
_this.map.removeLayer("shibeiPolygonLayer") |
||||
|
_this.map.removeLayer("text_JSON_layer") |
||||
|
_this.map.removeSource("shibeiPolygonSource") |
||||
|
} |
||||
|
if (_this.map.getLayer("SinglePolygonLayer")) { |
||||
|
_this.map.removeLayer("SinglePolygonLayer") |
||||
|
_this.map.removeLayer("SingleTextLayer") |
||||
|
|
||||
|
_this.map.removeSource("SinglePolygonSource") |
||||
|
} |
||||
|
if (_this.map.getLayer("text_JSON_layer-num")) { |
||||
|
_this.map.removeLayer("text_JSON_layer-num") |
||||
|
} |
||||
|
for (let i = 8; i <= 18; i++) { |
||||
|
if (_this.map.getLayer("lineBufferLayer-" + i)) { |
||||
|
_this.map.removeLayer("lineBufferLayer-" + i) |
||||
|
_this.map.removeSource("lineBufferSource-" + i) |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// _this.addSinglePolygon(features[0]) |
||||
|
}); |
||||
|
// 鼠标移入要素时的高亮效果 |
||||
|
// _this.map.on('mousemove', 'shibeiPolygonLayer', function (e) { |
||||
|
// _this.map.getCanvas().style.cursor = 'pointer'; // 鼠标样式 |
||||
|
// if (_this.map.getLayer("heightPolygonLayer")) { |
||||
|
// _this.map.removeLayer("heightPolygonLayer") |
||||
|
// _this.map.removeSource("heightPolygonSource") |
||||
|
// } |
||||
|
// let feature = e.features[0]; |
||||
|
// _this.addHeightPolygon(feature) |
||||
|
// }); |
||||
|
// _this.map.on('mouseleave', 'shibeiPolygonLayer', function (e) { |
||||
|
// if (_this.map.getLayer("heightPolygonLayer")) { |
||||
|
// _this.map.removeLayer("heightPolygonLayer") |
||||
|
// _this.map.removeSource("heightPolygonSource") |
||||
|
// } |
||||
|
// }); |
||||
|
}) |
||||
|
}, |
||||
|
getPolygonJson(obj) { |
||||
|
let shibeiPolyline = JSON.parse(JSON.stringify(obj)) |
||||
|
for (let i = 0; i < shibeiPolyline.features.length; i++) { |
||||
|
shibeiPolyline.features[i].geometry.type = 'MultiLineString' //面转线 |
||||
|
shibeiPolyline.features[i].geometry.coordinates = this.convertPolygonToPolyline(shibeiPolyline.features[ |
||||
|
i].geometry.coordinates) |
||||
|
} |
||||
|
|
||||
|
this.addPolygon(obj) |
||||
|
this.addPolyline(shibeiPolyline) |
||||
|
|
||||
|
}, |
||||
|
convertPolygonToPolyline(MultiPolygon) { |
||||
|
let MultiLineString = [] |
||||
|
MultiPolygon.forEach(Polygon => { |
||||
|
Polygon.forEach(LinearRing => { |
||||
|
let LineString = LinearRing |
||||
|
MultiLineString.push(LineString) |
||||
|
}) |
||||
|
}); |
||||
|
return MultiLineString |
||||
|
}, |
||||
|
addPolygon(geojson) { |
||||
|
this.map.addSource('shibeiPolygonSource', { |
||||
|
'type': 'geojson', |
||||
|
'data': geojson |
||||
|
}); |
||||
|
this.map.addLayer({ |
||||
|
'id': 'shibeiPolygonLayer', |
||||
|
'type': 'fill-extrusion', |
||||
|
'source': 'shibeiPolygonSource', |
||||
|
'paint': { |
||||
|
'fill-extrusion-vertical-gradient': true, |
||||
|
'fill-extrusion-color': "#00466e", |
||||
|
'fill-extrusion-height': 300, |
||||
|
'fill-extrusion-base': 310, |
||||
|
'fill-extrusion-opacity': 0.3 // 调整透明度值 |
||||
|
} |
||||
|
}); |
||||
|
this.map.addLayer({ |
||||
|
id: "text_JSON_layer", |
||||
|
type: "symbol", |
||||
|
source: "shibeiPolygonSource", |
||||
|
// minzoom: 5, |
||||
|
// maxzoom: 22, |
||||
|
interactive: true, |
||||
|
paint: { |
||||
|
'text-color': '#fff', |
||||
|
}, |
||||
|
"layout": { |
||||
|
"text-field": "{name}", |
||||
|
'text-size': 25 |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
addSinglePolygon(geojson) { |
||||
|
this.map.addSource('SinglePolygonSource', { |
||||
|
'type': 'geojson', |
||||
|
'data': geojson |
||||
|
}); |
||||
|
|
||||
|
this.map.addLayer({ |
||||
|
'id': 'SinglePolygonLayer', |
||||
|
'type': 'fill-extrusion', |
||||
|
'source': 'SinglePolygonSource', |
||||
|
'paint': { |
||||
|
'fill-extrusion-vertical-gradient': true, |
||||
|
'fill-extrusion-color': "#1d597b", |
||||
|
'fill-extrusion-height': 300, |
||||
|
'fill-extrusion-base': 0, |
||||
|
'fill-extrusion-opacity': 1 |
||||
|
} |
||||
|
}); |
||||
|
this.map.addLayer({ |
||||
|
id: "SingleTextLayer", |
||||
|
type: "symbol", |
||||
|
source: "SinglePolygonSource", |
||||
|
// minzoom: 5, |
||||
|
// maxzoom: 22, |
||||
|
interactive: true, |
||||
|
paint: { |
||||
|
'text-color': '#fff', |
||||
|
}, |
||||
|
"layout": { |
||||
|
"text-field": "{name}", |
||||
|
'text-size': 40 |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
addHeightPolygon(geojson) { |
||||
|
this.map.addSource('heightPolygonSource', { |
||||
|
'type': 'geojson', |
||||
|
'data': geojson |
||||
|
}); |
||||
|
this.map.addLayer({ |
||||
|
'id': 'heightPolygonLayer', |
||||
|
'type': 'fill-extrusion', |
||||
|
'source': 'heightPolygonSource', |
||||
|
'paint': { |
||||
|
'fill-extrusion-vertical-gradient': true, |
||||
|
'fill-extrusion-color': "#b3b817", |
||||
|
'fill-extrusion-height': 300, |
||||
|
'fill-extrusion-base': 0, |
||||
|
'fill-extrusion-opacity': 1 |
||||
|
}, |
||||
|
}); |
||||
|
}, |
||||
|
addPolyline(geojson) { |
||||
|
// 8 ~ 18 级 |
||||
|
for (let i = 8; i <= 18; i++) { |
||||
|
let radius = 1 * this.resolutions[i + 1] // 2个像素,缓冲后4个像素 |
||||
|
let lineBuffer = turf.buffer(geojson, radius, { |
||||
|
units: 'meters' |
||||
|
}); |
||||
|
this.map.addSource('lineBufferSource-' + i, { |
||||
|
'type': 'geojson', |
||||
|
'data': lineBuffer |
||||
|
}); |
||||
|
this.map.addLayer({ |
||||
|
'id': 'lineBufferLayer-' + i, |
||||
|
'type': 'fill-extrusion', |
||||
|
'source': 'lineBufferSource-' + i, |
||||
|
"minzoom": (i - 1), |
||||
|
"maxzoom": (i + 1), |
||||
|
'paint': { |
||||
|
'fill-extrusion-vertical-gradient': true, |
||||
|
'fill-extrusion-color': '#00e4fa', |
||||
|
'fill-extrusion-height': 310, // 挤出高度 |
||||
|
'fill-extrusion-base': 300,// 底部的高度。必须小于或等于挤出高度 |
||||
|
'fill-extrusion-opacity': 0.3 |
||||
|
} |
||||
|
}); |
||||
|
// this.map.addLayer({ |
||||
|
// id: 'shibeiPolylineShadow-', |
||||
|
// type: 'fill-extrusion', |
||||
|
// source: 'lineBufferSource-' + i, |
||||
|
// paint: { |
||||
|
// 'fill-extrusion-color': [ |
||||
|
// 'interpolate', |
||||
|
// ['linear'], |
||||
|
// ['get', 'height'], |
||||
|
// 0, '#05c3e3', // 内阴影底部颜色 |
||||
|
// // 300, '#0089aa' // 内阴影顶部颜色 |
||||
|
// ], |
||||
|
// 'fill-extrusion-height': 310, // 内阴影的底部高度 |
||||
|
// 'fill-extrusion-base': 300, // 内阴影的顶部高度 |
||||
|
// 'fill-extrusion-opacity': 0.3, // 内阴影的透明度 |
||||
|
// }, |
||||
|
// light: null, // 设置光照效果为 null |
||||
|
// },) |
||||
|
} |
||||
|
}, |
||||
|
initialization() { |
||||
|
if (this.map.getLayer("text_JSON_layer-num")) { |
||||
|
// 如果存在,移除图层 |
||||
|
this.map.removeLayer("text_JSON_layer-num"); |
||||
|
} |
||||
|
if (this.map.getLayer("shibeiPolygonLayer")) { |
||||
|
this.map.removeLayer("shibeiPolygonLayer") |
||||
|
this.map.removeLayer("text_JSON_layer") |
||||
|
this.map.removeSource("shibeiPolygonSource") |
||||
|
} |
||||
|
if (this.map.getLayer("SinglePolygonLayer")) { |
||||
|
this.map.removeLayer("SinglePolygonLayer") |
||||
|
this.map.removeLayer("SingleTextLayer") |
||||
|
this.map.removeSource("SinglePolygonSource") |
||||
|
} |
||||
|
|
||||
|
for (let i = 8; i <= 18; i++) { |
||||
|
if (this.map.getLayer("lineBufferLayer-" + i)) { |
||||
|
this.map.removeLayer("lineBufferLayer-" + i) |
||||
|
this.map.removeSource("lineBufferSource-" + i) |
||||
|
} |
||||
|
} |
||||
|
if (this.map.getLayer("pointDimensions")) { |
||||
|
this.map.removeLayer("pointDimensions") |
||||
|
this.map.removeSource("pointDimensions") |
||||
|
this.map.removeImage("markIcons") |
||||
|
} |
||||
|
if (this.map.getLayer("pointDimension")) { |
||||
|
this.map.removeLayer("pointDimension") |
||||
|
this.map.removeSource("pointDimension") |
||||
|
this.map.removeImage("markIcon") |
||||
|
} |
||||
|
this.layersIndex = 1; |
||||
|
this.buttonIndex = 0; |
||||
|
this.getPolygonJson(this.shibeiJson); |
||||
|
this.map.setZoom(12.5); |
||||
|
this.map.setCenter([120.38140448734, 36.11044959486]); |
||||
|
this.close(); |
||||
|
}, |
||||
|
selectType(value, label) { |
||||
|
// if (value === this.buttonIndex) { |
||||
|
// this.buttonIndex = 0 |
||||
|
// this.makeMarkers(this.markerJson) |
||||
|
// return |
||||
|
// } |
||||
|
this.buttonIndex = value |
||||
|
if (this.map.getLayer('text_JSON_layer-num')) { |
||||
|
this.map.removeLayer('text_JSON_layer-num'); |
||||
|
} |
||||
|
let json = { |
||||
|
"type": "FeatureCollection", |
||||
|
"features": JSON.parse(JSON.stringify(this.markerJson.features)).filter(f => { |
||||
|
return f.properties.name == label |
||||
|
}) |
||||
|
} |
||||
|
if (value == 1) { |
||||
|
this.map.addLayer({ |
||||
|
id: "text_JSON_layer-num", |
||||
|
type: "symbol", |
||||
|
source: "shibeiPolygonSource", |
||||
|
// minzoom: 5, |
||||
|
// maxzoom: 22, |
||||
|
interactive: true, |
||||
|
paint: { |
||||
|
'text-color': '#fff', |
||||
|
}, |
||||
|
"layout": { |
||||
|
"text-field": "{resiNum}", |
||||
|
'text-size': 25, |
||||
|
'text-offset': [0, -1.5] |
||||
|
} |
||||
|
}); |
||||
|
} else if (value == 2) { |
||||
|
this.map.addLayer({ |
||||
|
id: "text_JSON_layer-num", |
||||
|
type: "symbol", |
||||
|
source: "shibeiPolygonSource", |
||||
|
// minzoom: 5, |
||||
|
// maxzoom: 22, |
||||
|
interactive: true, |
||||
|
paint: { |
||||
|
'text-color': '#fff', |
||||
|
}, |
||||
|
"layout": { |
||||
|
"text-field": "{houseNum}", |
||||
|
'text-size': 25, |
||||
|
'text-offset': [0, -1.5] |
||||
|
} |
||||
|
}); |
||||
|
} else if (value == 3) { |
||||
|
this.map.addLayer({ |
||||
|
id: "text_JSON_layer-num", |
||||
|
type: "symbol", |
||||
|
source: "shibeiPolygonSource", |
||||
|
// minzoom: 5, |
||||
|
// maxzoom: 22, |
||||
|
interactive: true, |
||||
|
paint: { |
||||
|
'text-color': '#fff', |
||||
|
}, |
||||
|
"layout": { |
||||
|
"text-field": "{partNum}", |
||||
|
'text-size': 25, |
||||
|
'text-offset': [0, -1.5] |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
this.makeMarkers(json) |
||||
|
}, |
||||
|
getBoundary(id) { |
||||
|
const ts = Date.now(); |
||||
|
let signConfig = { |
||||
|
key: '612d304095c50369c3ef06e490f05779eeb8f19ff16566c73aeafafc5fa01970', |
||||
|
dataType: 'real', |
||||
|
appId: 'acc4ad66c82a7b46e741364b4c62dce2', |
||||
|
customerId: 'b09527201c4409e19d1dbc5e3c3429a1', |
||||
|
authType: 'md5', |
||||
|
} |
||||
|
const token = md5(`${signConfig.key}:${ts}`); |
||||
|
axios({ |
||||
|
method: "post", |
||||
|
url: "https://epmet-open.elinkservice.cn/api/data/report/screen/agency/compartment", |
||||
|
data: { |
||||
|
agencyId: id |
||||
|
}, |
||||
|
headers: { |
||||
|
AccessToken: token, |
||||
|
AppId: signConfig.appId, |
||||
|
CustomerId: signConfig.customerId, |
||||
|
AuthType: signConfig.authType, |
||||
|
ts |
||||
|
} |
||||
|
}).then(e => { |
||||
|
if (e.data.code == 0 && e.data.data) { |
||||
|
if (e.data.data.agencyDistribution && e.data.data.agencyDistribution.length == 0) { |
||||
|
return |
||||
|
} |
||||
|
console.log(e.data); |
||||
|
if (this.map.getLayer("shibeiPolygonLayer")) { |
||||
|
this.map.removeLayer("shibeiPolygonLayer") |
||||
|
this.map.removeLayer("text_JSON_layer") |
||||
|
this.map.removeSource("shibeiPolygonSource") |
||||
|
} |
||||
|
if (this.map.getLayer("SinglePolygonLayer")) { |
||||
|
this.map.removeLayer("SinglePolygonLayer") |
||||
|
this.map.removeLayer("SingleTextLayer") |
||||
|
this.map.removeSource("SinglePolygonSource") |
||||
|
} |
||||
|
for (let i = 8; i <= 18; i++) { |
||||
|
if (this.map.getLayer("lineBufferLayer-" + i)) { |
||||
|
this.map.removeLayer("lineBufferLayer-" + i) |
||||
|
this.map.removeSource("lineBufferSource-" + i) |
||||
|
} |
||||
|
} |
||||
|
let obj = { |
||||
|
type: "FeatureCollection", |
||||
|
name: "index", |
||||
|
features: e.data.data.agencyDistribution |
||||
|
} |
||||
|
obj.features.forEach(f => { |
||||
|
f.type = "Feature" |
||||
|
f.properties = {} |
||||
|
f.geometry = {} |
||||
|
f.properties.subId = f.subId || "" |
||||
|
f.properties.name = f.subName || "" |
||||
|
f.geometry.type = "MultiPolygon" |
||||
|
f.geometry.coordinates = [[JSON.parse(f.subAreaMarks)]] || [] |
||||
|
delete f.agencyLevel |
||||
|
delete f.subAreaMarks |
||||
|
delete f.subCenterMark |
||||
|
delete f.subId |
||||
|
delete f.subName |
||||
|
}) |
||||
|
this.getPolygonJson(obj) |
||||
|
|
||||
|
if (this.features["properties"]["name"].indexOf("社区") != -1) { |
||||
|
this.selectType(0, "") |
||||
|
this.layersIndex = 3 |
||||
|
} |
||||
|
} |
||||
|
}).catch(f => { |
||||
|
console.log(f); |
||||
|
}) |
||||
|
}, |
||||
|
makeMarkers(json) { |
||||
|
const _this = this; |
||||
|
if (_this.map.getLayer("pointDimension")) { |
||||
|
_this.map.removeLayer("pointDimension") |
||||
|
_this.map.removeSource("pointDimension") |
||||
|
_this.map.removeImage("markIcon") |
||||
|
} |
||||
|
_this.map.loadImage(markIcon, function (error, image) { |
||||
|
_this.map.addImage("markIcon", image); |
||||
|
_this.map.addSource("pointDimension", { |
||||
|
type: "geojson" /* geojson类型资源 */, |
||||
|
data: json |
||||
|
}); |
||||
|
_this.map.addLayer({ |
||||
|
id: "pointDimension", |
||||
|
type: "symbol" /* symbol类型layer,一般用来绘制点*/, |
||||
|
source: "pointDimension", |
||||
|
layout: { |
||||
|
"icon-image": "markIcon", |
||||
|
"icon-size": 1, |
||||
|
}, |
||||
|
// paint: { |
||||
|
// "circle-radius": 4, |
||||
|
// "circle-color": "#B42222" |
||||
|
// } |
||||
|
}); |
||||
|
// |
||||
|
_this.map.addLayer({ |
||||
|
id: "pointDimension-text", |
||||
|
type: "symbol", |
||||
|
source: "pointDimension", |
||||
|
layout: { |
||||
|
"text-field": "{resiNum}", // 替换为包含文字信息的属性 |
||||
|
"text-size": 15, |
||||
|
"text-offset": [0, -5], // 调整文字位置,根据需要调整 |
||||
|
// "text-background-color": "#000", // 设置文字背景色 |
||||
|
// "text-background-opacity": 0.7, // 设置文字背景透明度 |
||||
|
}, |
||||
|
paint: { |
||||
|
"text-color": "#fff", // 设置文字颜色 |
||||
|
"text-halo-width": 10, // 设置文字描边宽度,模拟背景宽度 |
||||
|
"text-halo-color": "#000", // 设置文字描边颜色,模拟背景颜色 |
||||
|
}, |
||||
|
}); |
||||
|
}) |
||||
|
_this.layersIndex = 3 |
||||
|
|
||||
|
}, |
||||
|
makeMarker(json) { |
||||
|
const _this = this; |
||||
|
if (_this.map.getLayer("pointDimensions")) { |
||||
|
_this.map.removeLayer("pointDimensions") |
||||
|
_this.map.removeSource("pointDimensions") |
||||
|
_this.map.removeImage("markIcons") |
||||
|
} |
||||
|
_this.showFirst = true |
||||
|
_this.map.loadImage(markIcons, function (error, image) { |
||||
|
_this.map.addImage("markIcons", image); |
||||
|
_this.map.addSource("pointDimensions", { |
||||
|
type: "geojson" /* geojson类型资源 */, |
||||
|
data: json |
||||
|
}); |
||||
|
|
||||
|
_this.map.addLayer({ |
||||
|
id: "pointDimensions", |
||||
|
type: "symbol" /* symbol类型layer,一般用来绘制点*/, |
||||
|
source: "pointDimensions", |
||||
|
layout: { |
||||
|
"icon-image": "markIcons", |
||||
|
"icon-size": 2, |
||||
|
}, |
||||
|
// paint: { |
||||
|
// "circle-radius": 4, |
||||
|
// "circle-color": "#B42222" |
||||
|
// } |
||||
|
}); |
||||
|
}); |
||||
|
}, |
||||
|
microgridDetails(item) { |
||||
|
this.showMicrogridDetails = true |
||||
|
this.microgridIndex = item.value |
||||
|
this.microgridObj.firstTitle = item.label |
||||
|
}, |
||||
|
close() { |
||||
|
this.showFirst = false |
||||
|
this.showMicrogridDetails = false |
||||
|
}, |
||||
|
handleCurrentChange(e) { |
||||
|
let times = 5 |
||||
|
this.microgridObj.list = JSON.parse(JSON.stringify(this.microgridObjCopy.list)).slice(e * times - times, e * times) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.screen-center { |
||||
|
flex: 1; |
||||
|
min-width: 1000px; |
||||
|
background: url('../../assets/images/mapBg.png') no-repeat; |
||||
|
background-size: 100% 100%; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
::v-deep .mapboxgl-ctrl { |
||||
|
display: none !important; |
||||
|
} |
||||
|
|
||||
|
::v-deep .el-pagination.is-background .el-pager li:not(.disabled).active { |
||||
|
background-color: #0aabca; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue