如何存储或索引地理数据?

时间:2013-02-04 14:41:24

标签: mysql solr geolocation indexing sphinx

我遇到了问题,并且真的不知道从哪里开始:

  • 我有用户选择地理定位数据(例如:San Franciso,50英里)
  • 我需要对此进行搜索(例如:圣何塞)并返回在其周边拥有城市的用户。

我使用Sphinx(但可以选择更改)和MySQL,我尝试在索引时为所有城市创建一个多属性:它在索引时崩溃我的服务器。 所以我创建了一个存储用户的cron - >城市链接在数据库中。它适用于Sphinx,但我的cron有点过于贪婪(桌子增长得非常快,用户可以在他的周边有近1000个城市)。

你知道一个很好的解决方案吗?

由于

2 个答案:

答案 0 :(得分:0)

这可以通过Sphinx实现。您需要拥有数据库中每个城市的latitudelongitude,并且需要在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 radianssql_attr_float告诉Sphinx经度/纬度是浮点数。这是魔法@geodist函数所必需的。如果在命令行上调试,sql_query_info会很方便。

以下是执行Sphinx搜索以检索地理位置搜索的PHP代码

$_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');

答案 1 :(得分:0)

我去年有一个类似于你的项目并遇到了同样的问题。我不得不切换到SphinxQL而不是php API,并且第一次工作得更快,你有更多的选择,因为API给你。