《仔細細分析Ext》第N章図表、エクセル表、GIS、トポロジ構造第三節VMLに基づくWEBGIS 5



第一部分(底レイヤー)の完全な例コード:
         説明:ここではまずオリジナルのDivとTableを簡単にパッケージし、ImageLoaderクラスを作って画像をロードします.この部分のコードはVmlの内容に関係していません.各ブラウザに共通しています.FireFox、IE 8、Safariでテストに合格します.もし運行できないなら、Bugを見つけたら、いつでも教えてください.
 
         また、添付ファイルは完全な例であり、その下の図はすべての権利を保持し、商業用途に使用してはいけません.他のコードは任意に修正、使用できます.
/**
 * @author:    
 * @since:2009-06-02
 * @copyright:    ,            
 * @qun:88403922
 */

/********************************
 *       Vml
 *       
 ********************************/
Vml={
	version:'1.0'
};
//    
Vml.apply=function(des,src,defaults){
	if(defaults){
		Vml.apply(des,defaults);
	}
	if(des&&src&&typeof src=='object'){
		for(var p in src){
			des[p]=src[p];
		}
	}
	return des;
}
//      
Vml.applyIf=function (o, c){
    if(o && c){
        for(var p in c){
            if(typeof o[p] == "undefined"){ o[p] = c[p]; }
        }
    }
    return o;
}

Vml.id=0;//     ID   
Vml.getId=function(){
	return 'vml-gen-'+(Vml.id++);
};

/********************************
 *         Tabel
 ********************************/
//  Table      
Table=function(config){
	//     
	this.rows=1;
	this.columns=1;
	this.tds=new Array();//  td
	//    
	Vml.apply(this,config);
	//    
	var tab=document.createElement("table")
	tab.border=0;
	tab.cellPadding=0;
	tab.cellSpacing=0;
	var tBody=document.createElement("tbody");
	//      id,             id
	if(!config.id){
		tab.id=Vml.getId();
	}else{
		tab.id=config.id;
	}
	tab.tds=this.tds;
	
	var tr=null,td=null;
	for(var i=0;i<this.rows;i++){
		tr=document.createElement("tr");
		for(var j=0;j<this.columns;j++){
			td=document.createElement("td");
			this.tds.push(td);
			tr.appendChild(td);
		}
		tBody.appendChild(tr);
	}
	tab.appendChild(tBody);
	return tab;
}

/********************************
 *         Div
 ********************************/
//   Div      
Div=function(config){
	var div=document.createElement('div');
	if(!config.id){
		div.id=Vml.getId();
	}else{
		div.id=config.id;
	}
	Vml.apply(div.style,config);
	return div;
}

/********************************
 *          
 ********************************/
//     
ImgLoader=function(config){
	this.imgURL='.';
	this.imgNum=0;//    
	this.imgNamePrefix='img_';//      
	this.imgType=".jpg";
	Vml.apply(this,config);
	
	this.imgURLs=new Array();//    url
	this.imgs=new Array();//      
	this.loadedNum=0;
	this.loadProcId=null;
}
//      ,                    
ImgLoader.prototype.loadProgress=function(){
	var proDiv=document.getElementById('__progress');
	if(!proDiv){
		proDiv=new Div({
			id:'__progress',
			width:400,
			height:20,
			position:'absolute',
			left:(document.body.clientWidth/2-this.width),
			top:(document.body.clientHeight/2),
			backgroundColor:'#00ff00'
		});
		document.body.appendChild(proDiv);
	}else{
		var percent=(this.id/this.allNum*100).toFixed(1);
		proDiv.innerHTML='<font color="red">      ,   ...'+percent+"%</font>";
		if(percent==100){
			proDiv.innerHTML='    !';
			setTimeout(function(){
				try{
					document.body.removeChild(proDiv);//    div
				}catch(e){
				}
			},500);
		}
	}
	return this.id;
}
//     
ImgLoader.prototype.loadImg=function(interval,callback,tab){
	//             URL  
	for(var i=1;i<=this.imgNum;i++){
		this.imgURLs.push(this.imgURL+this.imgNamePrefix+(i<10?('0'+i):i)+this.imgType);
		var img=new Image();	//  image  
		img.GALLERYIMG="false";	//         
		img.id=i;				//        ,onload                     
		img.allNum=this.imgNum;	//         
		this.imgs.push(img);
	}
	
	//        
	var loadedNum=this.loadedNum;
	var imgs=this.imgs;
	var imgURLs=this.imgURLs;
	
	//    
	var cacheMethod=this.addToTable;
	var cache=this;
	var appendToTable=function(){
		cacheMethod.call(cache,tab);
	}
	
	//       
	var beginLoad=function(){		
		if(loadedNum<imgs.length){
			var img=imgs[loadedNum];
			img.src=imgURLs[loadedNum];
			/*
			 * if(img.complete):          ,        
			 *                ,    
			 *              ,       
			 *         ,            。
			 *    ,               ,           onload         
			 * firefox opera          onload   IE safari    。
			 *   ,         img onload   IE Safari         
			 */
			if(img.complete){
				callback.call(img);
			}
			img.onload=function(){
				var id=callback.call(img,tab);
				//                  
				if(id==imgs.length){
					appendToTable();
				}
			}
			loadedNum++;
			/*
			 *                  
			 *       ,        ,     
			 *         ,     ,            
			 *              
			 */
			setTimeout(beginLoad,interval);
		}
		
	};
	setTimeout(beginLoad,5);//           
}
//         
ImgLoader.prototype.addToTable=function(tab){
	for(var i=0;i<tab.tds.length;i++){
		try{
			tab.tds[i].appendChild(this.imgs[i]);
		}catch(e){
			
		}
	}
}
 
 
ページの呼び出し例:
 
<html xmlns:v="urn:schemas-microsoft-com:vml">
	<title>WEBGIS</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<STYLE type="text/css">
	 <!--
	 v\:* { BEHAVIOR: url(#default#VML) }
	 /*      */
	 .Title {
	    font-family:"  ", "    ";
	    font-size:16px;
	    text-align:center;
	    font-weight:bold;
	    color:#996600;
	     vertical-align:middle;
	 }
	 -->
	</STYLE>
	<script language="javascript" src="dump.js"></script>
	<script language="javascript" src="mylib.js"></script>
	<body>
	</body>
	<!--      -->
	<script language="javascript" type="text/javascript">
		//          Table
		var div=new Div({
			id:'test'
			//,
			//width:800,
			//height:400,
			//position:'absolute'
			//,
			//left:200,
			//top:20,
			//backgroundColor:'#cccccc'
		});
		document.body.appendChild(div);
		
		var tab=new Table({
			rows:16,
			columns:16,
			id:'test2'
		});
		div.appendChild(tab);
		
		var imgLoader=new ImgLoader({
			imgURL:'maps/heping/',
			imgNum:256,
			imgNamePrefix:'heping_'
		})
		//    :             、      、  
		imgLoader.loadImg(2,imgLoader.loadProgress,tab);
		//imgLoader.addToTable(tab);
	</script>
</html>
 
 
簡単なdumpツールを添付してjsのobjectを調整します.
/**
 * @description:dump  
 * @copyright:         
 */
function dump(obj) {
	m=window.open('','dump','toolbar=no,directories=no,menubar=no,location=no,scrollbars=yes,resizable=yes,status=no,copyhistory=no,top=300,left=370,width=300,height=150');
	m.document.writeln("<table border=1>");
	for(i in obj) {
		m.document.writeln("<tr><td>"+i+"</td><td>"+obj[i]+"</td></tr>");
	}
	m.document.writeln("</table>");
}
function dump2(obj){
	var str ="";
	for(var i=0; i<obj.attributes.length;i++){
		str += "
"+obj.attributes.item(i).name+":::"+obj.attributes.item(i).value; } alert(str); } function debug(message) { m=window.open('','dump','toolbar=no,directories=no,menubar=no,location=no,scrollbars=yes,resizable=yes,status=no,copyhistory=no,top=300,left=370,width=300,height=150'); m.document.writeln("<p>"); m.document.writeln(message); m.document.writeln("</p>"); }
 
その他の利用可能なリソース
1、openlayersシナリオ式地図:http://openlayers.org/
2、js-gis:http://jsgis.sourceforge.net/
3、専門レベルGis応用サイト「GIS宇宙ステーション」:http://www.gissky.net/
4、NASAマスタ局:http://www.nasa.gov/