6

我有 2 张桌子:

Events:
 - id
 - name
 - place

Places:
 - id
 - name
 - lat
 - lng

我想从and中检索10KM radius(基于位置lat& lng)中的所有事件。我怎样才能做到这一点?current latlng

谢谢!

4

4 回答 4

4

如果您愿意使用扩展,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 /

于 2014-12-25T00:23:30.063 回答
1

也许这可以帮助你http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

基本上问题在于 lat/lng 是球坐标(lat 和 lng 是角度),并且您想使用球面上的线性距离进行搜索。然后,你试图比较两个不同的东西,我的意思是,角度和公里。为此,您必须进行坐标变换,然后进行比较。

于 2012-05-12T14:32:32.023 回答
0

Hope this simple query helps

SELECT 
    *
FROM 
    `locator`
WHERE
    SQRT(POW(X(`center`) - 49.843317 , 2) + POW(Y(`center`) - 24.026642, 2)) * 100 < `radius`

details here http://dexxtr.com/post/83498801191/how-to-determine-point-inside-circle-using-mysql

于 2014-04-23T05:16:28.427 回答
0

您必须使用 st_distance_sphere,它将给出的两个点解释为 lat/lng 的地理点,而不是二维坐标系中的两个点。

结果以米为单位。

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 |

结果以米为单位。

这是文档: 在此处输入链接描述

于 2018-05-31T16:04:18.343 回答