发布于 1970-01-01 08:00
  • 6 个回答
    • 楼主可以看看这篇文章: http://www.infoq.com/cn/articles/depth-study-of-Symfony2
      他列举了这类问题的几种解决方案,最后推荐的是mongodb,这也是LBS常见的解决方案之一

      这两天我正好也在做这类服务,因为我的数据比较少,所以使用的是mysql partial index的方法。

      set @x1 = 31.292491624635;
      set @y1 = 121.50865016331;
      set @r0 = 10;
      select *, AsText(pos), X(pos), Y(pos), 
      6378 * 2 *ASIN(SQRT( 
      POWER(SIN((@orig_lat - abs(X(pos))) * pi()/180 / 2),2) + 
      COS(@orig_lat * pi()/180 ) * COS(abs(X(pos)) *  pi()/180) * POWER(SIN((@orig_lon - Y(pos)) *  pi()/180 / 2), 2)
      )) as distance
      from user_posistion 
      WHERE   MBRContains(LineString(Point(@x1 + @r0 / ( 111.1 / COS(RADIANS(@y1))), @y1 + @r0 / 111.1), Point(@x1 - @r0 / ( 111.1 / COS(RADIANS(@y1))), @y1 - @r0 / 111.1)), pos)
      order by distance asc
      

      其中@x1,@y1是坐标, @r0是搜索的半径km,pos是point类型的字段
      先根据spatial索引检索出半径范围内的所有点,然后计算距离,最后排序

      因为我的数据少,性能方面可以满足要求

      2022-12-01 18:22 回答
    • 有个东西叫GEOHASH。。速度极快,目前公司里这种需求都是用这种方法做的

      2022-12-01 18:22 回答
    • 这个属于 GIS,最好还是用数据库扩展来做.例如:http://blog.csdn.net/historyasamirror/article/details/6528527 这里的做法. 硬要用 MySQL 的常规用法来解决就必须将计算两点距离的方法写成存储过程:

      select uid from tableName order by distance(l1, n1, tableName.longitude, tableName.latitude) asc limit 10;
      

      其中 distance 是一个算两点距离的存储过程.一般情况下不推荐这么做,因为这种运算会影响数据库性能。

      2022-12-01 18:22 回答
    • 精确计算太过于复杂,php+mysql有难度。

      现实中解决实际问题可以将模型简化,按距离排序可以这样实现:

      "SELECT * ,longitude*longitude + latitude*latitude as dis FROM table WHERE dis>'$x'  order by dis DESC LIMIT {$offset},20"
      

      但是效率比较低下。

      2022-12-01 18:22 回答
    • 想一步到位很难的哦,我的做法是先用mysql过滤出半径内的符合条件的数据,做法和你那个差不多。然后再用php算出每个点和指定坐标的距离,然后将这些数据进行排序,一般经过mysql筛选后的数据量就不是很大了,用php排序问题应该不大。

      2022-12-01 18:22 回答
    • 这不是k nearest neighbor的eager version么…

      k-d tree搜这个关键词

      2022-12-01 18:22 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有