金五联管理系统PC前端
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.
 
 
 
 
jwl-manage-web/src/views/zs/clue/ClueForm/components/MapDialog.vue

170 lines
5.3 KiB

<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
}
},
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.$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>