shp系列(七)——利用C++进行Shx文件的写(创建)
之前介绍了Shp文件和Dbf的写(创建),最后来介绍一下Shx文件的写(创建)。Shx文件是三者之中最简单的一个,原因有两个:第一是Shx文件的头文件与Shp文件的头文件几乎一样(除了FileLength);第二是Shx文件的主体只有两个记录项,分别是Offset和ContentLength。
推荐结合读取shx的博客一起看!
推荐结合读取shx的博客一起看!
推荐结合读取shx的博客一起看!
1.Shx头文件
Shx头文件的各项和Shp文件一样,字节数为100。FileLength代表本Shx文件的长度。其他项的含义参考shp头文件。
2.Shx记录主体

- Offset代表主文件(Shp)中对应记录相对于起始位置的,值为计算的字节数的一半。
- 第一条记录的偏移量就是头文件的长度,100/2。
- 第二条及以后记录的偏移量为:前一条偏移量 + 上一条记录的长度 + 8/2 ; 8是shp文件中对应记录的 RecordNum 和 ContentLength的字节数。
- 每条ContentLength与写Shp时对应记录的ContentLength的数值一样。
- 头文件中FileLength的计算:(文件头(100) + 记录总数 *(4(Offset)+4(ContentLength)))/2。
3.代码
void WriteShx(CString& filename)
{
//****创建完Shp和Dbf之后创建同名Shx
int n = filename.ReverseFind('.');
filename = filename.Left(n);
filename = filename + ".shx";
FILE* m_ShxFile_fp;
if ((m_ShxFile_fp = fopen(filename, "wb")) == NULL)
return; //****创建头文件
int FileCode = 9994;
int Unused = 0;
int FileLength = 100; //后面要回来修改
int Version = 1000;
int ShapeType = 5;
double Xmin = map->GetMapRect().left;
double Ymin = map->GetMapRect().top;
double Xmax = map->GetMapRect().right;
double Ymax = map->GetMapRect().bottom;
double Zmin = 0;
double Zmax = 0;
double Mmin = 0;
double Mmax = 0;
FileCode = OnChangeByteOrderTenToSixteen(FileCode);
fwrite(&FileCode, sizeof(int), 1, m_ShxFile_fp);
for (int i = 0; i < 5; i++)
fwrite(&Unused, sizeof(int), 1, m_ShxFile_fp);
FileLength = OnChangeByteOrderTenToSixteen(FileLength);
fwrite(&FileLength, sizeof(int), 1, m_ShxFile_fp);
fwrite(&Version, sizeof(int), 1, m_ShxFile_fp);
fwrite(&ShapeType, sizeof(int), 1, m_ShxFile_fp);
fwrite(&Xmin, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Ymin, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Xmax, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Ymax, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Zmin, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Zmax, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Mmin, sizeof(double), 1, m_ShxFile_fp);
fwrite(&Mmax, sizeof(double), 1, m_ShxFile_fp);
//****写文件头结束 //****写实体信息
int Offset = 100/2 ; //第一条记录的偏移量就是头文件的长度,为字节数的一半
int ContentLength; //ContentLength是主文件中每条记录的长度
int RecordNum = map->layer->objects.size(); //文件中的记录条数
for (int i = 1; i <= RecordNum; i++) {
if (i == 1) { //第一条
int tempOffset = Offset;
tempOffset = OnChangeByteOrderTenToSixteen(tempOffset);
fwrite(&tempOffset, sizeof(int), 1, m_ShxFile_fp);
ContentLength = recordLength[i - 1]; //recordLength是写Shp时记录下的每条记录的长度,已经除过2
ContentLength = OnChangeByteOrderTenToSixteen(ContentLength);
fwrite(&ContentLength, sizeof(int), 1, m_ShxFile_fp);
}
if (i >= 2) {
Offset = Offset + recordLength[i - 2] + 4; //第二条及以后记录的偏移量为:前一条偏移量 + 上一条记录的长度 + 8/2 ;
//8是shp文件中每条记录的 RecordNum 和 ContentLength的字节数
int tempOffset = Offset;
tempOffset = OnChangeByteOrderTenToSixteen(tempOffset);
fwrite(&tempOffset, sizeof(int), 1, m_ShxFile_fp);
ContentLength = recordLength[i - 1];
ContentLength = OnChangeByteOrderTenToSixteen(ContentLength);
fwrite(&ContentLength, sizeof(int), 1, m_ShxFile_fp);
}
}
fseek(m_ShxFile_fp, 24, SEEK_SET); //转到写FileLength的地方
FileLength = 100 + RecordNum * 8; //文件头100 + 记录总数 *(4+4)
FileLength = FileLength / 2; // FileLength为字节数的一半
FileLength = OnChangeByteOrderTenToSixteen(FileLength);
fwrite(&FileLength, sizeof(int), 1, m_ShxFile_fp);
fclose(m_ShxFile_fp);
}
至此关于Shp系列的博客全部终结。
shp系列(七)——利用C++进行Shx文件的写(创建)的更多相关文章
- shp系列(四)——利用C++进行Shx文件的读(打开)
1.shx文件的基本情况 shx文件又叫索引文件,主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的初始位置的偏移量.通过索引文件可以很方便地在坐标文件中定位到指定目标的坐 ...
- shp系列(六)——利用C++进行Dbf文件的写(创建)
上一篇介绍了shp文件的创建,接下来介绍dbf的创建. 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 1.Dbf头文件的创建 Dbf头文件的结构 ...
- python常识系列07-->python利用xlwt写入excel文件
前言 读书之法,在循序而渐进,熟读而精思.--朱熹 抽空又来写一篇,毕竟知识在于分享! 一.xlwt模块是什么 python第三方工具包,用于往excel中写入数据:(ps:只能创建新表格,不能修改表 ...
- shp系列(五)——利用C++进行shp文件的写(创建)
之前介绍了shp文件.dbf文件和shx文件的的读取,接下来将分别介绍它们的创建过程.一般来说,读和写的一一对应的,写出的文件就是为了保存数据供以后读取的.写的文件要符合shapefile的标准.之前 ...
- shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
博客背景和目的 最近在用C++写一个底层的东西,需要读取和创建shp文件.虽然接触shp文件已经几年了,但是对于shp文件内到底包含什么东西一直是一知半解.以前使用shp文件都是利用软件(如ArcGI ...
- shp系列(三)——利用C++进行DBF文件的读(打开)
1.DBF文件要点 DBF文件又叫属性文件,也叫dBASE文件,文件后缀是.dbf,实际上ArcGIS打开后的属性表就是DBF的信息.DBF文件遵循以下几个条件: 每个要素在表中必须要包含一个与之相对 ...
- 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法
一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...
- struts2官方 中文教程 系列七:消息资源文件
介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...
- C语言高速入口系列(七)
C语言高速入口系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二 ...
随机推荐
- 【SQL】IN、EXISTS和表连接三者的效率比较
一. IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询.此时就会用到IN和EXISTS. 例如:查询departments表中存在的部门的人数. 1. 使 ...
- MyEclipse获取注册码
最近刚装上MyEclipse,一直弹窗提示注册码过期,开始还能接受,到最后,每发布一个项目便弹窗提醒,顿时感觉烦了,得治理治理这个烦人的注册码,下面是一段自动生成注册名和注册码的代码,只需要直接拿来用 ...
- WinXP SSH连接不上虚拟机的解决方法
问题现象描述: 在VMWare中安装好linux系统后,选择桥接,从宿主机Windows上使用Putty, SSH Secure Shell等客户端工具连接linux上的ssh服务,客户端一直没有反应 ...
- 安卓使用ImageView显示OpenCV-Mat
Android 的Application-native调试暂时还只能进行主线程调试,在GDB里面,运行于子线程的OpenCv数据处理过程不能直接调试,OPenCV-Native函数 public ...
- 在MFC中使用Cstring
此文介绍了关于MFC使用CString的资料,可一参考一下. 转自于VC知识库:http://www.vckbase.com/index.php/wv/829 通过阅读本文你可以学习如何有效地使用 C ...
- C#异步Async、Task、Await
参考http://www.cnblogs.com/jesse2013/p/async-and-await.html 事例: static void Main(string[] args) { ; i ...
- Xshell连接linux服务器不成功的乌龙问题
一般xshell连接linux服务器不成功有以下几个问题: linux防火墙拦截,导致Xshell不能访问linux 操作方法: firewalld(CentOS7):启动 :systemctl st ...
- PAT_A1143#Lowest Common Ancestor
Source: PAT A1143 Lowest Common Ancestor (30 分) Description: The lowest common ancestor (LCA) of two ...
- [Kernel参数]----/etc/sysctl.conf
修改sysctl方法 方法一:修改/proc下内核参数文件内容 直接修改内核参数ip_forward对应在/proc下的文件/proc/sys/net/ipv4/ip_forward.用下面命令查看i ...
- 类型信息、异常、I/O流(day11)
二十三 运行时的类型信息 typeid运算符 #include <typeinfo> typeid(类型/对象) )返回typeinfo的对象,用于描述类型信息. )在typeinfo类中 ...