首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -从数据库查找半径内的点

MySQL -从数据库查找半径内的点
EN

Stack Overflow用户
提问于 2017-03-15 08:34:04
回答 3查看 9.2K关注 0票数 7

我有一个表,其中有一个POINT列,其中包含不同位置的纬度和经度。

然后,我在浏览器中也有了来自geo-location的用户位置。

我需要做的是从表中找到POINT值在10 km半径(或X km半径)内的所有记录,按距离排序,最先是最近的。

我的表在POINT列上有一个SPATIAL索引。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-15 08:46:11

我目前正在做一个项目,我正在计算多个位置之间的距离。我使用以下查询来选择在给定半径内的object_id。

代码语言:javascript
复制
SELECT id, 
( 6371 * 
    ACOS( 
        COS( RADIANS( db_latitude ) ) * 
        COS( RADIANS( $user_latitude ) ) * 
        COS( RADIANS( $user_longitude ) - 
        RADIANS( db_longitude ) ) + 
        SIN( RADIANS( db_latitude ) ) * 
        SIN( RADIANS( $user_latitude) ) 
    ) 
) 
AS distance FROM the_table HAVING distance <= $the_radius ORDER BY distance ASC"

我无法解释ACOS公式本身,因为它是从研究中获得的。

代码语言:javascript
复制
db_latitude = database latitude field
db_longitude = database longitude field
$user_latitude = browser latitude coördinate
$user_longitude = browser longitude coördinate
$the_radius = the radius that you want to search in

以公里为单位。

票数 20
EN

Stack Overflow用户

发布于 2017-09-25 15:53:46

下面的查询实际上对我有效:

代码语言:javascript
复制
$query = "SELECT *,
    ( 6371 * 
    acos( 
    cos( radians( ".$user_lat." ) ) * 
      cos( radians( lat ) ) * 
      cos( radians( lng ) - 
      radians( ".$user_lng." ) ) + 
        sin( radians( ".$user_lat." ) ) * 
          sin( radians( lat ) ) ) ) 
          AS distance FROM parkings 
          HAVING distance <= ".$radius." ORDER BY distance ASC";

  $stmt = $conn->execute($query);

  $rows = $stmt->fetchAll('assoc');

其中:$user_lat和$user_lng是浏览器的纬度,lng,$radius = 10,表名是parking

票数 1
EN

Stack Overflow用户

发布于 2017-03-15 08:44:32

也许这对你有帮助,https://ru.scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL

对于Django,我使用这个

代码语言:javascript
复制
    dist = 20 #дистанция 20 км
    mylon = 51.5289156201 # долгота центра
    mylat = 46.0209384922 # широта 
    lon1 = mylon-dist/abs(math.cos(math.radians(mylat))*111.0) # 1 градус широты = 111 км
    lon2 = mylon+dist/abs(math.cos(math.radians(mylat))*111.0)
    lat1 = mylat-(dist/111.0)
    lat2 = mylat+(dist/111.0)
    profiles = UserProfile.objects.filter(lat__range=(lat1, lat2)).filter(lon__range=(lon1, lon2))

它搜索方圆20公里内的所有用户。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42799118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档