178 lines
5.9 KiB
Vue
178 lines
5.9 KiB
Vue
|
<template>
|
|||
|
<!-- 带有搜索地点的地图 -->
|
|||
|
<div>
|
|||
|
<el-form-item :label="title">
|
|||
|
<el-input
|
|||
|
v-model="form.address"
|
|||
|
:placeholder="`请输入${title}`"
|
|||
|
class="input-with-select"
|
|||
|
style="width: 300px"
|
|||
|
@keyup.enter="debouncedSearch(form.address)"
|
|||
|
>
|
|||
|
<template #append>
|
|||
|
<el-button :icon="Search" @click="debouncedSearch(form.address)" />
|
|||
|
</template>
|
|||
|
</el-input>
|
|||
|
</el-form-item>
|
|||
|
<tlbs-map
|
|||
|
ref="map"
|
|||
|
style="margin-left: 80px"
|
|||
|
api-key="
|
|||
|
6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO"
|
|||
|
:center="center"
|
|||
|
:zoom="zoom"
|
|||
|
:control="control"
|
|||
|
@click="onClick"
|
|||
|
>
|
|||
|
<tlbs-multi-marker :geometries="geometries" :styles="styles" :options="options" />
|
|||
|
</tlbs-map>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script setup lang="ts">
|
|||
|
import { Search } from '@element-plus/icons-vue';
|
|||
|
import { propTypes } from '@/utils/propTypes';
|
|||
|
import { jsonp } from 'vue-jsonp';
|
|||
|
import { debounce } from '@/utils/debounce.js';
|
|||
|
import { OssVO } from '@/api/system/oss/types';
|
|||
|
import { listByIds } from '@/api/system/oss';
|
|||
|
// const prop = defineProps(['datas']);
|
|||
|
const props = defineProps({
|
|||
|
datas: {
|
|||
|
type: [String, Object, Array],
|
|||
|
default: () => {}
|
|||
|
},
|
|||
|
modelValue: {
|
|||
|
type: [String, Object, Array],
|
|||
|
default: () => {}
|
|||
|
},
|
|||
|
//标题
|
|||
|
title: {
|
|||
|
type: [String],
|
|||
|
default: '活动'
|
|||
|
},
|
|||
|
//搜索地址
|
|||
|
address: {
|
|||
|
type: [String],
|
|||
|
default: ''
|
|||
|
}
|
|||
|
//查询出来的经纬度
|
|||
|
// form: {
|
|||
|
// type: [String, Object, Array],
|
|||
|
// default: () => []
|
|||
|
// }
|
|||
|
});
|
|||
|
const emit = defineEmits(['modelValue']);
|
|||
|
// const address = ref(''); // 搜索地点
|
|||
|
const form = ref(
|
|||
|
props.datas || {
|
|||
|
address: '',
|
|||
|
latitude: '',
|
|||
|
longitude: '',
|
|||
|
regionCode: ''
|
|||
|
}
|
|||
|
);
|
|||
|
watch(() => props.modelValue);
|
|||
|
// 点击地点,获取经纬度及地址信息
|
|||
|
const onClick = (e: any) => {
|
|||
|
jsonp(
|
|||
|
`https://apis.map.qq.com/ws/geocoder/v1/?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&location=${e.latLng.lat},${e.latLng.lng}&output=jsonp`,
|
|||
|
{}
|
|||
|
).then((data) => {
|
|||
|
if (data.status == 0) {
|
|||
|
if (form.value) {
|
|||
|
form.value.address =
|
|||
|
data.result.address_component.province +
|
|||
|
data.result.address_component.city +
|
|||
|
data.result.address_component.district +
|
|||
|
data.result.address_component.street +
|
|||
|
data.result.address_component.street_number;
|
|||
|
form.value.latitude = data.result.location.lat;
|
|||
|
form.value.longitude = data.result.location.lng;
|
|||
|
// form.value.province = data.result.address_component.province;
|
|||
|
// form.value.city = data.result.address_component.city;
|
|||
|
// form.value.region = data.result.ad_info.adcode; //行政区划编码
|
|||
|
form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
|
|||
|
center.value.lat = data.result.location.lat;
|
|||
|
center.value.lng = data.result.location.lng;
|
|||
|
searchLocation.value = data.result.formatted_addresses.recommend;
|
|||
|
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
|
|||
|
console.log(form.value);
|
|||
|
emit('modelValue', form.value);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
//输入位置,搜索位置
|
|||
|
const performSearch = async (text) => {
|
|||
|
// 这里简单模拟延迟,模拟真实的异步请求耗时
|
|||
|
// await new Promise((resolve) => setTimeout(resolve, 500));
|
|||
|
// 假设这里根据输入的文本去查找匹配的数据,实际中替换成真实逻辑
|
|||
|
if (text === '') {
|
|||
|
console.log('搜索内容为空');
|
|||
|
} else {
|
|||
|
console.log('搜索内容为:', text);
|
|||
|
// 调用腾讯地图API进行搜索,并展示在地图上
|
|||
|
// geocoder(text).then((result) => {
|
|||
|
// console.log(result);
|
|||
|
// });
|
|||
|
jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => {
|
|||
|
console.log(data);
|
|||
|
if (data.status == 0) {
|
|||
|
center.value.lat = data.result.location.lat;
|
|||
|
center.value.lng = data.result.location.lng;
|
|||
|
form.value.address =
|
|||
|
data.result.address_components.province +
|
|||
|
data.result.address_components.city +
|
|||
|
data.result.address_components.district +
|
|||
|
data.result.address_components.street +
|
|||
|
data.result.address_components.street_number;
|
|||
|
form.value.latitude = data.result.location.lat;
|
|||
|
form.value.longitude = data.result.location.lng;
|
|||
|
// form.value.region = data.result.ad_info.adcode; //行政区划编码
|
|||
|
// form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
|
|||
|
|
|||
|
// form.value.province = data.result.address_components.province;
|
|||
|
// form.value.city = data.result.address_components.city;
|
|||
|
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
|
|||
|
console.log(form.value);
|
|||
|
emit('modelValue', form.value);
|
|||
|
} else if (data.status == 348) {
|
|||
|
//地址信息不明确,需弹出提示
|
|||
|
proxy?.$modal.msgError('未查询到地点,请补充详细地址信息');
|
|||
|
return;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
};
|
|||
|
const debouncedSearch = debounce(performSearch, 300); // 创建防抖后的搜索函数,延迟设为300毫秒
|
|||
|
|
|||
|
const map = ref(null);
|
|||
|
const center = ref({ lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 });
|
|||
|
const zoom = ref(20);
|
|||
|
const control = reactive({
|
|||
|
scale: {},
|
|||
|
zoom: {
|
|||
|
position: 'topLeft'
|
|||
|
}
|
|||
|
});
|
|||
|
const searchLocation = ref(''); // 搜索地点
|
|||
|
const geometries = ref([{ styleId: 'marker', position: { lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 } }]);
|
|||
|
const styles = reactive({
|
|||
|
marker: {
|
|||
|
width: 20,
|
|||
|
height: 30,
|
|||
|
anchor: { x: 10, y: 30 }
|
|||
|
}
|
|||
|
});
|
|||
|
const options = reactive({
|
|||
|
minZoom: 5,
|
|||
|
maxZoom: 20
|
|||
|
});
|
|||
|
// 监听输入框内容变化,调用防抖后的搜索函数
|
|||
|
watch(searchLocation, (newValue) => {
|
|||
|
// debouncedSearch(newValue);
|
|||
|
});
|
|||
|
</script>
|
|||
|
<style scoped lang="scss"></style>
|