/// <summary> /// 根据地图出图配置,设置地图文档并导出地图 /// </summary> /// <param name="cfg"></param> /// <param name="mapDoc"></param> protected virtual void ExportMapMainOperation(MapExportInfo cfg, IMapDocument mapDoc) { //设置数据源、定义查询、比例尺、显示范围 var graphicsContainer = mapDoc.PageLayout as IGraphicsContainer; foreach (var mapFrameInfo in cfg.MapFrames) { SetMapFrame(graphicsContainer, mapFrameInfo); } //设置元素的值 foreach (var elementInfo in cfg.Elements) { var elements = graphicsContainer.GetElementsByKeyword(elementInfo.Name); SetElementsValue(elements, elementInfo.ValueType, elementInfo.Value); } //保存地图,导出图片 mapDoc.Save(); foreach (var exportPicture in cfg.ExportPictures) { var outputPath = Path.Combine(cfg.ExportDirectory, cfg.ExportFileName + exportPicture.PicExtension); mapDoc.PageLayout.ExportToPicture(outputPath, exportPicture.Dpi); } //关闭文档,释放资源 mapDoc.Close(); Marshal.ReleaseComObject(mapDoc); }
/// <summary> /// 根据地图出图配置,设置地图文档并出图 /// </summary> /// <param name="cfg">对地图进行各项配置和出图的信息</param> /// <param name="mapDoc">要设置并出图的地图文档,若值为null则根据<see cref="cfg"/>参数指定的信息 /// 复制地图模板到生成目录或临时目录,打开复制后的地图文档进行设置和出图</param> public virtual void ExportMap(MapExportInfo cfg, IMapDocument mapDoc = null) { //是否在完成出图后关闭地图文档,地图文档来自外部传参(mapDoc != null)则不关闭,来自内部打开则应关闭 bool closeMapDoc = mapDoc == null; try { if (!ValidateConfig(cfg, out var message)) { throw new Exception(message); } if (mapDoc == null) { mapDoc = GetMapDocument(cfg); } ExportMapMainOperation(cfg, mapDoc); } catch (Exception ex) { if (closeMapDoc && mapDoc != null) { mapDoc.Close(); Marshal.ReleaseComObject(mapDoc); } throw ex; } }
/// <summary> /// 根据配置复制地图模板到生成目录或临时目录,打开复制后的地图文档 /// </summary> /// <param name="cfg">导出地图配置</param> /// <returns></returns> protected virtual IMapDocument GetMapDocument(MapExportInfo cfg) { var newMxdPath = GetMxdPath(cfg); var mapDoc = new MapDocumentClass(); mapDoc.Open(newMxdPath); return(mapDoc); }
/// <summary> /// 验证出图配置是否正确 /// </summary> /// <param name="cfg">导出地图配置</param> /// <param name="message">验证信息</param> /// <returns></returns> protected virtual bool ValidateConfig(MapExportInfo cfg, out string message) { var sbMsg = new StringBuilder(); if (!Directory.Exists(cfg.ExportDirectory)) { sbMsg.AppendLine($"输出目录{cfg.ExportDirectory}不存在,请先选定或创建正确的输出目录!"); } return(string.IsNullOrWhiteSpace(message = sbMsg.ToString())); }
/// <summary> /// 根据配置复制地图模板到生成目录或临时目录,返回复制后的地图文档路径 /// </summary> /// <param name="cfg">导出地图配置</param> /// <returns></returns> protected virtual string GetMxdPath(MapExportInfo cfg) { //若配置要求导出地图文档,则将地图模板复制到生成目录;否则复制到程序目录的临时文件夹下 string mxdPath; if (cfg.IsExportMxd) { mxdPath = Path.Combine(cfg.ExportDirectory, cfg.ExportFileName + ".mxd"); File.Copy(cfg.TemplateMxdPath, mxdPath, cfg.Overwrite); } else { var tmpDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tmp"); Directory.CreateDirectory(tmpDir); mxdPath = Path.Combine(tmpDir, cfg.ExportFileName + ".mxd"); File.Copy(cfg.TemplateMxdPath, mxdPath, true); } return(mxdPath); }