C# 如何在多边形ArcGIS中计算和选择点?
我正在尝试创建一个按钮,用于计算和选择多边形内的所有点C# 如何在多边形ArcGIS中计算和选择点?,c#,arcgis,C#,Arcgis,我正在尝试创建一个按钮,用于计算和选择多边形内的所有点 protected override void OnClick() { IActiveView activeView = ArcMap.Document.ActiveView; IEnumLayer featureClasses = activeView.FocusMap.Layers; if (featureClasses != null){ ILayer layer
protected override void OnClick()
{ IActiveView activeView = ArcMap.Document.ActiveView;
IEnumLayer featureClasses = activeView.FocusMap.Layers;
if (featureClasses != null){
ILayer layer ;
while((layer = featureClasses.Next()) != null){
if (layer as IFeatureLayer == null)
continue;
if (layer.Name == "EX_BOUNDARY")//Name of polygon layer.{
var ftrLayer = layer as IFeatureLayer;
var ftrClass = ftrLayer.FeatureClass;
if (ftrClass == null)
continue;
GetSelectedPolygon(activeView, ftrClass, layer);
}
}
}
}
方法获取选定多边形,选择并计算其中的点
public void GetSelectedPolygon(IActiveView activeView, IFeatureClass featureClass, ILayer a)
{
//Check that the selected geometry is a polygon.
IMap map = activeView.FocusMap;
var selectedFeatures1 = (IEnumFeature)map.FeatureSelection;
IFeature selectedFeature = selectedFeatures1.Next();
IGeometry selectedGeometry = selectedFeature.ShapeCopy;
if (selectedGeometry != null && selectedGeometry.GeometryType == esriGeometryType.esriGeometryPolygon)
{
//execute query for all points inside polygon.
ISpatialFilter spatialFilter = new SpatialFilterClass();
spatialFilter.Geometry = selectedGeometry;
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
FeatureCursor featureCursor = null;
var srchResult = featureClass.Search(spatialFilter, false);
featureCursor = (FeatureCursor) featureClass.Search(spatialFilter, false);
//select outcoming queries and their count.
//map.FeatureSelection = srchResult as ISelection;
IFeature singleSearchFeature = null;
while ((singleSearchFeature = srchResult.NextFeature()) != null){
//only looped once.
map.SelectFeature(a,singleSearchFeature);
}
var count = srchResult.Fields.FieldCount;
MessageBox.Show(count.ToString());
}
}
我对整个地理信息系统文化非常陌生,我刚刚开始实际培训。这是我需要完成的主要任务之一,我从概念上理解事物是如何工作的,但这对我来说都是非常新的
我怀疑我用于搜索的查询有问题,因为我所有的尝试都是选择一个多边形,然后单击我的按钮,结果消息框显示4,无论多边形中有多少个点,它也不会选择任何点
请帮忙。谢谢:)“srchResult.Fields.FieldCount”错误。FieldCount是特征字段的数量
您可以使用以下选项:
protected override void OnClick()
{
try
{
IMxDocument document = (IMxDocument)ArcMap.Document;
IMap map = document.FocusMap;
IActiveView activeView = document.ActiveView;
if (map.SelectionCount != 1)
{
MessageBox.Show("Select one polygon.");
return;
}
// Get the polygon for selecting features
IEnumFeature features = (IEnumFeature)map.FeatureSelection;
IFeature feature = features.Next();
IGeometry geometry = feature.ShapeCopy;
if (geometry.GeometryType != esriGeometryType.esriGeometryPolygon)
{
MessageBox.Show("Select one polygon.");
return;
}
// Find layer to select features
UID uid = new UIDClass() { Value = typeof(IFeatureLayer).GUID.ToString("B") };
IEnumLayer layers = map.get_Layers(uid);
string layerName = "Name of your points layer to select";
ILayer layer = null;
IFeatureLayer featureLayer = null;
while ((layer = layers.Next()) != null)
{
if (layer.Name == layerName)
{
featureLayer = (IFeatureLayer)layer;
break;
}
}
map.ClearSelection();
SelectByPolygon(featureLayer, geometry);
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
ISelectionEvents selectionEvents = (ISelectionEvents)map;
selectionEvents.SelectionChanged();
MessageBox.Show(string.Format("Number of selected features is {0}", map.SelectionCount));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// Select features.
/// </summary>
/// <param name="featurelayer">Layers to select features.</param>
/// <param name="polygon">Polygon geometry for select features.</param>
public void SelectByPolygon(IFeatureLayer featurelayer, IGeometry polygon)
{
ISpatialFilter filter = new SpatialFilterClass();
filter.Geometry = polygon;
filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
var featureSelection = (IFeatureSelection)featurelayer;
featureSelection.SelectFeatures(filter, esriSelectionResultEnum.esriSelectionResultNew, false);
featureSelection.SelectionChanged();
}
protectedoverride void OnClick()
{
尝试
{
IMxDocument document=(IMxDocument)ArcMap.document;
IMap map=document.FocusMap;
IActiveView-activeView=document.activeView;
如果(map.SelectionCount!=1)
{
显示(“选择一个多边形”);
返回;
}
//获取用于选择要素的多边形
IEnumFeature features=(IEnumFeature)map.FeatureSelection;
IFeature feature=features.Next();
IGeometry几何=feature.ShapeCopy;
if(geometry.GeometryType!=esriGeometryType.esriGeometryPolygon)
{
显示(“选择一个多边形”);
返回;
}
//查找图层以选择要素
UID=newUIDClass(){Value=typeof(IFeatureLayer).GUID.ToString(“B”)};
IEnumLayer layers=map.get_layers(uid);
string layerName=“要选择的点图层的名称”;
ILayer layer=null;
IFeatureLayer featureLayer=null;
而((layer=layers.Next())!=null)
{
if(layer.Name==layerName)
{
featureLayer=(IFeatureLayer)层;
打破
}
}
map.ClearSelection();
选择多边形(特征层、几何体);
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null,activeView.Extent);
ISelectionEvents selectionEvents=(ISelectionEvents)映射;
selectionEvents.SelectionChanged();
Show(string.Format(“所选功能的数量为{0}”,map.SelectionCount));
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
///
///选择功能。
///
///选择要素的图层。
///选择要素的多边形几何图形。
公共空心SelectByPolygon(IFeatureLayer featurelayer、IGeometry polygon)
{
ISpatialFilter filter=新的空间过滤器类();
几何=多边形;
filter.SpatialRel=esrispatialelenum.esriSpatialRelContains;
变量featureSelection=(IFeatureSelection)featurelayer;
featureSelection.SelectFeatures(过滤器,ESRISelectResultEnum.ESRISelectResultNew,false);
featureSelection.SelectionChanged();
}
所以我应该用我编写的GetSelectedPolygon方法替换它,只需在按钮的onClick()事件中调用它?是的,您可以在onClick事件中编写它。您可以将参数“polygon”的GeometryType检查为ESRigometryType.ESRigometryPolyGon。如果您不理解某些内容,可以询问或查看:我现在就试试,如果我想排除存在的点或与多边形边相交的点,我该怎么办?我尝试了您的代码,但它不起作用,它一直说在我选择的任何多边形中都有2个点:/OnClick事件中将变量'layerName'设置为点图层的名称。