通过计算360度以内的角度得出对应的地理方向
八个正角方位:正北、 东北、 正东、 东南、正南、西南、 正西、西北
其他方位以偏角正负数的方式表示
方向 | 角度 | 正负 |
---|---|---|
正北 | 0(360) | 正角 |
东北 | 45 | 正角 |
正东 | 90 | 正角 |
东南 | 135 | 正角 |
正南 | 180 | 正角 |
西南 | 225 | 正角 |
正西 | 270 | 正角 |
西北 | 315 | 正角 |
偏北+n° | 316~359 | 偏正角 |
偏北-n° | 1~44 | 偏负角 |
偏东+n° | 46~89 | 偏正角 |
偏东-n° | 91~134 | 偏负角 |
偏南+n° | 136~179 | 偏正角 |
偏南-n° | 181~224 | 偏负角 |
偏西+n° | 226~269 | 偏正角 |
偏西-n° | 271~314 | 偏负角 |
/**
* 通过角度计算方向
* @param {Number} angle 角度(0~359)
* @returns {String} 方向
*/
function angle2direction(angle) {
let str = '';
if (!Number.isNaN(angle)) {
angle = angle < 0 ? 0 : angle >= 359 ? 360 : angle; //处理不正常的角度及把359转成360方便计算
let arr = ['正北', '东北', '正东', '东南', '正南', '西南', '正西', '西北'];
let num = angle / 45; //每45度为一个正方向
//如果是整数表示为八个正方向
if (parseInt(num) === parseFloat(num)) {
str = arr[num] || arr[0];
} else {
//非八个正方向
let direction = '';
if (num > 7 || num < 1) {
direction = '北'; //偏北
} else if (num > 1 && num < 3) {
direction = '东'; //偏东
} else if (num > 3 && num < 5) {
direction = '南'; //偏南
} else if (num > 5 && num < 7) {
direction = '西'; //偏西
}
let slantAngle = Math.round(angle - 90 * Math.round(angle / 90)) + '°'; //偏角值(正角或负角)
str = '偏' + direction + slantAngle;
}
}
return str;
}
/**
* 通过角度计算方向
* @param {Number} angle 角度
* @returns {String} 方向
*/
angle2direction(angle) {
let str = '';
if (!Number.isNaN(angle)) {
angle = angle < 0 ? 0 : angle >= 359 ? 360 : angle; //处理不正常的角度及把359转成360方便计算
if (angle >= 15 && angle < 75) {
str = '东北';
} else if (angle >= 75 && angle < 105) {
str = '正东';
} else if (angle >= 105 && angle < 165) {
str = '东南';
} else if (angle >= 165 && angle < 195) {
str = '正南';
} else if (angle >= 195 && angle < 255) {
str = '西南';
} else if (angle >= 195 && angle < 285) {
str = '正西';
} else if (angle >= 285 && angle < 354) {
str = '西北';
} else {
str = '正北';
}
}
return str;
},
function direction(val) {
if (typeof val === 'number' && val > -1) {
let angle = 360 / 8;
//分成8个方向,每个方向占45度
let offsetAngle = angle / 2;
//偏移角为正方位角的一半
let computeAngle = val + offsetAngle;
//原始角度加上偏移角度做为计算角
computeAngle > 359 && (computeAngle -= 359);
//计算角如果大于359度则减去359度再计算
let num = Math.ceil(computeAngle / 45);
switch (num) {
case 1:
return '正北';
case 2:
return '东北';
case 3:
return '正东';
case 4:
return '东南';
case 5:
return '正南';
case 6:
return '西南';
case 7:
return '正西';
default:
return '西北';
}
}
return '-';
}