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. Model注解的后台原理

    Asp.net MVC的验证特性是由模型绑定器.模型元数据.模型验证器和模型状态组成的协调系统的一部分. 1.验证和模型绑定 默认情况下,Asp.net MVC框架在模型绑定石执行验证逻辑,在操作方法 ...

  2. 如何写一个数据库How do you build a database?(转载)

    转载自:http://www.reddit.com/r/Database/comments/27u6dy/how_do_you_build_a_database/ciggal8 Its a great ...

  3. Core Bluetooth 概述 【官方文档翻译】

    Core Bluetooth 框架在Mac和iOS平台,为配备了低功耗蓝牙无线技术的设备提供了进行通信所需要的类.例如,您的应用程序可以发现,探索,和低功耗的外围设备进行交互,如心率监视器.数字温控器 ...

  4. 【IOS学习基础】归档和解档

    一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅 ...

  5. IOS中设置状态栏的状态

    IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...

  6. C语言undefined behaviour未定义行为

    C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为.同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又 ...

  7. C#面试题总结——程序设计基础

    一.类型与变量 1.C#支持哪几个预定义的值类型? 主要包括五个类型:整数,浮点数,字符型,bool类型以及decimal型(小数型).其中每一个类型分别有多个内置类型组成. 2.C#支持哪几个预定义 ...

  8. Java中的static关键字

    写在前面: 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰 ...

  9. synchronized 方式实现监控器中数据成员的同步

    要对监控器中的数据成员进行访问,在考虑到多线程的情况下必须使用同步代码块来改变监控器中数据成员的值: synchronized (mAdapterLocking) { if (pEvery == 0) ...

  10. Leetcode算法刷题:第100题 Same Tree

    Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...