d3地图添加全屏
This commit is contained in:
parent
3122c18550
commit
0b98f72e17
@ -1,9 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div ref="mapContainer" class="map-container"></div>
|
<div ref="mapContainer" class="map-container" :class="{ 'fullscreen': isFullscreen }">
|
||||||
|
<button class="fullscreen-btn" @click="toggleFullscreen">
|
||||||
|
{{ isFullscreen ? '退出全屏' : '全屏' }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted, watch,defineEmits } from 'vue'
|
import { ref, onMounted, watch, defineEmits, onBeforeUnmount } from 'vue'
|
||||||
import * as d3 from 'd3'
|
import * as d3 from 'd3'
|
||||||
import chinaData from './newJson.json'
|
import chinaData from './newJson.json'
|
||||||
|
|
||||||
@ -22,20 +27,21 @@ const props = defineProps({
|
|||||||
})
|
})
|
||||||
const emit = defineEmits(['qvehuan1']);
|
const emit = defineEmits(['qvehuan1']);
|
||||||
const mapContainer = ref(null)
|
const mapContainer = ref(null)
|
||||||
let svg, mapGroup, markersGroup, zoom
|
const isFullscreen = ref(false)
|
||||||
|
let svg, mapGroup, markersGroup, zoom, width, height
|
||||||
|
|
||||||
const initMap = () => {
|
const initMap = () => {
|
||||||
const width = 1000
|
// 动态获取容器尺寸
|
||||||
const height = 800
|
width = mapContainer.value.clientWidth?mapContainer.value.clientWidth:800
|
||||||
|
height = mapContainer.value.clientHeight?mapContainer.value.clientHeight:600
|
||||||
const projection = d3.geoMercator()
|
const projection = d3.geoMercator()
|
||||||
.center([104, 37])
|
.center([104, 37])
|
||||||
.scale(600)
|
.scale(isFullscreen.value ? 1000 : 600)
|
||||||
.translate([width / 2, height / 2])
|
.translate([width / 2, height / 2])
|
||||||
|
|
||||||
const path = d3.geoPath().projection(projection)
|
const path = d3.geoPath().projection(projection)
|
||||||
|
|
||||||
if (svg) svg.selectAll("*").remove()
|
if (svg) svg.remove()
|
||||||
|
|
||||||
svg = d3.select(mapContainer.value)
|
svg = d3.select(mapContainer.value)
|
||||||
.append('svg')
|
.append('svg')
|
||||||
@ -82,12 +88,28 @@ const initMap = () => {
|
|||||||
})
|
})
|
||||||
svg.call(zoom)
|
svg.call(zoom)
|
||||||
}
|
}
|
||||||
|
const handleResize = () => {
|
||||||
|
if (!isFullscreen.value) return
|
||||||
|
initMap()
|
||||||
|
updateRoute()
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggleFullscreen = () => {
|
||||||
|
isFullscreen.value = !isFullscreen.value
|
||||||
|
setTimeout(() => {
|
||||||
|
initMap()
|
||||||
|
updateRoute()
|
||||||
|
}, 100)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const updateRoute = () => {
|
const updateRoute = () => {
|
||||||
|
width = mapContainer.value.clientWidth?mapContainer.value.clientWidth:800
|
||||||
|
height = mapContainer.value.clientHeight?mapContainer.value.clientHeight:600
|
||||||
const projection = d3.geoMercator()
|
const projection = d3.geoMercator()
|
||||||
.center([104, 37])
|
.center([104, 37])
|
||||||
.scale(600)
|
.scale(isFullscreen.value ? 1000 : 600)
|
||||||
.translate([1000 / 2, 800 / 2])
|
.translate([width / 2, height / 2])
|
||||||
if (initqie.value) {
|
if (initqie.value) {
|
||||||
// debugger
|
// debugger
|
||||||
mapGroup.selectAll('.route-path').remove()
|
mapGroup.selectAll('.route-path').remove()
|
||||||
@ -108,7 +130,7 @@ const updateRoute = () => {
|
|||||||
.attr('d', d3.geoPath().projection(projection))
|
.attr('d', d3.geoPath().projection(projection))
|
||||||
.attr('fill', 'none')
|
.attr('fill', 'none')
|
||||||
.attr('stroke', '#f00')
|
.attr('stroke', '#f00')
|
||||||
.attr('stroke-width', 1)
|
.attr('stroke-width', 0.1)
|
||||||
.attr('stroke-dasharray', function () {
|
.attr('stroke-dasharray', function () {
|
||||||
return this.getTotalLength()
|
return this.getTotalLength()
|
||||||
})
|
})
|
||||||
@ -133,20 +155,24 @@ const updateRoute = () => {
|
|||||||
markersGroup.append('circle')
|
markersGroup.append('circle')
|
||||||
.attr('cx', x)
|
.attr('cx', x)
|
||||||
.attr('cy', y)
|
.attr('cy', y)
|
||||||
.attr('r', 1) // 根据缩放级别调整半径
|
.attr('r', 0.3) // 根据缩放级别调整半径
|
||||||
.attr('fill', '#ff4757')
|
.attr('fill', '#ff4757')
|
||||||
.attr('stroke', 'white')
|
.attr('stroke', 'white')
|
||||||
.attr('stroke-width', 0.1) // 同步调整描边宽度
|
.attr('stroke-width', 0) // 同步调整描边宽度
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const initqie = ref(false)
|
const initqie = ref(false)
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
window.addEventListener('resize', handleResize)
|
||||||
if (props.coordinates) {
|
if (props.coordinates) {
|
||||||
initMap()
|
initMap()
|
||||||
updateRoute()
|
updateRoute()
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
window.removeEventListener('resize', handleResize)
|
||||||
|
})
|
||||||
watch(() => props.qvehuan, (newVal) => {
|
watch(() => props.qvehuan, (newVal) => {
|
||||||
initqie.value = newVal
|
initqie.value = newVal
|
||||||
updateRoute()
|
updateRoute()
|
||||||
@ -157,11 +183,37 @@ watch(() => props.coordinates, (newVal) => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* 保持原有样式不变 */
|
|
||||||
.map-container {
|
.map-container {
|
||||||
|
position: relative;
|
||||||
background-color: #f0f8ff;
|
background-color: #f0f8ff;
|
||||||
margin: 20px;
|
margin: 20px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
touch-action: none;
|
touch-action: none;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen {
|
||||||
|
position: fixed !important;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
margin: 0 !important;
|
||||||
|
z-index: 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen-btn {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 25px;
|
||||||
|
z-index: 10000;
|
||||||
|
padding: 8px 16px;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
@ -64,7 +64,8 @@ service.interceptors.response.use(
|
|||||||
if (error.response.data) {
|
if (error.response.data) {
|
||||||
const { status, msg } = error.response.data;
|
const { status, msg } = error.response.data;
|
||||||
// token 过期,重新登录
|
// token 过期,重新登录
|
||||||
if (status === '403') {
|
// debugger
|
||||||
|
if (status == '403') {
|
||||||
ElMessageBox.confirm('当前页面已失效,请重新登录', '提示', {
|
ElMessageBox.confirm('当前页面已失效,请重新登录', '提示', {
|
||||||
confirmButtonText: 'OK',
|
confirmButtonText: 'OK',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
|
@ -104,7 +104,7 @@ const loading1 = ref(false)
|
|||||||
const loading2 = ref(false)
|
const loading2 = ref(false)
|
||||||
const loading3 = ref(false)
|
const loading3 = ref(false)
|
||||||
//文件对比-新增内容
|
//文件对比-新增内容
|
||||||
const sureSize = ref(100)
|
const sureSize = ref(10)
|
||||||
const sureTotal = ref()
|
const sureTotal = ref()
|
||||||
const sureCurrent = ref(1)
|
const sureCurrent = ref(1)
|
||||||
function diffSure() {
|
function diffSure() {
|
||||||
@ -131,7 +131,7 @@ function diffSure() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
//文件对比-变更内容
|
//文件对比-变更内容
|
||||||
const ChangeSize = ref(100)
|
const ChangeSize = ref(10)
|
||||||
const ChangeTotal = ref()
|
const ChangeTotal = ref()
|
||||||
const ChangeCurrent = ref(1)
|
const ChangeCurrent = ref(1)
|
||||||
function diffChange() {
|
function diffChange() {
|
||||||
@ -158,7 +158,7 @@ function diffChange() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
//文件对比-缺失内容
|
//文件对比-缺失内容
|
||||||
const MisseSize = ref(100)
|
const MisseSize = ref(10)
|
||||||
const MissTotal = ref()
|
const MissTotal = ref()
|
||||||
const MissCurrent = ref(1)
|
const MissCurrent = ref(1)
|
||||||
function diffMiss() {
|
function diffMiss() {
|
||||||
|
Loading…
Reference in New Issue
Block a user