Sunteți pe pagina 1din 24

Modelarea și vizualizarea geospațială a datelor statistice

Geoprocesarea prin componenta ModelBuilder din ArcGIS PRO

După cum s-a putut observa, până acum, s-au efectuat operații de geoprocesare elementare
declanșate fie prin utilizarea meniurilor, a instrumentelor sau scrierea de comenzi. In vederea realizării
de procesări complexe asupra datelor, operațiile trebuie înlănțuite într-un flux de procesare care să fie
ulterior executat unitar. Componenta ModelBuilder facilitează construirea de fluxuri de procesare a
datelor pornind de la o schema descrisă în mod vizual, ce combină operații elementare (disponibile prin
instrumente), scripturi sau alte modele, pe principiul subprogramelor din programarea structurată.
Această componentă se identifică în ArcGIS Pro sub forma unei ferestre de lucru care se invocă de la
ribbon-ul Analysis / grupul Geoprocessing / ModelBuilder (Figura 1). Un model trebuie stocat într-o
componentă specifică din GIS și anume într-un Toolbox. Un astfel de container (Toolbox) este construit
odată cu crearea proiectului și are același nume cu el. Utilizatorul poate construi mai multe astfel de
containere, în cadrul proiectului, în fereastra Catalog, secțiunea Toolboxes. Folosind meniul contextual
al secțiunii (click dreapta) se pot adăuga noi containere la proiect iar meniul contextual al unui container
/ New folosește pentru a adăuga în cadul lui modele, scripturi sau Toolset-uri (subgrupuri de elemente),
după cum se poate observa in figura 2.

Figura 1. Crearea unui ModelBuilder din interfata

Figura 2. Crearea unui nou toolbox

Astfel, direct într-un container de tip Toolbox sau într-un container Toolset, din meniul contextual / New
/ Model se deschide fereastra în care se va putea descrie modelul de geoprocesare, având implicit numele
Model însă el se poate schimba prin redenumire. Se asigură unicitatea numelor prin faptul că,
următoarele modele vor fi numite Modeli, unde i reprezintă numărul modelului construit în proiect.
Pentru exemplificare, se va construi un model care realizează selecția drumului E85 pe hartă.
Pentru acest lucru se va alege operația de selecție disponibilă prin instrumentul Select Layer by Attribute

1
din Tools – Geoprocessing – Toolboxes / Data Management Tools / Layers and Table Views și prin drag
and drop se trage instrumentul pe fereastra componentei ModelBuilder ca în figura 3.

Figura 3. Includerea unui instrument în fluxul de procesare

Se observă că elementele sunt necolorate ceea ce sugerează utilizatorului că modelul nu poate fi executat
în această stare. Pentru a putea fi rulat, instrumentul trebuie deschis pentru a i se specifica parametrii de
intrare. Acest lucru de face selectând opțiunea Open din meniul contextual al instrumentului. După
efectuarea acestei operații apare fereastra de interacțiune a instrumentului și utilizatorul introduce
parametrii de selecție doriți (alege stratul tematic drumuri și indică clauza where de tipul nume2 = ‘E85’
după care confirmă operația apăsând OK. Operația se va vizualiza ca în figura 4.

Figura 4. Operația parametrizată corespunzător


Se observă că:

2
- Elementele au fost colorate în diferite culori (albastru inchis pentru parametri de intrare ai
modelului, galben pentru operație, albastru deschis pentru variabila de memorie care va stoca
numărul de elemente selectate iar verde pentru rezultatul propriu-zis al operației de selecție);
- Datele se figurează în forme ovale în timp ce operațiile se figurează prin dreptunghiuri;
- Se observă că elementele sunt interconectate prin săgeți ceea ce indică un fluxul de
prelucrare.
Modelul astfel construit se poate executa apasând butonul Run de pe ribbon-ul ferestrei (Figura 5) sau
buntonul Run după activarea modelului din fereastra Catalog (Figura 6). După execuția modelului, pe
hartă, drumul E85 va apare selectat. Acest lucru se poate observa în figura 7.

Figura 5. Executarea modelului prin apăsarea butonului Run din ribbon

Figura 6. Executarea modelului direct din Catalog

3
Figura 7. Rezultatul afișat pe hartă

După execuția modelului se observă că elementele sunt afișate cu un efect de umbrire ceea ce denotă că
operațiile au fost executate iar rezultatele au fost generate (figura 8).

Figura 8. Afișarea elementelor după execuția modelului

După execuția cu succes a modelului se închide fereastra componentei, se salvează modelul și acesta va
apare în toolbox-ul în care acesta a fost creat. Un astfel de model se execută ori de câte ori este nevoie
dând dublu click pe el. Dacă facem acest lucru pe modelul nostru va apare o fereastra ca în figura 6 în
care ni se precizează că modelul nu are parametri. De fiecare dată pe hartă se va selecta același lucru
(drumul E85).
Pentru a da mai multă generalitate unui model acesta se parametrizează astfel încât rezultatul să
fie diferit în funcție de valorile parametrilor de intrare. De exemplu, în cazul modelului nostru, dorim ca
stratul tematic din care se vor selecta caracteristici să poată fi ales din cele existente în hartă și în plus,
expresia de selecție a caracteristicilor să poată fi introdusă tot ca parametru. Datele care vor fi asumate
ca parametri ai modelului se disting prin faptul că au înscrisă litera P în fluxul modelului ca în figura 9.
Modelul se editează în cadrul componentei ModelBuilder prin selecția lui din componenta Toolbox după

4
care se dă click dreapta și se alege opțiunea Edit. O dată din model se parametrizează prin selecția ei în
cadrul modelului după care se dă click dreapta și se bifează opțiunea Parameter – figura 9.

Figura 9. Parametru al modelului

Fiind vorba de parametrizarea stratului tematic, utilizatorul prin intermediul interfeței va putea alege
stratul tematic pe care dorește să-l proceseze. Pentru ca în interfață comentariul parametrului să fie în
concordanță cu semnificația lui se va redenumi elementul prin selecția lui și apoi click dreapta și se
selectează opțiunea Rename. Făcând această operație se va putea introduce noua denumire (figura10)
care va apare în interfața modelului.

Figura 10. Operația de redenumire a parametrului

Pe lângă transformarea unor date de intrare în parametri ai modelului se mai pot defini și variabile
independente care joacă rol de parametri și care vor fi utilizate de către instrumentele din model. In cazul
nostru dacă utilizatorul poate alege stratul tematic atunci condiția de selecție trebuie parametrizată
pentru că e puțin probabil ca ea să aibă sens într-un context diferit. O variabilă independentă se include
în model făcând click dreapta în interiorul ferestrei de editare a modelului și selectându-se opțiunea
Create Variable… după care va apare o fereastră ce-i permite utilizatorului să selecteze tipul variabilei;
în cazul nostru se va alege SQL Expression. Legarea variabilei de instrument se va face prin drag de la
variabilă și drop pe instrument, după care va apare o fereastă prin care utilizatorul are posibilitarea de a

5
face asocierea dintre variabilă și parametrul instrumentului, în acest caz se va alege Expression (Figura
11).

Figura 11. Asocierea variabilei cu parametrul operației

După efectuarea asocierii, variabila acestei operații se inițializează cu o expresie validă și prin procedeul
descris anterior poate deveni parametru al modelului. După salvare și validare acesta se poate rula din
fereastra Catalog și în coccordanță cu parametri setați se generează și interfața corespunzătoare după
cum se poate observa în figura 12.

Figura 12. Interfața modelului după parametrizare

Se observă că după parametrizare utilizatorul poate indica stratul tematic care va intra în procesare iar
constructorul de expresii SQL se va utiliza pentru a genera condiția de selecție. In mod evident,
utilizatorul poate folosi modelul pentru a selecta date din diferite straturi tematice indicând și condiția
de selecție.

6
Inlănțuirea operațiilor într-un flux de geoprocesare presupune ca operațiile să se bazeze și pe
rezultatele operațiilor anterioare, cu alte cuvinte, datele de intrare pentru o operație sunt datele de ieșire
ale unei operații anterioare. Pentru exemplificare, să presupunem că dorim să construim un buffer în
jurul elementelor spațiale selectate, la o distanță de 5 km. Operația de bufferizare va avea ca date de
intrare rezultatul operației de selecție și distanța. Pentru distanță se va construi o variabilă de tip Long
în care utilizatorul va introduce distanța exprimată în metri, de exemplu 5000, variabila va fi redenumită
Dist. Se deschide instrumentul de construire a buffer-ului și se introduc parametrii corespunzători, de
exemplu pentru caracteristica care va fi buffer-izată se va introduce drumuri adica ceea ce a rezultat din
operația de selecție și se află în model. După ce se încarcă cu date instrumentul buffer se observă că
variabila Dist nu este conectată la nici o operație. Se conectează variabila Dist cu instrumentul Buffer și
apare un meniu contextual din care utilizatorul va selecta parametrul ce va fi asociat variabilei create, în
exemplul nostru Distance, ca în figura 13.

Figura 13. Conectarea variabilei la instrument

Se mai observă în figura 13 că variabilele independente sunt colorate cu albastru mai deschis dacă sunt
inițializate cu valori. Până acum, în acest exemplu, au fost definiți parametri de intrare care s-au mapat
pe datele de intrare cerute de operație cât și pe baza unor variabile independente create în model (de
exemplu SQL Expression sau Dist).
Unui model i se pot atașa și parametri de ieșire. Acest lucru este util când dorim ca rezultatului
final sa-i asociem un nume, să indicăm baza de date unde va fi stocat iar el va fi adăugat la documentul
hartă ca strat tematic, în mod implicit. Din punct de vedere tehnic, acest lucru se realizează prin indicarea
variabilei rezultat, drept parametru. In cazul nostru variabila rezultat al operației Buffer este
drumuri_Buffer și aceasta devine parametru prin bifarea opțiunii Parameter. Pentru a generaliza
modelul, se redenumește variabila element_buf în Rezultat. Prin rularea modelului astfel construit direct
din Toolbox se va afișa fereastra de interacțiune cu utilizatorul ca în figura 14.

7
Figura 14. Interfața modelului completată cu date

Din figura 14, se observă că se rulează modelul pentru a realiza un buffer în jurul râului Arges
la o distanță de 7 km în jurul lui. In figura 15 se observă că rularea modelului a efectuat selecția râului
Arges, construirea bufferului și includerea lui la documentul hartă sub numele indicat în interfață.

Figura 15. Execuția modelului

8
Stabilirea precondițiilor în fluxul de geoprocesare se realizează când dorim ca o operație să se
desfășoare în mod explicit după ce s-a obținut un anumit rezultat intermediar. Acest lucru se realizează
prin conectarea explicită a elementelor din flux după care se indică tipul de conexiune (Precondition).
De exemplu, dacă dorim ca după efectuarea buffer-ului elementele selectate pe hartă să fie deselectate
atunci se va face pe stratul tematic respectiv o selecție prin atribute iar la metoda de selectie se va preciza
CLEAR_SELECTION. Punând această operație în model se crează practic două fluxuri paralele în
sensul că această operație are ca dată de intrare stratul tematic inițial și rezultatul nu se mai leagă de nici
o operație. De aceea, vrem să ne asigurăm că operația de deselecție se face după construirea buffer-ului,
lucru care se realizează prin conexiunea explicită dintre Rezultat și cea de-a doua selecție care are doar
rolul de a deselecta elementele selectate în prealabil, ca în figura 16. Când se face conexiunea se va
alege din meniul contextual opțiunea Precondition iar în interfață acest lucru se va indica printr-o săgeată
punctată după cum se observă în figura 16.

Figura 16. Exemplu de precondiție

Modelul poate fi stocat si ulterior executat sau modificat prin operatia de editare (click-dreapta pe model
/ Edit). De asemenea, el poate fi exportat (Figura 17), fie sub forma unui script Python, dar și sub formă
grafică (Figura 18) folosind opțiunea Export de la grupul Model a ribbon-ului ModelBuilder.

9
Figura 17 Opțiuni de export a modelului de geoprocesare

Codul Python generat prin operația de export a modelului este:

import arcpy
from sys import argv

def Model(Selecteaza="drumuri", SQL_Expression="NUME2 = 'E85'", Dist=7000, Rezultat="D:\\MyProject\\MyProject.gdb\\drumuri_Buffer"): # Model

# To allow overwriting outputs change overwriteOutput option to True.


arcpy.env.overwriteOutput = False

# Process: Select Layer By Attribute (Select Layer By Attribute) (management)


drumuri, Count = arcpy.management.SelectLayerByAttribute(in_layer_or_view=Selecteaza, selection_type="NEW_SELECTION",
where_clause=SQL_Expression, invert_where_clause="")

# Process: Buffer (Buffer) (analysis)


arcpy.analysis.Buffer(in_features=drumuri, out_feature_class=Rezultat, buffer_distance_or_field=Dist, line_side="FULL", line_end_type="ROUND",
dissolve_option="NONE", dissolve_field=[], method="PLANAR")

# Process: Select Layer By Attribute (2) (Select Layer By Attribute) (management)


if Rezultat:
drumuri_2_, Count_2_ = arcpy.management.SelectLayerByAttribute(in_layer_or_view=drumuri, selection_type="CLEAR_SELECTION",
where_clause="", invert_where_clause="")

if __name__ == '__main__':
# Global Environment settings
with arcpy.EnvManager(scratchWorkspace=r"D:\MyProject\MyProject.gdb", workspace=r"D:\MyProject\MyProject.gdb"):
Model(*argv[1:])

Figura 18. Model exportat sub formă grafică în PDF

10
Instrumente de procesare specifice componentei Model Builder

Pe lângă instrumentele din componenta ArcToolbox care sunt necesare pentru a procesa date în GIS,
mai există o serie de instrumente care sunt utile în construirea unui model de geoprocesare. Acestea se
află în grupul Insert din ribbon-ul ModelBuilder, după cum se observă în figura 19. Acestea sunt grupate
în categorii și se referă la:
- Iterators – pentru implementarea structurilor repetitive;
- Logical – pentru implementarea structurilor alternative;
- Utilities – pentru operații generale în modele.

Figura 19. Meniul Insert și Iteratorii

În tabelul de mai jos se regăsesc tipurile de iteratori și descrierea acestora.

Iterator Descriere

FOR Repetă o secvență de un număr de ori în funcție


de o valoare de început și una de sfârșit.

WHILE Execută iterativ cât timp o condiție este


adevărată.

ITERATE FEATURE SELECTION Iterează caracteristicile spațiale selectate; în


cazul în care nu există caracteristici selectate
le iterează pe toate.

ITERATE ROW SELECTION Iterează tuplurile dintr-un tabel.

ITERATE FIELD VALUES Iterează fiecare valoare dintr-un atribut.

ITERATE MULTIVALUE Iterează o listă de valori.

ITERATE DATASETS Iterează seturi de date dintr-un spațiu de lucru.

ITERATE FEATURE CLASSES Iterează caracteristicile vectoriale dintr-un


spațiu de lucru.

ITERATE FILES Iterează fișiere dintr-un folder.

ITERATE RASTERS Iterează date de tip raster dintr-un spațiu de


lucru.

ITERATE TABLES Iterează tabele dintr-un spațiu de lucru.

11
ITERATE WORKSPACE Iterează spații de lucru dintr-un folder.

Structurile alternative și descrierea lor se prezintă în tabelul de mai jos:

Condiție logică Descriere


Verifică dacă există caracteristici (date) de
If Data Exists intrare într-un model. Instrumentul returnează
true sau false.
Verifică dacă există deja câmpuri cu un nume
If Field Exists dat într-un set de date. Instrumentul returnează
true sau false.
Verifică dacă input-ul are caracteristici selectate
și, în caz afirmativ, numărul de caracteristici
selectate. Este utilizat după prima rulare a
If Selection Exists
instrumentului Select Layer by Attribute sau
Select Layer by Location. Instrumentul
returnează true sau false.
Verifică dacă un set de date de intrare are un
If Coordinate System Is anumit sistem de coordonate. Instrumentul
returnează true sau false.
Verifică tipul de date al setului de date de
intrare. Instrumentul returnează true sau false.
If Data Type Is
De exemplu, poate verifica dacă tipul de dată de
intrare este shapefile sau feature class.
Verifică dacă există o expresie premergătoare
If Expression Is sau dacă o variabilă are o anumită valoare.
Instrumentul returnează true sau false.
Verifică dacă o dată de intrare (layer) are o
If Feature Type Is anumită geometrie, cum ar fi punct, linie sau
poligon. Instrumentul returnează true sau false.
Verifică dacă datele de intrare au o anumită
If Field Value Is valoare într-un câmp. Instrumentul returnează
true sau false.
Verifică numărul de înregistrări din setul de date
If Row Count Is
de intrare. Instrumentul returnează true sau false.
Verifică dacă un strat tematic (layer) are
caracteristici asemănătoare printr-o relație
If Spatial Relantionship Is
spațială cu caracteristicile altui strat.
Instrumentul returnează true sau false.
Verifică dacă toate expresiile sau variabilele au o
If Value Is valoare dorită. Instrumentul returnează true sau
false.

12
Pe lângă acestea, mai există și instrumentul Merge Branch care are ca scop să unească ramurile generate
de o structură alternativă.

Operațiile din categoria Utilities, sunt descrise în tabelul de mai jos:

Instrument Descriere
Returnează o valoare bazată pe o expresie Python
Calculate Value
specificată.
Colectează valorile de ieșire ale unui iterator sau
pentru a converti o listă de multivalori într-o
Collect Values singură intrare. Valorile colectate pot fi utilizate
ca intrare pentru instrumente precum Merge,
Append și Cell Statistics.
Primește valoarea aferentă primului tuplu dintr-
Get Field Value un tabel, pentru câmpul specificat.
Parsează denumirea unui fișier obținând: calea,
Parse Path
numele sau extensia acestuia.
Selectează datele dintr-o colecție de date, cum ar
Select Data fi: un folder, o geobază de date, un set de
caracteristici sau o acoperire.

Exemplificarea utilizării de structuri alternative și repetitive se va realiza la studiile de caz ce vor fi


prezentate în încheierea acestei părți iar folosirea lor în modele este oarecum similară cu descrierea unei
scheme logice.
Pentru a înțelege utilizarea operațiilor din grupul Utilities, vom exemplifica operația de adunare a două
numere întregi într-un model, lucru care nu are legătură cu aspecte legate de geoprocesare insă,
câteodată, e necesar să definim si astfel de operații într-un flux de procesare. Pentru aceasta vom defini
într-un model două variabile de tip Long, denumite x și y cărora le asociem două valori (10 si 20) și le
asociem și atributul de parametru astfel încât utilizatorul să le poată modifica valorile implicite. Vom
insera din grupul Utilities instrumentul Calculate Value și vom specifica expresia de calcul pentru a
obține rezultatul (Value). Cum expresia are un caracter general și nu se referă la a calcula valorile unui
atribut sau alte operații standard vom descrie expresia de adunare a celor două variabile definite anterior.
O astfel de variabilă independentă, în model, adică o variabilă neasociată unui parametru al unui anumit
instrument, se referă ca fiind globală pentru modelul curent folosind sintaxa %nume_variabilă%.
Instrumentului de calcul trebuie să i se furnizeze o expresie care va fi evaluată, rezultatul fiind returnat
prin parametrul de ieșire (Value). Expresia determină rezultatul adunării valorilor parametrilor x și y,
după cum se observă în figura 20.

Figura 20. Folosirea instrumentului Calculate Value

13
In figura 21 se prezintă interfața modelului unde au fost introduse valorile 150 și 275 iar în urma
execuției lui, în fereastra obținută prin click pe View Details, se observă că este afișat rezultatul:
Value = 425.

Figura 21. Interfața și rezultatul rulării modelului

Construirea de scripturi Python și adăugarea lor în modele de geoprocesare


Construirea unui script Python se face dând click dreapta pe Toolbox-ul în care acesta se va stoca apoi
New / Script. Codul sursă al scriptului poate fi inclus în obiectul script sau poate fi stocat într-un fișier
pe disc cu extensia py. Codul scriptului se scrie cu un editor de texte după care se rulează din fereastra
Catalog similar unui instrument sau model. Scripturilor li se pot asocia parametri, acest lucru se face
dând click dreapta pe script, se alege Properties și se alege tab-ul Parameters. In fereastra care apare în
acest context se pot adăuga parametrii scriptului care vor forma o listă de parametri, pentru fiecare se
indică numele care va apare ca si comentariu în interfață, tipul parametrului, direcția (de intrare sau de
ieșire) precum și alte caracteristici. Tipul parametrului este important de stabilit corect pentru că în
funcție de el se va genera și elementul de interfață corespunzător. Preluarea în script a valorii
parametrilor de intrare se face cu funcții de tipul arcpy.GetParameter. O astfel de funcție primește ca
parametru indexul parametrului scriptului (primul parametru se află pe poziția 0). Pentru cei de ieșire se
setează valoarea în cadrul scriptului cu funcții de tipul arcpy.SetParameter. O astfel de funcție primește
indexul și valoarea parametrului.

 Funcții în Python

Codul Python se poate structura in module funcționale denumite funcții. O funcție are forma:

def nume_f (numele_parametrilor_formali):


…..

14
…..
[return variabila]

unde, def este cuvânt cheie ce indică începerea definirii funcției și se termină prin instrucțiunea
return care returnează un rezultat, dacă este cazul, de aceea e figurată instrucțiunea ca opțională.

In vederea exemplificării celor menționate se va scrie un script care, pe baza unei simbologii de tip
Graduated Colors colorează poligoanele unui layer după un câmp numeric, din tabela spațială
respectivă. Pentru a realiza acest lucru se procedează la a simboliza stratul tematic judete după tipul de
simbologie mai sus menționat; astfel, se va indica câmpul numeric tpop, care stochează populația
județului, pentru simbolizare și numărul de clase (intervale). După simbolizare, se va putea vizualiza
rezultatul direct pe hartă.
Scriptul, în fapt, asociază simbologia Graduated Colors stratului tematic, de tip poligon, indicat ca
parametru și de asemenea simbolizarea se va face luând în considerare valorile unui câmp numeric și
numărul de clase în care dorim să discretizăm domeniul de valori al atributului (se indică de asemenea
prin parametri). Parametrii scriptului sunt prezentați în figura 22 și se referă la:

Figura 22 Parametrii scriptului

- Alege poligon de tip Feature Layer care semnifică layerul ce se va simboliza – parametru de
intrare;
- Campul de tip Field care specifică câmpul care se va reprezenta prin simbologie – parametru
de intrare – acesta este dependent de câmpul Alege poligon;
- Nr clase de tip Long reprezinta numarul de intervale de valori (inițial sunt setate 4 clase) in
care se va descompune domeniul de valori al câmpului indicat prin parametrul Campul –
parametru de intrare;

import arcpy
sspol = arcpy.GetParameterAsText(0) #preluare parametru de intrare (stratul tematic)
scamp = arcpy.GetParameterAsText(1) #preluare parametru de intrare (numele campului)
snrclase = arcpy.GetParameter(2) #preluare parametru de intrare (numarul de clase)

15
#definirea unei funcții pentru a returna layer-ul ce dorim să îl simbolizăm și acesta va fi vizibil
#celelalte layere vor fi invizibile (ascunse)
def vh_layers(fharta, npol):
layers = fharta.listLayers()
for layer in layers:
if(layer.name==npol):
layer.Visible = True
lyrez = layer
else:
layer.Visible = False
return lyrez

prj=arcpy.mp.ArcGISProject("CURRENT") #documentul proiect curent


harta = prj.listMaps("Map")[0] #documentul hartă curent
layer_simb = vh_layers(harta, sspol) #layer-ul pe care dorim să îl simbolizăm
simb = layer_simb.symbology #preluăm simbologia de la acesta
simb.updateRenderer('GraduatedColorsRenderer') #actualizăm tipul de simbologie
simb.renderer.classificationField = scamp #atribuim câmp pe care se va face simbologia
simb.classificationMethod = 'NaturalBreaks' # actualizăm metoda de clasificare a datelor
simb.renderer.breakCount = snrclase # actualizăm numărul de clase
# alegem o paletă de culori din galeria proiectului
simb.renderer.colorRamp = prj.listColorRamps('Oranges (Continuous)')[0]
layer_simb.symbology = simb # aplicăm noua simbologie

Scriptul astfel definit se salvează, se rulează și se poate folosi ca atare sau se poate include într-un model.
Dacă se dorește colorarea județelor după câmpul tpop folosind 4 intervale de valori se va rula scriptul și
se vor introduce valorile parametrilor în mod corespunzător, iar rezultatul va fi afișat după cum se poate
observa în figura 23.

Figura 23. Harta cu simbologia aplicată

Accesul la datele unei baze de date spațiale se poate face din scripturi Python folosind biblioteca
specializată da (data access) parte din arcpy. Din punct de vedere tehnic, se utilizează conceptul de
cursor, ca la baze de date relaționale, în sensul că, se poate crea un set de tupluri pe baza datelor dintr-o
tabelă specificand și lista de câmpuri care formează cursorul respectiv. Luând în considerare operațiile
care se pot executa asupra datelor din cursor, există trei tipuri de cursoare:

16
- SearchCursor care permite doar consultarea datelor din cursor;
- UpdateCursor ce permite și actualizarea datelor din cursor;
- InsertCursor care permite adăugarea de date în cursor.
Pentru a înțelege mai bine conceptul, se consideră tabela populație și se dorește a se calcula suma
valorilor câmpului cp care stochează populația în orașe mari pentru fiecare județ în parte.

import arcpy
import arcpy.da as da
rd_col = [randuri for randuri in da.SearchCursor("populatie", ("cp"))]
s=0
for val in rd_col:
s += val[0]

Scriptul urmărește într-o primă etapă să formeze o colecție de tupluri formată din tuplurile unui cursor
de tip SearchCursor. Colecția se stochează în variabila rd_col care este de fapt o listă de tupluri (randuri)
care fac parte din cursorul menționat. In limbaj, variabilele de tip listă de valori sunt indicate prin [ ]
specificând fie în mod explicit elementele listei fie în mod comprehensiv ca în exemplul de mai sus.
Cursorul, după cum se observă, este format din tuplurile tabelei populatie și acestea au doar un singur
câmp (cp). După ce a fost formată colecția, elementele ei au fost iterate prin instructiunea for în vederea
efectuării sumei valorilor care s-a stocat în variabila s. Extragerea valorii câmpului cp din tuplu s-a
realizat prin referirea acestuia folosind adresarea indexată precizând poziția câmpului în lista de câmpuri
indicată în cursor, primul fiind pe poziția 0; în exemplu, construcția val[0].
O altă alternativă ar fi să construim o listă cu valorile reprezentând populația din județe și apoi să aplicăm
funcția sum pe elementele colecției pentru a obține suma valorilor:

import arcpy
import arcpy.da as da
rd_col = [randuri[0] for randuri in da.SearchCursor("populatie", ("cp"))]
s=sum(rd_col)

Să presupunem că în tabela populatie avem campul pondere_cp de tip double care trebuie încărcat cu
valorile corespunzătoare astfel încât acesta să stocheze ponderea populației în orașe mari a unui județ în
total populație în orașe mari pe România. Suma populației în orașe mai în România a fost deja calculată
și stocată în variabila s iar pentru a calcula ponderile este necesar să construim un UpdateCursor în
vederea actualizării câmpului pondere_cp. Scriptul va continua cu secvența de cod:

with da.UpdateCursor('populatie',("cp", "pondere_cp")) as crs:


for rd in crs:
rd[1] = float(rd[0])/s
crs.updateRow(rd)

Variabila crs este returnată de UpdateCursor care se construiește pe tabela populatie și conține
câmpurile cp și pondere_cp. Folosind instrucțiunea with se specifică blocul de instrucțiuni care se vor
executa cu cursorul crs. Astfel, pentru fiecare tuplu se calculează valoarea campului pondere_cp referit
prin rd[1] pe baza campului cp (rd[0]) si a sumei s. Construcția float() convertește operandul la un
număr real ca împărțirea să furnizeze rezultatul tot ca număr real. După actualizarea valorilor
câmpurilor, prin apelul metodei updateRow a cursorului crs, noile valori vor fi scrise în tabela populație.
O altă alternativă pentru a realiza același lucru constă în a itera tuplurile cursorului prin intermediul
iteratorului generat de UpdateCursor. Aceasta este o metodă mai generală pentru că se poate folosi și

17
pentru alte colecții cărora li se asociază iteratori. Astfel, funcțiile utilizate pe iterator sunt: reset() care
resetează iteratorul pe poziția inițială în colecție și next() care asigură trecerea la următorul element din
colecție. Codul devine:
crs = da.UpdateCursor('populatie',("cp", "pondere_cp"))
crs.reset()
rd = next(crs, None)
while(rd!=None):
rd[1] = float(rd[0])/s
crs.updateRow(rd)
rd = next(crs, None)
del crs
Funcția next() returnează în rd tuplul din cursor sau în caz că nu mai sunt tupluri în colecție returnează
None. Ultima linie (del crs) eliberează memoria asociată cursorului adică șterge variabila din memorie.

Pentru a înlănțui un script în cadrul unui flux al unui model de geoprocesare acesta trebuie să primească
și / sau să returneze parametri. Dacă și alte operații urmează după script atunci acesta trebuie să returneze
elemente pentru a se putea lega și alte operații care folosesc rezultatul scriptului, ca parametru de intrare.

Pentru a exemplifica cele prezentate se vor defini două studii de caz.


Unul pentru calculul densității liniilor în raport cu suprafața poligoanelor în care acestea se
găsesc. De exemplu, vrem sa calculăm densitatea drumurilor pe județe sau a râurilor pe regiuni sau a
căilor ferate pe comune putem obține valoare prin raporarea sumei lungimilor liniilor dintr-un poligon
la suprafața acestuia. Modelul de calcul primește ca parametrii: stratul tematic cu poligoanele (ex. judete
sau regiuni), numele câmpului care se va adăuga la tabela spațială și care va stoca densitatea pentru
fiecare poligon și stratul tematic cu liniile (ex. drumuri sau râuri). După determinarea indicatorului,
acesta se va afișa pe hartă folosind o simbologie de tip Graduated Colors. Modelul principal va conține
instrumente, un alt model inclus și un script. Modelul inclus va conține instrumente și un script.
Modalitatea prin care ajungem la rezultatul dorit se bazează pe urmarea unor pași:

Pasul 1. Construirea unui script care calculează densitatea pentru un poligon pornind de la
drumurile existente în acesta. Folosind un SearchCursor se determină suma lungimilor liniilor iar cu un
UpdateCursor se actualizează câmpul c_rez din tabelă cu densitatea liniilor.

import arcpy
import arcpy.da as da
lin_jud = arcpy.GetParameterAsText(0)
id_uad = arcpy.GetParameter(1)
uad = arcpy.GetParameter(2)
c_rez = arcpy.GetParameter(3)
llung = [rd[0] for rd in da.SearchCursor(lin_jud, ("SHAPE@LENGTH"))]
sl = sum(llung)
with da.UpdateCursor(uad, (c_rez,"SHAPE@AREA"), "OBJECTID = "+str(id_uad)) as crs:
for rd in crs:
rd[0] = sl / rd[1] * 10000
crs.updateRow(rd)
arcpy.SetParameter(4,uad)

Pasul 2. Se construiește un model care primește ca parametrii de intrare, stratul tematic ce


conține liniile, cel care conține poligoanele și numele câmpului în care se va stoca valoarea densității.

18
Fiecare poligon este iterat cu ajutorul interatorului Iterate Feature Selection care returnează poligonul
respectiv și Value (valoarea câmpului ObjectId). Poligonul returnat este folosit în instrumentul Clip
pentru a putea fi decupate linii din interiorul său. Rezultatul operației Clip, valoarea variabilei Value,
dar și layer-ul ce conține poligoanele și variabila Nume camp reprezință toți parametrii de intrare pentru
scriptul realizat la pasul 1. Parametrul de ieșire rezultat derivă din input (layer-ul cu poligoanele) având
setat câmpul cu densitățile corespunzătoare.

Pasul 3. Crearea unui script care simbolizează un strat tematic cu poligoanele pe baza câmpului
ce stochează densitățile. Acest script a fost prezentat în acest capitol.

import arcpy

def vh_layers(fharta, npol, nlin):


llyrs = fharta.listLayers()
for lyr in llyrs:
if (lyr.name == npol) or (lyr.name == nlin):
lyr.visible = True
if lyr.name == npol:
lyrez = lyr
else:
lyr.visible = False
return lyrez

spol = arcpy.GetParameterAsText(0)
slin = arcpy.GetParameterAsText(1)
scamp = arcpy.GetParameter(2)
prj = arcpy.mp.ArcGISProject("CURRENT")
harta = prj.listMaps("Map")[0]
rezl = vh_layers(harta, spol, slin)
simb = rezl.symbology
simb.updateRenderer('GraduatedColorsRenderer')
simb.renderer.classificationField = scamp
simb.classificationMethod = 'NaturalBreaks'
simb.renderer.breakCount = 4
simb.renderer.colorRamp = prj.listColorRamps('Oranges (Continuous)')[0]
rezl.symbology = simb
arcpy.SetParameter(3,True)

19
Pasul 4. Crearea modelului principal. Procesul începe prin verificarea în layer-ul cu poligoane
dacă există câmpul în care se va scrie rezultatul final. Dacă există, se foloseste instrumentul Calculate
Field pentru a reseta valoarea lui cu 0, iar dacă nu există se folosește instrumentul Add Field pentru a
putea fi adăugat. Operațiile alternative se pot defini deoarece se folosește instrumentul If Field Exists
care implementează o structură alternativă în funcție de valoarea returnată: True sau False. Pentru a
reuni cele două ramuri generate de structura alternativă s-a folosit instrumentul Merge Branch.
Rezultatul acestuia va fi unul dintre parametrii de intrare al modelului realizat la pasul 2, alături de
variabila Camp_rez și layer-ul cu linii (Linii). Ultima operație pe care o realizează modelul este de a
apela scriptul, realizat în pasul 3, pentru a simboliza pe hartă densitatea calculată.

Apelarea modelului pentru a calcula și vizualiza densitatea râurilor pe regiuni se prezintă în figura 24.

20
Figura 24. Interfața si vizualizarea rezultatului în urma execuției modelului

Un al doilea studiu de caz se referă la posibilitatea de a determina orașele care se află de-a lungul
unei linii (ex drum, râu sau cale ferată) la o distanță de 5 km în jurul lui. Pe hartă va apare doar linia
selectată, și localitățile simbolizate diferit în funcție de categoria acestora: capitala țării, reședință de
județ, municipiu sau oraș.
Pentru rezolvarea problemei a fost creat modelul următor care conține pe lângă instrumente de
procesare, o structură pseudo-alternativă și un script pentru simbolizarea localităților.

21
Fluxul începe de la doi parametri: linia – reprezintă layer-ul cu date de tip linie și Expression – reprezintă
clauza where (expresia de selecție) prin care selectăm elementele de tip linie în raport de care identificăm
localitățile. Următorul pas constă în selecția, prin atribute nonspațiale, a liniilor din stratul tematic de tip
linie iar apoi testăm dacă există elemente selectate caz în care fluxul continuă cu alte operații, iar dacă
nu există, acesta se oprește. Următoarea operație este de a selecta localitățile care se află de-a lungul
elementelor de tip linie, selectate anterior, cu ajutorul instrumentului Select Layer By Location.
Elementele selectate sunt reținute în tabele distincte, sunt deselectate din layerele respective, apoi ramân
vizibile doar aceste pe hartă din categoria linii respectiv puncte. Ultima operație din flux se referă la
execuția scriptului de simbolizare a localităților în funcție de tipul lor.
Scriptul de simbolizare implementează o simbologie de tip Unique Value:

import arcpy

spt = arcpy.GetParameterAsText(0)
sln = arcpy.GetParameterAsText(1)

prj = arcpy.mp.ArcGISProject("CURRENT")
harta = prj.listMaps("Map")[0]
llyrs = harta.listLayers()
for lyr in llyrs:
desc = arcpy.Describe(lyr)
if (desc.shapeType == "Point") or (desc.shapeType == "Polyline"):
lyr.visible = False
sln.replace("\\","/")
spt.replace("\\","/")
harta.addDataFromPath(sln)
harta.addDataFromPath(spt)

22
llyrs = harta.listLayers()
arcpy.SetParameter(2,False)
for lyr in llyrs:
if lyr.name == "loc_sel":
simb = lyr.symbology
simb.updateRenderer('UniqueValueRenderer')
simb.renderer.fields = ['TIP']
for grp in simb.renderer.groups:
for itm in grp.items:
tv = itm.values[0][0]
if str(tv) == "1":
itm.symbol.color = {'RGB': [255, 0, 0, 100]}
itm.symbol.size = 14
itm.label = "Capitala"
elif str(tv) == "2":
itm.symbol.color = {'RGB': [255, 0, 0, 100]}
itm.symbol.size = 7
itm.label = "Resedinta judet"
elif str(tv) == "3":
itm.symbol.color = {'RGB': [0, 0, 255, 100]}
itm.symbol.size = 5
itm.label = "Municipiu"
elif str(tv) == "4":
itm.symbol.color = {'RGB': [0, 255, 0, 100]}
itm.symbol.size = 4
itm.label = "Oras"
else:
itm.symbol.color = {'RGB': [0, 0, 0, 100]}
itm.symbol.size = 3
itm.label = "Sat"
lyr.symbology = simb
lyr.showLabels = True
arcpy.SetParameter(2,True)

Interfața modelului și rezultatul rulării lui pentru a obține localitățile de-a lungul drumului
național 1 (DN1) cu simbolizarea acestora se poate observa în figura 25.

23
Figura 25. Interfața si vizualizarea rezultatului în urma execuției modelului

24

S-ar putea să vă placă și