-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



martedì 1 febbraio 2011

SCL da client

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, abbiamo la possibilità di specificare istruzioni in SCL (shape comparison language) per verificare relazioni spaziali fra geometrie. L'SCL è basato sul Calculus-Based Method (CBM) come specificato e definito da Clementini e Felice e con estensioni.
Questa funzionalità espone una funzionalità che già esiste a livello di ArcObjects tramite il metodo Relation dell'interfaccia IRelationalOperator.

Il CBM definisce le relazioni tra geometrie tramite l'intersezione tra l'interior, il boundary e l'exterior delle stesse considerando anche le dimensioni delle intersezioni. Le relazioni base che definisce sono Touch, Overlap, In, Cross, e Disjoint. SCL aggiunge anche l'Identical per verificare se due geometrie sono identiche e topologicamente corrette. Le geometrie trattate sono bidimensionali.

Occorre chiarire alcuni concetti accennati per utilizzare l'SCL.
Definizione delle dimensioni visto per le intersezioni:

- i punti hanno dimensione 0
- le linee hanno dimensione 1
- i poligoni hanno dimensione 2

Interior: la dimensione dell'interior della geometria è sempre quella della geometria stessa. Tutte le geometrie hanno 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. Ad esempio, la dimensione del boundary di una linea è 0 mentre quella del punto è –1 o NIL. Le linee e i poligoni hanno un boundary mentre i punti no. Il boundary di una linea sono gli endpoint di tutte le part che compongono la polilinea. Il boundary di un poligono sono le linee del confine.

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


L'estensione al CBM riguarda la possibilità di verificare se ci sono mancanze di integrità topologica ovverosia verificare se le intersezioni derivino al massimo solo da adiacenza.
In questo caso occorre utilizzare la funzione unaria:
TOPOFORM = TRUE
Test con REST API

SCL valuta se l'espressione è vera o falsa ad esclusione dell'istruzione dim che restituisce una dimensione.
Le espressioni possono essere composte da più asserzioni concatenate da operatori logici (AND OR, XOR) . SCL non è case-sensitive.
(g1 overlap g2 and dim (g2) = area) or (g2 cross g1 and dim (g2) = linear)
In questa espressione la dimensione di g2 deve essere un'area e g1 deve rispettare la relazione overlap con g2 oppure g2 deve essere una linea e g1 deve rispettare la relazione cross con g2.
g1 e g2 sono due parole riservate per indicare rispettivamente la geometria 1 e la geometria 2.

SCL utilizza costanti numeriche: TRUE, FALSE, POINT, LINEAR, AREA, NIL e NULL.
SCL non supporta variabili utente. NIL e NULL possono essere utilizzati per indicare una mancanza di uno specifico tipo di intersezione.


SCL consente di esprimere relazioni spaziali binarie sia come funzioni che come operazione tra due geometrie g1 e g2. g1 e g2 possono anche essere invertiti cross(g2,g1) = true.
Ad esempio l'espressione g1 cross g2 è equivalente all'espressione cross(g1,g2) = true oppure la negazione ovverosia non soddisfa la relazione di cross: g1 not cross g2 è equivalente a cross (g1, g2) = false  o cross (g1, g2) != true

In SCL la funzione dim ha due differenti utilizzi a seconda del numero degli argomenti passati. Se c'è un solo argomento restituisce la dimensione della geometria o della componente geometrica, ad esempio dim(g1) o dim(g1.boundary). Se ci sono due argomenti restituisce la dimensione dell'intersezione tra le due geometrie o componenti, ad esempio dim(g1,g2) o dim(g1.interior,g2.boundary)

I modificatori degli oggetti spaziali: boundary, interior, and exterior possono essere utilizzati nella forma:
<entità geometrica>.<modificatore> : esempio g1.boundary

Quindi con la prima forma, cioè con un solo argomento, possiamo verificare se sono vere o meno le seguenti espressioni:

dim (g1.interior) >= linear
dim (g1) = dim(g2)
dim (g1) >= dim(g2.interior)

mentre con due argomenti potremmo verificare le seguenti espressioni:

dim(g1.interior,g2) >= linear
dim(g1,g2) = dim(g2)
dim(g1.boundary,g2.boundary) > point

Alcune note da ricordare:

  • Le sette relazioni spaziali possono essere espresse come funzioni o relazioni. Ad esempio, TOUCH può essere espressa come relazione, G1 TOUCH G2, o come funzione, touch (g1,g2) = true.


  • La forma della funzione è  RelazioneSpaziale(EntitàGeometrica,EntitàGeometrica) simbolo di uguaglianza costante booleana .
    La forma della relazione è   EntitàGeometrica RelazioneSpaziale EntitàGeometrica

  • I requisiti alla base della logica delle relazioni TOUCH, CROSS, IN, CONTAIN, OVERLAP, e DISJOINT precludono l'uso dei modificatori; si possono utilizzare G1 o G2 come argomenti spaziali, mentre l'uso di modificatori ad esempio G1.BOUNDARY, non è consentito.

  • La relazione di intersect consente l'uso dei modificatori BOUNDARY, INTERIOR, ed EXTERIOR per gli argomenti spaziali G1 e G2.
g1.interior intersects g2.exterior and g1.boundary intersect g2

  • se la relazione è espressa come una funzione occorre compararla con le costanti true/false:
intersect (g1,g2) = true
Relazione spaziale TOUCH

Applicabile alle coppie di gruppi di tipi area/area, line/line, line/area, point/area, e point/line con i seguenti criteri:

La dimensione dell'intersezione tra G1 e G2 non è nulla.
La dimensione dell'intersezione tra G1.interior e G2.interior è nulla

G1 TOUCH G2 è quindi equivalente a dire che dim(g1.interior, g2.interior) = null and dim(g1,g2) != null

Tutte i seguenti esempi sono equivalenti (perchè ereditano sintassi da SCL e CBM):
G1 TOUCH G2
G1 TOUCHES G2
G1 =* G2
TOUCH (G1,G2) = TRUE
TOUCHES (G1,G2) = TRUE

Relazione spaziale CROSS

Applicabile alle coppie di gruppi di tipi line/line, line/area, point/area, e point/line con i seguenti criteri:

La dimensione dell'intersezione tra G1 e G2.exterior non è nulla.
La dimensione dell'intersezione tra G2 e G1.exterior non è nulla.

La dimension dell'intersezione G1.interior e G2.interior non è nulla ed è minore della dimensione di uno o entrambi di G1.interior e G2.interior.

G1 CROSS G2 equivale a dire: dim(g1.interior, g2.interior) != NIL and (dim(g1.interior, g2.interior) < dim(g1.interior) or dim(g1.interior, g2.interior) < dim(g2.interior)) and dim(g1, g2.exterior) != NIL and dim(g2, g1.exterior) != NIL.

Tutte i seguenti esempi sono equivalenti (perchè ereditano sintassi da SCL e CBM):
G1 CROSS G2
G1 CROSS G2
G1 =/ G2
CROSS (G1, G2) = TRUE
CROSSES (G1, G2) = TRUE

Relazione spaziale IN o CONTAIN


Applicabili a tutti i tipi di gruppi con i seguenti criteri:
L'intersezione delle due geometrie è uguale alla geometria definita come in o contenuta.

L'intersezione tra l'interior di due geometrie non è nullo.

G2 IN G1è equivalente a dire: dim (g2, g1.exterior) = null and dim (g1.interior, g2.interior) != null

Tutte i seguenti esempi sono equivalenti (perchè ereditano sintassi da SCL e CBM):

G1 IN G2
G1 INSIDE G2
G1 CONTAIN G2
G1 CONTAINS G2
G1 =@ G2
IN (G1, G2) = TRUE /* g1 contenuto da g2 */
INSIDE (G1, G2) = TRUE" /* g1 contenuto da g2 */
CONTAIN (G1, G2) = TRUE" /* g2 contenuto da g1 */
CONTAINS (G1, G2) = TRUE" /* g2 contenuto da g1 */

Relazione spaziale OVERLAP


Applicabile alle coppie di gruppi di tipi area/area, line/line, e point/point con i seguenti criteri:


La dimensione dell'intersezione tra G1 e G2.exterior non è nulla.

La dimensione dell'intersezione tra G2 e G1.exterior non è nulla.

La dimensione dell'intersezione tra gli interior delle due geometrie è uguale alla dimensione dell'interior di entrambe le geometrie.


G1 OVERLAP G2 è equivalente a dire: dim (g1) = dim (g2) and dim (g1) = dim (g1.interior, g2.interior) and dim (g1, g2.exterior) != NULL and dim (g2, g1.exterior) != NULL.

Tutte i seguenti esempi sono equivalenti (perchè ereditano sintassi da SCL e CBM):

G1 OVERLAP G2
G1 OVERLAPS G2
G1 =& G2
OVERLAP (G1, G2) = TRUE
OVERLAPS (G1, G2) = TRUE


Relazione spaziale IDENTICAL

Applicabile alle coppie di gruppi di tipi area/area, line/line, e point/point con i seguenti criteri:


L'intersezione tra le due geometrie è uguale ad ogni geometria
L'integrità topologica esiste tra le due geometrie ("topoform").

G1 IDENTICAL G2 equivale a dire: dim (g1) = dim (g2) and dim (g1,g2.exterior) = null and dim (g2,g1.exterior) = null and topoform = true.

L'espressione G1 contains G2 and G2 contains G1 può essere vera dove c'è una mancanza di integrità topologica; pertanto l'espressione G1 identical G2 potrebbe essere falsa, quindi occorre anche che ci sia topoform=true

Tutte i seguenti esempi sono equivalenti (perchè ereditano sintassi da SCL e CBM):

G1 IDENTICAL G2
G1 = G2
G1 == G2
IDENTICAL (G1, G2) = TRUE

Relazione spaziale DISJOINT

Applicabili a tutti i tipi di gruppi con i seguenti criteri:


L'intersezione tra G1 e G2 è nulla.

G1 DISJOINT G2 equivale a dire  dim (g1, g2) = NULL

Tutte i seguenti esempi sono equivalenti (perchè ereditano sintassi da SCL e CBM):

G1 DISJOINT G2
G1 =! G2
DISJOINT (G1, G2) = TRUE



Relazione spaziale INTERSECT

Applicabile a tutti i tipi di gruppi . La relazione INTERSECT consente l'utilizzo di modificatori con i suoi argomenti spaziali. I modificatori sono BOUNDARY, INTERIOR, e EXTERIOR con i seguenti criteri:

Valuta a TRUE se la dimensione della specificata intersezione non è nulla.

G1 INTERSECT G2 equivale a dire  dim (g1, g2) != NULL.


Alcuni esempi:
G1 INTERSECT G2.BOUNDARY
G1 =? G2
INTERSECT (G1.INTERIOR, G2.INTERIOR) = TRUE

Funzione spaziale 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 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

Nel precedente esempio, le relazioni 1,2,3 devono essere false, le relazioni 4,5,6 devono essere vere e le 7,8,9 non sono testate. Il criterio è vero se la dimensione dell'intersezioni non è nulla. Questa funzione può anche verificare la dimensione dell'intersezione.
relate(g2,g1,'2********')
In quest'ultimo caso verifichiamo che l'intersezione degli interior delle due entità geometriche sia di dimensioni pari a 2.

Gli exterior delle due geometrie si intersecano sempre ed hanno dimensione 2 cioè AREA

Ad esempio vogliamo che gli interior di due geometrie si intersechino:
relate (g1, g2, 'T********')

Qui potete fare dei test online
Una volta disegnate le due geometrie da confrontare (una verrà disegnata in rosso ed una in verde), se il test ha successo, verranno colorate entrambe in blu. Un messaggio/warning toaster vi avvertirà sul test.
Prendiamo ad esempio l'ultimo esempio e disegnamo due poligoni.




Inseriamo la nostra espressione SCL da verificare e clicchiamo sul button 'check relation'



In questo caso, poichè gli interior delle due geometrie che abbiamo disegnato si intersecano, il test ha avuto esito positivo e quindi le due geometrie vengono colorate in blu con un messaggio in basso a destra.


Per i test potete utilizzare anche le REST API ESRI

Parole chiave e operatori di SCL
 
AND
AREA
BOUNDARY
CONTAIN
CONTAINS
CROSS
CROSSES
DIM
DISJOINT
EQUAL
EQUALS
EXTERIOR
FALSE
G1
G2
IDENTICAL
IN
INSIDE
INTERIOR
INTERSECT
INTERSECTS
INTERSECTION
LINEAR
NIL
NOT
NULL
OR
OVERLAP
OVERLAPS
POINT
TOPOFORM
TOUCH
TOUCHES
TRUE
XOR

Operatori di uguaglianza
=  come IDENTICAL
== come IDENTICAL
!=  è il non IDENTICAL



Operatori spaziali
Questi operatori possono essere utilizzati al posto delle attuali parole adoperate per le relazioni spaziali in espressioni di relazioni spaziali  (non funzioni):

=! operatore DISJOINT

=& operatore OVERLAP

=@ operatore  IN

=* operatore TOUCH

=/ operatore CROSS

=? operatore INTERSECT

In pratica l'espressione G1 =? G2 equivale a  G1 INTERSECT G2.