geohash java,GeoHash的简单使用例子
以前开发一个项目有这样一个需求,货主找附件的车,原来是通过使经纬度进行匹配的,
因为经纬度是2个字段,所以匹配起来性能比较低,有一个geohash算法可以将二维的经纬度匹配
转为一维的匹配,降低查询效率.详细了解请参见相关博文
背景
网上百度的geohash java版的代码发现计算并不准确
于是去maven库查询了一下发现有对应的jar包,而且写的比较详细。
对应pom文件
ch.hsr
geohash
1.0.10
简单使用例子import ch.hsr.geohash.GeoHash;
import com.lin.jedisFactory.JedisPoolUtil;
import redis.clients.jedis.Jedis;
import java.util.Set;
/**
* Created by Kevin on 2015/2/4.
*/
public class GeoHashTest {
public static void main(String[] args) {
/*假设货主的纬经度,南开区*/
double lat1 = 39.145609;
double lon1 = 117.154471;
/*假设司机1的纬经度,和平区*/
double lat2 = 39.122661;
double lon2 = 117.220299;
/*假设司机2的纬经度东丽*/
double lat3 = 39.093657;
double lon3 = 117.320047;
GeoHash geoHash1 = GeoHash.withCharacterPrecision(lat1,lon1,12);
GeoHash geoHash2 = GeoHash.withCharacterPrecision(lat2,lon2,12);
GeoHash geoHash3 = GeoHash.withCharacterPrecision(lat3,lon3,12);
System.out.println("南开区:"+geoHash1.toBase32());
System.out.println("和平区:"+geoHash2.toBase32());
System.out.println("东丽区:"+geoHash3.toBase32());
double distance1 = getDistance(lat1, lon1, lat2, lon2);
double distance2 = getDistance(lat1, lon1, lat3, lon3);
System.out.println("南开-和平 距离:" + distance1);
System.out.println("南开-东丽 距离:" + distance2);
String prefix = geoHash1.toBase32().substring(0,4);
System.out.println(prefix);
Jedis jedis = JedisPoolUtil.getJedis();
jedis.sadd(geoHash2.toBase32().substring(0,4), "siji1");
jedis.sadd(geoHash3.toBase32().substring(0,4), "siji2");
Set ret = jedis.smembers(prefix);
JedisPoolUtil.release(jedis);
System.out.println(ret);
}
/**
* @param lat1 起始地纬度
* @param lon1 起始地经度
* @param lat2 目的地纬度
* @param lon2 目的地经度
* @return
*/
public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
if (Math.abs(lat1) > 90 || Math.abs(lon1) > 180
|| Math.abs(lat2) > 90 || Math.abs(lon2) > 180) {
throw new IllegalArgumentException("The supplied coordinates are out of range.");
}
int R = 6378137;
double latRad1 = Math.toRadians(lat1);
double lonRad1 = Math.toRadians(lon1);
double latRad2 = Math.toRadians(lat2);
double lonRad2 = Math.toRadians(lon2);
//结果
double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin((latRad1 - latRad2) / 2), 2)
+ Math.cos(latRad1) * Math.cos(latRad2) * Math.pow(Math.sin((lonRad1 - lonRad2) / 2), 2)))*R;
distance = Math.round(distance * 10000)/10000;
return Math.round(distance);
}
}
这里面给的GeoHash的构造方法时protected的,所以实例化不出来的,获取一个对象的方法对应的给了2种。
一个是withBitPrecision,里面的numberOfBits参数不好给,就是算出的那个二进制位数。
另一个是withCharacterPrecision,里面的numberOfCharacters就是给的字符串位数,最多12位,如果要取wwgqmsvc51ze对应的前四位,可以传值为4,我们用这个比较好。
geohash java,GeoHash的简单使用例子相关推荐
- java自定义注解简单小例子
接上例子,新建Java Project 1.新建Interface,建完在名字前加@,就成了自定义的注解 [java] view plaincopy import java.lang.annotati ...
- java applet 一个简单的例子(applet+html)
java applet是一个类,其层次结构如下图: 类 JApplet java.lang.Object java.awt.Component java.awt.Contai ...
- java泛型的几个例子
2019独角兽企业重金招聘Python工程师标准>>> 1.泛型类 1.1普通泛型 package test.lujianing; /*** 泛型类* @param <T> ...
- 一个简单的例子看java线程机制
一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...
- java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园
最近因为要进行TeamCenter二次开发(胖客户端定制),所有要开始研究Java了.因此突发奇想为什么不能使用Java进行二次开发呢?现在对UG进行的开发以C/C++应用为主.大多数使用的是原来的U ...
- java txtreader_一个简单的Java读写文件例子
针对txt文件的读写可以使用java的读写操作.以下是一个简单的例子: import java.io.BufferedReader; import java.io.BufferedWriter; im ...
- java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...
一个简单的例子理解java继承.成员函数重写.类型转换 1.继承简介 举一个简单的例子:笔分为很多种,比如毛笔.钢笔.圆珠笔等等,这些笔都有一些相同的属性比如长度.笔迹的粗细等等:但他们也有不同的特点 ...
- java实现 GeoHash 算法(GeoHash位数与距离对应关系)
最近遇到一个问题,需要根据基站的经纬度给基站进行分组,两个基站距离相差10米内分到一组,最开始是通过两层循环处理的(笛卡尔积),这样的速度非常慢.最开始因为这个是偶尔还会运行一次,对效率也没要求,项目 ...
- java实现死锁简单例子,Java死锁的简单例子
Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁. 代码如下: Program.java /** * 程序类 * @author michael * */ public c ...
最新文章
- spring 扫描所有_SpringBoot和Spring到底有没有本质的不同?
- 前端开发必须要了解的CSS原理
- 定义整型数组_C++数组的定义与初始化(学习笔记:第6章 01)
- AndroidJava try-catch-finally正确用法
- vue取url路径传参_vue不通过路由直接获取url中参数的方法示例
- RSA大会:中国信息安全的“走出去”与“学回来”
- Android Wear 发布 4 年终改名,继续艰难存活
- Python Selenium 浏览器点击操作
- Compass被墙后如何安装安装
- qq服务器上的文件删除后如何恢复,QQ文件失效怎么恢复(过期的QQ文件如何申请恢复)...
- 恭喜腾佑当选“河南省企业上云推进联盟”理事单位!
- 3个小时学会wordpress模板制作
- deepin个性化设置
- 坚持与展望——科泰华捷董事长陈榕专访
- android H264(3): 流媒体播放器设计方案
- 网络安全应急响应----10、内存分析
- 北美科技公司“隐藏福利”大盘点:看完我彻底酸了...
- 微信分享网页不显示缩略图
- Metasploit技术(四)——进程迁移
- 百度网盘开放平台接口,上传、下载等功能PHP详细操作
热门文章
- 卷积核大小、个数,卷积层数是如何确定的 ?
- 【Android自定义View】车牌号输入法
- Java数据结构与算法---斐波那契数列Fibonacci
- 工作5年,我的互联网工具箱(30个提升办公效率的神器)
- 计算机应用基础闲情赋答案,计算机应用基础网络统考试卷 答案.doc
- 以华泰、国泰君安、平安证券为例:探究券商APP会员体系
- 高空坠球,皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
- 【计算机网络】思科实验(9):动态路由协议RIPv2
- COA-2019-第十章 Error Correction
- 简述SpringBoot Starter原理及自定义实现