using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using DevComponents.DotNetBar;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geoprocessor;
using PublicInterface.TobaGisCS.Homcom;
using UserControls.TobaGis.Homcom;
namespace UI.TobaGisCS.Homcom
{
public partial class frmAnalysisClip : DevComponents.DotNetBar.Office2007Form
{
AxMapControl mapCtrl;
private static bool bInputShp;
public frmAnalysisClip(AxMapControl _mapCtrl)
{
InitializeComponent();
mapCtrl = _mapCtrl;
}
private void frmAnalysisClip_Load(object sender, EventArgs e)
{
cbtInputFeatures.Map = mapCtrl.Map;
cbtInputFeatures.LayerType = LayerType.All;
cbtInputFeatures.setNodes();
tbOutputFeatures.ReadOnly = true;
tbTolerance.Text = "(默认值)";
cbtClipFeatures.Map = mapCtrl.Map;
cbtClipFeatures.LayerType = LayerType.Polygon;
cbtClipFeatures.setNodes();
}
private void btnInputFeatures_Click(object sender, EventArgs e)
{
try
{
this.openFileDialog1.Title = "请选择地图文件";
this.openFileDialog1.Filter = "Shap文件|*.shp";
this.openFileDialog1.RestoreDirectory = true;
this.openFileDialog1.Multiselect = false;
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
cbtInputFeatures.Map = null;
cbtInputFeatures.setNodes();
string dataName = openFileDialog1.FileName;
string fileName = dataName.Substring(dataName.LastIndexOf("//") + 1, dataName.Length - dataName.LastIndexOf("//") - 1);
cbtInputFeatures.setText(fileName);
bInputShp = true;
}
}
catch (Exception ex)
{
RuntimeInfo.Logger.Error("读取文件出错:" + ex);
DevComponents.DotNetBar.MessageBoxEx.Show("读取文件!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnOutputFeatures_Click(object sender, EventArgs e)
{
this.saveFileDialog1.InitialDirectory = RuntimeInfo.Instance.GlobalConfigInfo.ProjectPath;
this.saveFileDialog1.Title = "选择文件输出位置";
this.saveFileDialog1.Filter = "Shape Files(*.shp)|*.shp";
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
tbOutputFeatures.Text = this.saveFileDialog1.FileName;
}
}
private void OK_Click(object sender, EventArgs e)
{
if (cbtInputFeatures.Text.Trim() == "" || cbtClipFeatures.Text.Trim() == ""
|| tbOutputFeatures.Text.Trim() == "" || tbTolerance.Text.Trim() == "")
{
MessageBoxEx.Show("请确定各个输入框内都有值!");
return;
}
try
{
string outShpFile = tbOutputFeatures.Text.Trim();
if (!(Directory.Exists(outShpFile.Substring(0, outShpFile.LastIndexOf("//")))))
{
MessageBoxEx.Show("请确定输入的目录是否正确!");
return;
}
if (File.Exists(tbOutputFeatures.Text.Trim()) == true)
{
if (MessageBoxEx.Show("所选目录已存在同名文件,覆盖该文件?") == DialogResult.OK)
{
File.Delete(tbOutputFeatures.Text.Trim());
}
else return;
}
string inputFileName = openFileDialog1.FileName;
IFeatureClass pFClass = null;
if (bInputShp == true)
{
string shpFile;
int startX, endX;
string shpDir = inputFileName.Substring(0, inputFileName.LastIndexOf("//"));
startX = inputFileName.LastIndexOf("//");
endX = inputFileName.Length;
shpFile = inputFileName.Substring(startX + 1, endX - startX - 1);
pFClass = Utility.OpenFeatureClassFromShapefile(shpDir, shpFile);
}
else
{
pFClass = GetFClassFromMapLyr(cbtInputFeatures.Text.Trim()); ;
}
if (pFClass == null)
{
MessageBoxEx.Show("请确认所选图层是否有效!(复合图层或空图层无效.)", "提示信息");
return;
}
IFeatureClass clipFClass = GetFClassFromMapLyr(cbtClipFeatures.Text.Trim());
if (clipFClass == null)
{
MessageBoxEx.Show("请确认所选图形是否有效!(复合图形或空图形无效.)", "提示信息");
return;
}
Geoprocessor GP = new Geoprocessor();
GP.OverwriteOutput = true;
ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip();
clip.clip_features = clipFClass;
clip.out_feature_class = outShpFile;//@"D://gis//projectparth";
clip.in_features = pFClass;
if (tbTolerance.Text.Trim() != "(默认值)")
{
double tolerance = Convert.ToDouble(tbTolerance.Text.Trim());
clip.cluster_tolerance = tolerance;
}
this.Text = "地图裁剪 - 正在对地图进行裁剪,请稍候...";
GP.Execute(clip, null);
//可用GP.GetMessage(i)调试时GP的信息,了解是否正确执行
//将生成的图层加入
string outShpDir = outShpFile.Substring(0, outShpFile.LastIndexOf("//"));
string outShpName = outShpFile.Substring(outShpFile.LastIndexOf("//") + 1);
IFeatureClass outFClass= Utility.OpenFeatureClassFromShapefile(outShpDir,outShpName);
IFeatureLayer outLayer = new FeatureLayerClass();
outLayer.FeatureClass = outFClass;
outLayer.Name = outFClass.AliasName;
mapCtrl.Map.AddLayer(outLayer);
this.Text = "地图裁剪";
MessageBoxEx.Show(this, "生成成功!", "信息", MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBoxEx.Show("裁剪过程出现错误!请重试!", "错误信息");
RuntimeInfo.Logger.Error("" + ex);
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
/// <summary>
/// 从Layer得到FeatureClass
/// </summary>
/// <param name="sLyrName">图层的名字</param>
/// <returns></returns>
private IFeatureClass GetFClassFromMapLyr(string sLyrName)
{
AxMapControl axMap = mapCtrl;
IFeatureClass pFeatCls = null;
for (int i = 0; i <= axMap.LayerCount - 1; i++)
{
ILayer pLyr = axMap.get_Layer(i);
if (pLyr is ICompositeLayer)
{
pLyr = getSubLyr(pLyr as ICompositeLayer,sLyrName);
}
if (pLyr != null)
{
if (pLyr.Name == sLyrName)
{
if (pLyr is IFeatureLayer)
{
IFeatureLayer pFLyr = pLyr as IFeatureLayer;
pFeatCls = pFLyr.FeatureClass;
break;
}
}
}
}
return pFeatCls;
}
/// <summary>
/// 从复合图层中得到所需FeatureClass
/// </summary>
/// <param name="cmpLayer">要处理的复合图层</param>
/// <param name="sLyrName">从图层名为此的图层中获取FeatureClass</param>
/// <returns></returns>
private IFeatureLayer getSubLyr(ICompositeLayer cmpLayer, string sLyrName)
{
IFeatureLayer pFLayer = null;
for (int j = 0; j < cmpLayer.Count; j++)
{
ILayer pLyr = cmpLayer.get_Layer(j);
if (pLyr is ICompositeLayer)
{
getSubLyr(pLyr as ICompositeLayer, sLyrName);
}
else if (pLyr.Name == sLyrName)
{
pFLayer = pLyr as IFeatureLayer;
break;
}
}
return pFLayer;
}
}
}
===========================================================================
以下为尝试过的方法
===========================================================================
/* IFeatureClassName pFCName = new FeatureClassNameClass();
* 引发多处异常
**/
//IFeatureClassName pFCName = new FeatureClassNameClass();
FeatureClassNameClass();
//pFCName.FeatureType = esriFeatureType.esriFTSimple;
//pFCName.ShapeFieldName = "Shape";
//pFCName.ShapeType = pFClass.ShapeType;
//IFeatureClassName pFCName2 = new FeatureClassNameClass();
//IWorkspaceName wsName = new WorkspaceNameClass();
//wsName.WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory";
//wsName.PathName = "d: //gis";
//wsName.PathName = tbOutputFeatures.Text.Trim().Substring(0, tbOutputFeatures.Text.Trim().LastIndexOf("//"));
//IDatasetName dsName = pFCName2 as IDatasetName;
//dsName.Name = "Clip_result";
//dsName.WorkspaceName = wsName;
//IFeatureClass outputFClass = null;
//IBasicGeoprocessor bg = new BasicGeoprocessorClass();
//outputFClass = bg.Clip(inputTable, false, clipTable, false, tolerance, pFCName);
//不知错在何处
createShapeFile(outputFClass);
不知怎么保存到shp文件
用pFClass测试,先创建shp文件,然后填入,也不行
createShapeFile(pFClass);
//IFeatureLayer pInFLayer = new FeatureLayerClass();
//pInFLayer.FeatureClass = pFClass;
ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip(pInFLayer, fLayer, @tbOutputFeatures.Text.Trim());
ESRI.ArcGIS.AnalysisTools.Clip clipTool = new ESRI.ArcGIS.AnalysisTools.Clip(inputfeatureclass, clipfeatureclass, outfeatureclass);
IDataset dataset = pFClass as IDataset;
IWorkspace workspace = dataset.Workspace;
IFeatureWorkspace fworkspace = workspace as IFeatureWorkspace;
//string outputShpFile = "D://gis//Clip_result.shp";
//if (File.Exists(outputShpFile) == true)
// File.Delete(outputShpFile);
//IWorkspaceFactory pWFactory = new ShapefileWorkspaceFactoryClass();
//IFeatureWorkspace pFWorkspace = pWFactory.OpenFromFile("D://gis", 0) as IFeatureWorkspace;
//IFields outfields = pFClass.Fields;
//IFeatureClass outfeatureclass = pFWorkspace.CreateFeatureClass("Clip_result", outfields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
//IWorkspace workspace = pFWorkspace as IWorkspace;
//IWorkspaceEdit workspaceEdit;
//workspaceEdit = (IWorkspaceEdit)workspace;
//workspaceEdit.StartEditing(true);
//workspaceEdit.StartEditOperation();
Geoprocessor GP = new Geoprocessor();
GP.OverwriteOutput = true;
//IWorkspaceFactory wf = new WorkspaceFactoryClass();
//ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip(pFClass, clipFClass, outfeatureclass);
ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip();
clip.clip_features = clipFClass;
//clip.out_feature_class = @"D://gis//try";
string a;
clip.out_feature_class=tbOutputFeatures.Text.Trim();
clip.in_features = pFClass;
GP.Execute(clip, null);
string ms = "";
if (GP.MessageCount > 0)
{
for (int Count = 0; Count <= GP.MessageCount - 1; Count++)
{
ms += GP.GetMessage(Count);
}
}
IFeatureClass outFClass= Utility.OpenFeatureClassFromShapefile(tbOutputFeatures.Text.Trim());
IFeatureLayer outLayer = new FeatureLayerClass();
outLayer.FeatureClass = outFClass;
outLayer.Name = outFClass.AliasName;
mapCtrl.Map.AddLayer(outLayer);
//MessageBoxEx.Show(ms);
//IFeatureLayer outlayer = new FeatureLayerClass();
//outlayer.FeatureClass = clip.out_feature_class as IFeatureClass;
//outlayer.Name = clip.out_feature_class.ToString();
将裁剪输出的加载到当前Mapcontrol上
//mapCtrl.Map.AddLayer((ILayer)outlayer);
//workspaceEdit.StopEditOperation();
//workspaceEdit.StopEditing(true);
//IFeatureClass resultFClass = outfeatureclass;
//IFeatureClass fc = resultFClass;
//IWorkspace outWorkspace = pFWorkspace as IWorkspace;
//IDataset inDataSet = fc as IDataset;
//IFeatureClassName inFCName = inDataSet.FullName as IFeatureClassName;
//IWorkspace inWorkspace = inDataSet.Workspace;
//IDataset outDataSet = outWorkspace as IDataset;
//IWorkspaceName outWorkspaceName = outDataSet.FullName as IWorkspaceName;
//IFeatureClassName outFCName = new FeatureClassNameClass();
//IDatasetName dataSetName = outFCName as IDatasetName;
//dataSetName.WorkspaceName = outWorkspaceName;
//dataSetName.Name = fc.AliasName.ToString();
//IFieldChecker fieldChecker = new FieldCheckerClass();
//fieldChecker.InputWorkspace = inWorkspace;
//fieldChecker.ValidateWorkspace = outWorkspace;
//IFields fields = fc.Fields;
//IFields outFields = null;
//IEnumFieldError enumFieldError = null;
//fieldChecker.Validate(fields, out enumFieldError, out outFields);
//IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
//featureDataConverter.ConvertFeatureClass(inFCName, null, null, outFCName, null, outFields, "", 100, 0);
创建shap文件的字段,但不知怎么将数据存入
//private void createShapeFile(IFeatureClass pFClass)
//{
// if (pFClass == null) return;
// //string shapeFieldName = "shape";
// string outputShapeFile = tbOutputFeatures.Text.Trim();
// string outDir = outputShapeFile.Substring(0, outputShapeFile.LastIndexOf("//"));
// string name = outputShapeFile.Substring(outputShapeFile.LastIndexOf("//") + 1);
// string outName = name.Substring(0, name.LastIndexOf("."));
// if (File.Exists(outputShapeFile) == true)
// {
// if (MessageBoxEx.Show("所选目录已存在同名文件,覆盖该文件?") == DialogResult.OK)
// {
// File.Delete(outputShapeFile);
// }
// else return;
// }
// string shapeFieldName = "shape";
// try
// {
// IFeatureWorkspace pFWS = null;
// IWorkspaceFactory pWorkspaceFactory = null;
// pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
// pFWS = pWorkspaceFactory.OpenFromFile(outDir, 0) as IFeatureWorkspace;
// IFields pFields = pFClass.Fields;
// IFeatureClass pFeatClass = null;
// pFeatClass = pFWS.CreateFeatureClass(name, pFields, null, null, esriFeatureType.esriFTSimple, shapeFieldName, "");
// }
// catch (Exception ex)
// {
// RuntimeInfo.Logger.Error("存入Shape文件出错!" + ex);
// }
//}
//public void ConvertFeatureClassToShapefile(IFeatureClass pFClass)
//{
// try
// {
// if (pFClass == null) return;
// //string shapeFieldName = "shape";
// string outputShapeFile = tbOutputFeatures.Text.Trim();
// string outDir = outputShapeFile.Substring(0, outputShapeFile.LastIndexOf("//"));
// string name = outputShapeFile.Substring(outputShapeFile.LastIndexOf("//") + 1);
// string outName = name.Substring(0, name.LastIndexOf("."));
// if (File.Exists(outputShapeFile) == true)
// {
// if (MessageBoxEx.Show("所选目录已存在同名文件,覆盖该文件?") == DialogResult.OK)
// {
// File.Delete(outputShapeFile);
// }
// else return;
// }
// IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
// IWorkspace targetWorkspace = pWorkspaceFactory.OpenFromFile(outDir, 0);
// IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
// sourceFeatureClassName.FeatureType = esriFeatureType.esriFTSimple;
// sourceFeatureClassName.ShapeFieldName = "Shape";
// sourceFeatureClassName.ShapeType = pFClass.ShapeType;
// IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
// IName targetWorkspaceDatasetName = targetWorkspaceDataset.FullName;
// IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDatasetName;
// IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
// IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
// targetDatasetName.Name = "AtlantaStreets";
// targetDatasetName.WorkspaceName = targetWorkspaceName;
// IFeatureClass sourceFeatureClass = pFClass;
// IFields sourceFields = sourceFeatureClass.Fields;
// IFields targetFields = null;
// IEnumFieldError enumFieldError = null;
// IFeatureDataset ftDataset = pFClass.FeatureDataset;
// IWorkspace sourceWorkspace= ftDataset.Workspace;
// IFieldChecker fieldChecker = new FieldCheckerClass();
// fieldChecker.InputWorkspace = sourceWorkspace;
// fieldChecker.ValidateWorkspace = targetWorkspace;
// fieldChecker.Validate(sourceFields, out enumFieldError, out targetFields);
// String shapeFieldName = sourceFeatureClass.ShapeFieldName;
// int shapeFieldIndex = sourceFeatureClass.FindField(shapeFieldName);
// IField shapeField = sourceFields.get_Field(shapeFieldIndex);
// IGeometryDef geometryDef = shapeField.GeometryDef;
// IClone geometryDefClone = (IClone)geometryDef;
// IClone targetGeometryDefClone = geometryDefClone.Clone();
// IGeometryDef targetGeometryDef = (IGeometryDef)targetGeometryDefClone;
// IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
// IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass(sourceFeatureClassName, null, null, targetFeatureClassName, targetGeometryDef, targetFields, "", 1000, 0);
// enumInvalidObject.Reset();
// }
// catch (Exception ex)
// {
// RuntimeInfo.Logger.Error("" + ex);
// }
//}
}
}