Why does CAMPOSM return incorrect Cartesian coordinates that do not map to the specified projected coordinates?
5 views (last 30 days)
Show older comments
I am attempting to set the camera position of a VPERSPEC projection, in order to control the viewing altitude. I can achieve this by using the CAMPOSM function. However, I have found that the Cartesian coordinates of the camera position, as returned by CAMPOSM do not project to the same latitude-longitude pair (obtained by using MINVTRAN to perform the inverse projection) that I use to set the camera position.
For example, the following code sets the camera position at (lat=0,long=-87,alt=42000):
% Set up axes
axesm ('vperspec','Grid', 'on','Frame','on')
axis off
% Display a surface
load geoid
meshm(geoid, geoidrefvec)
% Display coastline vectors
load coast
plotm(lat,long)
% Change camera position using CAMPOSM
longitude = -87;
[x, y, z] = camposm(0,longitude,42000)
However, the Cartesian coordinates (x,y,z) returned by CAMPOSM project back to (lat,long,alt) as follows:
[latc, lonc, altc] = minvtran(x,y,z)
latc =
-2.1343e-14
lonc =
-76.6411
altc =
42000
As is evident, the latitude is set incorrectly to ~-76 when I had originally intended it to be set to -87.
Accepted Answer
MathWorks Support Team
on 27 Jun 2009
This difference in the setting of the camera position occurs because the point at which the camera position is being set is off the edge of the map. To illustrate this issue, label the parallels as follows:
setm(gca,'mlabelparallel',0)
mlabel on
Now, it should be clear that the specified camera position is off the western edge of the map.
However, when we verify with MFWDTRAN, we see that the given (lat,long) pair evaluates to the same Cartesian cordinates:
[x1,y1,z1] = mfwdtran(0,longitude,42000)
isequal([x y z],[x1 y1 z1]) % Evaluates to true
Therefore, it is evident that the round-trip computation does not work in this case, since the specified position is off the edge of the map.
This solution can also be substantiated by choosing a more reasonable camera position, eg. (lat=0,long=-60,alt=42000). This longitude should keep us on the map:
longitude = -60;
[x,y,z] = camposm(0,longitude,42000)
[latc, lonc, altc] = minvtran(x,y,z)
The agreement is excellent in this case.
0 Comments
More Answers (0)
See Also
Categories
Mathematics and Optimization
Mapping Toolbox
Coordinate Reference Systems
Geographic Coordinate Reference Systems
Show more
Find more on 3-D Visualization in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!