[转] Sphinx SetGeoAnchor 经纬度查找附近地点

原文地址 http://www.douban.com/group/topic/30286342

Sphinx 的 SetGeoAnchor方法,(LinkWith:http://sphinxsearch.com/docs/manual-0.9.9.html#api-func-setgeoanchor)
coreseek提供的中文翻译手册:
function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )
为地表距离计算设置锚点,并且允许使用它们。$attrlat 和$attrlong 是字符串,分别指定了对应经度和纬度的属性名称。$lat 和$long 是浮点值,
指定了锚点的经度和纬度值,以角度为单位。一旦设置了锚点,您就可以在您的过滤器和/或排序表达式中使用@geodist 特殊属性。Sphinx 将在每一次全文检索中计算给定经纬度与锚点之前的地表距离,并把此距离附加到匹配结果
上去。SetGeoAnchor 和索引属性数据中的经纬度值都是角度。而结果会以米为单位返回,因此地表距离 1000.0 代表 1 千米。一英里大约是 1609.344 米。

coreseek这部分翻译有个问题,原文说的是弧度,而coreseek翻译成了角度,这是个错误。

一般由GPS提供的经纬度格式(角度)如:longitude:111.177579, latitude:53.051679 ,转换成弧度,公式为 (角度*Pi)/180,

首先在做索引的时候 ,得将经纬度数据源转换成弧度。

SQL:select id, radians(longitude) as longitude, radians(latitude) as latitude from locations

PHP:
$long = (float)$_GET['longitude'];
$lat = (float)$_GET['latitude'];
$radius = (float) 10000.0 * 1.61; //搜索10公里以内的地点

$cl = new SphinxClient();
$cl->SetServer("localhost", 3312);
$cl->SetMatchMode(SPH_MATCH_ANY);
$cl->SetArrayResult(true);
$cl->SetLimits(0, 100);
$cl->SetGeoAnchor('latitude', 'longitude', (float) deg2rad($long), (float) deg2rad($lat)); //角度转换成弧度

$cl->SetSortMode(SPH_SORT_EXTENDED, '@geodist asc'); // 按距离正向排序
$cl->SetFilterFloatRange('@geodist', 0.0, $radius); // 过滤掉大于10公里的地点

$result = $cl->Query('', '*');

你可能感兴趣的:(Sphinix,SetGeoAnchor)