How to get cursor position in geodetic format on terrain map?

조회 수: 2 (최근 30일)
Said Kemal
Said Kemal 2023년 3월 30일
답변: Suraj 2023년 11월 17일
I have following code to draw terrain map
[A,R] = readgeoraster("n39_w106_3arc_v2.dt1", "OutputType", "double");
latlim = R.LatitudeLimits;
lonlim = R.LongitudeLimits;
usamap(latlim,lonlim)
geoshow(A,R,"DisplayType", "surface", "ButtonDownFcn", @get_cursor_position)
demcmap(A)
where
function get_cursor_position(varargin)
XYZ = get(gca, "CurrentPoint");
pos = [XYZ(1, 1), XYZ(1, 2), XYZ(1, 3)] % cursor position
assignin("base", "CursorPosition", pos); % save variable to workspace
end
I want to get the cursor position position in geodetic format whenever I click on the figure.
2 problems I have:
  1. When I click any point on the map, I get a cursor position value, but not in geodetic format.
  2. I get same height value at different locations where I am sure they have different height. get(gca, "CurrentPoint") does not work well.

답변 (1개)

Suraj
Suraj 2023년 11월 17일
Hello Said
I understand that you are using Mapping Toolbox to read and display elevation data. You are trying to create a callback function that saves the latitude, longitude, and elevation from the last clicked point on the map to a variable in the base workspace.
Let me address the issues you have pointed out -
1. “When I click any point on the map, I get a cursor position value, but not in geodetic format.”
  • The “CurrentPoint” property of “Axes” object returned by “gca” function contains X-Y-Z values relative to the axes of the plot.
  • You can use the “gcpmap” function to retrieve the current point (the location of last button click) of the current “axesm”-based map in the form “[latitude longitude z-altitude]”.
2. “I get same height value at different locations where I am sure they have different height. get(gca, "CurrentPoint") does not work well.”
  • The example you have attached plots the data as a surface map (2 dimensional) with the elevation data represented by a colormap, applied using the “demcmap” function.
  • This means that “geoshow” is essentially rendering a 2-dimensional representation of the 3-dimensional data from the “.dt1” file.
  • This is why “gcpmap” and “gca” functions return the same height value at all the points on the map.
  • I would recommend you query the DEM data directly using “geointerp” function with the latitude and longitude points obtained from “gcpmap”.
Here is a code snippet that accomplishes the task using the above workarounds –
[A,R] = readgeoraster("n39_w106_3arc_v2.dt1", "OutputType", "double");
latlim = R.LatitudeLimits;
lonlim = R.LongitudeLimits;
usamap(latlim,lonlim)
geoshow(A,R,"DisplayType", "surface", "ButtonDownFcn",{@get_cursor_position, A, R})
demcmap(A)
function get_cursor_position(varargin)
pt = gcpmap;
lat = pt(1,1);
lon = pt(1,2);
z_altitude = geointerp(varargin{3}, varargin{4}, lat, lon);
pos = [lat, lon, z_altitude];
assignin("base", "CursorPosition", pos);
end
Please refer to the following documentation for more information –
  1. “gcpmap” - https://www.mathworks.com/help/map/ref/gcpmap.html
  2. “geointerp” - https://www.mathworks.com/help/map/ref/geointerp.html
I hope this helps.
Best regards,
Suraj.

제품


릴리스

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by