在 MySQL 数据库中搜索服务于输入 lat/long 的值

Searching a MySQL database for values serving the input lat/long

这个问题不同于常规的mysql lat/long,基于半径的数据获取

我想搜索一个 mysql 数据库 table,其中包含以下列,例如-

ID  Items   lat       long      serving_radius(in km)

1   Item1  26.120888  85.364723    2
2   Item2  26.120888  85.364723    5
3   Item3  25.859800  85.786598    4
4   Item4  26.594900  85.504799    8

现在如果用户 lat/long (29.941095/77.812424) 想知道这些项目中的哪些可以在他的位置提供。然后我将如何使用 php & mysql 获取结果。

我猜你要找的 SQL 是这个:

SELECT id, items, lat, long, serving_radius
FROM table 
WHERE lat = 29.941095 
AND long = 77.812424;

在您的 PHP 代码中,您应该使用数据库驱动程序(我建议您使用 PDO)以连接到数据库并执行查询。

有很多关于如何使用 PDO(创建连接、选择、插入等)的教程。

我刚找到这个教程,它可以帮助你:https://parzibyte.me/blog/en/2019/10/14/php-mysql-tutorial-using-pdo/

编辑:不确定您的意思是如何使用确切的 latlong 值或更接近它们的值来构建查询。 如果是这样,你可以看看https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql

这个问题好像

  1. 在数据库中找到 serving_radiuslat/lon 的半径。
  2. 使用函数MBRContains 查找包含用户点的多边形。
    SELECT
        *
    FROM 
        items
    WHERE
        MBRContains(
            GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))'),
            GeomFromText('Point(77.812424 29.941095)')) = 1;

希望对您有所帮助

"serving_radius" 是否已存储在您的 table 中? 你可以做的是获取距离并检查它是否在 serving_radius

SELECT serving_radius, 
(6371 * acos(cos(radians(" . $userLatitude . ")) * cos(radians(`latitude`)) * cos(radians(`longitude`) - radians(" . $userLongitude . ")) + sin(radians(" . $userLatitude . ")) * sin(radians(`latitude`)))) as distance 
having distance < serving_radius

我认为你的问题比传统问题更难,因为半径是可变的。

参见 http://mysql.rjweb.org/doc.php/find_nearest_in_mysql 进行讨论。

列出了 "find the nearest X" 的 5 种方法。最简单但最慢的方法是检查每个项目的距离。由于使用 "bounding-box" 来限制需要检查的项目数,因此所有其余部分都更快。但是,编码变得复杂。

在您的情况下,边界框可以限制为 table 中的最大半径。您的示例数据显示半径最大为 8,因此在起点周围构建一个边长为 2*8 的正方形可以让您了解我描述的各种技术。

最简单的涉及 INDEX(lat, lng), INDEX(lng, lat) 让优化器选择哪个更好。优点是它只检查 16 个纬度(或经度)范围内的项目,而不是整个地球。缺点是对另一个方向的优化作用不大

我建议您首先使用该技术。如果您需要更多性能,请进一步阅读我的文档,最好返回获取更多帮助,

那里讨论的技术还允许限制返回值的数量。