1 代码示例
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
void show(char aa[])
{
int i;
for(i=0;i<8;i++)
printf("%c",aa[i]);
printf("\n");
}
void sh_handle()
{
}
int OnChangeByteOrder(int indata)
{
char ss[9];
char ee[8];
unsigned long val=unsigned long(indata);
ultoa(val,ss,16);// 将十六进制的数(val)转到一个字符串(ss)中,itoa(val,ss,16);
int i;
int length=strlen(ss);
if(length!=8)
{
for(i=0;i<8-length;i++)
ee[i]='0';
for(i=0;i<length;i++)
ee[i+8-length]=ss[i];
for(i=0;i<8;i++)
ss[i]=ee[i];
}
////****** 进行倒序
int t;
t=ss[0];ss[0]=ss[6];ss[6]=t;
t=ss[1];ss[1]=ss[7];ss[7]=t;
t=ss[2];ss[2]=ss[4];ss[4]=t;
t=ss[3];ss[3]=ss[5];ss[5]=t;
////******
//****** 将存有十六进制数 (val) 的字符串 (ss) 中的十六进制数转成十进制数
int value=0;
for(i=0;i<8;i++)
{
int k;
if(ss[i]=='a'||ss[i]=='b'||ss[i]=='c'||ss[i]=='d'||ss[i]=='e'||ss[i]=='f')
k=10+ss[i]-'a';
else
k=ss[i]-'0';
//printf("k=%d\n",k);
value=value+int(k*pow(16,7-i));
}
//printf("value=%d\n",value);
return(value);
}
void OnWriteLineShp(FILE * ShpFile_fp)
{
}
void OnReadLineShp(FILE * ShpFile_fp)
{
// 读取线状目标的实体信息
FILE * fp;
if((fp=fopen("F:\\学习\\C++实验\\武汉shp\\桥梁_polyline.dxf","w"))==NULL) //新建一个dxf文件
{
exit(0);
}
//------------------------------------------------------
//写入dxf文件中,在新建的dxf中写入下列内容
fprintf(fp,"0\nSECTION\n");//fprintf( FILE *stream, const char *format, [ argument ]...),fprintf()函数根据指定的格式(format)向输出流(stream)写入数据(argument)
fprintf(fp,"2\nENTITIES\n");//fprintf( FILE *stream, const char *format, [ argument ]...),fprintf()函数根据指定的格式(format)向输出流(stream)写入数据(argument)
//------------------------------------------------------
int i,j;
int RecordNumber;
int ContentLength;
int num=0;
while((fread(&RecordNumber,sizeof(int),1,ShpFile_fp)!=0))//从ShpFile_fp中以int型字节的长度,读取一次,并将其读取到RecordNumber中
{
//printf("转换前RecordNumber=%d\n",RecordNumber);
RecordNumber=OnChangeByteOrder(RecordNumber);//对RecordNumber进行转化后打印输出
printf("\n\nRecordNumber=%d\n",RecordNumber);
//fprintf(fp,"\n\nRecordNumber=%d\n",RecordNumber);
fread(&ContentLength,sizeof(int),1,ShpFile_fp);//从ShpFile_fp中以int型字节的长度,读取一次,并将其读取到ContentLength中
//printf("转换前ContentLength=%d\n",ContentLength);
ContentLength=OnChangeByteOrder(ContentLength);//对其进行转化 并输出
printf("ContentLength=%d\n",ContentLength);
//fprintf(fp,"ContentLength=%d\n",ContentLength);
int shapeType;
double Box[4];
int NumParts;
int NumPoints;
int *Parts;
fread(&shapeType,sizeof(int),1,ShpFile_fp);//从ShpFile_fp中以int型字节的长度,读取一次,并将其读取到ContentLength中
printf("shapeType=%d\n",shapeType);//打印输出
//fprintf(fp,"shapeType=%d\n",shapeType);
for(i=0;i<4;i++)
{
fread(Box+i,sizeof(double),1,ShpFile_fp); // 读 Box
printf("Box+%d=%lf\n",i,*(Box+i));
}
fread(&NumParts,sizeof(int),1,ShpFile_fp);// 读 NumParts
printf("NumParts=%d\n",NumParts);
//fprintf(fp,"NumParts=%d\n",NumParts);
fread(&NumPoints,sizeof(int),1,ShpFile_fp);// 读NumPoints
printf("NumPoints=%d\n",NumPoints);
//fprintf(fp,"NumPoints=%d\n",NumPoints);
Parts=new int[NumParts];
for(i=0;i<NumParts;i++)
{
fread(Parts+i,sizeof(int),1,ShpFile_fp);
printf("Parts+%d=%d\n",i,*(Parts+i));
}
int pointNum;
for(i=0;i<NumParts;i++)
{
if(i!=NumParts-1)
pointNum = Parts[i+1]-Parts[i];
else
pointNum = NumPoints-Parts[i];
double *PointsX;
double *PointsY;
PointsX =new double[pointNum];
PointsY =new double[pointNum];
//读取坐标点
//------------------------------------------------------
fprintf(fp,"0\nPOLYLINE\n");在新建的dxf文件中写入信息
fprintf(fp,"8\n0\n");
fprintf(fp,"66\n1\n");
//------------------------------------------------------
for(j=0;j<pointNum;j++)
{
fread(PointsX+j, sizeof(double),1,ShpFile_fp);//读取点的X坐标
fread(PointsY+j, sizeof(double),1,ShpFile_fp);//读取点的Y坐标
printf("X[%d]=%lf\n",j,*(PointsX+j));//打印输出点的X坐标
printf("Y[%d]=%lf\n",j,*(PointsY+j));//打印输出点的Y坐标
//fprintf(fp,"X[%d]=%lf\n",j,*(PointsX+j));
//fprintf(fp,"Y[%d]=%lf\n",j,*(PointsY+j));
//------------------------------------------------------
fprintf(fp,"0\nVERTEX\n");//写入VERTEX
fprintf(fp,"8\n0\n");
fprintf(fp,"10\n%.9lf\n",*(PointsX+j));//写入点X坐标
fprintf(fp,"20\n%.9lf\n",*(PointsY+j));//写入点Y坐标
//------------------------------------------------------
}
//------------------------------------------------------
//写入dxf文件中
fprintf(fp,"0 \nSEQEND\n");
fprintf(fp,"8 \n0\n");
//------------------------------------------------------
delete[] PointsX;
delete[] PointsY;
}
delete[] Parts;
}
//------------------------------------------------------
fprintf(fp,"0 \nENDSEC\n");
fprintf(fp,"0 \nEOF");
fclose(fp);
//------------------------------------------------------
}
void main()
{
//----------------------------------------------------------------
// 打开坐标文件
FILE * m_ShpFile_fp;
if((m_ShpFile_fp=fopen("F:\\学习\\C++实验\\武汉shp\\桥梁_polyline.shp","rb"))==NULL)
{
exit(0);
}
//----------------------------------------------------------------
// 读取坐标文件头的内容开始
int fileCode =-1;
int fileLength=-1;
int version=-1;
int shapeType=-1;
int i;
int FileCode;
int Unused;
int FileLength;
int Version;
int ShapeType;
double Xmin;
double Ymin;
double Xmax;
double Ymax;
double Zmin;
double Zmax;
double Mmin;
double Mmax;
fread(&FileCode,sizeof(int),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Filecode里面去,每次读一个int型字节的长度,读取一次
printf("FileCode=%d\n",FileCode);//在屏幕上打印FileCode的值
FileCode = OnChangeByteOrder(FileCode);//将读取的FileCode的值转化为十进制的数
printf("FileCode=%d\n",FileCode);//打印转化后的十进制的FileCode的值
for(i=0;i<5;i++)
fread(&Unused,sizeof(int),1,m_ShpFile_fp);
fread(&FileLength,sizeof(int),1,m_ShpFile_fp);//读取FileLength
FileLength=OnChangeByteOrder(FileLength);//将FileLength转化为十进制的数
printf("FileLength=%d\n",FileLength);//在屏幕上打印输出
fread(&Version,sizeof(int),1,m_ShpFile_fp);//读取Version的值
printf("Version=%d\n",Version);//在屏幕上打印输出
fread(&ShapeType,sizeof(int),1,m_ShpFile_fp);//读取ShapeType的值
printf("ShapeType=%d\n",ShapeType);//在屏幕上打印输出ShapeType的值
fread(&Xmin, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Xmin里面去,每次读取一个double型字节长度,读取一次
printf("Xmin=%lf\n",Xmin);//在屏幕上打印输出Xmin的值
fread(&Ymin, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Ymin里面去,每次读取一个double型字节长度,读取一次
printf("Ymin=%lf\n",Ymin);//在屏幕上打印输出
fread(&Xmax, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Xmax里面去,每次读取一个double型字节长度,读取一次
printf("Xmax=%lf\n",Xmax);//在屏幕上打印输出
fread(&Ymax, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Ymax里面去,每次读取一个double型字节长度,读取一次
printf("Ymax=%lf\n",Ymax);//在屏幕上打印输出
fread(&Zmin, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Zmin里面去,每次读取一个double型字节长度,读取一次
printf("Zmin=%lf\n",Zmin);//在屏幕上打印输出
fread(&Zmax, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Zmax里面去,每次读取一个double型字节长度,读取一次
printf("Zmax=%lf\n",Zmax);//在屏幕上打印输出
fread(&Mmin, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Mmin里面去,每次读取一个double型字节长度,读取一次
printf("Mmin=%lf\n",Mmin);//在屏幕上打印输出
fread(&Mmax, sizeof(double),1,m_ShpFile_fp);//从m_ShpFile_fp里面的值读到Mmax里面去,每次读取一个double型字节长度,读取一次
printf("Mmax=%lf\n",Mmax);//在屏幕上打印输出
// 读取坐标文件头的内容结束
//----------------------------------------------------------------
OnReadLineShp(m_ShpFile_fp);
//getchar();
}
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++读取Shp文件并将Shp转化为DXF
原文链接:https://www.stubbornhuang.com/205/
发布于:2019年11月04日 23:25:49
修改于:2023年06月26日 23:01:11
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
51