1

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

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

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

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

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

4

3 回答 3

0

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

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

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

于 2012-08-10T09:27:09.807 回答
0

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

于 2012-08-11T12:46:43.213 回答
0

这是我试图提供一次示例查询的内容。

创建表markersidINT NOT NULL AUTO_INCREMENT PRIMARY KEY, nameVARCHAR(60)NOT NULL, addressVARCHAR(80)NOT NULL, latFLOAT(10,6)NOT NULL, lngFLOAT(10,6)NOT NULL)引擎= MYISAM;

// 询问

SELECT id, ( 3959 * acos( cos( 弧度(37) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(-122) ) + sin( 弧度(37) ) * sin( 弧度( lat ) ) ) ) AS距离标记 HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

于 2020-03-31T07:36:34.070 回答