通过基站信息(LAC,CID)调用google的json接口获取地理位置信息的Java代码

有问题欢迎交流,QQ:464899731

当已经获取了手机所在位置的基站信息时,怎么知道手机的具体位置?三种方法:

1:查询基站的信息表;

2:通过安特网:http://www.anttna.com/ 目前已经关闭;

3:http://www.lbsgps.org/?p=86,该网站通过调用google的json接口获取地理位置信息;

在这里我们介绍第三种方法;

有一个网站写的很好,http://618119.com/tag/json,但是完全照搬代码是不行的,不过还是要感谢这位朋友的解释;

google 提供了公开的接口,通过,这个接口,根据gps或基站信息或wifi热点信息来获取当前位置的地理信息.
gps信息是经纬度,基站信息是基站的cellid等信息,wifi热点信息是wifi的mac地址是热点名字,信号强度等。
因此可以通过java程序获取相应信息,在LBS项目中可以用上:

api接口定义描述在:

http://code.google.com/p/gears/wiki/GeolocationAPI

 

现在附上代码:

这段代码是生成google 的 json 接口所需的格式:

import java.net.Proxy;
import java.net.URL;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

	public static String map2Json(Map map) {
		if (map.isEmpty())
			return "{}";
		StringBuilder sb = new StringBuilder(map.size() << 4);
		sb.append('{');
		Set keys = map.keySet();
		for (String key:keys) {
			Object value = map.get(key);
			sb.append('\"');
			sb.append(key);
			sb.append('\"');
			sb.append(':');
			sb.append(toJson(value));
			sb.append(',');
		}
		// 将最后的 ',' 变为 '}':
		sb.setCharAt(sb.length()-1, '}');
		return sb.toString();
	}
	
	private static String toJson(Object o) {
		if (o==null)
			return "null";
		if (o instanceof String)
			return string2Json((String)o);
		if (o instanceof Boolean)
			return boolean2Json((Boolean)o);
		if (o instanceof Number)
			return number2Json((Number)o);
		if (o instanceof Map)
			return map2Json((Map)o);
		if (o instanceof  ArrayList)
			return array2Json((ArrayList)o);
		throw new RuntimeException("Unsupported type: " + o.getClass().getName());
	}	
	
	private static String string2Json(String s) {
		StringBuilder sb = new StringBuilder(s.length()+20);
		sb.append('\"');
		for (int i=0; i o : List) {          
//			sb.append(toJson(o));          
//			sb.append(',');      
//		}      // 将最后添加的 ',' 变为 ']':      
		sb.setCharAt(sb.length()-1, ']');      
		return sb.toString();   
	}  	


	public static String getJSON(int lac,int cid){
		String jsonString="";
		String url = "http://www.google.com.hk/loc/json";
		Map jMap = new HashMap();
//		Map jMapArray = new HashMap();
//		Map jMapObject = new HashMap();
		Map jMapcell = new HashMap();
		Map jMapwifi = new HashMap();

		List jMapcells = new ArrayList();
		List jMapwifis = new ArrayList();
		
		jMap.put("version", "1.1.0");
		jMap.put("host", "maps.google.com.hk"); //加上.hk
 		jMap.put("home_mobile_country_code", 460);// 国家代码
		jMap.put("home_mobile_network_code", 0);// 移动运营商代码
		jMap.put("radio_type", "gsm");
		jMap.put("carrier", "quxianglin");
		jMap.put("request_address", true);
		jMap.put("address_language", "zh_CN");
				
		jMapcell.put("mobile_country_code", 460);// 国家代码,mcc
		jMapcell.put("mobile_network_code", 0);// 移动运营商代码,mnc
		jMapcell.put("location_area_code", lac);// 位置区域代码,lac
		jMapcell.put("cell_id", cid);// 移动基站id
		jMapcells.add(jMapcell);
		
		jMap.put("cell_towers", jMapcells);
		jMap.put("wifi_towers", jMapwifis);
		
		
		jMapwifi.put("mac_address", "00-00-00-00-0-00");//
		jMapwifi.put("ssid", "TPLINK000000");// 无线路由器的名字
		jMapwifi.put("signal_strength", 8);// 信号强度
		jMapwifi.put("age", 0);
		jMapwifis.add(jMapwifi);
//		System.out.println(jMap.toString());
		
		jsonString=map2Json(jMap);
		try {
			jsonString=downloadUrlbyPOST(url,jsonString,null,"UTF-8");
		} catch (Exception e) {
			// TODO: handle exception
		}		
		return jsonString;
	}
	private static String downloadUrlbyPOST(String urlStr, String query,String referer, String encoding) throws Exception {
		String line = "";
		StringBuilder sb=new StringBuilder();
		HttpURLConnection  httpConn=null;
		try {
			URL url=new URL(urlStr);
//			System.out.println(urlStr + "?" + query);
			Proxy proxy=new Proxy(Proxy.Type.HTTP,new InetSocketAddress("proxy.google.com.hk", 80));
			proxy=Proxy.NO_PROXY;
			httpConn=(HttpURLConnection) url.openConnection(proxy);
			httpConn.setDoInput(true);
			httpConn.setDoOutput(true);
			httpConn.setRequestMethod("POST");
			if (referer != null) {
				httpConn.setRequestProperty("Referer", referer);
				}
				httpConn.setConnectTimeout(5000);
				// httpConn.getOutputStream().write(
				// java.net.URLEncoder.encode(query, "UTF-8").getBytes());
				httpConn.getOutputStream().write(query.getBytes());
				httpConn.getOutputStream().flush();
				httpConn.getOutputStream().close();
				
				BufferedReader in = null;
				if (httpConn.getResponseCode() != 200) {
				System.err.println("error:" + httpConn.getResponseMessage());
				in = new BufferedReader(new InputStreamReader(httpConn.getErrorStream(), "UTF-8"));
				} else {
				in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));
				}
				while ((line = in.readLine()) != null) {
				sb.append(line).append('\n');
				}
				// 关闭连接
				httpConn.disconnect();
				return sb.toString();				

			} catch (Exception e) {
			// TODO: handle exception
				// 关闭连接
				httpConn.disconnect();
				System.out.println(e.getMessage());
				throw e;
		}		
	}

 程序返回的结果:{"location":{"latitude":40.1012203,"longitude":113.4588556,"address":{"country":"中国","country_code":"CN","region":"山西省","city":"大同市","street":"301省道"},"accuracy":2685.0},"access_token":"2:TgElaNhAt0yjOShR:2fLmIyqIo0pZj1Gw"}

完毕!
java调用时调用getJSON函数即可。


你可能感兴趣的:(通过基站信息(LAC,CID)调用google的json接口获取地理位置信息的Java代码)