首页 文章

纬度/经度距离问题

提问于
浏览
0

我正在开发一种工具,可以从列表中找到与用户当前位置相比最近的纬度/经度位置 . 该列表将很长,它将在智能手机上运行,因此我希望尽可能简单快速地进行计算 . 从我读过的帖子中,计算两个纬度/经度位置之间相当准确的距离有点复杂,我担心速度 . 我的问题是,我可以使用类似下面的内容来获得最接近列表位置的合理结果并使用它吗?

$distance = sqrt((($firstLongitude-$secondLongitude)*($firstLongitude-$secondLongitude))+(($firstlLatitude-$secondLatitude)*($firstLatitude-$secondLatitude)));

我知道这个例子是在PHP中,但逻辑应该很明显 . 所以我的问题是,将使用上述逻辑从纬度/经度位置列表中确定最接近用户的位置给出正确的结果,或者是否存在我遗漏的潜在问题?

这个应用程序只适用于美国的地点,如果这有任何区别 .

注意:我也想知道我是否可以进一步简化这个并删除sqrt部分,因为我只是想看哪个更近,而不是它有多接近 .

2 回答

  • 1

    不,计算不会显示正确的结果 . 结果假设这些纬度/经度是正常点,但实际上它们是度数 . 因此,您还需要在计算中考虑这一点 .

    使用以下公式 . 与某些网络或UI活动相比,算术公式并不那么重

    $1 = lat1
     $2 = long1
     $3 = lat2
     $4 = long2
    
     case when 
     ($1 = $3 and $2 = $4) then 0 
     else 1609.344 * 60 * 1.1515 * (180 / pi()) * acos(sin($1 * pi() / 180) * sin($3 * pi() / 180) + cos($1 * pi() / 180) * cos($3 * pi() / 180) * cos(($2 - $4) * pi() / 180))
    
  • 4

    如果这些点彼此相距10000公里并且假设地球是球形的,则以下是准确的 . 如果您只想比较距离,请使用d2 . 距离是以km为单位的近似距离 .

    deg = pi/180;
    phi1 = lat1 * deg;
    phi2 = lat2 * deg;
    lam12 = (lon2 - lon1) * deg;
    
    d2 = ( cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam12) )^2
     + ( cos(phi2) * sin(lam12) )^2;
    
    a = 6371.009;  // kilometers
    distance = a * asin( sqrt( d2 ) );
    

    为了更准确,您需要将地球视为椭圆体;在http://geographiclib.sf.net/cgi-bin/Geod看到我的在线测地计算器,在http://arxiv.org/abs/1102.1215看到了这个记录 .

相关问题