private void backgroundWorkerMain_DoWork(object sender, DoWorkEventArgs e) { progressInfo.SubTitle = "读取基本信息"; reportProgress(); List <long> codeList = CountryDao.FindAllCode(); if (codeList == null || codeList.Count == 0) { MessageBox.Show("矢量没有正确的code_new信息,请重新注册"); return; } DataSource dataSource = Ogr.Open("data\\shp\\dst\\country.shp", 0); int codeNum = codeList.Count; progressInfo.Info = string.Format("已完成:0/{0}", codeNum); for (int i = 0; i < codeNum; i++) { progressInfo.SubComplete = 0; progressInfo.SubTitle = "查询数据"; reportProgress(); long code = codeList[i]; List <string> nameList = ImgDao.findNameByYearAndCode(year, code); if (nameList == null || nameList.Count == 0) { continue; } Layer layer = dataSource.ExecuteSQL(string.Format("select * from country where Code_new={0}", code), null, null); if (layer.GetFeatureCount(1) == 0) { continue; } layer.ResetReading(); Feature feature = layer.GetNextFeature(); Geometry geometry = feature.GetGeometryRef(); Envelope envelope = new Envelope(); geometry.GetEnvelope(envelope); int nameCount = nameList.Count; Dataset[] inDss = new Dataset[nameCount]; for (int j = 0; j < nameCount; j++) { inDss[j] = Gdal.Open(string.Format("data\\img\\r{0}\\{1}", year, nameList[j]), Access.GA_ReadOnly); } string outFile = string.Format("{0}\\{1:D3}.tif", outPath, code); string mosaicFile = "/vsimem/mosaic.tif"; string maskFile = "/vsimem/mask.tif"; try { progressInfo.SubTitle = "正在镶嵌:"; string[] options = new string[] { "-t_srs", "data\\shp\\dst\\country.prj", "-tr", "30", "30", "-srcnodata", "128", "-dstnodata", "0", "-ot", "Byte", "-co", "COMPRESS=LZW", "-co", "TILED=YES", "-te", envelope.MinX.ToString(), envelope.MinY.ToString(), envelope.MaxX.ToString(), envelope.MaxY.ToString() }; GDALWarpAppOptions gdalOptions = new GDALWarpAppOptions(options); Dataset mosaicDs = Gdal.Warp(mosaicFile, inDss, gdalOptions, gdalProgressFunc, null); progressInfo.SubTitle = "正在栅格化"; progressInfo.SubInfo = ""; options = new string[] { "-burn", "1", "-where", string.Format("Code_new={0}", code), "-ot", "Byte", "-co", "COMPRESS=LZW", "-co", "TILED=YES", "-tr", "30", "30", "-te", envelope.MinX.ToString(), envelope.MinY.ToString(), envelope.MaxX.ToString(), envelope.MaxY.ToString() }; GDALRasterizeOptions rasterOptions = new GDALRasterizeOptions(options); Dataset vecDs = Gdal.OpenEx("data\\shp\\dst\\country.shp", 0, null, null, null); Dataset maskDs = Gdal.wrapper_GDALRasterizeDestName(maskFile, vecDs, rasterOptions, gdalProgressFunc, null); Dataset outDs = multi(mosaicDs, maskDs, outFile); outDs.Dispose(); } catch (Exception ex) { MessageBox.Show(ex.Message); continue; } progressInfo.Info = string.Format("已完成:{0}/{1}", i + 1, codeNum); totalProgress = (i + 1) * 100 / codeNum; reportProgress(); } MessageBox.Show("镶嵌完成"); }