📄 mifdoc.cpp
字号:
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 + -