首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中查找和排序经度和纬度

在SQL中查找和排序经度和纬度
EN

Stack Overflow用户
提问于 2010-07-16 21:40:12
回答 5查看 486关注 0票数 1

我有一个SQL数据库,其中存储来自iPhone应用程序的经度和纬度。我需要查询从一个给定位置到另一个最远位置的所有记录。

例如,我有经度x和纬度y,我想要所有的记录,首先是经度与x最接近,纬度与y最接近的记录。我需要按从近到远的顺序逐条查看所有记录。位置越远,经度和纬度的值将比x和y的值大。

我希望你明白这一点,我正在等待答案。

EN

回答 5

Stack Overflow用户

发布于 2010-07-16 22:56:51

纬度和经度的距离不是简单的计算,而是需要球面三角的计算。

代码语言:javascript
复制
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)

所以这个查询

代码语言:javascript
复制
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    

可能是正确的答案,假设你有一个数学库的能力。

票数 2
EN

Stack Overflow用户

发布于 2010-07-16 22:38:31

类似于Fosco,但使用的是毕达哥拉斯定理:

代码语言:javascript
复制
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

对于非常大的距离(或远离赤道的位置),理想情况下应该使用测地线。

票数 1
EN

Stack Overflow用户

发布于 2010-07-16 21:55:42

假设您已经查询了起始位置经度和位置ID...我使用$LAT、$LON和$ID作为占位符:

代码语言:javascript
复制
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

希望这能帮上忙。可能不是最优化的方法,但它应该很接近。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3265394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档