Google Maps API 2.0解析(10-GMapType GTileLayer _GoogleMapMercSpec _KeyholeMapMercSpec地图类型)

 

// 地图类型类,构造函数参数分别为:
   //  a 地图层GTileLayer数组
   //  b 使用的坐标系统
   //  c 名称
   //  d 配置类
   function  GMapType(a,b,c,d)
  {
   
var  e = d || {};
   
var  f = this ;
   f.layers
= a || [];
   f.name
= c || "" ;
   f.projection
= b || new  GProjection(); // 坐标系统
   f.shortName = e.shortName || c;
   f.urlArg
= e.urlArg || " c " ;
   f.maxResolution
= e.maxResolution || getComparedMethodResult(a,GTileLayer.prototype.maxResolution,Math.max);
   f.minResolution
= e.minResolution || getComparedMethodResult(a,GTileLayer.prototype.minResolution,Math.min);
   f.textColor
= e.textColor || " black " ;
   f.linkColor
= e.linkColor || " #7777cc " ;
   f.errorMessage
= e.errorMessage || "" ;
   f.tileSize
= e.tileSize || 256 ;
   
for ( var  g = 0 ;g < a.length; ++ g)
   {
    bind(a[g],GEvent_newcopyright,f,f.onNewCopyRight)
   }
  }
  GMapType.prototype.getName
= function (a)
  {
   
return  a ? this .shortName: this .name
  };
  
// 返回坐标系统
  GMapType.prototype.getProjection = function ()
  {
   
return   this .projection
  };
  GMapType.prototype.getTileLayers
= function ()
  {
   
return   this .layers
  };
  
// 返回所有的GCopyRight
  GMapType.prototype.getCopyright = function (a,b)
  {
   
var  c = this .layers;
   
var  d = [];
   
for ( var  e = 0 ;e < c.length;e ++ )
   {
    
var  f = c[e].getCopyright(a,b);
    
if (f)
    {
     d.push(f)
    }
   }
   
if (d.length > 0 )
   {
    
return  d.join( " " )
   }
   
return   null
  };
  GMapType.prototype.getMinimumResolution
= function (a)
  {
   
return   this .minResolution
  };
  GMapType.prototype.getMaximumResolution
= function (a)
  {
   
return   this .maxResolution
  };
  GMapType.prototype.getTextColor
= function ()
  {
   
return   this .textColor
  };
  GMapType.prototype.getLinkColor
= function ()
  {
   
return   this .linkColor
  };
  GMapType.prototype.getErrorMessage
= function ()
  {
   
return   this .errorMessage
  };
  GMapType.prototype.getUrlArg
= function ()
  {
   
return   this .urlArg
  };
  GMapType.prototype.getTileSize
= function ()
  {
   
return   this .tileSize
  };
  
// 根据经纬度中心和到中心的距离来返回最合适的缩放等级
  GMapType.prototype.getSpanZoomLevel = function (a,b,c)
  {
   
var  d = this .projection;
   
var  e = this .maxResolution;
   
var  f = this .minResolution;
   
var  g = getMathRound(c.width / 2 );
   
var  h = getMathRound(c.height / 2 );
   
for ( var  i = e;i >= f; -- i)
   {
    
var  l = d.fromLatLngToPixel(a,i);
    
var  n = new  GPoint(l.x - g - 3 ,l.y + h + 3 );
    
var  p = new  GPoint(n.x + c.width + 3 ,n.y - c.height - 3 );
    
var  t = new  GLatLngBounds(d.fromPixelToLatLng(n,i),d.fromPixelToLatLng(p,i));
    
var  v = t.toSpan();
    
if (v.lat() >= b.lat() && v.lng() >= b.lng())
    {
     
return  i
    }
   }
   
return   0
  };
  
// 根据经纬度范围和显示区域大小来返回最合适的缩放等级
  GMapType.prototype.getBoundsZoomLevel = function (a,b)
  {
   
var  c = this .projection;
   
var  d = this .maxResolution;
   
var  e = this .minResolution;
   
var  f = a.getSouthWest();
   
var  g = a.getNorthEast();
   
for ( var  h = d;h >= e; -- h)
   {
    
var  i = c.fromLatLngToPixel(f,h);
    
var  l = c.fromLatLngToPixel(g,h);
    
if (i.x > l.x)
    {
     i.x
-= c.getWrapWidth(h)
    }
    
if (getMathAbs(l.x - i.x) <= b.width && getMathAbs(l.y - i.y) <= b.height)
    {
     
return  h
    }
   }
   
return   0
  };
  GMapType.prototype.onNewCopyRight
= function ()
  {
   trigger(
this ,GEvent_newcopyright)
  };
  
// 抽象类GTileLayer,用来通过继承本GTileLayer生成自己的地图层
   function  GTileLayer(a,b,c)
  {
   
this .copyrights = a || new  GCopyrightCollection();
   
this .minResolution = b || 0 ;
   
this .maxResolution = c || 0 ;
   bind(a,GEvent_newcopyright,
this , this .onNewCopyRight)
  }
  GTileLayer.prototype.minResolution
= function ()
  {
   
return   this .minResolution
  };
  GTileLayer.prototype.maxResolution
= function ()
  {
   
return   this .maxResolution
  };
  GTileLayer.prototype.getTileUrl
= function (a,b)
  {
   
return  GPath_transImg
  };
  GTileLayer.prototype.isPng
= function ()
  {
   
return   false
  };
  GTileLayer.prototype.getOpacity
= function ()
  {
   
return   1
  };
  GTileLayer.prototype.getCopyright
= function (a,b)
  {
   
return   this .copyrights.getCopyrightsString(a,b)
  };
  GTileLayer.prototype.onNewCopyRight
= function ()
  {
   trigger(
this ,GEvent_newcopyright)
  };
  
// 这是Google地图模式的类,构造函数分别为:
   //  a 服务器列表
   //  b 版权信息名称
   //  c 缩放等级个数
   //  d 是否使用PNG格式的图片
   function  _GoogleMapMercSpec(a,b,c,d)
  {
   GTileLayer.call(
this ,b, 0 ,c); // 运行基类的构造函数
    this .serviceUrls = a;
   
this .usePng = d || false
  }
  InheritClass(_GoogleMapMercSpec,GTileLayer); 
// 继承基类的方法
  _GoogleMapMercSpec.prototype.getTileUrl = function (a,b)  // 覆盖getTileUrl方法
  {
   b
= this .maxResolution() - b;
   
var  c = (a.x + a.y) % this .serviceUrls.length; // 循环使用服务器的地址
    return   this .serviceUrls[c] + " x= " + a.x + " &y= " + a.y + " &zoom= " + b
  };
  _GoogleMapMercSpec.prototype.isPng
= function ()
  {
   
return   this .usePng
  };
  
// 这是卫星图模式的类,构造函数分别为:
   //  a 服务器列表
   //  b 版权信息名称
   //  c 缩放等级个数
   //  d 
   function  _KeyholeMapMercSpec(a,b,c,d,e)
  {
   GTileLayer.call(
this ,b, 0 ,c); // 运行基类的构造函数
    this .serviceUrls = a;
   
if (d)  // 将_mSatelliteToken存放在Cookie之中或者存在网址之中以发送给服务器
   {
    
this .Dg(d,e)
   }
  }
  InheritClass(_KeyholeMapMercSpec,GTileLayer); 
// 继承基类的方法
  _KeyholeMapMercSpec.prototype.Dg = function (a,b)
  {
   
if (testCookie(b))
   {
    document.cookie
= " khcookie= " + a + " ; domain=. " + b + " ; path=/kh; "
   }
   
else
   {
    
for ( var  c = 0 ;c < this .serviceUrls.length; ++ c)
    {
     
this .serviceUrls[c] += " cookie= " + a + " & "
    }
   }
  };
  
// 检查Cookie是否可用
   function  testCookie(a)
  {
   
try
   {
    document.cookie
= " testcookie=1; domain=. " + a;
    
if (document.cookie.indexOf( " testcookie " ) !=- 1 )
    {
     document.cookie
= " testcookie=; domain=. " + a + " ; expires=Thu, 01-Jan-70 00:00:01 GMT " ;
     
return   true
    }
   }
   
catch (b)
   {
   }
   
return   false
  }
  _KeyholeMapMercSpec.prototype.getTileUrl
= function (a,b)  // 覆盖getTileUrl方法,这个方法也就是卫星图的文件名加密算法
  {
   
var  c = Math.pow( 2 ,b);
   
var  d = a.x;
   
var  e = a.y;
   
var  f = " t " ;
   
for ( var  g = 0 ;g < b;g ++ )
   {
    c
= c / 2 ;
    
if (e < c)
    {
     
if (d < c)
     {
      f
+= " q "
     }
     
else
     {
      f
+= " r " ;
      d
-= c
     }
    }
    
else
    {
     
if (d < c)
     {
      f
+= " t " ;
      e
-= c
     }
     
else
     {
      f
+= " s " ;
      d
-= c;
      e
-= c
     }
    }
   }
   
var  h = (a.x + a.y) % this .serviceUrls.length;
   
return   this .serviceUrls[h] + " t= " + f
  };

        这几个类是非常重要的,因为根据经纬度算出图片路径的方法就在其中,而且,假如你要创建自己的地图类型,你可能也要仔细研究这段代码,通过实现GTileLayer方法来达到自己的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值