-
Notifications
You must be signed in to change notification settings - Fork 2
/
utmups_inv.m
83 lines (77 loc) · 2.95 KB
/
utmups_inv.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
function [lat, lon, gam, k] = utmups_inv(x, y, zone, isnorth)
%UTMUPS_INV Convert from UTM/UPS system
%
% [lat, lon] = UTMUPS_INV(x, y, zone, isnorth)
% [lat, lon, gam, k] = UTMUPS_INV(x, y, zone, isnorth)
%
% convert to the UTM/UPS system to geographical coordinates, (lat,lon).
% The input is (x,y) = (easting,northing), the zone which is either the
% UTM zone or 0 for UPS , and a hemisphere selector, isnorth (0 for the
% southern hemisphere, 1 for the northern). x, y, zone, and isnorth can
% be scalars or arrays of equal size. The forward operation is performed
% by utmups_fwd.
%
% gam and k give metric properties of the projection at (lat,lon); gam is
% the meridian convergence at the point and k is the scale.
%
% lat, lon, gam are in degrees. The projected coordinates x, y are in
% meters. k is dimensionless.
%
% The argument zone has the following meanings
% 0, use UPS
% [1,60], use the corresponding UTM zone
% -4, an undefined zone
%
% The allowed values of (x,y) are
% UTM: x in [0 km, 1000 km]
% y in [0 km, 9600 km] for northern hemisphere
% y in [900 km, 10000 km] for southern hemisphere
% UPS: x and y in [1200 km, 2800 km] for northern hemisphere
% x and y in [700 km, 3300 km] for southern hemisphere
%
% The ranges are 100 km less restrictive than for mgrs_fwd.
%
% UTMUPS_INV checks that (x,y) lie in the limits given above. If these
% conditions don't hold (lat,lon), gam, k are converted to NaN.
%
% See also UTMUPS_FWD, TRANMERC_INV, POLARST_INV, MGRS_INV.
% Copyright (c) Charles Karney (2015-2022) <karney@alum.mit.edu>.
narginchk(4, 4)
try
Z = -zeros(size(x + y + zone + isnorth)); %#ok<SZARLOG>
catch
error('x, y, zone, isnorth have incompatible sizes')
end
x = x + Z; y = y + Z;
zone = floor(zone) + Z; isnorth = logical(isnorth + Z);
Z = nan(size(Z));
lat = Z; lon = Z; gam = Z; k = Z;
utm = zone > 0 & zone <= 60;
[lat(utm), lon(utm), gam(utm), k(utm)] = ...
utm_inv(zone(utm), isnorth(utm), x(utm), y(utm));
ups = zone == 0;
[lat(ups), lon(ups), gam(ups), k(ups)] = ...
ups_inv(isnorth(ups), x(ups), y(ups));
end
function [lat, lon, gam, k] = utm_inv(zone, isnorth, x, y)
%UTM_INV Inverse UTM projection
lon0 = -183 + 6 * floor(zone); lat0 = 0;
fe = 5e5; fn = 100e5 * (1-isnorth); k0 = 0.9996;
x = x - fe; y = y - fn;
bad = ~(abs(x) <= 5e5 & y >= -91e5 & y <= 96e5);
x = x / k0; y = y / k0;
[lat, lon, gam, k] = tranmerc_inv(lat0, lon0, x, y);
k = k * k0;
lat(bad) = nan; lon(bad) = nan; gam(bad) = nan; k(bad) = nan;
end
function [lat, lon, gam, k] = ups_inv(isnorth, x, y)
%UPS_INV Inverse UPS projection
fe = 20e5; fn = 20e5; k0 = 0.994;
x = x - fe; y = y - fn;
lim = (13 - 5 * isnorth) * 1e5;
bad = ~(abs(x) <= lim & abs(y) <= lim);
x = x / k0; y = y / k0;
[lat, lon, gam, k] = polarst_inv(isnorth, x, y);
k = k * k0;
lat(bad) = nan; lon(bad) = nan; gam(bad) = nan; k(bad) = nan;
end