JSON格式自动分析碰着的调用方法难点.fromJson() ..readValue()

所使用的API Store是 聚合数据 使用 手提式无线电话机归属地查询 成效

小说版权由小编李晓晖和天涯论坛共有,若转发请于显明处标明出处:http://www.cnblogs.com/naaoveGIS/

因百度的apistore.baidu.com
2015年4月始发至明日不收受新用户调取。聚合数据三个接口免费。

1.前言

那篇小说里,我根本针对OGC标准中的WMS、WMTS以及ArcGIS的在线地图服务来进行辨析。

写以前,笔者先来给大家提一下OGC是怎么。OGC的全名是Open GIS
Consortium,普通话名是开放地理空间音讯缔盟,它是多个是非盈利、志愿的国标化协会。在空间数据互操作领域,基于公共接口访问方式的互操作方法是一种基本的操作方法。通过国标化协会(ISO/TC211)或技术联盟(如OGC)制定空间数据互操作的接口规范,GIS软件商开发遵循这一接口规范的空间数据的读写函数,从而得以兑现异构空间数据库的互操作(来自百度全面)。

时下OGC制定的专业有:WMS(地图服务)、WMTS(地图瓦片服务)、WFS(要素服务)、WCS(栅格服务)。在上面笔者介绍的地形图请求方式皆是RESTFUL下的伸手格局。

壹 、通过谷歌的google-gson方法分析聚合数据获得的回来结果json代码,使用的jar包是gson-2.7.jar。

2.WMS服务的URL

WMS服务能够提供以下两种服务:

GetCapabilities重返服务级元数据。

 图片 1

GetMap重临二个地形图印象。

 图片 2

GetFeatureinfo再次来到展现在地形图上的少数特殊要素的新闻等。

 图片 3

(1)Add Build Path之后Gson gson=new Gson();// ctrl+shift+o使用正规。

2.1例子

大家来看一下WMS服务请求地图时的U讴歌ZDXL例子:http://172.18.0.154:7001/ServiceRight/proxy/f446aabb04a59af336901290d615e16b/xzcg/WMS/XZ500DLG\_BZWGS84?LAYERS=XZ500DLG\_BZWGS84&FORMAT=image/gif&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG:4326

&WIDTH=256&HEIGHT=256&bbox=117.21879147492814,34.240704396544345,117.22000975886715,34.24192268048341。

 图片 4

 图片 5

考察那些URAV4L,很多参数在事实上行使中得以遵照提供的劳务而固定,比如FOWranglerMAT、LAYEOdysseyS、REQUEST、S冠道S、STYLES、VE汉兰达SION、WIDTH、HEIHT参数。而真正供给大家实际去不停换算的正是BBOX了。

(2)JsonRootBean root=gson.fromJson(result,
JsonRootBean.class);//result是集结数据重返的json代码,类型是字符串,JsonRootBean.class是把字符串转成此类

2.2原理

WMS请求是一种能够动态出图的呼吁,原则上它能够显得原始图像在任意比例尺下的地图,它不像瓦片服务,只可以展现切图时所设定好的百分比尺下的的地图。在我们利用三回开发包时,比如用esri提供的开发包时,当中只要求我们设置必要突显的级别数,而不要求咱们设置各类级别所对应的比例尺,正是因为WMS是三个动态出图服务。在2回开发中,直接利用提供的WMS类是卓殊不难的,只供给提供展示的限定和须求出示的级别数即可,此类的内部会活动的剪切每1个级其他比例尺,而WMS是动态出图的,所以完全可以支撑那种办法。

//注意.fromJson()那几个情势有成都百货上千重载,要选择合适本人的参数

2.3 注意

而是,实际中,有的服务商提供的WMS服务却并不是这么的,他们很有大概会在某些比例尺非常小的地点做出限制,让我们不得不以某多少个定位的百分比尺去做客取得瓦片,其余比例尺均不能。在此以前替别的组同事处理过的二个施用基于FlexViewer框架下的WMS类加载地图时,在特定的某多少个级别上不显示地图,正是这几个缘故了。而消除那些标题标方法是重复扩张那么些类,使扩充的WMSEX类能够因而设定好的各种级别的比例尺来换算出相应的Bbox,那里大家前边获得的队列号的算法尽管是有用途了。

minX=resolution*tileSize*col;

minY=resolution*tileSize*row;

maxX=resolution*tileSize*(col+1);

maxY=resolution*tileSize*(row +1);

Bbox=“minX,minY,maxX,maxY”;

(3)那是足以应用root那一个指标直接调用json中的内容了 System.out.println(“集团:”+root.getResult().getCompany()); 

3.WMTS服务

WMTS服务的完备是Web Map Tile
Service,故名思议,不一样于在此之前的WMS的动态出图,WMTS服务是基于瓦片思想的。WMTS一样援救提供一定的专业服务,比如:

GetCapabilities(获取服务的元消息,在这几个元音讯中大家能够看出切图的详实布署)。

 图片 6

GetTile(获取切片)。

GetFeatureInfo(可选,获取点选的要素新闻)。

能够看出那几个操作和WMS的操作特别的如出一辙。

二 、通过jackson方法分析聚合数据获得的回到结果json代码,使用的jar包是/TestJuHe/lib/jackson-core-2.2.3.jar;/TestJuHe/lib/jackson-annotations-2.2.3.jar;/TestJuHe/lib/jackson-databind-2.2.3.jar

3.1例子

大家再来看一下WMTS下请求地图瓦片的UOdysseyL例子,那里本人以天地图中的UPAJEROL为范例:http://srv.zjditu.cn/ZJEMAP_2D/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=ZJEMAP&FORMAT=image/png&TILEMATRIXSET=TileMatrixSet0&TILEMATRIX=17&STYLE=default&TILEROW=21747&TILECOL=109282

 图片 7

 图片 8

考察那么些UPRADOL所包含的参数,在收获瓦片前我们是能够将FO奥迪Q5MAT、LAYE汉兰达、REQUEST、SE翼虎VICE、STYLE、VE途达SION依据供给而写定的,在不停转变的是TILEMAT中华VIX、TILEROW、TILECOL。

(1) ObjectMapper mapper = new ObjectMapper(); //
ctrl+shift+o使用正规。
(2) JsonRootBean root = mapper.readValue(result, JsonRootBean.class);

3.2原理

WMTS服务和我们后面反复商量的瓦片思想是吻合的,观看参数也能阅览,TILEMAT昂CoraIX、TILEROW、TILECOL其实正是Level、row、col。于是WMTS服务下的瓦片请求的U路虎极光L也变顺理成章的能够拼出来了:固定格式U大切诺基L+“&TILEMAT昂CoraIX=”+level+“&TILEROW=”+row+“&TILECOL=”+col。

//注意.readValue()那个方法有好多重载,要挑选适宜自个儿的参数
(3)
System.out.println(“公司:”+root.getResult().getCompany());//使用root这么些指标间接调用json中的内容

4.广泛地图服务器发表的地形图中的UHavalL——以AGS服务为例

AGS中,在对公布的劳动进行了切图后,地图的请求U兰德酷路泽L成了一种固定的格式。如:http://172.29.0.74:8399/arcgis/rest/services/HFTile/MapServer/tile/2/957/834

 图片 9

 同理可得,在tile后的就是Level、row、col。所以AGS下的U智跑L写法就是:restMapService地址/Level/row/col。

附聚合数据接口代码:

5.提多少个难题

问题一:

3个地形图要求前多少个级别地图是来源于A服务,它的劳动地点是AU大切诺基L。中间多少个级别地图来源于B服务,它的劳务地点是BU大切诺基L,前边多少个别地图是缘于C服务,它的劳动地点是CU本田UR-VL。那么些时候我们该怎么让系统能够在各种级别符合规律的出图呢?

问题二:

四个地形图需求同时显示地形图和注记图层,且地形图服务源于A服务,注记图层来源于B服务。怎么着能健康的加载五个服务,并且让注记图层符合规律的叠加在地形图上呢?

问题三:

也许3个地形图供给同时出示地形图和注记图层,然则此时地势图服务是WMTS服务,而注记图层是WMS服务。如何将二种差异服务的瓦片获取后叠加呢?

标题自己就只提那八个吗,那种近乎的题材专门特别多,但是本人想只要大家精通了种种劳动的URAV4L得到原理,再添加一丢丢要好化解难点的笔触,应该都不难消除的。在此后的栅格图层(瓦片图层)设计的章节里,小编会提交一个大家消除此类题材的主意,该办法能很通用的化解这一文山会海题材。

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

6.总结

讲到那里时,整个系列中,大家曾经讲了行列号是什么、怎么样取得行列号、通过行列号得到瓦片URubiconL。能够说咱俩前几日相差怎么着在前者显示出栅格图像,是万事俱备只欠南风了。那么下一章节里,笔者将给大家借来这几个南风。下一节内容是:瓦片在前端拼接呈现的原理。欢迎我们持续关心。

 

并不是唯有在开着温馨的车时才是随机,只要大家双腿还在,都能远行。

                         —–欢迎转载,但保留版权,请于分明处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                          
倘若您认为本文确实扶助了你,能够微信扫一扫,实行小额的打赏和鞭策,谢谢^_^

                                    图片 10

import com.google.gson.Gson;

import net.sf.json.JSONObject;

/**
*手提式有线电话机号码归属地调用示例代码 - 聚合数据
*在线接口文书档案:http://www.juhe.cn/docs/11
**/

public class JuheDemo {
public static final String DEF_CHATSET = “UTF-8”;
public static final int DEF_CONN_TIMEOUT = 30000;
public static final int DEF_READ_TIMEOUT = 30000;
public static String userAgent = “Mozilla/5.0 (Windows NT 6.1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66
Safari/537.36”;

//配置您申请的KEY
public static final String APPKEY
=”c3abbaf3e5b9526fa4959e1edf9716b7″;//那是作者的key,只对脚动手提式有线电话机号这么些有效

//1.手提式有线电话机归属地询问
public static void getRequest1(){
String result =null;
String url =”http://apis.juhe.cn/mobile/get";//请求接口地址
Map params = new HashMap();//请求参数
params.put(“phone”,”18612626494″);//须求查询的手提式有线电话机号码或手提式有线电话机号码前几人
params.put(“key”,APPKEY);//应用APPKEY(应用详细页查询)
params.put(“dtype”,”json”);//再次来到数据的格式,xml或json,暗许json

try {
//申请聚合得到的回到结果
result =net(url, params, “GET”);

JSONObject object = JSONObject.fromObject(result);

if(object.getInt(“error_code”)==0){
System.out.println(object);
//手动
// JSONObject json=object.getJSONObject(“result”);
// System.out.println(json.getString(“province”));
// System.out.println(object.getInt(“resultcode”));
//自动
// ObjectMapper mapper = new ObjectMapper();
// JsonRootBean root = mapper.readValue(result, JsonRootBean.class);
// System.out.println(root);
// System.out.println(“公司:”+root.getResult().getCompany());
//通过 gson 方法
Gson gson=new Gson();
JsonRootBean root=gson.fromJson(result, JsonRootBean.class);
System.out.println(“公司:”+root.getResult().getCompany());

}else{
System.out.println(object.get(“error_code”)+”:”+object.get(“reason”));
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
getRequest1();
}

/**
*
* @param strUrl 请求地址
* @param params 请求参数
* @param method 请求方法
* @return 互连网请求字符串
* @throws Exception
*/
public static String net(String strUrl, Map params,String method) throws
Exception {
HttpURLConnection conn = null;
BufferedReader reader = null;
String rs = null;
try {
StringBuffer sb = new StringBuffer();
if(method==null || method.equals(“GET”)){
strUrl = strUrl+”?”+urlencode(params);
}
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
if(method==null || method.equals(“GET”)){
conn.setRequestMethod(“GET”);
}else{
conn.setRequestMethod(“POST”);
conn.setDoOutput(true);
}
conn.setRequestProperty(“User-agent”, userAgent);
conn.setUseCaches(false);
conn.setConnectTimeout(DEF_CONN_TIMEOUT);
conn.setReadTimeout(DEF_READ_TIMEOUT);
conn.setInstanceFollowRedirects(false);
conn.connect();
if (params!= null && method.equals(“POST”)) {
try {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(urlencode(params));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}
InputStream is = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sb.append(strRead);
}
rs = sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (conn != null) {
conn.disconnect();
}
}
return rs;
}

//将map型转为请求参数型
public static String urlencode(Map<String,String> data) {
StringBuilder sb = new StringBuilder();
for (Map.Entry i : data.entrySet()) {
try {
sb.append(i.getKey()).append(“=”).append(URLEncoder.encode(i.getValue()+””,”UTF-8″)).append(“&”);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}