最近项目中需要对生成的shp文件进行打包压缩成zip,gdal是可以直接操作zip、tar的,好像还不支持shp格式压缩(可能我的方式不对,如果可以希望网友指点),所有我是用zlib库来解决shp数据的压缩的。

因为我用的gdal是网上已经编译好的,已经包含了zlib库,所以直接使用,在配置环境的时候需要链接minizip.lib。

头文件如下:

extern "C"
{
#include "zlib.h"
#include "zip.h"
#include "unzip.h"
}
/**
*   @brief 添加文件到zip
*   @date  2020/03/12
*   @return
*   @param zf
*   @param fileNameInZip
*   @param srcFile
*   @note
**/
void AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile)
{FILE* srcfp = NULL;//初始化写入zip的文件信息  zip_fileinfo zi;zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;zi.dosDate = 0;zi.internal_fa = 0;zi.external_fa = 0;//如果srcFile为空,加入空目录  char new_file_name[1204];memset(new_file_name, 0, sizeof(new_file_name));strcat(new_file_name, fileNameInZip);if (srcFile == NULL){strcat(new_file_name, "/");}//在zip文件中创建新文件  zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);if (srcFile != NULL){//打开源文件  srcfp = fopen(srcFile, "rb");if (srcfp == NULL){zipCloseFileInZip(zf); //关闭zip文件  return;}//读入源文件并写入zip文件  int size_buf = 0;void* buf = NULL;size_buf = 1024;buf = (void*)malloc(size_buf);int numBytes = 0;while (!feof(srcfp)){numBytes = fread(buf, 1, size_buf, srcfp);zipWriteInFileInZip(zf, buf, numBytes);if (ferror(srcfp))break;}//关闭源文件  fclose(srcfp);}//关闭zip文件  zipCloseFileInZip(zf);
}

最后是先把生成的shp文件添加到zip中,然后再删掉shp文件(期待更好的方案)。

CPLString pszDirPath = CPLGetDirname(pszFullPath);CPLString pszZipPath = CPLFormFilename(pszDirPath, pszFBasename, "zip");CPLString pszShpPath = CPLFormFilename(pszDirPath, pszFBasename, "shp");
CPLString pszDbfPath = CPLFormFilename(pszDirPath, pszFBasename, "dbf");
CPLString pszPrjPath = CPLFormFilename(pszDirPath, pszFBasename, "prj");
CPLString pszShxPath = CPLFormFilename(pszDirPath, pszFBasename, "shx");CPLString  pszShpName = CPLFormCIFilename("", pszFBasename, "shp");
CPLString  pszDbfName = CPLFormCIFilename("", pszFBasename, "dbf");
CPLString  pszPrjName = CPLFormCIFilename("", pszFBasename, "prj");
CPLString  pszShxName = CPLFormCIFilename("", pszFBasename, "shx");//#define APPEND_STATUS_CREATE        (0) 不存在就创建,存在就截断(清空)
//#define APPEND_STATUS_CREATEAFTER   (1) 不存在打开失败,存在就截断(清空)
//#define APPEND_STATUS_ADDINZIP      (2) 不存在打开失败,存在就追加(原本压缩包中的内容不清空)
zipFile zf = zipOpen(pszZipPath, APPEND_STATUS_CREATE);
if (zf == NULL)
{cout << "创建zip失败" << endl;return -1;
}AddFileToZip(zf, pszShpName, pszShpPath);
AddFileToZip(zf, pszDbfName, pszDbfPath);
AddFileToZip(zf, pszPrjName, pszPrjPath);
AddFileToZip(zf, pszShxName, pszShxPath);
zipClose(zf, 0);
//删除本地生成的shp文件
poDriver->Delete(pszFullPath);

上面代码压缩的zip,在解压时会出现下图的警告信息:

解决方法:

AddFileToZip函数在初始化写入zip信息的时候,是将时间都初始化为0,现在需要修改这个时间,如下:

    time_t timep;struct tm* p;time(&timep);//p = gmtime(&timep); // UTC时间p = localtime(&timep); // 本地时间    //初始化写入zip的文件信息  zip_fileinfo zi;zi.tmz_date.tm_year = 1900 + p->tm_yday;zi.tmz_date.tm_mon = p->tm_mon;zi.tmz_date.tm_mday = p->tm_mday;zi.tmz_date.tm_hour = p->tm_hour;zi.tmz_date.tm_min = p->tm_min;zi.tmz_date.tm_sec = p->tm_sec;//zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =// zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;zi.dosDate = 0;zi.internal_fa = 0;zi.external_fa = 0;

shp矢量数据打包压缩相关推荐

  1. 资料资源大全(地学资料,语言教程,地图土里利用,shp矢量数据,年鉴) (待审核)

    *树谷资料库目录一览* 1软件.语言类教程资源 1.太强了!Python115集视频教程+海量PDF资料免费送,学会Python很难吗? 2.干货丨R语言(视频教程+PDF资源,免费赠送) 3.3.4 ...

  2. html如何打包压缩,所有css打包压缩到一个js里面

    所有css打包压缩到一个js里面 打包css文件的意义:最终把css文件压缩到最终生成的js文件里,页面不需要再加载css文件,并且是压缩过的 打包css文件,安装style-loader css-l ...

  3. python打开指定文件-python打包压缩、读取指定目录下的指定类型文件

    下面通过代码给大家介绍python打包压缩指定目录下的指定类型文件,具体代码如下所示: import os import datetime import tarfile import fnmatch ...

  4. find文件,tar打包和打包压缩

    [root@localhost ~]# find . -name "*.txt*" -name "*test*" -type f |xargs tar -cvf ...

  5. 【转】JPG打包压缩后比原来尺寸还大

    [转]JPG打包压缩后比原来尺寸还大 作者:刘源 链接:https://www.zhihu.com/question/40371280/answer/86262934 来源:知乎 著作权归作者所有.商 ...

  6. linux 如何对文件解压或打包压缩

    tar命令用与对文件打包压缩或解压,格式: tar [选项] [文件] 打包并压缩文件: tar -czvf  压缩包名 .tar.gz 解压并展开压缩包: tar -xzvf  压缩包名 .tar. ...

  7. ubuntu 打包压缩

    打包 tar -cvf test.tar *.txt tar -cvf test.tar *.txt 解包 tar -xvf test.tar tar -xvf test.tar -C abc/    ...

  8. 打包 压缩 命令tar zip

    2019独角兽企业重金招聘Python工程师标准>>> 打包 压缩 命令tar zip tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.ta ...

  9. linux所有文件打包压缩,Linux基础教程:对文件打包压缩

    一.须知 文件数量太多, 如果需要拷来拷去是不是很麻烦?    怎么办?  打包! 文件太大,通过网络下载.传输会不会很费时间?    怎么办?  压缩! 在Linux环境中,打包压缩文件的扩展名多是 ...

最新文章

  1. wireless(二维数组前缀和)
  2. librtmp编译for android and ios 不要openssl
  3. java多图片上传json_SpringMVC框架五:图片上传与JSON交互
  4. 分布式内存数据库---Redis的持久化
  5. why header level note is disabled
  6. Java千百问_06数据结构(014)_java数组如何存储在内存中
  7. 微软同步框架入门之五--使用WCF同步远程数据
  8. io.circe_如何使用Circe(Un)在Akka HTTP中封送JSON
  9. mysql从大到小排序_sql语句时间排序 sql语句按照时间排序
  10. Trick(十四)—— 判断是否序列中所有的元素都相同
  11. 视觉注意力的循环神经网络模型(Recurrent Models of Visual Attention)
  12. macOS黑苹果系统镜像恢复版安装教程
  13. java 使用的钩子_Java 钩子程序
  14. 一图看懂16个英语时态
  15. 谷歌seo基础:看完就能上手操作的优化方案
  16. 【实战】下载歌曲只能开绿钻?NoNoNo, Python爬虫,无所不能。
  17. 计算机音乐超级马丽,你与你的音乐梦想,只差一台数学计算器
  18. ubutun 滑动 触控板_Ubuntu系统的笔记本触摸板怎么调节鼠标光标速度?
  19. 春天里的一封战地日记
  20. matlab程序 直线插补,无聊写matlab仿真直线插补算法

热门文章

  1. RoadFlow分页添加程序
  2. WORD这些好用的技巧你应该要学会
  3. 5个商用字体网站,建议收藏
  4. 服务器里搭建游戏玩家访问卡是什么原因
  5. Alientek SMT32开发板 跑马灯实验
  6. chrome 收藏夹链接
  7. 据说世界上最健康的作息
  8. Excel做线性回归分析
  9. Thinkphp开发的云盘宝网盘赚钱系统源码/仿蓝奏百度网盘限速下载系统/分享赚钱网盘系统
  10. linux系统管理设计ppt,操作系统原理与Linux实例设计--第二章.ppt