文档开发者中心
我的

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

IMG_20210326_080146.jpg

计算瓦片位置

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

收起
自动换行
深色代码主题
复制

//https://wiki.openstreetmap.org/wiki/Slippy_map_tilenamesint 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

作者著作介绍

《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

book.PNG

​对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。


觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

 

点赞
2
收藏
1
回复
2
分享
举报
浏览557 发布于2021-06-24 14:49未知归属地
全部评论
最多点赞
最新发布
最早发布
你怎么懂的这么多呢   
1楼回复于2021-07-03 01:53 未知归属地
大佬,我想学你这个地图功能,去哪里学啊,
2楼回复于2022-05-04 04:22 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。