Menu

#217 OpenGIS fields

open
5
2006-10-04
2006-09-29
No

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))',)
>>>

Discussion

  • Mario Frasca

    Mario Frasca - 2006-10-04

    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.

     
  • Mario Frasca

    Mario Frasca - 2006-10-04
    • assigned_to: nobody --> mfrasca
     
  • Mario Frasca

    Mario Frasca - 2006-10-04

    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...

     
  • Mario Frasca

    Mario Frasca - 2006-10-04

    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...

     
  • Mario Frasca

    Mario Frasca - 2006-11-22

    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

     

Log in to post a comment.