当前位置: 首页 > 知识库问答 >
问题:

如何搜索附近的位置与公里在MySQL

公冶安怡
2023-03-14

我有如下结构的数据库。如何在5公里内location_id。有纬度和经度的数字已经在数据库表中。请参阅我的数据库结构图像。

- school_id
- location_id
- school_name
- lat
- lng

以下是数据库结构图像:

我已经从这个链接搜索如何找到最近的位置使用纬度和经度从sql数据库?我不明白密码。

SELECT id,(3959*acos(cos(弧度(37))*cos(弧度(lat ) ) * cos(弧度(lng)-弧度(-122))sin(弧度(37))*sin(弧度(lat ) ) ) ) AS距离从标记有距离

共有3个答案

彭开畅
2023-03-14

当我解决了一个类似的问题,而不是担心地球的曲率和角度。我只是用毕达哥拉斯距离。这是一个足够接近的近似值。

i、 e.获取距离毕达哥拉斯约5公里的所有学校。

select sqrt(pow(lat - curlat,2) + pow(lng - curlng,2)) as distance from markers having distance < XXXXX

你必须计算XXXX的近似值。I度大约是111公里。如果你没有做任何极端的纬度,你就不必担心调整它。所以你可以把XXXX设定在0.045

艾仲渊
2023-03-14
SELECT *, ((ACOS(SIN(inputLat * PI() / 180) * 
SIN(tableColLat * PI() / 180) + COS(inputLat * PI() / 180) * 
COS(tableColLat * PI() / 180) * COS((inputLng - tableColLng) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) 
as distance FROM gm_shop HAVING distance <= 5 ORDER BY distance ASC;

距离是你可以改变的。它是公里

堵茂勋
2023-03-14

常量文字3959表示地球半径的近似值,单位为英里。这就是“大圆距离”表达式返回以英里为单位的值的原因。

要获得以公里为单位的距离,只需将3959替换为6371,这是以公里为单位的地球半径的近似值。

参考:https://en.wikipedia.org/wiki/Great-circle_distance

查询所做的是计算地球上两点之间的距离(以英里为单位),用纬度和经度表示。

其中一个点由GCD表达式(37.000000,-122.000000)中的文字值表示。另一个点是数据库行中的(纬度,lng)(纬度和经度)。

查询曲柄遍历表中的每一行,并计算GCD表达式以计算距离。(两点之间沿球体表面的最短线的长度。)

有距离

ORDER BY distance子句按距离的升序返回行,最接近的点在前。

LIMIT 20子句将返回限制为前二十行。

后续

离什么不到五公里?圣莫尼卡码头水族馆?

那是纬度34.010396,经度-118.496029。

我们可以设置用户定义的变量(以避免在查询文本中传播文字):

 SET @lat =   34.010396 ;
 SET @lng = -118.496029 ;

我们的SQL文本在选择列表中包含要从表返回的列。我们还将包括一个看起来很复杂的“大圆距离”表达式,它返回以公里为单位的距离。

大概是这样的:

 SELECT m.school_id
      , m.location_id
      , m.school_name
      , m.lat
      , m.lng

      , ( ACOS( COS( RADIANS( @lat  ) ) 
              * COS( RADIANS( m.lat ) )
              * COS( RADIANS( m.lng ) - RADIANS( @lng ) )
              + SIN( RADIANS( @lat  ) )
              * SIN( RADIANS( m.lat ) )
          )
        * 6371
        ) AS distance_in_km

  FROM mytable m
 ORDER BY distance_in_km ASC
 LIMIT 100

表达式中的GCD公式计算两点之间的距离。

在这个查询中,其中一个点是一个常量(@lat,@lng),我们之前将其设置为圣莫尼卡码头水族馆的坐标。

另一点是(m.lat,m.lng),表中行的经纬度。

所以在这个查询中,distance_in_km表示表中行的(lat, lng)与Santa Monica Pier Aquaria之间的距离。

因为distance_in_km值在访问行时不可用,所以我们不能在WHERE子句中引用它。

但是我们可以在HAVING子句中引用它。这与中的类似,因为它过滤掉了行,但有很大不同,因为它在查询执行中的计算要晚得多。它还可以引用在访问行时以及在计算WHERE子句时不可用的表达式。

我们可以修改查询以包含HAVING子句。在本例中,我们将限制为100公里以内的行,并且只返回最近的12行。。。

  FROM mytable m
HAVING distance_in_km <= 100
 ORDER BY distance_in_km ASC
 LIMIT 12

如果我们想找到到圣莫尼卡码头以外的某个点的距离,我们为该点设置@lat@lng,并重新执行SQL。

 类似资料:
  • 问题内容: 我正在编写一个脚本,其中将业务量以纬度和经度加载到mySQL数据库中。然后,我向该脚本提供一个(最终用户的)经度纬度,并且该脚本必须计算从提供的经度/经度到它从数据库中获得的条目的EACH的距离,并按从最远到最远的顺序对其进行排序。 实际上,我实际上只需要大约10或20个“最近”的结果,但是除了从数据库中获取所有结果并对每个结果运行函数然后进行数组排序之外,我什么也想不做。 这是我已经

  • 利用 Google API 实现搜索附近商店、银行、学校等等POI。点击地点的标注(Annotation)会有弹出气泡视图的动画效果。需申请自己的API Key 进行替换使用,详见官方文档:https://developers.google.com/places/documentation/ 。 [Code4App.com]

  • 我在谷歌的数据存储中存储了很多包含地质点的实体。现在,我需要根据发送到谷歌云功能的位置获取10个最近的位置 我看到,谷歌的应用程序引擎中有一个distance()函数,但在谷歌云函数中没有可比性,甚至无法计算数据库中的任何内容。 是否可以仅使用谷歌云功能从数据存储中获取最近的10个位置,或者我需要使用不同的数据库? 最好的问候, 帕斯卡

  • 附近地点搜索 题目详情 找一个点集中与给定点距离最近的点,同时,给定的二维点集都是固定的,查询可能有很多次,时间复杂度O(n)无法接受,请设计数据结构和相应的算法。 分析与解法 此题是去年微软的三面题,类似于一朋友@陈利人出的这题:附近地点搜索,就是搜索用户附近有哪些地点。随着GPS和带有GPS功能的移动设备的普及,附近地点搜索也变得炙手可热。在庞大的地理数据库中搜索地点,索引是很重要的。但是,我

  • 我试图通过使用谷歌地图的api来获取我发送的位置的附近位置。下面是url(https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362 日志e(“Res”,response.body()。getStatus()); 我是不是用正确的方式进行改造? 我的客户。爪哇: Near

  • 本文向大家介绍搜索附近的人PHP实现代码,包括了搜索附近的人PHP实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PHP实现搜索附近的人具体代码,供大家参考,具体内容如下 实现思路: 首先,我们应该这样想: 既然我们知道了用户当前位置的经纬度,又知道我们将要搜索的范围,我们可不可以计算出一个范围 ?也就是说,根据一个中心点和半径,计算出符合条件的经纬度的最大值和最小值 。 具