在网上查找了许多参考代码,梳理后实现想要的功能,在此做一个记录。
具体代码如下:
首先为了方便查找所需图层,获取图层的编号
//获取图层编号
private int Layer_Count(string name)
{
int Count = 0;
mainfrm.axMapControl1.Map.ClearSelection();//清除地图的选择
int pLayerCount = mainfrm.axMapControl1.LayerCount;
string str = "";
for (int i = 0; i < pLayerCount; i++)
{
str = mainfrm.axMapControl1.Map.get_Layer(i).Name;
if (str == name)
{
Count = i;
}
}
return Count;
}
//两个线要素遍历,求交点点集
{
int count = 0;
ILayer inputLayer1 = mainfrm.axMapControl1.Map.get_Layer(Layer_Count(Name));
IFeatureLayer inputFeatureLyr1 = inputLayer1 as IFeatureLayer;//将ILayer转换为IFeaturelayer,为了对图层上的要素进行编辑
IFeatureClass inputFtClass1 = inputFeatureLyr1.FeatureClass;
IWorkspaceEdit w1 = (inputFtClass1 as IDataset).Workspace as IWorkspaceEdit;//定义一个工作编辑工作空间,用于开启前图层的编辑状态
IFeatureCursor inputFeatureCursor = inputFeatureLyr1.Search(null, true);
IFeature pFeature1 = inputFeatureCursor.NextFeature();
while (pFeature1 != null)
{
ITopologicalOperator pTopological = (pFeature1.Shape) as ITopologicalOperator;
ILayer inputLayer2 = mainfrm.axMapControl1.Map.get_Layer(Layer_Count(name));
IFeatureLayer inputFeatureLyr2 = inputLayer2 as IFeatureLayer;//将ILayer转换为IFeaturelayer,为了对图层上的要素进行编辑
IFeatureClass inputFtClass2 = inputFeatureLyr2.FeatureClass;
IFeatureCursor pFeatureCursor2 = inputFtClass2.Search(null, true);
IFeature pFeature2;
pFeature2 = pFeatureCursor2.NextFeature();
//IFields pFields = inputFtClass2.Fields;
for (int i = 0; i < count; i++)
{
pFeature2 = pFeatureCursor2.NextFeature();
}
while (pFeature2 != null)
{
IGeometry pGeoInterscet = pTopological.Intersect(pFeature2.Shape, esriGeometryDimension.esriGeometry0Dimension);
if (!pGeoInterscet.IsEmpty)
{
IPointCollection pColl = pGeoInterscet as IPointCollection;
List<double> Xlist = new List<double>();
for (int i = 0; i < pColl.PointCount; i++)
{
IPoint pPoint = pColl.Point[i];
Create_Point(pPoint);
}
}
pFeature2 = pFeatureCursor2.NextFeature();
}
count++;
pFeature1 = inputFeatureCursor.NextFeature();
this.Hide();
}
}
//获得点集后,创建点要素
private void Create_Point(IPoint pPoint)
{
ILayer outputLayer = mainfrm.axMapControl1.Map.get_Layer(Layer_Count(name));
IFeatureLayer outFeatureLyr = outputLayer as IFeatureLayer;
IFeatureClass outFeatCls = outFeatureLyr.FeatureClass;
IDataset outDataset = outFeatCls as IDataset;
IWorkspace outpWS = outDataset.Workspace;
IWorkspaceEdit outpWorkspaceEdit = outpWS as IWorkspaceEdit;
outpWorkspaceEdit.StartEditing(false);
outpWorkspaceEdit.StartEditOperation();
IFeatureBuffer pfeatureBuffer;
IFeatureCursor pFeatureCuror;
IFeature outpFeature;
pfeatureBuffer = outFeatCls.CreateFeatureBuffer();
pFeatureCuror = outFeatCls.Insert(true);
outpFeature = pfeatureBuffer as IFeature;
IGeometry pPointGeo = pPoint as IGeometry;
outpFeature.Shape = pPointGeo;
pFeatureCuror.InsertFeature(pfeatureBuffer);
outpWorkspaceEdit.StopEditOperation();
outpWorkspaceEdit.StopEditing(true);
mainfrm.axMapControl1.ActiveView.Refresh();
}
//设置点要素保存路径
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Shape文件(*.shp)|*.shp";
saveFileDialog.Title = "保存shp文件";
saveFileDialog.CheckFileExists = false;
DialogResult dialogResult = saveFileDialog.ShowDialog();
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
int index;
string fileName;
string filePath;
string fileFullPath;
if (dialogResult == DialogResult.OK)
{
//保存文件地址
fileFullPath = saveFileDialog.FileName;
index = fileFullPath.LastIndexOf("\\");
fileName = fileFullPath.Substring(index + 1);
filePath = fileFullPath.Substring(0, index);
if (System.IO.File.Exists(saveFileDialog.FileName))//检查文件是否存在
{
if (MessageBox.Show("该文件夹下已经有同名文件,替换原文件?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
IFeatureWorkspace FWS = pWorkspaceFactory.OpenFromFile(filePath, 0) as IFeatureWorkspace;
IFeatureClass pFeatureClass = FWS.OpenFeatureClass(fileName);
IDataset pDataset = pFeatureClass as IDataset;
pDataset.Delete();
}
//System.IO.File.Delete(saveFileDialog.FileName);
else
return;
}
}
else
{
fileFullPath = null;
return;
}