這篇關於高德地圖的隨筆內容會多一點,
一、業務說明
對應APP業務中的成員有兩類,一是服務人員,二是被服務人員, 主要實現功能, 對APP中的服務人員位置進行時時定位, 然後通過被服務人員登入APP時提供的一個經緯度來計算服務人員與被服務人員之間的距離 單位m。
下面是整個詳細流程,從建立高德對應應用(這裡註冊我就不說了)------最後完成此功能。
二、建立servlet對應的高德地圖應用,建立自己的雲圖資料庫表
註冊帳號後登入點擊右上方的控制台,會出現下面這個介面,我截圖
這裡當然是我已經註冊好了的介面,如果沒註冊進來就一個 button 擷取key,這裡你直接點進去,就可以建立你的應用了,應用程式名稱隨便取,由於我們這裡是servlet來處理
相關的業務,所以選項為Web服務API, 這裡你點擊擷取key就會出現下面的截圖
這一步完成,後我們就可以去建立我們要的雲圖表了,進入控制台,選擇滑鼠移到我的資料,然後選擇下面的資料管理台(Web)進入增加雲圖表介面
下面是進入後的截圖,這個截圖完了我就直接使用文字講解了。
上面這個截圖是我建立好的結果,這裡我們需要先點擊右上方的 資料模版下載,將模版下載下來之後,修改相應的資料,增加自己需要的欄位後,然後點建立地圖將
修改後的模版匯入到雲圖庫中去,這個模版其實就是一個EXCEL匯出的資料庫表。下面我直接截取我建立的表,我這個表增加了兩個欄位,並且將一個欄位設定成了索引欄位。
記得紅色的欄位名稱必須保留(內容可以隨便修改),那是系統模版內建的,後面兩個黑色的欄位是自己增加的,可以隨意修改,即使你將它上傳到了高德雲圖伺服器之後也是可以改的。
上傳上面的表後,你再開啟之前 資料管理(WEB)就會出現之前一張地圖的介面了,左邊有一張地圖方塊出現,你點進去,就能看到你上傳人員的詳細資料,以及通過上傳的經緯度在地圖上展示的 黃色五角星標識。下面有截圖
這個表中顯示的欄位是我修改過的,不是剛才Excel中上傳的,點擊欄中的標題可以進行一系列的設定,這個我就不詳細說了,
只說下索引欄位的設定,
進去後我選擇是 篩選排序索引-->篩選排序索引就是對使用者自己新增加的欄位設定一個篩選條件。
我這裡使用的是上面雲圖中截圖的使用者類型,它的作用我也給各位截下圖。
到這一步我們整個建立雲圖及上傳的步驟就完成了。。。接下去我會講調用的方法。
二、servlet查詢雲圖庫的要求方法
1、先貼上開發人員文檔地址:
http://lbs.amap.com/yuntu/reference/cloudsearch/ 這個我建議自己還是去看下
這裡servlet使用的是雲檢索API, 對應APP使用的是雲端儲存API,也許明天會增加一篇關於IOS用戶端對應這個介面的時時定位文章。
下面是拼接的URL格式,直接在URL中輸入重新整理可以已GET方式擷取相關資料。
http://yuntuapi.amap.com/datasearch/local?tableid=568bd32b305a2a31f604c650&city=北京&keywords=%20&filter=type:服務人員limit=15&page=1&key=? (這裡的參數 KEY這些都是你自己的)
下面是封裝的要求方法代碼
package Helper; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.URL;import java.net.URLConnection;import java.util.List;import java.util.Map;public class HttpRequest { /** * 向指定URL發送GET方法的請求 * * @param url * 發送請求的URL * @param param * 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return URL 所代表遠端資源的響應結果 */ public static String sendGet(String url, String param) { String result = ""; BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 開啟和URL之間的串連 URLConnection connection = realUrl.openConnection(); // 設定通用的請求屬性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立實際的串連 connection.connect(); // 擷取所有回應標頭欄位 Map<String, List<String>> map = connection.getHeaderFields(); // 遍曆所有的回應標頭欄位 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定義 BufferedReader輸入資料流來讀取URL的響應 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送GET請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸入資料流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } /** * 向指定 URL 發送POST方法的請求 * * @param url * 發送請求的 URL * @param param * 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return 所代表遠端資源的響應結果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 開啟和URL之間的串連 URLConnection conn = realUrl.openConnection(); // 設定通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 發送POST請求必須設定如下兩行 conn.setDoOutput(true); conn.setDoInput(true); // 擷取URLConnection對象對應的輸出資料流 out = new PrintWriter(conn.getOutputStream()); // 發送請求參數 out.print(param); // flush輸出資料流的緩衝 out.flush(); // 定義BufferedReader輸入資料流來讀取URL的響應 in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送 POST 請求出現異常!"+e); e.printStackTrace(); } //使用finally塊來關閉輸出資料流、輸入資料流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } try { result= new String(result.getBytes("ISO8859-1"),"UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } }
下面是要求方法
String mapParameter=new String("tableid=568bd32b305a2a31f604c650&city=北京&keywords=%20&filter=type:按摩師limit=15&page=1&key=?").getBytes("ISO8859-1"),"UTF-8");
String returnResult=HttpRequest.sendPost("http://yuntuapi.amap.com/datasearch/local", mapParameter);
out.println("<script> alert("+returnResult+");</script>");
這裡我們查詢的篩選條件就是我們自己建立的欄位(並且它被我們設定成了索引欄位) type:按摩師------------------上面的_updatetime前面的欄位都是我們資料庫中放的資料,後面的都是通過傳的經緯度查詢出來的真實資料,但是在真正使用時用時,這些資料都是 App端往裡面增加的,而且APP還需要傳當前定位的城市名稱給Servlet,所以這裡的資料都是錯的。
三、servlet計算兩個經緯度間的距離
這裡就是servlet通過經緯度計算被服務人員與服務人員的距離,這裡其實是一對多的關係。一個被 被服務人員可以對應N個提供服務的人員。 被服務人員的所在位置經緯度會去匹配所有此次查詢出的服務人員的經緯度,計算出距離。
下面貼計算距離的方法,這個是一個公用的方法各大地圖都適用。
public static double getDistance(LatLng start,LatLng end){ double lat1 = (Math.PI/180)*start.latitude; double lat2 = (Math.PI/180)*end.latitude; double lon1 = (Math.PI/180)*start.longitude; double lon2 = (Math.PI/180)*end.longitude; double R = 6371; double d = Math.acos(Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lon2-lon1))*R; return d*1000; }
參數中的LatLng 你可以自己建立一個類,裡麵包含兩個欄位都是double類型。一個代表精度,一個代表緯度。
使用這個方法產生的流程:當使用者開啟服務人員的APP介面時,請求了讀取服務人員列表的介面,這時候SERVLET就需要查詢一次高德雲圖裡面的服務人員資訊,可以限制查詢條數,然後查詢出來,迴圈每條資料中的經緯度與使用被服務人員開啟APP介面傳的經緯度,匹配計算出相對距離。 明天也許會發布一篇IOS的隨筆,就對應這個介面,主要貼在IOS上實現的時時定位傳雲圖資料庫的代碼。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。