# azimuthUtils **Repository Path**: cooljoker/azimuth-utils ## Basic Information - **Project Name**: azimuthUtils - **Description**: 利用经纬度坐标,求解方位角【JS实现】 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-09 - **Last Updated**: 2021-10-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # azimuthUtils #### 介绍 利用经纬度坐标,求解方位角【JS实现】 #### 安装教程 本实现只用到了一个库 Threejs,Threejs主要用于实现3D场景,本实现利用Three.js中的一些工具类,进行数据转换 安装Threejs ``` npm install three --save ``` #### 使用案例 ```js //引入Threrjs const THREE=require('three') //npm install three --save // import * as THREE from 'three' //用例数据 var lonlat0 = [ 34.80770804146611, 113.55585694313051] //参照点 var lonlat1 = [ 34.807743270320515, 113.55691373348238] //东 var lonlat2 = [ 34.807139974109454, 113.55676352977753] //东南 var lonlat3 = [ 34.807003461215416, 113.55584621429445] //南 var lonlat4 = [ 34.807126763194105, 113.55516493320467] //西南 var lonlat5 = [ 34.80772125228826,113.5548484325409] //西 var lonlat6 = [34.80861958322779, 113.55479478836061] //西北 var lonlat7 = [ 34.80863719746204,113.55581402778627] //北 var lonlat8 = [ 34.80850949417833, 113.5569351911545] //东北 // lon1经度 lat纬度 //lonlat1 坐标1 //lonlat2 坐标2 function azimuth(lonlat1, lonlat2) { var lon1=THREE.MathUtils.degToRad(lonlat1[1]) var lat1=THREE.MathUtils.degToRad(lonlat1[0]) var lon2=THREE.MathUtils.degToRad(lonlat2[1]) var lat2=THREE.MathUtils.degToRad(lonlat2[0]) if(lon1==lon2){ if (lat2 >= lat1){ return 0 }else{ return 180 } } if (lat1 == lat2){ if(lon2 > lon1 ){ return 90 }else if(lon2 < lon1){ return 270 } } var a = THREE.Math.radToDeg(Math.atan((lon2 - lon1) * Math.cos(lat2) / (lat2 - lat1))) if(lat2 > lat1){ if(lon2 > lon1){ return a }else{ return a + 360 } }else{ return a + 180 } } console.log("东",azimuth(lonlat0, lonlat1) ) console.log("东南",azimuth(lonlat0, lonlat2) ) console.log("南",azimuth(lonlat0, lonlat3) ) console.log("西南",azimuth(lonlat0, lonlat4) ) console.log("西",azimuth(lonlat0, lonlat5) ) console.log("西北",azimuth(lonlat0, lonlat6) ) console.log("北",azimuth(lonlat0, lonlat7) ) console.log("东北",azimuth(lonlat0, lonlat8) ) ``` **执行该程序** ``` node .\index2.js ``` **方位坐标系参照如下** ![输入图片说明](https://images.gitee.com/uploads/images/2021/1009/164236_ce1d90c5_5380040.png "1633768673537.png") **结果如下** ```js 东 87.67505557361658 东南 127.34881807813873 南 180.7163204119453 西南 224.34785264592313 西 270.91401595485104 西北 316.26689801310204 北 357.8282236159254 东北 47.8461480246868 ``` #### 角度与弧度互转 THREE.MathUtils.degToRad 与 THREE.Math.radToDeg两个工具类,无非是为了转化角度与弧度 为了两个工具类,引入了一整个包,有点得不偿失 1. 角度定义 ​ 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。(单位: º) 2. 弧度定义 ​ 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度(单位:rad)。 可简单理解为: 弧度 = 弧长 / 半径 ![输入图片说明](https://images.gitee.com/uploads/images/2021/1011/111016_10759502_5380040.png "1633921617528.png") 3. 弧长与弧度 ​ 3.1 圆的周长C的计算公式为:C = 2πr = πd (r - 半径;d - 直径) ​ 3.2 圆一周的弧长为:2πr (弧长 = 周长) ​ 3.2 圆一周的弧度为:2πr / r = 2π (根据: 弧度 = 弧长 / 半径) 4. 度与角度的转换 根据圆为360 º,弧度为2π,即 360º = 2π 4.1 角度转弧度:2π / 360 = π / 180 ≈ 0.0174rad, 即: 度数 * (π / 180) = 弧度 例如:将30º转为弧度rad 30º * (π / 180)= 0.523320 rad 4.2 弧度转角度: 360 / 2π = 180 / π ≈ 57.3º, 即: 弧度 * (180 / π) = 度数 例如:将0.523320rad转为度º 0.523320rad * (180 / π) = 29.9992352688º #### 不使用Threejs库方法 ```js /* 由于引入three时有可能会出现一些问题, 因此将Threejs中弧度与角度转化工具,手动写了出来 */ function azimuth2(lonlat1, lonlat2) { var lon1=lonlat1[1]*(Math.PI/180) var lat1=lonlat1[0]*(Math.PI/180) var lon2=lonlat2[1]*(Math.PI/180) var lat2=lonlat2[0]*(Math.PI/180) if(lon1==lon2){ if (lat2 >= lat1){ return 0 }else{ return 180 } } if (lat1 == lat2){ if(lon2 > lon1 ){ return 90 }else if(lon2 < lon1){ return 270 } } var a = Math.atan((lon2 - lon1) * Math.cos(lat2) / (lat2 - lat1))*(180/Math.PI) if(lat2 > lat1){ if(lon2 > lon1){ return a }else{ return a + 360 } }else{ return a + 180 } } ```