Suite

Créer un rapport à partir d'entités sélectionnées dans ArcMap à l'aide d'AddIn et de C# ?

Créer un rapport à partir d'entités sélectionnées dans ArcMap à l'aide d'AddIn et de C# ?


Je suis nouveau sur ArcGIS et j'essaie de créer un bouton de complément qui peut

  1. déterminer quels polygones sont sélectionnés et
  2. interroger les polygones sélectionnés pour générer un rapport sur les métadonnées sous-jacentes (similaire au Identifier outil).

J'ai jeté un œil à cet article, qui m'a aidé à trouver la couche d'entités sélectionnée, mais je n'ai pas pu progresser beaucoup plus loin.

Pour le moment, je n'ai qu'une seule ligne. Voici un pseudo code de ce que je voudrais faire :

var featureLayer = ArcMap.Document.CurrentContentsView.SelectedItem as IFeatureLayer; var selectedFeatures = featureLayer.SelectedFeatures; // Une liste contenant les informations disponibles dans l'outil d'identification (je ne sais pas comment cela s'appelle) var featuresAttributes = new List(); // Pour chaque polygone sélectionné foreach(var feature in selectedFeatures) featuresAttributes.Add(feature.Attributes); // Partez et générez un rapport basé sur les attributs de polygone sélectionnés MyReportGenerator.CreateReport(featuresAttributes);

Vous pouvez utiliser des dictionnaires pour ce genre de choses. Il existe des moyens plus efficaces en termes de mémoire (en ne stockant qu'une seule fois les noms de champ), mais cela peut vous aider à démarrer.

public void TestGetSelection() { var dict = GetSelection(ArcMap.Document.FocusMap.get_Layer(0) as IFeatureLayer); foreach (KeyValuePair> kvp dans dict) { Debug.Print("{0} {1}", kvp.Key, kvp.Value["State_Name"]); } } Dictionnaire statique public> GetSelection(IFeatureLayer fLayer) { // renvoie un dictionnaire contenant un dictionnaire pour chaque // fonctionnalité sélectionnée où le dictionnaire contenu est saisi par le nom de champ var dict = new Dictionary>(); ICursor cur = null; try { ((IFeatureSelection)fLayer).SelectionSet.Search(null, false, out cur); IRangée ; while ((row = cur.NextRow()) != null) { dict.Add(row.OID, RowToDict(row)); } } catch { lancer; } finally { if (cur != null) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cur); } retour dict; } dictionnaire statique public RowToDict(IRow row) { var dict = new Dictionnaire(StringComparer.InvariantCultureIgnoreCase); for (int i = 0; i < row.Fields.FieldCount; i++) { var fld = row.Fields.get_Field(i); if (row.get_Value(i) est DBNull) { // todo: peut-être un traitement spécial des nulls ici… } if(fld.Type != esriFieldType.esriFieldTypeGeometry) dict.Add(fld.Name, row.get_Value(i)) ; } retour dict; }

Une option serait d'utiliser le rédacteur de rapport, la commande de création de rapport (commande ArcMap), voir le code ci-dessous :

public void ExecuteCmd2() { try { UID pUID = new UID(); ICommandItem pCmdItem = default(ICommandItem); // Utilisez le GUID de la commande Save pUID.Value = "{CDC6F22A-7DD1-490F-8FDE-4357C621BBDF}"; // ou vous pouvez utiliser le ProgID // pUID.Value = "ESRI.ArcGIS.ReportWriter.CreateReportCommand" pUID.SubType = 3; pCmdItem = m_App.Document.CommandBars.Find(pUID); pCmdItem.Execute(); } catch (Exception ex) { MessageBox.Show("A intercepté une erreur non spécifiée dans le code appelant : " + System.Environment.NewLine + ex.ToString()); } }

Il existe une option dans l'une des boîtes de dialogue pour restreindre le rapport aux entités sélectionnées uniquement. De plus, dans ArcGIS 10.1, il semble qu'ESRI puisse avoir des fonctions de création de rapports en python.

http://forums.arcgis.com/threads/42876-Creating-Report-with-Python-in-ArcGIS-10


Voir la vidéo: ArcGIS - Converting a geodatabase to shapefiles