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

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

一、业务说明

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

				
时间: 2024-11-01 00:54:28

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

java servlet手机app访问接口(二)短信验证

今天找了几个短信平台,其实最想使用的一个是sharesdk,使用它上面http api短信功能,不仅价格低,而且最少可以充值100RMB,但是审核过于严格,对应APP还必须集成他们的短信功能,而且要上传审核也得20多天,我也只是想找个短信平台测试下而已,所以它就算了.然后就在百度随便在好了一个短信平台www.wasun.cn,暂时感觉它还不错,至少它给的测试帐号接受短信的速度没超过5秒,我看了下一般是3秒甚至更快. 下面我就说说调用短信接口的方法,以及使用中途遇到的问题. 一.httpreque

java web 静态资源访问配置三种方式

方案一:Tomcat的defaultServlet来处理静态文件 要放在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了 方案二: 在spring3.0.4以后版本提供了mvc:resource /images/**映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下.jar包里面,这样可以把静态资源压缩到jar包中.cache-

J哥--------------------------分享好东西:android抓包工具fiddler使用介绍 抓取 手机APP 中资源。

本文地址:http://blog.csdn.net/u011733020 首先,写这个只是为了学习,不是要做什么违法的事情,如果有问题,有关部门 请联系我,立马删除. 不要查我水表. 正题:这里介绍 抓包的关键,Fiddler  ,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯. 我们就是用这款软件抓取 ,我们手机app 访问的 资源路径 的. 下面 我们拿实例 来演示下,怎么用fiddler 抓取数据.(以某拍为例吧). 环境: win7

在第三方应用中打开高德地图的特色功能页面

由于最近的项目中需要在第三方应用中直接打开高德地图的电子狗页面,在高德开发者论坛找了一遍无果之后,只能自己反编译高德地图来找了,现在记录下来方便大家有类似需求时可以直接找到,这样就不需要反编译了. 高德地图有一些非常方便的特色功能,我们可以直接在第三方应用中打开高德地图的这些特色功能页面方便大家使用,前提是手机上必须要安装高德地图. 首先反编译高德地图的APK得到AndroidMainfest.xml文件: <?xml version="1.0" encoding="u

java Servlet接口及应用(转)

基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集.Servlet接口的基本目标是提供生命期方法init().service()和destroy()方法. servlet接口中的方法       void init(ServletConfit config)throws ServletException    在servlet被载入后和实施

java Servlet接口及应用

基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集.Servlet接口的基本目标是提供生命期方法init().service()和destroy()方法. servlet接口中的方法       void init(ServletConfit config)throws ServletException    在servlet被载入后和实施

微信公众账号开发接口实现 - java servlet

原文:微信公众账号开发接口实现 - java servlet 源代码下载地址:http://www.zuidaima.com/share/1550463697898496.htm 微信公众平台开发接口验证token.收取.回复消息实现 其实只需要两个类:DeiponseMessage.java.Wechat.java 项目截图 缺少的jar包下载列表: http://mirrors.ibiblio.org/pub/mirrors/maven2/commons-beanutils/commons-

手机APP应用外网访问本地WEB应用

手机APP应用外网访问本地WEB应用 本地安装了WEB服务端,手机APP应用只能在局域网内访问本地WEB,怎样使手机APP应用从公网也能访问本地WEB? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动WEB服务端程序 默认安装的WEB服务端的端口是80. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer access key信

PC软件/web网站/小程序/手机APP产品如何增加个人收款接口

接入前准备 通过 XorPay 注册个人收款接口,原理是帮助你签约支付宝和微信(不需要营业执照)支持个人支付宝和个人微信支付接口,大概几分钟可以开通,开通后即可永久使用 PC 网站接入 效果:用户点击支付后,前端ajax 请求你的后台,你后台再请求 xorpay 支付接口返回支付二维码到前台,页面展示微信或者支付宝二维码,用户用手机微信或支付宝扫码支付 接口:可以使用 JSAPI / Native / 收银台 / 支付宝当面付 支付接口 JSAPI 支付,通过构造二维码,用户微信扫码后在打开自己