shp矢量数据打包压缩
最近项目中需要对生成的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矢量数据打包压缩相关推荐
- 资料资源大全(地学资料,语言教程,地图土里利用,shp矢量数据,年鉴) (待审核)
*树谷资料库目录一览* 1软件.语言类教程资源 1.太强了!Python115集视频教程+海量PDF资料免费送,学会Python很难吗? 2.干货丨R语言(视频教程+PDF资源,免费赠送) 3.3.4 ...
- html如何打包压缩,所有css打包压缩到一个js里面
所有css打包压缩到一个js里面 打包css文件的意义:最终把css文件压缩到最终生成的js文件里,页面不需要再加载css文件,并且是压缩过的 打包css文件,安装style-loader css-l ...
- python打开指定文件-python打包压缩、读取指定目录下的指定类型文件
下面通过代码给大家介绍python打包压缩指定目录下的指定类型文件,具体代码如下所示: import os import datetime import tarfile import fnmatch ...
- find文件,tar打包和打包压缩
[root@localhost ~]# find . -name "*.txt*" -name "*test*" -type f |xargs tar -cvf ...
- 【转】JPG打包压缩后比原来尺寸还大
[转]JPG打包压缩后比原来尺寸还大 作者:刘源 链接:https://www.zhihu.com/question/40371280/answer/86262934 来源:知乎 著作权归作者所有.商 ...
- linux 如何对文件解压或打包压缩
tar命令用与对文件打包压缩或解压,格式: tar [选项] [文件] 打包并压缩文件: tar -czvf 压缩包名 .tar.gz 解压并展开压缩包: tar -xzvf 压缩包名 .tar. ...
- ubuntu 打包压缩
打包 tar -cvf test.tar *.txt tar -cvf test.tar *.txt 解包 tar -xvf test.tar tar -xvf test.tar -C abc/ ...
- 打包 压缩 命令tar zip
2019独角兽企业重金招聘Python工程师标准>>> 打包 压缩 命令tar zip tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.ta ...
- linux所有文件打包压缩,Linux基础教程:对文件打包压缩
一.须知 文件数量太多, 如果需要拷来拷去是不是很麻烦? 怎么办? 打包! 文件太大,通过网络下载.传输会不会很费时间? 怎么办? 压缩! 在Linux环境中,打包压缩文件的扩展名多是 ...
最新文章
- wireless(二维数组前缀和)
- librtmp编译for android and ios 不要openssl
- java多图片上传json_SpringMVC框架五:图片上传与JSON交互
- 分布式内存数据库---Redis的持久化
- why header level note is disabled
- Java千百问_06数据结构(014)_java数组如何存储在内存中
- 微软同步框架入门之五--使用WCF同步远程数据
- io.circe_如何使用Circe(Un)在Akka HTTP中封送JSON
- mysql从大到小排序_sql语句时间排序 sql语句按照时间排序
- Trick(十四)—— 判断是否序列中所有的元素都相同
- 视觉注意力的循环神经网络模型(Recurrent Models of Visual Attention)
- macOS黑苹果系统镜像恢复版安装教程
- java 使用的钩子_Java 钩子程序
- 一图看懂16个英语时态
- 谷歌seo基础:看完就能上手操作的优化方案
- 【实战】下载歌曲只能开绿钻?NoNoNo, Python爬虫,无所不能。
- 计算机音乐超级马丽,你与你的音乐梦想,只差一台数学计算器
- ubutun 滑动 触控板_Ubuntu系统的笔记本触摸板怎么调节鼠标光标速度?
- 春天里的一封战地日记
- matlab程序 直线插补,无聊写matlab仿真直线插补算法