http://www.cnblogs.com/LBSer/p/3310455.html

http://www.sxrczx.com/pages/my.oschina.net/853294317/blog/296594.html

http://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=5300

受朋友委托写个查找附近人的算法,当然是不会写,不知道从何下手,于是学习了下geohash算法。看懂后开始一步步实现,当然还没有完全写完。不会之处在于:如何对已有的字符串进行前缀匹配的呢?怎么查找附近的人呢?

写了很多注释,怕自己以后看不懂。这也算是第一次体会到算法在工程中的作用。想起以前老师说算法在开发中没用!!表示汗颜、无语。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string>
  4. #include<string.h>
  5. #include<map>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <winsock.h>
  9. #include <mysql.h>
  10. #include <cstring>
  11. using namespace std;
  12. map<string, string> base32;
  13.  
  14. //将纬度、经度二进制化
  15. //纬度范围(-90, 90)
  16. //经度范围(-180, 180)
  17. //传入w,返回二进制编码
  18. //max_step控制递归次数同时也是二进制编码长度
  19. //注意返回的是逆序的字符串 max_step必须是5的倍数
  20. string geohash_w_bin(double w,double left,double right,int step,int max_step)
  21. {
  22. if (step > max_step)
  23. {
  24. return "";
  25. }
  26. double mid = (left + right)*1.0 / ;
  27.  
  28. if (w >= left && w <= mid) {
  29. return geohash_w_bin(w, left, mid,step+,max_step)+"";
  30. }
  31. if (w >= mid && w <= right) {
  32. return geohash_w_bin(w, mid, right,step+,max_step)+"";
  33. }
  34.  
  35. }
  36.  
  37. //合并经纬度
  38. //传入经度和纬度 返回合并的二进制编码
  39. string geohash_merge(string j, string w) {
  40. string s;
  41. for (int i = ; i <j.size(); i++){
  42. s += j[i];
  43. s += w[i];
  44. }
  45. return s;
  46. }
  47.  
  48. //二进制编码base32化
  49. string geohash_base32(string s) {
  50. string temp;
  51. string ans;
  52. for (int i = ; i < s.size(); i++) {
  53. temp += s[i];
  54. if ((i + ) % == ) {
  55. ans+=base32[temp];
  56. temp = "";
  57. }
  58. }
  59.  
  60. return ans;
  61. }
  62.  
  63. //*****************
  64. //将经纬度转为base32 返回base32编码
  65. //w为纬度 j为经度
  66. //*****************
  67. string geohash(double j, double w) {
  68. string s_w="", s_j="";
  69. string s="", ss="";
  70.  
  71. s_w = geohash_w_bin(w, -, , , );
  72. s_j = geohash_w_bin(j, -, , , );
  73.  
  74. reverse(s_w.begin(), s_w.end());
  75. reverse(s_j.begin(), s_j.end());
  76.  
  77. s = geohash_merge(s_j, s_w);
  78. s= geohash_base32(s);
  79. return s;
  80. }
  81.  
  82. //有返回值的数据库写入
  83. MYSQL_RES * executeQuery(char *sql)
  84. {
  85. MYSQL* pConn = mysql_init();
  86. if (!mysql_real_connect(pConn, "localhost", "root", "root", "study1", , , ))
  87. {
  88. goto error;
  89. }
  90. if (mysql_query(pConn, "set names gbk"))
  91. {
  92. goto error;
  93. }
  94. if (mysql_query(pConn, sql))
  95. {
  96. goto error;
  97. }
  98.  
  99. MYSQL_RES *result = mysql_store_result(pConn);
  100. mysql_close(pConn);
  101. return result;
  102.  
  103. error:
  104. cout << "执行出错 " << mysql_error(pConn)<<endl;
  105. //fprintf(cgiOut, "执行出错 %s", mysql_error(pConn));
  106. //printf("执行出错 %s",mysql_error(pConn));
  107. exit:
  108. mysql_close(pConn);
  109. }
  110.  
  111. //无返回值的数据库写入
  112. void executeNonQuery(char * sql)
  113. {
  114. MYSQL* pConn = mysql_init();
  115. if (!mysql_real_connect(pConn, "localhost", "root", "root", "study1", , , ))
  116. {
  117. goto error;
  118. }
  119. if (mysql_query(pConn, "set names gbk"))
  120. {
  121. goto error;
  122. }
  123. if (mysql_query(pConn, sql))
  124. {
  125. goto error;
  126. }
  127. goto exit;
  128. error:
  129. cout << "执行出错 " << mysql_error(pConn) << endl;
  130. /*cgiHeaderContentType("text/html;charset=gbk");
  131. fprintf(cgiOut, "执行出错 %s", mysql_error(pConn));*/
  132. //printf("执行出错 %s",mysql_error(pConn));
  133. exit:
  134. mysql_close(pConn);
  135. }
  136.  
  137. //字符串截取函数
  138. string jiequ(string s, int l, int r) {
  139. string temp;
  140. for (int i = ; i < r; i++)
  141. {
  142. temp += s[i];
  143. }
  144. return temp;
  145. }
  146.  
  147. //输入base32编码,结果打印在屏幕上
  148. //查询编码前缀相同的
  149. void geohash_search(string base32)
  150. {
  151. for (int i = base32.size()-; i > ; i--)
  152. {
  153. string temp_base32 = jiequ(base32, , i);
  154. const char *temp_c_base32 = temp_base32.c_str();
  155. char sql[]; char *c = "%";
  156. int f = ;
  157.  
  158. sprintf(sql, "select * from t_theatre where base32 like '%s%s'", temp_c_base32,c);
  159. MYSQL_RES *result = executeQuery(sql);
  160. MYSQL_ROW row;
  161.  
  162. while (row = mysql_fetch_row(result))
  163. {
  164. char *base32 = row[];
  165. char *name = row[];
  166. cout << base32 << " " << name << endl;
  167. //f = 1;
  168. }
  169.  
  170. /*if (f) {
  171. return;
  172. }*/
  173.  
  174. }
  175.  
  176. }
  177. int main()
  178. {
  179. base32[""] = "";
  180. base32[""] = "";
  181.  
  182. base32[""] = "";
  183. base32[""] = "";
  184.  
  185. base32[""] = "";
  186. base32[""] = "";
  187. base32[""] = "";
  188. base32[""] = "";
  189.  
  190. base32[""] = "";
  191. base32[""] = "";
  192. base32[""] = "b";//
  193. base32[""] = "c";//
  194. base32[""] = "d";//
  195. base32[""] = "e";//
  196. base32[""] = "f";//
  197. base32[""] = "g";//
  198.  
  199. base32[""] = "h";//
  200. base32[""] = "j";//
  201. base32[""] = "k";//
  202. base32[""] = "m";//
  203. base32[""] = "n";//
  204. base32[""] = "p";//
  205. base32[""] = "q";//
  206. base32[""] = "r";//
  207. base32[""] = "s";//
  208. base32[""] = "t";//
  209. base32[""] = "u";//
  210. base32[""] = "v";//
  211. base32[""] = "w";//
  212. base32[""] = "x";//
  213. base32[""] = "y";//
  214. base32[""] = "z";//
  215.  
  216. geohash_search("wttf1y0ewmt3");
  217.  
  218. //select * from where like'wttc%'
  219. //geohash_search("select * from t_theatre where base32 like 'wttc%'");
  220.  
  221. /*while (1) {
  222. double w, j; char name[128], sql[1024];
  223. cin >> j >> w>>name;
  224.  
  225. string base32=geohash(j,w);
  226. const char *ch = base32.c_str();
  227.  
  228. sprintf(sql, "insert into t_theatre(base32,name) values('%s','%s')", ch,name);
  229. executeNonQuery(sql);
  230. }*/
  231.  
  232. ////insert into t_theatre(base32) values()
  233. //char sql[] = "insert into t_theatre(base32) values('klkl')";
  234. //executeNonQuery(sql);
  235. //120.677252 31.316891
  236. //cout << geohash(120.677252, 31.316891) << " 精品酒店" << endl;
  237. //cout << geohash(120.674144, 31.316012) << " 星海实验中学" << endl;
  238. // cout<< geohash(120.648933, 31.374867) << " 相称去政府" <<endl;
  239. //cout << geohash(120.683958, 31.391834) << " 我的位置" <<endl;
  240.  
  241. /*cout<<"111001001100011111101011100011000010110000010001010001000100";*/
  242. ////double a = 90.0;
  243. //string s=geohash_w_bin(104.031601, -180, 180, 1,30);
  244. //reverse(s.begin(), s.end());
  245. //cout << s<<endl;
  246. ////cout << "101010111001001000100101101010";
  247. ////cout << "110010011111101001100000000000";
  248.  
  249. getchar();
  250. return ;
  251. }

最后希望自己踏实学习算法。一张纸叠n次可以比天高,而n张纸叠在一起就不一定了。

C++写geohash的更多相关文章

  1. GeoHash

    查找是我们经常会碰到的问题,以前我做过一个这样的算法,在有序的数列(80万条左右),这批数据是根据维度由小到大排序的,寻找已知数据的位置,并且所相应的运算,由于这个算法要在嵌入式系统中做,如果一次在内 ...

  2. 空间搜索(圆范围)中Geohash编码方案和网格编码方案对比探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 多个项目中实现范围(圆)搜索的方案为:依赖库表中的X和Y字段构 ...

  3. 高效的多维空间点索引算法 — Geohash 和 Google S2

    原文地址:https://www.jianshu.com/p/7332dcb978b2   引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面:     app ...

  4. ABAP实现Geohash

    前几天群里有人问ABAP有没有Geohash函数,用来帮助SAP存储门店位置.实现对附近门店查找的功能.因为没有查到,所以我动手写了一个. Geohash是什么 Geohash是一种公共域地理编码系统 ...

  5. python geohash算法逆地址编码原理初探

    1.geohash有什么用途呢?这几天刚好有个测试任务是关于设备信息位置处理的,里面提及到geohash:抱着测试的警觉性,打算研读一下这个geohash到底是什么?Geohash 是一种地理编码系统 ...

  6. C基础 带你手写 redis adlist 双向链表

    引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...

  7. Geohash 基本知识及 .NET 下计算相邻8个区域编码

    目录 一.简介 二.计算方法 三.GeoHash的精度 四.查找相邻8个区域的Geohash编码(.NET) 五.MySQL 中使用 GeoHash 最近项目中需要搜索周边的 POI 信息,查找的过程 ...

  8. Redis(6)——GeoHash查找附近的人

    像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...

  9. Golang 实现 Redis(9): 使用GeoHash 搜索附近的人

    本文是使用 golang 实现 redis 系列的第九篇,主要介绍如何使用 GeoHash 实现搜索附近的人. 搜索附近的POI是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...

随机推荐

  1. Foundation--NSArray+NSMutableArray

    C语言中数组只能存放一种类型 OC语言中数组可以存放多种类型,但是只能是对象类型,不可以是基本类型 我们实际中最好在一个数组中只存放一种类型的元素 nil表示数组的结尾,所以我们不能填写值为nil的对 ...

  2. iOS 生成.a文件

    一.新建一个工程,选择Cocoa Touch Static Library. 二. 三. 四. 五. 六. 七. 八. 九. 十. 十一. 十二. 十三.打开终端,输入以下命令将真机和模拟器中的.a合 ...

  3. Ubuntu修改计算机名称造成无法解析主机问题解决方法

    在通过修改/etc/hostname文件方法修改计算机名称后导致有时候出现无法解析主机的问题. 解决方法: 找到/etc/hosts文件,打开找到如下一行 127.0.1.1       旧主机名 将 ...

  4. MySQL 初学笔记 ② -- MySQL安装

    1. Ubuntu安装 sudo apt-get install mysql-server //安装mysql服务 sudo apt-get install mysql-client // sudo ...

  5. 创建view

    IF EXISTS(SELECT 1 FROM sys.views WHERE name='V_PARENT_CLIENT') DROP VIEW V_PARENT_CLIENT GO create ...

  6. Nexus远程Maven仓库索引下载教程

    下载Maven仓库索引有两种方式: 一.手动下载 首先将索引下载到本地,下载地址:nexus-maven-repository-index.zip 解压索引压缩包,将里面内容全部拷贝   关闭当前Ne ...

  7. PC远程调试移动设备(转载)

    我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题--调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...

  8. [Linux Kernel]查看CentOS版本方法

    查看CentOS版本方法  有以下命令可以查看:   # lsb_release -a LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics- ...

  9. bash 变量使用技巧

  10. Linux下 nginx + 最新版php5.5 安装配置详解

    1.nginx的安装: 首先nginx的安装需要依赖最基础的三个包,这里面我们不设计更多的扩展模块,只是安装最基础的三个包, zlib 此包主要是对http内容进行gzip压缩,减少网络传输流量 PC ...