本文采用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加密)的更多相关文章

  1. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...

  2. Java 环境下使用 AES 加密的特殊问题处理

    在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...

  3. Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较

    参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...

  4. java结合node.js非对称加密,实现密文登录传参——让前后端分离的项目更安全

    前言   在参考互联网大厂的登录.订单.提现这类对安全性操作要求较高的场景操作时发现,传输的都是密文.而为了目前项目安全,我自己负责的项目也需要这方面的技术.由于,我当前的项目是使用了前后端分离技术, ...

  5. [转]JAVA 根据经纬度算出附近的正方形的四个角的经纬度

    csv文件转化为geojson文件中,涉及到路测图的打点生成,打点是由一个个正方形组成,而正方形是由四个点组成的,这四个点根据经纬度和范围生成,具体的实现代码是从网上找来的: /** * * @par ...

  6. java中使用MD5进行加密 BASE64Encoder 编码

    原文地址:http://www.cnblogs.com/weiwangnuanyang/articles/4326336.html java中使用MD5进行加密     在各种应用系统的开发中,经常需 ...

  7. java sm4国密算法加密、解密

      java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...

  8. C# 加密(Encrypt) 解密(Decrypt) 操作类 java与 C# 可以相互加密解密

    public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summ ...

  9. python应用:经纬度匹配

    需要安装第三方包:requests 本次经纬度匹配采用高德地图api,首先将gps坐标转化为高德地图的经纬度坐标,然后再根据转化后的坐标进行匹配. 本次匹配主要是获取距离给定经纬度最近的poi点地址信 ...

随机推荐

  1. wxpython,wx.EVT_ENTER_WINDOW

    这个例子是鼠标移入,button的label显示“Over Me”,但是我运行没有显示求怎么回事

  2. 网络基础-IP、端口等

    首先来理解一下几个概念.      白帽子:有能力破坏电脑安全但不具恶意目的的黑客.白帽子一般有清楚的定义.道德规范并常常试图同企业合作去改善发现的安全弱点.         正义技术员. 灰帽子:对 ...

  3. java面试题之----mysql表优化方案

    本文转载自segmentfault,原文链接:https://segmentfault.com/a/1190000006158186. 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考 ...

  4. sqlserver学习2---java执行存储过程

    一.存储过程 1.新增操作存储过程 --------------1.新建 增加学生的存储过程---------------------------- set IDENTITY_INSERT stude ...

  5. Angular-cli 构建应用的一些配置

    Angular-cli 构建应用 的一些配置 标签(空格分隔): Angular 直接使用 ng build --prod --build-optimizer --base-href=/ 来发布 ba ...

  6. php入门到精通(复习笔记)

    第一章:php语言基础 1,标记风格: ①<?php echo “hello”;?> ②<script language="php">echo " ...

  7. 【洛谷5309】[Ynoi2012] D1T1(分块)

    点此看题面 大致题意: 两种操作,区间求和,将形如\(ax+y\)的位置的元素值加\(z\). 分块 这种题目显然就是按照\(x\)与\(\sqrt n\)的大小关系来分块. 对于\(x>\sq ...

  8. 去掉谷歌浏览器 video标签下的下载按钮

    一.判断浏览器版本(区分谷歌和360浏览器) function myBrowser(){ var userAgent = navigator.userAgent; //取得浏览器的userAgent字 ...

  9. SSH Secure Shell Client连接Linux断开

    修改/etc/ssh/sshd_config文件,将 ClientAliveInterval 0和ClientAliveCountMax 3的注释符号去掉,将ClientAliveInterval对应 ...

  10. Android学习笔记_55_Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变).第二类就是 Frame动画,即顺序的播放事先做好的图像,与gi ...