Fastest Way to Find Distance Between Two Lat/Long Points(查找两个经纬度点之间距离的最快方法)
问题描述
我目前在 mysql 数据库中有不到一百万个位置,所有位置都包含经度和纬度信息.
I currently have just under a million locations in a mysql database all with longitude and latitude information.
我试图通过查询找到一个点和许多其他点之间的距离.它没有我想要的那么快,尤其是每秒 100 次以上的点击.
I am trying to find the distance between one point and many other points via a query. It's not as fast as I want it to be especially with 100+ hits a second.
是否有比 mysql 更快的查询或可能更快的系统?我正在使用这个查询:
Is there a faster query or possibly a faster system other than mysql for this? I'm using this query:
SELECT
name,
( 3959 * acos( cos( radians(42.290763) ) * cos( radians( locations.lat ) )
* cos( radians(locations.lng) - radians(-71.35368)) + sin(radians(42.290763))
* sin( radians(locations.lat)))) AS distance
FROM locations
WHERE active = 1
HAVING distance < 10
ORDER BY distance;
注意:提供的距离以英里为单位.如果您需要公里,请使用6371
而不是3959
.
Note: The provided distance is in Miles. If you need Kilometers, use 6371
instead of 3959
.
推荐答案
使用
MyISAM
表中Geometry
数据类型的Point
值创建您的点.从 Mysql 5.7.5 开始,InnoDB
表现在也支持SPATIAL
索引.Create your points using
Point
values ofGeometry
data types inMyISAM
table. As of Mysql 5.7.5,InnoDB
tables now also supportSPATIAL
indices.在这些点上创建
SPATIAL
索引使用
MBRContains()
查找值:SELECT * FROM table WHERE MBRContains(LineFromText(CONCAT( '(' , @lon + 10 / ( 111.1 / cos(RADIANS(@lat))) , ' ' , @lat + 10 / 111.1 , ',' , @lon - 10 / ( 111.1 / cos(RADIANS(@lat))) , ' ' , @lat - 10 / 111.1 , ')' ) ,mypoint)
,或者,在
MySQL 5.1
及以上:, or, in
MySQL 5.1
and above:SELECT * FROM table WHERE MBRContains ( LineString ( Point ( @lon + 10 / ( 111.1 / COS(RADIANS(@lat))), @lat + 10 / 111.1 ), Point ( @lon - 10 / ( 111.1 / COS(RADIANS(@lat))), @lat - 10 / 111.1 ) ), mypoint )
这将选择
(@lat +/- 10 km, @lon +/- 10km)
框内的所有点.This will select all points approximately within the box
(@lat +/- 10 km, @lon +/- 10km)
.这实际上不是一个盒子,而是一个球面矩形:球体的经纬度边界段.这可能与弗朗茨约瑟夫地上的普通矩形不同,但在大多数有人居住的地方非常接近.
This actually is not a box, but a spherical rectangle: latitude and longitude bound segment of the sphere. This may differ from a plain rectangle on the Franz Joseph Land, but quite close to it on most inhabited places.
应用额外的过滤来选择圆圈内的所有内容(不是正方形)
Apply additional filtering to select everything inside the circle (not the square)
可能应用额外的精细过滤来解释大圆距离(对于大距离)
Possibly apply additional fine filtering to account for the big circle distance (for large distances)
这篇关于查找两个经纬度点之间距离的最快方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:查找两个经纬度点之间距离的最快方法


基础教程推荐
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- Sql Server 字符串到日期的转换 2021-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01