自学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() {
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() {
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 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!