Creating report from selected features in ArcMap using AddIn and C#?

Creating report from selected features in ArcMap using AddIn and C#?

We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

I am new to ArcGIS and I am trying to create an Add-In button which can

  1. figure out which polygons are selected and
  2. query the selected polygons to generate a report on the underlying metadata (similar to the Identify tool).

I had a look at this article, which helped with finding the selected feature layer, but I haven't been able to progress much further.

At the moment all I have is a one-liner. Here is some pseudo code of what I would like to do:

var featureLayer = ArcMap.Document.CurrentContentsView.SelectedItem as IFeatureLayer; var selectedFeatures = featureLayer.SelectedFeatures; // A list to contain the info available in Identify tool (not sure what this is called) var featuresAttributes = new List(); // For each selected polygon foreach(var feature in selectedFeatures) featuresAttributes.Add(feature.Attributes); // Go off and generate some report based on the selected polygon attributes MyReportGenerator.CreateReport(featuresAttributes);

You can use dictionaries for this type of thing. There are more memory efficient ways of doing this (by just storing field names once), but this might get you started.

public void TestGetSelection() { var dict = GetSelection(ArcMap.Document.FocusMap.get_Layer(0) as IFeatureLayer); foreach (KeyValuePair> kvp in dict) { Debug.Print("{0} {1}", kvp.Key, kvp.Value["State_Name"]); } } public static Dictionary> GetSelection(IFeatureLayer fLayer) { // return a dictionary containing one dictionaries for each selected // feature where the contained dictionary is keyed by the field name var dict = new Dictionary>(); ICursor cur = null; try { ((IFeatureSelection)fLayer).SelectionSet.Search(null, false, out cur); IRow row; while ((row = cur.NextRow()) != null) { dict.Add(row.OID, RowToDict(row)); } } catch { throw; } finally { if (cur != null) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cur); } return dict; } public static Dictionary RowToDict(IRow row) { var dict = new Dictionary(StringComparer.InvariantCultureIgnoreCase); for (int i = 0; i < row.Fields.FieldCount; i++) { var fld = row.Fields.get_Field(i); if (row.get_Value(i) is DBNull) { // todo: maybe special treatment of nulls here… } if(fld.Type != esriFieldType.esriFieldTypeGeometry) dict.Add(fld.Name, row.get_Value(i)); } return dict; }

One option would be to use the report writer, create report command (ArcMap Command), see code below:

public void ExecuteCmd2() { try { UID pUID = new UID(); ICommandItem pCmdItem = default(ICommandItem); // Use the GUID of the Save command pUID.Value = "{CDC6F22A-7DD1-490F-8FDE-4357C621BBDF}"; // or you can use the ProgID // pUID.Value = "ESRI.ArcGIS.ReportWriter.CreateReportCommand" pUID.SubType = 3; pCmdItem = m_App.Document.CommandBars.Find(pUID); pCmdItem.Execute(); } catch (Exception ex) { MessageBox.Show("Caught an unspecified error in the calling code: " + System.Environment.NewLine + ex.ToString()); } }

There is an option within one of the dialogs to narrow the report to only selected features. Also, in ArcGIS 10.1 it looks like ESRI may have some reporting functions in python.

Watch the video: ArcGIS Desktop part 25 analyzing feature relationships 4: creating graphs


  1. Janneth

    I apologise, but, in my opinion, you commit an error. Let's discuss it. Write to me in PM, we will communicate.

  2. Zachariah

    Just under the table

  3. Pierson

    I think I get to correct the decision.

  4. Arashir

    I apologize for interfering ... I have a similar situation. I invite you to a discussion.

  5. Slansky

    Your message, simply charm

  6. Titus

    In it something is. Now everything is clear, thank you for the help in this matter.

Write a message