最近專案中需要對生成的shp檔案進行打包壓縮成zip,gdal是可以直接操作zip、tar的,好像還不支援shp格式壓縮(可能我的方式不對,如果可以希望網友指點),所有我是用zlib庫來解決shp資料的壓縮的。
因為我用的gdal是網上已經編譯好的,已經包含了zlib庫,所以直接使用,在配置環境的時候需要鏈結minizip.lib。
標頭檔案如下:
extern "c"
/**
* @brief 新增檔案到zip
* @date 2020/03/12
* @return
* @param zf
* @param filenameinzip
* @param srcfile
* @note
**/void addfiletozip(zipfile zf, const char* filenameinzip, const char* srcfile)
//在zip檔案中建立新檔案
zipopennewfileinzip(zf, new_file_name, &zi, null, 0, null, 0, null, z_deflated, z_default_compression);
if (srcfile != null)
//讀入原始檔並寫入zip檔案
int size_buf = 0;
void* buf = null;
size_buf = 1024;
buf = (void*)malloc(size_buf);
int numbytes = 0;
while (!feof(srcfp))
//關閉原始檔
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");
if (zf == null)
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_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;
las點雲資料轉為shp向量點資料
1 用到的軟體 arcmap envi lidar 2 envi lidar開啟點雲資料 las 3 envi lidar 裡面的process data將點資料轉為txt 有很多選項,看好了儲存的格式 儲存的檔案路徑。4 arcgis開啟txt,右擊txt選擇display xy顯示點。需要注意的...
日誌打包壓縮
這幾天,伺服器日誌漲的很快。因為沒有日誌伺服器,都是寫在本地。要保留三個月,打包,壓縮能節省些空間。做個記錄。顯示當前系統前兩個的日期 date d 2 days ago y m d bin sh 會員服務的日誌 路徑 opt logs member ma logs 保留三天的日誌。打包壓縮存在當前...
檔案壓縮打包
1.gzip 1 gzip gzip 檔案 生成.gz檔案 2 gzip 6 預設級別 3 gzip d 壓縮檔案 解壓縮 4 gunzip 壓縮檔案 解壓縮 5 zcat 壓縮檔案 檢視壓縮檔案內容 2.bzip2 1 bzip2 檔案 生成.bz2檔案 2 bzip2 9 預設級別 3 bzip...