手绘地图制作的关键点之“图层覆盖”
前面介绍了《景区手绘地图(电子地图、智慧导览系统)如何制作》以及《景区手绘地图的绘制流程》,接下来介绍一些手绘地图制作的关键点。
手绘地图最关键的一点,就是把手绘地图准确的覆盖到地图平台。
手绘地图体验
一、地图开放平台接口
这是首要的关键点。
通过前面的介绍,我们知道,手绘地图是基于地图平台针对某一区域进行美化及手绘,从而生产一张精美的手绘图片文件。但这个文件并不能拿来直接使用,而必须要覆盖到地图平台之上才可发挥其价值。
要实现这个目的,我先简单介绍几个概念(这些概念在前面的文章都有比较详细的介绍,这里只做简单的回顾):
1.瓦片图
瓦片图是256像素的正方形图片,整个地图都是由瓦片图构成的。用瓦片图原因是,可按需要加载(按屏幕显示范围内的区域加载),解决的问题是,服务器及客户端设备内存问题,以及网络流量问题。
2.地图开放平台
高德、百度、腾讯、谷歌等等地图平台,都有开放的接口。通过这些开放接口,便可实现让手绘图覆盖到地图平台上。
高德地图demo
二、手绘地图覆盖到地图平台的方式
每个地图开放平台都提供了多种把手绘地图覆盖到平台的实现方式。
此处以高德地图为例说明。高德地图一共提供了这么多接口,分别都可以实现自定义图层覆盖到地图平台:
AMap.TileLayer.Flexible
AMap.ImageLayer
AMap.CanvasLayer
AMap.VideoLayer
AMap.CustomLayer
根据我的经验,在手绘地图覆盖这个场景,比较适用的是:
AMap.TileLayer.Flexible
AMap.ImageLayer
这两个接口,分别对应上文描述的“瓦片图实现地图”及“一整张图实现地图”。ImageLayer这个接口,可以实现把整张手绘地图覆盖到地图平台上。事实上,依我的了解,业内也有采取这个解决方案的系统。但是就个人而言,我更推荐接口TileLayer.Flexible,此接口就是采取瓦片图的方案来把手绘地图覆盖到地图平台。
ImageLayer接口代码如下所示(高德官方代码),由其图片参数可见,是一张整图:
var imageLayer = new AMap.ImageLayer({url: 'http://amappc.cn-hangzhou.oss-pub.aliyun-inc.com/lbs/static/img/dongwuyuan.jpg',bounds: new AMap.Bounds([116.327911, 39.939229],[116.342659, 39.946275]),zooms: [15, 18]
});
TileLayer.Flexible接口代码如下所示:
var tileLayer = new AMap.TileLayer.Flexible({cacheSize: 30,zIndex: 200,createTile: function (x, y, zoom, success, fail) {var imagePath = tileHost + '/uploades/map/" + zoom + "/tile" + x + "_" + y + 'amap.png';var img = document.createElement('img');img.onload = function () {success(img);};img.crossOrigin = "anonymous";img.onerror = function () {fail();};img.src = imagePath; success(img);}
});
此接口有createTile方法,开放了3个参数,就是至关重要的地图层级zoom,以及瓦片图的坐标x/y。通过这3个参数,我们就可以把整张手绘地图切为瓦片图来覆盖到地图平台之上,达到用户使用时也按需加载的效果。
三个参数决定瓦片图
三、更复杂和完善的手绘地图覆盖的效果
高德地图的TileLayer.Flexible接口还有一个参数,便是success这个函数。在createTile方法里,我们其实还可以自定义更加复杂的内容,然后传入success这个函数,高德地图会自动把传入的对象渲染到瓦片里。
根据这个原理,我们可以实现更加复杂的需求,如:因为国内无法正常访问谷歌地图,而高德、百度等地图在国外访问网络延迟严重且地图数据欠缺,所以对于国外的区域或景区这种场景,我们就可以通过此接口实现全球可访问的手绘地图。
具体的实现方式如下:
var tileLayer = new AMap.TileLayer.Flexible({cacheSize: 30,zIndex: 200,createTile: function (x, y, zoom, success, fail) { var div = document.createElement('div');var img2 = document.createElement('img');img2.setAttribute("crossOrigin", 'Anonymous');img2.onload = function () {div.appendChild(img2);};img2.style = "position:absolute;width:256px;height:256px;z-index:-2;";img2.onerror = function () {fail()};img2.src = tileHost + '/uploades/map/map_'+ mId +"/" + zoom + "/tile" + x + "_" + y + 'amapgoogle.png';var img = document.createElement('img');img.onload = function () {div.appendChild(img);};img.style = "position:absolute;width:256px;height:256px;z-index:-1;";img.crossOrigin = "anonymous";img.onerror = function () {fail()}; img.src = tileHost + '/uploades/map/map_'+ mapId +"/" + zoom + "/tile" + x + "_" + y + 'amap.png';success(div); }
});
这样就实现了加载两个瓦片图,重叠到瓦片区里。其中除了我们自己的手绘地图的瓦片之外,另外的瓦片图是谷歌地图的底图瓦片。
谷歌地图在国内无法访问,我们可以采用把它缓存到服务器的方案,这样就可以达到国内能通过高德地图来实现访问谷歌地图的底图。而国外区域的用户,则直接调用谷歌地图。这样实现国内国外均能访问。
顺便说一下,谷歌地图的瓦片图加载方案,也是大同小异的。
这里另外有一个需要注意注意的点就是,怎么判断当前用户是在国内还是国外。可以通过经纬度判断,可以通过IP判断。我建议通过经纬度,更加直观明了且准确。但是中国的版图区域,是一个很复杂的多边形,因此,需要一些较为复杂的计算。这个点现在就不展开,后面有机会再细说。
复杂的多图瓦片
四、手绘地图覆盖到平台的关键技术点
通过上文可知,手绘地图要覆盖到平台,最关键的点就在于瓦片图的层级、x/y坐标。
而这一点,其本质又是手绘地图所在区域的经纬度所决定的。
因此,在《景区手绘地图(电子地图、智慧导览系统)如何制作》以及《景区手绘地图的绘制流程》都有所提及或强调,手绘地图底图的获取,可以基于系统直接下载。然后设计师在设计手绘地图的时候,需要特别注意,不能随意修改手绘地图的像素尺寸。因为修改之后,就会导致区域发生变化,然后经纬度就会出现误差。
在下载地图底图的时候,系统已知地图的经纬度,因此系统在对完成的手绘地图进行切片的时候,就会从默认记忆的经纬度开始计算,通过地球的经纬度、墨卡托坐标、像素偏移三者的转换关系,计算出当前手绘图层的第一张瓦片的偏移位置。找到此关键之后,后面切图就非常简单,只需要以256像素为依据,进行累加切图即可。
这里需要注意的是,实际上256像素的瓦片,在手机上的显示效果并不佳,看上去不是很清晰。这里涉及手机屏幕和PC屏幕硬件及显示像素的差异原理。解决此问题不难,这里便不展开说明了。
瓦片图准确覆盖
五、更好的图层加载体验
因为手绘地图打开之后,要加载的瓦片图很多,即便是只加载可视区域内的瓦片图,数量也是不少。因此,为了用户在使用手绘地图时有更好的放大、缩小查看的体验,我们可以使用预加载瓦片图方案。
具体的方案就是,系统在完成用户当前所在层级的瓦片图加载之后,便可以对相邻的大一级和小一级的瓦片图进行加载。因为知道当前层级的经纬度,因此也能计算出相邻的两个级别的经纬度,进而对相应的瓦片图进行加载。加载之后,当用户放大或缩小手绘地图层级时,便可快速显示瓦片图而不需要再临时加载,获得“网络更快”的体验。
实现预加载的核心代码:
for (x = xMin; x <= xMax; x ++) {for (y = yMin; y <= yMax; y ++) {if (preloadPics[x + '_' + y]) {continue;}preloadPics[x + '_' + y] = true;var picUrl = tileHost + '/uploades/map/'+ zoom +'/tile'+ x +'_'+ y +'amap.png';(new Image()).src = picUrl;}
}
预加载的两个相邻层级的瓦片图
六、结尾
手绘地图覆盖到底图的方式,其实还有更多,但根据我有限的经验,觉得其他方式都没有TileLayer.Flexible接口灵活和实用,因此不再过多赘述。
另外说一点,这个接口的复杂效果,个人经验是高德地图支持最完善。因此一直以来我都首推高德地图作为手绘地图平台。
在本文最后,衷心感谢各大地图开放平台。他们提供了大量可免费使用的资源,使得无数企业作为服务商可以为更多各行各业的需求方提供各种各样的解决方案,创造了难以估量的经济价值,体现了大企业的责任和担当。
最后,列一些开放地图平台文档:
高德地图:概述-地图 JS API | 高德地图API
百度地图:地图 JS API | 百度地图API SDK
腾讯地图:JavaScript API | 腾讯位置服务
谷歌地图:https://developers.google.com/maps/documentation/javascript
手绘地图制作的关键点之“图层覆盖”相关推荐
- 手绘地图制作的关键点之“导航智能纠偏”
这里再来聊一聊关于手绘地图导航的智能纠偏问题. 其实这个问题,在<手绘地图制作的关键点之"实时导航">一文中,已经有过简述,这里再来细聊一下.本文纯属方案探讨,也是景 ...
- 手绘地图制作的关键点之“实时导航”
接上文<手绘地图制作的关键点之"图层覆盖">,继续来聊聊手绘地图另外一个关键点. 那就是"实时导航". 作者:轻轻的烟雾(z281099678) 之 ...
- 如何制作手绘地图?如何将图片图层精确地对准在地图上?
最近大家常常在问,如何制作鼓浪屿手绘地图,如何将气象图层叠加在高德地图上啊? 其实地图上的研发量很小,几行代码就可以搞定. 关键是在图片绘制上,有较高的要求. 下面就用简单粗暴的方法来实现,如有不妥之 ...
- 手绘地图如何制作为电子地图实现智慧导览系统之切割瓦片图
此系列文章主要简述一下如何把手绘地图的静态图片文件制作成为动态的电子地图,进而实现智慧导览. 因为手绘地图是一张静态的图片文件,而且往往很大,因此要转为手绘地图,才更方便用户查看.那么到底如何才能实现 ...
- 手绘地图深度解析:类型、风格、功能、价值、制作流程、智慧导览
本文概要:文本尝试系统性.多角度.全方位的介绍一下现在流行的手绘地图系统. 作者:轻轻的烟雾(z281099678) 一.手绘地图定义 什么是手绘地图?或者说,手绘地图到底是什么样的? 手绘地图首先是 ...
- H5手绘地图(自定义栅格图层)踩坑
手绘地图简介 手绘地图顾名思义就是手工绘制的地图,比普通的地图更有观赏性和生动性,通过把特定的地点绘制出来,兼具实用和纪念性,同时更加具有可看性.一般在旅游景点有很多这种纸质版手绘地图.比如这种: 前 ...
- 制作手绘地图并准确覆盖到地图的超简单流程
第一步,取得底图. 如果要制作比较准确匹配到地图特定区域的手绘地图,首先要取得这部分区域的地图作为绘图的底图.可以用bigemap地图下载器,下载这部分区域的地图保存为后缀为 tif 的文件,保存 ...
- 如何制作专业的手绘地图(电子地图、智慧导览系统)
一.智慧导览系统介绍 手绘电子地图,就是把手绘地图覆盖到地图上,游客或者普通用户,可以在手机上通过地图的链接(或者现在流行的小程序)打开使用.是一种使用非常方便,集**"视.听.路径规划.实 ...
- 将手绘地图或自制地图显示在网页上(利用百度API)
利用百度APi实现将手绘地图展示在网页上,达到类似这样的效果: 切图参考了:cnblog jz1108 并用了其工具, 表示非常感谢! 百度地图API目前默认支持两种地图类型(map type):普通 ...
最新文章
- word使用宏命令批量按比例设置图片大小
- html 未来元素绑定事件,jquery on如何给未来元素绑定事件?
- 直接裂开!京东二面被问SpringBoot整合MongoDB,我不会啊
- bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
- phpcmsV9推荐位posid文章,图片不显示问题 - 思路篇
- php 变量代码,php中的可变变量(代码详解)
- 能在市场上大概率赚钱的人类型
- 行存储索引改换成列存储索引_索引策略–第2部分–内存优化表和列存储索引
- JVM第三节:垃圾回收算法与垃圾回收器
- Ubuntu翻译PDF论文
- 如何同时将多张图片进行批量无损压缩、调整尺寸及调整大小
- 【整站下载器】小飞兔整站下载V5.0
- Python爬虫进行Web数据挖掘总结和分析
- 《游戏系统设计一》游戏任务系统太复杂,带你一步一步实现
- 数据分析的类型有哪些?
- 微信小程序开发之——婚礼邀请函-邀请函页面(4.3)
- 客户端GUI测试技术和自动化测试架构设计简谈
- 初识STM32---基于STM32的室内温湿度检测
- 面试知识点-网络——HTTP与TLS
- 解密你为何成不了富人
热门文章
- python装饰器带参数函数二阶导数公式_MVision/caffe_简介_使用.md at master · Ewenwan/MVision · GitHub...
- RTT-thread 邮箱的管理方式
- Python练习二:公用电话数据加密
- 苹果ios应用加急审核
- C++ 反汇编/栈帧
- 当互联网变成一座牢笼,该如何去谈自由?
- 有趣的超短python代码_神级Coder绝不犯的错误:为炫耀编出超短码
- MOS管(场效应管)
- HTML5七夕情人节表白网页_飘落蒲公英动画超酷炫的HTML5页面_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册
- flutter 数据持久化之sqflite