summaryrefslogtreecommitdiff
path: root/inst/aer2geodetic.m
diff options
context:
space:
mode:
Diffstat (limited to 'inst/aer2geodetic.m')
-rw-r--r--inst/aer2geodetic.m128
1 files changed, 128 insertions, 0 deletions
diff --git a/inst/aer2geodetic.m b/inst/aer2geodetic.m
new file mode 100644
index 0000000..45f9b90
--- /dev/null
+++ b/inst/aer2geodetic.m
@@ -0,0 +1,128 @@
+## Copyright (c) 2014-2020 Michael Hirsch, Ph.D.
+## Copyright (c) 2013-2020, Felipe Geremia Nievinski
+## Copyright (C) 2019-2020 Philip Nienhuis
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are met:
+## 1. Redistributions of source code must retain the above copyright notice,
+## this list of conditions and the following disclaimer.
+## 2. Redistributions in binary form must reproduce the above copyright notice,
+## this list of conditions and the following disclaimer in the documentation
+## and/or other materials provided with the distribution.
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+## THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+## ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+## LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+## CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+## SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+## OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+## WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{lat1}, @var{lon1}, @var{alt1} =} aer2geodetic (@var{az},@var{el}, @var{slantRange}, @var{lat0}, @var{lon0}, @var{alt0})
+## @deftypefnx {Function File} {@var{lat1}, @var{lon1}, @var{alt1} =} aer2geodetic (@var{az},@var{el}, @var{slantRange}, @var{lat0}, @var{lon0}, @var{alt0}, @var{spheroid})
+## @deftypefnx {Function File} {@var{lat1}, @var{lon1}, @var{alt1} =} aer2geodetic (@var{az},@var{el}, @var{slantRange}, @var{lat0}, @var{lon0}, @var{alt0}, @var{spheroid}, @var{angleUnit})
+## Convert azimuth, elevation and range of target from observer to geodetic
+## coordinates.
+##
+## Inputs:
+##
+## @var{az}, @var{el}, @var{slantrange}: look angles and distance to point
+## under consideration (degrees, degrees, meters). Vectors values are accepted
+## if they have equal dimensions.
+##
+## @var{lat0}, @var{lon0}, @var{alt0}: ellipsoid geodetic coordinates of
+## observer/reference (degrees, degrees, meters). This must be just one
+## position.
+##
+## @var{spheroid}: referenceEllipsoid parameter struct or name (string value)
+## of referenceEllipsoid; default is 'wgs84'.
+##
+## @var{angleUnit}: string for angular units ('degrees' or 'radians',
+## case-insensitive, just first character will suffice). Default is 'degrees'.
+##
+## Outputs:
+##
+## @var{lat1}, @var{lon1}, @var{alt1}: geodetic coordinates of points (degrees,
+## degrees, meters).
+##
+## Example
+## @example
+## [x, y, z] = aer2geodetic (33, 70, 1e3, 42, -82, 200)
+## x = 42.000
+## y = -82.000
+## z = 1139.7
+## @end example
+##
+## With radians
+## @example
+## [x, y, z] = aer2geodetic (pi/6, pi/3, 1e3, pi/4, -pi/2, 200, "wgs84", "radians")
+## x = 0.78547
+## y = -1.5707
+## z = 1066.0
+## @end example
+##
+## Note: aer2geodetic is a mere wrapper for functions aer2ecef followed by
+## ecef2geodetic.
+##
+## @seealso {aer2ecef, ecef2geodetic, referenceEllipsoid}
+## @end deftypefn
+
+## Function adapted by anonymous contributor, see:
+## https://savannah.gnu.org/patch/index.php?8377
+
+function [lat1, lon1, alt1] = aer2geodetic (az, el, slantrange, lat0, lon0, alt0, spheroid = "", angleUnit = "degrees")
+
+ if nargin < 6
+ print_usage();
+ endif
+
+ if (! isnumeric (az) || ! isreal (az) || ...
+ ! isnumeric (el) || ! isreal (el) || ...
+ ! isnumeric (slantrange) || ! isreal (slantrange) || ...
+ ! isnumeric (lat0) || ! isreal (lat0) || ...
+ ! isnumeric (lon0) || ! isreal (lon0) || ...
+ ! isnumeric (alt0) || ! isreal (alt0))
+ error ("aer2geodetic.m : numeric values expected for first six inputs.");
+ endif
+
+ if (isempty (spheroid))
+ E = wgs84Ellipsoid;
+ elseif (isstruct (spheroid))
+ E = spheroid;
+ elseif (ischar (spheroid))
+ E = referenceEllipsoid (spheroid);
+ else
+ error ("aer2geodetic: illegal value for 'spheroid'.");
+ endif
+
+ [x, y, z] = aer2ecef (az, el, slantrange, lat0, lon0, alt0, spheroid, angleUnit);
+ [lat1, lon1, alt1] = ecef2geodetic (spheroid, x, y, z, angleUnit);
+
+endfunction
+
+%!test
+%! [lat2, lon2, alt2] = aer2geodetic (33, 70, 1e3, 42, -82, 200);
+%! assert ([lat2, lon2, alt2], [42.002581, -81.997752, 1.1397018e3], 10e-6);
+
+%!test
+%! [lat2, lon2, alt2] = aer2geodetic ( 0.575958653158129, 1.22173047639603, ...
+%! 1e3, 0.733038285837618, -1.43116998663535, 200, "", "rad");
+%! assert ([lat2, lon2, alt2], [0.7330833, -1.4311307, 1.13970179e3], 10e-6)
+
+%!error <numeric> aer2geodetic ("s", 25, 1e3, 0, 0, 0)
+%!error <numeric> aer2geodetic (3i, 25, 1e3, 0, 0, 0)
+%!error <numeric> aer2geodetic (33, "s", 1e3, 0, 0, 0)
+%!error <numeric> aer2geodetic (33, 3i, 1e3, 0, 0, 0)
+%!error <numeric> aer2geodetic (33, 25, "s", 0, 0, 0)
+%!error <numeric> aer2geodetic (33, 25, 3i, 0, 0, 0)
+%!error <numeric> aer2geodetic (33, 25, 1e3, "s", 0, 0)
+%!error <numeric> aer2geodetic (33, 25, 1e3, 3i, 0, 0)
+%!error <numeric> aer2geodetic (33, 25, 1e3, 0, "s", 0)
+%!error <numeric> aer2geodetic (33, 25, 1e3, 0, 3i, 0)
+%!error <numeric> aer2geodetic (33, 25, 1e3, 0, 0, "s")
+%!error <numeric> aer2geodetic (33, 25, 1e3, 0, 0, 3i)
+%!error <illegal> aer2geodetic (33, 25, 1e3, 0, 0, 3, 5)