我有一个SQL数据库,其中存储来自iPhone应用程序的经度和纬度。我需要查询从一个给定位置到另一个最远位置的所有记录。
例如,我有经度x和纬度y,我想要所有的记录,首先是经度与x最接近,纬度与y最接近的记录。我需要按从近到远的顺序逐条查看所有记录。位置越远,经度和纬度的值将比x和y的值大。
我希望你明白这一点,我正在等待答案。
发布于 2010-07-16 22:56:51
纬度和经度的距离不是简单的计算,而是需要球面三角的计算。
acos(cos(lat1)*cos(lon1)*cos(lat2)*cos(lon2) +
cos(lat1)*sin(lon1)*cos(lat2)*sin(lon2) +
sin(lat1)*sin(lat2)) * R(adius of the earth)所以这个查询
select locID, locName, locDesc, lat, lon, locDiffMeters
from (select locID, locName, locDesc, lat, lon,
acos(cos($lat)*cos($lon)*cos(lat)*cos(lon) +
cos($lat)*sin($lon)*cos(lat)*sin(lon) +
sin($lat)*sin(lat) ) * 6,371,000 -- earths radius in meters
as locDiffMeters
from locationTable
where locID <> $ID
) a
order by locDiffMeters 可能是正确的答案,假设你有一个数学库的能力。
发布于 2010-07-16 22:38:31
类似于Fosco,但使用的是毕达哥拉斯定理:
select locID, locName, locDesc, lat, lon, locDiff from
(select locID, locName, locDesc, lat, lon,
sqrt((lat - $LAT)*(lat - $LAT) + (lon - $LON)*(lon - $LON)) as locDiff
from locationTable
where locID <> $ID) a
order by locDiff对于非常大的距离(或远离赤道的位置),理想情况下应该使用测地线。
发布于 2010-07-16 21:55:42
假设您已经查询了起始位置经度和位置ID...我使用$LAT、$LON和$ID作为占位符:
select locID, locName, locDesc, lat, lon, locDiff
from (
select locID, locName, locDesc, lat, lon, ABS(lat - $LAT) + ABS(lon - $LON) as locDiff
from locationTable
where locID <> $ID
) a
order by locDiff希望这能帮上忙。可能不是最优化的方法,但它应该很接近。
https://stackoverflow.com/questions/3265394
复制相似问题