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 ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM