import { defineComponent, onMounted, ref, reactive, watch } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import './index.scss'; import Map from '@/components/MapView'; import { ElButton } from 'element-plus'; /** @ts-ignore */ import icon_location_svg1 from "@/assets/images/location1.png"; /** @ts-ignore */ import icon_location from '@/assets/images/icon_map_location@2x.png'; import { cloneDeep } from 'lodash'; export default defineComponent({ name: 'MapSelect', props: { formv: { type: Object, default: { addr: '', locations: '' }, }, editable: { type: String, default:true } }, setup(props, ctx) { const form = ref({ addr: '', locations: '' }); const route = useRoute(); const map = ref(null); const state = reactive({ // map: map.value, _marker: null , loading: false, }); const mapselect = ref(false); const setlocation = () => { if (window.map) { form.value = props.formv; if (form.value.locations !== '') { setpoint( Number(form.value.locations.split(',')[0]), Number(form.value.locations.split(',')[1]), form.value.addr); } else { mapselect.value = true; var clearallmark = () => { state._marker?.remove(); if (allmark.length > 0) { allmark.map((item) => { item.remove(); }); allmark = []; } }; clearallmark(); } } } watch( () => props.formv.locations, () => { if (window.map == undefined) { setTimeout(() => { setlocation(); }, 1500); } setlocation(); }, ); onMounted(() => { if (props.formv.locations) { mapselect.value = false; setlocation(); } else { mapselect.value = true; } }); let allmark = []; const selectpoint = () => { if (mapselect.value) { var center = window.map.getCenter(); getlocalname(center.lng.toFixed(6) + ',' + center.lat.toFixed(6)); } else { mapselect.value = true; state._marker?.remove(); } }; const setpoint = (longitude, latitude, name) => { if (state._marker) { state._marker.remove(); } // var el = document.createElement('div'); // el.id = 'marker'; // el.style.backgroundImage = `url(${icon_location})`; // el.style.backgroundSize = 'cover'; // el.style.width = '24px'; // el.style.height = '24px'; // el.style.borderRadius = '50%'; var icon = new AMap.Icon({ size: new AMap.Size(40, 50), // 图标尺寸 image: '/icon_map_location@2x.png', // Icon的图像 imageSize: new AMap.Size(20, 20) // 根据所设置的大小拉伸或压缩图片 }); state._marker = new AMap.Marker({ position: new AMap.LngLat(longitude, latitude), offset: new AMap.Pixel(-10, -10), icon: icon, }) state._marker.setLabel({ direction:'top', offset: new AMap.Pixel(0, -10), //设置文本标注偏移量 content: `
${name}
`, //设置文本标注内容 }); window.map.add(state._marker) window.map.setZoomAndCenter(14, [longitude, latitude] ) // .setLngLat([longitude, latitude]) // .setPopup(popup) // .addTo(map.value); // map.value.flyTo({ // center: [longitude, latitude], // zoom: 14, // bearing: 0, // pitch: 0, // duration: 2000, // }); // state._marker.togglePopup(); form.value.addr = name; form.value.locations = longitude + ',' + latitude; // whdata.value.longitude = longitude; mapselect.value = false; props.formv = form.value; ctx.emit('update:formv', form.value); }; const searchaddr = (name) => { mapselect.value = false; fetch( `https://restapi.amap.com/v5/place/text?region=南宁市&keywords=${name}&key=${"1c7f1c8eda2ccbe7d0e125a7e2fc2a61"}`, // `${ // import.meta.env.VITE_MAP_SERVER // }/service/lbs/search/v1/keywords?keywords=${name}&city=宿迁&citylimit=true&page_idx=1&page_size=10&key=${ // window.key // }`, ) .then((res) => res.json()) .then((data) => { // console.log(data.pois) var clearallmark = () => { state._marker?.remove(); if (allmark.length > 0) { allmark.map((item) => { item.remove(); }); allmark = []; } }; clearallmark(); var top = []; var bottom = []; data.pois.map((item) => { // console.log(item) if (top.length < 1) { top = [ Number(item.location.split(',')[0]), Number(item.location.split(',')[1]), ]; bottom = [ Number(item.location.split(',')[0]), Number(item.location.split(',')[1]), ]; } var icon = new AMap.Icon({ size: new AMap.Size(40, 50), // 图标尺寸 image: '/icon_map_location@2x.png', // Icon的图像 imageSize: new AMap.Size(20, 20) // 根据所设置的大小拉伸或压缩图片 }); var marker = new AMap.Marker({ position: new AMap.LngLat( Number(item.location.split(',')[0]), Number(item.location.split(',')[1])), offset: new AMap.Pixel(-10, -10), icon: icon, }) var address = item.pname+item.cityname+item.adname+item.address+`(${item.name})` marker.setLabel({ direction:'top', offset: new AMap.Pixel(0, -10), //设置文本标注偏移量 content: `
${address}
`, //设置文本标注内容 }); marker.on("click", () => { clearallmark(); setpoint( Number(item.location.split(',')[0]), Number(item.location.split(',')[1]), address, ); }) window.map.add(marker) // window.map.setZoomAndCenter(14, // [longitude, latitude] // ) allmark.push(marker); if (top[0] < Number(item.location.split(',')[0])) { top[0] = Number(item.location.split(',')[0]); } if (top[1] > Number(item.location.split(',')[1])) { top[1] = Number(item.location.split(',')[1]); } if (bottom[0] > Number(item.location.split(',')[0])) { bottom[0] = Number(item.location.split(',')[0]); } if (bottom[1] < Number(item.location.split(',')[1])) { bottom[1] = Number(item.location.split(',')[1]); } }); window.map.setBounds( new AMap.Bounds(top, bottom)); }); }; const getlocationaddr=(location,backcall) => { fetch( `https://restapi.amap.com/v3/geocode/regeo?location=${location}&key=1c7f1c8eda2ccbe7d0e125a7e2fc2a61` ).then((res) => res.json()) .then((data) => { if (backcall) { backcall(data); } }) } const getlocalname = (location) => { fetch( `https://restapi.amap.com/v3/geocode/regeo?location=${location}&key=1c7f1c8eda2ccbe7d0e125a7e2fc2a61`, // `${ // import.meta.env.VITE_MAP_SERVER as string // }/service/lbs/reverse/v1/regeo?location=${location}&key=${window.key}`, ) .then((res) => res.json()) .then((data) => { setpoint( Number(location.split(',')[0]), Number(location.split(',')[1]), data.regeocode.formatted_address, ); }); }; const getLocation = () => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (location1) => { var lat = null; var lon = null; var iserror = false; try { lat = location1.coords.latitude; lon = location1.coords.longitude; if (lat === null || lat === undefined) iserror = true; } catch (e) { iserror = true; } if (!iserror) { // debugger var location = `${lon},${lat}`; getlocalname(location); // setpoint(lon,lat,data.regeocodes[0].formatted_address) } else { // Notify({ // type: 'danger', // message: 'App不支持地理定位。', // }); } }, (error) => { switch (error.code) { case error.PERMISSION_DENIED: alert('定位失败,用户拒绝请求地理定位'); break; case error.POSITION_UNAVAILABLE: alert('定位失败,位置信息是不可用'); break; case error.TIMEOUT: alert('定位失败,请求获取用户位置超时'); break; } }, ); } else { alert('浏览器不支持地理定位。'); } // api_getusergps().then((res) => { // var lat = null; // var lon = null; // var iserror = false; // try { // lat = res.result[0].lat; // lon = res.result[0].lon; // if (lat === null || lat === undefined) iserror = true; // } catch (e) { // iserror = true; // } // if (!iserror) { // // debugger // var location = `${lon},${lat}`; // getlocalname(location); // // setpoint(lon,lat,data.regeocodes[0].formatted_address) // } else { // // Notify({ // // type: 'danger', // // message: 'App不支持地理定位。', // // }); // } // }); }; return { map, mapselect, searchaddr, selectpoint, getLocation, getlocationaddr, }; }, render() { return (
{this.mapselect ? "确定" : "选点"}
); } });