Google Maps API 2.0解析(11-GCopyrightCollection动态向图片服务器请求代码)
//这几个类这次也是一个大的功能,假如你不在自定义的地图类型之中使用它,它除了不停的访问Google的图片服务器下载一些无关痛痒代码之外,什么都不会做
//可是假如你要在地图上显示动态的地图标注,它实际上就是一个向指定的服务器进行交互的功能,想想看,如果有一段代码不停的将当前位置服送给服务器,并江服务器返回的代码运行
//那基本上是非常方便的了
//这是代表地图上的一个版权申明标注
function GCopyRight(a,b,c,d)
{
this.id=a;
this.minZoom=c;
this.bounds=b;
this.text=d
}
//向地图上显示版权申明的类,参数a代表版权申明的文字内容
function GCopyrightCollection(a)
{
this.CopyrightIndex=[];
this.copyrights={};
this.prefix=a||""
}
GCopyrightCollection.prototype.addCopyright=function(a)
{
if(this.copyrights[a.id])
{
return
}
var b=this.CopyrightIndex;
var c=a.minZoom;
while(b.length<=c)
{
b.push([])
}
b[c].push(a);//将CopyRight建立基于zoom的索引
this.copyrights[a.id]=1; //设置flag,保证该CopyRight不会被重复添加
trigger(this,GEvent_newcopyright,a)
};
//搜索在a范围内,缩放等级大于b的Copyright
GCopyrightCollection.prototype.getCopyrights=function(a,b)
{
var c={};
var d=[];
var e=this.CopyrightIndex;
for(var f=GetMathMin(b,e.length-1);f>=0;f--)
{
var g=e[f];
var h=false;
for(var i=0;i<g.length;i++)
{
var l=g[i];
var n=l.bounds;
var p=l.text;
if(n.intersects(a))
{
if(p&&!c[p])
{
d.push(p);
c[p]=1
}
if(n.containsBounds(a))
{
h=true
}
}
}
if(h)
{
break
}
}
return d
};
//返回Copyright字符串
GCopyrightCollection.prototype.getCopyrightsString=function(a,b)
{
var c=this.getCopyrights(a,b);
if(c.length>0)
{
return this.prefix+" "+c.join(", ")
}
return null
};
//本类用来为地图加载和显示版权信息
function GMapCopyright(a,b)
{
this.map=a;
this.flag=b;
bind(a,"moveend",this,this.onMoveEnd);
bind(a,"resize",this,this.onResize)
}
GMapCopyright.prototype.onMoveEnd=function()
{
var a=this.map;
if(this.anchorLevel!=a.getZoom()||this.mapType!=a.getCurrentMapType())
{
this.getEvent();
this.reset();
this.run(0,0,true);
return
}
var b=a.getCenter();
var c=a.getBounds().toSpan();
var d=getMathRound((b.lat()-this.anchor.lat())/c.lat());
var e=getMathRound((b.lng()-this.anchor.lng())/c.lng());
this.event="p";
this.run(d,e,true)//d,e分别代表地图现在的中心和原来中心的差距比例
};
//地图大小变化时重置
GMapCopyright.prototype.onResize=function()
{
this.reset();
this.run(0,0,false)
};
//重新获取地图信息
GMapCopyright.prototype.reset=function()
{
var a=this.map;
this.anchor=a.getCenter();
this.mapType=a.getCurrentMapType();
this.anchorLevel=a.getZoom();
this.points={}
};
//获取地图的变化情况
GMapCopyright.prototype.getEvent=function()
{
var a=this.map;
var b=a.getZoom();
if(this.anchorLevel!=b)
{
this.event=this.anchorLevel<b?"zi":"zo"
}
if(!this.mapType)return;
var c=a.getCurrentMapType().getUrlArg();
var d=this.mapType.getUrlArg();
if(d!=c)
{
this.event=d+c
}
};
//a,b是地图现在的中心和原来中心的差距比例,c代表是否向服务器发送信息
GMapCopyright.prototype.run=function(a,b,c)
{
var d=a+","+b;
if(this.points[d])return;
this.points[d]=1;
if(c)
{
var e=new GCopyrightLoader();
e.getParam(this.map);
e.set("vp",e.get("ll"));
e.set("ll",null);
if(this.flag!="m")
{
e.set("mapt",this.flag)//默认是地图,如果不是,则发送图片名称标记
}
if(this.event)
{
e.set("ev",this.event);
this.event=""
}
try
{
var g=e.getUrl(f);
if(f)
{
GDownloadUrl(g,eval)//这个函数调用的意思是下载g文件并运行eval函数,实际上就是加载一个JS文件,这个可能存在浏览器兼容性的问题吧
}
else
{
var h=document.createElement("script");
h.setAttribute("type","text/javascript");
h.src=g;
document.body.appendChild(h)
}
}
catch(i)
{
}
}
};
//本方法用来组合向服务器发送的Copyright请求,使用一个param数组来存放所有的Url参数
function GCopyrightLoader()
{
this.params={}
}
GCopyrightLoader.prototype.set=function(a,b)
{
this.params[a]=b
};
GCopyrightLoader.prototype.get=function(a)
{
return this.params[a]
};
//从参数a(GMap)之中读取所需的参数
GCopyrightLoader.prototype.getParam=function(a)
{
this.set("ll",a.getCenter().toUrlValue());
this.set("spn",a.getBounds().toSpan().toUrlValue());
this.set("z",a.getZoom());
var b=a.getCurrentMapType().getUrlArg();
if(b!="m")
{
this.set("t",b)
}
this.set("key",tc)
};
//将参数组合成Url
GCopyrightLoader.prototype.getUrl=function(a,b)
{
var c=this.getParamString();
var d=b?b:_mUri;
if(c)
{
return(a?"":_mHost)+d+"?"+c
}
else
{
return(a?"":_mHost)+d
}
};
//本参数将所有的参数转化成一个编码过的字符串数组
GCopyrightLoader.prototype.getParamString=function(a)
{
var b=[];
var c=this.params;
for(var d in c)
{
var e=c[d];
if(e!=null)
{
b.push(d+"="+encodeURIComponent(e).replace(/%20/g,"+").replace(/%2C/gi,","))
}
}
return b.join("&")
};
//这个方法是将一个form的所有子控件的内容添加到网址之中,我实在不知道这个代码是要干什么用的,因为Google是通过JS向服务器交换信息的
//Google本身并没有创建任何Form,却要读取Form的内从并发送给服务器,这是为什么呢?实在是让人比较费解
//这段代码没有一个地方被引用,不过存在从服务器段返回的代码引用的可能
GCopyrightLoader.prototype.eh=function(a)
{
var b=a.elements;
for(var c=0;c<b.length;c++)
{
var d=b[c];
var e=d.type;
var f=d.name;
if("text"==e||"password"==e||"hidden"==e||"select-one"==e)
{
this.set(f,d.value)
}
else if("checkbox"==e||"radio"==e)
{
if(d.checked)
{
this.set(f,d.value)
}
}
}
};
//注意,在向服务器请求Copyright的时候
//向服务器请求的Url大致是这样的
// http://maps.google.com/maps?spn=0.041179,0.069008&z=13&key=&vp=37.408755,-121.836662&ev=p
//Google服务器返回的JS文档类似这样的:
// GAddCopyright("m","0",22.0310,-125.2410,49.0930,-62.7100,3,"NAVTEQ™");
//可是假如你要在地图上显示动态的地图标注,它实际上就是一个向指定的服务器进行交互的功能,想想看,如果有一段代码不停的将当前位置服送给服务器,并江服务器返回的代码运行
//那基本上是非常方便的了
//这是代表地图上的一个版权申明标注
function GCopyRight(a,b,c,d)
{
this.id=a;
this.minZoom=c;
this.bounds=b;
this.text=d
}
//向地图上显示版权申明的类,参数a代表版权申明的文字内容
function GCopyrightCollection(a)
{
this.CopyrightIndex=[];
this.copyrights={};
this.prefix=a||""
}
GCopyrightCollection.prototype.addCopyright=function(a)
{
if(this.copyrights[a.id])
{
return
}
var b=this.CopyrightIndex;
var c=a.minZoom;
while(b.length<=c)
{
b.push([])
}
b[c].push(a);//将CopyRight建立基于zoom的索引
this.copyrights[a.id]=1; //设置flag,保证该CopyRight不会被重复添加
trigger(this,GEvent_newcopyright,a)
};
//搜索在a范围内,缩放等级大于b的Copyright
GCopyrightCollection.prototype.getCopyrights=function(a,b)
{
var c={};
var d=[];
var e=this.CopyrightIndex;
for(var f=GetMathMin(b,e.length-1);f>=0;f--)
{
var g=e[f];
var h=false;
for(var i=0;i<g.length;i++)
{
var l=g[i];
var n=l.bounds;
var p=l.text;
if(n.intersects(a))
{
if(p&&!c[p])
{
d.push(p);
c[p]=1
}
if(n.containsBounds(a))
{
h=true
}
}
}
if(h)
{
break
}
}
return d
};
//返回Copyright字符串
GCopyrightCollection.prototype.getCopyrightsString=function(a,b)
{
var c=this.getCopyrights(a,b);
if(c.length>0)
{
return this.prefix+" "+c.join(", ")
}
return null
};
//本类用来为地图加载和显示版权信息
function GMapCopyright(a,b)
{
this.map=a;
this.flag=b;
bind(a,"moveend",this,this.onMoveEnd);
bind(a,"resize",this,this.onResize)
}
GMapCopyright.prototype.onMoveEnd=function()
{
var a=this.map;
if(this.anchorLevel!=a.getZoom()||this.mapType!=a.getCurrentMapType())
{
this.getEvent();
this.reset();
this.run(0,0,true);
return
}
var b=a.getCenter();
var c=a.getBounds().toSpan();
var d=getMathRound((b.lat()-this.anchor.lat())/c.lat());
var e=getMathRound((b.lng()-this.anchor.lng())/c.lng());
this.event="p";
this.run(d,e,true)//d,e分别代表地图现在的中心和原来中心的差距比例
};
//地图大小变化时重置
GMapCopyright.prototype.onResize=function()
{
this.reset();
this.run(0,0,false)
};
//重新获取地图信息
GMapCopyright.prototype.reset=function()
{
var a=this.map;
this.anchor=a.getCenter();
this.mapType=a.getCurrentMapType();
this.anchorLevel=a.getZoom();
this.points={}
};
//获取地图的变化情况
GMapCopyright.prototype.getEvent=function()
{
var a=this.map;
var b=a.getZoom();
if(this.anchorLevel!=b)
{
this.event=this.anchorLevel<b?"zi":"zo"
}
if(!this.mapType)return;
var c=a.getCurrentMapType().getUrlArg();
var d=this.mapType.getUrlArg();
if(d!=c)
{
this.event=d+c
}
};
//a,b是地图现在的中心和原来中心的差距比例,c代表是否向服务器发送信息
GMapCopyright.prototype.run=function(a,b,c)
{
var d=a+","+b;
if(this.points[d])return;
this.points[d]=1;
if(c)
{
var e=new GCopyrightLoader();
e.getParam(this.map);
e.set("vp",e.get("ll"));
e.set("ll",null);
if(this.flag!="m")
{
e.set("mapt",this.flag)//默认是地图,如果不是,则发送图片名称标记
}
if(this.event)
{
e.set("ev",this.event);
this.event=""
}
try
{
var g=e.getUrl(f);
if(f)
{
GDownloadUrl(g,eval)//这个函数调用的意思是下载g文件并运行eval函数,实际上就是加载一个JS文件,这个可能存在浏览器兼容性的问题吧
}
else
{
var h=document.createElement("script");
h.setAttribute("type","text/javascript");
h.src=g;
document.body.appendChild(h)
}
}
catch(i)
{
}
}
};
//本方法用来组合向服务器发送的Copyright请求,使用一个param数组来存放所有的Url参数
function GCopyrightLoader()
{
this.params={}
}
GCopyrightLoader.prototype.set=function(a,b)
{
this.params[a]=b
};
GCopyrightLoader.prototype.get=function(a)
{
return this.params[a]
};
//从参数a(GMap)之中读取所需的参数
GCopyrightLoader.prototype.getParam=function(a)
{
this.set("ll",a.getCenter().toUrlValue());
this.set("spn",a.getBounds().toSpan().toUrlValue());
this.set("z",a.getZoom());
var b=a.getCurrentMapType().getUrlArg();
if(b!="m")
{
this.set("t",b)
}
this.set("key",tc)
};
//将参数组合成Url
GCopyrightLoader.prototype.getUrl=function(a,b)
{
var c=this.getParamString();
var d=b?b:_mUri;
if(c)
{
return(a?"":_mHost)+d+"?"+c
}
else
{
return(a?"":_mHost)+d
}
};
//本参数将所有的参数转化成一个编码过的字符串数组
GCopyrightLoader.prototype.getParamString=function(a)
{
var b=[];
var c=this.params;
for(var d in c)
{
var e=c[d];
if(e!=null)
{
b.push(d+"="+encodeURIComponent(e).replace(/%20/g,"+").replace(/%2C/gi,","))
}
}
return b.join("&")
};
//这个方法是将一个form的所有子控件的内容添加到网址之中,我实在不知道这个代码是要干什么用的,因为Google是通过JS向服务器交换信息的
//Google本身并没有创建任何Form,却要读取Form的内从并发送给服务器,这是为什么呢?实在是让人比较费解
//这段代码没有一个地方被引用,不过存在从服务器段返回的代码引用的可能
GCopyrightLoader.prototype.eh=function(a)
{
var b=a.elements;
for(var c=0;c<b.length;c++)
{
var d=b[c];
var e=d.type;
var f=d.name;
if("text"==e||"password"==e||"hidden"==e||"select-one"==e)
{
this.set(f,d.value)
}
else if("checkbox"==e||"radio"==e)
{
if(d.checked)
{
this.set(f,d.value)
}
}
}
};
//注意,在向服务器请求Copyright的时候
//向服务器请求的Url大致是这样的
// http://maps.google.com/maps?spn=0.041179,0.069008&z=13&key=&vp=37.408755,-121.836662&ev=p
//Google服务器返回的JS文档类似这样的:
// GAddCopyright("m","0",22.0310,-125.2410,49.0930,-62.7100,3,"NAVTEQ™");
posted on 2006-05-16 00:33 K_Reverter 阅读(1444) 评论(0) 编辑 收藏 举报