【问题标题】:Search approach for location based search基于位置的搜索的搜索方法
【发布时间】:2020-03-31 15:36:34
【问题描述】:

我需要实现基于位置的搜索功能,用户可以选择城市和位置(城市内),继续提及关键字并点击搜索。假设我们有 10 个城市,每个城市平均有 100 个地方。将考虑用户提供的位置作为起点并在远离用户位置的地方对其他结果进行排序(这样,特定关键字的城市结果将保持不变,只有排序会改变)。 php中的最佳方法?

1) 计算各地之间的距离,预先存入mySqldatabase。这将意味着地区的 100X100 矩阵(每个地区与其他地区的距离)。还有与 db 中的城市一样多的表。所以 10 个这样的表 + 添加更多的可能性。这仅用于订购。

2) 将所有数据放在 XML 中,而不是 mysql 数据库中。

3) 使用位图和压缩图像?

将性能和可扩展性作为主要标准。

【问题讨论】:

标签: php mysql xml search bitmapdata


【解决方案1】:

您首先按城市和标签过滤数据,然后希望按距离排序结果,而不是按距离过滤。 IE。即使是最远的点也应该从数据库中检索出来。在这种情况下,如果您在执行请求时计算与给定位置的距离,则不应该有太多的惩罚。毕竟,每行只是一个公式求值,然后按该值对结果进行排序。

如果您的数据是使用纬度和经度坐标给出的,那么理论上这意味着使用复杂的公式计算球体上测地线的长度。但是在一个城市中,地理网格可以合理地假设为矩形(不是正方形!)。因此,如果您存储每个城市的一纬度和一经度之间的比率,那么您可以将所有坐标转换为方形网格,计算与 x 中输入位置的差异y 方向,正方形并添加这些。无需取平方根,因为按平方排序也可以。

类似的东西:

  SELECT location.name, location.lat, location.lon, …
    FROM locations, cities
   WHERE location.city = city.id
     AND city.name = ?
     AND location.tag = ?
ORDER BY POW((location.lat - ?), 2) + POW((location.lon - ?)*city.geoaspect, 2)

其中参数是城市名称、所选标签以及输入的纬度和经度。

【讨论】:

    【解决方案2】:

    您还可以使用矩形网格计算 geohash,而无需使用 Mercantor 投影和 harvesine 公式,或者使用 mysql 中的点和空间索引数据结构。然后在查询中计算距离会快一点。

    【讨论】:

      【解决方案3】:

      这是我试图给出的示例查询。

      创建表markers ( id INT NOT NULL AUTO_INCREMENT 主键, name VARCHAR(60) 非空, address VARCHAR(80) 非空, lat FLOAT( 10, 6 ) NOT NULL , lng FLOAT(10, 6) 非空 ) 引擎 = MYISAM ;

      //查询

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

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 2010-12-29
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        相关资源
        最近更新 更多