基于位置的搜索方法


Search approach for location based search

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

1) 计算各个位置之间的距离,并将其预先存储在mySql数据库中。这意味着地方(每个地方与其他地方的距离)有一个100X100的矩阵。数据库中的城市也有同样多的表格。因此,10张这样的表格+增加更多的可能性。这仅用于订购。

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

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

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

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

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

大致如下:

  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)

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

您还可以使用矩形网格计算地理哈希,不使用mercantor投影和harvesine公式,或者使用mysql中的点和空间索引数据结构。在查询中计算距离会快一点。

以下是我试图给出的一个示例查询。

创建表markers(CCD_ 2 INT不是空的AUTO_ INCREMENT主键,name VARCHAR(60)不为空,address VARCHAR(80)不为空,lat FLOAT(10,6)不为空,lng浮点(10,6)不为空)ENGINE=MYISAM;

//查询

选择id,(3959*acos(cos(弧度(37))*cos(弧度;25 ORDER BY distance LIMIT 0,20;