Un modulo è un file di Python che normalmente include diverse funzioni e classi. Arcpy è supportato da diversi moduli tra i quali un modulo per il mapping (arcpy.mapping), uno per l'analisi spaziale (arcpy.sa) ed un altro per l'analisi geostatistica (arcpy.ga).
Qui potete trovare l'elenco delle classi e delle funzioni in arcpy.
ArcPy fornisce l'accesso agli strumenti di geoprocessing così come alle funzioni, classi e moduli che consentono di creare semplici e complessi flussi di lavoro velocemente e facilmente.
ArcPy sfrutta l'accesso a numerosi moduli di Python sviluppati da professionisti e programmatori GIS di differenti discipline. Inoltre il vantaggio di utilizzare ArcPy con Python è che quest'ultimo è un linguaggio di programmazione general purpose, facile da imparare ed utilizzare. Esso è interpretato anche se, al dir il vero, il compilatore Python trasforma il codice sorgente in un codice intermedio (bytecode), una sorta di "codice-macchina" per una macchina virtuale ottimizzata apposta per eseguire programmi Python; l'interprete Python vero e proprio é una implementazione in software di questa macchina virtuale: pertanto, se tecnicamente è un linguaggio interpretato, questo risulta molto veloce. Inoltre Python è a tipizzazione dinamica, che fornisce agevolmente la possibilità di creare prototipi velocemente e script di test in un ambiente interattivo, mentre è ancora abbastanza potente da supportare la creazione di applicazioni complesse .
ArcPy è organizzato in strumenti, funzioni, classi, e moduli.
Tecnicamente parlando, gli strumenti di geoprocessing sono funzioni disponibili da arcpy, e pertanto sono accessibili come le altre funzioni di Python. Occorre però, per evitare di fare confusione, fare una distinzione tra gli strumenti e le funzioni non-strumenti (come, ad esempio, una funzione di utility: ListFeatureClasses()).
- Gli strumenti sono documentati in modo differente dalle funzioni. Ogni strumento ha la sua propria pagina di riferimento nell' help di sistema di ArcGIS Desktop. Le funzioni sono documentate nella documentazione di ArcPy.
- Gli strumenti restituiscono un risultato object; le funzioni no.
- Gli strumenti generano messaggi, accessibili attraverso diverse funzioni tipo GetMessages(). Le funzioni non generano messaggi.
- Gli strumenti sono licenziati per livello di prodotto (ArcView, ArcEditor, e ArcInfo) e per livello di estensione (Network Analyst, Spatial Analyst, e così via). E' possibile trovare quale livello di licenza è richiesto nella pagina di riferimento degli strumenti. Le funzioni non sono licenziate ma installate con ArcPy.
Ma dove scriviamo il nostro codice Python?
In ArcGIS abbiamo la Python Window dove possiamo esercitarci ed eseguire le nostre istruzioni. Oppure possiamo utilizzare un IDE come ad esempio PythonWin (che potete trovare nel dvd di installazione e che non viene installato automaticamente da ArcGIS).
Tra gli IDE commerciali quello che vi consiglio è Wing IDE mentre tra quelli freeware PyScripter
In questo link potete scaricare un pdf e una serie di esercizi per imparare ad utilizzare Python in ArcGIS.
Per gli sviluppatori ArcGIS Server: in questo link potete vedere degli esempi di utilizzo di arcpy con servizi di geoprocessing. In questo caso possiamo utilizzare una più semplice e rapida alternativa alla creazione di SOE per ArcGIS Server.
Vediamo un semplice esempio di codice arcpy richiamato da c#. In questo caso creiamo un tool che verifica se un mxd è adatto ad essere publicato in ArcGIS Server
Creiamo una toolbox in ArcMap
Aggiungiamo lo script python che utilizza arcpy
Indichiamo nome e label al tool. Selezioniamo la voce 'Store relative path names' che ci permette di poter spostare la nostra toolbox senza avere problemi di percorsi.
In questo caso abbiamo un solo parametro, richiesto e di input. E' il map document da analizzare. Come data type possiamo indicare ArcMap Document così, se dovessimo utilizzarlo come tool direttamente in ArcGIS in automatico, avremmo un button che sfoglia file di tipo map document automaticamente.
In questa sezione è possibile scrivere codice python per poter fare validazioni sui controlli creati automaticamente nella maschera da ArcGIS quando si crea un tool.
Qui potete vedere l'help a riguardo.
Testiamo il tool in ArcMap
In questo caso abbiamo selezionato un documento di mappa con un layer non supportato per la pubblicazione. Vediamo il messaggio: Layer type is not supported Layer: streets
Questo è il nostro script python che utilizza il tool.
e questo è un esempio di come chiamare il tool in c#
namespace Studioat.Samples { using System; using System.Collections.Generic; using System.Linq; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geoprocessing; using ESRI.ArcGIS.Geoprocessor; class Program { private static LicenseInitializer m_AOLicenseInitializer = new LicenseInitializer(); [STAThread()] static void Main(string[] args) { //ESRI License Initializer generated code. m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeArcEditor }, new esriLicenseExtensionCode[] { }); Geoprocessor gp = new Geoprocessor(); gp.AddToolbox(@"J:\ArcpyTest\Tools\ToolAGS.tbx"); IVariantArray parameters = new VarArrayClass(); parameters.Add(@"J:\ArcpyTest\Test.mxd"); string messageAnalyzeMSD; ExecuteTask(gp, parameters, "AnalyzeMSD", out messageAnalyzeMSD); m_AOLicenseInitializer.ShutdownApplication(); } /// <summary> /// esecuzione task /// </summary> /// <param name="gp">oggetto geoprocessor</param> /// <param name="parameters">lista parametri</param> /// <param name="nameTask">nome task</param> /// <param name="message">eventuale messagio se il task fallisce</param> /// <returns>restituisce true se il task ha generato errori</returns> public static bool ExecuteTask(Geoprocessor gp, IVariantArray parameters, string nameTask, out string message) { bool result = false; message = null; try { IGeoProcessorResult2 geoProcessorResult2 = gp.Execute(nameTask, parameters, null) as IGeoProcessorResult2; IGPMessages msgs = geoProcessorResult2.GetResultMessages(); IList<string> messageErrors = new List<string>(); for (int i = 0; i < msgs.Count; i++) { if ((msgs.GetMessage(i).IsInformational()) && (msgs.GetMessage(i).Description.StartsWith("Errore: "))) { messageErrors.Add(msgs.GetMessage(i).Description); } } if (messageErrors.Count > 0) { string errors = string.Join(Environment.NewLine, messageErrors.ToArray()); message = errors; return result; } return true; } catch { message = string.Format("Operazione annullata: errore nell'esecuzione del task '{0}'!", nameTask); return result; } } } }