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

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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>