重写 geturl Openlayers中使用TileCache加载预切割图片作为基础地图图层

摘要:
每张图片一张瓦片;其中的getURL返回的就是我们需要实现的图片地址;所以实现图片地址计算算法在该函数实现;参数bound就是一张图片的坐标边界值。一般地图图片先按等级zoom存放,每个zoom下面为该zoom下的所有图片,图片过多时还可以按row值分几个文件;如此类推。如下面一个继承自TileCache的类:Java代码/***对自定义规则切割的图片进行拼装的类*/SimpleTileCache=OpenLayers.Class(OpenLayers.Layer.TileCache,{initialize:function(name,url,options){vartempoptions=OpenLayers.Util.extend({'format':'image/png',isBaseLayer:true},options);OpenLayers.Layer.TileCache.prototype.initialize.apply(this,[name,url,{},tempoptions]);this.extension=this.format.split('/')[1].toLowerCase();this.extension=(this.extension=='jpg')?

Openlayers中使用TileCache加载预切割图片作为基础地图图层

Openlayers使用TileCache对象加载预切割的图片。每张图片一张瓦片;其中的getURL(bound)返回的就是我们需要实现的图片地址;所以实现图片地址计算算法在该函数实现;参数bound就是一张图片的坐标边界值。我们需要从这个bound计算图片的顺序数。一般地图图片先按等级zoom存放,每个zoom下面为该zoom下的所有图片,图片过多时还可以按row值分几个文件;如此类推。
如下面一个继承自TileCache的类:
Java代码 复制代码收藏代码重写 geturl Openlayers中使用TileCache加载预切割图片作为基础地图图层第3张
  1. /**
  2. *对自定义规则切割的图片进行拼装的类
  3. */
  4. SimpleTileCache=OpenLayers.Class(OpenLayers.Layer.TileCache,{
  5. initialize:function(name,url,options){
  6. vartempoptions=OpenLayers.Util.extend(
  7. {'format':'image/png',isBaseLayer:true},options);
  8. OpenLayers.Layer.TileCache.prototype.initialize.apply(this,[name,url,{},tempoptions]);
  9. this.extension=this.format.split('/')[1].toLowerCase();
  10. this.extension=(this.extension=='jpg')?'jpeg':this.extension;
  11. this.transitionEffect="resize";
  12. this.buffer=2;
  13. },
  14. /**
  15. *按地图引擎切图规则实现的拼接方式
  16. */
  17. getURL:function(bounds){
  18. varres=this.map.getResolution();
  19. varbbox=this.map.getMaxExtent();
  20. varsize=this.tileSize;
  21. //计算列号
  22. vartileX=Math.round((bounds.left-bbox.left)/(res*size.w));
  23. //计算行号
  24. vartileY=Math.round((bbox.top-bounds.top)/(res*size.h));
  25. //当前的等级
  26. vartileZ=this.map.zoom;
  27. if(tileX<0)tileX=tileX+Math.round(bbox.getWidth()/bounds.getWidth());
  28. if(tileY<0)tileY=tileY+Math.round(bbox.getHeight()/bounds.getHeight());
  29. returnthis.getTilePic(tileX,tileY,tileZ);
  30. },
  31. getTilePic:function(tileX,tileY,tileZ){
  32. vardir='';
  33. if(tileZ>6){
  34. vardelta=Math.pow(2,tileZ-5);
  35. varrowDir='R'+Math.floor(tileY/delta);
  36. varcolDir='C'+Math.floor(tileX/delta);
  37. dir=tileZ+"/"+rowDir+"/"+colDir+"/";
  38. }else{
  39. dir=tileZ+'/';
  40. }
  41. vartileNo=tileZ+"-"+tileX+"-"+tileY;
  42. varsUrl=this.url+dir+tileNo+'.png';
  43. returnsUrl;
  44. },
  45. clone:function(obj){
  46. if(obj==null){
  47. obj=newSimpleTileCache(this.name,this.url,this.options);
  48. }
  49. obj=OpenLayers.Layer.TileCache.prototype.clone.apply(this,[obj]);
  50. returnobj;
  51. },
  52. CLASS_NAME:"SimpleTileCache"
  53. });
/**
 * 对自定义规则切割的图片进行拼装的类
 */
SimpleTileCache=OpenLayers.Class(OpenLayers.Layer.TileCache,{
	initialize:function(name,url,options){
		var tempoptions = OpenLayers.Util.extend(
{'format': 'image/png',isBaseLayer:true},options);			        
		OpenLayers.Layer.TileCache.prototype.initialize.apply(this,[name, url, {}, tempoptions]);
		this.extension = this.format.split('/')[1].toLowerCase();
		this.extension = (this.extension == 'jpg') ? 'jpeg' : this.extension;
		this.transitionEffect="resize";
		this.buffer=2;		
	},
	/**
     *   按地图引擎切图规则实现的拼接方式
	 */
	getURL: function(bounds) {		    
		var res   = this.map.getResolution();			        
		var bbox  = this.map.getMaxExtent();
		var size  = this.tileSize;
		//计算列号		        
		var tileX = Math.round((bounds.left - bbox.left) / (res * size.w));
           //计算行号
		var tileY = Math.round((bbox.top-bounds.top) / (res * size.h));	
		//当前的等级			
		var tileZ = this.map.zoom;				        						        
		if(tileX<0) tileX=tileX+Math.round(bbox.getWidth()/bounds.getWidth());       
		if(tileY<0)  tileY=tileY+Math.round(bbox.getHeight()/bounds.getHeight());			        
		return	this.getTilePic(tileX,tileY,tileZ);
	},
	getTilePic: function(tileX,tileY,tileZ){
		var dir = '';
		if(tileZ > 6) {
			var delta       = Math.pow(2,tileZ-5);	    
			var rowDir   = 'R'+ Math.floor(tileY /delta);
			var colDir   = 'C'+Math.floor(tileX /delta);
			dir      = tileZ  + "/" + rowDir + "/" + colDir + "/";
		} else {
			dir= tileZ + '/';
		}				    
		var tileNo  = tileZ + "-" + tileX + "-" + tileY;
		var sUrl = this.url + dir + tileNo + '.png';
		return sUrl;
	},
	clone: function (obj) { 
		if (obj == null) {
		obj = new SimpleTileCache(this.name,this.url,this.options);
		}
		obj = OpenLayers.Layer.TileCache.prototype.clone.apply(this, [obj]);
		return obj;
	},
	CLASS_NAME: "SimpleTileCache"
});

该规测实现的图片地址如下面两种形式:
当zoom>6时:
http://serverUrl.../9/R13/C26/9-418-219.png
当zoom<=6时
http://serverUrl.../4/4-12-9.png
由于到9级时切割的文件过多,再按图片切割的行Rm和列Cn存储文件。

免责声明:文章转载自《重写 geturl Openlayers中使用TileCache加载预切割图片作为基础地图图层》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇跟我一起用Symfony写一个博客网站;删除海量数据之全表删除与部分删除下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合

场景 Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122143275 上面实现缩放地图时元素在指定距离内实现聚合效果。 实际场景中点位是变化的,不是静态的点位,当多个点位在动态更新的过程中如果出现了重合则自动...

Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动

场景 Vue+Openlayer使用overlay实现弹窗弹出显示与关闭: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/121268946 实现弹窗的效果可以参考上面。 要实现的效果是点击某个元素弹窗显示,并且弹窗随着元素的移动而移动。 实现元素移动的效果可以参考如下: Openlay...

openlayers 加载瓦片详解 一

在这先说点题外话,本人在研究webgl三维球过程中惊人发现,openlayers 的开发人员也在研究webgl并经证实他们也正在研发基于 webgl的三维gis开源平台,这可能是首个开源的三维平台,在现在三维大趋势下,看来openlayers 前景还是一片大好,闲话少说,静候佳音。 在这将分4篇文章来系统的详细的介绍openlayers 是怎么来加载本地及...

(转)Openlayers 2.X加载天地图

http://blog.csdn.net/gisshixisheng/article/details/44621923 概述: 在前面的章节,讲到了Arcgis for js加载天地图,在本节讲述如何在Openlayers 2.X的版本中加载天地图,并添加自己的wms服务。 效果: 地图 影像 地形 去掉本地wms 实现: 1、天地图服务 在天地图...

OpenLayers 3 入门教程

OpenLayers 3 入门教程摘要OpenLayers 3对OpenLayers网络地图库进行了根本的重新设计。版本2虽然被广泛使用,但从JavaScript开发的早期发展阶段开始,已日益现实出它的落后。 OL3已运用现代的设计模式从底层重写。 最初的版本旨在支持第2版提供的功能,提供大量商业或免费的瓦片资源以及最流行的开源矢量数据格式。与版本2一样,...

Openlayers 实现轨迹播放/暂停/重新播放/从点击处播放/提速/减速

说明: 我的需求是需要实现轨迹播放/暂停/重新播放/从点击处播放,因此封装了一个类 解决方案: 1、初始化:主要是处理一下图层以及数据,通过插值构造一个全局数组 /** * @description 初始化轨迹 */ (function init() { //地图容器 that....