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算法。看懂后开始一步步实现,当然还没有完全写完。不会之处在于:如何对已有的字符串进行前缀匹配的呢?怎么查找附近的人呢?

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

 #include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<map>
#include <stdlib.h>
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <cstring>
using namespace std;
map<string, string> base32; //将纬度、经度二进制化
//纬度范围(-90, 90)
//经度范围(-180, 180)
//传入w,返回二进制编码
//max_step控制递归次数同时也是二进制编码长度
//注意返回的是逆序的字符串 max_step必须是5的倍数
string geohash_w_bin(double w,double left,double right,int step,int max_step)
{
if (step > max_step)
{
return "";
}
double mid = (left + right)*1.0 / ; if (w >= left && w <= mid) {
return geohash_w_bin(w, left, mid,step+,max_step)+"";
}
if (w >= mid && w <= right) {
return geohash_w_bin(w, mid, right,step+,max_step)+"";
} } //合并经纬度
//传入经度和纬度 返回合并的二进制编码
string geohash_merge(string j, string w) {
string s;
for (int i = ; i <j.size(); i++){
s += j[i];
s += w[i];
}
return s;
} //二进制编码base32化
string geohash_base32(string s) {
string temp;
string ans;
for (int i = ; i < s.size(); i++) {
temp += s[i];
if ((i + ) % == ) {
ans+=base32[temp];
temp = "";
}
} return ans;
} //*****************
//将经纬度转为base32 返回base32编码
//w为纬度 j为经度
//*****************
string geohash(double j, double w) {
string s_w="", s_j="";
string s="", ss=""; s_w = geohash_w_bin(w, -, , , );
s_j = geohash_w_bin(j, -, , , ); reverse(s_w.begin(), s_w.end());
reverse(s_j.begin(), s_j.end()); s = geohash_merge(s_j, s_w);
s= geohash_base32(s);
return s;
} //有返回值的数据库写入
MYSQL_RES * executeQuery(char *sql)
{
MYSQL* pConn = mysql_init();
if (!mysql_real_connect(pConn, "localhost", "root", "root", "study1", , , ))
{
goto error;
}
if (mysql_query(pConn, "set names gbk"))
{
goto error;
}
if (mysql_query(pConn, sql))
{
goto error;
} MYSQL_RES *result = mysql_store_result(pConn);
mysql_close(pConn);
return result; error:
cout << "执行出错 " << mysql_error(pConn)<<endl;
//fprintf(cgiOut, "执行出错 %s", mysql_error(pConn));
//printf("执行出错 %s",mysql_error(pConn));
exit:
mysql_close(pConn);
} //无返回值的数据库写入
void executeNonQuery(char * sql)
{
MYSQL* pConn = mysql_init();
if (!mysql_real_connect(pConn, "localhost", "root", "root", "study1", , , ))
{
goto error;
}
if (mysql_query(pConn, "set names gbk"))
{
goto error;
}
if (mysql_query(pConn, sql))
{
goto error;
}
goto exit;
error:
cout << "执行出错 " << mysql_error(pConn) << endl;
/*cgiHeaderContentType("text/html;charset=gbk");
fprintf(cgiOut, "执行出错 %s", mysql_error(pConn));*/
//printf("执行出错 %s",mysql_error(pConn));
exit:
mysql_close(pConn);
} //字符串截取函数
string jiequ(string s, int l, int r) {
string temp;
for (int i = ; i < r; i++)
{
temp += s[i];
}
return temp;
} //输入base32编码,结果打印在屏幕上
//查询编码前缀相同的
void geohash_search(string base32)
{
for (int i = base32.size()-; i > ; i--)
{
string temp_base32 = jiequ(base32, , i);
const char *temp_c_base32 = temp_base32.c_str();
char sql[]; char *c = "%";
int f = ; sprintf(sql, "select * from t_theatre where base32 like '%s%s'", temp_c_base32,c);
MYSQL_RES *result = executeQuery(sql);
MYSQL_ROW row; while (row = mysql_fetch_row(result))
{
char *base32 = row[];
char *name = row[];
cout << base32 << " " << name << endl;
//f = 1;
} /*if (f) {
return;
}*/ } }
int main()
{
base32[""] = "";
base32[""] = ""; base32[""] = "";
base32[""] = ""; base32[""] = "";
base32[""] = "";
base32[""] = "";
base32[""] = ""; base32[""] = "";
base32[""] = "";
base32[""] = "b";//
base32[""] = "c";//
base32[""] = "d";//
base32[""] = "e";//
base32[""] = "f";//
base32[""] = "g";// base32[""] = "h";//
base32[""] = "j";//
base32[""] = "k";//
base32[""] = "m";//
base32[""] = "n";//
base32[""] = "p";//
base32[""] = "q";//
base32[""] = "r";//
base32[""] = "s";//
base32[""] = "t";//
base32[""] = "u";//
base32[""] = "v";//
base32[""] = "w";//
base32[""] = "x";//
base32[""] = "y";//
base32[""] = "z";// geohash_search("wttf1y0ewmt3"); //select * from where like'wttc%'
//geohash_search("select * from t_theatre where base32 like 'wttc%'"); /*while (1) {
double w, j; char name[128], sql[1024];
cin >> j >> w>>name; string base32=geohash(j,w);
const char *ch = base32.c_str(); sprintf(sql, "insert into t_theatre(base32,name) values('%s','%s')", ch,name);
executeNonQuery(sql);
}*/ ////insert into t_theatre(base32) values()
//char sql[] = "insert into t_theatre(base32) values('klkl')";
//executeNonQuery(sql);
//120.677252 31.316891
//cout << geohash(120.677252, 31.316891) << " 精品酒店" << endl;
//cout << geohash(120.674144, 31.316012) << " 星海实验中学" << endl;
// cout<< geohash(120.648933, 31.374867) << " 相称去政府" <<endl;
//cout << geohash(120.683958, 31.391834) << " 我的位置" <<endl; /*cout<<"111001001100011111101011100011000010110000010001010001000100";*/
////double a = 90.0;
//string s=geohash_w_bin(104.031601, -180, 180, 1,30);
//reverse(s.begin(), s.end());
//cout << s<<endl;
////cout << "101010111001001000100101101010";
////cout << "110010011111101001100000000000"; getchar();
return ;
}

最后希望自己踏实学习算法。一张纸叠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. <转>科普CPU Cache line

    转载于http://coolshell.cn/articles/10249.html CPU cache一直是理解计算机体系架构的重要知识点,也是并发编程设计中的技术难点,而且相关参考资料如同过江之鲫 ...

  2. jquery 项目所用

    <script> $(document).ready(function(){ $.ajax({ type:'post', url :'interface.ajax.php', data:{ ...

  3. [汇编语言]-第七章 用[bx+idata]的方式进行数组的处理

    1- 转化为大写 方法一: assume cs:code,ds:data data segment db 'BaSiC' db 'MinIX' data ends code segment start ...

  4. JavaScript 数组操作备忘

    数组的定义: 方法1. var mycars=new Array()mycars[0]="Saab"mycars[1]="Volvo"mycars[2]=&qu ...

  5. Mongodb 安装和启动

    一.首先去官网下载对应的的mongodb ,本人的操作系统是win7 64位 mongodb-win32-x86_64-2.0.6.rar 解压安装:进入到bin目录下,会看到N多的.exe文件 二. ...

  6. windows程序设计读书笔记2——字符显示1

    本程序使用GetSystemMetrics获取windows各种图像选项,并输出字符到窗口中. #define WINVER 0x0500 #include <windows.h> #in ...

  7. Android小记之--android:listSelector

    使用ListView和GridView时,经常使用android:listSelector来使item被选中时的状态.但如果不配合android:drawSelectorOnTop来使用可能达不到想要 ...

  8. 浅谈38K红外发射接受编码

    之前做接触过一次红外遥控器,现在有空想用简单的话来聊一聊,下面有错误的地方欢迎改正指出:1:红外的概念不聊,那是一种物理存在.以下聊38K红外发射接收,主要讲可编程的红外编码.2:红外遥控 红外遥控首 ...

  9. Unix/Linux环境C编程入门教程(28) 日期时间那些事儿

    记得这个专题第一篇我们写过一个程序运行时间的程序,采用库函数提供的clock()模拟做程序测试.本篇介绍的函数也是和时间相关,但是没有clock的细致,而是提供的系统时间和日期. 1.asctime( ...

  10. 杭电oj1219 AC Me

    Tips:本题中,输入字符串之后,直接从头到尾处理一遍,调用函数判断是否是字母,不要自己写循环判断是否为字母,易超时! 不过本题中有一个疑问,自己最开始用C写的,一直是Time Limit Excee ...