注意:这段代码只能参考,每个具体的项目中,转换参数、偏移量、标准是不同的。
有兴趣的同仁可以拿去研究、批评
private bool ConvertXY54C80()
{
string filePath = this.textEdit1.Text;
if (filePath.Length > 0)
{
//获得打开IFeatureClass的字符串数组
string WorkSpacePath = System.IO.Path.GetDirectoryName(filePath);
string ShapeFileName = System.IO.Path.GetFileName(filePath);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(WorkSpacePath, 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(ShapeFileName);
//得到fields
pFields = pFeatureClass.Fields;
IFeature pFeature;
IFeatureCursor pFeatureCursor;
pFeatureCursor = pFeatureClass.Search(null, false);
pFeature = pFeatureCursor.NextFeature();
string fType = pFeature.Shape.GeometryType.ToString();
IFeatureClass pOutFeatureClass = null;
//
//得到创建的新图层
if (fType == "esriGeometryPoint")
{
pOutFeatureClass = this.createShape("point");
}
else if (fType == "esriGeometryPolyline")
{
pOutFeatureClass = this.createShape("polyline");
}
else if (fType == "esriGeometryPolygon")
{
pOutFeatureClass = this.createShape("polygon");
}
//设置一下,用来把要素添加到新创建的图层中
IFeatureCursor pOutFeatureCursor = pOutFeatureClass.Insert(true);
IFeatureBuffer pOutFeatureBuffer = pOutFeatureClass.CreateFeatureBuffer();
//设置输出工作空间
IWorkspaceEdit pOutWorkspaceEdit = null;
IDataset pDataset = (IDataset)pOutFeatureClass;
if (pDataset != null)
{
pOutWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;
}
//
this.progressBar1.Value = 0;
this.progressBar1.Minimum = 0;
this.progressBar1.Maximum = pFeatureClass.FeatureCount(null);
while (pFeature != null)
{
this.progressBar1.Value++;
//分为点、线、面三种情况,取得feature的XY坐标
if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPoint)
{
//可以直接取点的坐标
IPoint pPoint_1 = (IPoint)pFeature.Shape;
double x_1 = pPoint_1.X;
double y_1 = pPoint_1.Y;
//得到地理坐标,用来计算当前点所属地图符号
IPoint pProPoint_1 = this.getGeoPoint(x_1, y_1);
x_1 = pProPoint_1.X;
y_1 = pProPoint_1.Y;
string mapNum_1 = this.getMapNum(x_1, y_1);
//根据mapNum到SDE库中查找对应的参数
IPoint newPoint_1 = this.getNewPoint(pPoint_1, mapNum_1);
//判断newPoint_1的坐标是否在城区,若在,查到地块号,得到公式中的参数值,再计算到新的坐标点
//把生成的点要素存入shape文件
try
{
pOutWorkspaceEdit.StartEditing(true);
pOutWorkspaceEdit.StartEditOperation();
IGeometry pOutGeometry_point = (IGeometry)newPoint_1;
IFeature pOutFeature_point = pOutFeatureClass.CreateFeature();
pOutFeature_point.Shape = pOutGeometry_point;
pOutFeature_point.Store();
pOutWorkspaceEdit.StopEditOperation();
pOutWorkspaceEdit.StopEditing(true);
}
catch (Exception ex)
{
MessageBox.Show("出现异常信息1:" + ex.Message);
return false;
}
}
else if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)
{
IPolyline pLine = (IPolyline)pFeature.Shape;
//创建一个新的feature,用来存放转换后的集合
IPointCollection pOutPointCollection_line = new PolylineClass();
//把该feature强制转换为一个点的集合,再取点的坐标
IPointCollection pPointCollection = pLine as IPointCollection;
for (int i = 0; i < pPointCollection.PointCount; i++)
{
IPoint pPoint_2 = pPointCollection.get_Point(i);
double x_2 = pPoint_2.X;
double y_2 = pPoint_2.Y;
//得到地理坐标,用来计算当前点所属地图符号
IPoint pProPoint_2 = this.getGeoPoint(x_2, y_2);
x_2 = pProPoint_2.X;
y_2 = pProPoint_2.Y;
string mapNum_2 = this.getMapNum(x_2, y_2);
//根据mapNum到SDE库中查找对应的参数
IPoint newPoint_2 = this.getNewPoint(pPoint_2, mapNum_2);
object a_2 = Missing.Value;
object b_2 = Missing.Value;
pOutPointCollection_line.AddPoint(newPoint_2, ref a_2, ref b_2);
}
//把生成的线要素存入shape文件
try
{
pOutWorkspaceEdit.StartEditing(true);
pOutWorkspaceEdit.StartEditOperation();
IGeometry pOutGeometry_line = (IGeometry)pOutPointCollection_line;
IFeature pOutFeature_line = pOutFeatureClass.CreateFeature();
pOutFeature_line.Shape = pOutGeometry_line;
pOutFeature_line.Store();
pOutWorkspaceEdit.StopEditOperation();
pOutWorkspaceEdit.StopEditing(true);
}
catch (Exception ex)
{
MessageBox.Show("出现异常信息2:" + ex.Message);
return false;
}
}
else if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
{
IPolygon pPolygon = (IPolygon)pFeature.Shape;
//创建一个新的feature,用来存放转换后的点集合
IPointCollection pOutPointCollection = new PolygonClass();
//把该feature强制转换为一个点的集合,再取点的坐标
IPointCollection pPointCollection = pPolygon as IPointCollection;
for (int i = 0; i < pPointCollection.PointCount; i++)
{
IPoint pPoint_3 = pPointCollection.get_Point(i);
double x_3 = pPoint_3.X;
double y_3 = pPoint_3.Y;
//得到地理坐标,用来计算当前点所属地图符号
IPoint pProPoint_3 = this.getGeoPoint(x_3, y_3);
x_3 = pProPoint_3.X;
y_3 = pProPoint_3.Y;
string mapNum_3 = this.getMapNum(x_3, y_3);
//根据mapNum到SDE库中查找对应的参数
IPoint newPoint_3 = this.getNewPoint(pPoint_3, mapNum_3);
object a_3 = Missing.Value;
object b_3 = Missing.Value;
pOutPointCollection.AddPoint(newPoint_3, ref a_3, ref b_3);
}
//把生成的面要素存入shape文件
try
{
pOutWorkspaceEdit.StartEditing(true);
pOutWorkspaceEdit.StartEditOperation();
IGeometry pOutGeometry = (IGeometry)pOutPointCollection;
IFeature pOutFeature = pOutFeatureClass.CreateFeature();
pOutFeature.Shape = pOutGeometry;
pOutFeature.Store();
pOutWorkspaceEdit.StopEditOperation();
pOutWorkspaceEdit.StopEditing(true);
}
catch (Exception ex)
{
MessageBox.Show("出现异常信息3:" + ex.Message);
return false;
}
}
pFeature = pFeatureCursor.NextFeature();
}
}
return true;
}