MySQL选择范围内的坐标
我在我的数据库中有100 000个地址(即记录)。
它们中的每一个都有自己的坐标(纬度和经度)。
现在,考虑到用户的地理位置(纬度和经度),我想在地图上仅显示5英里范围内的地址(使用Google maps v3 API)。
这意味着通常只需要在10万个地址中显示5或6个地址。
一种解决方案可以是检索所有记录并在Java中应用公式来计算每个地址的距离,并仅在它在范围内时显示它。
这将浪费处理能力,因为当我只需要在地图上显示5或6个记录时,我需要检索所有记录。
如何在数据库端(MySQL)解决此问题,以便仅返回5英里范围内的地址?
您可以使用所谓的Haversine公式 。
$sql = "SELECT *, ( 3959 * acos( cos( radians(" . $lat . ") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(" . $lng . ") ) + sin( radians(" . $lat . ") ) * sin( radians( lat ) ) ) ) AS distance FROM your_table HAVING distance < 5";
其中$lat
和$lng
是你的点的坐标,lat / lng是你的表列。 以上将列出5 nm范围内的位置。 将3959
替换为6371
以更改为公里。
此链接可能很有用: https : //developers.google.com/maps/articles/phpsqlsearch_v3
编辑:我没有看到你提到Java。 此示例在PHP中,但查询仍然是您需要的。
我认为MySQL的地理空间扩展可以为您解决这个问题: http : //dev.mysql.com/doc/refman/5.7/en/gis-introduction.html
否则你可以在lattitude上索引,然后查询WHERE lattitude> userLat-5miles和lattitude
Mr UpsideDown,我几周来一直在寻找这个问题的答案,并且有一个非常好的解决方案,令人惊讶的是我在其他地方找不到。 您必须创建一个存储过程,在将其应用于MySQL查询之前限制与Java的接近程度,并且查询将在几毫秒内返回结果,我在一个表中使用它,其中有超过900K的用户并且你可以使用这种技术在100ms以内通过接近度搜索(用PHP解释,但你需要的MySQL技巧仍然存在):
http://cssshowcase.co.uk/mysql-get-distance-by-latitude-and-longitude-coordinates/
没有其他解决方案像上面一样好,速度快,网上的其他解决方案使得查询需要15-20秒,这显然不是很好。
我的方法 – 我正在使用它 – 是像技术人员一样思考,我很满意+/- 5%
这个解决方案并不是为了控制火箭,船只等,只有在距离大约100公里的地方才能解决费米问题。
所以让我们开始一个实用的解决方案:
第一:对于许多问题,我们可以忽略地球不平坦(距离<~100km),
地球的周长大约是40000公里(由于某种原因或多或少)
一个圆正好是360度。
所以1 km是:360/40000度=> 0.00278度
然后只需在每公里0.003范围内选择纬度/经度,就像长> 42 – 0.003和长<42 + 0.003 - 对于纬度相同,其中42是纬度/长度作为中点。 数据库将使用索引。
问题:你得到一个正方形而不是一个圆(不是真正的距离)
如果您需要圆圈,请在获得结果后编写脚本。
我只是在2公里处展示官方卫生间,所以正方形还可以,准确性也是如此。 原因是,有街道和房屋,所以人们不能直接走路……
编辑:技术/数学解释:
对于非常小的三角形(一个角度<< 5度),您可以忽略三角学的使用。 所以罪(5度)〜= 5/180 * PI