国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java servlet手機app訪問接口(三)高德地圖云存儲及檢索

2019-11-26 13:25:22
字體:
來源:轉載
供稿:網友

這篇關于高德地圖的隨筆內容會多一點,

一、業務說明

對應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上實現的時時定位傳云圖數據庫的代碼。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 秦皇岛市| 衢州市| 榆中县| 蒙城县| 浙江省| 平舆县| 东乌珠穆沁旗| 武宁县| 沽源县| 六安市| 南宁市| 葵青区| 阜新| 綦江县| 麻江县| 赣州市| 右玉县| 布尔津县| 铜川市| 利川市| 宁化县| 乐山市| 新巴尔虎左旗| 抚顺县| 大安市| 岳池县| 镇平县| 雷山县| 汉源县| 梧州市| 南华县| 达孜县| 平湖市| 泾源县| 墨竹工卡县| 土默特右旗| 东至县| 融水| 黔江区| 天镇县| 高青县|