Monthly Archives: juny 2014

Generador de polígons de Voronoi (2/2)

En l’anterior entrada del bloc s’ha explicat l’aplicació “generador de polígons de Voronoi” des del punt de vista d’un programador, en aquest capítol s’explicarà com funciona des del punt de vista de l’usuari.

Es comentarà tot el procés que ha de fer l’usuari per poder utilitzar el mòdul de forma correcte i treure-l’hi el millor partit possible. Per això també es realitzaran una sèrie d’exemples per que l’usuari tingui la màxima facilitat a l’hora d’entendre el funcionament.

Carregar l’aplicació al Geomedia

Primerament explicaré com carregar el mòdul VB al Geomedia, de tal forma que pugui ser utilitzat per l’usuari.

  • Quan utilitzem el geomedia command wizard , plug-in que serveix per implementar el mòdul visual basic per que pugi ser utilitzar en l’entorn del geomedia profesional, se’ns creen dues carpetes.

Fig. 1. Contingut del nou projecte.

  • La carpeta “src” conté tots els arxius del projecte (mòduls, formularis etc..)

Fig. 2. Contingut carpeta "scr".

  • En la carpeta “bin” trobem l’arxiu .dll que es el que s’haurà d’instal·lar dintre del Geomedia.

Fig. 3. Contingut de la carpeta "bin".

  • Per instal·lar-ho utilitzem l’icona “install” d’intergraph, com podem veure a la següent imatge. Seleccionem la ruta de la carpeta “bin” del nostre projecte i pitgem “OK”.

Aquest procés tan sols s’haurà de fet un primer cop, ja que una vegada instal.lat el mòdul una vegada, per qualsevol canvi en el mòdul tan sols s’haurà de generar una nova dll, amb el procés explicat anteriorment al final del capítol anterior.

Fig. 4. Instal•lació nou mòdul creat.

  • Finalment, s’hi la instal·lació ha estat un èxit, ens hauria de sortir un missatge com el següent.

Fig. 5. Instal•lació satisfactòria del mòdul.

  • Una vegada estem dintre del interface del Geomedia Professional abans de poder provar el nostre mòdul, haurem de fer una mínim una connexió amb una base de dades que contingui classes d’entitat puntual de línia i d’àrea. ja que les tres son necessàries de cara al funcionament del aplicatiu. Per fer la connexió seguim el mateix procés explicat en el capítol 2, apartat Geomedia Professional.

Fig. 6. Addició de les connexions necessàries.

  • Una vegada fetes les connexions necessàries haurem de pitjar sobre un icona que ens apareixerà per defecte com el de la següent imatge. (Si volem tenir el mòdul a un dels menús, s’ha de seguir el procés explicat a L’annex 1).

Fig. 7. Icona per defecte del nostre mòdul.

  • Que ens portarà a la finestra del nostre mòdul, preparat per ser utilitzat.

Fig. 8. Finestra mòdul.

Exemples de la aplicació

En aquest capítol s’explicarà amb exemples el funcionament de la aplicació creada en l’entorn del Geomedia Profesional.

És realitzaran 4 exemples  amb centres proveïdors de serveis (escoles bressol, CAPS, centres de formació primària, Parades de bus) i un especial amb una consulta. Aquests exemples estaran documentats pas per pas i aportant diferents captures per mostrar els diferents punts de vista.

Escoles bressol

Per poder visualitzar el resultat dels polígons de Voronoi de la millor manera posible, haurem de tenir activades a la llegenda un mínim de dos classes d’entitat. Per una banda, l’area que limitarà el Voronoi, en aquest cas, el terme municipal de Mataró i per l’altra la classe d’entitat puntual sobre la que volem crear les nostres zones d’influència, en aquest exemple, seran les escoles bressol. Per això anem a Leyenda>Agregar entradas de leyenda i seleccionem aquestes en els desplegables de les connexions i pitgem el botó “aceptar”.

Fig. 9. Agregació de entrades de llegenda necessàries.

Com podem veure en les imatges, ens apareixeran les escoles bressol situades en el terme municipal.

Fig. 10. Escoles bressol i el terme municipal mostrats a la pantalla.

Si volem saber més detalls sobre les escoles, simplement pitgem a sobre d’una i ens apareixerà un quadre de diàleg com el següents on ens donarà propietats com el nom de l’escola o el numero de places entre d’altres.

Fig. 11. Propietats de les escoles bressol.

Una vegada tenim les classes d’entitat seleccionades a la llegenda, anem al mòdul  i seleccionem en els desplegables “EscolaBressol” com a entitat puntual, “Terme_municipal” com àrea delimitada i “Linies” com a sortida lineal per guardar el resultat del diagrama de Voronoi. Finalment pitgem el botó Calcular Voronoi.

Fig. 12. Omplir desplegables del mòdul per escoles bressol.

Com podem veure obtenim el diagrama Voronoi perfecte sobre les escoles bressol. El diagrama per aquest cas constarà de 17 línies guardades a la classe d’entitat “linies”.

Fig. 13. Polígons de Voronoi sobre les escoles bressol.

Com es pot comprovar, les línies no acaben en el límit del terme municipal, això es deu, ja que l’algoritme de Voronoi sempre es base en un quadrat o rectangle per arribar al punt final de les línies. Per tant en aquest cas calcula un quadrat imaginari amb els punts més alts de l’amplada i l’alçada. Per poder arreglar aquest problema, tenim dos formes de fer-ho des de el Geomedia:

  1. Fent una intersecció espacial:

Anem a Analisis> Intersección espacial .Una vegada dintre haurem de seleccionar  les classes d’entitat de línia i terme municipal i deixar per defecte la opció ” es toquen”. Escrivim el nom final de la consulta resultant i pitgem “aceptar”.

Fig. 14. Intersecció espacial entre línies i terme municipal.

Amb aquesta intersecció aconseguirem el resultat desitjat, com podem veure a la següent captura. El resultat de la consulta com podem veure a la llegenda es una barreja entre línies i àrees.

Fig. 15. Voronoi final sobre les escoles bressol mitjançant intersecció.

2.  Amb la opció dividir entidades.

Pitgem el boto “dividir entidades”.

Fig. 16. Procés dividir entitats (1/3).

Marquem el cursor i seleccionem el mapa amb les línies amb un quadrat.

Fig. 17. Procés dividir entitats (2/3).

Pitgem amb el botó dret a la pantalla i seleccionem la opció “realizar division”. Llavors, et va dividint el terme municipal en seccions de una en una.

Fig. 18. Procés dividir entitats (3/3).

Fins arribar al resultat final on tenim el Terme municipal dividit en regions de Voronoi.

Fig. 19. Voronoi resultant sobre escoles bressol mitjançant divisió d'entitats.

Llavors amb aquest mètode obtenim com a resultat final àrees. Seleccionant a la llegenda la classe d’entitat  “illes” podríem veure les regions d’una forma més visual.

Fig. 20. Voronoi resultant sobre escoles amb la capa d'illes.

Per últim activant la capa de la “ortofoto2013” a la llegenda podem visualitzar els polígons des de una vista Aérea similar a la de Google Maps.

Fig. 21. Voronoi resultant sobre escoles amb la capa "ortofoto".

CAPS

En aquest exemple crearem les regions de Voronoi al voltant dels CAPS de Mataró.

Primer de tot, com hem fet en l’exemple anterior agreguem a la llegenda la classe d’entitat puntual (CAPS)i  l’àrea  delimitant (terme_municipal). Com podem comprovar tenim 8 CAPS tal i com ens mostra la llegenda.

Fig. 22. Caps i terme municipal mostrats en pantalla.

Obrim el mòdul i  com hem fet en l’exemple anterior, seleccionem l’entitat puntual,(CAPS en aquest cas), el terme municipal com a area delimitada i per últim “linies” com a classe d’entitat de sortida per guardar el resultat. Pitgem Calcular Voronoi.

Fig. 23. Omplir desplegables del mòdul per escoles bressol.

Obtenim el  digrama de Voronoi resultant pels CAPS, que conté en aquest cas 14 línies.

Fig. 24. Diagrama de Voronoi sobre CAPS.

Llavors, utilitzant el segon sistema explicat anteriorment (Escoles bressol) per separar el Terme municipal en les regions de Voronoi obtindríem la següent imatge.

Fig. 25. Voronoi final sobre els CAPS mitjançant intersecció espacial .

Agregant la classe d’entitat illes a la llegenda tindríem la següent vista.

Fig. 26. Voronoi final sobre els CAPS amb la capa d'illes .

Finalment amb activant la Ortofoto com en l’exemple anterior, tindríem la vista des de dalt.

Fig. 27. Voronoi final amb la vista Aérea.

Parades de bus

Com als altres dos exemples, agreguem a la llegenda les parades de bus en aquest cas i el terme municipal. Com es pot comprovar a la següent imatge hi ha un total de 144 parades de bus a Mataró.

Fig. 28. Parades de bus i terme municipal mostrats en pantalla.

Seleccionem ParadesBus, Terme_municipal i Linies en els desplegables del nostre mòdul.

Fig. 29. Omplir desplegables del mòdul per Parades de bus.

Una vegada pitgem al botó Calcular Voronoi, obtindrem un resultat com el següent, abans però haurem d’esperar uns segons ja que al haver-hi 144 parades de bus, el programa necessita més temps per executar l’algoritme. Per tant no serà de forma immediata com en els altres dos exemples. Com podem veure  a la imatge s’han necessitat 408 línies per completar el diagrama de Voronoi.

Fig. 30. Diagrama de Voronoi per Parades de bus.

En aquest exemple utilitzem el primer mètode de intersecció espacial per arribar al resultat final desitjat. Anem a Analisis> Interseccion espacial i omplim els camps de la mateixa manera que en l’exemple de les escoles bressol.

Fig. 31. Intersecció espacial entre línies i terme municipal.

Al prémer el botó Acceptar obtindrem el Voronoi final de les parades de bus.

Fig. 32. Polígons Voronoi resultants sobre parades de bus mitjançant intersecció espacial.

Si afegim les illes a la llegenda, l’aspecte ens quedaria de la següent forma.

Fig. 33. Polígons Voronoi resultants amb la capa d'illes.

Apliquem la ortofoto per visualitzar el resultat de la millor forma possible.

Fig. 34. Polígons Voronoi resultants amb la vista Aérea.

Consultes

Aquest mòdul no només es pot utilitzar per classe d’entitats que estiguin a la base de dades connectada. Aquesta aplicació com la majoria de les creades en el CCU també pot utilitzar consultes que estiguin en memòria. La particularitat de la consulta es que pots seleccionar d’una mateixa classe d’entitat les entitats que tu vols, i després executar el mòdul sobre aquella selecció feta.

Si per exemple volem fer el Voronoi dels CEIPcon en el centre Urbà de Mataró com és mostra en la fotografia, hi ha un CEIPcon que quedaria fora d’aquest centre urbà. El problema vindria, ja que al executar el mòdul ho faria per totes les entitats, inclús la que queda fora del territori, per tant una consulta ens pot permetre eliminar aquesta entitat en memoria sense modificar la base de dades i poder realitzar el diagrama de Voronoi de forma satisfactòria.

Fig. 35. CEIPcon i centre urbà en pantalla.

Per crear la consulta desitjada, anem a Analisis>consulta espacial. Seleccionem CEIPcon en el desplegable seleccionar entidades en: . Després haurem de seleccionar la opció “estan contenides en” en el segon desplegable. I Per últim seleccionarem Centre Urba en el tercer desplegable. Finalment introdüirem un nom per la consulta de sortida i pitjarem “Aceptar”.

Fig. 36. Consulta espacial.

Per tant aquesta consulta el que ens farà serà seleccionar totes les entitats de CEIPcon que estiguin dintre del centre urbà.

Fig. 37. Nova consulta espacial representada a la llegenda.

Ara ja podrem utilitzar el mòdul per la consulta desitjada.  Simplement accedim al mòdul i en el desplegable de selecció d’entitat puntual, seleccionem la consulta creada en el sub-desplegable de consultes.

Fig. 38. selecció de la consulta creada al desplegable.

Com en exemples anteriors, seleccionem l’àrea delimitada en aquest cas seria el centre urbà i la classe d’entitat de tipus línia de sortida.

Fig. 39. Omplir desplegables del mòdul per escoles bressol.

Obtenim el Voronoi de forma perfecte sense tenir en compte la entitat exclosa.

Fig. 40. Polígons de Voronoi per la consulta creada.

Utilitzem la opció “dividir entidades” per obtenir el digrama final.

Fig. 41. Polígons de voronoi finals per la consulta creada mitjançant dividir entitats.

 

Mòdul generador de polígons de Voronoi (1/2)

En aquesta entrada es comentarà de forma extensa el nou mòdul del CCU “generador de polígons de Voronoi” des de el punt de vista del programador.

La funció d’aquesta nova aplicació serà la de poder generar zones d’influència per els diversos centres proveïdors de servei en Mataró, així com Escoles, CAPS, parades de bus etc. Aquest sistema s’implementarà amb un mètode geomètric anomenat Voronoi

Els diagrames de Voronoi són un dels mètodes d’interpolació més simples, basats en la distància euclidiana, sent especialment apropiada quan les dades són qualitatives. Es creen en unir els punts entre si, traçant les mediatrius dels segments d’unió. Les interseccions d’aquestes mediatrius determinen una sèrie de polígons en un espai bidimensional al voltant d’un conjunt de punts de control, de manera que dintre de cada polígon o regió la distància a un punt de control associat és sempre menor que a qualsevol altre punt de les altres regions.

Fig. 1. Exemple de diagrama de Voronoi

Algoritme utilitzat

Primer de tot és comentarà l’algoritme utilitzat per du a terme la nova aplicació, trobats a la pagina web de l’informàtic japonès Takashi Ohyam.

http://www.nirarebakun.com/voro/evoro.html

El programa final ha constat  d’una sèrie de mòduls i un formulari.

Fig. 2. Llistat de mòduls i formulari del projecte.

 

Formulari

Primer de tot s’ha creat el formulari, que serà la finestra que apareixerà una vegada pitgem per accedir al mòdul creat. El formulari el podem veure a continuació.

Fig. 3. Formulari de la aplicació creada.

Ara comentaré part per part els diferents desplegables i botons utilitzats en el formulari.

  • En el primer desplegable hem de seleccionar la classe d’entitat puntual sobre el qual volem crear els polígons de Voronoi.

Fig. 4. Desplegable per seleccionar l'entitat puntual.

Fig. 5. Codi relacionat amb el desplegable de selecció d'entitat puntual.

  • En el segon desplegable, haurem de seleccionar la classe d’entitat d’àrea que volem que limiti els polígons de Voronoi. En el nostre cas el terme municipal de Mataró.

Fig. 6. Desplegable per seleccionar l'àrea delimitant.

Fig. 7. Codi relacionat amb el desplegable de selecció d'àrea delimitant.

  • Per últim, seleccionarem la classe d’entitat de línia de sortida. És a dir, on volem que vagin a parar les línies o segments que formaran els polígons de Voronoi finals.

Fig. 8. Desplegable per seleccionar la sortida de les línies dels polígons.

Fig. 9. Codi relacionat amb el desplegable del desplegable de selecció de sortida.

  • Botó “calcular Voronoi”.

Aquest botó el que ens farà serà primerament carregar les dades seleccionades als                 quadres de diàleg del formulari, utilitzant la subrutina “Carregar_dades”.

Fig. 10. Botó calcular Voronoi.

Fig. 11. Codi que va darrere del botó "Calcular Voronoi".

I finalment executarà la subrutina Voronoi_mapa ( que conté l’algoritme ) i d’aquesta manera formarà els polígons desitjats. Aquesta subrutina serà comentada més endavant en l’explicació del mòdul voronoi_code.

  • Botó Sortir

El botó sortir, simplement seria per poder sortir de la aplicació en qualsevol moment.

Fig. 12. Botó sortir.

Fig. 13. Codi que va darrere del botó sortir.

Mòduls

Pel que fa als mòduls, comentaré els dos mòduls principals ( “Obtencio de coordenades”i “voronoi_code”) ja que la resta són creats de forma automàtica quan creem el Geomedia Comand Wizard, que seria el plug-in per tal de poder utilitzar l’aplicatiu VB en el geomedia (Explicat en l’annex II). Tot i que com es veurà més endavant també s’afegeixen algunes funcions necessàries en el mòdul “OperacionsGM”.

Mòdul Obtenció de coordenades

Aquest mòdul és essencial per poder passar al algoritme les coordenades de les diferents classes d’entitats puntuals o serveis sobre les quals haurà de crear les zones d’influència (polígons Voronoi).

El mòdul consta de la subrutina “proximitat”, que li entren els paràmetres rs, entitats.SelectedItem i entitats.ConnectionName procedents de la subrutina “carregar_dades” esmentada al formulari.

  • El primer pas per obtenir les coordenades és afegir a la taula de l’entitat puntual escollida per l’usuari les coordenades X Y d’aquesta. Això és codifica de la següent manera:

  • Generem un recordset afegint a la taula de l’entitat puntual escollida els atributs funcionals que s’han definit anteriorment (Xep, Yep). Un recordset és una estructura utilitzada en programació que permet emmagatzemar informació des d’una taula d’una base de dades.

 

  • Passem el resultat de la consulta (recordset) a una array per les X i per les Y.

  • Obtenim les coordenades en les variables X i Y, que seran utilitzades més endavant en el mòdul Voronoi_code, de cara al algoritme.

Modul Voronoi_code

Aquest mòdul consta bàsicament del algoritme i de subrutines i funcions d’ajuda per que es puguin crear els polígons de Voronoi sobre les coordenades de les classes d’entitats puntuals obtingudes gràcies al mòdul anterior.

La subrutina principal del mòdul és “voronoi_mapa”que podem veure comentada per part seguidament.

  • Primerament, definim les variables i recordsets necessaris per la utilització del programa.

  • Calculem els paràmetres ample i altura que seran utilitzats més endavant en l’algoritme.

  • Establim alguns recordsets necessaris i definim les noves variables utilitzades en l’algoritme. També cridem la funció “borrar_entitat”, que ens permetrà cada vegada que obrim el mòdul buidar la classe d’entitat de línia que he utilitzat per crear el Voronoi anterior.

  • Definim la variable NNN que determina el nombre d’entitats que te la classe d’entitat seleccionada. També  a última hora es van haver d’augmentar el número de posicions dels vectors utilitzats en l’algoritme, ja que en alguns casos on hi havien moltes entitats no acabava de completar l’algoritme per totes elles.

  • Comença l’algoritme amb el següent bucle, ens carrega en memòria totes les entitats en les coordenades corresponents, de cara a crear els polígons.

  • ad(i-1), rep el valor del mòdul de les coordenades X i Y de cada punt i l’utilitza alguns cops en l’algoritme


  • Cridem la subrutina “hSort” passant-li els paràmetres NN, ad, ax, ay calculats anteriorment.


  • Es va executant el gruix de l’algoritme (explicat en l’apartat algoritme i codi inicial) .

  • Finalment amb la funció  Inserta_linia es formen els segments dels polígons a partir d’un punt inicial i un punt final, on les coordenades dels punts serien respectivament x0= kx(k-1) y0= Ky(k-1) i les finals x=kx(k2-1) i y= Ky(k2-1).

Els segments resultants es guarden en un recorset anomenat “Recordset_linia”.

  • Per últim, haurem de mostrar el resultat aconseguit en el mapa i la llegenda

– Seleccionem l’estil de la línia i el nom que li volem posar al resultat.

– Introduïm la entrada de la llegenda en la primera posició

  • Per compilar l’arxiu el programa creat, haurem d’anar a Archivo> generar nomprojecte.dll com podem veure en la següent captura d’imatge. En cas, que no doni cap error de compilació se’ns haurà creat un arxiu ddl i estarà llest per carregar-ho al Geomedia.

Fig. 14. Generar.dll.

Cada vegada que s’hagin fet canvis en el programa, s’haurà de crear una nova dll, de cara a que els canvis sorgeixin efecte en el Geomedia. Com també haurà d’estar tancat el Geomedia Professional m’entres és realitza aquest procés, ja que en cas contrari donarà error.