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. 11个有用的移动网页开发App和HTML5框架

    在过去的两年里,触屏设备飞速增长.iOS和Android设备让开发者和设计师开始重新思考他们的网页应用,以提供更好的触屏体验. 移动Web应用相对于本地的App有很多优势,虽然也有很多设计和开发上的挑 ...

  2. java中List的用法

    list的添加删除等操作 import java.util.*; class TestList { public static void main(String[] args) { List<S ...

  3. Sublime Text插件FileHeader实践

    FileHeader是一个文件模板插件,可以定制各种文件模板和文件头部信息,保存时可以自动更新文件的修改时间.在多人开发中这个功能相当实用. 具体介绍我就不细说了,主要是分享一下在使用FileHead ...

  4. 微信SDK导入报错 Undefined symbols for architecture i386:"operator delete[](void*)", referenced from:

    异常信息: Undefined symbols for architecture i386:  "operator delete[](void*)", referenced fro ...

  5. Python和C#基本算法实现对比

    最近在学习python,很多入门的例子又写了一遍,基本上是C#和Python都写了一遍,对比发现语言真是相通啊,只是语法不同而已. python开发也是用的VS,很好用,特别是代码段运行,选中一段py ...

  6. oracle 如何搜索当前用户下所有表里含某个值的字段?(转)

    oracle 如何搜索当前用户下所有表里含某个值的字段? create or replace procedure MY_Pro_SearchKeyWord is  v_sql VARCHAR2(400 ...

  7. linux学习笔记之sudo

    引用A:http://blog.chinaunix.net/uid-15811445-id-149961.html 引用B:http://os.51cto.com/art/201307/404879. ...

  8. Visual Studio宏注释模板

    前言 有时写代码需要写注释的时候 甚是苦恼 写吧 怕麻烦 不写吧 似乎这代码估计自己都看不懂 权衡之下 似乎找一个自动写注释的方法最靠谱 一直在VS下开发 偶尔听人说过有一个宏工具可以帮助开发者快速注 ...

  9. 正确合理的建立MYSQL数据库索引

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整 ...

  10. ubuntu安装jira步骤

    背景:前些日子在原来的一台云主机上已经部署了一个jira系统,使用一段时间后发现jira占用很多的系统资源,导致主机上的其他服务无法正常工作,于是老大新注册了一个云主机专门用于运行jira,可见公司对 ...