an_xiao/police_uniapp/components/map/map.vue

358 lines
9.7 KiB
Vue
Raw Permalink Normal View History

2024-07-25 16:03:08 +08:00
<template>
<view class="map">
<view class="page-body">
<view class="page-section page-section-gap">
<map id="map" style="width: 100%; height: 300px;" show-scale="true" show-location="true"
:circles="circleArray" @regionchange="onRegionchange" scale='14' :latitude="latitude"
:longitude="longitude" :markers="markers">
</map>
<cover-image class="img-map2" src="../../static/campus/orientation.png" @click="clickcontrol"></cover-image>
</view>
</view>
<view>
<uni-card title="当前位置实时信息">
<view style="color: #000;font-weight: bold;">经纬度:<text style="color: #6A6A6A;">{{ `${latitude}${longitude}` }}</text></view>
<view style="color: #000;font-weight: bold;">详细地址:<text style="color: #6A6A6A;">{{ address }}</text></view>
<view style="height: 100px;display: flex;">
<u-upload width="80px" height="80px" :fileList="fileList3" @afterRead="afterRead" @delete="deletePic"
@clickPreview="clickPreview" name="3" multiple :maxCount="1" ></u-upload>
</view>
</uni-card>
</view>
<view style="text-align: center;">
<!-- <view v-if="distance > 500 || distance === ''" class="punchabsent">未在范围内</view> -->
<view class="punch" @click="tapScan">打卡</view>
<view style="color: red">{{ codeText }}</view>
<view style="color: red">{{ codeTime }}</view>
</view>
</view>
</template>
<script>
// let QQMapWX = require("../utils/qqmap-wx-jssdk.min.js")
// import QQMapWX from "../utils/qqmap-wx-jssdk.js"
const QQMapWX = require('@/utils/qqmap-wx-jssdk.js')
import {
postIotserver
} from '@/api/login';
import {
mapGetters
} from 'vuex';
import {
timestampFormatTime
} from '@/utils/index.js';
export default {
data() {
return {
fileList3: [],
baseURl: 'https://www.lonsungsh.com:8083',
imageID: [], //上传图片的id集合
imageUrlsDate: [],
id: 0, // 使用 marker点击事件 需要填写id
title: 'map',
latitude: 0, //纬度
longitude: 0, //经度
markers: [{
id: 0,
latitude: 0,
longitude: 0,
width: 15,
height: 20,
callout: {
content: '已进入打卡范围',
color: '#FFFFFF',
fontSize: 12,
borderColor: '#69BFBE',
bgColor: '#69BFBE',
padding: 5,
borderRadius: 3,
display: 'ALWAYS',
textAlign: 'center',
}
}],
address: '',
// 圆圈的范围
circleArray: [],
codeText: '',
codeTime: '',
distance: undefined,
qqmapsdk: null
}
},
onLoad() {
this.qqmapsdk = new QQMapWX({
key: 'IBCBZ-W5C3W-X32R4-35XWR-SK5E2-BIFDO'
})
},
computed: {
// 拿取vuex数据
...mapGetters({
userInfo: 'users/getLoginInfo',
schoolInfo: 'users/getschoolList',
})
},
created(){
// uni.chooseLocation({
// success(res) {
// console.log(res);
// }
// })
var obj = {
// 模拟环创企业广场
// latitude: 28.36121,
// longitude: 112.8179,
// 模拟荣盛花语
// latitude: 28.228445,
// longitude: 112.877754,
latitude: this.schoolInfo.latitude?this.schoolInfo.latitude:'',
longitude: this.schoolInfo.longitude?this.schoolInfo.longitude:'',
radius: 500,
fillColor: '#69BFBE6A',
color: '#acb0b7',
strokeWidth: 2
}
this.circleArray.push(obj)
console.log(this.circleArray);
uni.authorize({
scope: "scope.userLocation",
success: (res) => {
wx.getLocation({
isHighAccuracy: true, // 开启地图精准定位
altitude: true,
type: 'gcj02', // 地图类型写这个
success: (res) => {
uni.showLoading({
title: '定位中...',
mask: true,
})
console.log(res);
setTimeout(() => {
this.latitude = Number(res.latitude.toFixed(6)),
this.longitude =Number( res.longitude.toFixed(6))
this.qqmapsdk.reverseGeocoder({
location:{
latitude:res.latitude,
longitude:res.longitude
},
success:(data)=>{
this.address = data.result.formatted_addresses.recommend;
// this.latitude = data.location.lat,
// this.longitude = data.location.lng
}
})
uni.hideLoading()
const distance = this.getDistance(this.circleArray[0]
.latitude, this
.circleArray[0].longitude, this.latitude, this.longitude)
console.log(distance.m);
this.distance = distance.m
}, 1000)
},
});
}
})
},
onShow() {},
methods: {
onRegionchange(e) {},
clickcontrol: function() {
uni.createMapContext("map").moveToLocation({ //moveToLocation将地图中心移动到当前定位点需要配合map组件的show-location使用
latitude: this.latitude,
longitude: this.longitude,
});
},
deletePic(event) {
const keyDelete = event.index
let UrlsDateLIst = this.imageUrlsDate.filter((value, index, arr) => index !== keyDelete);
this.imageUrlsDate = UrlsDateLIst;
this[`fileList${event.name}`].splice(event.index, 1)
},
clickPreview(event) {
// console.log(111);
const {index} = event.currentTarget.dataset
console.log(index);
uni.previewImage({
urls: this.imageUrlsDate,
current: this.imageUrlsDate
})
},
async afterRead(event) {
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
let lists = [].concat(event.file)
let fileListLen = this[`fileList${event.name}`].length
lists.map((item) => {
this[`fileList${event.name}`].push({
...item,
status: 'uploading',
message: '上传中'
})
})
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url)
let item = this[`fileList${event.name}`][fileListLen]
this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
url: result
}))
fileListLen++
}
},
uploadFilePromise(url) {
var that = this;
const picUploadData = {
creator: that.userInfo.name,
business: 'school.revise',
type: 'image',
deviceid: that.userInfo.id,
createtime: timestampFormatTime(),
description: '',
comment: ''
};
return new Promise((resolve, reject) => {
let a = uni.uploadFile({
url: that.baseURl + '/mdev/picture/upload',
filePath: url,
name: 'file',
header: {
'Content-Type': 'multipart/form-data;charset=utf-8'
},
formData: {
jsondata: JSON.stringify(picUploadData),
},
success: (res) => {
setTimeout(() => {
const resImage = JSON.parse(res.data)?.data;
console.log(resImage);
if (!that.imageUrlsDate.includes(resImage.uri)) {
that.imageUrlsDate.push(resImage.uri);
}
if (!that.imageID.includes(resImage.id)) {
that.imageID.push(resImage.id);
}
resolve(that.imageUrlsDate,that.imageID)
}, 1000)
}
});
})
},
tapScan() {
let _this = this;
if(this.fileList3.length > 0){
wx.scanCode({
success: function(res) {
if (res.result) {
const datalist = {
tagId: res.result,
personId: _this.userInfo.id ? _this.userInfo.id : Math.round(Math.random() * 1000000),
personName: _this.userInfo.name,
personType: _this.userInfo.personType,
longitude: _this.longitude,
latitude: _this.latitude,
address:_this.address,
images: JSON.stringify(_this.imageID),
imageUrls: JSON.stringify(_this.imageUrlsDate),
};
if (_this.userInfo.name) {
postIotserver(datalist)
.then((res) => {
console.log(res.data.station, '222');
const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.autoplay = true;
innerAudioContext.src = require('@/static/video/video.wav'); //音频地址
innerAudioContext.onPlay(() => {
console.log('开始播放');
});
_this.codeText = res.data.station + '---打卡成功'
_this.codeTime = '当前时间:' + timestampFormatTime()
})
.catch((err) => {
console.log(err, '5555');
uni.showToast({
title: err.msg + '请不要重复打卡'
});
});
} else {
uni.showToast({
title: '请登录账户'
});
}
}
}
});
}else{
uni.showToast({
title: '请先上传照片'
});
}
},
getDistance(la1, lo1, la2, lo2) {
console.log(la1, lo1, la2, lo2);
let La1 = la1 * Math.PI / 180.0;
let La2 = la2 * Math.PI / 180.0;
let La3 = La1 - La2;
console.log(La3);
let Lb3 = lo1 * Math.PI / 180.0 - lo2 * Math.PI / 180.0;
let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(
Math.sin(
Lb3 / 2), 2)));
s = s * 6378.137;
s = Math.round(s * 10000) / 10000;
console.log(s, Math.round(s * 1000));
return {
km: s,
m: Math.round(s * 1000)
};
}
},
}
</script>
<style lang="scss">
.map {
position: relative;
.img-map2 {
width: 60rpx;
height: 60rpx;
position: fixed;
top: 0;
right: 1vh;
background-color: #FFFFFF;
border-radius: 5px;
}
.punchabsent {
text-align: center;
width: 100px;
height: 100px;
border: 4px solid #ff0000;
border-radius: 50%;
line-height: 100px;
position: absolute;
left: 50%;
margin-left: -53px;
margin-top: 50px;
}
.punch {
text-align: center;
width: 100px;
height: 100px;
border: 4px solid #cfb56a;
border-radius: 50%;
line-height: 100px;
position: absolute;
left: 50%;
margin-left: -53px;
margin-top: 50px;
}
}
</style>