前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自学HarmonyOS应用开发(51)- 获取瓦片地图数据(续)

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

作者头像
面向对象思考
发布2021-07-15 16:45:45
5710
发布2021-07-15 16:45:45
举报
文章被收录于专栏:C++核心准则原文翻译
计算瓦片位置

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

代码语言:javascript
复制
//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线程的更新动作。

代码语言:javascript
复制
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的实现如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档