You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
5.2 KiB
239 lines
5.2 KiB
|
2 weeks ago
|
<template>
|
||
|
|
<view class="container">
|
||
|
|
<!-- 悬浮卡片 -->
|
||
|
|
<view v-if="showCard" class="float-card">
|
||
|
|
<view class="card-title">{{ selectedMarker.title }}</view>
|
||
|
|
<view class="card-info">
|
||
|
|
<text>纬度:{{ selectedMarker.latitude }}</text>
|
||
|
|
<text>经度:{{ selectedMarker.longitude }}</text>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<!-- 地图中心经纬度信息 -->
|
||
|
|
<view class="map-center-info">
|
||
|
|
<text>地图中心:</text>
|
||
|
|
<text>纬度:{{ mapCenter.latitude.toFixed(6) }}</text>
|
||
|
|
<text>经度:{{ mapCenter.longitude.toFixed(6) }}</text>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
<!-- 地图组件 -->
|
||
|
|
<map style="height: 100vh; width: 100vw;"
|
||
|
|
id="myMap"
|
||
|
|
name=""
|
||
|
|
@updated="handleMapLoad"
|
||
|
|
@markertap="handleMarkerTap"
|
||
|
|
@regionchange="handleRegionChange"
|
||
|
|
show-compass
|
||
|
|
:markers="markers"
|
||
|
|
show-location></map>
|
||
|
|
|
||
|
|
<!-- 添加Marker表单 -->
|
||
|
|
<view class="form-container">
|
||
|
|
<view class="form-title">添加新标记</view>
|
||
|
|
<view class="form-item">
|
||
|
|
<text>位置名称:</text>
|
||
|
|
<input v-model="newMarker.title" type="text" placeholder="请输入位置名称"/>
|
||
|
|
</view>
|
||
|
|
<view class="form-item">
|
||
|
|
<text>纬度:</text>
|
||
|
|
<input v-model.number="newMarker.latitude" type="digit" placeholder="请输入纬度"/>
|
||
|
|
</view>
|
||
|
|
<view class="form-item">
|
||
|
|
<text>经度:</text>
|
||
|
|
<input v-model.number="newMarker.longitude" type="digit" placeholder="请输入经度"/>
|
||
|
|
</view>
|
||
|
|
<button @click="addMarker" type="primary">添加标记</button>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
export default {
|
||
|
|
data() {
|
||
|
|
return {
|
||
|
|
markers: [{
|
||
|
|
id: 1,
|
||
|
|
latitude: 39.90923,
|
||
|
|
longitude: 116.397428,
|
||
|
|
title: '北京天安门',
|
||
|
|
iconPath: '/static/logo.png',
|
||
|
|
width: 30,
|
||
|
|
height: 30
|
||
|
|
}],
|
||
|
|
showCard: false,
|
||
|
|
selectedMarker: {},
|
||
|
|
newMarker: {
|
||
|
|
title: '',
|
||
|
|
latitude: 0,
|
||
|
|
longitude: 0
|
||
|
|
},
|
||
|
|
mapCenter: {
|
||
|
|
latitude: 39.90923,
|
||
|
|
longitude: 116.397428
|
||
|
|
},
|
||
|
|
mapContext: null
|
||
|
|
}
|
||
|
|
},
|
||
|
|
methods: {
|
||
|
|
handleMapLoad() {
|
||
|
|
console.log("地图加载完成!")
|
||
|
|
// 获取地图上下文
|
||
|
|
this.mapContext = uni.createMapContext('myMap');
|
||
|
|
// 获取初始地图中心经纬度
|
||
|
|
this.getMapCenter();
|
||
|
|
},
|
||
|
|
// 处理地图区域变化事件
|
||
|
|
handleRegionChange(e) {
|
||
|
|
// 当用户拖动地图结束时获取地图中心经纬度
|
||
|
|
if (e.type === 'end') {
|
||
|
|
this.getMapCenter();
|
||
|
|
}
|
||
|
|
},
|
||
|
|
// 获取地图中心经纬度
|
||
|
|
getMapCenter() {
|
||
|
|
if (this.mapContext) {
|
||
|
|
this.mapContext.getCenterLocation({
|
||
|
|
success: (res) => {
|
||
|
|
this.mapCenter = {
|
||
|
|
latitude: res.latitude,
|
||
|
|
longitude: res.longitude
|
||
|
|
};
|
||
|
|
console.log('当前地图中心经纬度:', this.mapCenter);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
},
|
||
|
|
// 处理Marker点击事件
|
||
|
|
handleMarkerTap(e) {
|
||
|
|
const markerId = e.markerId;
|
||
|
|
const marker = this.markers.find(item => item.id === markerId);
|
||
|
|
if (marker) {
|
||
|
|
this.selectedMarker = { ...marker };
|
||
|
|
this.showCard = true;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
// 添加新的Marker
|
||
|
|
addMarker() {
|
||
|
|
if (!this.newMarker.title || !this.newMarker.latitude || !this.newMarker.longitude) {
|
||
|
|
uni.showToast({
|
||
|
|
title: '请填写完整信息',
|
||
|
|
icon: 'none'
|
||
|
|
});
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const newMarker = {
|
||
|
|
id: this.markers.length + 1,
|
||
|
|
title: this.newMarker.title,
|
||
|
|
latitude: this.newMarker.latitude,
|
||
|
|
longitude: this.newMarker.longitude,
|
||
|
|
iconPath: '/static/logo.png',
|
||
|
|
width: 30,
|
||
|
|
height: 30
|
||
|
|
};
|
||
|
|
|
||
|
|
this.markers.push(newMarker);
|
||
|
|
|
||
|
|
// 重置表单
|
||
|
|
this.newMarker = {
|
||
|
|
title: '',
|
||
|
|
latitude: 0,
|
||
|
|
longitude: 0
|
||
|
|
};
|
||
|
|
|
||
|
|
uni.showToast({
|
||
|
|
title: '添加成功',
|
||
|
|
icon: 'success'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style scoped>
|
||
|
|
.container {
|
||
|
|
position: relative;
|
||
|
|
height: 100vh;
|
||
|
|
}
|
||
|
|
/* 悬浮卡片样式 */
|
||
|
|
.float-card {
|
||
|
|
position: absolute;
|
||
|
|
top: 20px;
|
||
|
|
left: 50%;
|
||
|
|
transform: translateX(-50%);
|
||
|
|
width: 80%;
|
||
|
|
max-width: 400px;
|
||
|
|
background: rgba(255, 255, 255, 0.9);
|
||
|
|
border-radius: 10px;
|
||
|
|
padding: 15px;
|
||
|
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||
|
|
z-index: 999;
|
||
|
|
}
|
||
|
|
.card-title {
|
||
|
|
font-size: 18px;
|
||
|
|
font-weight: bold;
|
||
|
|
margin-bottom: 10px;
|
||
|
|
}
|
||
|
|
.card-info {
|
||
|
|
font-size: 14px;
|
||
|
|
color: #666;
|
||
|
|
}
|
||
|
|
.card-info text {
|
||
|
|
display: block;
|
||
|
|
margin: 5px 0;
|
||
|
|
}
|
||
|
|
/* 表单样式 */
|
||
|
|
.form-container {
|
||
|
|
position: absolute;
|
||
|
|
bottom: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
background: rgba(255, 255, 255, 0.95);
|
||
|
|
padding: 20px;
|
||
|
|
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
|
||
|
|
}
|
||
|
|
.form-title {
|
||
|
|
font-size: 18px;
|
||
|
|
font-weight: bold;
|
||
|
|
margin-bottom: 15px;
|
||
|
|
text-align: center;
|
||
|
|
}
|
||
|
|
.form-item {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
margin-bottom: 15px;
|
||
|
|
}
|
||
|
|
.form-item text {
|
||
|
|
width: 80px;
|
||
|
|
}
|
||
|
|
.form-item input {
|
||
|
|
flex: 1;
|
||
|
|
height: 40px;
|
||
|
|
border: 1px solid #ddd;
|
||
|
|
border-radius: 5px;
|
||
|
|
padding: 0 10px;
|
||
|
|
}
|
||
|
|
button {
|
||
|
|
margin-top: 10px;
|
||
|
|
}
|
||
|
|
/* 地图中心经纬度信息样式 */
|
||
|
|
.map-center-info {
|
||
|
|
position: absolute;
|
||
|
|
top: 100px;
|
||
|
|
left: 50%;
|
||
|
|
transform: translateX(-50%);
|
||
|
|
width: 80%;
|
||
|
|
max-width: 400px;
|
||
|
|
background: rgba(255, 255, 255, 0.9);
|
||
|
|
border-radius: 10px;
|
||
|
|
padding: 10px 15px;
|
||
|
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||
|
|
z-index: 998;
|
||
|
|
}
|
||
|
|
.map-center-info text {
|
||
|
|
display: inline-block;
|
||
|
|
font-size: 14px;
|
||
|
|
margin-right: 10px;
|
||
|
|
}
|
||
|
|
</style>
|