Table of Contents
GDAL/OGR con supporto ad Oracle su Debian GNU/Linux
Questa ricetta serve a compilare la libreria GDAL/OGR con il supporto ad Oracle su una Debian Lenny.
Il supporto viene chiamato OCI (Oracle Call Interface) e viene fornito dal software Oracle Instantclient. Per la compilazione di GDAL è necessario anche il relativo Oracle Instantclient SDK.
I passaggo sono i seguenti:
- Trasformazione dei pacchetti rpm forniti da Oracle in pacchetti deb.
- Installazione di Oracle Instantclient e relativo SDK.
- Compilazione di gdal con supporto oci dai sorgenti Debian.
- Intallazione dei pacchetti compilati.
Installazione di Oracle Instantclient
Scaricare dalla pagina Oracle i seguenti archivi rpm:
- oracle-instantclient11.1-basiclite
- oracle-instantclient11.1-devel
Si tratta della libreria OCI vera e propria e dei file header per compilare programmi contro questa libreria.
Con alien
(pacchetto da installare) convertire i pacchetti .rpm in .deb, quindi installare i pacchetti .deb (per eseguire alien
come utente non privilegiato è possibile utilizzare fakeroot
):
alien oracle-instantclient11.1-basiclite-*.rpm alien oracle-instantclient11.1-devel-*.rpm dpkg -i oracle-instantclient11.1-*.deb
Con dpkg -L pacchetto
si scopre il percorso di installazione di libreria e header.
Aggiungere il path della libreria Oracle alla configurazione di ldconfig
e aggiornare la cache di ldconfig
:
echo /usr/lib/oracle/11.1/client/lib > /etc/ld.so.conf.d/oci.conf ldconfig
La conversione da rpm a deb non suggerisce le dipendenze, bisogna installare manualmente il pacchetto Debian libaio1:
apt-get install libaio1
Compilare GDAL/OGR come pacchetto Debian
Installare i pacchetti di sviluppo Debian, una selezione minima potrebbe essere:
- dpkg-dev
- build-essential
- fakeroot
Scaricare i sorgenti della libreria GDAL:
mkdir -p /usr/local/src/gdal cd /usr/local/src/gdal apt-get source gdal cd gdal-1.5.2
Modificare il file debian/rules
, in modo da includere nella fase di configure
anche le librerie OCI, in pratica oltre ai vari --with-mysql
, --with-pg
, --with-sqlite
si deve aggiungere due righe (attenzione a mettere anche il backslash a fine riga):
--with-oci-include=/usr/include/oracle/11.1/client \ --with-oci-lib=/usr/lib/oracle/11.1/client/lib \
Le Debian rules cercano la libreria Oracle nnz10 (almeno per gdal 1.5.2-3), mentre attualmente esiste la libreria nnz11; sistemare con un link simbolico:
ln -s libnnz11.so /usr/lib/oracle/11.1/client/lib/libnnz10.so
Infine lanciare la compilazione del pacchetto (l'opzione -rfakeroot
è richiesta solo se non si è utente root):
dpkg-buildpackage -rfakeroot
La libreria GDAL richiede la presenza di molte librerie e per la sua compilazione sono richiesti i rispettivi header file. Per fortuna dpkg-buildpackage
elenca tutti i pacchetti necessari (le build dependencies) non appena viene lanciato. Si deve provvedere ad installare tutti i pacchetti richiesti.
Al termine della compilazione, nella directory padre si trovano i pacchetti:
- gdal-bin
- libgdal1-1.5.0
- libgdal1-dev
- libgdal-doc
- libgdal-perl
- libgdal-ruby
- libgdal-ruby1.8
- python-gdal
Installazione e verifica
Si installano almeno i pacchetti gdal-bin
e libgdal1-1.5.0
. Conviene metterli on-hold per evitare che vengano aggiornati:
echo "libgdal1-1.5.0 hold" | dpkg --set-selections echo "gdal-bin hold" | dpkg --set-selections
Per verificare che la libreria installata abbia il supporto Oracle:
ldd /usr/lib/libgdal1.5.0.so | grep oracle ogrinfo --formats
Una layer OGR/Oracle su MapServer si ottiene con un mapfile del tipo:
LAYER NAME "aree_strada" STATUS DEFAULT TYPE POLYGON CONNECTIONTYPE OGR CONNECTION "OCI:username/passwd@192.168.1.122" DATA "tablename" CLASS COLOR 212 164 96 END END
La stringa di connessione è composta come segue:
OCI:username/passwd@host:port/service_name:tablename"
Il service_name
viene detto anche istanza nella terminologia Oracle. Il server Oracle risponde sulla porta 1521 TCP.
Un esempio di interrogazione SQL con ogrinfo
:
ogrinfo "OCI:username/passwd@host:port/service_name:tablename" \ -sql 'SELECT TOPONIMO_STRADA FROM REPLICA_TOPONOMASTICA.TOP_CIVICI'
Charset encoding
Per determinare il charset utilizzato dalla libreria OCI si imposta la variabile d'ambiente NLS_LANG
:
export NLS_LANG=italian_italy.UTF8
Tale configurazione è fondamentale ad esempio quando si importano dati da Oracle a PostgreSQL con ogr2ogr
e il charset originale non coincide con quello desiderato.
Per vedere il charset utilizzato da Orcale:
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
PARAMETER VALUE -------------------- ----------------- NLS_CHARACTERSET WE8ISO8859P1
È probabile che sia necessario impostare anche la variabile NLS_NUMERIC_CHARACTERS
che definisce il carattere separatore dei decimali e il carattere di raggruppamento delle migliaia (il punto decimale e la virgola per gli anglosassoni, la virgola decimale e il punto per l'Italia):
export NLS_NUMERIC_CHARACTERS=".,"
Per sapere quale convenzione utilizza Oracle è sufficiente fare il dump della tabella con ogrinfo
e visualizzare il contenuto:
ogrinfo 'OCI:username/password@hostname:port/instance:tablename' geom_feature > tablename.dump