From 962a6682b672e6bd4410df5902807958e34c3c7f Mon Sep 17 00:00:00 2001 From: wangchengming <15110151257@163.com> Date: Wed, 15 Oct 2025 13:54:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=9C=B0=E5=9B=BE=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=9F=8E=E5=B8=82=E5=AE=9A=E4=BD=8D=E5=88=B0=E5=B8=82?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mediaLibrary.js | 3 +- src/views/mediaMap/index.vue | 146 ++++++++++++++++++++++--------- src/views/outdoorMedia/index.vue | 112 ++++++++++++++++++++++-- 3 files changed, 212 insertions(+), 49 deletions(-) diff --git a/src/api/mediaLibrary.js b/src/api/mediaLibrary.js index 40f9307..a9116e8 100644 --- a/src/api/mediaLibrary.js +++ b/src/api/mediaLibrary.js @@ -128,8 +128,7 @@ export function mediaFiles(query) { } // 地图获取媒体 -export function mediaByMap(query) { - console.log('参数', query) +export function mediaByMap(query) { return request({ url: '/media/getMap', method: 'get', diff --git a/src/views/mediaMap/index.vue b/src/views/mediaMap/index.vue index ac0e547..964039d 100644 --- a/src/views/mediaMap/index.vue +++ b/src/views/mediaMap/index.vue @@ -5,8 +5,8 @@
- + - + @@ -94,7 +95,7 @@
{{ item.name }}
{{ item.address - }}
+ }}
@@ -329,6 +330,12 @@ const mapMode = ref('2D') // 是否全屏状态 const isFullscreen = ref(false) const placeSearch = ref(null) +const geocoder = ref(null) +const geocoderMarker = ref(null) +const provinceName = ref(null) +const ciytName = ref(null) +const countyName = ref(null) +const townName = ref(null) // 中心点名称 const centerPointName = ref(null) @@ -361,11 +368,6 @@ let minLat = Infinity; // 纬度的最小值(最南边) let maxLng = -Infinity; // 经度的最大值(最东边) let maxLat = -Infinity; // 纬度的最大值(最北边) -// 悬浮菜单 -const contextMenuVisible = ref(false); -const menuPosition = ref({ - top: '0px', left: '0px', zIndex: 999 -}); // 当前操作媒体 const curMediaInfo = ref(null) @@ -414,6 +416,10 @@ const resetQuery = () => { if (circleHandle.value) { mapInstance.value.remove(circleHandle.value); circleHandle.value = null; + } + if (geocoderMarker.value) { + mapInstance.value.remove(geocoderMarker.value); + geocoderMarker.value = null } // 重新查询 @@ -611,7 +617,7 @@ const loadMap = () => { }; AMapLoader.load({ key: apiKey, - plugins: ["AMap.PlaceSearch", "AMap.MouseTool"], + plugins: ["AMap.PlaceSearch", "AMap.Geocoder", "AMap.MouseTool"], version: '2.0', // 指定API版本 AMapUI: { plugins: [] @@ -647,11 +653,6 @@ const loadMap = () => { // 监听地图渲染完成事件 mapInstance.value.on('render', hideAmapLogo); - // // 关键:监听地图的右键点击事件 - // mapInstance.value.on('rightclick', handleRightClick); - mapInstance.value.on('click', function (e) { - hideContextMenu() - }); // 在地图完全加载后执行点数据处理 // renderMassMarks(); getMediaList() @@ -1000,24 +1001,7 @@ const renderMassMarks = () => { mapInstance.value.setBounds(bounds); } } -const showContextMenu = (pixel) => { - // 更新菜单位置跟随鼠标光标 - menuPosition.value = { - top: `${pixel.y + 210}px`, - left: `${pixel.x + 50}px`, - position: 'absolute', - padding: '10px', - background: '#FFFFFF', - lineHeight: '16px', - borderRadius: '4px', - cursor: 'pointer', - boxShadow: '0 0 4px #ccc' - }; - contextMenuVisible.value = true; -} -const hideContextMenu = () => { - contextMenuVisible.value = false; -} + // 隐藏Logo的函数 const hideAmapLogo = () => { const logos = document.querySelectorAll('.amap-logo, .amap-copyright'); @@ -1072,26 +1056,110 @@ const getProvinceList = () => { // 获取地级市/区数据 const getCityList = (value) => { sysRegionListByPid({ parentId: value }).then(res => { - queryParams.value.cityId = undefined - queryParams.value.countyId = undefined - queryParams.value.townId = undefined + queryParams.value.cityCode = undefined + queryParams.value.areaCode = undefined + queryParams.value.townCode = undefined city.value = res.data }) + + ciytName.value = undefined + countyName.value = undefined + townName.value = undefined + // 定位到省中心 + var choseProvince = province.value.filter(item => item.id == value)[0] + if (choseProvince) { + provinceName.value = choseProvince.name + geocoderCityCenter() + } } // 获取区/县数据 const getCountyList = (value) => { sysRegionListByPid({ parentId: value }).then(res => { - queryParams.value.countyId = undefined - queryParams.value.townId = undefined + queryParams.value.areaCode = undefined + queryParams.value.townCode = undefined county.value = res.data }) + countyName.value = undefined + townName.value = undefined + var choseCity = city.value.filter(item => item.id == value)[0] + if (choseCity) { + ciytName.value = choseCity.name + geocoderCityCenter() + } } // 获取镇数据 const getTownList = (value) => { sysRegionListByPid({ parentId: value }).then(res => { - queryParams.value.townId = undefined + queryParams.value.townCode = undefined town.value = res.data }) + townName.value = undefined + var choseCounty = county.value.filter(item => item.id == value)[0] + if (choseCounty) { + countyName.value = choseCounty.name + geocoderCityCenter() + } +} + +// 选择镇 +const choseTown = (value) => { + var choseTown = town.value.filter(item => item.id == value)[0] + if (choseTown) { + townName.value = choseTown.name + geocoderCityCenter() + } +} + +// 查找指定城市中心点,地图移动到中心点 放大视野 +const geocoderCityCenter = () => { + // 构建查询地址 + var address = provinceName.value; + if (ciytName.value) address += ciytName.value; + if (countyName.value) address += countyName.value; + if (townName.value) address += townName.value; + + // 使用地理编码获取坐标 + geocoder.value = new AMap.Geocoder({ + city: ciytName.value || provinceName.value + }); + + geocoder.value.getLocation(address, function (status, result) { + if (status === 'complete' && result.geocodes.length > 0) { + var location = result.geocodes[0].location; + + // 根据行政级别设置缩放级别 + var zoomLevel = getZoomLevel(provinceName.value, ciytName.value, countyName.value, townName.value); + + // 平滑移动到新位置 + mapInstance.value.setZoomAndCenter(zoomLevel, [location.lng, location.lat], true); + + // 添加标记 + addMarker([location.lng, location.lat], address); + + } + }); +} + +// 添加标记 +const addMarker = (position, title) => { + // 清除现有标记 + mapInstance.value.clearMap(); + + // 添加新标记 + geocoderMarker.value = new AMap.Marker({ + position: position, + title: title + }); + + mapInstance.value.add(geocoderMarker.value); +} + +// 根据行政级别获取缩放级别 +const getZoomLevel = (province, city, county, town) => { + if (town) return 15; // 乡镇级别 + if (county) return 13; // 区县级别 + if (city) return 11; // 城市级别 + return 8; // 省份级别 } // 选择媒体事件 const handleChoseMedia = () => { diff --git a/src/views/outdoorMedia/index.vue b/src/views/outdoorMedia/index.vue index fd23015..e372e7e 100644 --- a/src/views/outdoorMedia/index.vue +++ b/src/views/outdoorMedia/index.vue @@ -89,16 +89,20 @@ - + - 查询 - 重置 - PPT批量导出 - 清空所选媒体 + 查询 + 重置 + PPT批量导出 + 清空所选媒体 @@ -216,6 +220,12 @@ const activeTool = ref(null) const mapMode = ref('2D') // 是否全屏状态 const isFullscreen = ref(false) +const geocoder = ref(null) +const geocoderMarker = ref(null) +const provinceName = ref(null) +const ciytName = ref(null) +const countyName = ref(null) +const townName = ref(null) // 地图数据点 const points = ref([]) // 初始化变量用于存储极值 @@ -324,7 +334,17 @@ const getCityList = (value) => { queryParams.value.townId = undefined city.value = res.data }) + ciytName.value = undefined + countyName.value = undefined + townName.value = undefined + // 定位到省中心 + var choseProvince = province.value.filter(item => item.id == value)[0] + if (choseProvince) { + provinceName.value = choseProvince.name + geocoderCityCenter() + } getbusinessAreaList() + } // 获取区/县数据 const getCountyList = (value) => { @@ -333,6 +353,13 @@ const getCountyList = (value) => { queryParams.value.townId = undefined county.value = res.data }) + countyName.value = undefined + townName.value = undefined + var choseCity = city.value.filter(item => item.id == value)[0] + if (choseCity) { + ciytName.value = choseCity.name + geocoderCityCenter() + } getbusinessAreaList() } // 获取镇数据 @@ -341,6 +368,12 @@ const getTownList = (value) => { queryParams.value.townId = undefined town.value = res.data }) + townName.value = undefined + var choseCounty = county.value.filter(item => item.id == value)[0] + if (choseCounty) { + countyName.value = choseCounty.name + geocoderCityCenter() + } getbusinessAreaList() } // 依据省市县镇查询商圈 @@ -358,7 +391,66 @@ const getbusinessAreaList = (val) => { businessAreaList.value = res.data.list } }) + + var choseTown = town.value.filter(item => item.id == val)[0] + if (choseTown) { + townName.value = choseTown.name + geocoderCityCenter() + } } + +// 查找指定城市中心点,地图移动到中心点 放大视野 +const geocoderCityCenter = () => { + // 构建查询地址 + var address = provinceName.value; + if (ciytName.value) address += ciytName.value; + if (countyName.value) address += countyName.value; + if (townName.value) address += townName.value; + + // 使用地理编码获取坐标 + geocoder.value = new AMap.Geocoder({ + city: ciytName.value || provinceName.value + }); + + geocoder.value.getLocation(address, function (status, result) { + if (status === 'complete' && result.geocodes.length > 0) { + var location = result.geocodes[0].location; + + // 根据行政级别设置缩放级别 + var zoomLevel = getZoomLevel(provinceName.value, ciytName.value, countyName.value, townName.value); + + // 平滑移动到新位置 + mapInstance.value.setZoomAndCenter(zoomLevel, [location.lng, location.lat], true); + + // 添加标记 + addMarker([location.lng, location.lat], address); + + } + }); +} + +// 添加标记 +const addMarker = (position, title) => { + // 清除现有标记 + mapInstance.value.clearMap(); + + // 添加新标记 + geocoderMarker.value = new AMap.Marker({ + position: position, + title: title + }); + + mapInstance.value.add(geocoderMarker.value); +} + +// 根据行政级别获取缩放级别 +const getZoomLevel = (province, city, county, town) => { + if (town) return 15; // 乡镇级别 + if (county) return 13; // 区县级别 + if (city) return 11; // 城市级别 + return 8; // 省份级别 +} + // 折叠展开 const handleFlod = () => { unfoldFlag.value = !unfoldFlag.value @@ -380,7 +472,7 @@ const getOutMediaPageList = () => { if (lat < minLat) minLat = lat; if (lng > maxLng) maxLng = lng; if (lat > maxLat) maxLat = lat; - } + } }); outdoorMediaList.value = res.data.rows total.value = res.data.total @@ -409,6 +501,10 @@ const resetQuery = () => { townCode: undefined, businessDistrictId: undefined } + if (geocoderMarker.value) { + mapInstance.value.remove(geocoderMarker.value); + geocoderMarker.value = null + } handleQuery() } // 选择媒体事件 @@ -441,7 +537,7 @@ const loadMap = () => { AMapLoader.load({ key: apiKey, - plugins: ["AMap.PlaceSearch", "AMap.MouseTool"], + plugins: ["AMap.Geocoder", "AMap.MouseTool"], version: '2.0', // 指定API版本 AMapUI: { plugins: []