[GRASSLIST:3244] help with theory of map projections
chris2
chris2 at hopelesscase.com
Wed Feb 27 10:38:27 EST 2002
I have been trying to learn the theory behind map projections from the book "Map Projections, A reference Manual" by Bugayevskiy and Snyder. I am stuck on page 2 in Chapter 1, if you can believe it, where they take an ellipsoid of revolution, and a point on its surface at latitude phi, and mention that the radius of curvature of the meridian through the point is:
M= a*(1-e^2) / [(1-e^2*sin(phi)^2)^(3/2)]
Where e, a, and b are the eccentricity and semimajor and semiminor axes of the ellipse of revolution.
I set out to verify this formula as a way of reviewing my vector caclulus and getting started with the book.
I used the following parameterization of the ellipse:
x = a*cos(t)
y = b*sin(t)
My t, by the way, is equivalent to their phi, I am pretty sure. That is, t is the angle between a normal line to the ellipse through the given point, and the x-axis.
And, using the notation of my calculus book (Thomas and Finney), went through the following formulas:
R = a*cos(t) i + b*sin(t) j
V = dR/dt
T = dR/ds = V / |V|
k = curvature = | dT/ds | = | dT/dt | / | ds/dt | = |dT/dt| / |V|
radius of curvature = 1/k
I couldn't reduce the expression I got to the one from the book, so I wrote a little R script to graph the radius of curvature from 0 to 2*pi using Bugayevskiy's formula and the one I derived. I have included my R code below to produce the plots.
Can anyone spot what I am doing wrong? The black graph is Bugayevskiy's and the red one is mine.
Also, can anyone recommend a book with a little more explanation than "Map Projections"? My ultimate goal is to understand the UTM coordinate system well enough to write code to do projections with it. B and S don't seem to feel the need to derive their equations.
I have included my R code below. If you stuck it in a file "curve.R", you could produce the plots by typing "source("curve.R")" from the R prompt.
Chris Marshall
pow <- function(x,y){
exp(y*log(x))
}
a <- 3
b <- 0.5
e <- sqrt((a*a-b*b))/a
t <- (1:100)*2*pi/100
x <- a*cos(t)
y <- b*sin(t)
# B and S curvature formulas
k1 <- e*sin(t)
M <- a*(1-e*e)/pow(1-k1*k1,3/2)
N <- a/sqrt(1-k1*k1)
# my brute force approach
st <- sin(t)
s2t <- st*st
ct <- cos(t)
c2t <- ct*ct
abs.v <- sqrt(a*a*s2t+b*b*c2t)
j <- 1/abs.v
dj.dt <- (b*b-a*a)*ct*st/(abs.v*abs.v*abs.v)
dg.dt <- -a*ct*j - a*st*dj.dt
dh.dt <- -b*st*j + b*ct*dj.dt
abs.dT.dt <- sqrt(dg.dt*dg.dt+dh.dt*dh.dt)
k <- abs.dT.dt/abs.v
# graph the curvature formulas
graphics.off()
ylim <- c(0,max(M,N,1/k))
#plot(x,y,type="l")
#X11()
plot(t,M,type="l",ylim=ylim)
#X11()
#plot(t,N,type="l",ylim=ylim)
#X11()
#plot(t,1/k,type="l",ylim=ylim)
lines(t,1/k,type="l",col=2)
More information about the grass-user
mailing list