微信小程序地图定位GPS转腾讯地图的坐标系

参考:
http://www.qchcloud.cn/tn/article/23
参考

//s
var GPS = {
PI: 3.14159265358979324,
x_pi: 3.14159265358979324 3000.0 / 180.0,
delta: function (lat, lon) {
// Krasovsky 1940
//
// a = 6378245.0, 1/f = 298.3
// b = a
(1 - f)
// ee = (a^2 - b^2) / a^2;
var a = 6378245.0; // a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
var ee = 0.00669342162296594323; // ee: 椭球的偏心率。
var dLat = this.transformLat(lon - 105.0, lat - 35.0);
var dLon = this.transformLon(lon - 105.0, lat - 35.0);
var radLat = lat / 180.0 this.PI;
var magic = Math.sin(radLat);
magic = 1 - ee
magic magic;
var sqrtMagic = Math.sqrt(magic);
dLat = (dLat
180.0) / ((a (1 - ee)) / (magic sqrtMagic) this.PI);
dLon = (dLon
180.0) / (a / sqrtMagic Math.cos(radLat) this.PI);
return { ‘lat‘: dLat, ‘lon‘: dLon };
},

 //WGS-84 to GCJ-02
 gcj_encrypt: function (wgsLat, wgsLon) {
   if (this.outOfChina(wgsLat, wgsLon))
     return { ‘lat‘: wgsLat, ‘lon‘: wgsLon };

   var d = this.delta(wgsLat, wgsLon);
   return { ‘lat‘: wgsLat + d.lat, ‘lon‘: wgsLon + d.lon };
 },
 //GCJ-02 to WGS-84
 gcj_decrypt: function (gcjLat, gcjLon) {
   if (this.outOfChina(gcjLat, gcjLon))
     return { ‘lat‘: gcjLat, ‘lon‘: gcjLon };

   var d = this.delta(gcjLat, gcjLon);
   return { ‘lat‘: gcjLat - d.lat, ‘lon‘: gcjLon - d.lon };
 },
 //GCJ-02 to WGS-84 exactly
 gcj_decrypt_exact: function (gcjLat, gcjLon) {
   var initDelta = 0.01;
   var threshold = 0.000000001;
   var dLat = initDelta, dLon = initDelta;
   var mLat = gcjLat - dLat, mLon = gcjLon - dLon;
   var pLat = gcjLat + dLat, pLon = gcjLon + dLon;
   var wgsLat, wgsLon, i = 0;
   while (1) {
     wgsLat = (mLat + pLat) / 2;
     wgsLon = (mLon + pLon) / 2;
     var tmp = this.gcj_encrypt(wgsLat, wgsLon)
     dLat = tmp.lat - gcjLat;
     dLon = tmp.lon - gcjLon;
     if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold))
       break;

     if (dLat > 0) pLat = wgsLat; else mLat = wgsLat;
     if (dLon > 0) pLon = wgsLon; else mLon = wgsLon;

     if (++i > 10000) break;
   }
   //console.log(i);
   return { ‘lat‘: wgsLat, ‘lon‘: wgsLon };
 },
 //GCJ-02 to BD-09
 bd_encrypt: function (gcjLat, gcjLon) {
   var x = gcjLon, y = gcjLat;
   var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi);
   var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi);
   bdLon = z * Math.cos(theta) + 0.0065;
   bdLat = z * Math.sin(theta) + 0.006;
   return { ‘lat‘: bdLat, ‘lon‘: bdLon };
 },
 //BD-09 to GCJ-02
 bd_decrypt: function (bdLat, bdLon) {
   var x = bdLon - 0.0065, y = bdLat - 0.006;
   var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi);
   var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi);
   var gcjLon = z * Math.cos(theta);
   var gcjLat = z * Math.sin(theta);
   return { ‘lat‘: gcjLat, ‘lon‘: gcjLon };
 },
 //WGS-84 to Web mercator
 //mercatorLat -> y mercatorLon -> x
 mercator_encrypt: function (wgsLat, wgsLon) {
   var x = wgsLon * 20037508.34 / 180.;
   var y = Math.log(Math.tan((90. + wgsLat) * this.PI / 360.)) / (this.PI / 180.);
   y = y * 20037508.34 / 180.;
   return { ‘lat‘: y, ‘lon‘: x };
   /*
   if ((Math.abs(wgsLon) > 180 || Math.abs(wgsLat) > 90))
       return null;
   var x = 6378137.0 * wgsLon * 0.017453292519943295;
   var a = wgsLat * 0.017453292519943295;
   var y = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));
   return {‘lat‘ : y, ‘lon‘ : x};
   //*/
 },
 // Web mercator to WGS-84
 // mercatorLat -> y mercatorLon -> x
 mercator_decrypt: function (mercatorLat, mercatorLon) {
   var x = mercatorLon / 20037508.34 * 180.;
   var y = mercatorLat / 20037508.34 * 180.;
   y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.)) - this.PI / 2);
   return { ‘lat‘: y, ‘lon‘: x };
   /*
   if (Math.abs(mercatorLon) < 180 && Math.abs(mercatorLat) < 90)
       return null;
   if ((Math.abs(mercatorLon) > 20037508.3427892) || (Math.abs(mercatorLat) > 20037508.3427892))
       return null;
   var a = mercatorLon / 6378137.0 * 57.295779513082323;
   var x = a - (Math.floor(((a + 180.0) / 360.0)) * 360.0);
   var y = (1.5707963267948966 - (2.0 * Math.atan(Math.exp((-1.0 * mercatorLat) / 6378137.0)))) * 57.295779513082323;
   return {‘lat‘ : y, ‘lon‘ : x};
   //*/
 },
 // two point‘s distance
 distance: function (latA, lonA, latB, lonB) {
   var earthR = 6371000.;
   var x = Math.cos(latA * this.PI / 180.) * Math.cos(latB * this.PI / 180.) * Math.cos((lonA - lonB) * this.PI / 180);
   var y = Math.sin(latA * this.PI / 180.) * Math.sin(latB * this.PI / 180.);
   var s = x + y;
   if (s > 1) s = 1;
   if (s < -1) s = -1;
   var alpha = Math.acos(s);
   var distance = alpha * earthR;
   return distance;
 },
 outOfChina: function (lat, lon) {
   if (lon < 72.004 || lon > 137.8347)
     return true;
   if (lat < 0.8293 || lat > 55.8271)
     return true;
   return false;
 },
 transformLat: function (x, y) {
   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));
   ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0;
   ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0;
   ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0;
   return ret;
 },
 transformLon: function (x, y) {
   var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
   ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0;
   ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0;
   ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0;
   return ret;
 }

};

//e

原文地址:https://blog.51cto.com/14042154/2391289

时间: 2024-10-01 23:27:34

微信小程序地图定位GPS转腾讯地图的坐标系的相关文章

5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用

本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频版更新的文字版本摘要. 此文为 「60 节实战课微信小程序开发视频教程」 的第 51 小节内容,如果需要查看视频版本的实战操作,请直接跳至文章的最后部分查看. 1.云开发图片空间简介 在之前的文章 微信小程序开发平台新功能「云开发」快速上手体验 中我们简要介绍了腾讯官方给所有的微信小程序开发提供的云

微信小程序开发常见的拉起外部地图软件进行导航的功能

<view class="dh" bindtap="mapNavigation" data-addr="{{address}}"> 导航 <image class="imageD" src="{{pathUrl}}dh.png"></image> </view> // 引入SDK核心类 var QQMapWX = require('../../utils/qq

微信小程序 地图组件中marker无法使用网络图片问题

最近做微信小程序的时候,要做一个地图找房的功能,是这个样子的 后台贴心底提供了价格标签的图片 根据微信小程序文档,这里使用markers里的iconPath加载后台给我的url就行了 但是编译后却发现图片没有加载出来 直接给出我的解决方法 先把图片下载到本地,然后再进行使用 原文地址:https://www.cnblogs.com/hitore/p/8505643.html

微信小程序学习指南

作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 微信小程序正式公测, 张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) ... 前言:新人第一坑,跳坑指南:修改后,必须保存:ctrl+S: 1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教

[转]微信小程序(应用号)是什么,是否值得投入进来做?

本文转自:http://www.woshipm.com/it/417887.html 距离张小龙的那场首次公开演讲已经有九个月了,而在那场演讲中备受关注的「应用号」在千呼万唤中终于以「小程序」的名字正式对外小范围公测,不少创业者表示机会来了跃跃欲试.诚然,微信每次放出的大招,不管是公众号.服务号.朋友圈广告等,对于抢先抓住机会的人都是不小的红利.而这次这个大招,或许足以影响现有移动互联网的格局. 张小龙在朋友圈里这样解释道:小程序是一种不需要下载安装即可使用的应用,它实现了应用「触手可及」的梦想

微信小程序项目实践准备工作

一.了解微信小程序 产品定位及功能介绍 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 简单的说,小程序是微信附属产品,需要依赖微信,只有用户安装了微信才能使用. 小程序具体能做什么?有什么用?我也懒得想.但我也需要搞清楚这两个问题,所以我找了几个在当地开网络公司的朋友,我就问问他们是怎么看待这两个问题的,他们回答也很直接,小程序在谈客户的时候是新概念,客户完全没接触过,谈单的时候好谈,能要上价,谈单金额能增加不少.赚钱,就这么简单! 后来

我们的微信小程序开发

基于微信小程序的系统开发准备工作 腾讯推出微信小程序也有一段时间了,在各种行业里面也都掀起一阵阵的热潮,很多APP应用被简化为小程序的功能迅速推出,同时也根据小程序的特性推出各种独具匠心的应用,相对传统的APP来说,微信小程序确实能够大大降低开发成本和难度,但也意味着需要掌握整个微信小程序的各种接口功能.应用场景等相关技术点,本篇随笔先从大的方面来介绍微信小程序开发的一些知识,如架构设计.技术路线 .工具准备等方面做一些浅薄的介绍,希望大家也有所收益,有所借鉴,则善莫大焉. 1.小程序的统一架构

微信小程序开发备忘

前言 从去年一月份微信宣告要做小程序时的圈子里已经有了局部躁动,去年九月内测时,更是全民热捧,似乎张晓龙和他的微信已经准备好再一次改变世界.还好微信比它的粉丝们要理智的多,不做分发,不搞渠道,不发"红利",所以,昨天正式发布时,也并没有想象中的所有人一起迎接新世界到来的景象.OSC上有人发帖问"微信小程序就要发布了,大家激动吗",底下居然都已经有人开喷了.. 但是,话说回来,从技术角度看,微信为我们提供了基于微信本身的新应用场景下的新技术,那么作为一个开发者,对他有

微信小程序是什么

官方的开发文档 微信小程序写的不多,随便写写 创建项目,分析工具 微信小程序有专门的编辑工具,去官网下载 然后申请一个小程序项目,获得一个appId,然后进入编辑工具就可以直接开发了 编辑工具可以设置es6编译和npm 文件分析 小程序的写法非常的像vue-cli,但是vue是一个vue文件带有html+js+css 小程序是一个页面分为四个文件,wxml+js+wxss+json(配置页面) 还有一个app.json总配置页面,一个app.js入口文件,一个app.wxss的全局css文件 新