专栏首页C++核心准则原文翻译自学HarmonyOS应用开发(51)- 获取瓦片地图数据(续)

自学HarmonyOS应用开发(51)- 获取瓦片地图数据(续)

计算瓦片位置

根据前一篇文章中说明的计算方法,我们提供以下代码实现:

//https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
int getTileCol(double long_deg, int zoom){
    int total_cols = (int)Math.pow(2, zoom);
    return (int)((long_deg + 180)/360 * total_cols);
}

int getTileRow(double lat_deg, int zoom){
    double tan = Math.tan(Math.toRadians(lat_deg));
    double asinh = Math.log(tan + Math.sqrt(tan * tan + 1));
    return (int)((1.0 - asinh / Math.PI) * Math.pow(2, zoom - 1));
}

获取瓦片数据

以下是获取瓦片数据的代码。由于整个获取过程的时间无法确定,因此将获取动作放入另外的任务。获取任务结束之后再触发UI线程的更新动作。

public void loadMapTile(){
    getContext().getGlobalTaskDispatcher(TaskPriority.DEFAULT).asyncDispatch(new Runnable() {
        @Override
        public void run() {
            int tileCol = getTileCol(longtitude, zoom);
            int tileRow = getTileRow(latitude, zoom);
            String urlString = String.format(getMapUrlString(), tileCol, tileRow, zoom);
            PixelMap map = getImagePixmap(urlString);
            tile = new PixelMapHolder(map);
            getContext().getUITaskDispatcher().asyncDispatch(new Runnable() {
                @Override
                public void run() {
                    TileMap.this.invalidate();
                }
            });
        }
    });
}

生成数据获取URL

代码中用到对的getMapUrlString的实现如下:

public final String getMapUrlString(){
    // 高德地图 - 矢量
    final String GAODE_V_MAP_URL = "https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=2&style=8&x=%d&y=%d&z=%d";
    // 高德地图 - 道路
    final String GAODE_R_MAP_URL = "https://webst02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=2&style=8&x=%d&y=%d&z=%d";
    // 高德地图 - 卫星
    final String GAODE_S_MAP_URL = "https://webst01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=2&style=6&x=%d&y=%d&z=%d";
    switch(mapSource){
        case GAODE_VECTOR:
            return GAODE_V_MAP_URL;
        case GAODE_ROAD:
            return GAODE_R_MAP_URL;
        case GAODE_SATELLITE:
            return GAODE_S_MAP_URL;
        default:
            return null;
    }
}

通过网络获取瓦片位图

getImagePixmap的代码原封不动引自董昱老师的TinyMap:

public static PixelMap getImagePixmap(String urlString) {
    try {
        URL url = new URL(urlString);
        URLConnection con = url.openConnection();
        con.setConnectTimeout(500*1000);
        InputStream is = con.getInputStream();
        ImageSource source = ImageSource.create(is, new ImageSource.SourceOptions());
        ImageSource.DecodingOptions options = new ImageSource.DecodingOptions();
        options.desiredSize = new Size(513,513);
        PixelMap pixelMap = source.createPixelmap(options);
        is.close();
        return pixelMap;
    } catch (Exception e) {
        return null;
    }
}

参考代码

完整代码可以从以下链接下载:

https://github.com/xueweiguo/Harmony/tree/master/StopWatch

参考资料

Slippy map tilenames(包含各种转换示例代码):

https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames\

董昱老师的TinyMap:

https://gitee.com/dongyu1009/tiny-map-for-harmony-os/tree/master/tinymap

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自学HarmonyOS应用开发(50)- 获取瓦片地图数据

    读者可以参照文后的链接了解瓦片地图的原理,这里不再重复。简单地说,瓦片地图就是将地图根据缩放层级进行分割,例如缩放层级为3,就表明将地图分为2的3次方行和2的3...

    面向对象思考
  • 自学HarmonyOS应用开发(52)- 地图数据拼接和缓存

    上一篇文章中我们获取了当前位置所处的地图瓦片并表示,本文介绍获取更多的瓦片数据并进行拼接的方法。

    面向对象思考
  • 自学HarmonyOS应用开发(55)- 使用对象关系映射数据库保存地图数据

    前一篇文章实现了地图数据的正确表示,但是由于每次执行都需要至少一次从网上获取地图数据,不可避免地产生显示延迟。本文介绍利用对象数据库储存已经获取的地图数据,从而...

    面向对象思考
  • 自学HarmonyOS应用开发(61)- 使用异步派发任务后台更新地图数据

    当第一次表示某地的地图数据时,由于数据需要从网络下载,因此会造成初次表示时间过长而影响响应速度的问题。我们使用异步派发任务解决这个问题。先看显示效果:

    面向对象思考
  • 十问华为HarmonyOS:开源一个月,开发者生态建设进度如何?

    基础软件的开源面临着非常大的挑战,除了技术研发困难重重,开源生态和社区的建设更是难上加难。9 月 10 日,在华为开发者大会 2020 上,华为消费者业务 CE...

    深度学习与Python
  • 技术分析 | HarmonyOS到底是不是Android套皮?

    最近鸿蒙系统关注度好高,支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词,吵的不可开交。

    刘盼
  • HarmonyOS与Android的全面对比

    第二是我个人非常看好鸿蒙系统的未来,清楚明白华为和一些民族企业担负的责任和国人的期待,虽然带着一些民族感情;鸿蒙刚发布的时候自己是非常激动的,但是后来项目太忙一...

    肉眼品世界
  • HarmonyOS简介

    前两天,华为发布了HarmonyOS 2.0,俺也赶个时髦,给大家简单介绍下HarmonyOS。

    xiangzhihong
  • 【第22期】HarmonyOS应用开发(基础篇)

    这不就是说,以后华为手机都是鸿蒙系统了嘛?鸿蒙还发出了一条视频,视频中显示2021年6月2号将开启鸿蒙操作系统及华为全场景新品发布会。预计现在支持EMUI11升...

    siberiawolf
  • 一个ADC实现多个按键检测

    按键作为常用的输入系统,如何准确并高效的获取按键值,是一个经常要面对的问题,常用的按键检测方式有如下几种方式:

    用户8913398
  • 展现鸿蒙的独特魅力:跨设备调用窗口(Page Ability)

    HarmonyOS的核心特性(或称为卖点)之一就是软总线技术,而Page Ability的跨设备迁移是软总线的一个具体技术实现。所谓跨设备迁移Page Abil...

    蒙娜丽宁
  • 程序员看华为HarmonyOS首发

    HarmonyOS代码正式开源,9月10日下午朋友圈散布着这条消息,科技圈炸锅了。各种声音的都有,我也挺好奇的,目前Android、iOS一统江湖,Harmon...

    马上就说
  • 搭建鸿蒙编译环境(VMware+Linux)

    分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发任务和传输数据。分布式软总线示意图见。

    跋扈洋
  • 配置鸿蒙Windows烧录环境 && 用Hiburn烧录第一个程序

    如果已安装Visual Studio Code,打开命令行工具,输入code --version命令,检查版本号是否为1.45.1及以上版本;可以正常返回版本号...

    跋扈洋
  • 自学鸿蒙应用开发(41)- 真机调试之准备调试证书

    启动DevEco Stduio之后,通过主菜单选择Build->Generate Key and CSR。

    面向对象思考
  • 华为鸿蒙生态的目标:市占率16%以上,跨过生死线

    9 月 10 日,华为正式推出 鸿蒙 OS 2.0 版本(HarmonyOS 2.0),并宣布将 Harmony OS 的代码捐赠给开放原子开源基金会进行开源孵...

    深度学习与Python
  • 我的HarmonyOS实战——鸿蒙系统初定义

    鸿蒙并不是一个单纯的手机操作系统,而是手机+智能设备的总称。可以安装在包括手机、手表、无人机等很多设备上。

    天道Vax的时间宝藏
  • 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!

    2020年9月10日,华为开发者大会发布了鸿蒙(HarmonyOS)2.0。HarmonyOS是全场景操作系统。也就是说,从理论上,HarmonyOS可以在任何...

    蒙娜丽宁
  • 鸿蒙(HarmonyOS)IDE迎来重大更新,新特性足以让你尖叫!

    鸿蒙(HarmonyOS)最新版的IDE Beta3于2021-03-31日发布,beta3增加了很多吸引人的功能,这些功能有一些与编程有关,有一些与配置、模板...

    蒙娜丽宁

扫码关注云+社区

领取腾讯云代金券