Files
dm-manage-web/src/views/zs/clue/ClueForm/components/MapDialog.vue
2023-08-29 10:34:48 +08:00

172 lines
5.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<el-dialog width="800px" title="地图编辑" :visible.sync="visible" append-to-body @close="closeDialog">
<div id="dialogMap" class="dialog-map" style="height: 400px; width: 100%;" />
<el-input id="search" v-model="searchBody" class="search-body" placeholder="请输入..." />
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false"> </el-button>
<el-button type="primary" @click="handleMapSave"> </el-button>
</span>
</el-dialog>
</template>
<script>
import AMap from 'AMap';
export default {
data() {
return {
dialogMap: null,
visible: false,
placeSearch: null,
currentPoint: undefined,
marker: null,
searchBody: undefined,
geocoder: null
};
},
beforeDestroy() {
console.log('mapdialog----beforeDestroy');
this.marker = null;
this.placeSearch = null;
this.dialogMap && this.dialogMap.destroy();
this.dialogMap = null;
},
mounted() {
console.log('mounted');
this.initData();
},
created() {
console.log('created');
},
methods: {
initData(point = undefined) {
console.log(point);
this.visible = true;
// this.searchBody = undefined
this.$nextTick(() => {
this.resetData();
if (point) {
this.currentPoint = point;
}
this.initMap();
});
},
resetData() {
this.currentPoint = undefined;
this.dialogMap && this.marker && this.dialogMap.remove(this.marker);
this.marker = null;
// this.placeSearch = null;
this.searchBody = null;
},
initMap() {
console.log('初始化地图');
if (!this.dialogMap) {
this.dialogMap = new AMap.Map('dialogMap', {
zoom: 12,
resizeEnable: true,
center: [117.283042, 31.86119]
});
this.dialogMap.on('click', ev => {
this.currentPoint.lat = ev.lnglat.lat;
this.currentPoint.lng = ev.lnglat.lng;
this.regeoCode();
this.marker && this.dialogMap.remove(this.marker);
this.marker = new AMap.Marker({
position: [this.currentPoint.lng, this.currentPoint.lat],
icon: require(`@/assets/images/place/flag_red.png`)
});
this.dialogMap.add(this.marker);
});
this.dialogMap.addControl(new AMap.Scale());
const auto = new AMap.Autocomplete({
input: 'search' // 前端搜索框
});
this.placeSearch = new AMap.PlaceSearch({
map: this.dialogMap,
pageSize: 10, // 单页显示结果条数
pageIndex: 1, // 页码
autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
});
AMap.event.addListener(auto, 'select', this.select);
this.geocoder = new AMap.Geocoder();
}
this.initMapCenter();
},
// 初始化编辑地图的中心点
initMapCenter() {
if (this.currentPoint && this.currentPoint.lat && this.currentPoint.lng) {
this.searchBody = this.currentPoint.address;
this.marker = new AMap.Marker({
map: this.dialogMap,
position: [this.currentPoint.lng, this.currentPoint.lat],
icon: require(`@/assets/images/place/flag_red.png`)
});
this.dialogMap.setCenter([this.currentPoint.lng, this.currentPoint.lat]);
this.dialogMap.setZoom(14);
}
},
// 选择查询结果
select(e) {
this.placeSearch.setCity(e.poi.adcode);
this.placeSearch.search(e.poi.name, (status, result) => {
// 搜索成功时result即是对应的匹配数据
if (result && result.info && result.info === 'OK' && result.poiList && result.poiList.pois && result.poiList.pois.length > 0) {
this.currentPoint.lat = result.poiList.pois[0].location.lat;
this.currentPoint.lng = result.poiList.pois[0].location.lng;
this.currentPoint.address = e.poi.name;
this.dialogMap.clearMap();
this.marker && this.dialogMap.remove(this.marker);
this.marker = new AMap.Marker({
map: this.dialogMap,
position: [this.currentPoint.lng, this.currentPoint.lat],
icon: require(`@/assets/images/place/flag_red.png`)
});
this.dialogMap.setZoom(14);
this.dialogMap.setCenter([this.currentPoint.lng, this.currentPoint.lat]);
}
});
},
// 定位地址
regeoCode() {
this.geocoder.getAddress(
[this.currentPoint.lng, this.currentPoint.lat],
(status, result) => {
if (status === 'complete' && result.regeocode) {
this.currentPoint.address = result.regeocode.formattedAddress;
this.searchBody = result.regeocode.formattedAddress;
}
}
);
},
handleMapSave() {
if (this.currentPoint.lat && this.currentPoint.lng) {
// 通知父组件
this.$emit('handleMapDialogPoint', this.currentPoint);
this.visible = false;
this.$emit('update:mapDialogVisible', false);
} else {
this.$message.error('请在地图上选择位置后保存!');
}
},
closeDialog() {
this.$emit('update:mapDialogVisible', false);
}
}
};
</script>
<style scoped>
.dialog-map {
width: 100%;
height: 400px;
}
.search-body {
position: absolute;
top: 90px;
left: 25px;
width: 350px;
}
</style>