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.
201 lines
5.7 KiB
201 lines
5.7 KiB
<template>
|
|
<div :style="{position: 'relative', width: '100%', height: '640px'}">
|
|
<div id="fengmapRight" />
|
|
<div class="rightMask" />
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import fengmap from '@/assets/fengmap/fengmap.map.min'
|
|
import { FMControlPosition, FMToolbar, FMScaleBar } from '@/assets/fengmap/fengmap.plugin.ui.min.js'
|
|
import '@/assets/fengmap/fengmap.effect.min'
|
|
import locationIcon from '@/assets/images/red.png'
|
|
|
|
export default {
|
|
name: 'FengMap',
|
|
props: {
|
|
mapData: {
|
|
type: Object,
|
|
require: true,
|
|
default: function() {
|
|
return {}
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
map: null,
|
|
level: null,
|
|
levelName: null,
|
|
levels: null,
|
|
marker: null,
|
|
scrollFloorControl: null,
|
|
scaleBar: null,
|
|
areaFid: null
|
|
}
|
|
},
|
|
watch: {
|
|
mapData: {
|
|
handler(newVal, oldVal) {
|
|
if (!newVal) {
|
|
console.log('newVal-null')
|
|
return
|
|
}
|
|
},
|
|
deep: true
|
|
}
|
|
},
|
|
mounted() {
|
|
console.log('mapData', this.mapData)
|
|
},
|
|
methods: {
|
|
dispose() {
|
|
if (this.scrollFloorControl) {
|
|
this.scrollFloorControl.remove()
|
|
}
|
|
if (this.map) {
|
|
this.map.dispose()
|
|
this.map = null
|
|
}
|
|
},
|
|
initMap() {
|
|
window.vueInstance = null
|
|
try {
|
|
console.log('this.level', this.level)
|
|
console.log('开始初始化地图')
|
|
const options = {
|
|
container: document.getElementById('fengmapRight'),
|
|
appName: this.mapData && this.mapData.appName,
|
|
key: this.mapData && this.mapData.mapKey,
|
|
mapID: this.mapData && this.mapData.appId,
|
|
// mapURL: '/fengmap/data/',
|
|
// themeID: '1574346301450625025',
|
|
// themeURL: '/fengmap/data/theme/',
|
|
level: this.level,
|
|
mapZoom: 19.5,
|
|
backgroundColor: '#fff'
|
|
}
|
|
console.log('地图配置:', options)
|
|
|
|
this.map = new fengmap.FMMap(options)
|
|
console.log('地图实例已创建')
|
|
|
|
// this.map.on('loadingProcess', (event) => {
|
|
// console.log('加载进度:', event.progress)
|
|
// this.debugInfo = `加载进度: ${event.progress}%`
|
|
// })
|
|
|
|
this.map.on('loaded', () => {
|
|
console.log('地图加载完成')
|
|
this.map.setViewMode(fengmap.FMViewMode.MODE_3D)
|
|
|
|
// 楼层控件
|
|
const scrollFloorCtlOpt = {
|
|
position: FMControlPosition.RIGHT_TOP,
|
|
floorButtonCount: 5,
|
|
offset: {
|
|
x: -20,
|
|
y: 150
|
|
},
|
|
viewModeControl: true,
|
|
floorModeControl: true,
|
|
needAllLayerBtn: true
|
|
}
|
|
this.scrollFloorControl = new FMToolbar(scrollFloorCtlOpt)
|
|
this.scrollFloorControl.addTo(this.map)
|
|
|
|
// 比例尺控件
|
|
const scrollScaleBarCtlOpt = {
|
|
fontSize: 18,
|
|
height: 30,
|
|
position: FMControlPosition.LEFT_BOTTOM,
|
|
offset: {
|
|
x: 20,
|
|
y: -20
|
|
}
|
|
}
|
|
this.scaleBar = new FMScaleBar(scrollScaleBarCtlOpt)
|
|
this.scaleBar.addTo(this.map)
|
|
|
|
// 根据FID查询
|
|
if (this.areaFid) {
|
|
const floor = this.map.getFloor(this.level)
|
|
console.log('floor', floor)
|
|
const model = floor.getLayers(fengmap.FMType.MODEL_LAYER)[0].getFeatures().find(item => item.FID === this.areaFid)
|
|
console.log('model', model)
|
|
console.log('model', model.getData())
|
|
// const feature = model.getData()
|
|
|
|
this.marker = new fengmap.FMImageMarker({
|
|
url: locationIcon,
|
|
x: model.x,
|
|
y: model.y,
|
|
anchor: fengmap.FMMarkerAnchor.BOTTOM
|
|
})
|
|
|
|
model.setColor('#FF6633')
|
|
this.marker.addTo(floor)
|
|
this.map.setCenter({ x: model.x, y: model.y })
|
|
this.map.setZoom({ 'zoom': 21 })
|
|
// model.flash('red')
|
|
}
|
|
|
|
window.vueInstance = this
|
|
console.log('Vue实例已全局挂载:', window.vueInstance)
|
|
}, { passive: true })
|
|
|
|
this.map.on('click', (e) => {
|
|
this.marker && this.marker.remove()
|
|
this.marker = null
|
|
}, { passive: true })
|
|
|
|
this.map.on('mapInitError', (err) => {
|
|
console.error('地图初始化错误:', err)
|
|
this.debugInfo = `地图初始化错误: ${err.message}`
|
|
})
|
|
|
|
this.map.on('levelChanged', function(event) {
|
|
console.log('levelChanged:', event)
|
|
console.log('当前楼层:', event.level)
|
|
console.log('楼层name2', window.vueInstance.map.getFloor(event.level).name)
|
|
})
|
|
} catch (error) {
|
|
console.error('初始化地图失败:', error)
|
|
this.debugInfo = `初始化失败: ${error.message}`
|
|
}
|
|
},
|
|
getCurrentLevel() {
|
|
this.level = this.map.getLevel()
|
|
this.levelName = this.map.getFloor(this.level).name
|
|
// floorID level name
|
|
console.log('楼层info', this.map.getFloor(this.level))
|
|
console.log('楼层name1', this.map.getFloor(this.level).name)
|
|
// 所有
|
|
console.log('getFloorInfos', this.map.getFloorInfos())
|
|
window.vueInstance.$emit('refreshLevel', this.level, this.levelName)
|
|
}
|
|
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@import "~@/assets/fengmap/toolBarStyle.css";
|
|
|
|
#fengmapRight {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background: #f5f5f5;
|
|
}
|
|
.rightMask{
|
|
width: 162px;
|
|
height: 42px;
|
|
position: absolute;
|
|
bottom: 0;
|
|
right: 0;
|
|
background: #fff;
|
|
}
|
|
</style>
|