C++写geohash
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的更多相关文章
- GeoHash
查找是我们经常会碰到的问题,以前我做过一个这样的算法,在有序的数列(80万条左右),这批数据是根据维度由小到大排序的,寻找已知数据的位置,并且所相应的运算,由于这个算法要在嵌入式系统中做,如果一次在内 ...
- 空间搜索(圆范围)中Geohash编码方案和网格编码方案对比探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 多个项目中实现范围(圆)搜索的方案为:依赖库表中的X和Y字段构 ...
- 高效的多维空间点索引算法 — Geohash 和 Google S2
原文地址:https://www.jianshu.com/p/7332dcb978b2 引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面: app ...
- ABAP实现Geohash
前几天群里有人问ABAP有没有Geohash函数,用来帮助SAP存储门店位置.实现对附近门店查找的功能.因为没有查到,所以我动手写了一个. Geohash是什么 Geohash是一种公共域地理编码系统 ...
- python geohash算法逆地址编码原理初探
1.geohash有什么用途呢?这几天刚好有个测试任务是关于设备信息位置处理的,里面提及到geohash:抱着测试的警觉性,打算研读一下这个geohash到底是什么?Geohash 是一种地理编码系统 ...
- C基础 带你手写 redis adlist 双向链表
引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...
- Geohash 基本知识及 .NET 下计算相邻8个区域编码
目录 一.简介 二.计算方法 三.GeoHash的精度 四.查找相邻8个区域的Geohash编码(.NET) 五.MySQL 中使用 GeoHash 最近项目中需要搜索周边的 POI 信息,查找的过程 ...
- Redis(6)——GeoHash查找附近的人
像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...
- Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
本文是使用 golang 实现 redis 系列的第九篇,主要介绍如何使用 GeoHash 实现搜索附近的人. 搜索附近的POI是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...
随机推荐
- Foundation--NSArray+NSMutableArray
C语言中数组只能存放一种类型 OC语言中数组可以存放多种类型,但是只能是对象类型,不可以是基本类型 我们实际中最好在一个数组中只存放一种类型的元素 nil表示数组的结尾,所以我们不能填写值为nil的对 ...
- iOS 生成.a文件
一.新建一个工程,选择Cocoa Touch Static Library. 二. 三. 四. 五. 六. 七. 八. 九. 十. 十一. 十二. 十三.打开终端,输入以下命令将真机和模拟器中的.a合 ...
- Ubuntu修改计算机名称造成无法解析主机问题解决方法
在通过修改/etc/hostname文件方法修改计算机名称后导致有时候出现无法解析主机的问题. 解决方法: 找到/etc/hosts文件,打开找到如下一行 127.0.1.1 旧主机名 将 ...
- MySQL 初学笔记 ② -- MySQL安装
1. Ubuntu安装 sudo apt-get install mysql-server //安装mysql服务 sudo apt-get install mysql-client // sudo ...
- 创建view
IF EXISTS(SELECT 1 FROM sys.views WHERE name='V_PARENT_CLIENT') DROP VIEW V_PARENT_CLIENT GO create ...
- Nexus远程Maven仓库索引下载教程
下载Maven仓库索引有两种方式: 一.手动下载 首先将索引下载到本地,下载地址:nexus-maven-repository-index.zip 解压索引压缩包,将里面内容全部拷贝 关闭当前Ne ...
- PC远程调试移动设备(转载)
我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题--调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...
- [Linux Kernel]查看CentOS版本方法
查看CentOS版本方法 有以下命令可以查看: # lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics- ...
- bash 变量使用技巧
- Linux下 nginx + 最新版php5.5 安装配置详解
1.nginx的安装: 首先nginx的安装需要依赖最基础的三个包,这里面我们不设计更多的扩展模块,只是安装最基础的三个包, zlib 此包主要是对http内容进行gzip压缩,减少网络传输流量 PC ...