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.

327 lines
9.3 KiB

2 years ago
<template>
<view>
<map
style="width: 100%; height:250px;"
:latitude="latitude"
:longitude="longitude"
:markers="marker"
:scale="scale"
:circles="circles"
>
<!-- :circles="circles" -->
</map>
</view>
</template>
<script>
import { geoDistance } from '@/common/util/util.js'
import amap from "@/common/js-sdk/js-amap/amap-wx.js";
// #ifdef H5
import AMap from "@/common/js-sdk/js-amap/amap-h5.js";
// #endif
export default {
props:{
compLatitude:{
type:Number,
default:40.009390,
required:false
},
compLongitude:{
type:Number,
default:116.374322,
required:false
}
},
data() {
return {
amapPlugin:null,
wxMapKey:"53324ee357405c4a65f35a1aa05ffaf2",
id:0,
title: 'map',
distance:0,
address:"",
  latitude: this.compLatitude, //纬度
longitude: this.compLongitude, //经度
scale:16,//地图缩放程度
tipText:'打卡范围',
bgColor:'#00c16f',
marker: [],
  circles:[{//在地图上显示圆
  latitude: this.compLatitude,
  longitude: this.compLongitude,
  radius:80,//半径
fillColor:"#ffffffAA",//填充颜色
  color:"#55aaffAA",//描边的颜色
   strokeWidth:1//描边的宽度
}],
resAmap:null
}
},
created() {
// #ifdef MP-WEIXIN || APP-PLUS
this.amapPlugin = new amap.AMapWX({
key: this.wxMapKey
});
// #endif
// #ifdef H5
this.initAMap()
// #endif
},
mounted() {
// #ifdef MP-WEIXIN
this.getAuthorizeInfo();
// #endif
// #ifdef APP-PLUS
this.getLocationInfoWx();
// #endif
// #ifdef H5
//this.getLocationInfo()
// #endif
},
computed:{
inCircle(){
return this.address && this.distance <= 80
}
},
methods: {
allowed(){
return this.inCircle
},
getMyAddress(){
return this.address
},
refreshLocation(){
// #ifdef MP-WEIXIN
this.getAuthorizeInfo();
// #endif
// #ifdef APP-PLUS
this.getLocationInfoWx();
// #endif
// #ifdef H5
this.initAMap()
// #endif
},
getAuthorizeInfo(){
//1. uniapp弹窗弹出获取授权地理个人微信信息等授权信息弹窗
var _this=this;
uni.authorize({
scope: "scope.userLocation",
success() { //1.1 允许授权
_this.getLocationInfoWx();
},
fail(){ //1.2 拒绝授权
console.log("你拒绝了授权,无法获得周边信息")
_this.openConfirm();
}
})
},
getLocationInfoWx(){
var that=this;
this.amapPlugin.getRegeo({
type: 'gcj02', //map 组件使用的经纬度是国测局坐标, type 为 gcj02
success: function(res) {
console.log("success",res);
that.latitude = res[0].latitude;
that.longitude = res[0].longitude;
that.address = res[0].name + res[0].desc;
that.distance=geoDistance(that.longitude, that.latitude,that.compLongitude,that.compLatitude)
console.log("that.distance",that.distance);
let tipText=(that.distance>80?"未在":"已在")+"打卡范围内";
let bgColor=that.distance>80?"#ff0000":"#00c16f";
let marker={
id:0,
  latitude:that.latitude,//纬度
  longitude:that.longitude,//经度
iconPath: '/static/location.png',
width:35,
height:35,
// #ifdef MP-WEIXIN
label:{//为标记点旁边增加标签
   content:tipText,//文本
    color:'#ffffff',//文本颜色
  fontSize:14,//文字大小
borderWidth:2,//边框宽度
borderColor:bgColor,//边框颜色
bgColor:bgColor,//背景颜色
  borderRadius:2,//边框圆角
  padding:5,//文本边缘留白
textAlign:'center',//文本对齐方式
x:0,//label的坐标原点是 marker 对应的经纬度
y:0,//label的坐标原点是 marker 对应的经纬度
},
// #endif
// #ifdef APP-PLUS
callout:{//自定义标记点上方的气泡窗口 点击有效
  content:tipText,//文本
  color:'#ffffff',//文字颜色
  fontSize:14,//文本大小
  //borderRadius:2,//边框圆角
   bgColor:bgColor,//背景颜色
  display:'ALWAYS',//常显
textAlign:'center'
},
// #endif
}
that.marker=[marker];
},
fail: (res) => {
console.log(JSON.stringify(res));
}
});
},
getLocationInfo() {
var _this=this;
uni.showLoading({
title: '获取信息中',
mask:true
});
uni.getLocation({
//type: 'wgs84',
type:'gcj02',
success: function (res) {
console.log('当前位置的经度:' + res.longitude);
console.log('当前位置的纬度:' + res.latitude);
_this.distance=geoDistance(res.longitude, res.latitude,_this.compLongitude,_this.compLatitude)
let tipText=(_this.distance>80?"未在":"已在")+"打卡范围内";
let bgColor=_this.distance>80?"#ff0000":"#00c16f";
_this.longitude=res.longitude
_this.latitude=res.latitude
let marker={
  latitude: res.latitude,//纬度
  longitude:res.longitude,//经度
  callout:{//自定义标记点上方的气泡窗口 点击有效
  content:tipText,//文本
  color:'#ffffff',//文字颜色
  fontSize:14,//文本大小
  borderRadius:2,//边框圆角
   bgColor:bgColor,//背景颜色
  display:'ALWAYS'//常显
}
}
_this.marker=[marker];
},
fail: function (res){
console.log('getLocation==> fail' + res);
console.log(res);
}
});
uni.hideLoading();
},
// 当用户第一次拒绝后再次请求授权
openConfirm(){
uni.showModal({
title: '请求授权当前位置',
content: '需要获取您的地理位置,请确认授权',
success: (res)=> {
if (res.confirm) {
uni.openSetting();// 打开地图权限设置
} else if (res.cancel) {
uni.showToast({
title: '你拒绝了授权,无法获得位置信息',
icon: 'none',
duration: 1000
})
}
}
});
},
// 根据坐标返回地址(逆地理编码)
/* async getAddress (points) {
try {
this.resAmap = await AMap();
this.$nextTick(function() {
this.resAmap.plugin('AMap.Geocoder', () => {
var geocoder = new this.resAmap.Geocoder({
radius: 1000,
});
geocoder.getAddress(points, (status, result) => {
if (status === 'complete' && result.regeocode) {
this.address = result.regeocode.formattedAddress
}
})
});
})
} catch (e) {
console.log(e)
}
}, */
// #ifdef H5
async initAMap() {
try {
uni.showLoading({
title: '定位中...',
mask:true
});
this.resAmap = await AMap();
this.$nextTick(function() {
this.resAmap.plugin('AMap.Geolocation', () => {
var geolocation = new this.resAmap.Geolocation({
enableHighAccuracy: true, //是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位默认5s
buttonPosition: 'RB', //定位按钮的停靠位置
// buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量默认Pixel(10, 20)
zoomToAccuracy: true, //定位成功后是否自动调整地图视野到定位点
});
geolocation.getCurrentPosition(function(status, result) {
if (status == 'complete') {
onComplete(result)
} else {
onError(result)
}
});
});
//解析定位结果
var _this = this;
function onComplete(data) {
console.log("H5高德定位",data)
console.log('当前位置的经度:' + data.position.lat);
console.log('当前位置的纬度:' + data.position.lng);
_this.distance=geoDistance(data.position.lng, data.position.lat,_this.compLongitude,_this.compLatitude)
let tipText=(_this.distance>80?"未在":"已在")+"打卡范围内";
let bgColor=_this.distance>80?"#ff0000":"#00c16f";
_this.longitude=data.position.lng
_this.latitude=data.position.lat
_this.address=data.formattedAddress
let marker={
  latitude: _this.latitude,//纬度
  longitude:_this.longitude,//经度
  callout:{//自定义标记点上方的气泡窗口 点击有效
  content:tipText,//文本
  color:'#ffffff',//文字颜色
  fontSize:14,//文本大小
  borderRadius:2,//边框圆角
   bgColor:bgColor,//背景颜色
  display:'ALWAYS'//常显
}
}
_this.marker=[marker];
uni.hideLoading();
_this.$tip.success("定位成功")
}
function onError(data) {
console.log(data) // 定位失败的信息
}
})
} catch (e) {
console.log(e)
_this.$tip.alert("定位失败")
}
},
// #endif
}
}
</script>
<style>
</style>