用静态KML脚本在GoogleEarth上实现动态效果

项目遇到这样蛋疼的需求= =


KML文件本质上是一个文本文件,和大多数标记语言一样,有着相近的语法和格式。KML描述了地理要素相关的信息(如:点、线、面、图像等),可以被Google Earth、Google Maps解释和显示。


说白了,这是一个静态的东西。要实现动态的效果只有另寻良策。下面给出两种参考方法:

一、利用KML中的标签的链接功能,链接读取文件。

比如,我们有一个poly.kml



	   
		The Pentagon   
		     
			1     
			relativeToGround     
			       
				         
					           
						-77.05788457660967,38.87253259892824,100            
						-77.05465973756702,38.87291016281703,100            
						-77.05315536854791,38.87053267794386,100            
						-77.05552622493516,38.868757801256,100            
						-77.05844056290393,38.86996206506943,100            
						-77.05788457660967,38.87253259892824,100         
					       
				     
			     
			        
					         
					           
						-77.05668055019126,38.87154239798456,100            
						-77.05542625960818,38.87167890344077,100            
						-77.05485125901024,38.87076535397792,100            
						-77.05577677433152,38.87008686581446,100            
						-77.05691162017543,38.87054446963351,100            
						-77.05668055019126,38.87154239798456,100         
					       
				     
			   
		 
	


然后我们再新建一个watch.kml文件对其进行监视,watch.kml:




      inspect
      1
      1
      
              1
              1
              0
              
                      \poly.kml
                      onInterval
                      1
                      onStart
                      1
              
      


标签中是本文件要监视的链接地址,这个链接地址可以是本地磁盘上的一个文件,也可以是一个网络链接,本例设为poly.kml。

和< refreshMode>标签可以实现数据的实时更新。将refreshMode设置为onInterval模式,并在< refreshInterval >中设置间隔时间,那么GE将间隔指定的时间来刷新一下标签中的链接地址。

这样,我们可以每隔一段时间(比如1秒),复写poly.kml中的数据,然后watch获取和读取,即实现图像的动态变化。

使用的时候,只需要在GE中打开watch.kml即可。
更进一步,甚至可以用watch.kml监视和读取多个文件,添加标签数量即可:




      实时监控
      1
      1
      
              1
              0
              0
              
                      \poly.kml
                      onInterval
                      1
                      onStart
                      1
              
      
      
              1
              0
              0
              
                      \Poly_copy.kml
                      onInterval
                      1
                      onStart
                      1
              
      


这个方法的缺点在于,当kml文件较大时(大于1M),文件读写I/O耗时较多,容易导致watch.kml读取错误。把大文件分散,效果也不理想。

于是,有了方法二:

我们把kml文件看成一个剧本,GE就是按照这个剧本演示的剧组成员。也就是说,我们把动态效果所需的所有动作都全部预先在kml文件里设置好。

实现这一点,可以利用来对的时间属性进行定义,规定其开始和结束时间,下一次开始和结束时间,甚至再下一次开始和结束时间

比如line.kml:


	
		
		colorline
		#color_line
		
			 2009-01-01T00:00:00Z
			 2009-05-01T00:00:00Z
		
		
			0
			1
			clampToGround
			
				121.458,31.2222,0
				121.412,31.1285,0
			
		
	

	
		
		colorline
		#color_line
		
			2009-10-01T00:00:00Z
			 2009-12-01T00:00:00Z
		
		
			0
			1
			clampToGround
			
				121.458,31.2222,0
				121.412,31.1285,0
			
		
	
line.kml利用上述方法顺利地实现了同一条线段两次出现和消失的过程。需要注意的是,线段要重新定义一遍,即放在不同的中。


动态绘制线段根据实现需求还有一些其他技巧,比如为了让线段绘制的过程更加清晰,可以把线段等量地切分,然后通过上述串起来。


上述方法都略显蛮力,主要是受kml特性的约束,思路只能到此。

上一张成果,项目截图,亚洲地区的互联网拓扑和主要网关示意图:


你可能感兴趣的:(杂七杂八)