计算两点经纬度的距离

mysql 函数

DROP FUNCTION IF EXISTS func_calcDistance;
CREATE FUNCTION func_calcDistance(
    origLng DECIMAL(20,6),
    origLat DECIMAL(20,6),
    longitude DECIMAL(20,6),
    latitude DECIMAL(20,6)
)
RETURNS DOUBLE
BEGIN
    DECLARE result DOUBLE DEFAULT 0;
    SET result = round(6378.138*2*asin(
    sqrt(pow(sin((origLat*pi()/180-latitude*pi()/180)/2),2)+
    cos(origLat*pi()/180)*cos(latitude*pi()/180)*pow(sin((origLng*pi()/180-longitude*pi()/180)/2),2)))*1000);
    RETURN result;
END;

IN RUBY MIGRATION

  ActiveRecord::Base.connection.execute <<-SQL
      DROP FUNCTION IF EXISTS func_calcDistance;
        CREATE FUNCTION func_calcDistance(
            origLng DECIMAL(20,6),
            origLat DECIMAL(20,6),
            longitude DECIMAL(20,6),
            latitude DECIMAL(20,6)
        )
        RETURNS DOUBLE
        BEGIN
            DECLARE result DOUBLE DEFAULT 0;
            SET result = round(6378.138*2*asin(
            sqrt(pow(sin((origLat*pi()/180-latitude*pi()/180)/2),2)+cos(origLat*pi()/180)*cos(latitude*pi()/180)*pow(sin((origLng*pi()/180-longitude*pi()/180)/2),2)))*1000);
            RETURN result;
        END
  SQL

  LastestDeviceLocation.select("func_calcDistance() as distance").order("distance")
### 计算两点经纬度间的距离和方位角 对于计算两个地理坐标点之间的距离和方位角,通常采用的是基于地球椭球体模型的方法。Haversine公式或Vincenty公式是两种常用的选择[^1]。 #### Haversine公式的实现 Haversine公式用于估算两点之间的大圆距离,适用于大多数应用场景: ```python from math import radians, sin, cos, sqrt, atan2 def haversine(lat1, lon1, lat2, lon2): R = 6371e3 # 地球半径,单位米 phi1 = radians(lat1) phi2 = radians(lat2) delta_phi = radians(lat2 - lat1) delta_lambda = radians(lon2 - lon1) a = (sin(delta_phi / 2)**2 + cos(phi1) * cos(phi2) * sin(delta_lambda / 2)**2) c = 2 * atan2(sqrt(a), sqrt(1-a)) d = R * c # 距离,单位为米 return d ``` 此代码实现了Haversine公式来计算给定点A(`lat1`, `lon1`) 和B (`lat2`,`lon2` ) 的大圆距离d(以米为单位)。该方法假设地球是一个完美的球体,因此其准确性取决于这一前提条件。 #### 方位角的计算 为了获得从起点指向终点的方向——即初始方位角θ,可以使用下面的表达式: \[ \theta = {\rm atan2}\left(\sin\Delta\lambda*\cos\phi_2,\cos\phi_1*\sin\phi_2-\sin\phi_1*\cos\phi_2*\cos\Delta\lambda\right)\] 其中φ表示纬度,λ代表经度;Δλ 是两者之差。atan2返回的角度范围是从−π 到 π弧度(-180°至+180°),正东方向对应于零度,顺时针增加直到完成一圈回到原点[^3]。 下面是Python中的具体实现方式: ```python import math def calculate_bearing(lat1, lon1, lat2, lon2): phi1 = math.radians(lat1) phi2 = math.radians(lat2) delta_lambda = math.radians(lon2 - lon1) y = math.sin(delta_lambda) * math.cos(phi2) x = math.cos(phi1)*math.sin(phi2) - math.sin(phi1)*math.cos(phi2)*math.cos(delta_lambda) theta = math.atan2(y, x) bearing = math.degrees(theta) compass_bearing = (bearing + 360) % 360 return compass_bearing ``` 这段代码定义了一个名为calculate_bearing() 函数,它接受四个参数:起始位置的纬度和经度以及目标位置对应的这两个值,并返回相对于真北方向的方位角compass_bearing[]。 需要注意的是,在高纬度区域应用简单的平面几何近似可能会引入显著误差,特别是在超过一定阈值的情况下,比如在极地附近或者跨越较大跨度时应避免这样做[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值