GIS 二次開発: 実験 2 地図データのアクセスとレンダリング

実験 2 地図データのアクセスとレンダリング

1. 実験の目的

  1. さまざまなデータ型に対応するワークスペースとその使用法に精通している。
  2. ベクター ファイル、ラスター ファイル、個人データベース、フォルダー データベースの読み込みをマスターします。
  3. ArcGIS エンジンのレイヤーのレンダリング タイプとインターフェイスをマスターします。
  4. 点、線、面データの簡単なレンダリングをマスターします。

2. 実験器具および装置

コンピューター、ビジュアル スタジオ ソフトウェア、ArcGIS エンジン開発キット

3. 実験内容と手順

  1. ベクター データの読み込み
    ShapeFile ファイルは現在主流の空間データ ファイル保存方法であり、さまざまな GIS ソフトウェアによるデータ形式変換に一般的に使用される中間形式でもあります。ShapeFile データをロードするには、ワークスペースを使用する方法と、IMapControl インターフェイスの AddShapeFile メソッドを使用する方法の 2 つがあります。
    ワークスペースを通じて ShapeFile ファイルを読み込む実装アイデア。
(1)创建ShapefileWorkspaceFactory实例pWorkspaceFactory,使用IWorkspaceFactory接口的OpenFromFile方法打开pFeatureWorkspace中存储的基于ShapeFile的工作区;
(2)创建FeatureLayer的实例pFeatureLayer,并定义数据集;
(3)使用IMap接口的AddLayer方法加载pFeatureLayer。

コア コードは次のとおりです:
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. ラスターデータの読み込み
ラスターデータは GIS のデータソースの 1 つで、主に衛星画像、航空画像、スキャンした地図、写真などが含まれます。一般的なラスター データ形式には、*.img、.tif、 .jpg などが含まれます。これらのラスター データのワークスペースは、ラスター データが配置されているフォルダーです。ラスター データの追加には、主に IRasterPyramid3 や IRasterLayer などのインターフェイスが使用されます。
ラスター データをロードするための実装アイデア

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

コア コードは次のとおりです:
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. パーソナル データベースとファイル データベースのロード
パーソナル ジオデータベース データ プログラムのロードの概念は次のとおりです。

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

コア コードは次のとおりです:
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();
        }
    }

ファイル ジオデータベースは、さまざまなタイプの GIS データセットをフォルダーの形式で保存します。空間データと非空間データの保存、クエリ、管理が可能です。サポートされるジオデータベースの最大サイズは 1 TB です。DBMS を使用せずに拡張および拡張できます。 . 大量のデータの保存は、Esri がパーソナル データベースに続いて開始した新しいデータ管理システムです。ファイル ジオデータベースは、バージョン管理ではなく、シングル ユーザーの編集をサポートします。
実装のアイデアは次のとおりです。

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

コア コードは次のとおりです:
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. 点、線、面の3種類のベクトルデータのレンダリング

```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 データのレンダリング

     /// <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. 実験結果

1. ポイントレイヤーのレンダリング
ここに画像の説明を挿入

2. デムレンダリング
ここに画像の説明を挿入

3. 独自の価値の演出
ここに画像の説明を挿入

4. ファイルを開きます
ここに画像の説明を挿入

5. 実験経験と経験

1. ベクター ファイル、ラスター ファイル、個人地理データベース、およびファイル地理データベースについてより深く理解します。
2. 異なるデータは異なるレンダリング方法でレンダリングされます。

おすすめ

転載: blog.csdn.net/chengzilhc/article/details/124557659