ArcGIS Engine 10.0 for.NET开发学习笔记(四)

来源:互联网 发布:来看星软件 编辑:程序博客网 时间:2024/05/13 16:34

【地图的基本操作】
一、加载栅格数据
栅格数据是GIS的数据源之一,主要有卫星影像、航空影像、扫描的地图和照片等。常见的栅格数据格式有*.bmp、*.tif和*.jpg等。添加栅格数据主要用到IRasterPyramid3、IRasterLayer等接口。实现思路:
1、用IWorkspaceFactory接口的OpenFromFile方法获得栅格文件的工作区。
2、用IRasterWorkspace接口的OpenRasterDataset方法获得栅格文件的数据集,实例化栅格文件对象,并对栅格数据集是否具有金字塔进行判断(这里栅格文件如果不具有金字塔则创建金字塔,可以提高大数据量图像的显示效率)。
3、创建RasterLayer类的实例pRasterLayer,并定义其数据集。
4、使用MapControl控件的AddLayer方法将pRasterLayer添加至当前地图。
以下是核心代码:

private void btnAddRaster_Click(object sender, EventArgs e)        {            OpenFileDialog pOpenFileDialog = new OpenFileDialog();            pOpenFileDialog.CheckFileExists = true;            pOpenFileDialog.Title = "打开Raster文件";            pOpenFileDialog.Filter = "栅格文件 (*.*)|*.bmp;*.tif;*.jpg;*.img|(*.bmp)|*.bmp|(*.tif)|*.tif|(*.jpg)|*.jpg|(*.img)|*.img";            pOpenFileDialog.ShowDialog();            string pRasterFileName = pOpenFileDialog.FileName;            if (pRasterFileName == "")            {                return;            }            string pPath = System.IO.Path.GetDirectoryName(pRasterFileName);            string pFileName = System.IO.Path.GetFileName(pRasterFileName);            IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pPath, 0);            IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;            IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pFileName);            //影像金字塔判断与创建            IRasterPyramid3 pRasPyrmid;            pRasPyrmid = pRasterDataset as IRasterPyramid3;            if (pRasPyrmid != null)            {                if (!(pRasPyrmid.Present))                {                    pRasPyrmid.Create(); //创建金字塔                }            }            IRaster pRaster;            pRaster = pRasterDataset.CreateDefaultRaster();            IRasterLayer pRasterLayer;            pRasterLayer = new RasterLayerClass();            pRasterLayer.CreateFromRaster(pRaster);            ILayer pLayer = pRasterLayer as ILayer;            mainMapControl.AddLayer(pLayer, 0);        }


二、加载CAD数据
对于ArcGIS Engine来说,有两种不同的方式使用CAD数据:一是作为要素图层,以矢量数据来使用;二是作为地图背景,以栅格数据来使用。对于前者,ArcGIS Engine使用与FeatureLayer一样的方法来管理,对于后者则采用CadLayer对象来管理。
1、CAD文件作为矢量图层加载
当一个CAD文件被看作是矢量图层时,表现为四种要素类型,即点、线、多边形和注记。点、线和多边形作为要素数据时,可以使用FeatureLayer对象,但CAD文件中的文字标注需要使用一个专门的注记图层(Annotation),而不是要素图层。
CAD作为矢量加载时有分图层加载和整幅图加载两种模式。
(1)分图层加载。实现思路:①CAD图可以分为点、线、面、标注,他们可以分别被加载到MapControl中。与加载其他数据一样,首先定义一个工作空间,用CadWorkspaceFactoryClass实例化工作空间,并打开相应的工作空间。②创建FeatureLayer的实例,定义数据集,使用IMap接口的AddLayer方法将要素图层添加至当前地图。
核心代码如下:

private void btnAddCADByLayer_Click(object sender, EventArgs e)        {            IWorkspaceFactory pWorkspaceFactory;            IFeatureWorkspace pFeatureWorkspace;            IFeatureLayer pFeatureLayer;            IFeatureClass pFeatureClass;            OpenFileDialog pOpenFileDialog = new OpenFileDialog();            pOpenFileDialog.Filter = "CAD(*.dwg)|*.dwg";            pOpenFileDialog.Title = "打开CAD数据文件";            pOpenFileDialog.ShowDialog();            string pFullPath = pOpenFileDialog.FileName;            if (pFullPath == "")            {                return;            }            //获取文件名和文件路径            int pIndex = pFullPath.LastIndexOf("\\");            string pFilePath = pFullPath.Substring(0, pIndex);            string pFileName = pFullPath.Substring(pIndex + 1);            pWorkspaceFactory = new CadWorkspaceFactory();            pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0);            //加载CAD文件中的线文件            pFeatureClass = pFeatureWorkspace.OpenFeatureClass(pFileName + ":polyline");             pFeatureLayer = new FeatureLayerClass();            pFeatureLayer.Name = pFileName;            pFeatureLayer.FeatureClass = pFeatureClass;            ClearAllData();    //新增删除数据            mainMapControl.Map.AddLayer(pFeatureLayer);            mainMapControl.ActiveView.Refresh();            //同步鹰眼            SynchronizeEagleEye();        }

(2)整幅图加载。实现思路:将CAD作为整幅图加载时,在得到相应的工作空间之后对CAD文件中的要素进行遍历,并判断是否为注记图层,如果是注记则需使用CadAnnotationLayer对象。
核心代码如下:

private void btnAddWholeCAD_Click(object sender, EventArgs e)        {            IWorkspaceFactory pWorkspaceFactory;            IFeatureWorkspace pFeatureWorkspace;            IFeatureLayer pFeatureLayer;            IFeatureDataset pFeatureDataset;            OpenFileDialog pOpenFileDialog = new OpenFileDialog();            pOpenFileDialog.Filter = "CAD(*.dwg)|*.dwg";            pOpenFileDialog.Title = "打开CAD数据文件";            pOpenFileDialog.ShowDialog();            string pFullPath = pOpenFileDialog.FileName;            if (pFullPath == "")            {                return;            }            //获取文件名和文件路径            int pIndex = pFullPath.LastIndexOf("\\");            string pFilePath = pFullPath.Substring(0, pIndex);            string pFileName = pFullPath.Substring(pIndex + 1);            //打开CAD数据集            pWorkspaceFactory = new CadWorkspaceFactoryClass(); //using ESRI.ArcGIS.DataSourcesFile;            pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0);            //打开一个要素集            pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pFileName);            //IFeatureClassContainer可以管理IFeatureDataset中的每个要素类            IFeatureClassContainer pFeatClassContainer = (IFeatureClassContainer)pFeatureDataset;            ClearAllData();    //新增删除数据            //对CAD文件中的要素进行遍历处理            for (int i = 0; i < pFeatClassContainer.ClassCount; i++)            {                IFeatureClass pFeatClass = pFeatClassContainer.get_Class(i);                //如果是注记,则添加注记层                if (pFeatClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation)                {                    pFeatureLayer = new CadAnnotationLayerClass();                    pFeatureLayer.Name = pFeatClass.AliasName;                    pFeatureLayer.FeatureClass = pFeatClass;                    mainMapControl.Map.AddLayer(pFeatureLayer);                }                else //如果是点、线、面则添加要素层                {                    pFeatureLayer = new FeatureLayerClass();                    pFeatureLayer.Name = pFeatClass.AliasName;                    pFeatureLayer.FeatureClass = pFeatClass;                    mainMapControl.Map.AddLayer(pFeatureLayer);                }                mainMapControl.ActiveView.Refresh();              }            //同步鹰眼            SynchronizeEagleEye();        }

2、CAD文件作为栅格图层加载
很多情况下CAD数据仅仅用作背景显示而不参与矢量分析,这时候将CAD文件以栅格图层的方式加载,需要使用ICadLayer和ICadDrawingDataset两个接口。
(1)接口
①ICadLayer接口主要提供对CAD文件属性信息的访问。
②ICadDrawingDataset接口提供了对CAD数据集成员的访问。
(2)实现思路
①用IWorkspaceFactory接口的OpenFromFile方法获得CAD文件的工作区。
②用ICadDrawingWorkspace接口的OpenCadDrawingDataset方法获得CAD文件的数据集,并将其赋值给CadLayerClass类的实例对象pCadLayer的CadDrawingDataset属性。
③使用IMap接口的AddLayer方法将pCadLayer添加至当前地图。
核心代码如下:

private void btnAddRasterByCAD_Click(object sender, EventArgs e)        {            IWorkspaceFactory pCadWorkspaceFactory;            IWorkspace pWorkspace;            ICadDrawingWorkspace pCadDrawingWorkspace;            ICadDrawingDataset pCadDrawingDataset;            ICadLayer pCadLayer;            OpenFileDialog pOpenFileDialog = new OpenFileDialog();            pOpenFileDialog.Filter = "CAD(*.dwg)|*.dwg";            pOpenFileDialog.Title = "打开CAD数据文件";            pOpenFileDialog.ShowDialog();            string pFullPath = pOpenFileDialog.FileName;            if (pFullPath == "")            {                return;            }            //获取文件名和文件路径            int pIndex = pFullPath.LastIndexOf("\\");            string pFilePath = pFullPath.Substring(0, pIndex);            string pFileName = pFullPath.Substring(pIndex + 1);            pCadWorkspaceFactory = new CadWorkspaceFactoryClass();            pWorkspace = pCadWorkspaceFactory.OpenFromFile(pFilePath, 0);            pCadDrawingWorkspace = (ICadDrawingWorkspace)pWorkspace;            //获得CAD文件的数据集            pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(pFileName);            pCadLayer = new CadLayerClass();            pCadLayer.CadDrawingDataset = pCadDrawingDataset;            mainMapControl.Map.AddLayer(pCadLayer);            mainMapControl.ActiveView.Refresh();        }




0 0
原创粉丝点击