基于纬度和经度进行SQL选择半径搜索。

8

我有两个表:

Events:
 - id
 - name
 - place

Places:
 - id
 - name
 - lat
 - lng

我希望能够检索所有距离当前位置 latlng 不超过 10KM 半径的事件。请问如何实现?
谢谢!

1
可能是重复问题:https://dev59.com/xnNA5IYBdhLWcg3wVcJx - JK.
10公里需要多精确?正确的方法涉及相当数量的数学计算,在SQL中执行非常缓慢。最好是检索稍大一些的数据集并将其传递给客户端进行最终处理,或者使用近似集合。 - David Manheim
4个回答

6

如果你愿意使用MySQL 5.6及以上版本的地理空间扩展,它可以解决这种类型的问题。你需要在你的地点表上建立一个空间索引:

ALTER TABLE places ADD SPATIAL INDEX lat, lng

select name from places
order by st_distance(point(@lng, @lat), point(lng, lat))
limit 10

实际距离的查找需要进行一些计算。以下文章介绍了一些可能想要尝试的方法:http://www.plumislandmedia.net/mysql/using-mysqls-geospatial-extension-location-finder/
如果需要更详细的信息,请查看http://www.percona.com/blog/2013/10/21/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/

1
也许这会对你有所帮助 http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
基本问题在于 lat/lng 是球面坐标(即经纬度),你想要使用球面表面上的线性距离进行搜索。然后,你试图比较两个不同的事物,也就是角度和公里数。为了实现这一点,你需要进行坐标转换,然后进行比较。

0

1
这个不起作用。问题在于单位不同;1度纬度/经度在输入的纬度和经度不同时代表的公里数是不同的。 - David Manheim

0

你需要使用st_distance_sphere函数,该函数将给定的两个点解释为地理点,即纬度/经度,而不是二维坐标系中的两个点。

结果以米为单位。

mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)');
mysql> SET @pt2 = ST_GeomFromText('POINT(180 0)');
mysql> SELECT ST_Distance_Sphere(@pt1, @pt2);
+--------------------------------+
| ST_Distance_Sphere(@pt1, @pt2) |
+--------------------------------+
|             20015042.813723423 |

结果以米为单位。

以下是文档: 输入链接说明


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接