实现地图选择城市定位到市中心

This commit is contained in:
wangchengming 2025-10-15 13:54:22 +08:00
parent d1af993016
commit 962a6682b6
3 changed files with 212 additions and 49 deletions

View File

@ -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',

View File

@ -5,8 +5,8 @@
<div class="search-where-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" class="searchPanelForm">
<el-form-item label="媒体名称/编号:">
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery" placeholder="请输入媒体名称/编号" clearable
style="min-width: 30px" />
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery"
placeholder="请输入媒体名称/编号" clearable style="min-width: 30px" />
</el-form-item>
<el-form-item label="媒体类型:">
<el-select v-model="queryParams.mediaType" placeholder="请选择" @change="getMediaTypeTwo"
@ -62,7 +62,8 @@
</el-select>
</el-form-item>
<el-form-item label="">
<el-select v-model="queryParams.townCode" placeholder="请选择" clearable style="min-width: 30px">
<el-select v-model="queryParams.townCode" placeholder="请选择" @change="choseTown" clearable
style="min-width: 30px">
<el-option v-for="item in town" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
@ -94,7 +95,7 @@
<div style="height: 24px; line-height: 24px;font-size: 16px;">{{ item.name }}</div>
<div style="color: #8492a6; font-size: 12px;height: 18px; line-height: 18px;">{{
item.address
}}</div>
}}</div>
</el-option>
</el-select>
</el-form-item>
@ -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 = () => {

View File

@ -89,16 +89,20 @@
<el-col :span="8">
<el-form :model="queryParams" ref="queryRef" :inline="true" class="searchInputForm">
<el-form-item label="">
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery" placeholder="请输入媒体名称/媒体编号" :prefix-icon="Search"
style="width: 400px;" />
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery"
placeholder="请输入媒体名称/媒体编号" :prefix-icon="Search" style="width: 400px;" />
</el-form-item>
</el-form>
</el-col>
<el-col :span="16" style="text-align: right;">
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:query']" @click="handleQuery">查询</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:reset']" @click="resetQuery">重置</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:exportPPTS']" @click="handleExportMore">PPT批量导出</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:clear']" @click="handleClearChoseMedia">清空所选媒体</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:query']"
@click="handleQuery">查询</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:reset']"
@click="resetQuery">重置</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:exportPPTS']"
@click="handleExportMore">PPT批量导出</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['outdoorMedia:clear']"
@click="handleClearChoseMedia">清空所选媒体</el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="my_row" style="margin-bottom: 0;">
@ -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: []