zoukankan      html  css  js  c++  java
  • js地图库的使用,几种坐标之间的相互转换

    @

    一: js地图库的使用,几种坐标之间的相互转换

    简介:现在市面上大部分就是:腾讯、高德、腾讯、这三大类的地图使用的多,高德百度平时本身就用的不少,腾讯也是因为小程序啊 或者聊天的时候都会用到位置。所以在使用的时候都不少。
    但是:就是会出现很多不同的经纬度的表达方式。在此总结一下。

    WGS-84坐标系:GPS的原始坐标系

    在中国,所有的产品都不允许直接使用这个坐标系直接定位,因为很多的这个GPS设备直接获取gps信号得到的经纬度就是84的,你要基于这个做地图不就泄密了吗是吧。

    GCJ-02 坐标系:国测局坐标火星坐标系

    中国国测局02年发布的坐标体系,它是一种对经纬度数据的加密算法,即加入随机的偏差。所有的中国的互联网地图都必须至少使用GCJ-02进行首次加密,同时任何坐标系均不可转换为WGS-84坐标。

    BD-09坐标系:百度地图的 使用GCJ-02进一步偏移算法得到的

    二:各个地图使用的坐标系:

    在这里插入图片描述

    三:相互之间的转换:(BD09--GCJ02)

    还用就是这几个官方的坐标转换都是有官方的API的,你像wgs-84转bd-09,百度地图是有官网API 的

    传送门:

    百度地图坐标拾取 http://api.map.baidu.com/lbsapi/getpoint/index.html
    高德地图坐标拾取 https://lbs.amap.com/tools/picker
    腾讯地图坐标拾取 https://lbs.qq.com/getPoint/

    转腾讯地图官方API https://lbs.qq.com/service/webService/webServiceGuide/webServiceTranslate

    转百度坐标官方API https://lbsyun.baidu.com/jsdemo.htm#TranslateoriTobd
    在这里插入图片描述
    在这里插入图片描述

    /**
    * 坐标转换,百度地图坐标转换成腾讯地图坐标
    * lng 腾讯经度(pointy)
    * lat 腾讯纬度(pointx)
    * 经度>纬度
    */
    function bMapToQQMap(lng, lat) {
    
        if (lng == null || lng == '' || lat == null || lat == '')
            return [lng, lat];
    
        var x_pi = 3.14159265358979324;
        var x = parseFloat(lng) - 0.0065;
        var y = parseFloat(lat) - 0.006;
        var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
        var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
        var lng = (z * Math.cos(theta)).toFixed(7);
        var lat = (z * Math.sin(theta)).toFixed(7);
    
        return [lng, lat];
    
    }
    
    /**
    * 坐标转换,腾讯地图转换成百度地图坐标
    * lng 腾讯经度(pointy)
    * lat 腾讯纬度(pointx)
    * 经度>纬度
    */
    
    function qqMapToBMap(lng, lat) {
    
        if (lng == null || lng == '' || lat == null || lat == '')
            return [lng, lat];
    
        var x_pi = 3.14159265358979324;
        var x = parseFloat(lng);
        var y = parseFloat(lat);
        var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
        var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
        var lng = (z * Math.cos(theta) + 0.0065).toFixed(5);
        var lat = (z * Math.sin(theta) + 0.006).toFixed(5);
        return [lng, lat];
    
    }
    

    四:计算经纬度之间的距离:

    js:

    function toRad(d) {  return d * Math.PI / 180; }
    	function getDisance(lat1, lng1, lat2, lng2) {
    	    var dis = 0;
    	    var radLat1 = toRad(lat1);
    	    var radLat2 = toRad(lat2);
    	    var deltaLat = radLat1 - radLat2;
    	    var deltaLng = toRad(lng1) - toRad(lng2);
    	    var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
    	    return dis * 6378137;
    	} 
    	console.log(  getDisance(39.91917,116.3896,39.91726,116.3940) );
    

    mysql:

    #表结构如下
    CREATE TABLE `map` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `lat` decimal(12,6) NOT NULL,
      `lng` decimal(12,6) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    
    SELECT id,lat,lng,((
    2*ATAN2(SQRT(SIN((39.91578-lat)*PI()/180/2)   
            *SIN((39.91578-lat)*PI()/180/2)+   
            COS(lat*PI()/180)*COS(39.91578*PI()/180)   
            *SIN((116.3899-lng)*PI()/180/2)   
            *SIN((116.3899-lng)*PI()/180/2)),   
            SQRT(1-SIN((39.91578-lat)*PI()/180/2)   
            *SIN((39.91578-lat)*PI()/180/2)   
            +COS(lat*PI()/180)*COS(39.91578*PI()/180)   
            *SIN((116.3899-lng)*PI()/180/2)   
            *SIN((116.3899-lng)*PI()/180/2))))*6378140) as len FROM `map` order by len asc ;
    
    咫尺远近却无法靠近的那个你,才敢让你发觉你并不孤寂
  • 相关阅读:
    jQuery
    jQuery
    jQuery
    jQuery
    jQuery 遍历- 过滤:缩小搜索元素的范围
    jQuery 遍历
    jQuery 遍历
    jQuery 遍历
    jQuery 遍历:jQuery 遍历 什么是遍历?
    jQuery 尺寸:处理元素和浏览器窗口的尺寸
  • 原文地址:https://www.cnblogs.com/tcz1018/p/15760124.html
Copyright © 2011-2022 走看看