Yearly Archives: 2016

Manual d’ús del mòdul ‘TaulaResum’

Aquest document explica el funcionament del plugin de ‘Taula Resum’ per a QGIS.  Per a poder utilitzar-lo, el primer que s’ha de fer és executar el programa QGIS i un cop inicialitzat aquest, cal pitjar la icona de la figura 1 o anar a Complementos -> CCU -> Taula Resum i s’obrirà una finestra com la que podem veure a la figura 2.

icona figura 1

inici figura 2

A continuació es detallaran els diferents components del plugin i quina és la seva funció:

  1. A la part superior esquerra, hi ha un rectangle on hi indicarem sobre quines capes volem treballar: illes, parcel·les, portals o totes tres alhora.met-treb
  2. A la part superior central, hi ha una pestanya desplegable amb les connexions disponibles (ja configurades prèviament) per a realitzar les operacions. Allà n’escollim una i seguidament la barra que hi ha just a sota n’indicarà l’estat.connexio
  3. A la zona lateral dreta hi podem trobar el selector de filtres que volem utilitzar per crear les taules. Només cal pitjar el filtre que vulguem aplicar per poder-lo emprar. Just a sota hi trobem dos botons més: crear taula i sortir. Crear taula inicia el procés de creació de taules i en el cas que hi hagi algun error en la configuració dels paràmetres per a la construcció d’aquestes, el procés s’interromp i ens apareix un missatge amb l’error. I el botó sortir, tanca el plugin.filtres
  4. Finalment, a la part central, tenim requadre amb cinc pestanyes amb les opcions per poder configurar els paràmetres de cada filtre. Seguidament els detallarem:
    • El primer que apareix és l’edat. En aquesta pestanya s’ha d’introduir en primer lloc una data segons la qual es vulgui fer l’estudi, per exemple 1 de maig de 2016. Després hem de posar el marge d’edat que volem definir en els camps edat mínima i edat màxima. Si volem fer una taula per les escoles bressol, cal posar 0 i 2 anys en els dos camps respectivament. Seleccionant la opció criteri restrictiu cercarem els nens que encara no hagin fet els 2 anys. En canvi seleccionant el criteri no restrictiu cercarem tots els nens que encara no han fet els tres anys.

pest

    • El segon criteri que apareix és el gènere. Podem decidir que la nostra cerca sigui en funció d’homes o de dones.

pest2

    • A continuació tenim els estudis: podem fer un filtratge segons els estudis que la persona hagi declarat tenir en el padró.

pest3

  • Un altre punt molt important seria l’origen no confondre amb nacionalitat. Una cosa és el país d’origen, és a dir, on ha nascut la persona en qüestió i l’altre la nacionalitat. La segona és quelcom més complex d’explicar, ja que està subjecte als conceptes de “ius sanguini” i “ius soli”. En el primer cas, quelcom comú als països europeus, africans i la Xina, els nen/a tenen automàtica la nacionalitat d’origen dels pares. Això comporta, per exemple, que un nen/a nascuda de pares marroquins a Mataró tingui nacionalitat marroquina. En el segon cas, si neixes en un país de dret de “ius soli”, obtens la automàticament la nacionalitat del país on neixes. Aquesta és la situació de la majoria de països llatinoamericans. Llavors, en aquesta finestra podem filtrar la nostre cerca segons diferents criteris:
    1. Pel país d’origen
    2. Per la zona del país d’origen
    3. Per que el seu país d’origen pertanyi a la unió europea.

pest4

    • Per últim la nacionalitat, que té els mateixos criteris de filtratge que en l’apartat anterior.

pest5

Una vegada aplicats els filtres a la cerca per qualsevol dels criteris explicats anteriorment, ja podem crear la teva taula resum, seleccionant tots els botons dels filtres sobre els quals volem fer la cerca i posteriorment pitjant al botó “crear taula”.

Creació del plugin ‘Taula Resum’

Introducció

En aquest post es podrà llegir els passos que cal seguir per a construir el plugin ‘Taula Resum’ per a QGIS.

En el plugin ‘TaulaResum’ cal destacar el canvi de filosofia que s’ha produït amb el canvi de GeoMedia, el qual treballa amb bases de dades locals, al QGIS. En canvi amb aquest últim hem passat a treballar amb un topologia client-servidor, que permet que tots els usuaris que disposin de les credencials podran accedir a les bases de dades sempre que vulguin i des de qualsevol lloc. I només el cal tenir el mòdul QGIS amb el mòdul instal·lat i podran treballar.

Sempre que fem referència a qualsevol element de l’entorn de programació o QGIS, aquest és explicat en el post sobre ‘com preparar l’entorn’.

Procés de creació

Disseny de la interfície

El primer que vam fer va ser la creació de la interfície del plugin. Un cop hem creada l’estructura del plugin amb el ‘Plugin Builder’, vam obrir l’arxiu amb format *.ui amb el Qt Designer i començarem amb la creació. Primer va caldre posar les pestanyes més exteriors (QTab Widget) i dimensionar-lo de manera adequada. Al voltant, vam afegir els elements que ajudaran a escollir els filtres, els mètodes de treball, l’elecció de la connexió i els botons per crear la taula i sortir. Un costum que tenim és el de posar una etiqueta amb la versió de la plugin, ja que ajuda a la identificació de quines són les funcions que pot tenir un plugin. Els plugins poden patir diferents actualitzacions i les funcions poden variar. En el cas de que hi hagi un error en una versió que no és la més recent, l’etiqueta facilita la detecció de l’error i es pot corregir ràpidament. El resultat de tot això es pot veure a la figura 1.

p1
Figura 1

Un vegada fet, vam afegir els elements de dintre les cinc pestanyes dels filtres. Finalment, el que vàrem fer és donar-li un nom que ajudi a la identificació de cada element interactiu de la interfície. Aquest serà el nom que utilitzarem per poder-hi interactuar dins el codi principal que controlarà el plugin. A la figura 2 es pot veure com quedaria la finestra amb la pestanya principal omplerta.

p2
Figura 2

Recomanem que siguin el més explícits possible ja que es podran evitar errades i també ajudaran a facilitar la comprensió del codi, com per exemple ‘ComboConnexio’ en referencia a la pestanya desplegable on s’hi indicarà la connexió que volem escollir.

Interacció amb les Bases de Dades

Per a poder realitzar qualsevol acció sobre la base de dades cal primer saber el nom d’usuari, nom de la base de dades, servidor i contrasenya. És recomanable guardar aquestes dades en variables globals i aconseguirem accedir-hi des de qualsevol funció en qualsevol moment. També cal fer l’import de la llibreria psycopg2 (import psycopg2) al principi del codi.

Per establir la connexió hem utilitzat el codi següent:

#Connexio
nomBD = nomBD1.encode('ascii','ignore')
usuari = usuari1.encode('ascii','ignore')
servidor = host1.encode('ascii','ignore')
contrasenya = contra1.encode('ascii','ignore')
try:
  estructura="dbname='"+nomBD+"' user='"+usuari
  +"' host='"+servidor+"' password='" + contrasenya + "'"
  conn = psycopg2.connect(estructura)
  cur = conn.cursor()
  cur.execute(Sentencia_sql)
  resultat = cur.fetchall()
  conn.close()

Utilitzarem la comanda execute(<sentencia SQL>) per realitzar la consulta. Per poder passar els resultats i per poder-los tractar utilitzarem la comanda fetchall() que retorna una matriu amb tots ells. És important tancar la connexió un cop haguem fet les consultes necessàries.

En el cas que ens ocupa, hi ha tres pestanyes del grup de pestanyes principals que necessiten llegir dades de la BD i exposar-les en els seus respectius camps. Com per exemple en la pestanya ‘Estudis’ hi ha un requadre amb una llista (QListWidget) on cal llistar-hi tots els estudis que hi pot haver i que tenim emmagatzemats a la taula del Padró. El que busquem nosaltres és una consulta que ens retorni els diferents tipus d’estudi que hi ha i ho hem resolt amb la sentencia SQL següent:

select distinct("HABNIVINS"),"NINDESCRI" from "public"."Padro" order by 2;

El camp “HABNIVINS” és l’identificador de l’estudi i el “NINDESCRI” és el nom de l’estudi que apareixerà al requadre de la llista. L’identificador de l’estudi el vincularem a l’estudi per mitjà del ToolTip(), que posteriorment ens facilitarà la construcció de la consulta que l’usuari desitja.

Connexió dels botons

Per poder vincular i recollir els estats dels elements de la interfície cal fer els següents passos. Primer de tot cal fer from TaulaResum_dialog import TaulaResumDialog per tal de poder vincular el fitxer de la interfície amb el codi.

Aleshores, a la funció init(), que ja ve creada pel Plugin Builder, hi posem les següents comandes:

self.dlg = TaulaResumDialog()
self.dlg.btoNACIONALITAT.toggled.connect(self.on_click_MarcarBotoNACIONALITAT)
self.dlg.comboConnexions.currentIndexChanged.connect(self.on_Change_ComboConn)

El primer inicialitza el diàleg amb el què hem d’interaccionar. Les altres dos activen les seves funcions respectives cada vegada que el valor que tinguin variï. Segons el tipus d’element que sigui, es pot canviar l’aparença o carregar elements per pantalla.

Cada element de la interfície ha de tenir una funció vinculada a ell per tal de que el codi sigui capaç de veure en quin estat està.

Programació dels efectes dels botons

Cada vegada que l’usuari interaccioni amb un dels elements de la interfície es produirà un efecte. En aquest apartat s’introduirà un exemple d’aquest tipus de comportament. Per l’exemple utilitzarem el codi següent:

def on_click_MarcarBotoEDAT(self, clicked):
if clicked:
  self.dlg.btoEDAT.setStyleSheet('background-color: #7fff7f')
  self.dlg.GrupPestanyes.setCurrentIndex(0)
else:
  self.dlg.btoEDAT.setStyleSheet('background-color:rgb(227,227,227)')

Aquesta funció es dedica a controlar l’aspecte del botó del filtre d’Edat. Si és clicat, canvia de color de fons i mostra la pestanya del filtre d’edat per tal que l’usuari esculli els paràmetres que vol analitzar. Altrament, li torna a posar el color de desactivat.

A més a més, cal tenir en compte que els elements de la interfície tenen memòria i que un cop els hi canviem l’estat, creem la taula i tanquem el plugin, una vegada el tornem a obrir, conserven el seu estat anterior. Això fa necessària una funció que posi aquests elements en el seu estat inicial cada vegada el que el plugin s’obri i s’utilitzi.

En el nostre cas, la majoria d’elements de la interfície tenen efectes molt senzills com el que hem explicat fa un moment però hi ha un botó que realitza una funció més complexa: crear la taula resum. Aquesta funció recull totes les dades que l’usuari ha introduït sobre els filtres que desitja analitzar, comprova que no hi hagi cap error o que falti alguna dada, es connecta amb la base de dades i escriu el resultat en fitxers de text .csv per a que l’usuari els pugui utilitzar sempre que vulgui.

Un altre punt important és el control d’errors. Cada cop que es produeixi un resultat no esperat s’ha controlar i avisar a l’usuari del que ha passat i indicar-li els passos per corregir l’errada. En el nostre cas, els errors més comuns es produeixen a l’hora de crear les consultes: l’usuari no introdueix correctament les dades de la consulta. Però també pot ser que la connexió no estigui disponible o que l’usuari no tingui els permisos adequats de lectura.

Quan es tracta d’un error relacionat amb la connexió s’adverteix a l’usuari per mitjà d’una etiqueta que n’indica l’estat. En el cas de tenir problemes amb la consulta, apareixen finestres amb el missatge d’error.

Prova del plugin

Una vegada hem programat totes les funcions, cal comprovar que els resultats són els esperats. Per fer-ho, cal que utilitzem el GeoMedia amb el plugin que s’utilitzava anteriorment i comprovar que si posem les mateixes variables d’entrada obtenim el mateix resultat.

Cal que el procés sigui exhaustiu perquè cal revisar cadascuna de les funcions que s’han implementat. S’han de fer totes les combinacions possibles i comprovar que el número de resultats ha sigut igual. En el cas que no ho sigui, s’han de comparar els codis i veure el punt on difereixen.

Preparació de l’entorn de treball per la creació d’un plugin per a QGIS

Introducció

En aquest post es podran llegir els passos que cal seguir per preparar un entorn de treball per a construir un plugin per a QGIS. Aquesta configuració no és la única proposta possible, sinó que és la que hem escollit nosaltres en particular.

El primer que cal fer és pensar una bona planificació del plugin: les funcionalitats que es volen incorporar, la tria i disposició dels elements que integraran la interfície, les fonts d’informació sobre les qual es volen realitzar els càlculs i quin tipus de sortides s’oferiran a l’usuari són alguns dels punts que cal tenir en compte a l’hora de la organització.

La interfície cal que sigui el més clara i intuïtiva possible per tal que amb unes simples instruccions l’usuari sigui capaç d’usar el plugin sense cap mena de problema. L’altre aspecte que cal tenir amb compte és el format de les fonts d’informació. Segons quines fonts no són ràpides a l’hora de ser tractades. Degut a aquest fet, recomanem treballar amb taules PostgreSQL ja que permet tractar un gran nombre de dades i fer funcions complexes en un període de temps molt reduït.

En el cas de les capes o taules de sortida, les sortides que no tinguin geometria és preferible guardar-les directament a la base de dades. Altrament, les sortides que si que tinguin geometria seria recomanable guardar el resultat de la consulta a la BDD i a partir d’allà generar un arxiu temporal .SHP per tal de que l’usuari pugui veure el resultat per pantalla en el projecte.

També cal instal·lar el programa ‘pgAdmin’ per tal de poder administrar les bases de dades des de les quals podrem extreure i afegir les dades que necessitem o obtinguem després dels nostres càlculs. Allà també podrem administrar els rols i permisos que volem donar en els usuaris.

Preparació i posta apunt

Entorn de programació

Per a poder crear un plugin de QGIS cal, com es obvi, el QGIS i un IDE. Un IDE és l’entorn de programació necessari per a poder programar el plugin internament. En el nostre cas, hem escollit l’IDE anomenat ‘Eclipse’ ja que és un entorn fàcil i intuïtiu, i té diverses funcionalitats d’entre les quals dues que són de gran utilitat: parlem d’un servidor per poder debugar mentre executem el plugin en el QGIS i un controlador de versions.

L’extensió per debugar remotament es connecta amb un altre plugin del QGIS(posteriorment serà explicat) i permet seguir l’execució del programa en temps real i tens la possibilitat de posar punts d’interrupció per tal de poder detectar possibles errors. A més a més, disposa d’una graella on s’hi pot veure el valor de les variables que són utilitzades en el codi en el moment en què parem l’execució.

La segona extensió recomanada és el controlador de versions, ja que està pensat per fer més fàcil i eficient la construcció manteniment d’aplicacions que tenen un gran nombre d’arxius amb codi font. Entre d’altres funcions permet fer un seguiment exhaustiu de les etapes que ha seguit el codi. Tens la possibilitat tornar a versions anterior en cas que hagis comès un error i seguir des de l’última versió correcta. També facilita el treball amb grup ja que permet ajuntar codi de dues o més persones fàcilment i d’aquesta manera es pot coordinar el treball que s’ha realitzat.

Els plugins de QGIS estan programats en Python, així doncs serà imprescindible instal·lar Python en el nostre equip en el cas que no ho estigui i també afegir l’extensió ‘PyDev’ a l’Eclipse.

Seguidament, explicarem pas a pas la instal·lació de tots el programes i extensions que s’han mencionat prèviament.

Comencem per la instal·lació del ‘Eclipse’. En el nostre cas ens hem descarregat la versió 4.5.2 de l’Eclipse Mars. En el cas de que l’equip no disposi de Java instal·lat, caldrà instal·lar-lo prèviament, ja que sinó l’Eclipse no funcionarà. Recomanem instal·lar la última versió.
Una vegada instal·lat, cal afegir les extensions necessàries. Comencem pel ‘PyDev’. Cal anar a Help a Install New Software (figura 1) i ens apareixerà una finestra com la de la figura 2.

1

Figura 1

2Figura 2

Pitgem el botó ‘Add’, que està ressaltat en la figura 2, i ens apareixerà un finestra com la de la figura 3.
3

Figura 3

Només cal omplir els dos camps buits: el primer amb el nom PyDev i el segon amb el link següent http://pydev.org/updates. Un cop fet, pitgem el botó OK per incorporar el repositori.

Després cal escollir PyDev en el desplegable de ‘Work with’ (figura 2 o 4)  i es carregaran les extensions que hi ha disponibles en el servidor. Un cop s’hagin carregat, escollim la opció del PyDev i pitgem el botó ‘Next’ per procedir a la instal·lació. Tot seguit haurem d’acceptar els termes de la llicencia i pitjar el botó ‘Finish’ per tal de finalitzar. Aquesta extensió porta incorporat la funció amb el servidor per debugar.

Per tal d’instal·lar la extensió de control de versions cal anar a la mateixa finestra que la figura 2 i a la pestanya desplegable cal escollir la opció <Mars – http://download.eclipse.org/releases/mars>  i en camp de filtre posar ‘Git’ tal i com es mostra en la figura 4.
4

Figura 4

Cal escollir les tres primeres opcions. La quarta és opcional: depèn de si interessa treballar amb GitHub. Un cop seleccionades les opcions, cal instal·lar-les com hem fet amb el PyDev.

Aquí acabaria la preparació de l’IDE.

QGIS

Aquests serien els requisits per poder treballar amb l’Eclipse. Seguidament explicaré les plugins que són necessaris per treballar amb el QGIS.

El primer pas per preparar l’entorn és la descarrega del QGIS des de la web del programa http://www.qgis.org/ca/site/forusers/download.html. La versió que nosaltres utilitzem és la 2.14, tot i això, qualsevol versió posterior hauria de funcionar sense cap mena de problema. Un cop descarregat, cal instal·lar-lo en el nostre equip.

Després de la instal·lació, és necessari obrir el programa QGIS i procedirem a instal·lar els plugins que comentarem seguidament.

Començaré per l’esmentat anteriorment, el plugin ‘Remote Debug’ que ens ajuda a connectar el QGIS amb el nostre IDE per tal de poder controlar l’execució i detectar possibles errors. Facilita molt la tasca de trobar errors i agilitza la codificació del plugin.

També hi ha el ‘Plugin Builder’. Aquest plugin crea una estructura bàsica o plantilla per a fer un plugin. Es parteix d’aquesta base i a partir d’allà es comença a programar el plugin amb el nostre IDE, que posteriorment l’importarem.

L’últim plugin a instal·lar és el ‘Plugin Reloader’. La seva funció és refrescar el connector mentre estem debugant errors i estem fent canvis en el codi. Si no ho féssim, els canvis en els codi no quedarien reflectits a l’execució.

Per poder instal·lar aquests cal seguir els passos següents: primer cal anar a Complementos à Administrar e instalar complementos com en la figura 5.
5

Figura 5

I seguidament ens apareixerà una finestra com la de la figura 6.
6

Figura 6

Abans de tot, cal anar a la pestanya de ‘Configuració’ i marcar la opció de mostrar els complements experimentals com en la figura 7.
7

Figura 7

Un cop marcada l’opció, tornem a la pestanya de ‘Todos’, com a la figura 6 i a la casella de buscar, busquem els plugins pel seu nom: Plugin Builder, Plugin Reloader i Remote Debug. Una vegada els hem trobat, pitgem el botó de instal·lar com el de la figura 8.
8

Figura 8

Ja instal·lats els plugins, apareixeran a la nostra barra d’eines del menú (figura 9).
9

Figura 9

L’últim detall que cal solucionar és indicar al Remote Debug el camí on hi ha el servidor per debugar del nostre IDE.

Per fer-ho cal pitjar la icona del plugin (és la que apareix a la dreta a la figura 9) i ens apareixerà una imatge com la de la figura 10.
10

Figura 10

En el camp pydevd path cap posar-hi el path següent: a la carpeta on hi ha guardat l’eclipse à Plugins à org.python.pydev_X.X.X.201608171824 à pysrc on X varia segons la versió que escollim.

pgAdmin

Per instal·lar el pgAdmin el primer que cal fer és descarregar-se l’aplicació des del lloc web que del programa https://www.pgadmin.org/download/. Allà només caldrà descarregar-se el que s’adequa a la nostra plataforma.

Un cop fet, només cal executar l’arxiu que ens hem descarregat i seguir els passos que indica.

Connexions a la base de dades

Per tal de poder configurar la connexió amb la base de dades cal seguir els següents passos:

Primer cal cercar a la barra d’eines en el lateral esquerra de la nostra pantalla una icona com aquesta 18
Un cop ho haguem fet, ens apareixerà una finestra com la de la figura 11. En allà cal premer el botó “Nueva”, tal i com està senyalitzat a la mateixa figura. Posteriorment ens ha d’apareixer una finestra com la de la figura 12. En allà cal introduir els camps necessaris per configurar la connexió: usuari, nom de la base de dades, servidor i contrasenya.
20

Figura 11

19

Figura 12

Funcionament

Creació del plugin

Comencem pel plugin Builder, ja que serà el primer que farem servir. Primer de tot, crearem un projecte i introduirem totes les dades que ens demana (figura 11).
11

Figura 11

Entre les dades que ens demana, li entrarem un camí on guardarà el plugin. És recomanable posar-lo al path següent: Disc Local (C:) à Usuaris à (Usuari on estigui el QGIS) à .qgis2 à python à plugins, ja que en aquella carpeta és on es guarden els plugins instal·lats.

Seguidament, copiem el camí i obrim l’eclipse. Anem a File à Import… i ens apareixerà una pestanya com la de la figura 14.
12

Figura 14

Pitjem l’opció de ‘Existing Projects into Workspace’ i ens mostrarà un pantalla com la de la figura 15.
13

Figura 15

Copiem el camí en el camp del directori arrel i pitjem el botó de ‘Browse..’. Un cop fet, es carregaran el projectes que hi hagi a la carpeta en requadre blanc. Llavors només caldrà seleccionar-lo i importar-lo mitjançant el botó Finish.

Finalment obrim el projecte i comencem a treballar a l’arxiu [nom del projecte].py que ja s’haurà creat prèviament.

Creació de la interfície

En el projecte que nosaltres hem creat, hi haurà un arxiu .ui que és la base de la nostre interfície. Aquest fitxer el podem editar amb el programa Qt Designer que s’instal·la automàticament quan instal·lem el QGIS en el nostre equip.

Per tant, per editar la nostra interfície obrim aquest programa i obrim el l’arxiu que tenim en nostre projecte.

El Qt Designer disposa de totes del eines que necessitem a la barra lateral esquerra i des d’allà incorporem els elements en el nostre disseny arrossegan-los fins on els vulguem posar.

Servidor per debugar

El que primer cal fer és obrir el ‘Eclipse’ i fer el seguent:

Anar a Window à Prespective à Open Prespective à Other com a la de la figura 16.
14

Figura 16

I seguidament se’ns obrirà una finestra com la de la figura 17.
15

Figura 17

Seleccionem Debug i seleccionem OK. A la barra d’eines superior ens mostrarà unes eines com les de la figura 18.
16

Figura 18

Cal pitjar el tercer botó 17 i haurem encès el servidor per debugar. Un cop fet, cal obrir el GIS i obrir el plugin del Remote Debug, que té una icona similar a la anterior. I ens apareixerà una finestra com la figura 10. Aleshores, només cal pitjar el botó de Connect i si hem configurat bé el complement, ens sortirà un missatge indicant que s’ha connectat amb el servidor.

Primers passos en el rutatge al QGIS

En aquest post mostraré els passos que he hagut de seguir per tal de crear el primer dels mòduls que utilitza funcions de rutatge en el QGIS. En aquest cas, volem traslladar el mòdul que calcula els 3 camins a les escoles bressol i llars d’infants més pròximes a cada portal de la ciutat de Mataró. En primer lloc presento les capes amb les quals es treballa. Llavors segueixo amb la creació del mòdul i la seva utilització.

Capes de treball

Actualment amb el GeoMedia treballem amb bases de dades de Microsoft Access majoritàriament. Aquestes incorporen tot tipus de dades, ja sigui taules amb informació sobre el padró o el cadastre, que no estan georeferenciades, o capes de punts, línies o polígons com poden ser els mapes de carrers, illes, cruïlles i serveis públics de la ciutat. Les dades en aquest format ens permeten una gran versatilitat d’ús i facilitat tan en l’ús com en la creació, modificació i eliminació. També són fàcilment exportables a qualsevol altre tipus de format per seguir treballant. Ocasionalment també treballem amb arxius SHAPE.

El QGIS permet gestionar formats raster i vectorials a través de les biblioteques GDAL i OGR, així com altres bases de dades. Una biblioteca GDAL i OGR és un conjunt de programes que estan formats per comandes, cada un amb moltes possibilitats d’ús.

Les capes més comunes amb les quals hem treballat són el Vector Layer, on utilitzem arxius SHAPE (.shp), i Delimited Text Layer on utilitzem arxius CSV (.csv).

Ambdos tipus de dades poden ser modificats fàcilment: tan crear, inserir, modificar o eliminar objectes i/o camps, la qual cosa els fa idonis treballar amb aquests tipus d’arxius ja que si volem fer proves per poder desenvolupar les consultes o els mòduls, ens són de gran utilitat.

Procés de creació

Per crear la interfície gràfica s’utilitza un creador de models que porta incorporats una sèrie de funcionalitats. Haurem d’anar a la caixa d’eines de processat i allà “crear model nou”.
fuc
I seguidament se’ns obra la següent finestra:
nou
Les dues imatges següents corresponen a la columna de l’esquerra de l’anterior imatge hi tenim tots els tipus de paràmetres amb els quals podem treballar, i si canviem a la pestanya de algoritmes, trobem totes les funcions amb les quals podrem treballar sobre les dades. Cal veure el funcionament d’aquestes per tal de poder-les utilitzar correctament.

fuc

dades

 

 

 

 

 

Seguidament, vam afegir el tipus de dades i buscar les funcionalitats adequades per construir la interfície gràfica.

dades2
Una vegada introduïdes les capes, va ser necessari buscar una funcionalitat que convertís el tipus de geometria dels objectes de les capes de punts ja que van sorgir problemes per què obteníem una capa buida. En el nostre cas vam utilitzar el mòdul “Convert Geometry type”.
convert
Seguidament vam començar la recerca d’entre les funcionalitats alguna que calculi una ruta entre dos punts. No existeix una funcionalitat que faci tal funció, així que vam seguir la cerca. Vam seguir buscant entre els plugins que permet instal·lar el QGIS. Vam trobar-ne un que si que fa aquesta funció però no ens era d’utilitat ja que no hi ha cap manera d’automatitzar el procés de càlcul de les distàncies. Això doncs, vam recórrer a l’últim recurs: crear un script en Python que realitzi la funció.

Vam trobar un script que calculava la ruta entre dos punts sobre un graf de carrers. Aquest script utilitza una funció interna de la API de QGIS anomenada “dijkstra” que et retorna un camí. El següent script és el que vam trobar a Internet:

##ruta=name
##ruta=name
##points=vector
##network=vector
##output=output vector

#Algorithm body
#==================================
from PyQt4.QtCore import *
from PyQt4.QtGui import *

from qgis.core import *
from qgis.gui import *
from qgis.networkanalysis import *
from processing.tools.vector import VectorWriter

point_layer = processing.getObject(points)
network_layer = processing.getObject(network)
writer = VectorWriter(output, None, [QgsField("order", QVariant.Int)],
network_layer.dataProvider().geometryType(), network_layer.crs())

# prepare graph
vl = network_layer
director = QgsLineVectorLayerDirector(vl,-1,'','','',3)
properter = QgsDistanceArcProperter()
director.addProperter( properter )
crs = vl.crs()
builder = QgsGraphBuilder( crs )

# prepare points
features = processing.features(point_layer)
point_count = point_layer.featureCount()
points = []
for f in features:
  points.append(f.geometry().asPoint())
tiedPoints = director.makeGraph( builder, points )
graph = builder.graph()
route_vertices = []

for i in range(0,point_count-1):
    progress.setPercentage(int(100 * i/ point_count))
    
    from_point = tiedPoints[i]
    to_point = tiedPoints[i+1]
    from_id = graph.findVertex(from_point)
    to_id = graph.findVertex(to_point)

    (tree,cost) = QgsGraphAnalyzer.dijkstra(graph,from_id,0)
    if tree[to_id] == -1:
        continue # ignore this point pair
    else:
        #collect all the vertices between the points
        route_points = []
        curPos = to_id 
        while (curPos != from_id):
            route_points.append(graph.vertex(
graph.arc(tree[curPos]).inVertex()).point())
           curPos = graph.arc( tree[ curPos ] ).outVertex()
        route_points.append(from_point)
    # add a feature
    fet = QgsFeature()
    fet.setGeometry(QgsGeometry.fromPolyline(route_points))
    fet.setAttributes([i])
    writer.addFeature(fet)
del writer

Un cop testejat i debuguejat, vam començar amb la modificació de l’script per tal d’obtenir el resultat desitjat. Aquest va ser un procés complex ja que s’havia de canviar el programa per dins. Després de forces entrebancs en el procés vam aconseguir un resultat força aproximat al que volíem. Van caldre forces hores per acabar de depurar el codi ja que teníem petits errors que costaven de detectar.

##dintreilla=vector
##EscolesBressol=vector
##network=vector
##output=output vector
#Algorithm body
#==================================
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
from qgis.core import *
from qgis.gui import *
from qgis.networkanalysis import *
from processing.tools.vector import VectorWriter

start_time = time.time()
network_layer = processing.getObject(network)

inputPoint = processing.getObject(dintreilla)
features = processing.features(inputPoint)

inputPoint2 = processing.getObject(EscolesBressol)
features2 = processing.features(inputPoint2)

di= 0
eb= 0
id = -1
fields = []
fields.append (QgsField("ID", QVariant.Int))
fields.append (QgsField("Length", QVariant.Int))
fields.append(QgsField("From_Node",QVariant.String))
fields.append(QgsField("To_Node",QVariant.String))

writer = VectorWriter(output, None, 
fields, network_layer.dataProvider().geometryType(), network_layer.crs())

#Per buscar els 3 millors de cada punt

for fea1 in features:
    di=di+1
    #xx = fea1.geometry().asPoint().x()
    #yy = fea1.geometry().asPoint().y()
    #pStart = QgsPoint(xx, yy)
    from_node = fea1.attributes()
    inici = from_node[0]
    print inici
    fea2=None
    features2 = processing.features(inputPoint2)
    eb = -1
    vec = []
    for fea2 in features2:
        eb=eb+1
        id  = id + 1
        nom = fea2.attributes()
        desti = nom[2]
       #---------------------------------------------------------------
        vl = network_layer
        director = QgsLineVectorLayerDirector(vl,-1,'Cost','Cost_inver','',3)
        properter = QgsDistanceArcProperter()
        director.addProperter(properter)
        crs = vl.crs()
        builder = QgsGraphBuilder(crs ,True,0.001)

        # prepare points
        points = []
        points.append(fea1.geometry().asPoint())
        points.append(fea2.geometry().asPoint())

        tiedPoints = director.makeGraph( builder, points )
        graph = builder.graph()

        route_vertices = []
        for i in range(0,2-1):
            from_point = tiedPoints[i]
            to_point = tiedPoints[i+1]

            from_id = graph.findVertex(from_point)
            to_id = graph.findVertex(to_point)

            (tree,cost) = QgsGraphAnalyzer.dijkstra(graph,from_id,0)
            if tree[to_id] == -1:
                continue # ignore this point pair
            else:
                # collect all the vertices between the points
                route_points = []
                curPos = to_id 
                while (curPos != from_id):
                    route_points.append(graph.vertex(
graph.arc(tree[curPos]).inVertex()).point())
                    curPos = graph.arc(tree[curPos]).outVertex()

                route_points.append(from_point)

            # add a feature
            geom=QgsGeometry.fromPolyline(route_points)
            fet = QgsFeature()
            fet.setGeometry(QgsGeometry.fromPolyline(route_points))
            fet.setAttributes([id, geom.length(), inici, desti])
            vec.append(fet)
           
    if (len(vec) > 0):
        vec.sort(key=lambda vec: vec[1])
        for i in range (0,3):
            writer.addFeature(vec[i])
del writer
print("--- %s seconds ---" % (time.time() - start_time))

Finalment vam aconseguir un resultat que s’ajustava a les nostres necessitats, i així completar el procés de creació d’un mòdul amb el QGIS. Vam posar l’script en un mòdul per a python, vam posar-li totes les connexions necessàries.
python
I aquest en va ser el resultat final de tot el procés:
final

Procés d’utilització

Aquí es descriu el procés d’utilització del mòdul per trobar els 3 Camins més pròxims a una Escola Bressol i una d’infants. Aquest comença amb la preparació de les dades a la llegenda o panell de capes del QGIS. En el cas que ens ocupa necessitarem 4 capes SHAPE, 3 de punts i una de segments. Les 3 capes de punts són les Escoles Bressol, les Llars d’Infants  i els dintreilles, que són tots els portals de la ciutat.  I la capa de segments són el conjunts de carrers de la ciutat, és a dir, per on hem de trobar el camí.

Primer de tot, hem de tenir les capes en el tipus desitjat: SHAPE. En el cas que no estiguin ja en aquest format, cal transformar-les per tal de poder-hi treballar. Un cop les tinguem, les guardem per tal de poder-les agafar i emprar.

Tal com s’indica a la fotografia, s’afegeix cada capa via Capa -> Añadir capa -> Añadir capa vectorial:
afe3

afe

Seleccionem explorar i amb l’ajuda de la finestra, busquem els arxius SHAPE que volem posar.

afe2

Repetim l’acció 3 vegades més fins a aconseguir les 4 capes desitjades, tal i com es veu a la foto.

Un cop fet, anem al panell de la dreta de la pantalla on hi ha la “caja de herramientas de procesado” i busquem a l’apartat de Modelos -> CCU, un model anomenat “3EB més pròximes”.
afe4

Una vegada trobat, cal executar-lo. S’obrirà una pestanya amb el següent diàleg:

afe5

Posem a cada pestanya la capa que ens demani: a la primera hi posem la xarxa de carrers sobre la qual volem treballar, a la segona hi posem els Dintreilles o portals de la ciutat(assegurar-se de que sigui la versió “dintreilla_trajectes”) i finalment les escoles bressol o les llars d’infants. Haurem de repetir el procés per cada una de les capes: una per les EB i una altre per les LI.

Un cop tot estigui a punt, només cal executar el procés i esperar a obtenir el resultat. El temps d’espera pot variar segons l’ordinador on s’estigui executant aquest.

Quan finalitzi el procés cal guardar el resultat en un fitxer SHAPE, ja que està en un fitxer temporal i per tant, es perdria en el moment en què tanquem el programa.

Prova del mòdul

En aquest apartat es mostra un exemple de mostra del mòdul. No utilitzaré la capa del ‘dintreilla’ ja que es massa gran i per veure el funcionament, amb una simple capa en tenim prou.

En aquest cas utilitzaré una capa amb un punt (de color vermell) que serà el punt d’origen i una altre capa (de color verd) amb els possibles destins més propers. D’aquesta manera es pot veure ben clar el funcionament.
ex1

Posem en marxa el mòdul i el resultat que obtenim és el següent:

ex2

A la imatge es pot veure el graf de carrers de la ciutat de Mataró. S’hi pot veure 3 camins ressaltats de color verd clar. Tots tres tenen com a origen el punt vermell.