本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++读取Shp文件并将Shp转化为DXF
原文链接:https://www.stubbornhuang.com/205/
发布于:2019年11月04日 23:25:49
修改于:2020年01月03日 8:56:18

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();
}
当前分类随机文章推荐
- C++ - 函数返回多个返回值的方法总结 阅读1674次,点赞0次
- C++11 - std::string - stod/stof/stoi/stol/stold/stoll/stoul/stoull,由std::string转换为int/long/float/double等其他类型 阅读3231次,点赞0次
- C++ - 在某一天某个时间点定时执行任务,比如2022年9月19日晚上9点准点执行发送邮件函数 阅读304次,点赞0次
- C++11 - std::shared_ptr初始化的几种方式 阅读6863次,点赞2次
- C++STL容器 - std::map查找元素与判断键值是否存在方法总结 count,find,contains,equal_range,lower_bound,upper_bound 阅读917次,点赞0次
- C++ - queue存储动态指针时正确释放内存 阅读5215次,点赞2次
- C++ - 在两个互有依赖关系的类中使用std::shared_ptr和std::weak_ptr进行内存管理 阅读582次,点赞0次
- C++ - 动态链接库dll为什么要使用unsigned char作为byte的内部格式 阅读602次,点赞0次
- C++ - RAII机制 阅读233次,点赞0次
- C++STL容器 - std::vector元素访问方式总结 阅读751次,点赞0次
全站随机文章推荐
- Pytorch - reshape和view的用法和区别 阅读203次,点赞0次
- 姿态估计 - COCO-WholeBody数据集骨骼关节keypoint标注对应 阅读2686次,点赞0次
- 资源分享 - Vulkan应用开发指南 , Vulkan Programming Guide - The Official Guide to Learning Vulkan中文版PDF下载 阅读973次,点赞0次
- 资源分享 - Real-Time Shadows英文高清PDF下载 阅读3932次,点赞0次
- 资源分享 - Computational Geometry in C, First Edition 英文高清PDF下载 阅读1783次,点赞0次
- WordPress - 站点底部显示站点运行时间 阅读4437次,点赞2次
- C++11 - 封装std::thread,增加子线程启动、暂停、唤起、停止功能 阅读4233次,点赞7次
- 资源分享 - Ray Tracing in One Weekend英文高清PDF下载 阅读2639次,点赞0次
- WordPress - get_post_type():获取当前文章或者给定文章类型 阅读1993次,点赞0次
- Pytorch - torch.nn.Conv1d参数详解与使用 阅读1614次,点赞0次
评论
167