Comprensione dei termini nella formula Lunghezza di laurea?


13

Calcolatori online come http://www.csgnetwork.com/degreelenllavcalc.html (vedi sorgente pagina) utilizzare le formule seguenti per ottenere contatori per grado. Capisco in generale come la distanza per grado varia a seconda della posizione della latitudine, ma non capisco come ciò si traduca in basso. Più in particolare, da dove vengono le costanti, i 3 termini "cos" in ciascuna formula e i coefficienti (2, 4, 6; 3 e 5) per "lat"?

    // Set up "Constants"
    m1 = 111132.92;     // latitude calculation term 1
    m2 = -559.82;       // latitude calculation term 2
    m3 = 1.175;         // latitude calculation term 3
    m4 = -0.0023;       // latitude calculation term 4
    p1 = 111412.84;     // longitude calculation term 1
    p2 = -93.5;         // longitude calculation term 2
    p3 = 0.118;         // longitude calculation term 3

    // Calculate the length of a degree of latitude and longitude in meters
    latlen = m1 + (m2 * Math.cos(2 * lat)) + (m3 * Math.cos(4 * lat)) +
            (m4 * Math.cos(6 * lat));
    longlen = (p1 * Math.cos(lat)) + (p2 * Math.cos(3 * lat)) +
                (p3 * Math.cos(5 * lat));

3
Su un cerchio, i termini della forma cos (m * x) per m = 0, 1, 2, ... svolgono lo stesso ruolo dei monomi 1, x, x ^ 2, x ^ 3, ... fanno per Taylor serie sulla linea. Quando vedi un'espansione di questo tipo, puoi pensarla allo stesso modo: ogni termine fornisce un'approssimazione di ordine superiore a una funzione. Di solito tali serie trigonometriche sono infinite; ma nell'uso pratico possono essere troncati non appena l'errore di approssimazione è accettabile. Una tale tecnologia è alla base di ogni GIS perché molte proiezioni sferoidali sono calcolate usando tali serie.
whuber

Questo è molto utile per calcolare le distanze in cui la distanza tra le linee di latitudine varia, utile anche per aiutare a determinare dove tracciare punti su una mappa del mercatore se si dispone di una griglia x, y come overlay

Suggerimento: non dimenticate di utilizzare radianti per lat(anche se le variabili risultanti latlene longlensono in metri per grado, non metri al radianti). Se usi i gradi per lat, puoi persino finire con un valore negativo per longlen.
Luke Hutchison,

Risposte:


23

Il raggio principale dello sferoide WGS84 è a = 6378137 metri e il suo appiattimento inverso è f = 298.257223563, da cui l'eccentricità quadrata è

e2 = (2 - 1/f)/f = 0.0066943799901413165.

Il raggio meridionale della curvatura a latitudine phi è

M = a(1 - e2) / (1 - e2 sin(phi)^2)^(3/2)

e il raggio di curvatura lungo il parallelo è

N = a / (1 - e2 sin(phi)^2)^(1/2)

Inoltre, il raggio del parallelo è

r = N cos(phi)

Queste sono correzioni moltiplicative ai valori sferici di M e N , entrambi uguali al raggio sferico a , che è ciò a cui si riducono quando e2 = 0.

figura

Nel punto giallo a 45 gradi di latitudine nord, il disco blu del raggio M è il cerchio oscolante ("baciare") nella direzione del meridiano e il disco rosso del raggio N è il cerchio oscolante nella direzione del parallelo: entrambi i dischi contengono la direzione "giù" a questo punto. Questa figura esagera l'appiattimento della terra di due ordini di grandezza.

I raggi di curvatura determinano la lunghezza dei gradi: quando un cerchio ha un raggio di R , il suo perimetro di lunghezza 2 pi R copre 360 ​​gradi, da cui la lunghezza di un grado è pi * R / 180. Sostituendo M e r con R - - cioè, moltiplicando M e r per pi / 180 - si ottengono formule esatte semplici per le lunghezze dei gradi.

Queste formule - che si basano esclusivamente sui valori dati di a e f (che possono essere trovati in molti punti ) e sulla descrizione dello sferoide come ellissoide di rotazione - concordano con i calcoli nella domanda entro 0,6 parti per milioni (pochi centimetri), che è approssimativamente lo stesso ordine di grandezza dei coefficienti più piccoli nella domanda, indicando che sono d'accordo. (L'approssimazione è sempre un po 'bassa). Nella trama l'errore relativo in lunghezza di un grado di latitudine è nero e quello di longitudine è tratteggiato in rosso:

figura

Di conseguenza, possiamo comprendere i calcoli nella domanda come approssimazioni (tramite serie trigonometriche troncate) alle formule fornite sopra.


I coefficienti possono essere calcolati dalla serie di coseno di Fourier per M e r come funzioni della latitudine. Sono dati in termini di funzioni ellittiche di e2, che sarebbe troppo disordinato per riprodursi qui. Per lo sferoide WGS84, i miei calcoli danno

  m1 = 111132.95255
  m2 = -559.84957
  m3 = 1.17514
  m4 = -0.00230
  p1 = 111412.87733
  p2 = -93.50412
  p3 = 0.11774
  p4 = -0.000165

(È possibile indovinare come si p4inserisce la formula. :) La vicinanza di questi valori ai parametri nel codice attesta la correttezza di questa interpretazione. Questa approssimazione migliorata ha una precisione molto migliore di una parte per miliardo ovunque.


Per testare questa risposta ho eseguito il Rcodice per eseguire entrambi i calcoli:

#
# Radii of meridians and parallels on a spheroid.  Defaults to WGS84 meters.
# Input is latitude (in degrees).
#
radii <- function(phi, a=6378137, e2=0.0066943799901413165) {
  u <- 1 - e2 * sin(phi)^2
  return(cbind(M=(1-e2)/u, r=cos(phi)) * (a / sqrt(u))) 
}
#
# Approximate calculation.  Same interface (but no options).
#
m.per.deg <- function(lat) {
  m1 = 111132.92;     # latitude calculation term 1
  m2 = -559.82;       # latitude calculation term 2
  m3 = 1.175;         # latitude calculation term 3
  m4 = -0.0023;       # latitude calculation term 4
  p1 = 111412.84;     # longitude calculation term 1
  p2 = -93.5;         # longitude calculation term 2
  p3 = 0.118;         # longitude calculation term 3

  latlen = m1 + m2 * cos(2 * lat) + m3 * cos(4 * lat) + m4 * cos(6 * lat);
  longlen = p1 * cos(lat) + p2 * cos(3 * lat) + p3 * cos(5 * lat);
  return(cbind(M.approx=latlen, r.approx=longlen))
}
#
# Compute the error of the approximation `m.per.deg` compared to the 
# correct formula and plot it as a function of latitude.
#
phi <- pi / 180 * seq(0, 90, 10)
names(phi) <- phi * 180 / pi
matplot(phi * 180 / pi, 10^6 * ((m.per.deg(phi) - radii(phi) * pi / 180) / 
       (radii(phi) * pi / 180)),
        xlab="Latitude (degrees)", ylab="Relative error * 10^6",lwd=2, type="l")

Il calcolo esatto con radiipuò essere utilizzato per stampare tabelle delle lunghezze dei gradi, come in

zapsmall(radii(phi) * pi / 180)

L'output è in metri e si presenta così (con alcune righe rimosse):

          M         r
0  110574.3 111319.49
10 110607.8 109639.36
20 110704.3 104647.09
...
80 111659.9  19393.49
90 111694.0      0.00

Riferimenti

LM Bugayevskiy e JP Snyder, Proiezioni di mappe - Un manuale di riferimento. Taylor & Francis, 1995. (Appendice 2 e Appendice 4)

JP Snyder, Proiezioni di mappe - Un manuale di lavoro. USGS Professional Paper 1395, 1987. (Capitolo 3)


Non so perché un'approssimazione così complicata a una semplice coppia di formule sarebbe mai stata usata ...
whuber

Che risposta completa, eccellente! Sembra corretto; ora ho solo bisogno di rispolverare questa matematica per capirlo. :)
Brent,

@Brent Ho aggiunto una figura per aiutarti a capire la matematica.
whuber

0

Questa è la formula Haversine , sebbene espressa in modo strano.


Chiaramente non è la formula di Haversine! Questa è (correlata a) una perturbazione di esso usata per lo sferoide. Non trova nemmeno le distanze tra coppie arbitrarie di punti, che è ciò per cui viene utilizzata la formula di Haversine (sulla sfera).
whuber

1
In altre parole, la formula di Haversine calcola la distanza del grande cerchio e questa formula è una sua perturbazione che calcola la distanza dell'ellissoide più accurata?
Brent,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.