Java应用:经纬度匹配(geohash加密)
本文采用http://gc.ditu.aliyun.com地址进行经纬度匹配,无数量限制
如果给定经纬度进行geohash加密操作,先解密得到相应gps坐标,具体程序如下所示:
import java.text.DecimalFormat;
import java.util.BitSet;
import java.util.HashMap; public class Lon_Lat { public static String location;
public static String strlatlon[]; private static int numbits=5*7;
final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
final static HashMap<Character,Integer> lookup=new HashMap<Character,Integer>();
static {
int i = 0;
for (char c : digits) {
lookup.put(c, i++);
}
} public static void main(String ages) {
double[] latlon=new Lon_Lat().decode(ages);
Location loc=new Location();
strlatlon=new String[2]; strlatlon[0]=String.valueOf(latlon[0]);
strlatlon[1]=String.valueOf(latlon[1]);
loc.main(strlatlon); location=loc.location; //System.out.println("纬度:"+latlon[0]+"\n经度:"+latlon[1]+"\n地址:"+location);
}
/*
* 将GeoHash字串解码成经纬度
*/
public double[] decode(String geohash) {
StringBuffer buffer=new StringBuffer();
for(char c:geohash.toCharArray()) {
int i=lookup.get(c);
String _buffer=Integer.toBinaryString(i);
//_buffer=String.format("%05d",_buffer);
if(_buffer.length()==1)
_buffer="0000"+_buffer;
else if(_buffer.length()==2)
_buffer="000"+_buffer;
else if(_buffer.length()==3)
_buffer="00"+_buffer;
else if(_buffer.length()==4)
_buffer="0"+_buffer;
//System.out.println("i:"+i+" "+_buffer);
buffer.append(_buffer); }
//System.out.println(buffer); BitSet lonset=new BitSet();
BitSet latset=new BitSet(); int j=0;
for(int i=0;i<numbits*2;i+=2) {
boolean isSet=false;
if(i<buffer.length())
isSet=buffer.charAt(i)=='1';
lonset.set(j++, isSet);
} j=0;
for(int i=1;i<numbits*2;i+=2) {
boolean isSet=false;
if(i<buffer.length())
isSet=buffer.charAt(i)=='1';
latset.set(j++, isSet);
} double lat=decode(latset,-90,90);
double lon=decode(lonset,-180,180); DecimalFormat df=new DecimalFormat("0.000000");
return new double[] {Double.parseDouble(df.format(lat)),Double.parseDouble(df.format(lon))};
} /*
* 根据二进制编码串和指定的数值变化范围计算得到经纬值
*/
private double decode(BitSet bs,double floor,double ceiling) {
double mid=0;
for(int i=0;i<bs.length();i++) {
mid=(floor+ceiling)/2;
if(bs.get(i))
floor=mid;
else
ceiling=mid;
}
return mid;
} }
根据上述得到的地址进行地址匹配,具体程序如下:
import java.net.URL;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject; public class Location {
public static String location;
public static void main(String ags[]) { String add=getAdd("40.072632","116.424866");
//System.out.println(add.substring(0,1)); JSONObject jsonObject=JSONObject.fromObject(add);
JSONArray jsonArray=JSONArray.fromObject(jsonObject.getString("addrList"));
JSONObject j_2=JSONObject.fromObject(jsonArray.get(1));
String allAdd=j_2.getString("admName");
String addr=j_2.getString("addr");
String name=j_2.getString("name"); //String loc=allAdd+addr+name;
String arr[]=allAdd.split(",");
if(arr.length==3) {
if(arr[0]==arr[1])
location=arr[0]+arr[2]+addr+name;
else
location=arr[0]+arr[1]+arr[2]+addr+name;
}else {
if(arr[0]==arr[1])
location=arr[0]+addr+name;
else
location=arr[0]+arr[1]+addr+name;
} System.out.println(allAdd+addr+name);
System.out.println("省:"+arr[0]+"\n市:"+arr[1]+"\n区:"+arr[2]+"\n"+name);
}
public static String getAdd(String lat,String lon) {
String urlString="http://gc.ditu.aliyun.com/regeocoding?l="+lat+","+lon+"type=010";
String res="";
try {
URL url=new URL(urlString);
java.net.HttpURLConnection conn=(java.net.HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
java.io.BufferedReader in=new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),"UTF-8"));
String line;
while((line=in.readLine())!=null) {
res+=line+"\n";
}
in.close();
}catch(Exception e) {
System.out.println("error in wapaction,and e is"+e.getMessage());
}
//System.out.println(res);
return res;
} }
地址匹配信息如下,可按名称提取相应信息:
Java应用:经纬度匹配(geohash加密)的更多相关文章
- (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...
- Java 环境下使用 AES 加密的特殊问题处理
在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...
- Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较
参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...
- java结合node.js非对称加密,实现密文登录传参——让前后端分离的项目更安全
前言 在参考互联网大厂的登录.订单.提现这类对安全性操作要求较高的场景操作时发现,传输的都是密文.而为了目前项目安全,我自己负责的项目也需要这方面的技术.由于,我当前的项目是使用了前后端分离技术, ...
- [转]JAVA 根据经纬度算出附近的正方形的四个角的经纬度
csv文件转化为geojson文件中,涉及到路测图的打点生成,打点是由一个个正方形组成,而正方形是由四个点组成的,这四个点根据经纬度和范围生成,具体的实现代码是从网上找来的: /** * * @par ...
- java中使用MD5进行加密 BASE64Encoder 编码
原文地址:http://www.cnblogs.com/weiwangnuanyang/articles/4326336.html java中使用MD5进行加密 在各种应用系统的开发中,经常需 ...
- java sm4国密算法加密、解密
java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...
- C# 加密(Encrypt) 解密(Decrypt) 操作类 java与 C# 可以相互加密解密
public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summ ...
- python应用:经纬度匹配
需要安装第三方包:requests 本次经纬度匹配采用高德地图api,首先将gps坐标转化为高德地图的经纬度坐标,然后再根据转化后的坐标进行匹配. 本次匹配主要是获取距离给定经纬度最近的poi点地址信 ...
随机推荐
- linux 安装和卸载软件
安装: apt-get install cups-pdf 卸载:apt -get remove cups
- 域名和DNS服务器
概念性的东西: 域名: ①.百度:域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理 ...
- Django问卷调查项目思路流程
Django问卷调查项目思路流程: 1 后端思路 : 需求分析 ---- 找出各实体对应关系 ---- 设计model架构 ---- 统一资源封装 --- 提供资源API入口 ---- 设计项目实体功 ...
- Python 列表(list)操作
创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...
- java之大文件断点续传
针对某些场景下,面对服务文件大,或者服务端服务器不稳定时使用该模块.功能代码如下: import java.io.File; import java.io.FileOutputStream; impo ...
- startup ORA-00845: MEMORY_TARGET not supported on this system
一台虚拟机跑多个实例时,由于/dev/shm空间不够导致如下报错> startupORA-00845: MEMORY_TARGET not supported on this system解决方 ...
- Android(java)学习笔记12:线程的状态转换图以及常见执行情况
1. 线程的状态转换图以及常见执行情况: 2. 线程状态类型: (1)新建状态(New):新创建了一个线程对象.(2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start() ...
- springMVC+thymeleaf form表单提交前后台数据传递
后端: @RequestMapping(value = "/add", method=RequestMethod.POST) public String save(@ModelAt ...
- serlvet配置xml和@WebServlet
简单介绍 XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感.例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web-app元素必须是第三项.在web-app元 ...
- HDU 1159 Common Subsequence(裸LCS)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...