首页 > 其他分享 >前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡

前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡

时间:2023-06-10 09:03:53浏览次数:41  
标签:定位 vue 签到 height width let myThis 打卡 Math


前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12974

效果图如下:

 


 
 

#

#### 使用方法

```使用方法

<!--

// 腾讯地图key注册地址(针对H5端,manifest.json中web配置,配置定位与地图 若是微信小程序只需配置微信小程序权限配置):

  https://lbs.qq.com/dev/console/application/mine

-->

<!-- scale缩放级别,取值范围为3-20 longitude:地图中心精度 latitude:地图中心纬度 markers:覆盖物 show-location:是否显示定位-->

<map class="mapV" :latitude="infoDict.lat"

:longitude="infoDict.lon" scale='6' :markers="covers" show-location=false>

</map>

<!--

        page.json配置以下

// 权限设置

"permission": {

"scope.userLocation": {

"desc": "您的位置信息将用于该活动签到"

}

}

-->

```

#### HTML代码部分

```html

<template>

<view class="content">

<scroll-view class="scrollV" scroll-y="true">

<view class="inputView">

<text class="leftTitle">活动内容</text>

</view>

<view class="inputView">

{{"去清远古龙峡漂流"}}

</view>

<view class="inputView">

<text class="leftTitle">签到须知</text>

</view>

<view class="inputView">

{{'距离活动地10km内可签到成功'}}

</view>

<!--

// 腾讯地图key注册地址(针对H5端,manifest.json中web配置,配置定位与地图 若是微信小程序只需配置微信小程序权限配置):

  https://lbs.qq.com/dev/console/application/mine

-->

<!-- scale缩放级别,取值范围为3-20 longitude:地图中心精度 latitude:地图中心纬度 markers:覆盖物 show-location:是否显示定位-->

<map class="mapV" :latitude="infoDict.lat" :longitude="infoDict.lon" scale='6' :markers="covers"

show-location=false>

</map>

</scroll-view>

<view class="btnview" @tap="goSignIn">{{'签到' + distanceStr}}</view>

</view>

</template>

```

#### JS代码 (引入组件 填充数据)

```javascript

<script>

import Vue from 'vue'

export default {

data() {

return {

// 覆盖物

covers: [],

// 目标经纬度信息

infoDict: {

'lon': '113.17',

'lat': '23.8'

},

// 我的定位经纬度信息

myPinInfo: {},

// 默认距离为负数

distance: -9999,

distanceStr: ''

}

},

onShow() {

// 获取当前位置

this.getlocation();

},

methods: {

getlocation() {

let myThis = this;

console.log('获取位置开始');

uni.getLocation({

type: 'gcj02',

success: function(res) {

myThis.myPinInfo = res;

console.log('当前位置的经度:' + res.longitude);

console.log('当前位置的纬度:' + res.latitude);

myThis.covers = [{

latitude: myThis.infoDict.lat,

longitude: myThis.infoDict.lon,

width: 30,

height: 30,

id: 20000,

iconPath: '../../static/activity_pin.png'

},

{

latitude: myThis.myPinInfo.latitude,

longitude: myThis.myPinInfo.longitude,

width: 30,

height: 30,

id: 20001,

iconPath: '../../static/people_pin.png'

}

];

myThis.distance = myThis.getDistance(myThis.infoDict.lat, myThis.infoDict.lon, myThis

.myPinInfo.latitude, myThis.myPinInfo.longitude)

myThis.distanceStr = '(当前距离' + myThis.distance + '米)';

}

});

},

// 计算两点距离

getDistance(lat1, lng1, lat2, lng2) {

let EARTH_RADIUS = 6378.137;

let radLat1 = this.rad(lat1);

let radLat2 = this.rad(lat2);

let a = radLat1 - radLat2;

let b = this.rad(lng1) - this.rad(lng2);

let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +

Math.cos(radLat1) * Math.cos(radLat2) *

Math.pow(Math.sin(b / 2), 2)));

s = s * EARTH_RADIUS;

//s = Math.round(s * 10000d) / 10000d;

s = Math.round(s * 10000) / 10000;

s = s * 1000; //乘以1000是换算成米

return s;

},

// 弧度计算

rad(d) {

return d * Math.PI / 180.0;

},

// 立即签到

goSignIn(e) {

if (this.distance > 10000) {

uni.showModal({

title: '温馨提示',

content: '您的当前位置距离活动目的地太远, 无法签到',

showCancel: false

})

return;

} else if (this.distance < 0) {

uni.showModal({

title: '温馨提示',

content: '您的定位权限未打开, 请点击小程序右上角···菜单按钮, 然后点击设置,打开定位权限',

showCancel: false

})

return

}

},

}

}

</script>

```

#### CSS

```CSS

<style>

.content {

display: flex;

flex-direction: column;

height: 100%;

}

.scrollV {

width: 100vw;

}

.mapV {

width: calc(100vw);

height: 320px;

margin-top: 14px;

}

.leftTitle {

width: 284px;

height: 44px;

line-height: 44px;

font-size: 14px;

color: #333333;

}

.inputView {

flex-direction: row;

display: flex;

height: auto;

align-items: center;

margin-left: 13px;

width: calc(100vw - 30px);

padding: 2px 0px;

font-size: 13px;

color: #666666;

}

.btnview {

display: flex;

 

justify-content: center;

align-items: center;

color: #ffffff;

width: 100%;

height: 50px;

margin-top: 20px;

}

</style>

```

 

标签:定位,vue,签到,height,width,let,myThis,打卡,Math
From: https://www.cnblogs.com/ccVue/p/17470725.html

相关文章

  • Vue——vuex使用、Router使用、localstorage、sessionstorage和cookie
    vuex使用#vuex:状态管理器---》存数据(变量)的地方,所有组件都可以操作在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信<h1>1vuex的使用基本使用(操作state的数据)</h1>......
  • Vue高级
    目录一vuex使用1.1概念组件间通信总结1.2案例1:显示购物车商品数量HomeView.vuesrc/store/index.js1.3直接操作每一层1.页面组件中直接使用state中定义的数据2.页面组件通过操作mutations来操作state中的数据3.在actions中直接操作state的数据1.4案例2:组件间通信HomeView.vues......
  • Vue第三方框架之ElementUi
    目录一Elementui引入二elementui使用一Elementui引入Elementui官网:https://element.eleme.cn/#/zh-CN/图标字体库和CSS框架:https://fontawesome.dashgame.com/Elementui是一个ui库,控制样式的,它就是vue的一个插件在vue项目中引入elementui在项目中安装:#安装最新......
  • 每日打卡app
    项目介绍:项目背景:石家庄铁道大学软件工程系从本学期开始要求21级学生每日打卡总结,特委托石家庄铁道大学给力21软件有限公司进行开发。第一阶段目标:1、用户注册:用户注册信息包括用户ID(学号)、用户名(姓名),手机号码,用户单位(班级),用户班级四项基本信息,用户第一次注册后,用户姓名不用每......
  • 拥抱jsx,开启vue3用法的另一种选择
    ......
  • 上下翻页按钮,上一页 下一页 vue2,分页
    已经有每一页对应的数据,一共五页,点击到最后一页再点下一页按钮时回到第一页 <divclass="button-list"><[email protected]="handleLeft"><iclass="el-icon-arrow-left"></i>{{ifchinese?'......
  • 如何为增加的列指定位置 (zz)
    修改表的例子:ExamplesAddacolumntoatableALTERTABLESTAFF_OPTIONSADDSO_INSURANCE_PROVIDERVarchar2(35);AddadefaultvaluetoacolumnALTERTABLESTAFF_OPTIONSMODIFYSO_INSURANCE_PROVIDERVarchar2(35)DEFAUL......
  • 下拉菜单缓慢展开收起的动画过渡效果,vue2 CSS
    需求:点击下拉菜单按钮,显示子菜单并有过渡效果过渡效果:缓慢展开收起环境:vue2CSS分析:子菜单的高度有没有固定,如果子菜单的高度固定,可以设置高的变化添加过渡效果。如果高度不固定设置最大高度的变化添加过渡效果图片展示:展开状态收起状态 实现代码:<template><div>......
  • 【Vue2.x】vue2给对象动态添加响应式属性
    1vue2给对象动态添加响应式属性vue2里对象的响应式是通过Object.defineProperty()实现1.1给对象添加单个响应式属性使用Vue.set()或this.$set()参数第一个参数,是目标对象第二个参数,是要添加的属性名字第三个参数,是要属性值1.2给对象批量添加响应式属性使用Object.......
  • django form data如何传递到template的vue
    参考:https://docs.djangoproject.com/en/4.2/ref/templates/builtins/#json-scriptafelyoutputsaPythonobjectasJSON,wrappedina<script>tag,readyforusewithJavaScript.Argument:TheoptionalHTML“id”ofthe<script>tag.Forexample......