瀏覽代碼

获取距离方法优化

htc 1 月之前
父節點
當前提交
b4b96fe9f3
共有 2 個文件被更改,包括 98 次插入9 次删除
  1. 11 9
      pagesClockin/index.vue
  2. 87 0
      utils/coordtransform.js

+ 11 - 9
pagesClockin/index.vue

@@ -66,6 +66,7 @@
 	const qqmapsdk = new QQMapWX({
 	  key: 'V3NBZ-6NRKT-QOQXY-LU6RY-PNHJ5-QDBTQKEY'
 	});
+	import { wgs84togcj02 } from '@/utils/coordtransform.js';
 	import Tabbar from '@/components/CusTabbar/clock.vue'
 	export default {
 		components:{ Tabbar },
@@ -82,8 +83,8 @@
 				clockTime:'',
 				distance: null,
 				targetLocation: { //谷锐特 31.962084,117.020446  /跨境电商大厦 31.865786,117.15297
-					latitude: 31.865786,
-					longitude: 117.15297
+					latitude: 31.962084,
+					longitude: 117.020446
 				},
 				userInfo:null
 			}
@@ -147,17 +148,18 @@
 			async getCurrentLocation() {
 			  try {
 				const res = await uni.getLocation({
-				  type: 'gcj02 ', // 腾讯地图使用GCJ-02坐标系/
+				  type: 'gcj02', // 腾讯地图使用GCJ-02坐标系/
 				  isHighAccuracy: true
 				});
+				let origin = wgs84togcj02(res[1].longitude,res[1].latitude);
+				let target = wgs84togcj02(this.targetLocation.longitude,this.targetLocation.latitude);
 				this.calculateDistance(
-				  res[1].latitude, 
-				  res[1].longitude,
-				  this.targetLocation.latitude,
-				  this.targetLocation.longitude
+				  origin[1],
+				  origin[0],
+				  target[1],
+				  target[0]
 				);
-				console.log(this.distance,'distance');
-				this.canClock = this.distance<=10;
+				this.canClock = this.distance<=30;
 			  } catch (err) {
 				uni.showToast({
 				  title: '获取位置失败,请检查权限设置',

+ 87 - 0
utils/coordtransform.js

@@ -0,0 +1,87 @@
+// coordtransform.js
+// 源码来自:https://github.com/hujiulong/gcoord (MIT License)
+// 核心转换函数(WGS-84 <-> GCJ-02)
+
+const π = 3.1415926535897932384626;
+const a = 6378245.0;  // 长半轴(克拉索夫斯基椭球参数)
+const ee = 0.00669342162296594323; // 扁率
+
+// 判断坐标是否在国内(GCJ-02适用范围)
+function outOfChina(lng, lat) {
+  return (lng < 72.004 || lng > 137.8347) || (lat < 0.8293 || lat > 55.8271);
+}
+
+// WGS-84 转 GCJ-02
+export function wgs84togcj02(lng, lat) {
+	console.log(lng, lat);
+  if (outOfChina(lng, lat)) return [lng, lat];
+
+  let dlat = transformlat(lng - 105.0, lat - 35.0);
+  let dlng = transformlng(lng - 105.0, lat - 35.0);
+  const radlat = lat / 180.0 * π;
+  let magic = Math.sin(radlat);
+  magic = 1 - ee * magic * magic;
+  const sqrtmagic = Math.sqrt(magic);
+  dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * π);
+  dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * π);
+  const mglat = lat + dlat;
+  const mglng = lng + dlng;
+  return [mglng, mglat];
+}
+
+// GCJ-02 转 WGS-84(存在1-2米误差)
+export function gcj02towgs84(lng, lat) {
+  if (outOfChina(lng, lat)) return [lng, lat];
+
+  let dlat = transformlat(lng - 105.0, lat - 35.0);
+  let dlng = transformlng(lng - 105.0, lat - 35.0);
+  const radlat = lat / 180.0 * π;
+  let magic = Math.sin(radlat);
+  magic = 1 - ee * magic * magic;
+  const sqrtmagic = Math.sqrt(magic);
+  dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * π);
+  dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * π);
+  const mglat = lat + dlat;
+  const mglng = lng + dlng;
+  return [lng * 2 - mglng, lat * 2 - mglat];
+}
+
+// 辅助函数:纬度变换
+function transformlat(lng, lat) {
+  let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
+  ret += (20.0 * Math.sin(6.0 * lng * π) + 20.0 * Math.sin(2.0 * lng * π)) * 2.0 / 3.0;
+  ret += (20.0 * Math.sin(lat * π) + 40.0 * Math.sin(lat / 3.0 * π)) * 2.0 / 3.0;
+  ret += (160.0 * Math.sin(lat / 12.0 * π) + 320 * Math.sin(lat * π / 30.0)) * 2.0 / 3.0;
+  return ret;
+}
+
+// 辅助函数:经度变换
+function transformlng(lng, lat) {
+  let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
+  ret += (20.0 * Math.sin(6.0 * lng * π) + 20.0 * Math.sin(2.0 * lng * π)) * 2.0 / 3.0;
+  ret += (20.0 * Math.sin(lng * π) + 40.0 * Math.sin(lng / 3.0 * π)) * 2.0 / 3.0;
+  ret += (150.0 * Math.sin(lng / 12.0 * π) + 300.0 * Math.sin(lng / 30.0 * π)) * 2.0 / 3.0;
+  return ret;
+}
+
+// 其他坐标系转换(如百度BD-09)
+export function bd09togcj02(lng, lat) {
+  const x = lng - 0.0065;
+  const y = lat - 0.006;
+  const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * π);
+  const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * π);
+  return [z * Math.cos(theta), z * Math.sin(theta)];
+}
+
+export function gcj02tobd09(lng, lat) {
+  const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * π);
+  const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * π);
+  return [z * Math.cos(theta) + 0.0065, z * Math.sin(theta) + 0.006];
+}
+
+export default {
+  wgs84togcj02,
+  gcj02towgs84,
+  bd09togcj02,
+  gcj02tobd09
+};