今天,我爱模板网在做APP考勤时,需要定位用户的位置,显示在地图上,于是就想到了用h5+的plus.geolocation.getCurrentPosition来获取经纬度,然后通过百度地图api将经纬度转换成详细的地址以及地图。但是,在手机上测试,总是偏差一两公里左右,估计是国内的地图产品,其地理位置大多数都进行了GCJ-02加密,即加入随机的偏差。而html5原生的定位API获取到的地理位置,是未经加密的。

标准地球坐标即GPS设备获得的坐标,该坐标需要经过国家测绘局进行加密后形成火星坐标(WGS-84),我们用的google坐标和高德地图坐标也就是火星坐标。

百度地图,在火星坐标的基础上再进行一次加密,形成了百度地图上的坐标,因此,直接将标准地球坐标显示在百度地图上是会有几百米的偏差的。按照此原理,标准GPS坐标经过两步的转换可得到百度坐标。因为在处理百度地图时,例如查询其POI都需要百度地图上的坐标,而不是标准坐标,那么这样的转换就是必要的了。

因此,为了保证html5原生的定位API获取到的地理位置在百度地图上较为准确的解析,就需要用百度官方提供的转换类(其他地图如高德也提供了类似的转换方法):Convertor.translate,需要引入convertor.js。

下面是最终的代码,大家可以看看:

function initMap(){

//html5 plus 获取当前经纬度

plus.geolocation.getCurrentPosition(function(p){

curLat = p.coords.latitude; //纬度

curLon = p.coords.longitude; //经度

var gpsPoint = new BMap.Point(curLon, curLat); //创建点坐标

BMap.Convertor.translate(gpsPoint, 0, function(point){ //转换坐标

//point : {"lng":117.30145697312,"lat":31.848379254848}

latlon = point.lat + "," + point.lng;

document.querySelector('#coords').innerText = latlon;

//设置百度地图

var map = new BMap.Map('map');

map.centerAndZoom(point,18); //设置地图中心

var marker = new BMap.Marker(point);

map.addOverlay(marker); //加入覆盖物

var geoc = new BMap.Geocoder();

geoc.getLocation(point, function(rs){

var addComp = rs.addressComponents;

document.querySelector('#addr').innerText = addComp.province + addComp.city + addComp.district + addComp.street;

});

});

},function(e){

alert('定位失败:' + e.message);

});

}

下面是convertor.js的源码:

//2011-7-25

(function(){ //闭包

function load_script(xyUrl, callback){

var head = document.getElementsByTagName('head')[0];

var script = document.createElement('script');

script.type = 'text/javascript';

script.src = xyUrl;

//借鉴了jQuery的script跨域方法

script.onload = script.onreadystatechange = function(){

if((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")){

callback && callback();

// Handle memory leak in IE

script.onload = script.onreadystatechange = null;

if ( head && script.parentNode ) {

head.removeChild( script );

}

}

};

// Use insertBefore instead of appendChild to circumvent an IE6 bug.

head.insertBefore( script, head.firstChild );

}

function translate(point,type,callback){

var callbackName = 'cbk_' + Math.round(Math.random() * 10000); //随机函数名

var xyUrl = "http://api.map.baidu.com/ag/coord/convert?from="+ type + "&to=4&x=" + point.lng + "&y=" + point.lat + "&callback=BMap.Convertor." + callbackName;

//动态创建script标签

load_script(xyUrl);

BMap.Convertor[callbackName] = function(xyResult){

delete BMap.Convertor[callbackName]; //调用完需要删除改函数

var point = new BMap.Point(xyResult.x, xyResult.y);

callback && callback(point);

}

}

window.BMap = window.BMap || {};

BMap.Convertor = {};

BMap.Convertor.translate = translate;

})();

最后,附上convertor.js下载地址:

html转换图片位置不正确的是,html5+经纬度定位不准确,html5坐标转火星坐标,百度地图Convertor.translate...相关推荐

  1. gps84转换gcj02公式_百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换...

    //定义一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; var PI = 3.1415926535897932384626; var a = ...

  2. 前端javascript百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

    /*** * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换*/ // UMD魔法代码 // if the module has no dependenc ...

  3. html5经纬度定位 源码_HTML5教程 如何获取当前位置的经纬度

    本篇教程探讨了HTML5教程 如何获取当前位置的经纬度,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 是想让地图的定位用户位置更准确一些. 查看了介绍: h ...

  4. html5经纬度定位 源码_利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息...

    一.引入相关js 二.js代码 // 单次位置请求执行的函数 function getLocation(){ navigator.geolocation.getCurrentPosition(mapI ...

  5. html5经纬度定位 源码_基于浏览器的HTML5地理定位

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理和一个 ...

  6. html5经纬度定位 源码_h5实现获取用户地理定位的实例代码

    最近做的一个项目中有一个获取周围商户的功能,需要用到地理定位系统, 于是便想到了用 h5 的地理定位,查阅了下资料后,简单封装了下代码. const getPosition = ( timeout = ...

  7. html 高德地图坐标,百度地图,高德地图,HTML5经纬度比较

    对于一个地点的经纬度,是确定的?这个问题,我想很多人都会回答,肯定了,可实际上呢?我只能呵呵了. 在使用百度地图的过程中,发现一个很奇怪的现象,有时候调用百度地图js API时,后得到一个错的离谱的地 ...

  8. 地图坐标系之间的转换(百度地图、GCJ、WGS84)

    文章目录 文章参考 坐标系介绍 常见坐标系 WGS84坐标系(标准的GPS坐标) WGS84 Web墨卡托(平面地图) GCJ02经纬度投影(火星坐标系) GCJ02 Web 墨卡托投影 BD09 经 ...

  9. android gps 火星坐标,GPS真实坐标与火星地图坐标/百度地图坐标的转换

    #include #include #include static const uint32_t GPSBaud = 9600; TinyGPSPlus gps; HardwareSerial ss( ...

最新文章

  1. ClickHouse 在字节跳动广告场景的应用
  2. WWW 2020 开源论文 | 异构图Transformer
  3. JAVA面试题(part6)--局部内部类
  4. 西固哪家计算机学校好,兰州市西固区有什么技术学校和大学
  5. ns3 统计一个包所经历的时延_【直击UDE2020】显示链接的智慧生活,你我正在经历...
  6. Java RandomAccessFile readChar()方法及示例
  7. 如何使用定时器产生两路频率可调的PWM波
  8. HTML头标签使用-又一次定向,refresh
  9. 【Java题解】小米算法面试题
  10. J2me调用wap浏览器
  11. android H5页面跳转APP,H5唤醒app并跳转到指定页面
  12. 京东数据化运营(三)- 复购率
  13. 富文本样式文字图片处理
  14. python函数教程:Python递归函数 二分查找算法实现解析
  15. android自定义键盘遮挡,android中键盘遮挡了dialog里的内容怎么处理
  16. 一元线性回归的公式推导
  17. 推荐四个Flutter重磅开源APP项目!
  18. C#《原CSharp》第三回 万文疑谋生思绪 璃月港口见清玉
  19. ERP简单介绍(转)
  20. 计算机英语实用教程第三版pdf,计算机英语实用教程(第3版)

热门文章

  1. 又一次被idea坑了(Shorten command line)
  2. 【ssh】【scp】scp Permission denied (publickey,password)解决方法
  3. 人民币中间价详解及查询网址
  4. delphi使用ADO在sql数据库存取图片的方法
  5. python post请求参数错误_python爬虫 post请求 参数错误
  6. SQLite管理工具推荐
  7. 网络安全技术第二章——数据加密技术及应用(数据加密概述、密码体制、加密算法数字签名和报文鉴别身份认证)
  8. [完全免费] 在线UML Sequence Diagram 时序图工具 - 教程第3部分
  9. adidas最软的鞋_INS最火的30双运动鞋,Adidas或成最大赢家
  10. Unity2D轮转图