217 lines
5.3 KiB
Vue
217 lines
5.3 KiB
Vue
<template>
|
||
<el-dialog
|
||
title="选择地址"
|
||
v-model="state.showLocation"
|
||
:modal="true"
|
||
:modal-append-to-body="false"
|
||
>
|
||
<div class="map_box">
|
||
<div class="map">
|
||
<el-amap ref="map" :center="state.amapOptions.center" @init="mapInit">
|
||
<el-amap-marker :position="state.amapOptions.center"></el-amap-marker>
|
||
</el-amap>
|
||
</div>
|
||
<div class="search_box">
|
||
<el-input
|
||
v-model="state.searchOption.keyword"
|
||
placeholder="请输入关键字"
|
||
@focus="state.searchOption.focus = true"
|
||
@blur="autoCompleteSearchBlur"
|
||
@input="autoCompleteSearch(state.searchOption.keyword)"
|
||
>
|
||
<template #append>
|
||
<el-button type="primary" @click="placeSearchSearch(state.searchOption.keyword)">
|
||
搜索
|
||
</el-button>
|
||
</template>
|
||
</el-input>
|
||
<div class="list" v-if="state.searchOption.focus && state.searchOption.show">
|
||
<div
|
||
class="item"
|
||
@click="autoCompleteListClick(item)"
|
||
v-for="item in state.autoCompleteList"
|
||
:key="item.id"
|
||
>
|
||
{{ item.name }}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="search_wrap">
|
||
<div class="item" v-for="item in state.locationSearchList" :key="item.id">
|
||
<div class="left">
|
||
<div class="name">{{ item.name }}-{{ item.address }}</div>
|
||
<div class="location">经纬度:{{ item.location.lng }},{{ item.location.lat }}</div>
|
||
</div>
|
||
<div class="btn">
|
||
<el-button type="primary" @click="selectLocationHandle(item)">选择</el-button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</el-dialog>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ElAmap } from "@vuemap/vue-amap";
|
||
import { initMapLoad } from "@/utils/mapLoadUtil";
|
||
onBeforeMount(async () => {
|
||
const res = await initMapLoad();
|
||
});
|
||
const state = reactive({
|
||
showLocation: false,
|
||
amapOptions: {
|
||
center: [108.946465, 34.347984],
|
||
position: [],
|
||
},
|
||
searchOption: {
|
||
city: "西安",
|
||
citylimit: false,
|
||
keyword: "",
|
||
show: false,
|
||
focus: false,
|
||
},
|
||
autoCompleteList: [],
|
||
locationSearchList: [],
|
||
});
|
||
let ElMap = undefined;
|
||
let placeSearch = undefined;
|
||
let autoComplete = undefined;
|
||
let PlaceSearchIndex = 1;
|
||
function open() {
|
||
state.showLocation = true;
|
||
}
|
||
function close() {
|
||
state.showLocation = false;
|
||
}
|
||
|
||
function autoCompleteSearchBlur() {
|
||
setTimeout(() => {
|
||
state.searchOption.show = false;
|
||
}, 200);
|
||
}
|
||
|
||
function autoCompleteSearch(keyword) {
|
||
if (keyword === "") {
|
||
state.autoCompleteList = [];
|
||
return;
|
||
}
|
||
autoComplete.search(keyword, function (status, result) {
|
||
if (status === "complete" && result.info === "OK") {
|
||
// 搜索成功时,result即是对应的匹配数据
|
||
console.log(result);
|
||
state.searchOption.show = true;
|
||
state.autoCompleteList = result.tips;
|
||
}
|
||
});
|
||
}
|
||
function autoCompleteListClick(item) {
|
||
console.log(item);
|
||
state.searchOption.keyword = item.name;
|
||
state.autoCompleteList = [];
|
||
placeSearchSearch(item.name);
|
||
}
|
||
function placeSearchSearch(keyword) {
|
||
PlaceSearchIndex = 1;
|
||
if (keyword === "") {
|
||
state.locationSearchList = [];
|
||
return;
|
||
}
|
||
// 关键字查询
|
||
placeSearch.search(keyword, (status, result) => {
|
||
console.log(status);
|
||
console.log(result);
|
||
state.locationSearchList = result.poiList.pois;
|
||
});
|
||
}
|
||
function mapInit(map) {
|
||
map.plugin(["AMap.PlaceSearch", "AMap.AutoComplete", "AMap.ToolBar"], () => {
|
||
const toolBar = new AMap.ToolBar();
|
||
map.addControl(toolBar);
|
||
// 注意:输入提示插件2.0版本需引入AMap.AutoComplete,而1.4版本应使用AMap.Autocomplete
|
||
// 实例化AutoComplete
|
||
var autoOptions = {
|
||
city: "西安",
|
||
};
|
||
autoComplete = new AMap.AutoComplete(autoOptions);
|
||
|
||
//构造地点查询类
|
||
placeSearch = new AMap.PlaceSearch({
|
||
pageSize: 10, // 单页显示结果条数
|
||
pageIndex: PlaceSearchIndex, // 页码
|
||
city: "西安", // 兴趣点城市
|
||
citylimit: true, //是否强制限制在设置的城市内搜索
|
||
map: map, // 展现结果的地图实例
|
||
// panel: "search_wrap", // 结果列表将在此容器中进行展示。
|
||
autoFitView: true, // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
|
||
});
|
||
});
|
||
|
||
ElMap = map;
|
||
}
|
||
|
||
const emits = defineEmits(["choose"]);
|
||
function selectLocationHandle(e) {
|
||
emits("choose", e);
|
||
}
|
||
defineExpose({
|
||
open,
|
||
close,
|
||
});
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.map_box {
|
||
width: 100%;
|
||
position: relative;
|
||
|
||
.map {
|
||
height: 300px;
|
||
}
|
||
|
||
.search_box {
|
||
position: absolute;
|
||
top: 10px;
|
||
left: 10px;
|
||
z-index: 3000;
|
||
.list {
|
||
background-color: #fff;
|
||
.item {
|
||
height: 40px;
|
||
line-height: 40px;
|
||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
||
padding: 0 10px;
|
||
cursor: pointer;
|
||
&:hover {
|
||
background-color: #eee;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.search_wrap {
|
||
padding: 6px 0;
|
||
|
||
.item {
|
||
display: flex;
|
||
padding: 12px 0;
|
||
|
||
.left {
|
||
flex: 1;
|
||
display: flex;
|
||
flex-direction: column;
|
||
padding-right: 20px;
|
||
|
||
.location {
|
||
color: #999;
|
||
padding-top: 4px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.amap-sug-result {
|
||
z-index: 2000;
|
||
}
|
||
</style> |