地图开发--逆地理编码regeocoding

      应“远才科技公司”需求,开发一个将在服务器上将gps坐标转换成地理名(主要是坐标的道路名)的功能,也就是逆地理编码的功能。

      网上很容易找到JS版本的逆地理编码程序,百度、阿里都是现在的例子、网页源代码可以看。可要是不通过JS、网页方式逆地理编码,就要花点心思去找找了。经过一阵子的百度、谷歌,没有现成的材料。在比较各大地图API时发现,阿里地图API说明极少,显得好可怜,百度地图有正儿八经的文档,详细的说明。可偏偏在逆地理编码方面,百度地图提供的访问调用方式比阿里的要麻烦,并且效果远不如阿里地图的regeocoding。如下所示:

阿里的逆地理编码regeocoding请求:

http://gc.ditu.aliyun.com/regeocoding?l=39.938133,116.395739&type=001

阿里的这个请求每天不限次数。


百度的逆地理编码regeocoding请求:

http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderReverse&location=39.983424,116.322987&output=xml&pois=1 
百度的这个请求,需要申请ak(key),并且每天只能访问5000次,几乎只可以学个作业玩玩。

对比之后,果断选用阿里的逆地理编码,参考学习地址:http://ditu.aliyun.com/jsdoc/geocode_api.html#a1_5


找好方向和方法后,就开始coding了,直接上代码:

public void testUrlRes(String lat,String lng) throws IOException{
		//type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
		String path="http://gc.ditu.aliyun.com/regeocoding?l="+lat+","+lng+"&type=100";
		//参数直接加载url后面
		URL url=new URL(path);
		HttpURLConnection conn=(HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5000);
		if(conn.getResponseCode()==200){				//200表示请求成功
			InputStream is=conn.getInputStream();		//以输入流的形式返回
			//将输入流转换成字符串
			ByteArrayOutputStream baos=new ByteArrayOutputStream();
			byte [] buffer=new byte[1024];
			int len=0;
			while((len=is.read(buffer))!=-1){
				baos.write(buffer, 0, len);
			}
			
			if(baos.size() < 1){
				LogUtil.log("坐标请求异常.");
				return;
			}
			//得出整个坐标反馈信息
			String jsonString=baos.toString();
			LogUtil.log(jsonString);
			
			baos.close();
			is.close();
			//转换成json数据处理
			//{"queryLocation":[39.938133,116.395739],"addrList":[{"type":"doorPlate","status":1,"name":"地安门外大街万年胡同1号","admCode":"110102","admName":"北京市,北京市,西城区,","addr":"","nearestPoint":[116.39546,39.93850],"distance":45.804}]}
			
			JSONObject jsonObject = JSONObject.fromObject(jsonString);
			String addrList =  jsonObject.getString("addrList");
			LogUtil.log(addrList);  //地址信息
			
			JSONArray jsonarry = JSONArray.fromObject(addrList);
			for(int i = 0;i<jsonarry.size();i++){
				JSONObject jsonObject2 = jsonarry.getJSONObject(i);
				String roadName =  jsonObject2.getString("name"); //路名(这才是我最终想要的)
				LogUtil.log(roadName);
			}
		}
		
	}

     以上代码说明:1.LogUtil .log()是的写的一个通用方法,相当于System.out.println();2.使用的JSON相关的包文件有:

commons-beanutils-1.7.jar,commons-collections.jar,commons-lang.jar,commons-logging-1.1.1.jar,ezmorph.jar,json-lib-2.4-jdk15.jar,特意贴出这些

JSON相关的包,是因为我在开发中就出现了问题。我是jdk是1.7的,而最新的JSON相关包我只找对jdk1.5版本的,若是只引入json-lib-2.4-jdk15.jar

包,就会报错,得把这些包都引用进来。


    以上就是今天的心得,写完了。感谢阿里,感谢马云,感谢我的远才科技的兄弟们!



猜你喜欢

转载自blog.csdn.net/xiucaiyao/article/details/19255795