地圖開發--逆地理編碼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

包,就會報錯,得把這些包都引用進來。


    以上就是今天的心得,寫完了。感謝阿里,感謝馬雲,感謝我的遠才科技的兄弟們!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章