我有经纬度,我想从数据库中提取记录,它有最近的经纬度,如果这个距离比指定的长,就不检索它。
表结构:
id
latitude
longitude
place name
city
country
state
zip
sealevel
我有经纬度,我想从数据库中提取记录,它有最近的经纬度,如果这个距离比指定的长,就不检索它。
表结构:
id
latitude
longitude
place name
city
country
state
zip
sealevel
当前回答
这个问题一点也不难,但是如果你需要优化它,它就会变得更加复杂。
我的意思是,你的数据库中有100个地点还是1亿个?这有很大的不同。
如果位置的数量很小,只需执行->,就可以将它们从SQL中取出并放入代码中
Select * from Location
一旦你把它们转换成代码,用哈弗辛公式计算出每一个纬度/长度与原始值之间的距离,然后排序。
其他回答
以防你像我一样懒,这里有一个解决方案,由这个和其他关于SO的答案合并而成。
set @orig_lat=37.46;
set @orig_long=-122.25;
set @bounding_distance=1;
SELECT
*
,((ACOS(SIN(@orig_lat * PI() / 180) * SIN(`lat` * PI() / 180) + COS(@orig_lat * PI() / 180) * COS(`lat` * PI() / 180) * COS((@orig_long - `long`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance`
FROM `cities`
WHERE
(
`lat` BETWEEN (@orig_lat - @bounding_distance) AND (@orig_lat + @bounding_distance)
AND `long` BETWEEN (@orig_long - @bounding_distance) AND (@orig_long + @bounding_distance)
)
ORDER BY `distance` ASC
limit 25;
这个问题一点也不难,但是如果你需要优化它,它就会变得更加复杂。
我的意思是,你的数据库中有100个地点还是1亿个?这有很大的不同。
如果位置的数量很小,只需执行->,就可以将它们从SQL中取出并放入代码中
Select * from Location
一旦你把它们转换成代码,用哈弗辛公式计算出每一个纬度/长度与原始值之间的距离,然后排序。
你要找的是哈弗辛公式。看这里。
还有其他的,但这是最常被引用的。
如果您正在寻找更健壮的东西,则可能需要考虑数据库的GIS功能。它们能够做一些很酷的事情,比如告诉你一个点(城市)是否出现在给定的多边形(区域、国家、大陆)中。
简单的一个;)
SELECT * FROM `WAYPOINTS` W ORDER BY
ABS(ABS(W.`LATITUDE`-53.63) +
ABS(W.`LONGITUDE`-9.9)) ASC LIMIT 30;
把坐标换成你需要的坐标。这些值必须存储为double类型。这是一个工作中的MySQL 5。x的例子。
干杯
听起来就像你想在距离上做一个最近邻居搜索。据我所知,SQL不支持这样的任何东西,您需要使用另一种数据结构,如r树或kd树。