搜索基于位置的搜索方法

时间:2012-08-03 17:28:33

标签: php mysql xml search bitmapdata

我需要实现基于位置的搜索功能,用户可以选择城市和地区(在城市内),继续提及关键字并点击搜索。所以说我们有10个城市,每个城市平均有100个地方。将结果显示为考虑用户提供的位置作为起点并且将其他结果排序远离用户的位置(以这种方式,特定关键字的城市结果将是恒定的,只有排序会改变)。什么是php的最佳方法?

1)计算各个地方之间的距离,预先存储在mySqldatabase中。这意味着地方的100X100矩阵(每个地点与其他地方的距离)。也就像数据库中的城市一样多。所以10个这样的表+增加更多的可能性。这仅用于订购。

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

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

将性能和可伸缩性视为主要标准。

3 个答案:

答案 0 :(得分:0)

您首先按城市和代码过滤数据,然后希望按距离订购结果,但不要按距离过滤。即甚至应该从数据库中检索最远的点。在这种情况下,如果在执行请求时计算距离给定位置的距离,则不会有太多的惩罚。毕竟,每行只有一个公式评估,然后按该值对结果进行排序。

如果使用纬度和经度坐标给出数据,那么从理论上讲,这将意味着使用复杂的公式计算球体上的测地线长度。但在一个城市中,地理网格可以合理地假设为矩形(不是正方形!)。因此,如果您存储每个城市的一个纬度和一个经度之间的比率,那么您可以将所有坐标转换为方形网格,计算 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)

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

答案 1 :(得分:0)

您还可以使用矩形网格计算geohash,不使用mercantor投影和harvesine公式,也可以使用mysql中的点和空间索引数据结构。比计算查询中的距离要快一点。

答案 2 :(得分:0)

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

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

//查询

选择ID,(3959 * acos(cos(弧度(37))* cos(弧度(lat))* cos(弧度(lng)-弧度(-122))+ sin(弧度(37))* sin (radians(lat))))到标记的距离为<25 ORDER BY distance LIMIT 0,20;