用 Turf.js 计算两点间地理方位角(Bearing):@turf/bearing 完全指南
数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载导读turf/bearing是 Turf.js 模块化地理引擎中用于计算两点间地理方位角bearing的核心模块——即从北方0 度起算、按顺时针方向测量的角度。本文将以 packages/turf-bearing/README.md 为主体骨架结合模块源码、单元测试与基准测试带你掌握 initial bearing初始方位角与 final bearing最终方位角的差异、返回值约定、底层球面三角公式原理以及如何安装并在项目中使用它。模块概览计算从北线起算的地理方位角在航向规划、导航、两点连线可视化、方向统计等 GIS 场景中方位角bearing是最基础的几何量之一。turf/bearing提供的bearing函数接收两个点Point返回两点之间的地理方位角角度以度为单位从北线0 度起算取值范围为-180 到 180 度正值表示顺时针方向东为 90°、南为 180°、西为 -90°。函数签名如下见 index.tsbearing(start: Coord, end: Coord, options?: { final?: boolean }): number参数类型说明startCoord起始点Point Feature、Point Geometry 或经纬度数组[lon, lat]endCoord终止点类型同上optionsObject可选参数默认{}options.finalboolean为true时计算最终方位角final bearing默认false其中Coord类型来自 turf/helpers可接受FeaturePoint、Point或number[]三种形态。安装与引入根据 README.md有两种安装方式方式一单独安装本模块$ npm install turf/bearing方式二安装聚合包 turf/turf包含全部模块并暴露为函数$ npm install turf/turf安装聚合包后可直接从 turf/turf 入口 引入import { bearing } from turf/turf;单独安装时当前仓库为 ESM 模块type: module要求 Node.js 22见 package.jsonimport { bearing } from turf/bearing;快速上手计算两点方位角README 中的示例展示了最基本的用法——计算两个点之间的方位角并把结果写入点属性用于地图渲染见 README.mdvar point1 turf.point([-75.343, 39.984]); var point2 turf.point([-75.534, 39.123]); var bearing turf.bearing(point1, point2); //addToMap var addToMap [point1, point2] point1.properties[marker-color] #f00 point2.properties[marker-color] #0f0 point1.properties.bearing bearing两点坐标均以[经度, 纬度]lon, lat顺序传入。除了用turf.point()构造 Feature 外Coord类型还允许直接传入经纬度数组基准测试 bench.ts 即演示了这一用法import { bearing } from ./index.js; var start [-75.4, 39.4]; var end [-75.534, 39.123]; var initialBearing bearing(start, end); var finalBearing bearing(start, end, { final: true });返回值约定函数返回十进制角度degrees范围-180 到 180正值顺时针。这一约定在 index.ts 的类型注释与 README 中均有明确声明并在测试中被严格验证见下文。进阶options.final与初始/最终方位角的区别options.final是本模块唯一的行为开关它区分了两种方位角initial bearing初始方位角默认行为final: false表示从起点出发、沿两点大圆航线geodesic的初始行进方向final bearing最终方位角final: true时计算表示到达终点时航线的切线方向。在长距离大圆航线上起点与终点的切线方向并不相同因此两个值通常有差异。源码将最终方位角实现为私有函数calculateFinalBearing见 index.tsfunction calculateFinalBearing(start: Coord, end: Coord) { // Swap start end let bear bearing(end, start); bear (bear 180) % 360; // Normalize to [-180, 180]; the % 360 above yields [0, 360) which violates // the documented return range when the initial reverse bearing is positive. return bear 180 ? bear - 360 : bear; }其思路是先反向计算bearing(end, start)得到“反向方位角”再加 180° 翻转方向最后将结果归一化回 [-180, 180] 区间。测试验证两个方向的值单元测试 test.ts 对同一对点分别断言了两种方位角const start point([-75, 45], { marker-color: #F00 }); const end point([20, 60], { marker-color: #00F }); const initialBearing bearing(start, end); t.equal(initialBearing.toFixed(2), 37.75, initial bearing); const finalBearing bearing(start, end, { final: true }); t.equal(finalBearing.toFixed(2), 120.01, final bearing);对于从(-75, 45)到(20, 60)这对点初始方位角约37.75°最终方位角约120.01°——可见跨越较大经纬度跨度时两者差异明显选择哪种值取决于你的业务场景。边界情形返回值始终落在 [-180, 180]第二个测试用例专门校验最终方位角的取值范围见 test.ts场景是沿赤道向正西航行从(10, 0)到(0, 0)终点处的最终方位角应为-90°正西而不是 270°const west_start point([10, 0]); const west_end point([0, 0]); const finalWest bearing(west_start, west_end, { final: true }); t.ok(finalWest -180 finalWest 180, final bearing is within [-180, 180]: got finalWest); t.equal(finalWest.toFixed(2), -90.00, final bearing westward is -90);这一用例正是为了守护% 360可能产生 [0, 360) 区间结果、破坏文档承诺返回范围的边界缺陷而存在——也解释了calculateFinalBearing中最后一步归一化代码的来龙去脉。深入源码方位角公式的原理核心计算位于 index.ts代码注释引用了 Haversine 公式与大圆方位角的标准推导见源码头部注释引用的 Wikipedia 与 movable-type 参考资料const coordinates1 getCoord(start); const coordinates2 getCoord(end); const lon1 degreesToRadians(coordinates1[0]); const lon2 degreesToRadians(coordinates2[0]); const lat1 degreesToRadians(coordinates1[1]); const lat2 degreesToRadians(coordinates2[1]); const a Math.sin(lon2 - lon1) * Math.cos(lat2); const b Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1); return radiansToDegrees(Math.atan2(a, b));几个值得注意的实现细节getCoord统一坐标形态来自 turf/invariant 的getCoord会把FeaturePoint、PointGeometry 或[lon, lat]数组统一解包为坐标数组。若传入空值或非法结构它会抛出coord is required或coord must be GeoJSON Point or an Array of numbers错误。atan2决定象限公式使用Math.atan2(a, b)而非简单的反正切这样返回值的象限能由经纬度差自动决定天然落回 (-180, 180] 区间与文档约定的取值范围一致。角度单位转换经纬度与方位角都是角度值计算前由 turf/helpers 提供的degreesToRadians转为弧度计算后用radiansToDegrees转回度数。这两个辅助函数对超过 360° 的输入做了取模归一化处理。配套资源与工作流回归测试REGENtest.ts支持环境变量REGEN驱动的测试数据再生成流程当process.env.REGEN存在时会用turf/destination沿初始/最终方位角各生成 1000 米线段并输出一个 GeoJSON FeatureCollection 到test/out/results.geojson用于可视化校对计算结果。基准测试模块内置 bench.ts基于benchmark库分别对 initial bearing 与 final bearing 两种路径计时可通过包脚本运行pnpm --filter turf/bearing bench小结turf/bearing是 Turf.js 中一个轻量却严谨的几何模块它用atan2实现大圆方位角公式提供final开关区分初始/最终方位角并通过单元测试确保返回值严格落在 [-180, 180] 区间。无论是简单的两点朝向计算还是长距离导航的方向推演都可以放心把它作为turf/turf聚合包或独立模块接入你的地理计算管线。赞分享数据分析【免费下载链接】turfA modular geospatial engine written in JavaScript and TypeScript项目地址https://gitcode.com/gh_mirrors/tu/turf点击查看免费下载相关推荐ZITADEL 登录应用主题系统架构环境变量驱动的组件样式与响应式布局实现ZITADEL 登录应用主题系统架构环境变量驱动的组件样式与响应式布局实现 本文基于 ZITADEL 登录应用apps/login的主题架构设计文档深入数据分析如何使用Turf.js的turf/bbox模块快速计算地理边界框如何使用Turf.js的turf/bbox模块快速计算地理边界框 Turf.js是一个强大的JavaScript和TypeScript地理空间引擎而tur数据分析Turf.js booleanDisjoint 空间关系判定完全指南turf/boolean-disjoint 原理、用法与源码解析Turf.js booleanDisjoint 空间关系判定完全指南turf/boolean disjoint 原理、用法与源码解析 导读 turf/bo数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考