Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
COORDINATE SU
GOOGLE MAPS
INTRODUZIONE
L’obiettivo di questo programma è quello di costruire un sistema di trasformazione delle coordinate
che funzioni su un qualsiasi browser di qualsiasi sistema operativo.
La parte innovativa e interessante è l’integrazione con le Google Maps, uno dei sistemi interattivi per
la navigazione nelle mappe del mondo più in voga in questi tempi. Il vantaggio
vantaggio nell’utilizzo delle
Google Maps sta nell’avere a disposizione un sistema già pronto per la visualizzazione delle mappe
con le seguenti caratteristiche:
• visualizzazione delle mappe stradali, satellitari e ibride
• 20 livelli di zoom (accessibili anche tramite la rotella del mouse)
• vasta disponibilità di API (funzioni di libreria) con cui poter interagire
• possibilità di fissare marcatori e layer aggiuntivi sulla mappa
• costante aggiornamento delle funzionalità da parte di Google
• portabilità: funziona in tutti
utti i sistemi operativi con quasi tutti i browser moderni
• efficienza: il sistema di visualizzazione è veloce e le mappe vengono scaricate solo per le zone
effettivamente visualizzate
Le funzionalità che si vogliono implementare sono due:
1. Conversione delle coordinate di punti prefissati (latitudine, longitudine, altitudine) con
visualizzazione delle coordinate tramite un marcatore nelle Google Maps.
2. Possibilità di poter spostare il marcatore trascinandolo con il mouse con rilevamente delle
coordinate e conversione
ersione delle stesse in automatico.
Pagina 1
Trasformazione
one coordinate su Google Maps
Esempio: il marcatore rosso viene trascinato dal mouse, al momento del rilascio vengono visualizzate
le coordinate WGS84 e UTM appena calcolate
La conversione è dalle coordinate geodetiche WGS84 alle coordinate cartesiane UTM passando
attraverso le coordinate ellissoidiche ED50;
ED50; viene effettuata utilizzando le formule di Molodenski
Molodenskij e
di Gauss.
CARATTERISTICHE TECNICHE
TECNICHE DEL PROGRAMMA
Il programma è realizzato in Javascript, pertanto gira all’interno di una pagina web visualizzata in un
browser. Javascript
ascript è un linguaggio di scripting interpretato molto potente e standard, supportato da
diverse compagnie nel mondo e certificato dalle ECMA.
Browser supportati:
• Microsoft Internet Explorer 6, 7
• Mozilla Firefox 1.5, 2.0
• Safari
Dispositivi hardware supportato:
• Personal Computer con qualsiasi sistema operativo
• PDA, cellulare e altri dispositivi provvisti delle funzionalità per navigare in internet avanzate
Bisogna inoltre ricordare che le nuove tecnologie hanno portato questi browser all’interno di
numerosi dispositivi portatili (PDA, cellulari, ecc), pertanto la maggior parte di questi dispositivi che
sono in grado di navigare in internet dovrebbero essere in grado di eseguire il programma della
conversione.
Javascript è un linguaggio interpretato, pertanto non permette il raggiungimento delle prestazioni
ottimali della macchina, tuttavia la velocità di esecuzione in questo caso è completamente
soddisfacente, e permette un utilizzo completo in real
real-time.
Pagina 2
Trasformazione coordinate su Google Maps
I SISTEMI DI COORDINATE
WGS84
World Geodetic System 1984: è il sistema di riferimento utilizzato nel posizionamento con la
tecnologia GPS. E’ espresso tramite le coordinate geodetiche X,Y,Z, riferite all’ellissoide di rotazione
geocentrico.
• l’asse Z è diretto verso la posizione del polo medio definito nel 1984
• l’asse X è definito dall’intersezione del piano equatoriale medio nel 1984 con il meridiano di
Greenwich
• l’asse Y è definito in modo tale da completare la terna destrorsa
UTM
Universal Transverse Mercator: è la cartografia più diffusa al mondo, nota anche come Gauss-Boaga.
Questa proiezione è approssimata notevolmente dalla cilindrica trasversa inversa. Questo tipo di
cartografia è conforme. Le trasformate del meridiano centrale (di tangenza) e dell’Equatore sono
rette e rappresentano gli assi del sistema di riferimento (N e E).
Poiché più ci si allontana dal meridiano centrale più il modulo di deformazione lineare sale, nel
sistema UTM l’ampiezza di un fuso è di 6°, il sistema risulta essere quindi policilindrico. Ogni fuso ha
un sistema N,E indipendente. Viene inoltre applicato alle coordinate un coefficiente di contrazione di
0,9996 per ridurre le deformazioni. Infine all’origine delle ascisse viene applicata una falsa origine di
500000 m, per evitare valori negativi di E. Il riferimento geodetico è basato sull’ellissoide
internazionale con orientamento europeo (ED50), cioè orientato a Postdam.
LE FORMULE DI TRASFORMAZIONE
La trasformazione delle coordinate avviene in due passi, utilizzando due funzioni diverse. La prima
converte le coordinate ellissoidiche WGS84 in coordinate ellissoidiche ED50 usando le formule di
Molodenskij; la seconda converte le coordinate ellissoidiche ED50 in coordinate piane UTM usando le
formule di Gauss adatte a questo scopo.
Le formule di Molodenskij
Le formule di Molodenskij complete sono le seguenti:
Pagina 3
Trasformazione coordinate su Google Maps
dove:
a Semiasse equatoriale dell’ellissoide WGS84
e2 Eccentricità dell’ellissoide WGS84
ρ Raggio di curvatura del meridiano
NG Gran normale
x0, y0, z0 Traslazioni fra i centri del sistema WGS84 e ED50
Ex, Ey, Ez Rotazioni attorno agli assi dell’ellissoide ED50
K Fattore di scala
da Differenza tra semiasse maggiore WGS84 e ED50
dα Differenza tra schiacciamento WGS84 e ED50
φ, λ, h Coordinate ellissoidiche WGS84
Siccome non ci sono rotazioni tra l’ellissoide WGS84 e l’ellissoide ED50 e non ci sono variazioni del
fattore di scala, allora le componenti di rotazione Ex, Ey, Ez e il fattore di scala K sono pari a zero.
Questo ridurrebbe le formule di Molodenskij a:
Nel programma sono state codificate le formule complete, non quelle semplificate, pertanto esso si
presterebbe anche ad effettuare conversioni tra altri ellissoidi oltre a quelli utilizzati in questo caso.
In specifico si potrebbe utilizzare il programma anche per la conversione a ITA40, che effettua pure
rotazioni e riscalamento.
Le formule di Gauss
La seconda funzione calcola le coordinate piane a partire da quelle ellissoidiche utilizzando le
seguenti formule di Gauss:
Pagina 4
Trasformazione coordinate su Google Maps
dove:
a Semiasse equatoriale dell’ellissoide ED50
e2 Eccentricità dell’ellissoide ED50
φ, λ Coordinate ellissoidiche ED50
LE CLASSI
Il software è basato sulla programmazione ad oggetti (OOP) e presenta le seguenti classi:
• DegreesConverter
Serve a convertire da gradi decimali a radianti e viceversa, e da gradi sessagesimali a gradi
decimali, e viceversa.
• MapPoint
Oggetto che rappresenta un punto descritto tramite coordinate ellissoidiche. Il punto può
essere definito usando i gradi sessagesimali, decimali o radianti. Dopo la definizione in
automatico vengono calcolate le coordinate negli altri sistemi di misura.
• RotationElipsoid
Oggetto che rappresenta un ellissoide di rotazione orientato nello spazio. L’inizializzazione
avviente passando i valori del semiasse maggiore e l’inverso dello schiacciamento. Tutte le
altre caratteristiche dell’ellissoide vengono calcolate automaticamente. Fornisce i metodi per
calcolare il rapporto di curvatura e la gran normale, dato un punto. Viene inoltre passato
come parametro l’orientamento dell’ellissoide.
• Integral
Questa classe statica riceve in ingresso il delegato della funzione da integrare e il suo
contesto (scope), gli estremi dell’intervallo di integrazione e il numero di passi in cui fare il
calcolo dell’integrale (da poche decine a diversi milioni, a seconda della precisione voluta). Il
metodo di integrazione numerica è quello dei trapezi.
• MolodenskijConverter
Si occupa della trasformazione delle coordinate ellissoidiche da WGS84 a UTM. Viene
inizializzata passando come parametri i due oggetti che rappresentano gli ellissoidi di
rotazione di partenza e di arrivo.
• GaussConverter
Si occupa della trasformazione delle coordinate ellissoidiche ED50 in coordinate cartesiane
UTM. Viene inizializzata passando l’ellissoide e le coordinate del punto. Questa classe
effettua il calcolo integrale.
Altre classi di supporto completano il programma, fornendo utilità di I/O, controllo errori,
compatibilità con le Google Maps, ecc.
Pagina 5
Trasformazione coordinate su Google Maps
Pagina 6
Trasformazione coordinate su Google Maps
Sono riportati in tabella i dati delle coordinate WGS84 espresse in gradi, primi, secondi, i dati UTM in
metri forniti come riferimento e i dati UTM espressi in metri calcolati dal programma.
Pagina 7
Trasformazione coordinate su Google Maps
CODICI SORGENTI
DegreesConverter
function DegreesConverter() {
this.className = "DegreesConverter";
this.pi = Math.PI;
this.degreesToRadians = function(degree) {
return this.de_ra(this.de60_de10(degree));
}
this.radiansToDegrees = function(radians) {
return this.de10_de60(this.ra_de(radians));
}
this.de60_de10 = function(degree60) {
return degree60.degrees + degree60.minutes / 60 + degree60.seconds / 3600;
}
this.de10_de60 = function(degree10) {
var myDegrees = Math.floor(degree10);
var myMinutes = (degree10 - myDegrees) * 60;
var mySeconds = (myMinutes - Math.floor(myMinutes)) * 60;
return {degrees: myDegrees, minutes: Math.floor(myMinutes), seconds: mySeconds };
}
this.ra_de = function(radian) {
return radian*(180/this.pi);
}
this.de_ra = function(degree10) {
return degree10*(this.pi/180);
}
}
MapPoint
function MapPoint(myPoint) {
Pagina 8
Trasformazione coordinate su Google Maps
this.className = "MapPoint";
this.degrees = {};
this.decimals = {};
this.radians = {};
var c = new DegreesConverter();
if (myPoint.degrees) {
this.degrees = myPoint.degrees;
this.radians.latitude = c.degreesToRadians(this.degrees.latitude);
this.radians.longitude = c.degreesToRadians(this.degrees.longitude);
this.decimals.latitude = c.de60_de10(this.degrees.latitude);
this.decimals.longitude = c.de60_de10(this.degrees.longitude);
} else if (myPoint.radians) {
this.radians = myPoint.radians;
this.degrees.latitude = c.radiansToDegrees(this.radians.latitude);
this.degrees.longitude = c.radiansToDegrees(this.radians.longitude);
this.decimals.latitude = c.ra_de(this.degrees.latitude);
this.decimals.longitude = c.ra_de(this.degrees.longitude);
} else if (myPoint.decimals) {
this.decimals = myPoint.decimals;
this.radians.latitude = c.de_ra(this.decimals.latitude);
this.radians.longitude = c.de_ra(this.decimals.longitude);
this.degrees.latitude = c.radiansToDegrees(this.radians.latitude);
this.degrees.longitude = c.radiansToDegrees(this.radians.longitude);
} else {
alert("Eccezione: non sono state impostate le coordinate geodetiche " +
this.className);
return false;
}
this.altitude = myPoint.altitude;
}
RotationElipsoid
function RotationElipsoid(semimajor, invertF, orientation) {
this.className = "RotationElipsoid";
this.orientation = orientation;
this.semimajor = semimajor;
this.flattening = 1/invertF;
this.semiminor = this.semimajor - this.semimajor * this.flattening;
this.e2 = (Math.pow(this.semimajor,2) - Math.pow(this.semiminor,2)) /
Math.pow(this.semimajor,2);
//this.semiminor = Math.sqrt(Math.pow(this.semimajor,2) - e2 * Math.pow(this.semimajor,2));
//this.flattening = (this.semimajor - this.semiminor) / this.semimajor;
this.CurvationRatio = function(myPoint) {
var e2 = this.e2;
return this.semimajor * (1 - e2) / Math.sqrt(Math.pow(1 - e2 *
Math.pow(Math.sin(myPoint.radians.latitude),2),3));
}
this.GrandNormal = function(myPoint) {
var e2 = this.e2;
return this.semimajor / Math.sqrt(1 - e2 *
Math.pow(Math.sin(myPoint.radians.latitude),2));
}
}
Pagina 9
Trasformazione coordinate su Google Maps
Integral
function Integral(myFunction, scope, begin, end, parts) {
this.className = "Integral";
if (!begin) { begin = 0; }
if (!end) { end = 1; }
if (!parts) { parts = 1; }
MolodenskijConverter
function MolodenskijConverter(fromSurface, toSurface) {
this.className = "MolodenskijConverter";
fromOrientation = fromSurface.orientation;
toOrientation = toSurface.orientation;
this.deltaSemiMajor = fromSurface.semimajor - toSurface.semimajor;
this.deltaFlattening = fromSurface.flattening - toSurface.flattening;
this.rotation_x = toOrientation.rotation_x - fromOrientation.rotation_x;
this.rotation_y = toOrientation.rotation_y - fromOrientation.rotation_y;
this.rotation_z = toOrientation.rotation_z - fromOrientation.rotation_z;
this.translation_x = toOrientation.translation_yz - fromOrientation.translation_yz;
this.translation_y = toOrientation.translation_xz - fromOrientation.translation_xz;
this.translation_z = toOrientation.translation_xy - fromOrientation.translation_xy;
this.scaleFactor = toOrientation.refactor - toOrientation.refactor;
//save Elipsoid for calculations...
this.fromElipsoid = fromSurface;
this.destElipsoid = toSurface;
this.convert = function(myPoint) {
var curvationRatio = this.fromElipsoid.CurvationRatio(myPoint);
var grandNormal = this.fromElipsoid.GrandNormal(myPoint);
var sinLongitude = Math.sin(myPoint.radians.longitude);
var cosLongitude = Math.cos(myPoint.radians.longitude);
var sinLatitude = Math.sin(myPoint.radians.latitude);
var cosLatitude = Math.cos(myPoint.radians.latitude);
var tanLatitude = Math.tan(myPoint.radians.latitude);
var altitude = myPoint.altitude;
var flattening = this.fromElipsoid.flattening;
var translation_x = this.translation_x;
var translation_y = this.translation_y;
var translation_z = this.translation_z;
var rotation_x = this.rotation_x;
var rotation_y = this.rotation_y;
var rotation_z = this.rotation_z;
var scaleFactor = this.scaleFactor;
var deltaSemiMajor = this.deltaSemiMajor;
Pagina 10
Trasformazione coordinate su Google Maps
GaussConverter
function GaussConverter(surface) {
this.className = "GaussConverter";
this.defaultIntegralStep = 10000;
Pagina 11
Trasformazione coordinate su Google Maps
this.a = surface.semimajor;
this.e2 = surface.e2;
var x = valoreIntegrale +
(1/2 * a*sinLatitude*cosLatitude / tempVar1) *
Math.pow(longitude,2) +
(1/24 * a*sinLatitude*Math.pow(cosLatitude, 3)) / tempVar1 * (
5 - Math.pow(tanLatitude,2) +
9*tempVar2*Math.pow(cosLatitude,2) +
4 * Math.pow(tempVar2, 2)*
Math.pow(cosLatitude,4)
) * Math.pow(longitude,4) +
1/720 * a*sinLatitude*Math.pow(cosLatitude, 5)/ tempVar1 * (
61 - 58*Math.pow(tanLatitude,2) +
Math.pow(tanLatitude, 4) + 270 * tempVar2 * Math.pow(cosLatitude, 2) -
330 * tempVar2 * Math.pow(cosLatitude, 2) *
Math.pow(tanLatitude,2)
) * Math.pow(longitude, 6);
return [x,y,myPoint.altitude];
}
Pagina 12
Trasformazione coordinate su Google Maps
Pagina 13