//选择
using Carto,Geodatabase
IMap.Feature,SelectionCount,ClearSelection();
ISeclecton.Clear()
IEnumFeature.Next()
IFeatureSelection.SelectionSet;得到SelectionSet
SelectionSet.Count;,Search();得到ICursor
ICursor as IFeatureCursor; IFeatureCursor.NextFeature();
//查询
QueryFilter:WhereClause,SubFields
ICursor::NextFeature()
QueryDef:Tables,Evaluate()返回结果集的ICursor可以基于行遍历
IFeatureLayer.Search()获得IFeatureCursor用于遍历
IFeatureLayer的IFeatureSelection.SelectFeatures(),SelectionSet//只有IFeatureSelection会高亮显示
//2拉框选择
方法一
MapControl.TrackRectange绘制矩形,矩形为空时,则将鼠标点击点向外拓展为矩形作为选择区域
IMap.SelectByShape方法选择要素
方法二
ICommand pCommand = new ControlsSelectFeaturesToolClass();
ITool pTool = pCommand as ITool;
pCommand.OnCreate(this.axMapControl1.Object);
this.axMapControl1.CurrentTool = pTool;
IEnvelope pEnv = mainMapControl.TrackRectangle();
IGeometry pGeo = pEnv as IGeometry;
//矩形框若为空,即为点选时,对点范围进行扩展
if (pEnv.IsEmpty == true)
{
tagRECT r;
r.left = e.x - 5;
r.top = e.y - 5;
r.right = e.x + 5;
r.bottom = e.y + 5;
pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);
pEnv.SpatialReference = pActiveView.FocusMap.SpatialReference;
}
pGeo = pEnv as IGeometry;
mainMapControl.Map.SelectByShape(pGeo, null, false);
mainMapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
//2通过地图中第一个图形选择
private void ToolStripMenuItemQueryByGraphics_Click(object sender, EventArgs e)
{
try
{
//首先清空地图选择集,以进行后续的选择操作
axMapControl.Map.FeatureSelection.Clear();
//使用IGraphicsContainer接口获取地图中的各个图形(Graphics),矩形,圆形,多边形等等Graphics
IGraphicsContainer graphicsContainer = axMapControl.Map as IGraphicsContainer;
//重置访问图形的游标,使IGraphicsContainer接口的Next()方法定位于地图中的第一个图形
graphicsContainer.Reset();
//使用IElement接口操作所获取第一个图形
IElement element = graphicsContainer.Next();
//获取图形的几何信息
IGeometry geometry = element.Geometry;
//使用第一个图形的几何形状来选择地图中的要素。
axMapControl.Map.SelectByShape(geometry, null, false);
//进行部分刷新以显示最新的选择集
axMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, axMapControl.ActiveView.Extent);
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}
}
//3缩放至选择
//ICommand pCommand = new ESRI.ArcGIS.Controls.ControlsZoomToSelectedCommandClass();
//pCommand.OnCreate(mainMapControl.Object);
//pCommand.OnClick();
private void btnZoomToSel_Click(object sender, EventArgs e)
{
int nSlection = mainMapControl.Map.SelectionCount;
if (nSlection == 0)
{
MessageBox.Show("请先选择要素!", "提示");
}
else
{
ISelection selection = mainMapControl.Map.FeatureSelection;
IEnumFeature enumFeature = (IEnumFeature) selection;
enumFeature.Reset();
IEnvelope pEnvelope = new EnvelopeClass();
IFeature pFeature = enumFeature.Next();
while (pFeature != null)
{
pEnvelope.Union(pFeature.Extent);
pFeature = enumFeature.Next();
}
pEnvelope.Expand(1.1, 1.1, true);
mainMapControl.ActiveView.Extent = pEnvelope;
mainMapControl.ActiveView.Refresh();
}
}
//4添加要素
//获得点
MapControl的OnMouseDown里面写:
IPoint point=new PointClass();
point.PutCoords(e.mapX,e.mapY);//把在地图上点击的点存下来;
//获得指定图层
//遍历判断图层名,map.get_Layer(i).Name,直到得到要添加要素的图层
//获得新的空的要素(row)
IFeatureLayer featureLayer=layer as IFeatureLayer;
IFeatureClass featureClass=featureLayer.FeatureClass;
IFeature pFeature = featureClass.CreateFeature();
//把点赋给新的空的要素(row)
pFeature = pFeatCls.CreateFeature();
pFeature.set_Value(pFeature.Fields.FindField("Name"),"新增点");//增加属性index,value
pFeature.Shape =Point;
pFeature.Store();
Map as ActiveView
ActiveView.Refresh();
//5添加标注
IFeatureClass.Search(null,true)获得IFeatureCursor.NextFeature();获得要素
IFeature.get_Value()获取属性值,并赋给ITextElement.Text
将ITextElement添加到Map
private void 显示北京各区县名称ToolStripMenuItem_Click(object sender, EventArgs e)
{
IFeatureCursor pFCursor = p北京区县界要素图层.Search(null, false);
IFeature pF = pFCursor.NextFeature();
int index = pF.Fields.FindField("NAME");
while (pF != null)
{
ITextElement pTE = new TextElementClass();
pTE.Text = pF.get_Value(index).ToString();
IElement pEle = pTE as IElement;
pEle.Geometry = pF.Extent;
pGraphicsContainer.AddElement(pEle, 0);
pF = pFCursor.NextFeature();
}
pActiveView.Refresh();
}
//批量添加XY数据
“添加XY数据”工具
“创建XY事件图层”工具
GP工具(MakeXYEventLayer)将某个 x,y 坐标表添加到地图 中。
Excel表的表头最好字段放至第一行,否则会报错。
//实现思路:
第一步:读取Excel数据表,提取表名、X字段、Y字段
第二步:实例化数据管理工具MakeXYEventLayer
第三步:实例化Geoprocessor,并执行数据管理工具MakeXYEventLayer
第四步:使用复制要素工具将此事件图层导出为磁盘上的要素类
第五步:加载要素至图层中
//添加XY事件
MakeXYEventLayer MxyLayer = new MakeXYEventLayer(tablepath, x, y, out_layer);// 参数都是string
string tempPath = GetAppDirectory() + "TempData\\Temp.gdb\\";//要素临时存储路径
featureClass = ConvertExcelToFeatureClass(MxyLayer, tempPath);
private IFeatureClass ConvertExcelToFeatureClass(MakeXYEventLayer xyEventLayer, string out_Layer_Path)
{
try
{
Geoprocessor GP = new Geoprocessor();
GP.OverwriteOutput = true;
GP.Execute(xyEventLayer, null);//执行XY事件
//复制要素
ESRI.ArcGIS.DataManagementTools.CopyFeatures cf = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();
cf.in_features = xyEventLayer.out_layer;
cf.out_feature_class = out_Layer_Path + xyEventLayer.out_layer;
IGeoProcessorResult gpResult = GP.Execute(cf, null) as IGeoProcessorResult;
IFeatureClass _featureClass;
IQueryFilter qf;//查询过滤
IGPUtilities gpUtils = new GPUtilitiesClass();
gpUtils.DecodeFeatureLayer(gpResult.GetOutput(0), out _featureClass, out qf);
IFeatureCursor cursor = featureClass.Insert(true);
return _featureClass;
}
catch (Exception ex)
{
MessageBox.Show("导入要素失败,原因:" + ex.ToString());
return null;
}
}
//7获取图层全部要素为列表
#region 获取图层全部要素列表
/// <summary>
/// 获取图层全部要素
/// </summary>
/// <param name="pFeatureLayer"></param>
/// <returns></returns>
public static List<IFeature> GetAllFeature(IFeatureLayer pFeatureLayer)
{
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
List<IFeature> featureList = new List<IFeature>();
while (pFeature != null)
{
featureList.Add(pFeature);
pFeature = pFeatureCursor.NextFeature();
}
//释放游标
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
return featureList;
}
#endregion
//8高效复制要素
public void LoadOnlyModeInsert(IFeatureClass sourceFeatureClass, IFeatureClass targetFeatureClass)
{
IFeatureClassLoad featureClassLoad = (IFeatureClassLoad)targetFeatureClass;
ISchemaLock schemaLock = (ISchemaLock)targetFeatureClass;
try
{
/**/
schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
featureClassLoad.LoadOnlyMode = true;
/**/
using (ComReleaser comReleaser = new ComReleaser())
{
IFeatureBuffer featureBuffer = targetFeatureClass.CreateFeatureBuffer();
comReleaser.ManageLifetime(featureBuffer);
IFeatureCursor insertCursor = targetFeatureClass.Insert(true);
comReleaser.ManageLifetime(insertCursor);
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = queryClause;
IFeatureCursor cursor = sourceFeatureClass.Search(queryFilter, true);
IFeature sourceFeature = cursor.NextFeature();
while (sourceFeature != null)
{
//如果是线或面要素类需要执行下Simplify,这里用的点要素类,不做验证了
featureBuffer.Shape = sourceFeature.ShapeCopy;
for (int i = 0; i < sourceFeature.Fields.FieldCount; i++)
{
IField field = sourceFeature.Fields.get_Field(i);
if (field.Type != esriFieldType.esriFieldTypeOID && field.Type != esriFieldType.esriFieldTypeGeometry && field.Type != esriFieldType.esriFieldTypeGlobalID && field.Type != esriFieldType.esriFieldTypeGUID)
{
string fieldName = field.Name;
int index = featureBuffer.Fields.FindField(fieldName);
if (index > -1 && fieldName != "Shape_Length" && fieldName != "Shape_Area")
featureBuffer.set_Value(index, sourceFeature.get_Value(i));
}
}
insertCursor.InsertFeature(featureBuffer);
sourceFeature = cursor.NextFeature();
}
insertCursor.Flush();
ComReleaser.ReleaseCOMObject(cursor);
IFeatureClassManage targetFeatureClassManage = targetFeatureClass as IFeatureClassManage;
targetFeatureClassManage.UpdateExtent();
}
}
catch (Exception)
{
MessageBox.Show("无法获取该要素类的排它锁,检查ArcMap是否打开了该要素类,建议关闭!");
}
finally
{
/**/
featureClassLoad.LoadOnlyMode = false;
schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
/**/
}
}
//3.1复制要素工具
IVariantArray parameters = new VarArrayClass();
parameters.Add("roads");
parameters.Add("roads_copy");
gp.Execute("CopyFeatures_management", parameters, null);
//3按条件输出要素为新图层
以下代码示例显示如何访问由“制作要素图层”工具创建的输出图层中的要素。
// Intialize the geoprocessor.
Geoprocessor GP = new Geoprocessor();
// Intialize the MakeFeatureLayer tool.
MakeFeatureLayer makefeaturelayer = new MakeFeatureLayer();
// Set up the GP tool parameters and run the tool.
makefeaturelayer.in_features = @"C:\gp\nfld.gdb\wells";
makefeaturelayer.out_layer = "Wells_Lyr";
makefeaturelayer.where_clause = "WELL_YIELD > 150";
IGeoProcessorResult result = (IGeoProcessorResult)GP.Execute(makefeaturelayer, null);
//IGeoprocessorResult2用于获取已执行工具的返回值。
IFeatureClass fc;
IQueryFilter qf;
IGPUtilities gpUtils = new GPUtilitiesClass();
gpUtils.DecodeFeatureLayer(result.GetOutput(0), out fc, out qf);
//本示例使用IGPUtilities3 的 DecodeFeatureLayer方法返回由给定地理处理值对象指定的要素类和查询过滤器。
IFeatureCursor cursor = fc.Insert(true);