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
};
// 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方法来达到自己的目的。
posted on 2006-05-14 12:29 K_Reverter 阅读(2631) 评论(4) 编辑 收藏 举报