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. 获取设备、APP的一些信息

    获取设备的一些信息: UIDevice *device = [UIDevice currentDevice]; @property(nonatomic,readonly,strong) NSStrin ...

  2. BullseyeCoverage:代码覆盖率。

    1,安装和使用步骤 阅读READER文档.并安装(非常简单,README中有详细指令说明) 配置环境:同样可以阅读相关文档. 增加PATH环境变量.需要注意,此路径需要增加在PATH的最前列.即< ...

  3. ecshop物料库存管理

    1.创建物流库存表.sql语句: CREATE TABLE IF NOT EXISTS `emws_materials` (`id` mediumint(8) unsigned NOT NULL au ...

  4. 正式学习React (六) 项目篇

    https://github.com/huenchao/yingshili 或者点这里 注意事项看ReadME.md 会持续更新,反正就是把之前分析的redux react-redux都用一下,然后会 ...

  5. requirejs--源码分析

    /*---------------------------------------start-------------------------------*/ req({}); // num == 1 ...

  6. android HttpGet 另开线程获取网络数据问题

    android跨线程通讯可以使用android.os.Handler-android.os.Message这两类对象完成. public static void getResultForHttpGet ...

  7. linux之cal命令

    现在时间2014/11/25 21:36 让我们简单了解下日历命令的用法 1.显示当月的日历 2.显示一年的日历 3.显示2014年2月的月历

  8. flex——dictionary跟Object的区别与遍历

    AS3中Object和 Dictionary都可以用来保存key-value形式的数据,Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键.例如 ...

  9. MD5和SHA512Managed ——哈希算法

    本文来自:http://www.cnblogs.com/chuncn/archive/2008/02/26/1082418.html C#的哈希 哈希算法是啥?哈希英文hash,是一种数学算法,它能把 ...

  10. C# 3.0 { get; set; } 默认值

    .NET Framework 3.5 使用的是 C# 3.0,C# 3.0 有一些新的语言特性,其中有一项就是快捷属性. 之前的写法: private int _id = 0;public int I ...