java servlet手机app访问接口(三)高德地图云存储及检索

发布时间 - 2026-01-10 21:58:12    点击率:

这篇关于高德地图的随笔内容会多一点,

一、业务说明

对应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上实现的时时定位传云图数据库的代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # servlet  # 手机app  # 访问接口  # java servlet手机app访问接口(二)短信验证  # java servlet手机app访问接口(一)数据加密传输验证  # 浅析javax.servlet.Servlet  # ServletContext接口  # java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)  # java线程之使用Runnable接口创建线程的方法  # java比较器Comparable接口与Comaprator接口的深入分析  # Java中实现Comparator接口和用法实例(简明易懂)  # App登陆java后台处理和用户权限验证  # Java实现爬虫给App提供数据(Jsoup 网络爬虫)  # 教你构建第一个Java Applet程序  # 都是  # 的是  # 上传  # 我就  # 自己的  # 就会  # 成了  # 按摩师  # 北京  # 计算出  # 就可以  # 应该是  # 是一个  # 好了  # 我会  # 你可以  # 鼠标  # 那是  # 就能  # 一是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Bootstrap整体框架之JavaScript插件架构  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  高性价比服务器租赁——企业级配置与24小时运维服务  php 三元运算符实例详细介绍  新三国志曹操传主线渭水交兵攻略  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何在IIS管理器中快速创建并配置网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何选择PHP开源工具快速搭建网站?  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何基于云服务器快速搭建网站及云盘系统?  电商网站制作价格怎么算,网上拍卖流程以及规则?  Windows Hello人脸识别突然无法使用  JavaScript如何实现继承_有哪些常用方法  高端智能建站公司优选:品牌定制与SEO优化一站式服务  bootstrap日历插件datetimepicker使用方法  网站优化排名时,需要考虑哪些问题呢?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  javascript日期怎么处理_如何格式化输出  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  怎么用AI帮你设计一套个性化的手机App图标?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel怎么实现模型属性的自动加密  如何快速打造个性化非模板自助建站?  微信小程序 HTTPS报错整理常见问题及解决方案  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  音响网站制作视频教程,隆霸音响官方网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel如何使用查询构建器?(Query Builder高级用法)  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何彻底删除建站之星生成的Banner?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  微信小程序 五星评分(包括半颗星评分)实例代码  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  详解Android中Activity的四大启动模式实验简述  Android okhttputils现在进度显示实例代码  如何生成腾讯云建站专用兑换码?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)