Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在多边形ArcGIS中计算和选择点?_C#_Arcgis - Fatal编程技术网

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'设置为点图层的名称。