首页 > 编程语言 >使用JavaScript计算两点经纬度之间的弧线点经纬度数组

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

时间:2023-09-06 19:02:58浏览次数:39  
标签:经纬度 弧线 JavaScript 距离 插值 计算 var

前言

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

通过本篇博客,我们将使用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]
//]

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

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

结语

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

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

标签:经纬度,弧线,JavaScript,距离,插值,计算,var
From: https://blog.51cto.com/u_15718546/7389432

相关文章

  • JavaScript--查找当前节点的父节点
    consttreeData=(item)=>{if(item.parent&&item.parent.length>0){let_parent=data.taskData.filter((data)=>data.id==item.parent);if(_parent&&_parent.length>0){if(da......
  • 无涯教程-JavaScript - TIMEVALUE函数
    描述TIMEVALUE函数返回由文本字符串表示的时间的十进制数。十进制数字是一个介于0(零)到0.99988426之间的值,代表从0:00:00(12:00:00AM)到23:59:59(PM11:59:59)的时间。语法TIMEVALUE(time_text)争论Argument描述Required/OptionalTime_textAtextstringthatre......
  • 无涯教程-JavaScript - SECOND函数
    描述SECOND函数返回时间值的秒数。第二个数字以0(零)到59之间的整数形式给出。语法SECOND(serial_number)争论Argument描述Required/OptionalSerial_number您想找到包含秒数的时间。时间可以输入为-引号内的文本字符串(如"6:45PM")十进制数(如0.78125,代表......
  • .NET 序列化生成 JavaScriptSerializer Poc
    dot.NET安全矩阵星球群有位师傅问起如何才能生成和ysoserial一样的JavaScriptSerializer序列化poc,同Json.NET一样序列化使用了ObjectDataProvider类,ObjectInstance属性绑定实例化的Process对象,这里没有使用MethodParameters属性传递参数,而是使用ProcessStartInfo类FileName和Argum......
  • JavaScript Date UTC & GMT All In One
    JavaScriptDateUTC&GMTAllInOnejs时期时区转换UTC&GMTCoordinatedUniversalTime/协调世界时UTC是最主要的世界时间标准,其以原子时的秒长为基础,在时刻上尽量接近于格林威治标准时间。UTC实际上与GMT基本相同.https://zh.wikipedia.org/zh-hans/协调世......
  • 无涯教程-JavaScript - MONTH函数
    描述MONTH函数返回由序列号表示的日期的月份。月份以整数形式给出,范围从1(一月)到12(十二月)。语法MONTH(serial_number)争论Argument描述Required/OptionalSerial_number您要查找的月份的日期。应该使用DATE函数或其他公式或函数的输出输入日期。如果将日期作为......
  • 无涯教程-JavaScript - ISOWEEKNUM函数
    描述ISOWEEKNUM函数返回给定日期的年份的ISO周编号。语法ISOWEEKNUM(date)争论Argument描述Required/OptionalDateDateisthedate-timecodeusedbyExcelfordateandtimecalculation.RequiredNotesMicrosoftExcel将日期存储为连续数字,因此可以在计算......
  • [Javascript] Write Observable
    functionObservable(forEach){this._forEach=forEach;}Observable.prototype={forEach:function(onNext,onError,onCompleted){if(typeofonNext==="function"){returnthis._forEach({onNext,onError:onEr......
  • 无涯教程-JavaScript - DAYS360函数
    描述DAYS360函数返回基于360天的年份(十二个月为30天)的两个日期之间的天数,该天数用于会计计算。语法DAYS360(start_date,end_date,[method])争论Argument描述Required/OptionalStart_dateThetwodatesbetweenwhichyouwanttoknowthenumberofdays.Requir......
  • 无涯教程-JavaScript - DAY函数
    描述DAY函数返回日期的日期,由序列号表示。日期以1到31之间的整数形式给出。语法DAY(serialnumber)争论Argument描述Required/Optionalserialnumber您要查找的日期。应该使用DATE函数或其他公式或函数的输出输入日期。如,在2008年5月的第23天使用DATE(2008,5,23......