java servlet手机app访问接口(三)高德地图云存储及检索
本人开发的开发者技术变现资源聚集地,大家支持下,下面是网址
https://www.baiydu.com
这篇关于高德地图的随笔内容会多一点,
一、业务说明
对应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上实现的时时定位传云图数据库的代码
本人创业做的一款androidApp, 下载量已经有2000多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。
java servlet手机app访问接口(三)高德地图云存储及检索的更多相关文章
- java servlet手机app访问接口(一)数据加密传输验证
前面几篇关于servlet的随笔,算是拉通了 servlet的简单使用流程,接下去的文章将主要围绕手机APP访问接口这块出发续写,md5加密传输--->短信验证--->手机推送---> ...
- java servlet手机app访问接口(二)短信验证
今天找了几个短信平台,其实最想使用的一个是sharesdk,使用它上面http api短信功能,不仅价格低,而且最少可以充值100RMB,但是审核过于严格,对应APP还必须集成他们的短信功能,而且要上 ...
- java servlet手机app访问接口(四)推送
一. 服务端DEMO下载及运行. 登录友盟后,浏览器直接输入下面这个URL,直接进入文档开发和DEMO下载页面:http://dev.umeng.com/push/ios/integration(下面 ...
- java实现利用httpclient访问接口
HTTP协议时Internet上使用的很多也很重要的一个协议,越来越多的java应用程序需要通过HTTP协议来访问网络资源. HTTPClient提供的主要功能: 1.实现了所有HTTP的方法(GET ...
- Java 调用 Hbase API 访问接口实现方案
HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...
- 【http抓包】记录一次抓手机app的接口
抓手机的接口地址,好用的工具很多,想 windows下的 Fiddler 和mac下的Charles 1. fiddler的设置教程是 http://jingyan.baidu.com/article ...
- android 高德地图API 之 java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLibrary returned null错误
错误场景: 运行android app时,在运行到调用高德地图API时,出现 “java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLi ...
- java Servlet接口及应用
基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...
- java Servlet接口及应用(转)
基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...
随机推荐
- PHP面向对象05_接口与多态
抽象类与接口 2014-9-2 9:14:32 摘要: 1.抽象类(abstract) 2.接口(interface) 3.多态的应用 1.抽象类(abstract) 特点: 1)抽象类使用abstr ...
- Atitit sql执行计划
Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...
- js 字符串的操作
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- chrome远程调试真机上的app
chrome远程调试真机上的app 看来要上真机了...
- hdu 2896 病毒侵袭 ac自动机
/* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...
- C/C++定义全局变量/常量几种方法的区别
在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...
- [转载]AxureRP学习成长之路
[编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...
- Linux - 日志文件
Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...
- [C] 关于表达式求值
结论是:在一个表达式中,如果两个相邻操作符的执行顺序由它们的优先级决定,如果它们的优先级相同,它们的执行顺序由它们的结合性决定.若出现前述规则描述之外的情形,编译器可以自由决定求值的顺序(只要不违反逗 ...
- DPDK学习之开篇介绍
1.前言 记得刚开始工作的时,老大将我安排到数据面组,当时第一次听说”数据面“这个概念,感觉挺新鲜的.误打误撞就开始搞了,刚开始接触的时候,由于不懂其中的原理,觉得很神奇,因为报文的转发是在应用层,通 ...