实验三 矢量文件创建与编辑
一、实验目的
1.了解文本文件的读取
2.掌握shapefile文件的创建
3.掌握矢量要素的添加;
4.掌握字段的添加及属性编辑
二、实验仪器与设备
计算机、visual studio 软件、ArcGIS engine 开发包
三、实验内容与步骤
- 文本数据的打开与点坐标读取
/// <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版权协议,转载请附上原文出处链接和本声明。