我正在开发一种工具,可以从列表中找到与用户当前位置相比最近的纬度/经度位置。该列表将很长,它将在智能手机上运行,因此我希望尽可能简单快速地进行计算。从我读过的帖子中,计算两个纬度/经度位置之间相当准确的距离有点复杂,我担心速度。我的问题是,我可以使用类似下面的内容来获得最接近列表位置的合理结果并使用它吗?
$distance = sqrt((($firstLongitude-$secondLongitude)*($firstLongitude-$secondLongitude))+(($firstlLatitude-$secondLatitude)*($firstLatitude-$secondLatitude)));
我知道这个例子是在PHP中,但逻辑应该很明显。所以我的问题是,将使用上述逻辑从纬度/经度位置列表中确定最接近用户的位置给出正确的结果,或者是否存在我遗漏的潜在问题?
这个应用程序只适用于美国的地点,如果这有任何区别。
注意: 我也想知道我是否可以进一步简化这个并放弃sqrt部分,因为我只是想看哪个更近,而不是它有多接近。
答案 0 :(得分: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
答案 1 :(得分: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))