K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

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&trade;");

posted on 2006-05-16 00:33  K_Reverter  阅读(1444)  评论(0编辑  收藏  举报