sia MySQL che PostgreSQL hanno una loro implementazione
dello standard OpenGIS. i dati restituiti però sono
una rappresentazione binaria dell'oggetto in questione.
se volessimo tenere i dati in formato stringa (che è un
po' come se volessimo lavorare con le date senza avere
un tipo datetime), dovremmo richiedere al database di
trasformare il dato in scrittura usando geomFromText e
il dato in lettura con asText. questo è simile a
quello che proprio nel primissimo periodo abbiamo fatto
con le date, tentando di riscrivere con la funzione SQL
TO_DATE...
se invece volessimo tenerli in formato geografico,
dovremmo appoggiarci ad una libreria che definisca la
gerarchia di classi necessaria, in attesa che venga
creata una libreria standard che ancora non c'è.
intanto ho verificato che il queryconverter è in grado
di lavorarci: dato un oggetto obj con un campo
rappresentazione stringa di un poligono, posso
inserirlo e recuperarlo così:
>>> ibo3.execute("insert into tilegis (pk_tilegis,
tile) values (%(pk_tilegis)s, geomFromText(%(tile)s))",
obj)
<MySQLdb.cursors.Cursor object at 0xb7b5b3cc>
>>> ibo3.execute('select asText(tile) from tilegis
where pk_tilegis=10200').fetchone()
('POLYGON((76.2563 -78.9223,78.5032 -83.0332,78.4133
-84.1188,76.1705 -79.9988,76.2563 -78.9223))',)
>>>
Logged In: YES
user_id=512199
un paio di chiacchiere con Federico Di Gregorio (psycopg),
sul db-sig, mi ha un po' chiarita la situazione.
intanto, che esiste per lo meno una libreria che implementa
la gerarchia di classi OpenGIS: si chiama GeoTypes (peccato
per la maiuscola iniziale, che non mi piace) e si trova su
http://initd.org/tracker/psycopg/wiki/GeoTypes.
che GeoTypes si appoggia a psycopg per comunicare con
postgresql. che è il contrario di quello che vorrei, cioè
che sia la libreria di comunicazione con il database ad
appoggiarsi alla gerarchia di classi.
qualche prova con GeoTypes e un paio di brevi messaggi da
Andy Dustman (mysqldb) chiarisce che con mysql il problema
non è proprio di ovvia risoluzione, almeno non fuori da
mysqldb (il problema è riconoscere che una data stringa di
byte restituita da msyql contenga proprio un oggetto
OpenGIS). comunque sembra che i dati in mysql siano in WKB
a meno di 4 leading zeroes e che un GeoTypes.WKBParser
associato ad una GeoTypes.OGGeoTypeFactory sia perfettamente
in grado di trasformare i dati mysql in oggetti GeoTypes.
la funzione che risolve il problema:
>>> def GeoFromMySQL(value):
... g = GeoTypes.OGGeoTypeFactory()
... p = GeoTypes.WKBParser(g)
... p.parseGeometry(value[4:])
... return g.getGeometry()
non so se la factory possa essere riutilizzata. purtroppo
il parser NON può esserlo.
Logged In: YES
user_id=512199
facciamo così: se inizializzo la libreria con un file di
inizializzazione e questo contiene opengismodule, tento di
riconoscere il modulo e in combinazione con il servermodule
provo a definire cosa fare con i dati in arrivo dal database.
la cosa dovrebbe funzionare alla perfezione con psycopg2.
solo che per il momento mi interessa l'interazione con
mysqldb... quindi è lì che mi concentro per il momento...
Logged In: YES
user_id=512199
5.54 python/ibo3/__init__.py
5.6 python/ibo3/defaults.py
5.11 python/ibo3/utils.py
ho aggiunto la funzione ibo3.registerOpenGisModule.
questa prende un solo parametro, il modulo OpenGIS, e prova
a registrare le funzioni di trasformazione dati, da e verso
il database.
per il momento fa solo la registrazione della funzione di
trasformazione DA database e solo se il modulo database è
MySQLdb.
oltre che a posteriori, usando la funzione sopra indicata,
il modulo può anche essere importato specificando nel file
di configurazione:
<opengismodule action="__import__">...</opengismodule>
poi mi sono trovato, ho cambiato un pezzettino di codice che
non c'entra niente. per la trasformazione della parte
decimale di una stringa in un intero rappresentante i
milionesimi. con meno operazioni costose...
Logged In: YES
user_id=512199
Originator: YES
la funzione aggiunta ha di buono solo il fatto che guarda se il modulo è MySQLdb, per il resto fa un casino immane!
MySQLdb usa un dizionario in cui ci sono le conversioni da utilizzare nei due sensi.
la documentazione del dizionario la trovi in MySQL-python-1.2.1_p2/doc/MySQLdb.txt