手绘地图制作的关键点之“图层覆盖”

前面介绍了《景区手绘地图(电子地图、智慧导览系统)如何制作》以及《景区手绘地图的绘制流程》,接下来介绍一些手绘地图制作的关键点。

手绘地图最关键的一点,就是把手绘地图准确的覆盖到地图平台。


手绘地图体验


一、地图开放平台接口

这是首要的关键点。

通过前面的介绍,我们知道,手绘地图是基于地图平台针对某一区域进行美化及手绘,从而生产一张精美的手绘图片文件。但这个文件并不能拿来直接使用,而必须要覆盖到地图平台之上才可发挥其价值。

要实现这个目的,我先简单介绍几个概念(这些概念在前面的文章都有比较详细的介绍,这里只做简单的回顾):

1.瓦片图

瓦片图是256像素的正方形图片,整个地图都是由瓦片图构成的。用瓦片图原因是,可按需要加载(按屏幕显示范围内的区域加载),解决的问题是,服务器及客户端设备内存问题,以及网络流量问题。

2.地图开放平台

高德、百度、腾讯、谷歌等等地图平台,都有开放的接口。通过这些开放接口,便可实现让手绘图覆盖到地图平台上。

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]});

高德地图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接口灵活和实用,因此不再过多赘述。

另外说一点,这个接口的复杂效果,个人经验是高德地图支持最完善。因此一直以来我都首推高德地图作为手绘地图平台。

在本文最后,衷心感谢各大地图开放平台。他们提供了大量可免费使用的资源,使得无数企业作为服务商可以为更多各行各业的需求方提供各种各样的解决方案,创造了难以估量的经济价值,体现了大企业的责任和担当。

最后,列一些开放地图平台文档:

高德地图:https://lbs.amap.com/api/javascript-api/summary

百度地图:https://lbsyun.baidu.com/index.php?title=jspopular3.0

腾讯地图:https://lbs.qq.com/webApi/javascriptGL/glGuide/glBasic

谷歌地图:https://developers.google.com/maps/documentation/javascript

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,578评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,701评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,691评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,974评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,694评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,026评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,015评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,193评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,719评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,442评论 3 360
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,668评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,151评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,846评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,255评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,592评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,394评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,635评论 2 380

推荐阅读更多精彩内容