Arcgis Engine C# 同时导入栅格和SHP格式 打印布局视图之设置打印纸张大小 调整数据框范围

本文探讨了GIS应用中地图数据导入及打印布局调整的方法。作者解决了多种数据格式的导入问题,并通过代码实现了纸张大小调整及地图框与纸张大小的适配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务:集成导入地图和打印布局视图

由于之前没有问清楚 导入栅格还是SHP 就只做了导入SHP的 后来说要两个都可以导入 于是想到了工具栏中的十字型导入数据的工具,打开后是这样的:


就想着能不能自己实现一个所有数据类型都能使用的,查了百度找到一个思路贴:

https://blog.youkuaiyun.com/Mello_/article/details/41820885 上面的第三方控件ExplorerControls 没用过 但是思路可以借鉴

但觉得太麻烦 于是改变思路用选择语句判断文件扩展名 来导入 很顺利完成


然后是今天的标题 纸张大小的问题

之前就一直有这个毛病 PS: 我用的是牟乃夏老师书里的打印输出的部分代码


多次改变纸张大小以后 预览窗口就不变化了 一直保持一个样式的纸张 前几次还可以根据选择的大小变化 后面就默认纸张大小永远不变了 十分奇怪 不知道如何解决


我又想到地图框能否根据纸张的大小变化大小,再探索一下吧。

————————————分割线————————————

20:48

思路:(1)使得数据框和纸张大小一致 可以使用page.QuerySize(out width, out height);//纸张大小,比如A4就是210,297  

(2)使得数据框中的地图边界固定(即无论纸有多大 地图跟着放大) pMapFrame.MapBounds = env;

 以下是代码:

借鉴了https://blog.youkuaiyun.com/hellolib/article/details/22278857 感谢

 private void btnPageSize_Click(object sender, EventArgs e)
        {
            try
            {
                //实例化打印设置窗口
                DialogResult result = pageSetupDialog1.ShowDialog();
                //设置打印文档对象的打印机
                document.PrinterSettings = pageSetupDialog1.PrinterSettings;
                //设置打印文档对象的页面设置为用户在打印设置对话框中的设置
                document.DefaultPageSettings = pageSetupDialog1.PageSettings;             
                //初始化纸张和打印机                                                     
                IPaper paper = new PaperClass();
                IPrinter printer = new EmfPrinterClass();
                //关联打印机对象和纸张对象 
                paper.Attach(pageSetupDialog1.PrinterSettings.GetHdevmode(pageSetupDialog1.PageSettings).ToInt32(), pageSetupDialog1.PrinterSettings.GetHdevnames().ToInt32());              
                printer.Paper = paper;
                PrintPagelayoutControl.Printer = printer;
                //得到一系列参数给limitmapfreamrangeandposition
                IGraphicsContainer pGraphicsContainer = PrintPagelayoutControl.GraphicsContainer;
                IMapFrame pMapFrame = pGraphicsContainer.FindFrame(PrintPagelayoutControl.ActiveView.FocusMap) as IMapFrame;
                IElement ele = pMapFrame as IElement;
                IPage page = PrintPagelayoutControl.PageLayout.Page;
                IEnvelope en1 = new EnvelopeClass();
                ele.QueryBounds(PrintPagelayoutControl.ActiveView.ScreenDisplay, en1);
                //限制范围
               
               limitMapFreamRangeAndPosition(pGraphicsContainer, ele, page, en1, PrintPagelayoutControl);
                //控制map在数据框中的范围
                pMapFrame.ExtentType = esriExtentTypeEnum.esriExtentBounds;
                IEnvelope env = new EnvelopeClass();
                env.PutCoords(119939.3058, 27729.6982, 131821.6658, 41643.6886); //地理坐标系下的坐标,即范围
                pMapFrame.MapBounds = env;
                PrintPagelayoutControl.Refresh();
               
            }
            catch { }
        }

 public void limitMapFreamRangeAndPosition(IGraphicsContainer gc, IElement ele, IPage page, IEnvelope en1, AxPageLayoutControl PrintPageLayoutControl)
        {
            double width, height;
            page.QuerySize(out width, out height);//纸张大小,比如A4就是210,297  
            IEnvelope en2 = new EnvelopeClass();
            ele.QueryBounds(PrintPageLayoutControl.ActiveView.ScreenDisplay, en2);
            //使对应于页面的大小 
            en2.XMax = width;
            en2.XMin = 0;
            en2.YMax = height;
            en2.YMin = 0;

            //调整Mapframe的范围和位置,使之始终保持在打印页面范围内  
            ele.Geometry = en2;
            //更新  
            gc.UpdateElement(ele);
            return;
        }

对于问题不知道有无大神遇到过,烦请指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值