当前位置: 首页 > 面试题库 >

mysql查询中的距离计算

钱青青
2023-03-14
问题内容

我必须查询成千上万个条目的数据库,并按距指定点的距离对其进行排序

问题是每个条目都有一个纬度和经度,我需要检索每个条目以计算其距离。对于大型数据库,我不想检索每一行,这可能需要一些时间。

有什么办法可以将其构建到mysql查询中,以便我只需要检索最近的15个条目。

例如

`SELECT events.id, caclDistance($latlng, events.location) AS distance FROM events ORDER BY distance LIMIT 0,15`

    function caclDistance($old, $new){
       //Calculates the distance between $old and $new
    }

问题答案:

选项1:通过切换到支持GeoIP的数据库对数据库进行计算。

选项2:使用如下存储过程对数据库进行计算:

CREATE FUNCTION calcDistance (latA double, lonA double, latB double, LonB double)
    RETURNS double DETERMINISTIC
BEGIN
    SET @RlatA = radians(latA);
    SET @RlonA = radians(lonA);
    SET @RlatB = radians(latB);
    SET @RlonB = radians(LonB);
    SET @deltaLat = @RlatA - @RlatB;
    SET @deltaLon = @RlonA - @RlonB;
    SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) +
    COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2);
    RETURN 2 * ASIN(SQRT(@d)) * 6371.01;
END//

如果您的数据库中有一个关于纬度和经度的索引,则可以通过计算PHP中的初始边界框($ minLat,$ maxLat,$ minLong和$
maxLong)并限制来减少需要计算的数量。根据该行($ minLat和$ maxLat之间的纬度以及$ minLong和$
maxLong之间的经度)将这些行添加到您的条目子集。然后,MySQL只需要为该行子集执行距离计算。

如果您只是使用存储过程来计算距离,则SQL仍然必须遍历数据库中的每个记录,并计算数据库中每个记录的距离,然后才能决定是返回该行还是丢弃该行。

由于计算的执行速度相对较慢,因此最好减少需要计算的行的集合,从而消除明显落在所需距离之外的行,因此我们仅对以下情况执行昂贵的计算:行数较少。

如果您认为自己所做的基本上是在地图上绘制一个以初始点为中心并具有一定距离半径的圆;那么该公式仅会确定哪些行属于该圆…但是它仍然必须检查每一行。

使用边界框就像先在地图上绘制一个正方形,然后将左,右,上和下边缘与我们的中心点保持适当的距离。然后,我们将在该框中绘制圆,使圆上的最北,最东,最南和最西点与框的边界接触。一些行将落在该框的外面,因此SQL甚至不必费心尝试计算这些行的距离。它仅计算落入边界框内的行的距离,以查看它们是否也落入圆内。

在您的PHP中(假设您正在使用$变量名运行PHP),我们可以使用一个非常简单的计算方法,根据我们的距离计算出最小和最大纬度和经度,然后在SQL的WHERE子句中设置这些值声明。这实际上是我们的盒子,落在盒子外面的任何东西都会自动丢弃,而无需实际计算其距离。

在Movable Type网站上对此有很好的解释(带有PHP代码),对于打算用PHP进行任何GeoPositioning工作的任何人来说,这都是必不可少的阅读材料。

编辑 calcDistance存储过程中的值6371.01是乘数,以公里为单位返回结果。如果您想得出英里,海里,米等的数值,请使用适当的替代乘数



 类似资料:
  • 问题内容: 选项 询问 我有一个包含4列的数据库表: 唯一身份 城市名 纬度(纬度) 经度(lng) 我在顶部使用查询返回距指定坐标距离指定英里数内的位置。它似乎可行,但我不确定它的准确性如何。我很想知道查询是否很好,或者您是否有更好的解决方案。 问题答案: 看起来像是正确的大圆距查询。 您对WRT的准确性有何看法?

  • 距离查询 距离查询,是指查询指定几何对象一定距离范围内的地物。对于点几何对象,则查询以该点为圆心,以距离为半径画圆,落在该圆形范围内的地物;对于线和面几何对象,则查询距离对象边界一定范围内的地物。 以 World 数据服务为例。使用接口 ol.supermap.QueryService 在图层 “Capitals@World.1” 中查找距离指定点为10度(地图坐标单位)的矢量要素。 // 添加查

  • 我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可以完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但绝不适用于更快的速度。 我尝试过使用Google的位置API:距离到或距离之间根本不是一个选项。它可以给出与IN REAL截然不同的结果。在真实的汽车中,可以通过非常短的地方并

  • 我的申请中有以下实体: 地址 在实体中: 在< code >广告实体中: 完整实体: 我想找到所有的家庭广告实例,其成员的地址在所需地址的20KM以内。 以下是我得出的结论: 但是,似乎我错误地使用了数字路径类,因为我不断得到一个NPE。任何人都可以帮我正确查询吗? 编辑:我已经改变了我的家庭广告实体如下: 我现在得到以下异常: 第64行是这样的: 任何线索现在出了什么问题? edit2:我忘了提

  • 我试图使用Scala类计算两点之间的距离。但它给出了一个错误说 类型不匹配;发现:其他。需要类型(具有基础类型点):?{def x:?}请注意,隐式转换不适用,因为它们是不明确的:在[A](x:A)类型的对象Predef中确保[A]的方法any2Ensuring和在[A](x:A)“ArroAssoc[A]类型的对象Predef中的方法Ani2ArrowasSoc都是可能的其他转换函数。输入到?{

  • 问题内容: 我有一个不支持三角函数的SQLite数据库。我想按距离对桌中的一组经纬度进行排序,而不是第二对经纬度对。我熟悉用于按距离对经纬度对进行排序的标准Haversine距离公式。 在这种情况下,我并不特别在意精度,因为我的点之间相隔很远,所以我不介意通过将曲线视为直线来舍入距离。 我的问题是,这种查询是否有公认的公式?记住没有触发功能! 问题答案: 如果您的点彼此之间的距离在合理范围内(即,