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是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...
随机推荐
- 工厂方法配置jdbc连接
package 配置方式.dbUtils; import java.io.InputStream; import java.sql.Connection; import java.sql.Driver ...
- 解决升级Xcode后插件不能使用的问题
从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性.因此Xcode版本更新之后需要在插件的Info.plist文件中添加当前Xcode的UUID. 具体步骤如下: 1.获取Xcode的 ...
- 在T-SQL语句中访问远程数据库(openrowset/opendatasource/openquery)
1.启用Ad Hoc Distributed Queries 在使用openrowset/opendatasource前搜先要启用Ad Hoc Distributed Queries服务,因为这个服务 ...
- 在windows下安装mysql
本文主要讲mysql解压版在windows下的安装和配置,在官网http://www.mysql.com/下载mysql-cluster-gpl-7.3.7-winx64.zip,然后将mysql解压 ...
- jquery学习之笔记一
jquery是继prototype后一个很好用的javascript库.jquery是一个轻量级的库,拥有强大的选择器,出色的DOM操作,可靠的事件处理,完善的兼容性和链式操作等功能. window. ...
- ORA-04092: COMMIT 不能在触发器中
触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务 ...
- CodeForces 214B Hometask
本题求n个数组成的大数,要求是2,3,5的倍数. 因为是2 和5 的倍数,所以个位为 0:所以若n个数中没有0,直接输出-1: 难点就是要求为3 的倍数. 因为若某个数为3的倍数,则其各位数的和必然是 ...
- 关于Asp.net超时,延长读取sql server数据库的超时时间!(已解决)
昨天,接到客户反映说应用报“超时时间已到.在操作完成之前超时时间已过或服务器未响应”问题.从网上了一些资料,发现这个问题还是很普遍的.主要有以下两种解决方法: 第一种方法:在web.config中加上 ...
- Oracle EBS-SQL (QA-3):检查已检验未入库.sql
DEFINE RECE="%" SELECT rsh.receipt_num 收据号, ...
- struts2_20140720
有这样的感觉:前面学的东西弄会了,过了一段时间又感觉陌生了,还要重新开始.这次想个好办法,把写的程序用博客记录下来,把自己的学历历程用博客的形式呈现出来,一来可以方便复习,而来可以以后开发程序可以快速 ...