ArcGIS Runtime SDK for Android100.5.0端加载天地图服务

本文介绍了一种通过构建TianDiTuLayer类实现天地图服务加载的方法。鉴于2019年后天地图服务调用需授权,原WebTiledLayer加载方式失效。文章详细展示了继承ImageTiledLayer并重写getTile方法,直接返回图片字节流,实现天地图加载的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道,自2019年1月起,天地图服务的调用都需要获取授权。在这种模式下,之前通过WebTiledLayer加载的方式在Android端就无法显示了,由下图可知,虽然正确发送了切片请求,但是,Runtime Android端返回的Content-Type是text/html,而不是能够解析的image/png。
![WebTiledLayer方式加载异常
基于此,我们将通过继承ImageTiledLayer并扩展protected abstract byte[] getTile​(TileKey tileKey)方法直接返回获得的图片字节流,从而构建天地图类,进而实现天地图的加载。

闲话少叙,直接上代码片段。

构建TianDiTuLayer类

public class TianDiTuLayer extends ImageTiledLayer {
    private String preTemplateURL;
    private Envelope fullExtent;
    private TileInfo tileInfo;

    protected TianDiTuLayer(String preTemplateURL, TileInfo tileInfo, Envelope fullExtent) {
        super(tileInfo, fullExtent);
        this.preTemplateURL = preTemplateURL;
    }

    @Override
    protected byte[] getTile(TileKey tileKey) {
        int level = tileKey.getLevel();
        int column = tileKey.getColumn();
        int row = tileKey.getRow();

        String tileURL = preTemplateURL + "&TileMatrix=" + level + "&TileCol=" + column + "&TileRow=" + row;
        // Log.i("TemplateURL", "The URL is:" + tileURL);
       
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            URL url = new URL(tileURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inStream = conn.getInputStream();
            byte[] btImg= readInputStream(inStream);
            return btImg;

        }catch(Exception e){
            e.printStackTrace();
        }

        return null;
    }

    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        outStream.flush();
        return outStream.toByteArray();
     }
}

构建TianDiTuLayer对象

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));
        String preTemplateURL = "http://t0.tianditu.com/vec_c/wmts?tk=6dfd31e3b55a8466f34997aee5551a9c&service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=c&&style=default&format=tiles";
        TianDiTuLayer tianDiTuLayer = new TianDiTuLayer(preTemplateURL, tileInfo, fullExtent);

前端加载

arcGISMap.getBasemap().getBaseLayers().add(tianDiTuLayer);

结果
由于本文主要目的是测试逻辑是否可行,代码细节并未过多考虑。请自行优化。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值