204 lines
5.4 KiB
Vue
204 lines
5.4 KiB
Vue
|
|
<template>
|
|||
|
|
<view>
|
|||
|
|
<u-popup :show="visible">
|
|||
|
|
<view style="position: relative;height: 100vh;width: 100%;">
|
|||
|
|
<view class="button-area" style="padding: 8vh 32rpx 24rpx 32rpx; margin: 0;border: 0;position: relative;z-index: 2;display: block; top: 10rpx; border-radius: 0;">
|
|||
|
|
<u-input style="margin-bottom: 16px;" v-model="placeInput" @change="getLocations" placeholder="请输入并选择相应地点"></u-input>
|
|||
|
|
<view v-if="checkedMarker&&checkedMarker.name" class="selected">您已选择:{{ checkedMarker.name }}<text v-if="checkedMarker.address">({{ checkedMarker.address }})</text></view>
|
|||
|
|
<view v-for="(item, index) in placeList" :key="index" :label="item.name" :value="item.name" @click="addIcon(item.name)" class="place-list">
|
|||
|
|
<view style="display: flex;justify-content: space-between;">{{ item.name }}
|
|||
|
|
<view style="color: #8492a6; font-size: 13px;width: 50%">{{ item.address }}</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="map" id="map"></view>
|
|||
|
|
<view class="button-area">
|
|||
|
|
<view class="btn" @click="cancel">取 消</view>
|
|||
|
|
<view class="btn save" @click="submitForm">确 定</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</u-popup>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
//import { jsonp } from "vue-jsonp";
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
map: '',
|
|||
|
|
placeList: [],
|
|||
|
|
placeInput: '',
|
|||
|
|
markerList: [],
|
|||
|
|
checkedMarker: '',
|
|||
|
|
visible: false,
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
mounted() {
|
|||
|
|
// this.openDialog();
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
submitForm() {
|
|||
|
|
if(this.checkedMarker&&this.checkedMarker.name){
|
|||
|
|
this.$emit('selected', this.checkedMarker)
|
|||
|
|
this.visible = false;
|
|||
|
|
}else{
|
|||
|
|
this.$message.warning('您尚未选择地点!')
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
cancel() {
|
|||
|
|
this.visible = false;
|
|||
|
|
if (this.map) {
|
|||
|
|
this.map.removeEventListener('click', this.handleMapClick);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
openDialog() {
|
|||
|
|
this.visible = true;
|
|||
|
|
this.$nextTick(() => {
|
|||
|
|
this.map = new BMapGL.Map("map");
|
|||
|
|
var point = new BMapGL.Point(117.123237,36.657017);
|
|||
|
|
this.map.centerAndZoom(point, 15);
|
|||
|
|
this.map.enableScrollWheelZoom();
|
|||
|
|
var locationCtrl = new BMapGL.LocationControl();
|
|||
|
|
this.map.addControl(locationCtrl)
|
|||
|
|
this.map.addEventListener('click', this.handleMapClick);
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
handleMapClick(e) {
|
|||
|
|
const lng = e.latlng.lng;
|
|||
|
|
const lat = e.latlng.lat;
|
|||
|
|
// 逆地理编码
|
|||
|
|
jsonp("https://api.map.baidu.com/reverse_geocoding/v3/", {
|
|||
|
|
ak: "qr93Dm5Ph6Vb4n1aTfvHG9KZkvG8S4YU",
|
|||
|
|
output: "json",
|
|||
|
|
location: `${lat},${lng}`,
|
|||
|
|
}).then(res => {
|
|||
|
|
if (res.status === 0) {
|
|||
|
|
// 清除原有标记
|
|||
|
|
this.removeOverlay();
|
|||
|
|
// 新建标记
|
|||
|
|
const point = new BMapGL.Point(lng, lat);
|
|||
|
|
const marker = new BMapGL.Marker(point);
|
|||
|
|
this.map.addOverlay(marker);
|
|||
|
|
this.markerList = [marker];
|
|||
|
|
// 保存选中信息
|
|||
|
|
this.checkedMarker = {
|
|||
|
|
name: res.result.formatted_address,
|
|||
|
|
address: res.result.sematic_description,
|
|||
|
|
location: { lng, lat }
|
|||
|
|
};
|
|||
|
|
this.$forceUpdate();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
getLocations(place) {
|
|||
|
|
jsonp("https://api.map.baidu.com/place/v2/suggestion", {
|
|||
|
|
q: place,
|
|||
|
|
ak: "qr93Dm5Ph6Vb4n1aTfvHG9KZkvG8S4YU",
|
|||
|
|
region: '济南市',
|
|||
|
|
output: "json",
|
|||
|
|
})
|
|||
|
|
.then((json) => {
|
|||
|
|
console.log(json,23423434)
|
|||
|
|
this.placeList = json.result
|
|||
|
|
})
|
|||
|
|
.catch((err) => {
|
|||
|
|
console.log(err);
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
addIcon(e) {
|
|||
|
|
let arr = this.placeList.filter(ele => ele.name == e)
|
|||
|
|
if(arr.length){
|
|||
|
|
this.addMaker(arr)
|
|||
|
|
this.clickMaker(arr[0]);
|
|||
|
|
}else{
|
|||
|
|
this.addMaker(JSON.parse(JSON.stringify(this.placeList)))
|
|||
|
|
}
|
|||
|
|
this.placeList = []
|
|||
|
|
},
|
|||
|
|
removeOverlay() {
|
|||
|
|
this.markerList.forEach(ele => {
|
|||
|
|
this.map.removeOverlay(ele)
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
addMaker(list) {
|
|||
|
|
this.removeOverlay()
|
|||
|
|
list.forEach((ele, index) => {
|
|||
|
|
let point = new BMapGL.Point(ele.location.lng, ele.location.lat);
|
|||
|
|
if(index == 0){
|
|||
|
|
this.map.centerAndZoom(point, 15)
|
|||
|
|
}
|
|||
|
|
let marker = new BMapGL.Marker(point); // 创建标注
|
|||
|
|
this.map.addOverlay(marker);
|
|||
|
|
let that = this;
|
|||
|
|
this.markerList.push(marker)
|
|||
|
|
marker.addEventListener("click", function(){
|
|||
|
|
that.clickMaker(ele)
|
|||
|
|
});
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
clickMaker(e){
|
|||
|
|
this.checkedMarker = e;
|
|||
|
|
this.$forceUpdate();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
|
|||
|
|
.selected {
|
|||
|
|
margin-bottom: 16px;
|
|||
|
|
position: relative;z-index: 2;
|
|||
|
|
background: #DCE2E9;
|
|||
|
|
border-radius: 8rpx;
|
|||
|
|
padding: 12rpx 24rpx;
|
|||
|
|
}
|
|||
|
|
.map{
|
|||
|
|
width: 100%;
|
|||
|
|
margin-top: 16px;
|
|||
|
|
height: 100%;
|
|||
|
|
position: absolute;
|
|||
|
|
z-index: 1;
|
|||
|
|
left: 0;
|
|||
|
|
top: 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.button-area{
|
|||
|
|
position: absolute;
|
|||
|
|
z-index: 2;
|
|||
|
|
bottom: 0;
|
|||
|
|
padding: 24rpx 32rpx 68rpx;
|
|||
|
|
width: 100%;
|
|||
|
|
background: #fff;
|
|||
|
|
display: flex;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
margin-top: 40rpx;
|
|||
|
|
border-radius: 16px 16px 0px 0px;
|
|||
|
|
.btn{
|
|||
|
|
line-height: 72rpx;
|
|||
|
|
width: 176rpx;
|
|||
|
|
margin-right: 16rpx;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
border: 1px solid #B8C5D4;
|
|||
|
|
color: #282828;
|
|||
|
|
text-align: center;
|
|||
|
|
border-radius: 8rpx;
|
|||
|
|
}
|
|||
|
|
.reset{
|
|||
|
|
background: #DCE2E9;
|
|||
|
|
}
|
|||
|
|
.save{
|
|||
|
|
background: linear-gradient(103deg, #1D64CF 0%, #1590D4 99%);
|
|||
|
|
color: #fff;
|
|||
|
|
border: 0;
|
|||
|
|
flex-grow: 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.place-list{
|
|||
|
|
line-height: 32rpx;
|
|||
|
|
padding: 16rpx 0;
|
|||
|
|
border-bottom: 1px solid #DCE2E9;
|
|||
|
|
}
|
|||
|
|
</style>
|