GIS设计与开发课程设计(二)

环境:Windows10专业版 + ArcGIS10.2 + ArcEngine10.2 + Visual Studio 2019

因每个人电脑版本和软件版本不同,运行的结果可能不同

系列文章:

GIS设计与开发课程设计(一)

GIS设计与开发课程设计(二)

GIS设计与开发课程设计(三)


目录

三、功能实现

3.6 打开地图文档

3.6.1 实现思想

3.6.2 实现的主体代码及注释

3.7 保存地图文档

3.7.1 实现思想

3.7.2 实现的主体代码及注释

3.8 另存为地图文档

3.8.1 实现思想

3.8.2 实现的主体代码及注释

3.9 添加.shp

3.9.1 实现思想

3.9.2 实现的主体代码及注释

3.10 添加.lyr

3.10.1 实现思想

3.10.2 实现的主体代码及注释

3.11 添加栅格数据

3.11.1 实现思想

3.11.2 实现的主体代码及注释

3.12 退出

3.12.1 实现思想

3.12.2 实现的主体代码及注释

3.13 创建栅格数据集

3.13.1 实现思想

3.13.2 实现的主体代码及注


三、功能实现

3.6 打开地图文档

3.6.1 实现思想

(1)主窗口添加“打开地图文档”控件。

(2)新建类MxdOperator,打开地图文档对话框,读取数据源类型,用LoadMxFile()方法打开地图文档。

(3)为“打开地图文档”控件生成点击事件响应函数

3.6.2 实现的主体代码及注释

public void OpenMxd(ESRI.ArcGIS.Controls.AxMapControl basicControl)
        {
            //打开地图文档对话框,读取数据源类型
            OpenFileDialog pOpenFileDialog = new OpenFileDialog();
            pOpenFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|All Files (*.*)|*.*||";
            pOpenFileDialog.Title = "打开地图文档";
            pOpenFileDialog.RestoreDirectory = true;


            if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
            {
                if (System.IO.Path.GetExtension(pOpenFileDialog.FileName) == ".mxd")
                {
                    if (basicControl.CheckMxFile(pOpenFileDialog.FileName)) //检查地图文档有效性
                    {
                        basicControl.LoadMxFile(pOpenFileDialog.FileName);
                    }
                    else
                    {
                        MessageBox.Show(pOpenFileDialog.FileName + "是无效的地图文档!", "信息提示");
                        return;
                    }
                }
            }
            else
            {
                return;
            }
        }

        //打开地图文档
        private void openMxd_Click(object sender, EventArgs e)
        {
            MxdOperator mxdOperator = new MxdOperator();
            mxdOperator.OpenMxd(axMapControl1);
        }

3.7 保存地图文档

3.7.1 实现思想

(1)主窗口添加“保存”控件。

(2)新建类MxdOperator,用Save()方法保存地图文档。

(3)为“保存”控件生成点击事件响应函数。

3.7.2 实现的主体代码及注释

//保存
        public void SaveMxd(ESRI.ArcGIS.Controls.AxMapControl basicControl)
        {
            try
            {
                if (basicControl.LayerCount == 0)
                {
                    MessageBox.Show("无可用的地图文档!");
                    return;
                }
                string sMxdFileName = basicControl.DocumentFilename;
                string fvg = sMxdFileName;
                if (sMxdFileName == null)
                {
                    IMapDocument pMapDocument = new MapDocumentClass();
                    if (sMxdFileName != null && basicControl.CheckMxFile(sMxdFileName))
                    {
                        if (pMapDocument.get_IsReadOnly(sMxdFileName))
                            MessageBox.Show("本地图文档是只读的,不能保存!");
                        pMapDocument.Close();
                        return;
                    }
                    else
                    {
                        SaveFileDialog pSavedlg = new SaveFileDialog();
                        pSavedlg.Title = "请选择保存路径";
                        pSavedlg.OverwritePrompt = true;
                        pSavedlg.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                        pSavedlg.RestoreDirectory = true;
                        if (pSavedlg.ShowDialog() == DialogResult.OK)
                        {
                            sMxdFileName = pSavedlg.FileName;
                        }
                        else
                        {
                            return;
                        }
                    }
                    pMapDocument.New(sMxdFileName);
                    pMapDocument.ReplaceContents(basicControl.Map as IMxdContents);
                    pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
                    pMapDocument.Close();
                    MessageBox.Show("另存为地图文档成功!");
                }

                else
                {
                    IMxdContents pMxdC;
                    pMxdC = basicControl.Map as IMxdContents;
                    IMapDocument pMapDocument = new MapDocumentClass();
                    pMapDocument.Open(basicControl.DocumentFilename, "");
                    IActiveView pActiveView = basicControl.Map as IActiveView;
                    pMapDocument.ReplaceContents(pMxdC);
                    if (pMapDocument == null) return;

                    //检查地图文档是否是只读
                    if (pMapDocument.get_IsReadOnly(pMapDocument.DocumentFilename) == true)
                    {
                        MessageBox.Show("本地图文档是只读的,不能保存!");
                        return;
                    }

                    //根据相对的路径保存地图文档
                    pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
                    MessageBox.Show("地图文档保存成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //保存
        private void saveMxd_Click(object sender, EventArgs e)
        {
            MxdOperator mxdOperator = new MxdOperator();
            mxdOperator.SaveMxd(axMapControl1);
        }

3.8 另存为地图文档

3.8.1 实现思想

(1)主窗口添加“保存”控件。

(2)新建类MxdOperator,用MapDocumentClass()新建地图文档,用SaveFileDialog()方法确定保存的路径和结果,用Save()方法保存地图文档。

(3)为“另存为”控件生成点击事件响应函数。

3.8.2 实现的主体代码及注释

        //另存为
        public void SaveAs(ESRI.ArcGIS.Controls.AxMapControl basicControl)
        {
            try
            {
                if (basicControl.LayerCount == 0)
                {
                    MessageBox.Show("无可用的地图文档!");
                    return;
                }
                string sMxdFileName = basicControl.DocumentFilename;
                IMapDocument pMapDocument = new MapDocumentClass();
                if (sMxdFileName != null && basicControl.CheckMxFile(sMxdFileName))
                {
                    if (pMapDocument.get_IsReadOnly(sMxdFileName))
                    {
                        MessageBox.Show("本地图文档是只读的,不能保存!");
                        pMapDocument.Close();
                        return;
                    }
                    else
                    {
                        SaveFileDialog pSavedlg = new SaveFileDialog();
                        pSavedlg.Title = "请选择保存路径";
                        pSavedlg.OverwritePrompt = true;
                        pSavedlg.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                        pSavedlg.RestoreDirectory = true;
                        if (pSavedlg.ShowDialog() == DialogResult.OK)
                        {
                            sMxdFileName = pSavedlg.FileName;
                        }
                        else
                        {
                            return;
                        }
                    }
                }

                pMapDocument.New(sMxdFileName);
                pMapDocument.ReplaceContents(basicControl.Map as IMxdContents);
                pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
                pMapDocument.Close();
                MessageBox.Show("另存为地图文档成功!");
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //另存为
        private void saveAsMxd_Click(object sender, EventArgs e)
        {
            MxdOperator mxdOperator = new MxdOperator();
            mxdOperator.SaveAs(axMapControl1);
        }

3.9 添加.shp

3.9.1 实现思想

(1)在窗口添加“添加.shp”控件。

(2)为“添加.shp”控件生成点击事件响应函数,用AddShapeFile()方法添加shape文件。

3.9.2 实现的主体代码及注释

//shape文件加载
        private void loadShape_Click(object sender, EventArgs e)
        {
            //利用文件对话框的方式选择加载地图
            OpenFileDialog openFdlg = new OpenFileDialog();
            openFdlg.Title = "选择需要加载的地理数据文件";
            openFdlg.Filter = "Shape格式文件(*.shp)|*.shp";
            openFdlg.ShowDialog();
            String strFileName = openFdlg.FileName;
            if (strFileName == String.Empty)//用户没有进行文件选择,则返回
            {
                return;
            }
            //用户选择了shape文件
            String pathName = System.IO.Path.GetDirectoryName(strFileName);
            String fileName = System.IO.Path.GetFileNameWithoutExtension(strFileName);
            //往axMapControl1中加载地图
            axMapControl1.AddShapeFile(pathName, fileName);
            //在鹰眼中加载地图
            axMapControl2.ClearLayers();
            axMapControl2.AddShapeFile(pathName, fileName);
            //显示全图为鸟瞰图
            axMapControl2.Extent = axMapControl2.FullExtent;
        }

3.10 添加.lyr

3.10.1 实现思想

(1)在窗口添加“添加.lyr”控件。

(2)为“添加.lyr”控件生成点击事件响应函数,用AddLayerFromFile()方法添加lyr文件。

3.10.2 实现的主体代码及注释

        //lyr文件加载
        private void layerLoad_Click(object sender, EventArgs e)
        {
            OpenFileDialog OpenFdlg = new OpenFileDialog();
            OpenFdlg.Filter = "lyr文件(*.lyr)|*.lyr";
            if (OpenFdlg.ShowDialog() == DialogResult.OK)
            {
                string pFileName = OpenFdlg.FileName;
                axMapControl1.AddLayerFromFile(pFileName);
                axMapControl1.ActiveView.Refresh();
                axMapControl2.ClearLayers();
                axMapControl2.AddLayerFromFile(pFileName);
                //显示全图为鸟瞰图
                axMapControl2.Extent = axMapControl2.FullExtent;

            }
        }

3.11 添加栅格数据

3.11.1 实现思想

(1)新建“AddRaster”类,使用AddRasterFile()加载栅格文件,使用AddRasterDataset()加载栅格数据集中的栅格文件。

(2)添加“添加栅格数据”,“添加栅格数据集”控件。

(3)为“添加栅格数据”,“添加栅格数据集”生成点击事件响应函数。

3.11.2 实现的主体代码及注释

        //加载栅格文件
        private void loadRasterFile_Click(object sender, EventArgs e)
        {
            AddRaster addRaster = new AddRaster();
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择栅格文件";
            openFileDialog.Filter = "TIFF(*.tif)|*.tif";
            openFileDialog.RestoreDirectory = true;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                addRaster.AddRasterFile(openFileDialog.FileName, axMapControl1);
                axMapControl2.ClearLayers();
                addRaster.AddRasterFile(openFileDialog.FileName, axMapControl2);
                //显示全图为鸟瞰图
                axMapControl2.Extent = axMapControl2.FullExtent;
            }
        }

//加载栅格数据集
        public void AddRasterDataset(string directory,ESRI.ArcGIS.Controls.AxMapControl axMapControl1)
        {
            IWorkspaceFactory pWorkspaceFactory = new FileGDBWorkspaceFactory();
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(directory, 0);
            IRasterWorkspaceEx pRasterWorkspaceEx = pWorkspace as IRasterWorkspaceEx;

            // 获取栅格数据集
            IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTRasterDataset);
            pEnumDataset.Reset();
            IDataset pDataset = pEnumDataset.Next();

            // 遍历数据集
            while (pDataset != null)
            {
                // 创建金字塔
                IRasterDataset pRasterDataset = pRasterWorkspaceEx.OpenRasterDataset(pDataset.Name);
                IRasterPyramid pRasterPyramid = pRasterDataset as IRasterPyramid;
                if (!pRasterPyramid.Present)
                {
                    pRasterPyramid.Create();
                }

                // 栅格图层
                IRasterLayer pRasterLayer = new RasterLayer();
                pRasterLayer.CreateFromDataset(pRasterDataset);

                // 刷新视图
                axMapControl1.AddLayer(pRasterLayer, 0);
                axMapControl1.Refresh();

                // 下一数据集
                pDataset = pEnumDataset.Next();
            }

        }

        //加载栅格文件
        private void loadRasterFile_Click(object sender, EventArgs e)
        {
            AddRaster addRaster = new AddRaster();
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择栅格文件";
            openFileDialog.Filter = "TIFF(*.tif)|*.tif";
            openFileDialog.RestoreDirectory = true;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                addRaster.AddRasterFile(openFileDialog.FileName, axMapControl1);
                axMapControl2.ClearLayers();
                addRaster.AddRasterFile(openFileDialog.FileName, axMapControl2);
                //显示全图为鸟瞰图
                axMapControl2.Extent = axMapControl2.FullExtent;
            }
        }

        //加载栅格数据集
        private void loadRasterDataset_Click(object sender, EventArgs e)
        {
            AddRaster addRaster = new AddRaster();
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            folderBrowserDialog.Description = "请选择文件地理数据库";

            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                if (!folderBrowserDialog.SelectedPath.EndsWith(".gdb"))
                {
                    MessageBox.Show("请选择文件地理数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    addRaster.AddRasterDataset(folderBrowserDialog.SelectedPath, axMapControl1);
                }
            }
        }

3.12 退出

3.12.1 实现思想

(1)添加“退出”控件。

(2)为“退出”控件生成点击事件响应函数,调用Application.Exit()方法退出任务。

3.12.2 实现的主体代码及注释

        //退出功能
        private void Exit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

3.13 创建栅格数据集

3.13.1 实现思想

(1)添加“创建栅格数据集”控件。

(2)添加“栅格工具类”,利用CreateRasterDataset()方法创建栅格数据集。

(3)为“创建栅格数据集”控件生成点击事件响应函数。

3.13.2 实现的主体代码及注释

using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.DataSourcesRaster;

        //打开栅格数据集工作空间
        public IRasterWorkspaceEx OpenRasterWorkspaceFromFileGDB(string filePath)
        {
            IWorkspaceFactory wsFactory = new FileGDBWorkspaceFactoryClass();
            IRasterWorkspaceEx ws = (IRasterWorkspaceEx)wsFactory.OpenFromFile(filePath, 0);
            return ws;
        }

        //创建栅格数据集函数
        public bool CreateRaster(string filePath, string rasterName)
        {
            IRasterWorkspaceEx rasterWorksapceEx;
            //打开工作空间
            rasterWorksapceEx = OpenRasterWorkspaceFromFileGDB(filePath);
            //设置存储参数
            IRasterStorageDef storageDef = new RasterStorageDef();
            storageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG;
            //设置栅格列属性
            IRasterDef rasterDef = new RasterDef();
            //定义空间参考
            ISpatialReferenceFactory2 srFactotry = new SpatialReferenceEnvironmentClass();
            int gcsType = (int)esriSRGeoCSType.esriSRGeoCS_WGS1984;
            IGeographicCoordinateSystem geoCoordSystem = srFactotry.CreateGeographicCoordinateSystem(gcsType);
            ISpatialReference spatialRef = (ISpatialReference)geoCoordSystem;
            rasterDef.SpatialReference = spatialRef;
            //创建栅格数据集
            IRasterDataset rasterDataset;
            rasterDataset = rasterWorksapceEx.CreateRasterDataset(rasterName, 3, rstPixelType.PT_FLOAT, storageDef, null, rasterDef, null);
            return true;
        }

        //创建栅格数据集
        private void miCreateRaster_Click(object sender, EventArgs e)
        {
            RasterUtil rasterUtil = new RasterUtil();
            rasterUtil.CreateRaster("D:\\raster\\Raster.gdb", "rasterForTest");
        }

3.14 格式转换

3.14.1 实现思想

(1)添加“格式转换”控件。

(2)在“栅格工具类”中,利用SaveAs()方法另存为图像文件。

(3)为“格式转换”控件生成点击事件响应函数。

3.14.2 实现的主体代码及注释

        //打开栅格工作空间
        public IRasterWorkspace OpenRasterWorkspaceFromFile(string filePath)
        {
            IWorkspaceFactory wsFactory = new RasterWorkspaceFactoryClass();
            IRasterWorkspace ws = (IRasterWorkspace)wsFactory.OpenFromFile(filePath, 0);
            return ws;
        }

        //栅格数据格式转换
        public bool RasterConvert(string fileGDB, string oldRasterName, string filePath, string newRasterName)
        {
            IWorkspace workspace;
            IRasterWorkspaceEx rasterWorksapceEx;
            //打开输入工作空间
            rasterWorksapceEx = OpenRasterWorkspaceFromFileGDB(fileGDB);
            //打开栅格数据集
            IRasterDataset rasterDataset = rasterWorksapceEx.OpenRasterDataset(oldRasterName);
            //得到栅格波段
            IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset;
            //打开输出工作空间
            workspace = OpenRasterWorkspaceFromFile(filePath) as IWorkspace;
            //另存为给定文件名的图像文件
            rasterBands.SaveAs(newRasterName, workspace, "TIFF");
            return true;
        }

        //格式转换
        private void miRasterConvert_Click(object sender, EventArgs e)
        {
            RasterUtil rasterUtil = new RasterUtil();
            rasterUtil.RasterConvert("D:\\raster\\Raster.gdb", "rasterForTest", "D:\\raster", "newRaster.tif");
        }

3.15 影像镶嵌

3.15.1 实现思想

(1)添加“影像镶嵌”控件。

(2)在“栅格工具类”中,将所有影像到一个输出栅格数据集。

(3)为“影像镶嵌”控件生成点击事件响应函数。

3.15.2 实现的主体代码及注释

        //影像镶嵌,将catalogName中的所有栅格影像镶嵌成单个影像,并以outputName为文件
        //名保存至outputFolder
        public void Mosaic(string GDBName, string catalogName, string outputFolder, string outputName)
        {
            //打开个人数据库
            IWorkspaceFactory workspaceGDBFactory = new AccessWorkspaceFactoryClass();
            IWorkspace GDBworkspace = workspaceGDBFactory.OpenFromFile(GDBName, 0);
            //打开要被镶嵌的影像所在的栅格目录
            IRasterWorkspaceEx rasterWorkspaceEx = (IRasterWorkspaceEx)GDBworkspace;
            IRasterCatalog rasterCatalog;
            rasterCatalog = rasterWorkspaceEx.OpenRasterCatalog(catalogName);
            //定义一个影像镶嵌对象
            IMosaicRaster mosaicRaster = new MosaicRasterClass();
            //镶嵌栅格目录中的所有影像到一个输出栅格数据集
            mosaicRaster.RasterCatalog = rasterCatalog;
            //设置镶嵌选项
            mosaicRaster.MosaicColormapMode = rstMosaicColormapMode.MM_MATCH;
            mosaicRaster.MosaicOperatorType = rstMosaicOperatorType.MT_LAST;
            //打开输出栅格数据集所在的工作空间
            IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
            IWorkspace workspace = workspaceFactory.OpenFromFile(outputFolder, 0);
            //保存到目标栅格数据集,数据格式可以是TIFE,ING,GRID,BMP,GIF,JPEG2O00,
            //JPEG,Geodatabase等
            ISaveAs saveas = (ISaveAs)mosaicRaster;
            saveas.SaveAs(outputName, workspace, "TIFF");
        }

        //图像镶嵌
        private void miRasterMosaic_Click(object sender, EventArgs e)
        {
            RasterUtil rasterUtil = new RasterUtil();
            rasterUtil.Mosaic("D:\\raster\\RasterDatabase.mdb", "RasterCatalog", "D:\\raster", "MosaicRaster.tif");
        }
  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

juechen333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值