使用SQL查询根据地理编码之间的距离选择位置

时间:2014-02-19 16:18:01

标签: php mysql sql google-maps

我有一个包含酒店信息的SQL数据库,其中一些是Googles地理编码器生成的地理编码lat / lng。

我希望能够选择(直接使用SQL查询)某个范围内的所有酒店。这个范围永远不会超过50公里,所以我不需要像这里提出的很多答案一样详细(考虑到地球曲率以及事实上它不是一个完美的球体在距离搜索时不是问题)。

我认为一个简单的Pythagorian公式就足够了,但我不知道纬度和经度数字代表什么(因此如何转换为米),并且我已经阅读了几个“简单”的解决方案来解决我的问题问题与他们的公式和计算经络线两侧的两个位置之间的距离(因为我在伦敦,这对我来说将是一个大问题!)

任何帮助都会很棒,谢谢你!

----有用的信息-----

我的数据库按以下格式存储地理编码数据:

geo_lat: 51.5033630,
geo_lon; -0.1276250

2 个答案:

答案 0 :(得分:3)

这是一个将您的距离变为千米的选择子句。从那里你可以使用where子句将其过滤到不到25公里或任何你想要的。如果你想要它在里程,只需要取消* 1.609344转换。


$latitude = [current_latitude];
$longitude = [current_longitude];

SELECT
    ((((acos(sin((".$latitude."*pi()/180)) * sin((`geo_lat`*pi()/180))+cos((".$latitude."*pi()/180)) * cos((`geo_lat`*pi()/180)) * cos(((".$longitude."- `geo_lon`)* pi()/180))))*180/pi())*60*1.1515) * 1.609344) as distance 
FROM
    [table_name]
WHERE distance 

答案 1 :(得分:0)

您可以使用简单的地图投影和直线距离,例如equirectangular投影。在本网站的公式中,您还可以使用没有平方根的简化公式:http://www.movable-type.co.uk/scripts/latlong.html。当然,您可以使用边界框来过滤查询:How to calculate the bounding box for a given lat/lng location?https://gis.stackexchange.com/questions/19760/how-do-i-calculate-the-bounding-box-for-given-a-distance-and-latitude-longitude