Commit 7b6876fc8284bf19d7c6295d6e3b18c129375974
1 parent
6be10167
定位完成~
Showing
2 changed files
with
81 additions
and
11 deletions
src/common/helper.class.js
| @@ -196,7 +196,7 @@ export default class Helper { | @@ -196,7 +196,7 @@ export default class Helper { | ||
| 196 | 196 | ||
| 197 | /* 数据格式处理 结束 */ | 197 | /* 数据格式处理 结束 */ |
| 198 | 198 | ||
| 199 | - /* 定位 开始 */ | 199 | + /* 定位相关处理 开始 */ |
| 200 | 200 | ||
| 201 | /** | 201 | /** |
| 202 | * 获取用户地理位置坐标 | 202 | * 获取用户地理位置坐标 |
| @@ -214,6 +214,70 @@ export default class Helper { | @@ -214,6 +214,70 @@ export default class Helper { | ||
| 214 | } | 214 | } |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | - /* 定位 结束 */ | 217 | + /** |
| 218 | + * GPS坐标转换为高德火星坐标,调用gcj_encrypt函数,传入wgsLat(纬度)和wgsLon(经度)参数 | ||
| 219 | + */ | ||
| 220 | + GPS = { | ||
| 221 | + PI : 3.14159265358979324, | ||
| 222 | + x_pi : 3.14159265358979324 * 3000.0 / 180.0, | ||
| 223 | + delta : function (lat, lon) { | ||
| 224 | + // Krasovsky 1940 | ||
| 225 | + // | ||
| 226 | + // a = 6378245.0, 1/f = 298.3 | ||
| 227 | + // b = a * (1 - f) | ||
| 228 | + // ee = (a^2 - b^2) / a^2; | ||
| 229 | + var a = 6378245.0; // a: 卫星椭球坐标投影到平面地图坐标系的投影因子。 | ||
| 230 | + var ee = 0.00669342162296594323; // ee: 椭球的偏心率。 | ||
| 231 | + var dLat = this.transformLat(lon - 105.0, lat - 35.0); | ||
| 232 | + var dLon = this.transformLon(lon - 105.0, lat - 35.0); | ||
| 233 | + var radLat = lat / 180.0 * this.PI; | ||
| 234 | + var magic = Math.sin(radLat); | ||
| 235 | + magic = 1 - ee * magic * magic; | ||
| 236 | + var sqrtMagic = Math.sqrt(magic); | ||
| 237 | + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * this.PI); | ||
| 238 | + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * this.PI); | ||
| 239 | + return {'lat': dLat, 'lon': dLon}; | ||
| 240 | + }, | ||
| 241 | + | ||
| 242 | + //GPS---高德 | ||
| 243 | + wgs84ToGcj02 : function ( wgsLat , wgsLon ) { | ||
| 244 | + | ||
| 245 | + // 将坐标转成浮点数 | ||
| 246 | + wgsLat = parseFloat(wgsLat); | ||
| 247 | + wgsLon = parseFloat(wgsLon); | ||
| 248 | + | ||
| 249 | + if (this.outOfChina(wgsLat, wgsLon)) { | ||
| 250 | + return {'lat': wgsLat, 'lon': wgsLon}; | ||
| 251 | + } | ||
| 252 | + | ||
| 253 | + var d = this.delta(wgsLat, wgsLon); | ||
| 254 | + return {'lat' : wgsLat + d.lat,'lon' : wgsLon + d.lon}; | ||
| 255 | + }, | ||
| 256 | + outOfChina : function (lat, lon) { | ||
| 257 | + if (lon < 72.004 || lon > 137.8347) { | ||
| 258 | + return true; | ||
| 259 | + } | ||
| 260 | + if (lat < 0.8293 || lat > 55.8271) { | ||
| 261 | + return true; | ||
| 262 | + } | ||
| 263 | + return false; | ||
| 264 | + }, | ||
| 265 | + transformLat : function (x, y) { | ||
| 266 | + var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); | ||
| 267 | + ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; | ||
| 268 | + ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0; | ||
| 269 | + ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0; | ||
| 270 | + return ret; | ||
| 271 | + }, | ||
| 272 | + transformLon : function (x, y) { | ||
| 273 | + var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); | ||
| 274 | + ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; | ||
| 275 | + ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0; | ||
| 276 | + ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0; | ||
| 277 | + return ret; | ||
| 278 | + } | ||
| 279 | + }; | ||
| 280 | + | ||
| 281 | + /* 定位相关处理 结束 */ | ||
| 218 | 282 | ||
| 219 | } | 283 | } |
| 220 | \ No newline at end of file | 284 | \ No newline at end of file |
src/pages/search/search.vue
| @@ -95,8 +95,8 @@ | @@ -95,8 +95,8 @@ | ||
| 95 | borderColor: "#FC1541" | 95 | borderColor: "#FC1541" |
| 96 | }, | 96 | }, |
| 97 | coordinate: { // 经纬度定位参数 | 97 | coordinate: { // 经纬度定位参数 |
| 98 | - longitude: "0", | ||
| 99 | - latitude: "0", | 98 | + longitude: 0, |
| 99 | + latitude: 0, | ||
| 100 | location: false | 100 | location: false |
| 101 | }, | 101 | }, |
| 102 | titles: { // 板块标题 | 102 | titles: { // 板块标题 |
| @@ -215,9 +215,15 @@ | @@ -215,9 +215,15 @@ | ||
| 215 | */ | 215 | */ |
| 216 | positionCallback(position) { | 216 | positionCallback(position) { |
| 217 | 217 | ||
| 218 | - // 设置经纬度定位参数 | ||
| 219 | - this.$set(this.coordinate, "longitude", position.coords.longitude); | ||
| 220 | - this.$set(this.coordinate, "latitude", position.coords.latitude); | 218 | + // 判断是否有GPS坐标转换高德坐标函数 |
| 219 | + if (typeof this.$parent.helper === "object" && typeof this.$parent.helper.GPS === "object") { | ||
| 220 | + | ||
| 221 | + let marsCoordinates = this.$parent.helper.GPS.wgs84ToGcj02(position.coords.latitude, position.coords.longitude); | ||
| 222 | + | ||
| 223 | + // 设置经纬度定位参数(火星坐标) | ||
| 224 | + this.$set(this.coordinate, "longitude", marsCoordinates.lon); | ||
| 225 | + this.$set(this.coordinate, "latitude", marsCoordinates.lat); | ||
| 226 | + } | ||
| 221 | 227 | ||
| 222 | // 定位执行完成,设置定位成功标识参数 | 228 | // 定位执行完成,设置定位成功标识参数 |
| 223 | this.$set(this.coordinate, "location", true); | 229 | this.$set(this.coordinate, "location", true); |
| @@ -235,16 +241,16 @@ | @@ -235,16 +241,16 @@ | ||
| 235 | // 定位出错提示 | 241 | // 定位出错提示 |
| 236 | switch(positionError.code) { | 242 | switch(positionError.code) { |
| 237 | case positionError.PERMISSION_DENIED: | 243 | case positionError.PERMISSION_DENIED: |
| 238 | - Toast("用户拒绝定位"); | 244 | + // Toast("用户拒绝定位"); |
| 239 | break; | 245 | break; |
| 240 | case positionError.POSITION_UNAVAILABLE: | 246 | case positionError.POSITION_UNAVAILABLE: |
| 241 | - Toast("无权获取当前位置"); | 247 | + // Toast("无权获取当前位置"); |
| 242 | break; | 248 | break; |
| 243 | case positionError.TIMEOUT: | 249 | case positionError.TIMEOUT: |
| 244 | - Toast("定位请求超时"); | 250 | + // Toast("定位请求超时"); |
| 245 | break; | 251 | break; |
| 246 | case positionError.UNKNOWN_ERROR: | 252 | case positionError.UNKNOWN_ERROR: |
| 247 | - Toast("未知定位错误"); | 253 | + // Toast("未知定位错误"); |
| 248 | break; | 254 | break; |
| 249 | } | 255 | } |
| 250 | 256 |