这可以通过 Sphinx 实现。您需要在数据库中拥有每个城市的latitude
和longitude
,并且需要在 Sphinx 中添加为属性。
Sphinx 使用魔法函数@geodist
计算范围内的兴趣点 (POI)。
需要更改 Sphinx 配置文件,如下所示:
source geolocation
{
sql_query = select city_id, radians(longitude) as longitude,
radians(latitude) as latitude from cities
sql_attr_float = longitude
sql_attr_float = latitude
}
请注意,sql_query
使用radians
函数来转换degrees to radians
. sql_attr_float
告诉 Sphinx 经度/纬度是浮点数。这是魔术@geodist
功能所需要的。sql_query_info
如果您在命令行上调试,这很方便。
下面是PHP
执行 Sphinx Search 以检索地理位置搜索的代码
$_longitude = $_GET['longitude'];
$_latitude = $_GET['latitude'];
$_radius = $_GET['radius'];
$search = new SphinxClient();
$search->SetServer("localhost", 3312);
$search->SetMatchMode(SPH_MATCH_ALL);
$search->SetArrayResult(true);
$search->SetLimits(0, 100);
$search->SetGeoAnchor('latitude', 'longitude', (float) deg2rad($_latitude),
(float) deg2rad($_longitude));
$circle = (float) $_radius * 1.61;
$search->SetFilterFloatRange('@geodist', 0.0, $circle);
$result = $search->Query('', 'geolocation');