本人開發的開發者技術變現資源彙集地,你們支持下,下面是網址java
https://www.baiydu.comandroid
這篇關於高德地圖的隨筆內容會多一點,git
1、業務說明數據庫
對應APP業務中的成員有兩類,一是服務人員,二是被服務人員, 主要實現功能, 對APP中的服務人員位置進行時時定位, 而後經過被服務人員登陸APP時提供的一個經緯度來計算服務人員與被服務人員之間的距離 單位m。api
下面是整個詳細流程,從建立高德對應應用(這裏註冊我就不說了)------最後完成此功能。服務器
2、建立servlet對應的高德地圖應用,建立本身的雲圖數據庫表網絡
註冊賬號後登陸點擊右上角的控制檯,會出現下面這個界面,我截圖url
這裏固然是我已經註冊好了的界面,若是沒註冊進來就一個 button 獲取key,這裏你直接點進去,就能夠建立你的應用了,應用名稱隨便取,因爲咱們這裏是servlet來處理spa
相關的業務,因此選項爲Web服務API, 這裏你點擊獲取key就會出現下面的截圖.net
這一步完成,後咱們就能夠去建立咱們要的雲圖表了,進入控制檯,選擇鼠標移到個人數據,而後選擇下面的數據管理臺(Web)進入增長雲圖表界面
下面是進入後的截圖,這個截圖完了我就直接使用文字講解了。
上面這個截圖是我建立好的結果,這裏咱們須要先點擊右上角的 數據模版下載,將模版下載下來以後,修改相應的數據,增長本身須要的字段後,而後點新建地圖將
修改後的模版導入到雲圖庫中去,這個模版其實就是一個EXCEL導出的數據庫表。下面我直接截取我建立的表,我這個表增長了兩個字段,而且將一個字段設置成了索引字段。
記得紅色的字段名稱必須保留(內容能夠隨便修改),那是系統模版自帶的,後面兩個黑色的字段是本身增長的,能夠隨意修改,即便你將它上傳到了高德雲圖服務器以後也是能夠改的。
上傳上面的表後,你再打開以前 數據管理(WEB)就會出現以前一張地圖的界面了,左邊有一張地圖方塊出現,你點進去,就能看到你上傳人員的詳細信息,以及經過上傳的經緯度在地圖上展現的 黃色五角星標識。下面有截圖
這個表中顯示的字段是我修改過的,不是剛纔Excel中上傳的,點擊欄中的標題能夠進行一系列的設置,這個我就不詳細說了,
只說下索引字段的設置,
進去後我選擇是 篩選排序索引-->篩選排序索引就是對用戶本身新增長的字段設置一個篩選條件。
我這裏使用的是上面雲圖中截圖的用戶類型,它的做用我也給各位截下圖。
到這一步咱們整個建立雲圖及上傳的步驟就完成了。。。接下去我會講調用的方法。
2、servlet查詢雲圖庫的請求方法
一、先貼上開發者文檔地址:
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,因此這裏的數據都是錯的。
2、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上實現的時時定位傳雲圖數據庫的代碼
本人創業作的一款androidApp, 下載量已經有2000多萬,各類當前熱門的網絡手機獎勵紅包所有集成,另外還有熱門電影和淘寶高額優惠券!很適合各種型的用戶。