• 使用JavaScript计算两点经纬度之间的弧线点经纬度数组


    前言

    地球是一个近似于椭球体的三维物体,因此在计算两个经纬度点之间的距离时,不能简单地将其视为平面上的直线距离。相反,我们需要考虑地球的曲率,并使用球面三角法来计算两点之间的弧线距离及其中的插值点。

    通过本篇博客,我们将使用JavaScript来实现根据两个经纬度点返回两点之间的弧线上的经纬度数组,并且可以指定数组长度

    思路

    度与弧度转换
    首先,需要将经纬度从度数转换为弧度。JavaScript提供了Math对象的方法来完成这个转换。

    弧线距离计算
    我们将使用Haversine公式来计算两个经纬度点之间的弧线距离。该公式基于球面三角学和大圆距离的概念。

    弧长插值
    通过将总弧线距离等分成指定数量的段,我们可以得到每个插值点相对于起始点的弧长增量。

    插值点经纬度计算
    使用球面三角法,我们可以通过弧长插值计算每个插值点的经纬度坐标。这涉及到对三角函数的应用以及将计算结果转换回角度。

    示例代码

    // 根据两个点的经纬度返回两点之间的弧线点数组
    function calculateArcPoints(startLat, startLng, endLat, endLng, numPoints) {
      var points = [];
    
      // 将经纬度转换为弧度
      var startLatRad = degreesToRadians(startLat);
      var startLngRad = degreesToRadians(startLng);
      var endLatRad = degreesToRadians(endLat);
      var endLngRad = degreesToRadians(endLng);
    
      // 计算起点和终点之间的角距离
      var angleDistance = calculateAngleDistance(startLatRad, startLngRad, endLatRad, endLngRad);
    
      // 计算每个弧线点之间的角距离
      var angleDelta = angleDistance / (numPoints + 1);
    
      // 生成弧线上的点坐标
      for (var i = 1; i <= numPoints; i++) {
        var angle = angleDelta * i;
        var pointLat = Math.asin(Math.sin(startLatRad) * Math.cos(angle) +
                      Math.cos(startLatRad) * Math.sin(angle) * Math.cos(angleDistance));
        var pointLng = startLngRad + Math.atan2(Math.sin(angleDistance) * Math.sin(angle) * Math.cos(startLatRad),
                      Math.cos(angle) - Math.sin(startLatRad) * Math.sin(pointLat));
    
        // 将弧线点的经纬度转换为角度
        pointLat = radiansToDegrees(pointLat);
        pointLng = radiansToDegrees(pointLng);
    
        points.push([pointLat, pointLng]);
      }
    
      return points;
    }
    
    // 将角度转换为弧度
    function degreesToRadians(degrees) {
      return degrees * Math.PI / 180;
    }
    
    // 将弧度转换为角度
    function radiansToDegrees(radians) {
      return radians * 180 / Math.PI;
    }
    
    // 计算起点和终点之间的角距离
    function calculateAngleDistance(startLatRad, startLngRad, endLatRad, endLngRad) {
      var deltaLng = Math.abs(startLngRad - endLngRad);
      var centralAngle = Math.acos(Math.sin(startLatRad) * Math.sin(endLatRad) +
                              Math.cos(startLatRad) * Math.cos(endLatRad) * Math.cos(deltaLng));
      return centralAngle;
    }
    
    // 示例
    var startLat = 40.7128;
    var startLng = -74.0060;
    var endLat = 34.0522;
    var endLng = -118.2437;
    var numPoints = 5;
    
    var arcPoints = calculateArcPoints(startLat, startLng, endLat, endLng, numPoints);
    console.log(arcPoints);
    //[
    //	[45.42396836020254, -69.1404250001097],
    //	 [49.891622927662674, -63.41307617458586],
    //	[54.02117226630129, -56.56585836705854],
    //	[57.679453067946376, -48.30632029039604],
    //	[60.68670629574328, -38.37984383498003]
    //]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    在上述示例中,我们定义了一个名为calculateArcPoints的函数,该函数接受两个起点和终点的经纬度,以及要返回的弧线点数量。它使用Haversine公式计算起点和终点之间的角距离,并根据指定数量的弧线点生成每个点的经纬度。最后,它返回一个包含这些弧线点经纬度的数组。

    例如,在示例中,我们使用起点(纽约市)的经纬度(40.7128,-74.0060)和终点(洛杉矶)的经纬度(34.0522,-118.2437),并指定要生成5个弧线点。执行结果将打印到控制台上,显示了生成的弧线点的经纬度数组。

    结语

    通过本篇博客,我们将学会了如何使用JavaScript编写程序来计算两点经纬度之间的弧线点经纬度数组。无论是在地理信息系统中的路径规划还是其他需要考虑地球曲率的应用中,这个功能都非常实用。

    希望本篇博客能够帮助你理解和应用球面三角法,为你的项目提供有关两点之间弧线的相关数据。

  • 相关阅读:
    12.计算机网络---iptables防火墙管理工具
    LeetCode 1503. 所有蚂蚁掉下来前的最后一刻
    直播视频录制技巧,分享2个实用的方法
    SphereEx苗立尧:云原生架构下的Database Mesh研发实践
    51单片机基础篇系列-8个步骤入门51单片机
    二、C++ Builder XE关于intraweb开发_工程组的三个CPP
    C++日期类实现(联系类和对象)
    【Android 屏幕适配】屏幕适配基础概念 ④ ( 屏幕适配限定符 | 手机/平板电脑设备屏幕适配 )
    如何用Jmeter提取和引用Token
    自学ansible笔记
  • 原文地址:https://blog.csdn.net/m0_47901007/article/details/132670740