using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
namespace ShpTxt
{
public partial class FrmShapfile : Form
{
public FrmShapfile()
{
InitializeComponent();
}
string InTxtpath;
string InTxtName;
string OutShapepath;
string OutShapeName;
string InShapepath;
string InShapeName;
string OutTxtPath;
string OutTxtName;
ISpatialReference pSRef = new ProjectedCoordinateSystemClass();
private void btnCreate_Click(object sender, EventArgs e)
{
//获取要存储的txt文件
string filepath = OutTxtPath+"\\"+OutTxtName+".txt";
string AttributePth = OutTxtPath + "\\"+OutTxtName + "Attr.txt";
FileStream myStream = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite);
StreamWriter myWrite = new StreamWriter(myStream);
FileStream attrStream = new FileStream(AttributePth, FileMode.Create, FileAccess.Write);
StreamWriter attriWrite = new StreamWriter(attrStream);
//打开工作空间
string fullpath = InShapepath;
string filename =InShapeName ;
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0);
IFeatureWorkspace pFWS = pWS as IFeatureWorkspace;
IFeatureClass pFeatClass = pFWS.OpenFeatureClass(filename);
IFields pFields = pFeatClass.Fields;
//获取字段的名称
string FieldNameCol = "";
for (int j = 2; j < pFields.FieldCount-1; j++)
{
IField pField = pFields.get_Field(j);
if (pField.Type != esriFieldType.esriFieldTypeGeometry)
{
string Name = pField.Name.Trim ();
FieldNameCol += Name + "\t";
}
}
FieldNameCol += pFields.get_Field(pFields.FieldCount - 1).Name.Trim ();
attriWrite.WriteLine(FieldNameCol);
//获取字段的类型
string FieldTypeCol = "";
for (int j = 2; j < pFields.FieldCount-1; j++)
{
IField pField = pFields.get_Field(j);
if (pField.Type != esriFieldType.esriFieldTypeGeometry)
{
string type = pField.Type.ToString().Trim();
FieldTypeCol += type + "\t";
}
}
FieldTypeCol += pFields.get_Field(pFields.FieldCount - 1).Type.ToString ().Trim ();
attriWrite.WriteLine(FieldTypeCol);
IFeatureCursor pFeatCursor = pFeatClass.Search(null, false);
IFeature pFeat = pFeatCursor.NextFeature();
myWrite.WriteLine( pFeat.Shape.GeometryType.ToString().Remove(0, 12));
while (pFeat != null)
{
IGeometry pGeo = pFeat.Shape;
IPointCollection pPointCol = pGeo as IPointCollection;
string filedvalue = pFeat.get_Value(0).ToString().Trim();
myWrite.WriteLine(filedvalue);
attriWrite.WriteLine(filedvalue);
for (int i = 0; i < pPointCol.PointCount; i++)
{
IPoint pPoint = pPointCol.get_Point(i);
myWrite.Write(i.ToString() + "\t");
string corrdinate = "";
corrdinate += pPoint.X.ToString() + "\t";
corrdinate += pPoint.Y.ToString();
myWrite.WriteLine(corrdinate);
}
myWrite.Flush();
//获得属性值
string ValueCol = "";
for (int k = 2; k < pFeat.Fields.FieldCount - 1; k++)
{
ValueCol += pFeat.get_Value(k).ToString().Trim() + "\t";
}
ValueCol += pFeat.get_Value(pFeat.Fields.FieldCount - 1).ToString().Trim();
attriWrite.WriteLine(ValueCol);
attriWrite.Flush();
pFeat = pFeatCursor.NextFeature();
}
attriWrite.Close();
attrStream.Close();
myWrite.Close();
myStream.Close();
MessageBox.Show("成功!");
//this.Close();
}
private void btnTransfer_Click(object sender, EventArgs e)
{
//创建一个新的shapfile工作空间
string fullpath = OutShapepath;
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0);
IFields pFields = new FieldsClass();
IFieldsEdit pFEdits = pFields as IFieldsEdit;
IField pField = new FieldClass();
IFieldEdit pFEdit = pField as IFieldEdit ;
pFEdit.Name_2 = "Shape";
pFEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeoDef = new GeometryDefClass();
IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit ;
//获取几何类型
string filepath = InTxtpath + "\\" + InTxtName + ".txt";
StreamReader myReader = new StreamReader(filepath, System.Text.Encoding.GetEncoding("GB2312"), true);
string data = myReader.ReadLine().Trim();
if (data == "Polyline")
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
else if (data == "Polygon")
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
else if (data == "Point")
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
pGeoDefEdit.SpatialReference_2 = pSRef;
pFEdit.GeometryDef_2 = pGeoDef;
pFEdits.AddField(pField);
//获取字段的名称和类型
string AtrtiPath = InTxtpath + "\\" + InTxtName + "Attr.txt";
StreamReader AttriReader = new StreamReader(AtrtiPath, System.Text.Encoding.Default, true);
AttriReader.BaseStream.Seek(0, SeekOrigin.Begin);
string AReader = AttriReader.ReadLine();
string[] NameCol = AReader.Split('\t');
AReader = AttriReader.ReadLine();
string[] TypeCol = AReader.Split('\t');
for (int i = 0; i < NameCol.GetLength(0); i++)
{
pField = new FieldClass();
pFEdit = pField as IFieldEdit;
pFEdit.Name_2 = NameCol[i].Trim();
string type = TypeCol[i].Trim() ;
switch (type)
{
case "esriFieldTypeString":
pFEdit.Type_2 = esriFieldType.esriFieldTypeString;
break ;
case "esriFieldTypeDouble":
pFEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
break ;
case "esriFieldTypeDate":
pFEdit.Type_2 = esriFieldType.esriFieldTypeDate;
break ;
case "esriFieldTypeInteger":
pFEdit.Type_2= esriFieldType.esriFieldTypeInteger ;
break ;
case "esriFieldTypeSmallInteger":
pFEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
break;
}
pFEdits.AddField(pField);
}
IFeatureWorkspace pFeatWS = pWS as IFeatureWorkspace;
IFeatureClass pFeatClass = pFeatWS.CreateFeatureClass(OutShapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
IPointCollection pPointCol = new MultipointClass();
while (data !="" && data !=null)
{
string[] d = data.Split('\t');
if (d.GetLength(0) == 1)
{
if (pPointCol.PointCount > 0)
{
AReader = AttriReader.ReadLine();
AReader = AttriReader.ReadLine();
string []AttriCol = AReader.Split('\t');
addFeature(pPointCol, pWS, pFeatClass,AttriCol);
pPointCol = new MultipointClass();
}
}
else
{
string X = d[1];
string Y = d[2];
IPoint pPoint = new PointClass();
pPoint.X = Convert.ToDouble(X);
pPoint.Y = Convert.ToDouble(Y);
object missing= Type.Missing ;
pPointCol.AddPoint(pPoint,ref missing, ref missing);
}
data = myReader.ReadLine();
}
if (pPointCol.PointCount > 0)
{
AReader = AttriReader.ReadLine();
AReader = AttriReader.ReadLine();
string[] AttriCol = AReader.Split('\t');
addFeature(pPointCol, pWS, pFeatClass,AttriCol);
pPointCol = new MultipointClass();
}
myReader.Close();
MessageBox.Show("完成!");
//this.Close();
}
private void addFeature(IPointCollection pPointCol, IWorkspace pWS, IFeatureClass pFeatClass, string[] ACol)
{
IWorkspaceEdit pWSEdit = pWS as IWorkspaceEdit;
pWSEdit.StartEditOperation();
IFeature pFeat = pFeatClass.CreateFeature();
if (pFeat.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
pFeat.Shape = AddPloygon(pPointCol);
else if (pFeat.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)
pFeat.Shape = AddPolyline(pPointCol);
else if (pFeat.Shape.GeometryType == esriGeometryType.esriGeometryPoint)
pFeat.Shape = pPointCol.get_Point(0) as IGeometry;
for (int i = 0; i < ACol.GetLength(0); i++)
{
pFeat.set_Value(i + 2, ACol[i].ToString());
}
pFeat.Store();
pWSEdit.StopEditOperation();
}
private IGeometry AddPloygon(IPointCollection pPointCol)
{
object missing = Type.Missing;
IPolygon pPolygon = new PolygonClass();
ISegmentCollection pSegCol = pPolygon as ISegmentCollection;
for (int i = 0; i < pPointCol.PointCount - 1; i++)
{
ILine pLine = new LineClass();
IPoint pFrom = pPointCol.get_Point(i);
IPoint pTo = pPointCol.get_Point(i + 1);
pLine.FromPoint = pFrom;
pLine.ToPoint = pTo;
ISegment pSeg = pLine as ISegment;
pSegCol.AddSegment(pSeg, ref missing, ref missing);
}
ILine pLastLine = new LineClass();
IPoint pFromP = pPointCol.get_Point(pPointCol.PointCount - 1);
IPoint pToP = pPointCol.get_Point(0);
pLastLine.FromPoint = pFromP;
pLastLine.ToPoint = pToP;
ISegment pLastSeg = pLastLine as ISegment;
pSegCol.AddSegment(pLastSeg, ref missing, ref missing);
pPolygon.Close();
IGeometry pGeometry = pPolygon as IGeometry;
return pGeometry;
}
private IGeometry AddPolyline(IPointCollection pPointCol)
{
object missing = Type.Missing;
IPolyline pPolline = new PolylineClass();
ISegmentCollection pSegCol = pPolline as ISegmentCollection;
for (int i = 0; i < pPointCol.PointCount - 1; i++)
{
ILine pLine = new LineClass();
IPoint pFrom = pPointCol.get_Point(i);
IPoint pTo = pPointCol.get_Point(i + 1);
pLine.FromPoint = pFrom;
pLine.ToPoint = pTo;
ISegment pSeg = pLine as ISegment;
pSegCol.AddSegment(pSeg, ref missing, ref missing);
}
IGeometry pGeometry = pPolline as IGeometry;
return pGeometry;
}
private void btnTxtOpen_Click(object sender, EventArgs e)
{
OpenFileDialog InputTxt = new OpenFileDialog();
InputTxt.Filter = "Text file(*.txt)|*.txt";
InputTxt.Multiselect = false;
DialogResult txtResult = InputTxt.ShowDialog();
if (txtResult != DialogResult.OK)
return;
string InTxtfullpath = InputTxt.FileName;
InTxtpath = System.IO.Path.GetDirectoryName(InTxtfullpath);
InTxtName = System.IO.Path.GetFileNameWithoutExtension(InTxtfullpath);
txtInputTxt.Text = InTxtfullpath;
}
private void btnInputShape_Click(object sender, EventArgs e)
{
SaveFileDialog OutPutShape = new SaveFileDialog();
OutPutShape.Filter = "Shapefile(*.shp)|*.shp";
DialogResult shapeResult = OutPutShape.ShowDialog();
if (shapeResult != DialogResult.OK)
return;
string Shapefullpath = OutPutShape.FileName;
OutShapepath = System.IO.Path.GetDirectoryName(Shapefullpath);
OutShapeName = System.IO.Path.GetFileNameWithoutExtension(Shapefullpath);
txtOutputShape.Text = Shapefullpath;
}
private void btnCnacel_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnCoordinate_Click(object sender, EventArgs e)
{
OpenFileDialog OpenRef = new OpenFileDialog();
OpenRef.Filter = "Shapefile(*.shp)|*.shp|坐标系统(*.prj)|*.prj";
OpenRef.Multiselect = false;
DialogResult RefResult = OpenRef.ShowDialog();
if (RefResult != DialogResult.OK)
return;
string fullpath = OpenRef.FileName;
string filepath = System.IO.Path.GetDirectoryName(fullpath);
string filename = System.IO.Path.GetFileNameWithoutExtension(fullpath);
if (OpenRef.FilterIndex == 1)
{
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IWorkspace pWS = pWSF.OpenFromFile(filepath, 0);
IFeatureWorkspace pFWS = pWS as IFeatureWorkspace;
IFeatureClass pFeatClass = pFWS.OpenFeatureClass(filename);
IGeoDataset pGeoDataset = pFeatClass as IGeoDataset;
pSRef = pGeoDataset.SpatialReference;
ISpatialReferenceInfo pSRFInfo = pSRef as ISpatialReferenceInfo;
txtCoordinate.Text = pSRFInfo.Name;
}
else
{
ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
pSRef= pSRF.CreateESRISpatialReferenceFromPRJFile(fullpath);
txtCoordinate.Text = filename;
}
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnInShape_Click(object sender, EventArgs e)
{
OpenFileDialog OpenShape = new OpenFileDialog();
OpenShape.Filter = "Shapefile(*.shp)|*.shp";
OpenShape.Multiselect = false;
DialogResult OpenResult = OpenShape.ShowDialog();
if (OpenResult != DialogResult.OK)
return;
string fullpath = OpenShape.FileName;
InShapepath = System.IO.Path.GetDirectoryName(fullpath);
InShapeName = System.IO.Path.GetFileNameWithoutExtension(fullpath);
txtInShape.Text = fullpath;
}
private void btnOutTxt_Click(object sender, EventArgs e)
{
SaveFileDialog SaveTxt = new SaveFileDialog();
SaveTxt.Filter = "Text file(*.txt)|*.txt";
DialogResult SaveResult = SaveTxt.ShowDialog();
if (SaveResult != DialogResult.OK)
return;
string fullpath = SaveTxt.FileName;
OutTxtPath = System.IO.Path.GetDirectoryName(fullpath);
OutTxtName = System.IO.Path.GetFileNameWithoutExtension(fullpath);
txtOutTxt.Text = fullpath;
}
}
} ...
转载于:https://www.cnblogs.com/hl3292/archive/2011/02/26/1965566.html