Skip to content.
Logo tecnoteca

Portale Tecnoteca.it

Logo tecnoteca

Vai al sito aziendale Tecnoteca.com


 

External method

1 import mapscript
2 import string
3 import _mysql
4 import MySQLdb
5
6 def _makeDynamicLayer(self, layer):
7    
8     path_map_and_layers = 'E:\\tecnoteca\\ItaliaShape\\'

9     dbfName = path_map_and_layers + layer + '.dbf'
10   shpName = path_map_and_layers + layer + '.shp'
11   mapName = '01italiashape_win.map'
12   map= path_map_and_layers + mapName   
13       
14   #define a new shapefile object
15   myShape = mapscript.shapefileObj(shpName, mapscript.MS_SHAPEFILE_POINT)  
16
17   #get the correct layer
18   myLayer_obj = mapscript.mapObj(map)
19   myLayer = myLayer_obj.getLayerByName(layer)
20
21   #define a new dbf file
22   myShape_dbf = mapscript.msDBFCreate(dbfName)
23   mapscript.msDBFAddField(myShape_dbf,'NAME',mapscript.FTString,50,0)
24   mapscript.msDBFAddField(myShape_dbf,'DESCRIPT',mapscript.FTString,50,0)   
25   dbf_record_number = 0
26
27   #open the mysql
28   db=MySQLdb.connect("localhost","root","")
29   db.select_db('tecnoteca')
30   db.query("select * from layers_points where layer=" + "'" + layer + "'")
31   result=db.store_result()
32    
33   
34    if db.affected_rows():           
35        #make the pointobject
35        newPoint = mapscript.pointObj()
37        row = result.fetch_row()
38    while (row):                     
39            x_value = row[0][2]
40            y_value = row[0][3]
41            newPoint.x = float(x_value)
42            newPoint.y = float(y_value)
43            myShape.addPoint(newPoint)
44            #add data to dbf file           
45            point_name = row[0][4]
46            point_description = row[0][5]           
47            mapscript.msDBFWriteStringAttribute(myShape_dbf, dbf_record_number, 0, point_name)
48            mapscript.msDBFWriteStringAttribute(myShape_dbf, dbf_record_number, 1, point_description)           
49            dbf_record_number = dbf_record_number + 1
50            #fetch new row
51            row = result.fetch_row()           
52               
53    myLayer.status = mapscript.MS_ON   
54    myShape=None
55    #close dbf file
56    mapscript.msDBFClose(myShape_dbf)



Gli external method, come quello presentato, sono sostanzialmente più complessi degli script python interni a ZOPE.
Questo fondamentalmente poiché negli external method non esistono limiti dettati da ZOPE nelle operazioni concesse al linguaggio.
Sostanzialmente ciò implica una maggiore attenzione nello scrivere il codice, poiché un errore può anche causare il crash del sistema.
Se si tenta di creare uno script in ZOPE che faccia le stesse operazioni di un external method si incorre generalmente in un problema di permessi; ad esempio, la connessione a database, così come è presentata nel codice, non è permessa in ZOPE (che permette la connessione a database ma in maniera diversa, con un oggetto specifico).
Questo metodo esterno è stato utilizzato per creare dinamicamente il contenuto dei layer (i due layer dinamici) sulla mappa.
Quello che fa è farcire due dei tre file di definizione di un layer (il file .shp e il file.dbf) con dei dati custom prelevati da database.
In una ipotesi di utilizzo reale il database mysql contiene tutti i punti di interesse rilevanti per l'utente; quando la lista dei punti è completa l'utente tramite questo script sincronizza il contenuto della sua mappa con il contenuto del database mysql.
Da notare che l'operazione non permette undo e che i file .shp e .dbf vengono creati ed inizializzati solamente con i dati presenti su database, e non con i dati (punti) già presenti nel layer.
Questa scelta di non salvare i punti già presenti sul layer è data da una difficoltà nel trattare correttamente la sequenza di operazioni necessarie ad una unione dei punti già presenti e di quelli invece presenti solo sul database.
  • righe 1-4: import di tutti i moduli necessari per lo script. In particolare, oltre al modulo mapscript (necessario per lo scripting delle cartine) e al modulo string(necessario per operazioni sulle stringhe), vengono caricate anche le classi relative a mysql.
  • riga 6: definizione di un metodo il cui nome è “_makeDynamicLayer” e che accetta un unico parametro:un layer (l'altro parametro, il “self”, è un riferimento allo script stesso e non è assegnabile).
  • righe 8-12: definizione di variabili di tipo stringa
  • riga 15: creazione di un nuovo oggetto di tipo “shapefile” che fa riferimento allo stesso Mapfile inserito in fase di creazione dell'oggetto ZMapServer in ZOPE.
    La creazione dello shapefile avvine tramite il modulo mapscript precedentemente importato.
  • righe 18-19: acquisizione del layer corretto (ovvero il layer passato come parametro al metodo) all'interno dello shapefile già creato.
  • righe 21-25: creazione e definizione di un nuovo dbf file; i dbf file sono dei file caratterizzanti un layer ed il cui compito è quello di contenere le informazioni riguardo i punti nello shape file (.shp) dello stesso layer.
    Si ricorda che un layer è composto da tre file: un file .shp , un .shx ed un .dbf.
    Ovviamente le informazioni sui tre file devono essere coerenti fra loro, poiché un layer per essere visualizzato correttamente ha bisogno delle diverse informazioni residenti nei diversi file.
  • righe 28-31: apertura della connessione a database in locale e query allo stesso per prelevare tutti i punti inseriti sul layer selezionato (layer in input al metodo).
  • righe 34-51: una volta eseguita la query al database viene testato il risultato: se la query ha restituito delle righe allora per ogni riga (ciclo while) si crea un nuovo punto e lo si aggiunge allo shapefile e al dbffile precedentemente creato.
  • riga 53: set dello stato del layer selezionato ad ON
  • riga 54: reset dello shapefile
  • riga 56: chiusura del dbffile




Tesi di Laurea:
"Sviluppo funzionalità gis su portale Zope"
di Marco Celotti


- Università degli studi di Udine -
-  Facoltà di Scienze Matematiche Fisiche e Naturali  -
- Dicembre 2004 -


Slide Tesi.ppt


Video Tesi.zip  [913 KB formato AVI]