【问题标题】:How can i query in mysql-table(where lat and long stored) that which are the nearest location to inputed location(lat and long)?我如何在 mysql-table(存储 lat 和 long 的位置)中查询离输入位置(lat 和 long)最近的位置?
【发布时间】:2012-10-30 10:10:46
【问题描述】:

我想在android中制作一个应用程序。在这个应用程序中,用户必须在这个应用程序中注册。注册后,gps 位置(经纬度)将与用户信息一起存储在数据库表中。在这个应用程序中,我想添加一个功能,即“搜索根中的人”。用户可以输入起点和终点(如:孟买到德里)。并且希望找到介于这两点之间的每个民族。

例如:用户 A 新注册了这个应用程序。用户 A 的 gps 位置类似于 lat = 20.234554 和 long = 56.21455255。现在他将像孟买一样输入两个点到德里,然后单击搜索按钮。现在我想在已经存储了每个人的信息的数据库中进行查询。我想在数据库中查询“从孟买到德里之间的人们的位置(表)中选择 *”

数据库表“locations”有四个字段id、lat、long 和cityname。现在我想对数据库进行上述查询,我​​可以在其中找到位于两个输入地理点之间的人。

希望我已经很好地解释了您理解我想要实现的只是我想从输入位置(纬度和经度)的数据库表中搜索附近的位置(纬度和经度)。

【问题讨论】:

标签: android mysql google-maps gps


【解决方案1】:

我建议通过一些可以索引的条件来限制您的位置。您可以轻松地做到这一点,因为您可能不想将某人从美国到巴黎的某人列为最近的位置。

只需对 RustamIS 查询稍作修改,您就可以消除大部分不相关的位置。

select * from gps_location_table t 
where
    t.x between 20.134554 and 20.334554 and t.y between 56.11455255 and 56.31455255
order by 
    sqrt((t.x - 20.234554)*(t.x - 20.234554) + (t.y - 56.21455255)*(t.y - 56.21455255)
desc

所以你定义了一个矩形来寻找最近的人。

【讨论】:

  • 看看这是我的 php : 但是当我通过我的本地服务器 wamp 运行它时:它会出现以下错误:

  • 警告:mysql_fetch_assoc():提供的参数不是D:\WAMP INSTALLED\WAMP2\wamp\www\ 中的有效 MySQL 结果资源PHP\check.php10
    null
  • 这个查询可以吗?我已经在我的 php 文件中写了它: $sql=mysql_query("select * from locations t where t.lat between 20.134554 and 20.334554 and t.lont between 56.11455255 and 56.31455255 order by sqrt((t.lat - 20.234554)*(t .lat - 20.234554) + (t.lont - 56.21455255)*(t.lont - 56.21455255) desc");
  • 在 desc 之前的 sqrt 函数的 and 处缺少一个括号。从位置 t 中选择 *,其中 t.lat 在 20.134554 和 20.334554 之间,t.lont 在 56.11455255 和 56.31455255 之间按 sqrt((t.lat - 20.234554)*(t.lat - 20.234554) + (t.lont - 56.21455255)*( t.lont - 56.21455255)) desc;
【解决方案2】:
SELECT *, ((ACOS(SIN(23.037698 * PI() / 180) * SIN(latitude * PI() / 180) + COS(23.037698 * PI() / 180) * COS(latitude * PI() / 180) * COS((72.564835 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 * 1.609344) as distance FROM location;

如果您输入,上述查询将返回您的距离

lat = 23.037698
long = 72.564835

现在比较距离说距离> 50公里。

这对我有用。

【讨论】:

  • 感谢您抽出宝贵时间回复您,如果我得到...,我一定会投票......
  • 我在我的 php 中写了上面的行,例如: $sql=mysql_query("SELECT *, ((ACOS(SIN(23.037698 * PI() / 180) * SIN(lat * PI() / 180) + COS(23.037698 * PI() / 180) * COS(lat * PI() / 180) * COS((72.564835 - lont) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 * 1.609344) 作为 50 FROM 位置");而($row=mysql_fetch_assoc($sql)) $output[]=$row;打印(json_encode($output));
  • 但是当我运行 php 时在浏览器中显示此警告:
    警告:mysql_fetch_assoc():提供的参数不是 D 中的有效 MySQL 结果资源:\WAMP INSTALLED\WAMP2\wamp\www\PHP\check.php 在第 12
    null
  • 好的。我根本不知道php。我是一个安卓人。但是让我们确保您传递了正确的参数。让我们再次检查所有。在上面的查询中 23.037698 和 72.564835 是硬编码的经纬对(从这里我想得到距离)。和 latitude - longitude 是表位置的字段。首先尝试在 MYSQL 查询浏览器上运行。然后从 PHP 页面调用它
  • 不,不,我解决了它,我也从数据库中获取了所有数据,但我现在想问一些其他的事情,比如如果我选择两个 gps 数据(纬度和经度)从德里到孟买。现在我想从我的数据库中搜索两点之间的所有人。我怎么能做到这一点??
【解决方案3】:

让 long => Y 和 lat => X 然后像这样查询

select * from gps_location_table t 
order by 
     sqrt(pow((t.x - 20.234554),2) + pow((t.y - 56.21455255),2))
desc

答案一定是这样的!!!提到这个公式不会返回正确的距离,但它有效,并且比计算实际距离更快。

主要意思是两个坐标之间的距离是:

sqrt((x1-x2)^2 + (y1-y2)^2)    

【讨论】:

  • 这个查询会从最近的坐标开始
  • 这肯定会奏效,但我担心随着表大小的增加,性能会呈指数级下降,并且会变得 CPU 和 IO 密集型,因为 MySQL 必须执行全表扫描并按函数的输出排序,这是不可能的索引,此外对所有行进行数学计算会消耗大量 CPU 周期。
  • 提到这个公式没有返回正确的距离,但是它的结果是正确的,并且它的工作速度更快,因为它没有完成所有的计算。(它没有计算出真正的距离!)跨度>
  • 是的,通过上面的查询,我得到了所有记录和存储在我的数据库中的位置......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2012-03-20
  • 2018-03-20
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多