GIS二次开发:实验三 矢量文件创建与编辑

实验三 矢量文件创建与编辑

一、实验目的

1.了解文本文件的读取
2.掌握shapefile文件的创建
3.掌握矢量要素的添加;
4.掌握字段的添加及属性编辑

二、实验仪器与设备

计算机、visual studio 软件、ArcGIS engine 开发包

三、实验内容与步骤

  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.Shapfile文件的创建

    /// <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);

四、实验要求

创建LayerOperatorClass 实现从文本文件中读取点坐标数据,创建点、线、面三种类型的shp文件,添加字段,根据点坐标在shp文件中添加点、线、面要素。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、实验心得体会

1.学会了创建shape文件,使用外部txt数据读取进行点、线、面的创建。
2.学会了添加字段类型,进行编辑。


版权声明:本文为chengzilhc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。