Appunti su Oracle Spatial: introduzione

lunedì 3 settembre 2012 alle 03:17 | Pubblicato su 11g, Documentazione, Oracle Locator, Oracle Spatial | 1 commento
Tag: , , ,

Da qualche tempo sto cercando di studiare e approfondire una componente del database Oracle per me nuova: Oracle Spatial.

In realtà Oracle Spatial è una opzione del database che comprende un insieme abbastanza grande di funzionalità,  questo insieme estende una serie di funzionalità più ristrette che sono però incluse in una componente denominata Oracle Locator e parte della Standard Edition del database, quindi senza costi extra sulla licenza del database, a differenza di Spatial. Per quanto mi riguarda, a parte qualche isolata funzione, sono ancora allo studio delle funzionalità offerte gia con Oracle Locator e per assimilare meglio i concetti proverò a scrivere una serie di post in cui riporterò quello che ho appresso.

Oracle Locator comprende innanzi tutto la definizione di un tipo dato, chiamato SDO_GEOMETRY che serve per immagazzinare sul database, su normali tabelle HEAP, assieme ad altri dati di tipo semplice (numeri, date e stringhe) delle forme geometriche, partendo da cose semplici come punti, passando per linee spezzate (line strings) e arrivando a poligoni e collezioni di poligoni. Le tipologie di oggetti geometrici modellabili all’interno del tipo dato SDO_GEOMETRY pur non essendo tutte quelle possibili a questo mondo sono secondo me molte.

SDO_GEOMETRY è definito sul database come un tipo oggetto, qui c’è il riferimento alla documentazione ufficiale, come si può vedere SDO_GEOMETRY è un record composto a sua volta da numeri e altri oggetti che non sono altro che array ordinati di numeri (varray) in cui l’ordine segue delle regole ben precise. Riporto dal manuale la definizione di SDO_GEOMETRY:

CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES SDO_ORDINATE_ARRAY);

CREATE TYPE sdo_point_type AS OBJECT (
   X NUMBER,
   Y NUMBER,
   Z NUMBER);
CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;
CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;

Come ricordato sul manuale c’è un limite subito da notare dato dalla dimensione massima degli array che si riflette sul numero massime di coordinate per un oggetto memorizzabili. Tale limite sarà più chiaro dopo aver visto cosa devono contenere tali array.

Prima di passare alla descrizione dettagliata dell’oggetto SDO_GEOMETRY darò qualche altra indicazione. Innanzitutto, la definizione dell’oggetto SDO_GEOMETRY, assieme ad alcuni package contenenti programmi di utilità per la gestione di geometrie si trovano tutti su uno schema dedicato chiamato MDSYS. Oracle Locator viene installata con la componente denominata in ORacle 11gR2 “Multimedia”, in precedenza chiamata “InterMedia”, quindi installando la componente standard Multimedia viene installato anche locator, quindi viene creato lo schema MDSYS con la definizione di SDO_GEOMETRY e altri  package PL/SQL.  Lo schema MDSYS si chiama così perché alla sua introduzione, in Oracle 7.2, questa componente di chiamava Oracle MultiDimension, a sua volta il prefisso SDO usato per il nome dell’oggetto SDO_GEOMETRY deriva da nome dato alla componente: Oracle Spatial Data Option.

Vediamo ora nel dettaglio la definizione di SDO_GEOMETRY:

SDO_GTYPE

il primo elemento è un numero, con un struttura precisa che definisce il tipo  di oggetto geometrico, SDO_GTYPE ha la forma dltt dove:

  • d è un numero da 1 e 4 e indica quante dimensioni ha l’oggetto
  • l indica la dimensione che indica la misura in un sistema di riferimento lineare (LRS), vale quindi quando  è 3 o 4, spero che la mia traduzione sia corretta perché in realtà non ho ancora affrontato l’argomento LRS e quindi fin’ora ho analizzato solo geometrie con l=0
  • tt indica il tipo di geometria, sono stati definiti valori da 00 a 07, tutti gli altri sono riservati per usi futuri.

Quindi riassumento la tabellina riportata sul manuale e facendo l’ipotesi di lavorare con sole due dimensioni questi sono i possibili valori di SDO_GTYPE con il loro significato:

  1. 2000: UNKNOWN_GEOMETRY, geometria non considerata da Oracle Spatial
  2. 2001: POINT, punto semplice, quindi composto normalmente da due coordinate x,y
  3. 2002: LINE or CURVE, un segmento di retta o un arco di cerchio
  4. 2003: POLYGON, un poligono senza “buchi”, può essere un poligono come un quadrato, un pentagono o un poligono irregolare
  5. 2004:  COLLECTION,  un insiemete eterogeneo di oggetti gemetrici
  6. 2005: MULTIPOINT,  un insieme di punti
  7. 2006: MULTILINE or MULTICURVE, un insieme di segmenti di retta o di archi
  8. 2007: MULTIPOLYGON, insieme di poligoni disgiunti

Essendo io ancora agli inizi e avendo avuto qualche esempio pratico escludo mentalmente le tipologie oggetto dalla 4 in su, considerando quindi solo punti, linee e poligoni.

SDO_SRID

Questo numero indica il sistema spaziale di riferimento, l’argomento non è banale e non me la sento di parlarne qui, in sostanza però serve  a indicare il significato che hanno le coordinate (la misura di un angolo, com’è per le classiche coordinate geografiche, piuttosto che la distanza da un punto di riferimento)

SDO_POINT

è una struttura semplice, un record di 4 elementi numerici, usato nel caso la geometria da memorizzare  sia un punto, in questo caso è consigliabile usarlo, altrimenti viene lasciato a null

SDO_ELEMENT_INFO

Si tratta di un record di numeri che hanno il compito di indicare come interpretare le coordinate che vengono memorizzate nell’elemento successivo che sarà SDO_COORDINATES. SDO_ELEMENT_INFO contiene delle triplette (quindi minimo tre numeri) in cui ciascun numero ha il seguente significato:

  1. SDO_STARTING_OFFSET, indice del primo elemento dell’array delle coordinate (l’elemento SDO_COORDINATES) cui si riferisce
  2. SDO_ETYPE, indica il tipo dell’elemento, quindi fornisce informazioni di dettaglio che si aggiungono a quelle che gia abbiamo dall’elemento SDO_GTYPE; SDO_ETYPE assume valori 1,2,1003 o 2003 per elementi semplici, altri valori per elementi più complessi
  3. SDO_INTERPRETATION, in coppia con SDO_ETYPE contribuisce a descrivere l’elemento geometrico

Spiegare bene il significato di SDO_ETYPE e SDO_INTERPRETATION è complicato, conviene fare alcuni esempi di triplette, considero ora per semplicita SDO_STARTING_OFFSET sempre 1

  • (1,0,n): con n qualunque è un tipo non supportato da Oracle Spatial
  • (1,1,1) punto
  • (1,1,n) con n>1 cluster di punti
  • (1,2,1) line string connessa da segmenti di retta
  • (1,2,2) line string connessa da archi di cerchio
  • (1,1003,1)   poligono semplice i cui vertici sono connessi da segmenti di retta
  • (1,1003,2)  poligono i cui vertici sono connessi da archi di cerchio
  • (1,1003,3) rettangolo
  • (1,1003,4) cerchio
  • (1,4,n) n>1 “compound line string”, quindi direi una linea spezzata composta da un misto di segmenti di retta e archi di cerchio)

Vi sono anche altri casi, ma prima di approfondire conviene continuare e fare qualche esempio pratico.

SDO_COORDINATES

un semplice array di numero che contiene una sequenza di coordinate, da interpretare in base al contenuto di SDO_ELEM_INFO. Nel caso di due dimensioni le coordinate sono sempre coppie x,y, quindi nel caso di un segmento di retta potrebbe essere SDO_COORDINATES=(1,1,1,2) oppure SDO_COORDINATES=12.9805953, 46.2552841, 12.980599, 46.2553036) in questo caso ho usato coordinate geografiche con longitudine e latitudine.

Le prove che ho fatto io fin’ora per farmi un po’ un’idea sono in ambito geografico, quindi con oggetti geometrici che possono rappresentare limiti amministrativi di una regione, un comune o strade o fiumi e così vai, quindi ciò che ho visto sono prevalentemente punti, poligoni (pochi) ma soprattutto linee spezzate (chiamate line strings, non so se la mia traduzione in linee spezzate sia corretta). L’uso di archi di cerchio è complesso e nella maggior parte dei casi superfluo perché approssimabile bene con segmenti di retta.

Vediamo se con il prossimo post riesco a preparare qualche esempio pratico.

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. […] post introduttivo ad Oracle Spatial ho cominciato a spiegare cos’è questa componente del database Oracle, partendo da una […]


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: