an_xiao/police_uniapp/components/map/map.vue

358 lines
9.7 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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