书接上文,前面我们通过获取和返回图片的二进制字节流实现了天地图服务的加载,接下来,我们补充一下如何直接通过WebTiledLayer进行天地图服务的加载。仍然以加载空间参考是4490的天地图vec服务为例。
关键问题解决方案
问题的关键在于请求的header,我们可以通过全局修改请求header的方式,来解决这一问题。
Map<String, String> hm = new HashMap<String, String>();
hm.put("referer","https://androidapp");
RequestConfiguration requestConfiguration = RequestConfiguration.getGlobalRequestConfiguration();
requestConfiguration.setHeaders(hm);
RequestConfiguration.setGlobalRequestConfiguration(requestConfiguration);
WebTiledLayer加载方式
TileInfo的构建
ArrayList<LevelOfDetail> levels = new ArrayList<LevelOfDetail>();
levels.add(new LevelOfDetail(1,0.703125,295497593.05875003));
levels.add(new LevelOfDetail(2,0.3515625,147748796.52937502));
levels.add(new LevelOfDetail(3, 0.17578125, 73874398.264687508));
levels.add(new LevelOfDetail(4, 0.087890625, 36937199.132343754));
levels.add(new LevelOfDetail(5, 0.0439453125, 18468599.566171877));
levels.add(new LevelOfDetail(6, 0.02197265625, 9234299.7830859385));
levels.add(new LevelOfDetail(7, 0.010986328125, 4617149.8915429693));
levels.add(new LevelOfDetail(8, 0.0054931640625, 2308574.9457714846));
levels.add(new LevelOfDetail(8, 0.00274658203125, 1154287.4728857423));
levels.add(new LevelOfDetail(10, 0.001373291015625, 577143.73644287116));
levels.add(new LevelOfDetail(11, 0.0006866455078125, 288571.86822143558));
levels.add(new LevelOfDetail(12, 0.00034332275390625, 144285.93411071779));
levels.add(new LevelOfDetail(13, 0.000171661376953125, 72142.967055358895));
levels.add(new LevelOfDetail(14, 8.58306884765625e-005, 36071.483527679447));
levels.add(new LevelOfDetail(15, 4.291534423828125e-005, 18035.741763839724));
levels.add(new LevelOfDetail(16, 2.1457672119140625e-005, 9017.8708819198619));
levels.add(new LevelOfDetail(17, 1.0728836059570313e-005, 4508.9354409599309));
levels.add(new LevelOfDetail(18, 5.3644180297851563e-006, 2254.4677204799655));
levels.add(new LevelOfDetail(19, 2.6822090148925781e-006, 1127.2338602399827));
levels.add(new LevelOfDetail(20, 1.3411045074462891e-006, 563.61693011999137));
int iDPI = 96;
int iTileWidth = 256;
int iTileHeight = 256;
tileInfo = new TileInfo(iDPI, TileInfo.ImageFormat.MIXED, levels, new Point(-180, 90, SpatialReference.create(4490)), SpatialReference.create(4490), iTileHeight, iTileWidth);
全图范围的构建
fullExtent = new Envelope(-180.0,-90.0,180.0,90.0, SpatialReference.create(4490));
templateUri的构建
templateUri的构建有多种方式,基本方式分为两大类:
方式1
String templateUri = "http://{subDomain}.tianditu.gov.cn/vec_c/wmts?tk=6dfd31e3b55a8466f34997aee5551a9c&service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=c&TileMatrix={level}&TileRow={row}&TileCol={col}&style=default&format=tiles"
方式2
String templateUri = "http://{subDomain}.tianditu.gov.cn/DataServer?T=vec_c&x={col}&y={row}&l={level}&tk=6dfd31e3b55a8466f34997aee5551a9c"
这里的subDomain包含了t0,t1,t2,t3,t4,t5,t6共7个分发节点。
WebTiledLayer的构建
webTiledLayer = new WebTiledLayer(templateUri, Arrays.asList("t0","t1","t2","t3","t4","t5","t6"), tileInfo, fullExtent);
服务加载
map.getBasemap().getBaseLayers().add(webTiledLayer);
以上抛砖引玉,希望大家都能够顺利实现服务的加载和显示。