GIS二次開発:実験3 ベクターファイルの作成と編集

実験3 ベクターファイルの作成と編集

1. 実験の目的

1. テキスト ファイルの読み取りを理解する
2. シェープファイルの作成をマスターする
3. ベクター要素の追加をマスターする;
4. フィールドの追加と属性編集をマスターする

2. 実験器具および装置

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

3. 実験内容と手順

  1. テキストデータのオープンと点座標の読み込み
        /// <summary>
        /// 从txt文件读取点坐标
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="pts"></param>
        /// <returns></returns>
        public bool readpointsfromtxtfile(string filename, ref List<mpoints> pts)
        {
    
    
            try
            {
    
    
                //创建一个队列,用来储存点序列
                List<mpoints> mpts = new List<mpoints>();
                //创建文件读取该对象
                StreamReader sr = new StreamReader(filename);
                //读取第一行
                string str = sr.ReadLine();
                //循环读取所有行
                while (str != null)
                {
    
    
                    if (str != "")
                    {
    
    
                        //对读取的一行字符串按照“,”进行分割
                        string[] strarray = str.Split(',');
                        //使用X,Y坐标创建点
                        mpoints pt = new mpoints();
                        pt.X = double.Parse(strarray[1]);
                        pt.Y = double.Parse(strarray[2]);
                        pt.NAME = strarray[3];
                        pt.TYPE = strarray[4];
                        //将得到的点添加到队列中
                        mpts.Add(pt);
                    }
                    //读取下一行
                    str = sr.ReadLine();
                }
                sr.Close();
                pts = mpts;
                return true;
            }
            catch (Exception ex)
            {
    
    
                System.Windows.Forms.MessageBox.Show(ex.ToString());
                return false;
            }
 
        }
    }

2. シャープファイルの作成

    /// <summary>
    /// 创建一个新的shapefile文件
    /// </summary>
    /// <param name="filepath"></param>
    /// <param name="filename"></param>
    /// <param name="datatype"></param>
    /// <param name="pfeaturelayer"></param>
    /// <returns></returns>
    public bool createnewshapefile(string filepath, string filename, int datatype, ref IFeatureLayer pfeaturelayer)
    {
    
    
        try
        {
    
       //判断你要创建的shp文件是否存在,若存在返回false
            if (System.IO.File.Exists(filepath + "\\" + filename + ".shp"))
            {
    
    
                System.Windows.Forms.MessageBox.Show("该文件已经存在,请重新选择工程路径!");
                return false;
            }
            //打开工作空间
            IWorkspaceFactory pwoekspacefactory = new ShapefileWorkspaceFactory();
            IFeatureWorkspace pfeatureworkspace = pwoekspacefactory.OpenFromFile(filepath, 0) as IFeatureWorkspace;

            //编辑属性字段
            IFields pfields = new Fields();
            IFieldsEdit pfieldsedit = pfields as IFieldsEdit;

            //单个字段
            IField pfield = new Field();
            IFieldEdit pfieldedit = pfield as IFieldEdit;
            pfieldedit.Name_2 = "Shape";
            pfieldedit.Type_2 = esriFieldType.esriFieldTypeGeometry;
          
    
            
            //设置要素、图层类型、投影
            IGeometryDef pgeometrydef = new GeometryDef();
            IGeometryDefEdit pgeometrydefedit = pgeometrydef as IGeometryDefEdit;
            switch (datatype)
            {
    
    
                case 0:
                    pgeometrydefedit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
                    break;
                case 1:
                    pgeometrydefedit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
                    break;
                case 2:
                    pgeometrydefedit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
                    break;
            }
            //投影
            ISpatialReferenceFactory pfactory = new SpatialReferenceEnvironment();
            ISpatialReference pspaticalreference=pfactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984) as ISpatialReference;
            pgeometrydefedit.SpatialReference_2=pspaticalreference as ISpatialReference;

            
            pfieldedit.GeometryDef_2 = pgeometrydefedit;
            pfieldsedit.AddField(pfield);
            
            
            IField pfield2 = new Field();
            IFieldEdit pfieldedit2 = pfield2 as IFieldEdit;
            pfieldedit2.Name_2 = "NAME";
            pfieldedit2.Type_2 = esriFieldType.esriFieldTypeString;
            pfieldsedit.AddField(pfield2);

            IField pfield3= new Field();
            IFieldEdit pfieldedit3 = pfield3 as IFieldEdit;
            pfieldedit3.Name_2 = "TYPE";
            pfieldedit3.Type_2 = esriFieldType.esriFieldTypeString;
            pfieldsedit.AddField(pfield3);

            //创建要素类(创建fraturelayer)
            IFeatureClass featureclass;
            featureclass=pfeatureworkspace.CreateFeatureClass(filename,pfields,null,null,esriFeatureType.esriFTSimple,"Shape","");
            

            IFeatureLayer featurelayer = new FeatureLayer();
            featurelayer.FeatureClass = featureclass;
            featurelayer.Name = featureclass.AliasName;
            pfeaturelayer = featurelayer;

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

    }

3. ベクトル要素の追加をマスターする

    /// <summary>
    /// 使用坐标序列更新点图层
    /// </summary>
    /// <param name="pfeatureclass"></param>
    /// <param name="pts"></param>
    /// <returns></returns>
    public bool updatapointlayerfrompoint(ref IFeatureClass pfeatureclass, List<mpoints>pts)
    {
    
    
        try
        {
    
       
            //打开工作空间
            IDataset dataset = pfeatureclass as IDataset;
            IWorkspace workspace = dataset.Workspace;
            //启动编辑
            IWorkspaceEdit workspaceedit = (IWorkspaceEdit)workspace;
            workspaceedit.StartEditing(true);
            workspaceedit.StartEditOperation();
            //添加要素
            for (int j = 0; j < pts.Count; j++)
            {
    
    
                //创建一个新的空要素
                IFeature pfeature = pfeatureclass.CreateFeature();
                //设置该要素的几何
                IPoint pt = new Point();
                pt.X = pts[j].X;
                pt.Y = pts[j].Y;
                pfeature.Shape = pt as IGeometry;
                //属性值设置
                pfeature.Value[2] = pts[j].NAME;
                pfeature.Value[3] = pts[j].TYPE;

                //要素保存
                pfeature.Store();
            }
            //结束编辑
            workspaceedit.StopEditOperation();
            workspaceedit.StopEditing(true);
            return true;
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return false;
        }
 
    }

    /// <summary>
    /// 利用读入的点文件更新shpfile文件(面要素)
    /// </summary>
    /// <param name="pfeatureclass"></param>
    /// <param name="pts"></param>
    /// <returns></returns>
    public bool updatapolygonlayerfrompoints(ref IFeatureClass pfeatureclass, List<IPoint> pts)
    {
    
    
        try
        {
    
    
            if (pts.Count < 3)
            {
    
    
                return false;
            }

            //打开工作空间
            IDataset dataset = pfeatureclass as IDataset;
            IWorkspace workspace = dataset.Workspace;
            //启动编辑
            IWorkspaceEdit workspaceedit = (IWorkspaceEdit)workspace;
            workspaceedit.StartEditing(true);
            workspaceedit.StartEditOperation();
            //添加要素
            object obj = Type.Missing;
            IPointCollection pt_cllection = new Polygon();
            for (int j = 0; j < pts.Count; j++)
            {
    
                      
                pt_cllection.AddPoint(pts[j], ref obj, ref obj);                   
            }
            IFeature pfeature = pfeatureclass.CreateFeature();
            IPolygon polygon = pt_cllection as IPolygon;
            pfeature.Shape = polygon as IGeometry;
            pfeature.Store();
            //结束编辑
            workspaceedit.StopEditOperation();
            workspaceedit.StopEditing(true);
            return true;
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return false;
        }
 
    }

    /// <summary>
    /// 利用点更新shapefile文件(线要素)
    /// </summary>
    /// <param name="pfeatureclass"></param>
    /// <param name="pts"></param>
    /// <returns></returns>
    public bool updatapolylinelayerfrompoints(ref IFeatureClass pfeatureclass, List<IPoint> pts)
    {
    
    
        try
        {
    
    
            if (pts.Count < 2)
            {
    
    
                return false;
            }

            //打开工作空间
            IDataset dataset = pfeatureclass as IDataset;
            IWorkspace workspace = dataset.Workspace;
            //启动编辑
            IWorkspaceEdit workspaceedit = (IWorkspaceEdit)workspace;
            workspaceedit.StartEditing(true);
            workspaceedit.StartEditOperation();
            //添加要素
            object obj = Type.Missing;
            IPointCollection pt_cllection = new Polyline();

            for (int j = 0; j < pts.Count; j++)
            {
    
    
                pt_cllection.AddPoint(pts[j], ref obj, ref obj);
            }
            //创建要素
            IFeature pfeature = pfeatureclass.CreateFeature();
            //要素几何赋值
            IPolyline polyline = pt_cllection as IPolyline;
            pfeature.Shape = polyline as IGeometry;
            pfeature.Store();

            //结束编辑
            workspaceedit.StopEditOperation();
            workspaceedit.StopEditing(true);
            return true;
        }
        catch (Exception ex)
        {
    
    
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return false;
        }

    }

4. フィールドの追加と属性編集をマスターする

IField pfield2 = new Field();
IFieldEdit pfieldedit2 = pfield2 as IFieldEdit;
pfieldedit2.Name_2 = "NAME";
pfieldedit2.Type_2 = esriFieldType.esriFieldTypeString;
pfieldsedit.AddField(pfield2);

IField pfield3= new Field();
IFieldEdit pfieldedit3 = pfield3 as IFieldEdit;
pfieldedit3.Name_2 = "TYPE";
pfieldedit3.Type_2 = esriFieldType.esriFieldTypeString;
pfieldsedit.AddField(pfield3);

4. 実験要件

LayerOperatorClassを作成してテキストファイルから点座標データを読み込み、点、線、面の3種類のshpファイルを作成し、フィールドを追加し、点座標に応じて点、線、面要素をshpファイルに追加します。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

5. 実験体験

1. シェイプ ファイルを作成し、外部 txt データを読み取って点、線、面を作成する方法を学びました。
2. フィールドタイプの追加と編集方法を学びました。

おすすめ

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