Openlayers 3加载XYZ示例

简介: Openlayers3中有个ol.source.XYZ类,可以加载Tile瓦片图层,本文只是做个说明,介绍如何识别以及如何正确加载这些图层。一 基础XYZ-谷歌离线切片明显的名称.

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

一 基础XYZ-谷歌离线切片

img_5a2f8b6abc5c9edbc1641f61fb77762b.png
明显的名称.png

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

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

二 变体XZY-谷歌在线切片

img_1827cba4557439eb9174e24e94aa99a3.png
谷歌在线图的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切片

img_9b2142f11434f8f3ba9d3be7fa224afb.png
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切片

img_f20c045a523c97e971388205bd7c7fae.png
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,“翻译”成脾气不同的切片们,让他们乖乖听话,组成我们需要的切片。

相关文章
|
编解码 开发框架 Java
Unity 之 打包参数 -- Player面板属性详解
Unity Project Setting Player面板详解,看完这篇文章,彻底搞懂各个选项设置实际作用。
2016 0
Unity 之 打包参数 -- Player面板属性详解
|
5月前
|
JSON C++ 数据格式
【VsCode】通过tasks.json中的problemMatcher属性的fileLocation子属性设定问题的输出内容
vscode 对于 json 文件的解析方式的开源代码部分. 摘录 文件目录设定部分的说明:
85 0
|
计算机视觉 C#
知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?
一直以来,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法。这个方法虽然在xp/win7/win8下面都能够成果使用,但是一直以来我都没有动机去深入看一看这个方法。
1218 0
|
4月前
|
JSON 定位技术 API
谷歌地图接口Google Maps APIs中地图样式设计配置调整与JSON或URL导出
谷歌地图接口Google Maps APIs中地图样式设计配置调整与JSON或URL导出
|
8月前
|
JavaScript 机器人 vr&ar
19 个最佳Three.JS 示例
分享threejs.org 的 19个最佳三个 JS 示例
246 0
19 个最佳Three.JS 示例
|
C# 图形学
Unity通过组件名称字符串添加脚本
通过Type.GetType(string typeName)来得到字符串对应的Type。 Type.GetType(typeName)能获取到自定义类的类型,但是获取Unity的组件不行。 例如Type.GetType(“Rigidbody”)值为null,其实是少了程序集。 string qualifiedName = typeof(Rigidbody).AssemblyQualifiedName; ty 获取Unity的组件程序集全名,再通过Type.GetType()得到的就不为null了。
449 0
Unity通过组件名称字符串添加脚本
|
11月前
|
XML 数据可视化 JavaScript
Mosaic数据增强返回图片和对应的xml.py
Mosaic数据增强返回图片和对应的xml.py
58 0
|
JavaScript
Element UI - el-image 图片初始化加载爬坑
Element UI - el-image 图片初始化加载爬坑
1940 0
Element UI - el-image 图片初始化加载爬坑
|
C#
WPF Image Source 设置相对路径图片
原文:WPF Image Source 设置相对路径图片   BitmapImage bt = new BitmapImage(new Uri("Images\\3_u10484.png", UriKind.Relative));this.Img1.Source = bt;
3810 0
|
JSON JavaScript API
geoserver图层属性查询及查询结果转换为arcgis js api能使用的格式
一个项目使用了ArcGIS JS API开发GIS展示层,但GIS服务使用了Geoserver,这时加载Geoserver数据和查询数据就和之前完全不一样了,以下介绍下我使用ArcGIS JS API+Geoserver开发过程中解决Geoserver图层属性查询的一个方案。
1251 0

热门文章

最新文章