{"id":7889,"date":"2020-04-16T12:34:16","date_gmt":"2020-04-16T10:34:16","guid":{"rendered":"https:\/\/gis.oneteam.it\/?p=7889"},"modified":"2020-04-16T12:34:16","modified_gmt":"2020-04-16T10:34:16","slug":"scrivere-e-utilizzare-script-in-arcgis-pro","status":"publish","type":"post","link":"https:\/\/gis.oneteam.it\/index.php\/2020\/04\/16\/scrivere-e-utilizzare-script-in-arcgis-pro\/","title":{"rendered":"Scrivere e Utilizzare Script in ArcGIS Pro"},"content":{"rendered":"<p>ArcGIS Pro consente di customizzare la toolbox con script esterni scritti in linguaggio Python. Questo processo consente di espandere le funzionalit\u00e0 a piacere dell&#8217;utente, rendendolo particolarmente efficiente per operazioni che richiedono molti passaggi e\/o schedulate nel tempo. A differenza di ArcGIS Desktop, la versione PRO utilizza la release di Python 3 e il modulo affidato a tutte le funzioni di ArcGIS \u00e8 denominato <em>arcpy.<\/em><\/p>\n<h2><strong>Importare script esterni<\/strong><\/h2>\n<p>Per importare script python bisogna prima creare una propria toolbox. Per fare questo \u00e8 sufficiente accedere alla Ribbon Tab <em>&#8220;Insert&#8221; <\/em>e dalla Dialog Box <em>&#8220;Project&#8221; <\/em>selezionare Toolbox -&gt; New Toolbox<\/p>\n<p><a href=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7918\" src=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine1.jpg\" alt=\"\" width=\"357\" height=\"192\" srcset=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine1.jpg 513w, https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine1-300x161.jpg 300w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><\/a><\/p>\n<p>In alternativa si pu\u00f2 accedere al Panes <em>&#8220;Catalog&#8221;<\/em> e clickando con il tasto destro su <em>Toolboxes <\/em>si pu\u00f2 creare una nuova toolbox oppure aggiungere quella appena creata.<\/p>\n<p><a href=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7919\" src=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine2.jpg\" alt=\"\" width=\"357\" height=\"204\" srcset=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine2.jpg 583w, https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/Immagine2-300x171.jpg 300w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><\/a><\/p>\n<p>Una volta creata la nostra toolbox potremo andare a popolarla con script esterni clickando con il tasto destro <em>New -&gt; Script<\/em>. Dalla finestra che si apre dovremo solamente inserire il nome che vogliamo dare alla funzione e puntare al file dove \u00e8 salvato lo script.<br \/>\nIn questo articolo analizziamo la casistica pi\u00f9 semplice ovvero dove non ci sono parametri esterni.<\/p>\n<h2>Lo Script<\/h2>\n<p>Lo script che andremo ad analizzare serve per ordinare la gerarchia dei layer cercando di minimizzare la possibilit\u00e0 che una feature pi\u00f9 grande nasconda una pi\u00f9 piccola. Seguendo questa logica andremo a posizionare prima le feature puntiformi, in seguito quelle lineari e per finire i poligoni. Qualora siano presenti pi\u00f9 layer della stessa geometria verr\u00e0 considerata la sua numerosit\u00e0\/lunghezza\/area (in base alla geometria point\/line\/polygon) e ordinata a sua volta in modo crescente.<\/p>\n<p><a href=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/ezgif.com-video-to-gif-1.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7908\" src=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2020\/02\/ezgif.com-video-to-gif-1.gif\" alt=\"\" width=\"600\" height=\"338\" \/><\/a><\/p>\n<p>Le prime righe di uno script sono adibite all&#8217;importazione dei moduli che si andranno ad utilizzare. I moduli sono librerie di funzioni utili per non dover riscrivere spesso operazioni comuni.<\/p>\n<pre class=\"brush: python; collapse: false; title: ; wrap-lines: false; notranslate\" title=\"\">from arcpy import *\r\n# import arcpy\r\nimport pandas as pd<\/pre>\n<p>Consigli:<br \/>\nCon il comando &#8220;from nome_modulo import *&#8221; non sar\u00e0 necessario richiamare il nome del modulo per ogni sua funzione, in caso di import di pi\u00f9 moduli risulta invece pi\u00f9 chiara la sintassi &#8220;import arcpy&#8221; per non avere ambiguit\u00e0 sull&#8217;appartenenza di una funzione al modulo.<br \/>\nCon il comando &#8220;import nome_modulo as sigla&#8221; non sar\u00e0 necessario richiamare per intero il nome del modulo per ogni sua funzione ma sar\u00e0 sufficiente mettere la sigla come prefisso.<\/p>\n<p>A seguire vi sar\u00e0 una sezione dedicata alla creazione di tutte le variabili utili all&#8217;interno dello script. Noi ci appoggeremo a un dataframe pandas (NON \u00e8 un dataframe arcgis) per salvare i valori dei layer e calcolare l&#8217;ordine.<\/p>\n<pre class=\"brush: python; collapse: false; title: ; wrap-lines: false; notranslate\" title=\"\">df = pd.DataFrame(columns=&#x5B;'layer','geom','size'])\r\np = mp.ArcGISProject('CURRENT')\r\nm = p.listMaps()&#x5B;0]<\/pre>\n<p>Ora sar\u00e0 sufficiente scorrere tutti i layer presenti nel progetto, differenziarli in base alla loro geometria e salvare la loro dimensione nel dataframe.<\/p>\n<pre class=\"brush: python; collapse: false; title: ; wrap-lines: false; notranslate\" title=\"\">try:\r\n    for lyr in m.listLayers():\r\n        if (Describe(lyr).shapeType == 'Point') or (Describe(lyr).shapeType == 'Multipoint'):\r\n            dimensione = int(management.GetCount(lyr)&#x5B;0])\r\n            geometria = Describe(lyr).shapeType\r\n            df_length = len(df)\r\n            df.loc&#x5B;df_length] = &#x5B;lyr,geometria,dimensione]\r\n        elif Describe(lyr).shapeType == 'Polyline':\r\n            dimensione = da.SearchCursor(lyr,'Shape_Length')\r\n            somma = 0\r\n            float(somma)\r\n            for row in dimensione:\r\n                somma += row&#x5B;0]\r\n            geometria = Describe(lyr).shapeType\r\n            df_length = len(df)\r\n            df.loc&#x5B;df_length] = &#x5B;lyr,geometria,somma]\r\n        elif Describe(lyr).shapeType == 'Polygon':\r\n            dimensione = da.SearchCursor(lyr,'Shape_Area')\r\n            somma = 0\r\n            float(somma)\r\n            for row in dimensione:\r\n                somma += row&#x5B;0]\r\n            geometria = Describe(lyr).shapeType\r\n            df_length = len(df)\r\n            df.loc&#x5B;df_length] = &#x5B;lyr,geometria,somma]\r\n        elif lyr.isBasemapLayer == True:\r\n            pass\r\n        elif lyr.isRasterLayer == True:\r\n            pass\r\n        else:\r\n            pass\t\t\t\r\nexcept:\r\n    pass<\/pre>\n<p>Attenzione:<br \/>\nPer le geomtrie lineari e poligonali la dimensione \u00e8 data dalla sommatoria della lunghezza\/area di tutti i record.<\/p>\n<p>Nel passo successivo andremo a ordinare i layer nel dataframe inserendo come campo primario la geometria e come campo secondario la dimensione<\/p>\n<pre class=\"brush: python; collapse: false; title: ; wrap-lines: false; notranslate\" title=\"\">df&#x5B;'geom']=pd.Categorical(df&#x5B;'geom'],&#x5B;'Point','Multipoint','Polyline','Polygon'])\r\ndf2 = df.sort_values(&#x5B;&quot;geom&quot;,&quot;size&quot;])\r\ndf2 = df2.reset_index(drop=True)<\/pre>\n<p>Per finire bisogna scorrere la lista dei layer ordinati dall&#8217;ultimo al primo e posizionarli in testa\u00a0al progetto. Ad ogni ciclo viene aggiornata la lista dei layer in quanto ne viene modificato l&#8217;ordine.<\/p>\n<pre class=\"brush: python; collapse: false; title: ; wrap-lines: false; notranslate\" title=\"\">\r\nfor i in range(max(df.index),-1,-1):\r\n\tm.moveLayer(df.loc&#x5B;0,'layer'],df2.loc&#x5B;i,'layer'], 'BEFORE')\r\n\t#print('ref: ',df.loc&#x5B;0,'layer'])\r\n\t#print('move: ',df2.loc&#x5B;i,'layer'])\r\n\tdel df\r\n\tm = p.listMaps()&#x5B;0]\r\n\tdf = pd.DataFrame(columns=&#x5B;'layer','geom'])\r\n\ttry:\r\n\t\tfor lyr in m.listLayers():\r\n\t\t\tgeometria = Describe(lyr).shapeType\r\n\t\t\tdf_length = len(df)\r\n\t\t\tdf.loc&#x5B;df_length] = &#x5B;lyr,geometria]\r\n\texcept:\r\n\t\tpass\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Per chi volesse copiare tutto il codice:<\/p>\n<pre class=\"brush: python; collapse: false; title: ; wrap-lines: false; notranslate\" title=\"\">from arcpy import *\r\nimport pandas as pd\r\ndf = pd.DataFrame(columns=&#x5B;'layer','geom','size'])\r\n\r\np = mp.ArcGISProject('CURRENT')\r\nm = p.listMaps()&#x5B;0]\r\ntry:\r\n    for lyr in m.listLayers():\r\n        if (Describe(lyr).shapeType == 'Point') or (Describe(lyr).shapeType == 'Multipoint'):\r\n            dimensione = int(management.GetCount(lyr)&#x5B;0])\r\n            geometria = Describe(lyr).shapeType\r\n            df_length = len(df)\r\n            df.loc&#x5B;df_length] = &#x5B;lyr,geometria,dimensione]\r\n        elif Describe(lyr).shapeType == 'Polyline':\r\n            dimensione = da.SearchCursor(lyr,'Shape_Length')\r\n            somma = 0\r\n            float(somma)\r\n            for row in dimensione:\r\n                somma += row&#x5B;0]\r\n            geometria = Describe(lyr).shapeType\r\n            df_length = len(df)\r\n            df.loc&#x5B;df_length] = &#x5B;lyr,geometria,somma]\r\n        elif Describe(lyr).shapeType == 'Polygon':\r\n            dimensione = da.SearchCursor(lyr,'Shape_Area')\r\n            somma = 0\r\n            float(somma)\r\n            for row in dimensione:\r\n                somma += row&#x5B;0]\r\n            geometria = Describe(lyr).shapeType\r\n            df_length = len(df)\r\n            df.loc&#x5B;df_length] = &#x5B;lyr,geometria,somma]\r\n        elif lyr.isBasemapLayer == True:\r\n            pass\r\n        elif lyr.isRasterLayer == True:\r\n            pass\r\n        else:\r\n            pass\r\n            #geometria = Describe(lyr).shapeType\r\n            #df_length = len(df)\r\n            #df.loc&#x5B;df_length] = &#x5B;lyr,,]\t\t\t\r\nexcept:\r\n    pass\r\n\t\t\r\ndf&#x5B;'geom']=pd.Categorical(df&#x5B;'geom'],&#x5B;'Point','Multipoint','Polyline','Polygon'])\r\ndf2 = df.sort_values(&#x5B;&quot;geom&quot;,&quot;size&quot;])\r\ndf2 = df2.reset_index(drop=True)\r\n\r\nfor i in range(max(df.index),-1,-1):\r\n\tm.moveLayer(df.loc&#x5B;0,'layer'],df2.loc&#x5B;i,'layer'], 'BEFORE')\r\n\tdel df\r\n\tm = p.listMaps()&#x5B;0]\r\n\tdf = pd.DataFrame(columns=&#x5B;'layer','geom'])\r\n\ttry:\r\n\t\tfor lyr in m.listLayers():\r\n\t\t\tgeometria = Describe(lyr).shapeType\r\n\t\t\tdf_length = len(df)\r\n\t\t\tdf.loc&#x5B;df_length] = &#x5B;lyr,geometria]\r\n\texcept:\r\n\t\tpass\r\n<\/pre>\n<p style=\"text-align: justify;\">Per maggiori informazioni contatta lo staff GIS One Team via mail a\u00a0<a href=\"mailto:gis@oneteam.it\">gis@oneteam.it<\/a>\u00a0o chiamaci al numero 0247719331.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/gis.oneteam.it\/index.php\/sliders\/iscriviti\/\">Iscriviti<\/a> al blog per non perdervi i prossimi appuntamenti della serie\u00a0<strong>ArcGIS Pro episodi<\/strong>!<\/p>\n<p><a href=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2017\/11\/button_iscriviti_blog_gis1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-6324 size-medium\" src=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2017\/11\/button_iscriviti_blog_gis1-300x65.png\" alt=\"SketchUp - Iscriviti al blog!\" width=\"300\" height=\"65\" srcset=\"https:\/\/gis.oneteam.it\/wp-content\/uploads\/2017\/11\/button_iscriviti_blog_gis1-300x65.png 300w, https:\/\/gis.oneteam.it\/wp-content\/uploads\/2017\/11\/button_iscriviti_blog_gis1.png 322w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ArcGIS Pro consente di customizzare la toolbox con script esterni scritti in linguaggio Python. Questo processo consente di espandere le funzionalit\u00e0 a piacere dell&#8217;utente, rendendolo particolarmente efficiente per operazioni che richiedono molti passaggi e\/o schedulate nel tempo. A differenza di ArcGIS Desktop, la versione PRO utilizza la release di Python 3 e il modulo affidato&hellip;<\/p>\n","protected":false},"author":1,"featured_media":7908,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,29],"tags":[81,93,470],"class_list":["post-7889","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arcgis-pro","category-python","tag-arcgis-pro","tag-arcpy","tag-python"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts\/7889","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/comments?post=7889"}],"version-history":[{"count":20,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts\/7889\/revisions"}],"predecessor-version":[{"id":8010,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts\/7889\/revisions\/8010"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/media\/7908"}],"wp:attachment":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/media?parent=7889"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/categories?post=7889"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/tags?post=7889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}