php算球面距离,球面两点之间的距离计算

球面两点之间的距离计算

在便捷的交通中,我们的出行很时候都需要依赖于导航系统,对于短距离的移动,我们可以把地面当成一个平面进行简单的计算两点之间距离。但是,如果我们需要跨国、跨洲进行远距离的出行时候,平面计算已经不能满足我们生活的需要,因为地球是一个球体,例如我们需要去到南美洲,我们选择从西方向前行可以到达,从东方向也可以到达,但是我们到达目的地的最短距离只有一条,这个时候我们就该考虑一下球面两点的距离计算了。这个时候就要从二维计算切换到三位空间的计算

我们先看一下百度百科对“坐标系统”和“球面三角”的描述

坐标系统,是描述物质存在的空间位置(坐标)的参照系,通过定义特定基准及其参数形式来实现。坐标是描述位置的一组数值,按坐标的维度一般分为一维坐标(公路里程碑)和二维坐标(笛卡尔平面直角坐标、高斯平面直角坐标)、三维坐标(大地坐标、空间直角坐标)。为了描述或确定位置,必须建立坐标系统,坐标只有存在于某个坐标系统才有实际的意义与具体的位置。

地球是一个球体,球面上的位置,是以经纬度来表示,它称为“球面坐标系统”或“地理坐标系统”。在球面上计算角度距离十分麻烦,而且地图是印刷在平面纸张上,要将球面上的物体画到纸上,就必须展平,这种将球面转化为平面的过程,称为“投影”。

在进行计算时候,我们有两种计算方式

1、Haversine公式:采用了正弦函数

2、distance公式:采用余弦函数计算

两种计算方式的对比:

distance公式计算两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出0.999…的结果, 会导致较大的舍入误差。Haversine公式采用了正弦函数,即使距离很小,也能保持足够的有效数字。 采用计算机来计算时,两个公式的区别不大。 不过还是推荐采用Haversine公式。

haversin(d/R) = haversin(φ2 - φ1) + cos(φ1) cos(φ2) haversin(⊿λ)

其中:

haversin(θ) = sin(θ/2)^2 = (1- cos(θ))/2

R为地球半径,可取平均值 6371.137km

φ1, φ2 表示两点的纬度;

Δλ 表示两点经度的差值。

分享一段PHP的计算实现:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MATLAB中,可以使用haversine公式来计算两个经纬度坐标之间球面距离。具体步骤如下: 1. 首先,将经纬度坐标转换为弧度制。这可以通过将经纬度值除以180再乘以π来实现。 2. 然后,使用haversine公式来计算球面距离。haversine公式如下: d = 2 * R * asin(sqrt(sin((lat2-lat1)/2)^2 + cos(lat1) * cos(lat2) * sin((lon2-lon1)/2)^2)) 其中,d是距离,R是地球的半径(一般情况下为6371千米),lat1和lon1是第一个点的纬度和经度,lat2和lon2是第二个点的纬度和经度。 3. 最后,根据需要可以将距离为其他单位。 下面是一个MATLAB代码示例,可以根据上述步骤计算两个经纬度坐标之间球面距离: ```matlab function distance = calculateDistance(lat1, lon1, lat2, lon2) R = 6371; % 地球半径,单位:千米 % 将经纬度转换为弧度制 lat1 = deg2rad(lat1); lon1 = deg2rad(lon1); lat2 = deg2rad(lat2); lon2 = deg2rad(lon2); % 使用haversine公式计算球面距离 dlat = lat2 - lat1; dlon = lon2 - lon1; a = sin(dlat/2)^2 + cos(lat1) * cos(lat2) * sin(dlon/2)^2; c = 2 * atan2(sqrt(a), sqrt(1-a)); distance = R * c; end ``` 使用这个函数,可以通过传入经纬度坐标调用该函数来计算两点之间球面距离。例如: ```matlab lat1 = 31.21563; lon1 = 121.50891; lat2 = 39.90420; lon2 = 116.40740; distance = calculateDistance(lat1, lon1, lat2, lon2); disp(distance); % 输出球面距离,单位:千米 ``` 运行以上代码,将会输出上海和北京之间球面距离约为1030千米。 ### 回答2: 在Matlab中,计算两点之间球面距离可以利用Haversine公式。该公式基于经纬度坐标系,以一个球体来近似地描述地球的形状,计算两点之间的弧长。以下是一个实现该功能的简单示例代码: ```matlab function distance = computeDistance(lat1, lon1, lat2, lon2) % 地球的平均半径(单位:千米) radius = 6371; % 将角度转换为弧度 lat1 = deg2rad(lat1); lon1 = deg2rad(lon1); lat2 = deg2rad(lat2); lon2 = deg2rad(lon2); % 计算两点间的差值 dlat = lat2 - lat1; dlon = lon2 - lon1; % 使用Haversine公式计算球面距离 a = sin(dlat/2)^2 + cos(lat1) * cos(lat2) * sin(dlon/2)^2; c = 2 * atan2(sqrt(a), sqrt(1-a)); distance = radius * c; end ``` 在上述代码中,`lat1`和`lon1`表示第一个坐标点的纬度和经度,`lat2`和`lon2`表示第二个坐标点的纬度和经度。最终,函数返回两点之间球面距离。注意,这里使用的是地球的平均半径,该值为6371公里。 你可以调用这个函数并传入相应的经纬度数据,以计算得到两点之间球面距离。 ### 回答3: 在Matlab中,我们可以使用Haversine公式来计算两点之间球面距离,该公式适用于两点之间的直线距离小于200km的情况。首先,我们需要获取两个点的经纬度坐标。 假设点A的经纬度坐标为(A_lat, A_lon),点B的经纬度坐标为(B_lat, B_lon),则可以使用以下代码计算两点之间球面距离: ```matlab function distance = calculateDistance(A_lat, A_lon, B_lat, B_lon) R = 6371; % 地球半径(单位:km) % 将角度转换为弧度 lat1 = deg2rad(A_lat); lon1 = deg2rad(A_lon); lat2 = deg2rad(B_lat); lon2 = deg2rad(B_lon); % 使用Haversine公式计算球面距离 delta_lat = lat2 - lat1; delta_lon = lon2 - lon1; a = sin(delta_lat/2)^2 + cos(lat1) * cos(lat2) * sin(delta_lon/2)^2; c = 2 * atan2(sqrt(a), sqrt(1-a)); distance = R * c; end ``` 使用上述函数即可计算两个经纬度坐标点之间球面距离。函数参数A_lat、A_lon分别表示点A的纬度和经度,B_lat、B_lon表示点B的纬度和经度。最后,返回的距离单位为千米(km)。 例如,我们可以调用该函数进行实际计算: ```matlab A_lat = 39.9042; A_lon = 116.4074; B_lat = 31.2304; B_lon = 121.4737; distance = calculateDistance(A_lat, A_lon, B_lat, B_lon); disp(distance); % 输出两个点之间球面距离(单位:km) ``` 通过以上示例,我们可以用Matlab计算任意两点间的球面距离。注意,如果两点之间的直线距离大于200km,我们应该使用其他更精确的球面距离计算方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值