how map 2d grid points (x,y) onto sphere as 3d points (x,y,z)
Solution 1
Paraphrased from the wikipedia article on Mercator projection:
Given a "mapping sphere" of radius R,
the Mercator projection (x,y) of a given latitude and longitude is:
x = R * longitude
y = R * log( tan( (latitude + pi/2)/2 ) )
and the inverse mapping of a given map location (x,y) is:
longitude = x / R
latitude = 2 * atan(exp(y/R)) - pi/2
To get the 3D coordinates from the result of the inverse mapping:
Given longitude and latitude on a sphere of radius S,
the 3D coordinates P = (P.x, P.y, P.z) are:
P.x = S * cos(latitude) * cos(longitude)
P.y = S * cos(latitude) * sin(longitude)
P.z = S * sin(latitude)
(Note that the "map radius" and the "3D radius" will almost certainly have different values, so I have used different variable names.)
Solution 2
I suppose that your (x,y) on the sphere are latitude, longitude.
If so, see http://tutorial.math.lamar.edu/Classes/CalcII/SphericalCoords.aspx.
There:
phi = 90 degree - latitude
theta = longitude
rho = radius of your sphere.
Solution 3
I would expect that you could use the inverse of any of a number of globe projections.
Mercator is pretty good around the equator compared to other projections.
Formulas are on the wiki page.
http://en.wikipedia.org/wiki/Mercator_projection
milkplus
Updated on July 09, 2022Comments
-
milkplus almost 2 years
I have a set of 2d grid points (x,y) that I want to map/project onto a sphere as 3d points (x,y,z).
I realize there will be some warping towards the poles as abs(y) increases but my grid patch will only cover a portion of the sphere near the equator so severe warping will be avoided.
I'm having trouble finding the right equations for that.
-
milkplus over 11 yearsthanks. i realize that is what i want but i'm having trouble deriving the equations for taking 2d points (x,y) to 3d points (x,y,z) on the sphere.
-
kreativitea over 11 yearsAh, the actual formulae. This is a non-trivial mathematical operation, and you might have better luck on math.stackexchange.com. Once you get the formula, you can come back here for help programming it. Also, wiki.openstreetmap.org/wiki/Mercator
-
Pikamander2 over 8 yearsMy latitude is 29.65163. When I try to calculate the y value, I'm getting an error (in Python) because
tan((latitude + pi/2)/2)
is -0.0970531183, and performing log on that value throws a "math domain error" since the value is negative. What am I doing wrong? -
comingstorm over 8 yearsYou need to convert your latitude from degrees to radians, before adding
pi/2
. This will convert the range+/- 90 degrees
to a range of+/- pi/2 radians
, which will not overflow the function range unless you are at the poles (in which case the Mercator projection is singular anyway...) -
PyRulez almost 6 yearsDo you know how to get the latitude and longitude from x, y, and z?
-
comingstorm almost 6 yearsLatitude is
atan2(z, sqrt(x*x+y*y))
, and longitude isatan2(y,x)
. Both of these yield radians, which can be used directly in the inverse mapping, but which must be converted to degrees if that's what you want instead.