【问题标题】:How to select longitude, latitude around specifc location from mysql?如何从mysql中选择特定位置周围的经度、纬度?
【发布时间】:2016-04-27 06:51:11
【问题描述】:

我正在尝试获取特定位置周围的经度和纬度。实际上我在 mysql 表中有一些记录(longitude and latitude)。现在我想从应该有大约 500 米特定经度的表中获取那些经度和纬度。请查看代码,希望您能理解我的问题。

Mysql位置表

-------------------------------------
id  |     longitude    |    latitude
-------------------------------------
1  |   25.058036      |    55.133467
-------------------------------------
2  |   25.056986      |    55.135755
-------------------------------------
3  |   25.059163       |   55.135616
-------------------------------------
4  |   25.056860       |  55.132515
-------------------------------------
5  |   25.055683       |   55.134792

我想得到那些经度,纬度应该有500米左右的具体距离(25.057550, 55.134729)。

$user_long= $_REQUEST['user_long']; // 25.057550
$user_lat= $_REQUEST['user_lat']; // 55.134729

Select * from location where .... (fetch record around 500 meters)

我已经搜索过它并找到了一些很好的解释 haversine formula answerGoogle Map With Php/Mysql 但我不知道如何开发这种功能。我知道这个问题对某人来说可能是愚蠢的,因为我没有添加我的代码,但相信我,我不知道我该怎么做以及我应该从哪里开始功能。如果有人指导我了解此功能,我将不胜感激。

谢谢

【问题讨论】:

标签: php mysql google-maps


【解决方案1】:
SELECT *,3956*2*ASIN(SQRT(POWER(SIN((19.286558 - latitude)*pi()/180/2),2)+COS(19.286558 * pi()/180)
*COS(latitude * pi()/180)*POWER(SIN((-99.612494 -longitude)* pi()/180/2),2)))
as distance FROM table  having distance < 10 ORDER BY distance;

这将为您提供 10 公里范围内的记录。 在have子句中修改500米的查询。

【讨论】:

  • 非常感谢它为我工作......我很感激你
【解决方案2】:

使用这个查询

$query = "SELECT *,ROUND(1.609344*(((acos(sin((" . $latitude .    "*pi()/180)) * 
        sin((`Latitude`*pi()/180))+cos((" . $latitude . "*pi()/180)) * 
        cos((`Latitude`*pi()/180)) * cos(((" . $longitude . "- `Longitude`)* 
        pi()/180))))*180/pi())*60*1.1515
    ),2) as distance 
    FROM `table`  HAVING distance<=" . MAX_DISTANCE . " ";

其中 $latitude 是用户纬度,$longitude 是用户经度,MAX_DISTANCE 是您希望获得该结果的最大距离,以公里为单位。

【讨论】:

  • 您的查询是否与问题内容相关?
  • @BikashP 感谢分享知识,我没有在我的表中使用 store_type 列。你能解释一下这张表的用途是什么,我可以检查你的查询。非常感谢
  • 更新了我的查询。检查一下。我刚刚删除了 where 子句。
【解决方案3】:

试试这个

SELECT *,
(6371*acos(cos(radians(" . $user_lat ."))*cos(radians(`latitude`))*cos(radians(`longitude`)-radians(" . $user_long . "))+sin(radians(" . $user_lat . "))*sin(radians(`latitude`)))) AS distance
FROM `location` WHERE `distance` < '0.5' ORDER BY `distance` ASC

0.5 以公里为单位

【讨论】:

    【解决方案4】:

    如果自定义实现的半正弦公式的性能对您来说太慢,并且您不介意使用 MySQL 5.7.6+,那么您可以利用内置的 ST_Distance_Sphere 函数,它可以是 ±20 倍比用于计算半正弦距离的自定义实施程序更快。您可以在此blogpost 中查看基准和示例。此外,如果您不介意将您的位置存储为 Point 几何对象,您还可以利用空间索引。您也可以先根据边界框(this blogpost 末尾的示例)预先过滤位置,这也可以加快查询速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多