# Geography Markup Language

Il Geography Markup Language (GML) è la grammatica XML definita dall'Open Geospatial Consortium (OGC) per esprimere oggetti geografici. GML serve come linguaggio di modellazione per sistemi geografici ma anche come un formato aperto di interscambio per transazioni geografiche via Internet.

## Standard

L'OGC è un'organizzazione internazionale di standardizzazione i cui membri, volontari, mantengono tra gli altri lo standard GML. L'OGC si coordina con le organizzazioni delineanti gli standard ISO/TC211 per mantenere la consistenza tra i suoi standard e quelli ISO.
GML è diventato standard ISO 19136 nell'agosto 2007.
GML è il formato standard di infrastrutture di dati territoriali (vedi GeoWeb Archiviato il 28 febbraio 2007 in Internet Archive.) che abilitano le periferiche connesse via internet all'accesso a informazioni geografiche, incluse ad esempio posizione di veicoli e condizioni del traffico, oppure situazioni meteorologiche ecc.
GML è stato incluso, in versione 1.0, nel Modello Nazionale Scambio di Informazioni USA.

## Modello GML

Il modello originale GML era basato sul Resource Description Framework (RDF), definito dal World Wide Web Consortium. Successivamente l'OGC introdusse lo XML Schema nella struttura GML, per facilitare la connessione con le varie esistenti basi dati geografiche le cui strutture relazionali sono ben definite da XML. Il GML risultante mantiene molte caratteristiche di RDF, compresi molti dei tipi di oggetti primitivi in GML 3.0:
* oggetti e geometrie;
* sistema di coordinate di riferimento;
* data e ora;
* oggetto dinamico;
* copertura (incluse immagini raster);
* unità di misura;
* stile e graficismo.

### Profilo

I Profili sono restrizioni logiche al GML che possono essere espresse da un documento, un XML Schema o ambedue. Questi profili sono stati definiti per semplificare l'adozione del GML e facilitare l'adozione dello standard.
Questi Profili sono definiti dalle specifiche GML, proposti per un utilizzo pubblico:
* il Point Profile per applicazioni con un dataset puntiforme, senza bisogno della grammatica completa GML;
* il GML Simple Features profile che supporta richieste e transazioni di semplici oggetti vettoriali, per esempio attraverso un WFS;
* un profilo per GMJP2 (GML in Jpeg 2000);
* un profilo GML per RSS.
I Profili sono differenti dagli application schemas e dai namespaces GML (Open GIS GML), essi definiscono un sottoinsieme di dati GML. Gli Application schemas sono vocabolari XML definiti usando GML e che sussistono in un namespace definito dall'applicazione. Gli Application schemas possono essere costruiti su Profili specifici o usati su tutto il dominio GML.
Spesso i Profili sono creati come supporto per i linguaggi derivati dal GML (vedi application schemas) creati per particolari applicazioni quali aviazione commerciale, cartografia nautica, sfruttamento di risorse.
Le specifiche GML (a partire dalla versione 3.0) contengono due script XSLT (i "subset tools") che vengono usati per costruire profili GML.

#### GML Simple Features Profile

Il GML Simple Features Profile comprende un ampio raggio di oggetti vettoriali, inclusi:
* un modello geometrico ridotto che consente oggetti geometrici a zero, 1 e 2 dimensioni e i corrispondenti aggregati (gml:MultiPoint, gml:MultiCurve, ecc.);
* un modello di oggetto che può avere una profondità di un solo livello (in generale il modello GML non permette annidamenti arbitrari di oggetti e proprietà di essi);
* tutte le proprietà non geometriche devono essere semplici schemi XML - non devono cioè contenere elementi annidati;
* riferimenti a proprietà remote (xlink:href) così come nelle specifiche GML.
Dato che l'obiettivo è di fornire un semplice ingresso, il profilo non fornisce supporto per:
* riempimenti
* topologia
* punti di visuale
* valori da dati in tempo reale
* oggetti dinamici
ciò nonostante si adatta a una buona varietà di problemi cartografici.

#### Subset tool

Le specifiche GML forniscono anche un subset tool per generare un profilo GML contenente una lista di componenti specificata dall'utente. Questo strumento consiste in una coppia di scripts XSLT. Gli scripts generano un profilo che lo sviluppatore può sviluppare manualmente o attraverso restrizioni dello schema. Si noti che come limitazioni della specifica GML completa, gli schemi che un profilo può generare sono essi stessi schemi validi di applicazione di GML.

### Application schema

Per pubblicare i dati geografici di un'applicazione con GML, un'organizzazione crea uno schema XML specifico all'applicazione (l'application schema). Questo schema descrive i tipi di oggetti e dati che l'applicazione deve pubblicare. Per esempio, un'applicazione per il turismo deve definire tipi di oggetti quali monumenti, punti di interesse, musei, uscite autostradali e punti panoramici nel suo application schema. Questi tipi di oggetti a loro volta referenziano le primitive definite nel GML standard.
Una lista di GML Application Schemas pubblici è in corso di compilazione.
Alcuni altri linguaggi per geografia usano costrutti come gli Application schemas, ma GML li costruisce sull'esistente schema XML anziché crearne di nuovi, indirizzo intrapreso da linguaggi tipo XML quale il KML di Google.

### Geometrie GML

GML codifica le geometrie GML o caratteristiche geometriche degli oggetti geografici come elementi interni un documento GML. Le geometrie di questi oggetti possono descrivere, per esempio, strade, fiumi, ponti...
Le chiavi GML per i tipi geometrici di oggetti, in GML 1.0 e 2.0 sono:
* Points
* LineString
* Polygon
Si noti come questi modelli di geometria siano identici ai modelli geometrici KML.

### Feature

GML definisce feature un oggetto distinto da un oggetto geometrico. Una feature è un oggetto dell'applicazione che rappresenta un'entità fisica, p.e. un edificio, un fiume, una persona. Una feature può anche non avere un aspetto geometrico. Un oggetto geometrico definisce una locazione o una regione piuttosto che una entità fisica. Questa distinzione contrasta con i modelli usati in certi GIS, che non la applicano considerando feature e oggetto geometrico alla stessa stregua.
In GML una feature può avere varie proprietà geometriche che descrivono aspetto e caratteristiche (per esempio Punto o estensione). GML altresì fornisce la capacità per le features di condividere una geometria usando la remote property reference sulla proprietà geometria. Le remote properties sono un carattere generale di GML preso in prestito da RDF. Un attributo xlink:href sulla proprietà significa che il valore della proprietà risiede nella destinazione di un link.
Per esempio, una feature Edificio in una particolare application schema GML può avere una posizione data dall'oggetto primitivo Punto, tuttavia l'edificio è una entità separata dal punto che ne definisce la posizione. Ancora, una feature può avere diverse proprietà geometria (o anche nessuna), per esempio una posizione, un rettangolo contenente (extent), una forma.

### Coordinate

Le Coordinates in GML rappresentano le coordinate dell'oggetto geometrico. Le Coordinates possono essere specificate dai tags:
* <gml:coordinates>
* <gml:pos>
* <gml:posList>
GML ha più modi di rappresentare coordinate. Per esempio il tag <gml:coordinates> può essere usato come segue:
Si noti come le singole coordinate non sono accessibili attraverso il DOM XML perché il contenuto del tag <gml:coordinates> è una singola stringa.
Affinché le coordinate GML siano accessibili attraverso il DOM XML, GML 3.0 ha introdotto i tags <gml:pos> e <gml:posList> (si noti come il tag <gml:coord> di GML 1.0 e 2.0 sia ora obsoleto). Usando <gml:pos> anziché <gml:coordinates> lo stesso punto sarà espresso come:
(per informazioni su srsName vedi paragrafo Sistema di coordinate di riferimento) Le coordinate di una geometria <gml:LineString> possono essere rappresentate dall'elemento <gml:coordinates>:
Il tag <gml:posList> è usato per rappresentare una lista di tuple di coordinate, come richiesto dalle geometrie lineari:
Per i server GML (WFS) e strumenti di conversione che supportano solo GML 1 o 2 non ci sono alternative a <gml:coordinates>. Per GML 3 o superiore <gml:pos> e <gml:posList> sono preferibili a <gml:coordinates>.

### Sistema di coordinate di riferimento

Un Sistema di coordinate di riferimento (Coordinate Reference System, CRS) determina quale sistema proiettivo di riferimento è stato scelto per rappresentare le coordinate delle geometrie di ogni elemento in un dataset GML.
Contrariamente al KML o al GeoRSS (versione simple), GML non assume un singolo, fissato sistema di riferimento: ogni sistema di coordinate deve essere specificato con un Coordinate Reference System. Gli elementi le cui coordinate vengono interpretate con un CRS sono
* <gml:coordinates>
* <gml:pos>
* <gml:posList>
Un attributo srsName allegato alla geometria specifica il CRS; per esempio:
Il valore dell'attributo srsName è un Uniform Resource Identifier (URI); esso si riferisce alla definizione di Sistema di Coordinate di Riferimento usato per interpretare le coordinate della geometria. La definizione CRS deve essere contenuta in un documento (un flat file) o in un servizio web online.
L'URI srsName può anche essere un Uniform Resource Name (URN) per riferirsi a una definizione CRS comune. OGC ha sviluppato una struttura URN e ha definito URN specifici per codificare alcuni sistemi di riferimento comuni. Un resolver URN restituisce da questi URN una definizione GML per ogni CRS.

## Esempi

Oggetti Poligoni, Punti, e LineString sono codificati in GML 1.0 e 2.0 come segue:
Si noti come oggetti LineString, come anche i LinearRing, sono interpolazioni lineari tra punti specificati.

### Features usando geometrie

Il seguente esempio illustra la distinzione tra feature e oggetto geometrico. La feature Edificio ha diversi oggetti geometrici, e condivide uno di essi, il Punto con identificatore p21 con la feature Monumento
Si noti che il riferimento è verso il Punto condiviso e non verso il Monumento, dato che ogni feature può avere più di una proprietà oggetto geometrico.

### Profilo Punto

Il GML Profilo Punto contiene una singola geometria GML, nominalmente un oggetto tipo <gml:Point>. Ogni schema XML può usare il profilo importandolo e referenziando l'istanza del <gml:Point>:
Si noti come usando il Profilo Punto, la sola geometria usate è <gml:Point>. Il resto della geografia è definito dallo schema photo-collection.