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

时间:2010-07-16 13:40:12

标签: iphone sql gps

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

例如,我有经度x和纬度y。我希望所有的记录首先经度最接近x,其纬度最接近y。我需要从最近到最远的链条中逐一记录所有记录。位置越远,经度和纬度的值就越大于x和y。

我希望你明白了,我在等待答案。

5 个答案:

答案 0 :(得分:2)

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

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    

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

答案 1 :(得分:1)

与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

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

答案 2 :(得分:0)

假设您已查询起始位置lat / lon和位置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

希望这有助于...可能不是最优化的方法,但它应该非常接近。

答案 3 :(得分:0)

如果你不需要处理很远的距离(参见Adam的回答),你可以考虑使用PostgreSQL的geometric types和相关的functions

答案 4 :(得分:0)

如果您使用的是Postgresql,请添加PostGIS扩展程序并查看ST_Distance_Sphere

  

ST_Distance_Sphere - 返回两个lon / lat几何之间的最小距离(以米为单位)。使用球形地球,半径6370986米。比ST_Distance_Spheroid快,但不太准确。 1.5之前的PostGIS版本仅针对积分实施。

SELECT round(CAST(ST_Distance_Sphere(ST_Centroid(the_geom), ST_GeomFromText('POINT(-118 38)',4326)) As numeric),2) As dist_meter ...