在 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/
编辑:不确定您的意思是如何使用确切的 lat
和 long
值或更接近它们的值来构建查询。
如果是这样,你可以看看https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql
这个问题好像
- 在数据库中找到
serving_radius
和 lat/lon
的半径。
- 使用函数
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 个纬度(或经度)范围内的项目,而不是整个地球。缺点是对另一个方向的优化作用不大
我建议您首先使用该技术。如果您需要更多性能,请进一步阅读我的文档,最好返回获取更多帮助,
那里讨论的技术还允许限制返回值的数量。
这个问题不同于常规的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/
编辑:不确定您的意思是如何使用确切的 lat
和 long
值或更接近它们的值来构建查询。
如果是这样,你可以看看https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql
这个问题好像
- 在数据库中找到
serving_radius
和lat/lon
的半径。 - 使用函数
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 个纬度(或经度)范围内的项目,而不是整个地球。缺点是对另一个方向的优化作用不大
我建议您首先使用该技术。如果您需要更多性能,请进一步阅读我的文档,最好返回获取更多帮助,
那里讨论的技术还允许限制返回值的数量。