実験3 ベクターファイルの作成と編集
1. 実験の目的
1. テキスト ファイルの読み取りを理解する
2. シェープファイルの作成をマスターする
3. ベクター要素の追加をマスターする;
4. フィールドの追加と属性編集をマスターする
2. 実験器具および装置
コンピューター、ビジュアル スタジオ ソフトウェア、ArcGIS エンジン開発キット
3. 実験内容と手順
- テキストデータのオープンと点座標の読み込み
/// <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. フィールドタイプの追加と編集方法を学びました。