/// <summary>
/// 输入shp文件进行投影
/// </summary>
/// <param name="_pSWorkspaceFactory"></param>
/// <param name="_pSourceFilePath"></param>
/// <param name="_pSName"></param>
/// <param name="_pTWorkspaceFactory"></param>
/// <param name="_pTargetFilePath"></param>
/// <param name="_pTName"></param>
/// <param name="wkid"></param>
public void ConvertFeatureClass( String _pSourceFilePath, string _pSName, String _pTargetFilePath, string _pTName,int <span style="font-family: Arial, Helvetica, sans-serif;">factoryCode)</span>
{
try
{
IWorkspaceFactory _pSWorkspaceFactory = new ShapefileWorkspaceFactory();
// 打开工作空间
IWorkspace pSWorkspace = _pSWorkspaceFactory.OpenFromFile(_pSourceFilePath, 0);
IWorkspace pTWorkspace = _pSWorkspaceFactory.OpenFromFile(_pTargetFilePath, 0);
IFeatureWorkspace pFtWs = pSWorkspace as IFeatureWorkspace;
IFeatureClass pSourceFeatureClass = pFtWs.OpenFeatureClass(_pSName);
IDataset pSDataset = pSourceFeatureClass as IDataset;
IFeatureClassName pSourceFeatureClassName = pSDataset.FullName as IFeatureClassName;
IDataset pTDataset = (IDataset)pTWorkspace;
IName pTDatasetName = pTDataset.FullName;
IWorkspaceName pTargetWorkspaceName = (IWorkspaceName)pTDatasetName;
IFeatureClassName pTargetFeatureClassName = new FeatureClassNameClass();
IDatasetName pTargetDatasetName = (IDatasetName)pTargetFeatureClassName;
pTargetDatasetName.Name = _pTName;
pTargetDatasetName.WorkspaceName = pTargetWorkspaceName;
// 创建字段检查对象
IFieldChecker pFieldChecker = new FieldCheckerClass();
IFields sourceFields = pSourceFeatureClass.Fields;
IFields pTargetFields = null;
IEnumFieldError pEnumFieldError = null;
pFieldChecker.InputWorkspace = pSWorkspace;
pFieldChecker.ValidateWorkspace = pTWorkspace;
// 验证字段
pFieldChecker.Validate(sourceFields, out pEnumFieldError, out pTargetFields);
if (pEnumFieldError != null)
{
Console.WriteLine("Errors were encountered during field validation.");
}
// 获取源要素类的空间参考,可以通过获取源要素类中Shape字段的GeometryDef字段获得
// 这里应该也可以自定义GeometryDef,实现源要素类的投影变换?
//String pShapeFieldName = pSourceFeatureClass.ShapeFieldName;
//int pFieldIndex = pSourceFeatureClass.FindField(pShapeFieldName);
//IField pShapeField = sourceFields.get_Field(pFieldIndex);
//IGeometryDef pSourceGeometryDef = pShapeField.GeometryDef;
//int factoryCode = pSourceGeometryDef.SpatialReference.FactoryCode;
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon;
// 定义新的空间参考
ISpatialReferenceFactory pSpatialReferFac = new SpatialReferenceEnvironmentClass();
ISpatialReference pSpatialRefer = pSpatialReferFac.CreateProjectedCoordinateSystem(wkid);
if (pSpatialRefer != null)
{
geometryDefEdit.SpatialReference_2 = pSpatialRefer;
}
IGeometryDef pTargetGeometryDef = geometryDef;
// 创建要素转换对象
IFeatureDataConverter pFDConverter = new FeatureDataConverterClass();
IEnumInvalidObject pEnumInvalidObject = pFDConverter.ConvertFeatureClass
(pSourceFeatureClassName, null, null, pTargetFeatureClassName,
pTargetGeometryDef, pTargetFields, "", 1000, 0);
IInvalidObjectInfo pInvalidInfo = null;
pEnumInvalidObject.Reset();
while ((pInvalidInfo = pEnumInvalidObject.Next()) != null)
{
Console.WriteLine("Errors occurred for the following feature: {0}",
pInvalidInfo.InvalidObjectID);
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
ArcGIS Engine+C#二次开发中队加载的shp文件进行投影
最新推荐文章于 2025-02-14 08:00:00 发布