GIS Secondary Development: Experiment 2 Map Data Access and Rendering

Experiment 2 Map Data Access and Rendering

1. Purpose of the experiment

  1. Familiar with the workspace corresponding to different data types and its use;
  2. Master the loading of vector files, raster files, personal databases and folder databases;
  3. Master the rendering types and interfaces of layers in ArcGIS engine;
  4. Master the simple rendering of point, line and surface data.

2. Experimental instruments and equipment

Computer, visual studio software, ArcGIS engine development kit

3. Experimental content and steps

  1. Loading of vector data
    ShapeFile files are currently a mainstream spatial data file storage method, and are also an intermediate format commonly used for data format conversion by different GIS software. There are two ways to load ShapeFile data: through the workspace; through the AddShapeFile method of the IMapControl interface.
    The implementation idea of ​​loading ShapeFile files through the workspace.
(1)创建ShapefileWorkspaceFactory实例pWorkspaceFactory,使用IWorkspaceFactory接口的OpenFromFile方法打开pFeatureWorkspace中存储的基于ShapeFile的工作区;
(2)创建FeatureLayer的实例pFeatureLayer,并定义数据集;
(3)使用IMap接口的AddLayer方法加载pFeatureLayer。

The core code is as follows:
Form1.cs:

    /// <summary>
    /// 打开shape文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonItem3_Click(object sender, EventArgs e)
    {
    
    
        gis3._1.myengineproject readfile = new gis3._1.myengineproject();
        OpenFileDialog opendlg = new OpenFileDialog();
        opendlg.Filter = "shape flie|*shp";
        if (opendlg.ShowDialog() == DialogResult.OK)
        {
    
    
            IFeatureLayer pfraturelayer = readfile.readshapefilefromfile(opendlg.FileName);
            axMapControl1.AddLayer(pfraturelayer as ILayer);
            axMapControl1.Refresh();
        }
    }

MyEngineProject.cs:

    /// <summary>
    /// shape文件
    /// </summary>
    /// <param name="fullfilename"></param>
    /// <returns></returns>
    public IFeatureLayer readshapefilefromfile(string fullfilename)
    {
    
    
        string pathname = System.IO.Path.GetDirectoryName(fullfilename);
        string filename = System.IO.Path.GetFileName(fullfilename);

        try
        {
    
    
            IWorkspaceFactory pwsf = new ShapefileWorkspaceFactory();
            IFeatureWorkspace pws = pwsf.OpenFromFile(pathname, 0) as IFeatureWorkspace;

            IFeatureClass pfeatureclass = pws.OpenFeatureClass(filename);
            IFeatureLayer pfeaturelayer = new FeatureLayer();
            pfeaturelayer.FeatureClass = pfeatureclass;
            pfeaturelayer.Name = pfeatureclass.AliasName;

            return pfeaturelayer;
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return null;

        }
    }

2. Loading of raster data
Raster data is one of the data sources of GIS, mainly including satellite images, aerial images, scanned maps, photos, etc. Common raster data formats include *.img, .tif, and .jpg, etc. The workspace of these raster data is the folder where they are located. Adding raster data mainly uses interfaces such as IRasterPyramid3 and IRasterLayer.
Implementation ideas for loading raster data

(1)用IWorkspaceFactory接口的OpenFromFile方法获得栅格文件的工作区;
(2)用IRasterWorkspace接口的OpenRasterDataset方法获得栅格文件的数据集,实例化栅格文件对象,并对栅格数据集是否具有金字塔进行判断(这里栅格文件如果不具有金字塔则创建金字塔,可以提高大数据量图像的显示效率);
(3)创建RasterLayer类的实例pRasterLayer,并定义其数据集;
(4)使用MapControl控件的AddLayer方法将pRasterLayer添加.。

The core code is as follows:
Form1.cs:

    /// <summary>
    /// 打开栅格文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonItem4_Click(object sender, EventArgs e)
    {
    
    
        gis3._1.myengineproject readfile = new gis3._1.myengineproject();
        OpenFileDialog opendlg = new OpenFileDialog();
        opendlg.Filter = "raster flie|*img|tiff file|*tif";
        if (opendlg.ShowDialog() == DialogResult.OK)
        {
    
    
            IRasterLayer prasterlayer = readfile.readrasterlayerfromfile(opendlg.FileName);
            axMapControl1.AddLayer(prasterlayer as ILayer);
            axMapControl1.Refresh();
        }
    }

MyEngineProject.cs:

 /// <summary>
    /// 栅格文件
    /// </summary>
    /// <param name="fullfilename"></param>
    /// <returns></returns>
    public IRasterLayer readrasterlayerfromfile(string fullfilename)
    {
    
    
        string pathname = System.IO.Path.GetDirectoryName(fullfilename);
        string filename = System.IO.Path.GetFileName(fullfilename);

        try
        {
    
    
            IWorkspaceFactory pwsf = new RasterWorkspaceFactory();
            IRasterWorkspace pws = pwsf.OpenFromFile(pathname, 0) as IRasterWorkspace;

            IRasterDataset prasterds = pws.OpenRasterDataset(filename);
            IRasterPyramid3 prasterpryd = prasterds as IRasterPyramid3;
            if (prasterpryd != null)
            {
    
    
                if (prasterpryd.Present == false)
                {
    
    
                    prasterpryd.Create();
                }
            }

            IRasterLayer prasterlayer = new RasterLayer();
            prasterlayer.CreateFromDataset(prasterds);

            return prasterlayer;
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return null;

        }
    }

3. Loading of personal database and file database
The idea of ​​loading Personal Geodatabase data program is as follows:

(1)创建AccessWorkspaceFactory类的实例;
(2)用IWorkspaceFactory接口的OpenFromFile方法打开*.mdb数据集的工作空间,对工作空间里面的数据进行加载。

The core code is as follows:
Form1.cs:

    /// <summary>
    /// 打开个人地理数据库
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonItem5_Click(object sender, EventArgs e)
    {
    
    
        OpenFileDialog opendlg = new OpenFileDialog();
        opendlg.Filter = "personal geodatabase|*mdb";
        if (opendlg.ShowDialog() == DialogResult.OK)
        {
    
    
            string fullfilename = opendlg.FileName;
            gis3._1.myengineproject readfile = new gis3._1.myengineproject();
            IMapControl3 m_map = axMapControl1.Object as IMapControl3;
            readfile.readdatafrompersonaldatabase(fullfilename, m_map);
            axMapControl1.Refresh();

        }
    }

MyEngineProject.cs:

    /// <summary>
    /// 个人地理数据库
    /// </summary>
    /// <param name="fullfilename"></param>
    /// <param name="m_map"></param>
    public void readdatafrompersonaldatabase(string fullfilename, IMapControl3 m_map)
    {
    
    
        try
        {
    
    
            string pathname = System.IO.Path.GetDirectoryName(fullfilename);
            string filename = System.IO.Path.GetFileName(fullfilename);

            IWorkspaceFactory pwf = new AccessWorkspaceFactory();
            IWorkspace pws = pwf.OpenFromFile(fullfilename, 0);
            addl1layers(pws, m_map);
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return;
        }
    }

    private void addl1layers(IWorkspace pws, IMapControl3 m_map)
    {
    
    
        IEnumDataset peds = pws.Datasets[esriDatasetType.esriDTAny];
        peds.Reset();

        IDataset pds = peds.Next();

        while (pds != null)
        {
    
    
            if (pds is IFeatureClass)//矢量数据
            {
    
    
                IFeatureWorkspace pfeaturews = pws as IFeatureWorkspace;
                IFeatureLayer pfeaturelayer = new FeatureLayer();
                pfeaturelayer.FeatureClass = pfeaturews.OpenFeatureClass(pds.Name);
                pfeaturelayer.Name = pfeaturelayer.FeatureClass.AliasName;
                m_map.AddLayer(pfeaturelayer as ILayer);

            }
            else if (pds is IRasterDataset)//栅格数据
            {
    
    
                IRasterWorkspace prasterws = pws as IRasterWorkspace;
                IRasterDataset prasterds = prasterws.OpenRasterDataset(pds.Name);
                IRasterPyramid3 prasterpryd = prasterds as IRasterPyramid3;
                if (prasterpryd != null)
                {
    
    
                    if (prasterpryd.Present == false)
                    {
    
    
                        prasterpryd.Create();
                    }
                }

                IRasterLayer prasterlayer = new RasterLayer();
                prasterlayer.CreateFromDataset(prasterds);
                m_map.AddLayer(prasterlayer as ILayer);
            }
            else if (pds is IFeatureDataset)//矢量数据集
            {
    
    
                IFeatureWorkspace pfeaturews = pws as IFeatureWorkspace;
                IFeatureDataset pfeatureds = pfeaturews.OpenFeatureDataset(pds.Name);
                IEnumDataset peumds = pfeatureds.Subsets;
                peumds.Reset();

                IGroupLayer pgrouplayer = new GroupLayer();
                pgrouplayer.Name = pds.Name;

                IDataset pds2 = peumds.Next();
                while (pds2 != null)
                {
    
    
                    IFeatureClass pfeatureclass2 = pfeaturews.OpenFeatureClass(pds2.Name);
                    IFeatureLayer pfeaturelayer2 = new FeatureLayer();
                    pfeaturelayer2.FeatureClass = pfeatureclass2;
                    pfeaturelayer2.Name = pfeaturelayer2.FeatureClass.AliasName;
                    pgrouplayer.Add(pfeaturelayer2 as ILayer);

                    pds2 = peumds.Next();
                }
                m_map.AddLayer(pgrouplayer as ILayer);

            }
            pds = peds.Next();
        }
    }

The file geodatabase stores various types of GIS datasets in the form of folders. It can store, query and manage spatial data and non-spatial data. The maximum size of the supported geodatabase is 1TB. It can be expanded and expanded without using a DBMS. Storing a large amount of data is a new data management system launched by Esri after the personal database. File geodatabases support single-user editing, not versioning.
The implementation idea is as follows:

由于文件地理数据库是以文件夹的形式存在的,可以使用FolderBrowserDialog选择文件夹进行加载。 
首先创建FileGDBWorkspaceFactoryClass类的实例;
其次用IWorkspaceFactory接口的OpenFromFile方法打开文件地理数据库的工作空间,对工作空间里面的数据进行加载。

The core code is as follows:
Form1.cs:

    /// <summary>
    /// 打开文件数据库
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttonItem6_Click(object sender, EventArgs e)
    {
    
    
        FolderBrowserDialog foiderdlg = new FolderBrowserDialog();
        if (foiderdlg.ShowDialog() == DialogResult.OK)
        {
    
    
            gis3._1.myengineproject readfile = new gis3._1.myengineproject();
            IMapControl3 m_map = axMapControl1.Object as IMapControl3;
            readfile.readdatafromfiledatabase(foiderdlg.SelectedPath, m_map);
            axMapControl1.Refresh();
        }
    }

MyEngineProject.cs:

    /// <summary>
    /// 文件数据库
    /// </summary>
    /// <param name="selecpath"></param>
    /// <param name="m_map"></param>
    public void readdatafromfiledatabase(string selecpath, IMapControl3 m_map)
    {
    
    
        try
        {
    
    
            //string pathname = System.IO.Path.GetDirectoryName(selecpath);
            //string filename = System.IO.Path.GetFileName(selecpath);

            IWorkspaceFactory pwf = new FileGDBWorkspaceFactory();
            IWorkspace pws = pwf.OpenFromFile(selecpath, 0);
            addl1layers(pws, m_map);
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return;
        }
    }

4. Rendering of three types of vector data of point, line and surface

```csharp
      /// <summary>
        /// 点图层渲染
        /// </summary>
        /// <param name="player"></param>
        /// <returns></returns>
        public bool randerlayerusesimplemark(ILayer player)
        {
    
    
            try
            {
    
    
                //第一步:把ilayer为IGeoFeatureLayer
                IGeoFeatureLayer pgeofeaturelayer = player as IGeoFeatureLayer;

                //创建要使用的符号,并设置符号格式
                ISimpleMarkerSymbol pmarksymbol = new SimpleMarkerSymbol();
                pmarksymbol.Style = esriSimpleMarkerStyle.esriSMSCross;
                pmarksymbol.Color = getrgb(255,0,0);

                //第三步创建渲染器
                ISimpleRenderer prender = new SimpleRenderer();

                //第四步用创建的符号进行渲染
                prender.Symbol = pmarksymbol as ISymbol;

                //第五步,把渲染器赋值给igeolayer的render属性
                pgeofeaturelayer.Renderer=prender as IFeatureRenderer;

                return true;
            }
            catch(Exception ex)
            {
    
    
                 System.Windows.Forms.MessageBox.Show(ex.ToString());
                return false;
            }
        }
        /// <summary>
        /// 线渲染(未调用)
        /// </summary>
        /// <param name="player"></param>
        /// <returns></returns>
        public bool randerlayerusesimpleline(ILayer player)
        {
    
    
            try
            {
    
    
                IGeoFeatureLayer pgeofeaturelayer = player as IGeoFeatureLayer;
                ISimpleLineSymbol plinesymbol = new SimpleLineSymbol();
                plinesymbol.Style = esriSimpleLineStyle.esriSLSDashDot;
                plinesymbol.Color = getrgb(255, 0, 0);
                plinesymbol.Width = 1.5;

                ISimpleRenderer prender = new SimpleRenderer();
                prender.Symbol = plinesymbol as ISymbol;
                pgeofeaturelayer.Renderer = prender as IFeatureRenderer;

                return true;
            }
            catch (Exception ex)
            {
    
    
                System.Windows.Forms.MessageBox.Show(ex.ToString());
                return false;
            }
        }

        /// <summary>
        /// 面渲染(未调用)
        /// </summary>
        /// <param name="player"></param>
        /// <returns></returns>
        public bool randerlayerusesimplestyle(ILayer player)
        {
    
    
            try
            {
    
    
                IGeoFeatureLayer pgeofeaturelayer = player as IGeoFeatureLayer;
                ISimpleFillSymbol pfilesymbol = new SimpleFillSymbol();
                pfilesymbol.Style = esriSimpleFillStyle.esriSFSSolid;
                pfilesymbol.Color = getrgb(255, 0, 0);
                pfilesymbol.Outline.Width = 1.5;

                ISimpleRenderer prender = new SimpleRenderer();
                prender.Symbol = pfilesymbol as ISymbol;
                pgeofeaturelayer.Renderer = prender as IFeatureRenderer;

                return true;
            }
            catch (Exception ex)
            {
    
    
                System.Windows.Forms.MessageBox.Show(ex.ToString());
                return false;
            }
        }
        private IRgbColor getrgb(int r,int g ,int b)
       {
    
    
            IRgbColor prgbc=new RgbColor();
            prgbc.Red = r;
            prgbc.Blue = b;
            prgbc.Green = g;
            return prgbc;         
       }

5. DEM data rendering

     /// <summary>
        /// dem数据渲染
        /// </summary>
        /// <param name="player"></param>
        /// <returns></returns>
        public bool renderdemlayer(ILayer player)
        {
    
    
            try
            {
    
    
                IRasterLayer prasterlayer=player as IRasterLayer;
                IRasterStretchColorRampRenderer prscrr=new RasterStretchColorRampRenderer();
                IRasterRenderer prasterrender=prscrr as IRasterRenderer;
                prasterrender.Raster=prasterlayer.Raster;
                prasterrender.Update();

                IAlgorithmicColorRamp pacr=new AlgorithmicColorRamp();
                pacr.FromColor=getrgb(0,0,255) as IColor;
                pacr.ToColor=getrgb(255,0,0) as IColor;
                pacr.Size=255;
                bool iscreate=false;
                pacr.CreateRamp(out iscreate);
                if (iscreate)
                {
    
    
                    prscrr.BandIndex = 0;
                    prscrr.ColorRamp = pacr;
                    prasterrender.Update();

                    prasterlayer.Renderer = prasterrender as IRasterRenderer;
                }
                else
                {
    
    
                    return false;
                }
                return true;
            }
            catch(Exception ex)
            {
    
    
                System.Windows.Forms.MessageBox.Show(ex.ToString());
                return false;
            }
        }

        /// <summary>
        /// 唯一值渲染
        /// </summary>
        /// <param name="player"></param>
        /// <returns></returns>
        public bool renderuinquevalue(ILayer player)
        {
    
    
            try
            {
    
    
                //第一步:把ilayer为IGeoFeatureLayer
                IGeoFeatureLayer geolayer=player as IGeoFeatureLayer;               

                //创建要使用的符号,并设置符号格式
                ISimpleFillSymbol pfillsymbol1 = new SimpleFillSymbol();
                pfillsymbol1.Color = getrgb(60 ,179, 113);
                pfillsymbol1.Outline.Width = 1.5;

                ISimpleFillSymbol pfillsymbol2 = new SimpleFillSymbol();
                pfillsymbol2.Color = getrgb(0, 100, 0);
                pfillsymbol2.Outline.Width = 1.5;

                ISimpleFillSymbol pfillsymbol3 = new SimpleFillSymbol();
                pfillsymbol3.Color = getrgb(0, 255, 0);
                pfillsymbol3.Outline.Width = 1.5;

                ISimpleFillSymbol pfillsymbol4 = new SimpleFillSymbol();
                pfillsymbol4.Color = getrgb(255,255,0);
                pfillsymbol4.Outline.Width = 1.5;

                //第三步创建渲染器
                IUniqueValueRenderer puvrenderer = new UniqueValueRendererClass();
                puvrenderer.FieldCount=1;
                puvrenderer.set_Field(0,"DDMM");

                //第四步用创建的符号进行渲染
                puvrenderer.AddValue("21","21",pfillsymbol1 as ISymbol);
                puvrenderer.AddValue("22","22", pfillsymbol2 as ISymbol);
                puvrenderer.AddValue("23","23", pfillsymbol3 as ISymbol);
                puvrenderer.AddValue("24","24", pfillsymbol4 as ISymbol);

                geolayer.Renderer = puvrenderer as IFeatureRenderer;
                return true;
            }
            catch(Exception ex)
            {
    
    
                 System.Windows.Forms.MessageBox.Show(ex.ToString());
                return false;
            }
        }

4. Experimental results

1. Point layer rendering
insert image description here

2. dem rendering
insert image description here

3. Unique value rendering
insert image description here

4. Open the file
insert image description here

5. Experimental experience and experience

1. Have a deeper understanding of vector files, raster files, personal geographic databases, and file geographic databases.
2. Different data will be rendered with different rendering methods.

Guess you like

Origin blog.csdn.net/chengzilhc/article/details/124557659