以前开发一个项目有这样一个需求,货主找附件的车,原来是通过使经纬度进行匹配的,

因为经纬度是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的简单使用例子相关推荐

  1. java自定义注解简单小例子

    接上例子,新建Java Project 1.新建Interface,建完在名字前加@,就成了自定义的注解 [java] view plaincopy import java.lang.annotati ...

  2. java applet 一个简单的例子(applet+html)

    java applet是一个类,其层次结构如下图:   类 JApplet  java.lang.Object    java.awt.Component        java.awt.Contai ...

  3. java泛型的几个例子

    2019独角兽企业重金招聘Python工程师标准>>> 1.泛型类 1.1普通泛型 package test.lujianing; /*** 泛型类* @param <T> ...

  4. 一个简单的例子看java线程机制

    一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...

  5. java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园

    最近因为要进行TeamCenter二次开发(胖客户端定制),所有要开始研究Java了.因此突发奇想为什么不能使用Java进行二次开发呢?现在对UG进行的开发以C/C++应用为主.大多数使用的是原来的U ...

  6. java txtreader_一个简单的Java读写文件例子

    针对txt文件的读写可以使用java的读写操作.以下是一个简单的例子: import java.io.BufferedReader; import java.io.BufferedWriter; im ...

  7. java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...

    一个简单的例子理解java继承.成员函数重写.类型转换 1.继承简介 举一个简单的例子:笔分为很多种,比如毛笔.钢笔.圆珠笔等等,这些笔都有一些相同的属性比如长度.笔迹的粗细等等:但他们也有不同的特点 ...

  8. java实现 GeoHash 算法(GeoHash位数与距离对应关系)

    最近遇到一个问题,需要根据基站的经纬度给基站进行分组,两个基站距离相差10米内分到一组,最开始是通过两层循环处理的(笛卡尔积),这样的速度非常慢.最开始因为这个是偶尔还会运行一次,对效率也没要求,项目 ...

  9. java实现死锁简单例子,Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁. 代码如下: Program.java /** * 程序类 * @author michael * */ public c ...

最新文章

  1. spring 扫描所有_SpringBoot和Spring到底有没有本质的不同?
  2. 前端开发必须要了解的CSS原理
  3. 定义整型数组_C++数组的定义与初始化(学习笔记:第6章 01)
  4. AndroidJava try-catch-finally正确用法
  5. vue取url路径传参_vue不通过路由直接获取url中参数的方法示例
  6. RSA大会:中国信息安全的“走出去”与“学回来”
  7. Android Wear 发布 4 年终改名,继续艰难存活
  8. Python Selenium 浏览器点击操作
  9. Compass被墙后如何安装安装
  10. qq服务器上的文件删除后如何恢复,QQ文件失效怎么恢复(过期的QQ文件如何申请恢复)...
  11. 恭喜腾佑当选“河南省企业上云推进联盟”理事单位!
  12. 3个小时学会wordpress模板制作
  13. deepin个性化设置
  14. 坚持与展望——科泰华捷董事长陈榕专访
  15. android H264(3): 流媒体播放器设计方案
  16. 网络安全应急响应----10、内存分析
  17. 北美科技公司“隐藏福利”大盘点:看完我彻底酸了...
  18. 微信分享网页不显示缩略图
  19. Metasploit技术(四)——进程迁移
  20. 百度网盘开放平台接口,上传、下载等功能PHP详细操作

热门文章

  1. 卷积核大小、个数,卷积层数是如何确定的 ?
  2. 【Android自定义View】车牌号输入法
  3. Java数据结构与算法---斐波那契数列Fibonacci
  4. 工作5年,我的互联网工具箱(30个提升办公效率的神器)
  5. 计算机应用基础闲情赋答案,计算机应用基础网络统考试卷 答案.doc
  6. 以华泰、国泰君安、平安证券为例:探究券商APP会员体系
  7. 高空坠球,皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
  8. 【计算机网络】思科实验(9):动态路由协议RIPv2
  9. COA-2019-第十章 Error Correction
  10. 简述SpringBoot Starter原理及自定义实现