<template>
|
|
<view
|
|
class="addressMap"
|
|
v-if="position.latitude && addressList.length">
|
|
<map
|
|
style="width: 100%;height: 500rpx;border-radius: 20rpx;"
|
|
:layer-style='5'
|
|
:show-location='true'
|
|
:latitude="positionMap.latitude"
|
|
:longitude="positionMap.longitude"
|
|
:markers="addressMarkers"
|
|
:scale="scale"
|
|
@markertap="markertap"
|
|
id="mapId"
|
|
@callouttap="callouttap">
|
|
</map>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import positionMixin from '@/mixins/position';
|
|
export default {
|
|
mixins: [positionMixin],
|
|
name:"addressMap",
|
|
props : {
|
|
addressList : {
|
|
default : []
|
|
},
|
|
},
|
|
computed : {
|
|
addressMarkers(){
|
|
|
|
if (!this.addressList ||
|
|
this.addressList.length == 0 ||
|
|
!this.position ||
|
|
!this.position.latitude ||
|
|
!this.position.longitude) {
|
|
return []
|
|
}
|
|
|
|
this.addressList.forEach((item, index) => {
|
|
let distance = this.calculateDistance(
|
|
this.position.latitude,
|
|
this.position.longitude,
|
|
item.latitude,
|
|
item.longitude,
|
|
)
|
|
|
|
item.width = 20 //图标icon 宽度
|
|
item.height = 28 //图标icon 高度
|
|
item.distance = distance
|
|
item.iconPath = ''
|
|
})
|
|
|
|
this.addressList.sort((a,b) => {
|
|
return a.distance - b.distance
|
|
})
|
|
|
|
// 计算最大距离并设置缩放比例
|
|
if (this.addressList.length > 1) {
|
|
let maxDistance = 0
|
|
for (let i = 0; i < this.addressList.length; i++) {
|
|
for (let j = i + 1; j < this.addressList.length; j++) {
|
|
const distance = this.calculateDistance(
|
|
this.addressList[i].latitude,
|
|
this.addressList[i].longitude,
|
|
this.addressList[j].latitude,
|
|
this.addressList[j].longitude
|
|
)
|
|
maxDistance = Math.max(maxDistance, distance)
|
|
}
|
|
}
|
|
// 根据最大距离设置缩放比例
|
|
// 距离越大,缩放比例越小
|
|
if (maxDistance > 100) { //
|
|
this.scale = 5
|
|
}else if (maxDistance > 50) { //
|
|
this.scale = 8
|
|
}else if (maxDistance > 10) { // 10公里以上
|
|
this.scale = 10
|
|
} else if (maxDistance > 5) { // 5-10公里
|
|
this.scale = 11
|
|
} else if (maxDistance > 2) { // 2-5公里
|
|
this.scale = 13
|
|
} else { // 2公里以内
|
|
this.scale = 15
|
|
}
|
|
}
|
|
|
|
return this.addressList
|
|
},
|
|
positionMap(){
|
|
if(this.addressMarkers.length == 0){
|
|
return {
|
|
latitude : 0,
|
|
longitude : 0,
|
|
}
|
|
}
|
|
|
|
return {
|
|
latitude : this.addressMarkers[0].latitude,
|
|
longitude : this.addressMarkers[0].longitude,
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
scale : 15,
|
|
};
|
|
},
|
|
methods : {
|
|
markertap(e){
|
|
console.log(e);
|
|
this.addressList.forEach(item => {
|
|
if(item.id == e.detail.markerId){
|
|
this.$emit('clickAddress', item)
|
|
}
|
|
})
|
|
},
|
|
callouttap(e){},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.addressMap{
|
|
padding-bottom: 30rpx;
|
|
}
|
|
</style>
|