Topologicamente…REST

La topologia (che ricordiamo si occupa della proprietà di relazione
spaziale degli oggetti trascurando la quantificazione di distanza e misure1)
è una scienza molto conosciuta a livello di GIS fin dai tempi di ArcINFO.

Le relazioni topologiche Touch, Overlap, In (o Contain), Cross, Disjoint
possono essere definite usando il linguaggio SCL (Shape Comparison Language)
che è basato su CBM (Calculus Based Method) come definito da Clementini e Di Felice.

Il CBM definisce la relazione delle geometrie dall’intersezione tra il confine (boundary), l’interno (interior) e l’esterno (exterior) delle geometrie stesse,
prendendo in considerazione la dimensionalità dell’intersezione.

Le relazioni che prende in considerazione sono:
Touch, Overlap, In (o Contain), Cross, Disjoint. SCL aggiunge anche l’Identical per verificare se due geometrie sono identiche e topologicamente corrette.

Si ricordano alcuni concetti di base per utilizzare SCL:
- la dimensionalità è 0 per i punti,
- 1 per le linee;
- 2 per le aree.

In pratica con il CBM, date due geometrie piane, è possibile
rispondere a tutte le domande relative alle relazioni topologiche.

ESEMPIO:
Le geometrie g1 e g2 sono adiacenti? Che significa: l’intersezione
di G1 con G2 è di tipo Touch? touch (g1,g2). Oppure la dimensione dell’intersezione
tra G1 e G2 è una linea? (dimensione =1), in SCL si scrive dim (G1,G2) = linear


Interior: L’interior di una geometria è definito dall’intera geometria ad esclusione
del suo boundary.

Boundary: la dimensione del boundary della geometria è sempre quello della geometria meno 1.

Exterior: l’exterior di qualunque geometria ha sempre dimensione 2. Tutte le geometrie hanno un exterior.

La Sintassi SCL
L’SCL è usato come linguaggio per descrivere la relazione tra 2 forme. Le espressioni SCL restituiscono vero o falso, ad esclusione dell’istruzione dim che restituisce una dimensione.
Esempio:
G1 TOUCH G2 lo statement restituisce vero se la forma G1 tocca la forma G2.
dim (G1) restituirà 0, 1 o 2 a secondo della dimensionalità della geometria

G1 e G2 sono parole riservate che riferiscono allo shape #1 e Shape#2
Le espressioni possono essere, anche, composte da più asserzioni concatenate
da operatori logici (AND OR, XOR).
(g1 overlap g2 and dim (g2) = area) or (g2 cross g1 and dim (g2) = linear)

E’ da notare che la funzione dim ha differenti utilizzi a seconsa del numero
di parametri passati. Se c’è un solo argomento restituisce la dimensione della
geometria o del componente (es. g1.boundary) se invece vengono passati 2 argomenti restituisce la dimensione dell’intersezione tre le due geometrie.
Esempio dim (g1,g2) >linear (ovvero restituisce vero se l’intersezione tra
g1 e g2 è più grande della dimensionalità di una linea quindi è un’area).

Un’ultima nota le relazioni possono essere espresse come espressioni:
 - G1 TOUCH G2 
 oppure come funzioni
  - touch (G1,G2) = true

Oltre alle funzioni viste sopra: touch, overlap, In, etc… è importante
analizzare la funzione RELATE.
La funzione RELATE è supportata come funzione unaria per verificare l’intero array 9IM. L’array 9IM ha nove elementi da comparare - tre elementi di una geometria con tre elementi di un’altra geometria. Questi elementi sono boundary, interior, e exterior.
Ogni elemento della prima geometria (G1) può essere verificato con ogni elemento della seconda (G2) per verificare se è vero o falso. Gli elementi dell’array possono essere anche ignorati perchè non rilevanti ai fini del test che occorre fare.
Questo è un esempio della sintassi della funzione RELATE:
RELATE (G1, G2, ‘FFFTTT***’)
RELATE è una funzione unaria quindi non è confrontata con un true/false.

Nell’esempio illustrato si confrontano le geometrie G1 e G2. La stringa ‘FFFTTT***’, delimitata da singoli apici, è utilizzata per specificare se l’intersezione (INTERSECT) di ogni elemento della matrice 9IM è vero (T), false (F) o non testato (*) perchè non rilevante ai fini del test.

Ci sono esattamente nove elementi nella stringa, i quali corrispondono a partire da sinistra verso destra alle seguenti nove
relazioni:
1 G1.interior G2.interior
2 G1.interior G2.boundary
3 G1.interior G2.exterior
4 G1.boundary G2.interior
5 G1.boundary G2.boundary
6 G1.boundary G2.exterior
7 G1.exterior G2.interior
8 G1.exterior G2.boundary
9 G1.exterior G2.exterior

Se scriviamo relate (g1, g2, ‘F*T******’)
Significa che verifico che sia Falsa l’intersezione tra gli interior delle 2 figure
mentre sia vera l’intersezione tra interno di G1 ed esterno di G2, ciò significa che i 2 poligoni non si devono toccare.

Se scriviamo relate (g1,g2, ‘FFFFT****’)
Si vuole verificare che la figura g1 tocchi la figura g2.
 
Si ma tutto questo come è applicabile?
Semplice dalla versione 2.0 di ESRI Javascript API (funzionalità comunque presenti anche in Silverlight API e Flex) e come REST API da ArcGIS Server 9.3.1, vi è la possibilità di specificare istruzioni in SCL (shape comparison language) per verificare relazioni spaziali fra geometrie.

Vi segnalo anche un esempio molto esplicativo del MITICO NICOGIS. Nell’esempio dopo aver disegnato le due geometrie è possibile scrivere la relazione nella textbox RELATION e verificare se restituisce true (geometrie disegnate di blu) oppure non cambiano colore (false).

Se disegnamo due geometrie che si intersecano e nel campo RELATION scriviamo:relate (g1,g2, ‘T********’) dopo la verifica vediamo che verranno colorate di blu perchè gli interior delle due si intersecano.

Ve gusta? ;-)