//
地图类型类,构造函数参数分别为:
// 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方法来达到自己的目的。