Openlayers 3加载XYZ示例

Openlayers3中有个ol.source.XYZ类,可以加载Tile瓦片图层,本文只是做个说明,介绍如何识别以及如何正确加载这些图层。

一 基础XYZ-谷歌离线切片

明显的名称.png

观察这些Tile命名,xyz是很明显的,这是下载的谷歌切片,直接加载如下:

 var layer= new ol.layer.Tile({
     source : new ol.source.XYZ({
        url : 'http://localhost:8080/baseMap/{z}/{x}/{y}.png'
     })
});

二 变体XZY-谷歌在线切片

谷歌在线图的url.png

打开谷歌在线图,观察请求的url时,虽然看上去一大串一大串很长,似乎什么也看不懂,但是注意看红框出,在放大缩小时,1i是会变的,而且变化的值和地图的等级很相似,那么,我们很容易猜想,1i是z(level),2i,3i就是x,y(或者y,x)自己调调就可以了。
很明显,这些url也是基本的xyz,只是不是十分明显,需要心细的你仔细观察剥离出来参数即可。
代码如下:

var layer= new ol.layer.Tile({
     source : new ol.source.XYZ({
        url : 'http://www.google.cn/maps/vt?pb=!1m5!1m4!1i{z}!2i{x}!3i{y}!4i256!2m3!1e0!2sm!3i342009817!3m9!2szh-CN!3sCN!5e18!12m1!1e47!12m3!1e37!2m1!1ssmartmaps!4e0&token=32965'
     })
});

三 变形的XYZ-ArcServer切片

ArcServer切片.png

这是ArcServer的切片,感觉xyz不明显,但是组织形式也和xyz是一样的,其实,稍微想想,除了名字不一样,岂不都是一样,那么我们认为本质就是一样的,只是有个障眼法,问题就出在,ArcServer的图片是16进制的,位数是行R8位数,列C8位数,余位补0。
这里需要对图片名称转下,通过正常的url“翻译”到ArcServer的16进制。

 var road= new ol.layer.Tile({
               source : new ol.source.XYZ({
                                tileUrlFunction : function (xyz, obj1, obj2) {
                                    var z = xyz[0];
                                    var x = Math.abs(xyz[1]);
                                    var y = Math.abs(xyz[2]) - 1;
                                    var x = 'C' + padLeft(8, x.toString(16));
                                    var y = 'R' + padLeft(8, y.toString(16));
                                    var z = 'L' + padLeft(2, z);
                                    var url = 'ArcServerTile/' + z + '/' + y + '/' + x + '.png';
                                    return url;
                                }
                            })
            })
            //将10进制转16进制,余位补0,凑成ArcServer的切片格式
            function padLeft(num, val) {
                return (new Array(num).join('0') + val).slice(-num);
            }

通过tileUrlFunction重写url获取函数,构造成正确的,这里y-1不一定的,有的需要加1,有的需要z+-1,如果图片组合混乱的话,对z,y微微加减一调整下,应该很快就能凑齐地图。

四 变幻的XYZ-GeoWebCache切片

GeoWebCache切片.png

变幻而不是变形,说明万变不离其宗啊,GeoWebCache切片看着虽然很复杂,但是也是xyz吗,只不过变幻了,难道就认不出了?明显epsg_900913是坐标系,后面的_10是z。其他的虽然也是摸不着头脑,可以了解下GeoWebCache的切片组织规范,比如看下源码,然后理解了,稍微调整即可。

 var road= new ol.layer.Tile({
     source : new ol.source.XYZ({
              tileUrlFunction :function (xyz, obj1, obj2) {
          if (!xyz) 
              return "";        
          var z=xyz[0];
          var x=Math.abs(xyz[1]);
          var y=Math.abs(xyz[2]);
          var xyz_convert= convert_(z,x,y);
          x=xyz_convert[0];
          y=xyz_convert[1];
          z=xyz_convert[2];
          var shift = z / 2;
          var half = 2 << shift;
          var digits = 1;
          if (half > 10)
              digits = parseInt(Math.log(half)/Math.log(10)) + 1;
          var halfx = parseInt(x / half);
          var halfy = parseInt(y / half);
          x=parseInt(x);
          y=parseInt(y)+1;
          var url=tileRoot+"/EPSG_900913"+"_"+padLeft_(2,z)+"/"+padLeft_(digits,halfx)+"_"+padLeft_(digits,halfy)+"/"+padLeft_(2*digits,x)+"_"+padLeft_(2*digits,y)+"."+format;
          return url;
      }
    })
});


//字符截取
var padLeft_ = function(num, val) {
   return (new Array(num).join('0') + val).slice(-num);
};
//xy行列转换
var convert_=function(zoomLevel, x, y) {
    var extent = Math.pow(2, zoomLevel);
    if (x < 0 || x > extent - 1) {
        console.log("The X coordinate is not sane: " + x);
        return;
    }
    if (y < 0 || y > extent - 1) {
        console.log("The Y coordinate is not sane: " + y);
        return;
    }
    var gridLoc = [x, extent - y - 1, zoomLevel];
    return gridLoc;
}

这个的确有点复杂了。。。

综述:本文只是大概介绍下常见的XYZ格式和变体,对于简单的XYZ可以直接format加载,对于复杂的需要使用tileUrlFunction 甚至tilegrid组合,重写url,将标准的xyz,“翻译”成脾气不同的切片们,让他们乖乖听话,组成我们需要的切片。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,744评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,628评论 18 139
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,089评论 0 7
  • 六月,骄阳似火。 时间,走的真快。你姐前几年的中考仿佛还没有走远,你的中考日期,马上就要到了。 我曾经和你说过,你...
    暖意人生1阅读 187评论 2 1
  • 前天因为跟朋友吃饭,没有写简书,昨天因为跟老板看场地又没有写上。第一次想的是有一次没有完成挺好的,留点遗憾也挺好的...
    罗召伟阅读 235评论 6 5