近项目用sphinx做地理搜索,可是结果总是不对,明明很近却搜不到

结果检查sphinx源文件:

static inline double sphSqr ( double v )

{

return v*v;

}

float ExprGeodist_t::Eval ( const CSphMatch & tMatch ) const

{

const double R = 6384000;

float plat = tMatch.GetAttrFloat ( m_tGeoLatLoc );

float plon = tMatch.GetAttrFloat ( m_tGeoLongLoc );

double dlat = plat - m_fGeoAnchorLat;

double dlon = plon - m_fGeoAnchorLong;

double a = sphSqr ( sin ( dlat/2 ) ) + cos(plat)*cos(m_fGeoAnchorLat)*sphSqr(sin(dlon/2));

double c = 2*asin ( Min ( 1, sqrt(a) ) );

return (float)(R*c);

}

  

附上解决办法:

$search->SetGeoAnchor('latitude', 'longitude', (float) deg2rad($_latitude), (float) deg2rad($_longitude));

传入坐标的时候把坐标角度转换成弧度即可

PHP版弧度计算:

function sphSqr($v){

return $v*$v;

}

function cacu_geo($loc_lat,$loc_lng,$geo_lat,$geo_lng){

$R = 6384000;

$plat = (float)$loc_lat;

$plon = (float)$loc_lng;

$dlat = $plat - $geo_lat;

$dlon = $plon - $geo_lng;

$a = sphSqr ( sin ( $dlat/2 ) ) + cos($plat)*cos($geo_lat)*sphSqr(sin($dlon/2));

$c = 2*asin ( min ( 1, sqrt($a) ) );

return (float)($R*$c);

}

MYSQL版本坐标计算(角度):

SELECT 6384000 * 2 * ASIN(SQRT(

POWER(SIN((31.218992 - abs(31.218992)) * pi()/180 / 2),

2) +  COS(31.218992 * pi()/180 ) * COS(abs(31.218992) *

pi()/180) *  POWER(SIN((121.431241 - 121.431480) *

pi()/180 / 2), 2) )) as  distance

PHP版本坐标计算(角度):

function rad($d)

{

return $d * 3.1415926535898 / 180.0;

}

function GetDistance($lat1, $lng1, $lat2, $lng2)

{

$EARTH_RADIUS = 6384.000;

$radLat1 = rad($lat1);

$radLat2 = rad($lat2);

$a = $radLat1 - $radLat2;

$b = rad($lng1) - rad($lng2);

$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));

$s = $s * $EARTH_RADIUS;

$s = round($s * 10000) / 10000;

return $s;

}

Sphinx的GEO距离搜索 [转载]的更多相关文章

  1. ES7学习笔记(十三)GEO位置搜索

    ES的基本内容介绍的已经差不多了,最后我们再来看看GEO位置搜索,现在大部分APP都有基于位置搜索的功能,比如:我们点外卖,可以按照离我们的距离进行排序,这样可以节省我们的配送费和送餐的时间:还有找工 ...

  2. linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg)

     linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg) 2013-11-10 16:51:14 分类: 系统运维 为什么要写这篇文章? 答:通过常规的三大步(./confi ...

  3. ubuntu上 安装 基于sphinx 的 coreseek 全文搜索

    原生sphinx不支持中文, sphinx-for-chinese匹配中文时也不返回结果 ,真纠结,  最好试了 coreseek,这个能正确返回结果了, 所以记录一下 1 http://www.co ...

  4. solr-geohsah 按照距离搜索分组

    通过solr的domain-import,将mysql的数据通过查询,导入到solr中.java通过使用solrj,链接solr,调用domaininport,并将分页参数设置到domain-impo ...

  5. mysql 全文搜索(转载http://blog.csdn.net/manbujingxin/article/details/6656992)

    前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索.假定数据表名为post,有三列:id.title.content.id是自增长序号,title是varchar,content是te ...

  6. Sphinx速成指南

    目录 1. Sphinx简介 1.1. 什么是全文检索 1.2. 介绍 1.3. Sphinx的特性 2. Sphinx安装(For MySQL) 2.1. Windows下安装 2.2. Linux ...

  7. sphinx中文入门指南 (转自sphinx中文站)

    Sphinx中文入门指南 wuhuiming<blvming在gmail.com>,转载请注明来源和作者 最后修改:2010年1月23日 1.简介 1.1.Sphinx是什么 1.2.Sp ...

  8. Sphinx安装配置应用

    Sphinx 是由俄罗斯人Andrew Aksyonoff开发的一个全文搜索引擎.意图为其他应用提供高速.地空间占用.高结果相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成 ...

  9. Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

随机推荐

  1. JAVA实现webSocket网页聊天室

    一.什么是webSocket WebSocket 是一种网络通信协议,是持久化协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全 ...

  2. mariadb多源主从复制错误跳过.md

    mysql 的主从错误跳过和mariadb的多源主从复制错误跳过操作不同,请注意: 更改会话的default_master_connection变量 STOP SLAVE 'slave_account ...

  3. 01创建线程CreateThread和_beginthreadex

    Windows多线程之线程创建 一. 线程创建函数 CreateThread 1. 函数原型 HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRI ...

  4. salt 模板

    http://www.mamicode.com/info-detail-2297406.html

  5. 【HIHOCODER 1176】 欧拉路·一

    描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...

  6. Leetcode 814. 二叉树剪枝

    题目链接 https://leetcode-cn.com/problems/binary-tree-pruning/description/ 题目描述 给定二叉树根结点 root ,此外树的每个结点的 ...

  7. Activity树图

  8. django 缓存 实现

    由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  9. shell批量修改文件名

    [root@localhost file1]# ls a.htm b.htm c.htm d.htm pl.sh [root@localhost file1]# vi pl.sh #!/bin/bas ...

  10. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...