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点地址信 ...
随机推荐
- requireJS基本配置相关
requireJS: (1)实现js文件的异步加载,避免页面失去响应: (2)管理模块之间的依赖性,便于代码的编写和维护. 加载: <script src="js/require.js ...
- 使用版本 1.0.0 的 Azure ARM SDK for Java 创建虚拟机时报错
问题描述 我们可以通过使用 Azure ARM SDK 来管理 Azure 上的资源,因此我们也可以通过 SDK 来创建 ARM 类型的虚拟机,当我们使用 1.0.0 版本的 Azure SDK fo ...
- solidity语言4
引用类型(Reference Types) memory 不支持持久保存 storage 保留为变量 复杂类型如arrays和structs,有附加信息,'data location',提示存储在'm ...
- patch 修改有问题的
diff --git a/include/net/tcp.h b/include/net/tcp.h@@ -1013,8 +1048,13 @@ static inline u32 keepalive ...
- Java传引用问题
Java传引用问题 使用Java调用方法时,可以传值,也可以传引用.下面说说两者的区别: 1.传值 传值中的"值"类型是指java的8大基本类型(基础知识,不知道 ...
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- CF449C Jzzhu and Apples
嘟嘟嘟 这道题正解是怎么对的其实我也不清楚,总之靠感性理解吧. 首先当然要把1到n / 2的素数都筛出来,因为两两能配对的数一定都是这些素数的倍数.这也就说明对于(n / 2, n]的素数,他们一定不 ...
- POJ Air Raid 【DAG的最小不相交路径覆盖】
传送门:http://poj.org/problem?id=1422 Air Raid Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- [18/11/11] java标识符及变量
一.标识符规范 1.必须以字母.下划线 .美元符号开头. 即数字不能作为开头,其它位随便 2.不可以是java关键字(即保留字), 如static .class.new 等 . 注:int 年 ...
- 2018.11.26 struts2流程源码
struts2的架构图 从最上面的类开始,也就是i 我们的核心过滤器strutsPrepareAndExecuteFilter 判断当前请求是否由struts2来处理,如果是就往else走,不由它来处 ...