我有一个SQL数据库,我从iPhone应用程序存储经度和纬度。我需要查询从给定位置开始到最远的其他位置的所有记录。
例如,我有经度x和纬度y。我希望所有的记录首先经度最接近x,其纬度最接近y。我需要从最近到最远的链条中逐一记录所有记录。位置越远,经度和纬度的值就越大于x和y。
我希望你明白了,我在等待答案。
答案 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 ...