1
This commit is contained in:
parent
0e0de02af8
commit
10d711d844
@ -1,151 +0,0 @@
|
||||
<template>
|
||||
<div class="map-container" ref="mapContainer">
|
||||
<!-- 地图 -->
|
||||
<div
|
||||
class="map"
|
||||
:style="{
|
||||
backgroundImage: `url(${mapImage})`,
|
||||
transform: `scale(${scale})`,
|
||||
transformOrigin: '0 0',
|
||||
width: `${mapWidth}px`,
|
||||
height: `${mapHeight}px`
|
||||
}"
|
||||
@click="addLocation"
|
||||
>
|
||||
<!-- 库位 -->
|
||||
<div
|
||||
v-for="(location, index) in locations"
|
||||
:key="index"
|
||||
class="location"
|
||||
:style="{
|
||||
left: `${location.projectX}px`,
|
||||
top: `${location.projectY}px`,
|
||||
transform: `scale(${scale})` // 反向缩放库位图片
|
||||
}"
|
||||
>
|
||||
<img src="@/assets/location-icon.png" alt="库位" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 放大缩小按钮 -->
|
||||
<div class="controls">
|
||||
<button @click="zoomIn">放大</button>
|
||||
<button @click="zoomOut">缩小</button>
|
||||
<button @click="saveLocations">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import mapImage from '@/assets/warehouse-map.png' // 扫描图路径
|
||||
import locationIcon from '@/assets/location-icon.png' // 库位图标路径
|
||||
|
||||
const origin = [-54.4, -34.2]
|
||||
const resolution = 0.05
|
||||
|
||||
const mapContainer = ref(null) // 地图容器
|
||||
const scale = ref(1) // 缩放比例
|
||||
const locations = ref([]) // 库位列表
|
||||
const mapWidth = ref(0) // 地图宽度
|
||||
const mapHeight = ref(0) // 地图高度
|
||||
|
||||
// 加载地图图片并设置初始尺寸
|
||||
onMounted(() => {
|
||||
const img = new Image()
|
||||
img.src = mapImage
|
||||
img.onload = () => {
|
||||
mapWidth.value = img.width
|
||||
mapHeight.value = img.height
|
||||
}
|
||||
})
|
||||
|
||||
// 添加库位
|
||||
const addLocation = (event) => {
|
||||
const rect = mapContainer.value.getBoundingClientRect()
|
||||
const scrollLeft = mapContainer.value.scrollLeft // 水平滚动条偏移量
|
||||
const scrollTop = mapContainer.value.scrollTop // 垂直滚动条偏移量
|
||||
const devicePixelRatio = window.devicePixelRatio || 1
|
||||
|
||||
// 计算页面坐标(考虑设备像素比和滚动条偏移量)
|
||||
const projectX = (event.clientX - rect.left + scrollLeft) / scale.value / devicePixelRatio
|
||||
const projectY = (event.clientY - rect.top + scrollTop) / scale.value / devicePixelRatio
|
||||
|
||||
// 转换为实际坐标
|
||||
const actualX = (projectX - origin[0]) / resolution
|
||||
const actualY = (projectY - origin[1]) / resolution
|
||||
|
||||
// 添加库位
|
||||
locations.value.push({
|
||||
projectX,
|
||||
projectY,
|
||||
actualX,
|
||||
actualY
|
||||
})
|
||||
}
|
||||
|
||||
// 放大
|
||||
const zoomIn = () => {
|
||||
scale.value *= 1.2
|
||||
}
|
||||
|
||||
// 缩小
|
||||
const zoomOut = () => {
|
||||
scale.value /= 1.2
|
||||
}
|
||||
|
||||
// 保存点位坐标
|
||||
const saveLocations = () => {
|
||||
console.log(
|
||||
'项目点位坐标:',
|
||||
locations.value.map((loc) => ({ x: loc.projectX, y: loc.projectY }))
|
||||
)
|
||||
console.log(
|
||||
'实际现场点位坐标:',
|
||||
locations.value.map((loc) => ({ x: loc.actualX, y: loc.actualY }))
|
||||
)
|
||||
alert('点位坐标已保存,请查看控制台输出。')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.map-container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 80vh;
|
||||
overflow: auto;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.map {
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.location {
|
||||
position: absolute;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.location img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.controls {
|
||||
position: fixed;
|
||||
top: 110px;
|
||||
right: 110px;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.controls button {
|
||||
padding: 5px 10px;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue
Block a user