⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mifdoc.cpp

📁 地理信息系统常用数据交换文件Mif格式的读取,适合于地理信息系统、遥感、城市规划等专业开发人员使用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	size=5;
	color = PACK_COLOR((int)(red*255), (int)(green*255), (int)(blue*255), (int)(alpha*255));

  //从filename中提取路径名
  char datapath[256] = "";//文件路径名
  char datafile[256] = "";//文件名

  char line[128] = "";//文件中一行字符串
  char str[32] = "";  //行中一个字符串
  char name[16] = ""; //文件名
  
  int k = strlen(filename)-1;
  while (k >= 0 && filename[k] != '\\') k--;
  strncpy(datapath, filename, k);
  datapath[k]=0;

  //数据文件索引文件
	ifstream in2(filename);
	if (!in2) return ;

	//首先释放以前的线信息,然后读取新的地理线信息
     free_ln_type();

   	//读取线文件数目,存入num_ln_type
	in2.getline(line, sizeof(line));
	sscanf(line, "%d", &num_ln_type);
	if(num_ln_type == 0) 
	{
		return;
        AfxMessageBox("mif line file error"); 
	}
		
	//建立num_ln_type个线对象
    ln_type = (LineType*) new char[sizeof(LineType) * num_ln_type];
    for(int i=0;i<num_ln_type;i++)
	{
		LineType * type = &ln_type[i];
      

		//读取真正的数据文件名,存在datafile
       in2.getline(datafile,sizeof(datafile));

   
	   //读取颜色表信息
	   in2.getline(line, sizeof(line));
	   sscanf(line,  "%f %f %f %f %f", &red, &green, &blue, &alpha, &size);
      
	   //获取真正的全路径文件名,覆盖datafile
		strcpy(line, datafile);  
		strcpy(datafile, datapath);   
		strcat(datafile, "\\");
		strcat(datafile, line);
			
		//用读取的文件名作为该类线文件名
         int k = strlen(line)-1;
         while (k >= 0 && line[k] != '.') k--;
         strncpy(name, line, k);
         name[k]=0;
         strcpy(type->name,name);

	    ifstream in3(datafile);
    	if (!in3) 
		{
		 AfxMessageBox("mif line file open error");
			return ;
		}
        
//////////////////////////////////以下只读取了"version 300"一行,其余行都可以按照下面的方法读取

		//读取文件版本
		int ver=0;
		in3.getline(line,sizeof(line));
		sscanf(line,"%s %d",line,&ver);	
		
		//获得文件中线数目
		int linenum=0;

		//当文件未结束且文件未出现错误执行
		while(!in3.eof())
		{
			in3.getline(line,sizeof(line));
			sscanf(line,"%s",str);
			if((strcmp(str,"Pline")==0)||(strcmp(str,"pline")==0))
			{
				linenum++;				
			}

		}
     
		//
		type->num_ln=linenum;
		//关闭in3
		in3.close();
		
       	//新文件指针指到文件起点   
        ifstream in4(datafile);
		in4.getline(line,sizeof(line));
        	
        //type->pt=new Point[pointnum];
		type->ln = (Line*) new char[sizeof(Line) * linenum];

		//用j来表示依次读取文件内各数据线的操作 
	    int j = 0;		
	   while(!in4.eof())
		{
			in4.getline(line,sizeof(line));
			sscanf(line,"%s",str);

           int pointnum = 0;
	       if((strcmp(str,"Pline")==0)||(strcmp(str,"pline")==0))
			{	
			//读取每条线中含有的点数目
  			sscanf(line,"%s %d",str,&pointnum);

			//将点数目填入数组结构
			type->ln[j].num_pt = pointnum;

			//建立点坐标数组
			type->ln[j].pt = (GeoPoint*) new char[sizeof(GeoPoint) * pointnum];

			//读取各线中各点坐标
            int k ;
			for(k = 0;k <pointnum; k++)
			{
  			   	//流指针指向下一行
				in4.getline(line,sizeof(line));
             
				//读取点的经纬度
			 	sscanf(line,"%f %f",&type->ln[j].pt[k].lat,&type->ln[j].pt[k].lon);
				type->ln[j].pt[k].hgt = 0.0;
               
			}

			j++;

		   }
		   else
			   continue;
	   }    
	   	//关闭真正的数据文件
        in4.close(); 
	}
	//关闭mif索引文件
    in2.close();
   // AfxMessageBox("读取mif线文件成功!!!");
	redraw = true;

	return ;

}

void CMIFDoc::load_pg_mapinfo(char * filename)
{
	//颜色表处理
  	unsigned int color;
	float red,green,blue,alpha,size;
	red=1.0;
	green=0.5;
	blue=0.5;
	alpha=1.0;
	size=5;
	color = PACK_COLOR((int)(red*255), (int)(green*255), (int)(blue*255), (int)(alpha*255));

  //从filename中提取路径名
  char datapath[256] = "";//文件路径名
  char datafile[256] = "";//文件名

  char line[128] = "";//文件中一行字符串
  char str[32] = "";  //行中一个字符串
  char name[16] = ""; //文件名
  
  int k = strlen(filename)-1;
  while (k >= 0 && filename[k] != '\\') k--;
  strncpy(datapath, filename, k);
  datapath[k]=0;


   //数据文件索引文件
	ifstream in2(filename);
	if (!in2) return ;

	//首先释放以前的多边形信息,然后读取新的地理多边形信息
     free_pg_type();
	
	 //读取多边形文件数目,存入num_pg_type
	in2.getline(line, sizeof(line));
	sscanf(line, "%d", &num_pg_type);
	if(num_pg_type == 0) 
	{
		return;
        AfxMessageBox("mif polygon file error"); 
	}

	//建立num_ln_type个线对象
    pg_type = (PolygonType*) new char[sizeof(PolygonType) * num_pg_type];
    for(int i = 0;i < num_pg_type;i++)
	{
		PolygonType * type = &pg_type[i];
      

		//读取真正的数据文件名,存在datafile
       in2.getline(datafile,sizeof(datafile));

   
	   //读取颜色表信息
	   in2.getline(line, sizeof(line));
	   sscanf(line,  "%f %f %f %f %f", &red, &green, &blue, &alpha, &size);
      
	   //获取真正的全路径文件名,覆盖datafile
		strcpy(line, datafile);  
		strcpy(datafile, datapath);   
		strcat(datafile, "\\");
		strcat(datafile, line);
			
		//用读取的文件名(去掉扩展名)作为该类多边形文件名
         int k = strlen(line)-1;
         while (k >= 0 && line[k] != '.') k--;
         strncpy(name, line, k);
         name[k]=0;
         strcpy(type->name,name);

	    ifstream in3(datafile);
    	if (!in3) 
		{
		 AfxMessageBox("mif line file open error");
			return ;
		}
        
//////////////////////////////////以下只读取了"version 300"一行,其余行都可以按照下面的方法读取
		//读取文件版本
		int ver=0;
		in3.getline(line,sizeof(line));
		sscanf(line,"%s %d",str,&ver);
		
		//获得文件中多边形数目
		int polygonnum = 0;

		//当文件未结束且文件未出现错误执行
		while(!in3.eof())
		{
		 in3.getline(line,sizeof(line));
		 sscanf(line,"%s",str);
		if((strcmp(str,"Region")==0)||(strcmp(str,"region")==0))
			{
			 polygonnum++;				
			}

		}
		type->num_pg = polygonnum;

       // CString string;
        //string.Format("%d",polygonnum);
		//AfxMessageBox(string);

		//关闭in3
		in3.close();  
		
 	    //新文件指针指到文件起点   
        ifstream in4(datafile);
		in4.getline(line,sizeof(line));
        	
        //type->pg = new Polygon[polygonnum];
        //type->pg = (struct Polygon *) new char[sizeof(Polygon) * polygonnum];
		type->pg=(struct Polygon *)new char[228 * polygonnum];

	 	//用j来表示依次读取文件内线的各数据点的操作 
	    int j = 0;		
	   while(!in4.eof())
		{
			in4.getline(line,sizeof(line));
			sscanf(line,"%s",str);

             int pointnum = 0;
			   if((strcmp(str,"Region")==0)||(strcmp(str,"region")==0))
				{	
				//读取每个多边形含有的点数目
				in4.getline(line,sizeof(line));
  				sscanf(line,"%d",&pointnum);

				//将点数目填入数组结构
				type->pg[j].num_pt = pointnum;

				//建立点坐标数组
				type->pg[j].pt = (GeoPoint*) new char[sizeof(GeoPoint) * pointnum];

				//读取多边形中各点坐标
				int k ;
					for(k = 0;k < pointnum ; k++)
					{
  			   			//流指针指向下一行
						in4.getline(line,sizeof(line));
               
						//读取点的经纬度
			 			sscanf(line,"%f %f",&type->pg[j].pt[k].lat,&type->pg[j].pt[k].lon);
						type->pg[j].pt[k].hgt = 0.0;
                     
				
					  // CString string;
	                  // string.Format("type->pg[%d].pt[%d].lat = %f,type->pg[%d].pt[%d].lon = %f",j,k,type->pg[j].pt[k].lat,j,k,type->pg[j].pt[k].lon);
		             //  AfxMessageBox(string);
					}

		  		j++;

			   }
			  else
				   continue;
	   }    
	   	//关闭真正的数据文件
        in4.close(); 
		
	}
   
	//关闭mif索引文件
    in2.close();


    //AfxMessageBox("读取mif多边形文件成功!!!");
	redraw = true;
	return ;

}

void CMIFDoc::free_pt_type()
{
 /*	if (pt_type)
	{
		//释放各个点类型
		int i;
		for (i = 0; i < num_pt_type; i++)
			pt_type[i].free_pt_tp();

		delete []pt_type;	pt_type = NULL;
	}
*/	
	
	if(pt_type != NULL) delete (char *) pt_type;
	num_pt_type = 0;

}

void CMIFDoc::free_ln_type()
{
  
	if(ln_type != NULL) delete (char *) ln_type;
/*	if (ln_type)
	{
		//释放各个线类型
		int i;
		for (i = 0; i < num_ln_type; i++)
		{
			//释放各条线
			int j;
			for (j = 0; j < ln_type[i].num_ln; j++)
				ln_type[i].ln[j].free_ln();

			ln_type[i].free_ln_tp();
		}
		delete []ln_type;	ln_type = NULL;
	}
	*/
	num_ln_type = 0;

}

void CMIFDoc::free_pg_type()
{
		
	if(pg_type != NULL) delete (char *) pg_type;
	/*if (pg_type)
	{
		//释放各个多边形类型
		int i;
		for (i = 0; i < num_pg_type; i++)
		{
			//释放各个多边形
			int j;
			for (j = 0; j < pg_type[i].num_pg; j++)
				pg_type[i].pg[j].free_pg();

			pg_type[i].free_pg_tp();
		}
		delete []pg_type;	pg_type = NULL;
	}
	*/
	num_pg_type = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -