当前位置: 首页 > 知识库问答 >
问题:

MySQL选择范围内的坐标

王轶
2023-03-14

我的数据库中有100000个地址(即记录)。

它们中的每一个都有自己的坐标(纬度和经度)。

现在,考虑到用户的地理位置(纬度和经度),我只想在地图上显示5英里范围内的地址(使用Google maps v3 API)。

这意味着通常在100000个地址中只需显示5或6个地址。

一种解决方案可能是检索所有记录,并在Java中应用一个公式来计算每个地址的距离,并且仅当它在范围内时才显示它。

这将浪费处理能力,因为我需要检索所有记录,而我只需要在地图上显示其中的5或6条记录。

如何在数据库端(MySQL)解决这个问题,以便只返回5英里范围内的地址?

共有3个答案

步嘉德
2023-03-14
DELIMITER $
DROP FUNCTION IF EXISTS calc_distance$

CREATE FUNCTION calc_distance(
    user_lat FLOAT(9,6),
    user_lng FLOAT(9,6),
    field_lat FLOAT(9,6),
    field_lng FLOAT(9,6)
) RETURNS INTEGER

BEGIN
    DECLARE ulat FLOAT;
    DECLARE ulng FLOAT;
    DECLARE flat FLOAT;
    DECLARE flng FLOAT;

    SET ulat = RADIANS(user_lat);
    SET ulng = RADIANS(user_lng);
    SET flat = RADIANS(field_lat);
    SET flng = RADIANS(field_lng);
    RETURN
        6371393
        * ACOS(
            COS(ulat) * COS(flat) * COS(flng - ulng)
            + SIN(ulat) * SIN(flat)
        );
END$
DELIMITER ;

用法

if (($radius = $search->getRadiusMeters())) {
    $query['where'][] = "calc_distance($lat, $lng, addr.lat, addr.lng) < $radius";
}
姚善
2023-03-14

我的方法——我正在使用它——是像技术人员一样思考,我很满意/-5%

这个解决方案并不是为了控制火箭、船只或类似的东西,而且只有在100公里以下的距离,它只是一个类似费米问题的解决方案

因此,让我们从务实的解决方案开始:

第一:对于许多问题,我们可以忽略地球不是平的(距离

地球的周长大约为40000公里(由于某种原因,大致相当于40000公里)

一个圆正好有360度。

因此,1 km为:360/40000度=

然后只需选择每公里0.003以内的纬度/长度,它将类似于

问题是:结果得到的是一个正方形,而不是一个圆(不是实际距离)

如果您需要圆圈,请在获得结果后编写脚本。

我只显示2公里内的官方厕所,所以正方形是可以的,而且准确性也很好。原因是,有街道和房子,所以人们不能直接走路...

编辑:技术/数学解释:

对于非常小的三角形(一个角

郁承运
2023-03-14

你可以使用哈弗森公式。

$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编写的,但查询仍然是您所需要的。

 类似资料:
  • 问题内容: 是否可以为查询的IN部分定义一个范围,像这样 代替 问题答案: 您不能,但可以使用 请注意,这是包含性内容,并且将包含ID为10和15的项。 如果不想包含,则必须退回到使用and 运算符。

  • 范围选择器(rangeSelector)是图表中用于选择数据范围的工具,它提供了预配置的时间选择按钮,包括 1天,1周,1个月等,同时也提供时间输入框用于手动指定时间范围。 时间选择按钮 通过 rangeSelector.buttons 可以指定时间选择按钮,默认是 buttons: [{ type: 'month', count: 1, text: '1m' }, {

  • 问题内容: 如何选择以“ A”开头的名称直到以“ D”开头的名称的行?并按字母顺序对它们进行排序?就像和的组合? 样品表: 样本输出: 名称以“ Cr”开头,直到名称以“ D”开头 样本输出: 问题答案: 从最多选择名称,但不包括: 由于这是一个简单的比较,因此如果该字段有一个索引,则可以使用索引。

  • 问题内容: 注意:尽管我将邮政编码数据库与荷兰邮政编码一起使用,但是此问题与国家/地区无关。 我有一个数据库,其中包含荷兰的每个邮政编码及其x和y坐标(纬度/经度)。 例如,我的邮政编码:具有以下坐标: 现在,我想使用from查找其他所有邮政编码。 例如: 问题在于地球并不完全是圆形的。我发现很多关于计算的教程,但这不是我所需要的。 有人有什么主意吗? 更新 感谢Captaintokyo,我发现了

  • 在本章中,我们将介绍文档中的选择以及在表单字段(如 <input>)中的选择。 JavaScript 可以获取现有选择,选择/取消全部或部分选择,从文档中删除所选部分,将其包装到一个标签(tag)中,等。 你可以在本文最后的“总结”部分中找到使用方法。但是,如果你阅读整篇内容,将会有更多收获。底层的(underlying)Range 和 Selection 对象很容易掌握,因此,你不需要任何诀窍便

  • 问题内容: 我有一个带有id列和成千上万行的表。我获得了1000个ID的列表,用于对照其他表格数据进行检查。 ID没有按顺序存储。 ID列表也不按顺序排列。 当我使用这些ID选择表格数据时,仅返回990个结果,这意味着自该列表产生以来,其中10个结果已更改/被删除。如何从该数据范围中找到10个缺失值?这是我目前正在做的事情: 返回990个结果。我可以做类似的事情吗? 编辑:抱歉造成混乱。我应该提到