Finds the great circle distance (true surface distance) between two points on the globe and interpolates points along the great circle.
function gc_latlon ( lat1 : numeric, lon1 : numeric, lat2 : numeric, lon2 : numeric, npts  : byte, short, integer or long, iu  : integer ) return_val [dimsizes(lat2)] : float or double
Latitude/longitude of the first point. These can be scalars or multi-dimensional arrays. If the latter, they must be the same size and shape as lat2 and lon2. Units are (say) 'degrees_north' and 'degrees_east', however a units attribute is not required.lat2
Latitude/longitude of the second point. These can be multi-dimensional arrays of the same size. Units are (say) 'degrees_north' and 'degrees_east'.npts
The number of equally-spaced points to be interpolated along the shortest great circle route from the first point to the second point. The actual number of interpolated points is npts-2.
As of version 6.0.0, this can be of type byte, short, integer or long.iu
A flag having a dual effect on returned values. The absolute value indicates the desired units of the distance. The sign indicates whether the longitudes span 0 to 360 or -180 to 180 degrees of longitude.
abs(iu) = 1 ; return the distance in radians = 2 ; return the distance in degrees = 3 ; return the distance in meters = 4 ; return the distance in kilometersIf iu is positive, the longitudes will be 0 to 360; otherwise, the longitudes will be -180 to 180.
A scalar that will be of type double if any of the input lat/lon values are double, and float otherwise. In version 4.2.0.a034 the return value will be the same dimensionality as the lat2, lon2 arrays.
The function gc_latlon returns the great circle distance between two points on the surface of the globe in units specified by the value of iu. The following attributes are also returned:
- gclat - the latitudes of points on the great circle (dimensioned nlat2*npts, and includes the two input latitude points)
- gclon - the longitudes of points on the great circle (dimensioned nlat2*npts, and includes the two input longitude points)
- spacing - the distance between each equally-spaced, interpolated lat/lon point.
- units - the units of the distance returned
Note: this routine does not check for missing value input. If you input missing values, it will try to calculate a distance for them. Be sure to remove any missing values prior to calling this function if this behavior is not desired.
This example calculates the great circle distance (in kilometers) between the equator and the north pole. The input units are in degrees.
gcdist = gc_latlon(0.,0.,90.,0.,2,4)
gcdist will be equal to 10007.89 kilometers.
This example calculates the great circle distance (in radians) between Sacramento, California, and Albany, New York, and interpolates 98 points in between:
begin gcdist = gc_latlon(38.54623,-121.42660,42.66575,-73.79901,100,-1) endThe distance will be 0.6268081 radians, and the spacing will be 0.006331395 radians. The interpolated longitude values will fall in the range from -180 to 180, since iu is negative.
This example calculates the great circle distance (in degrees) between the specified coordinate pairs and interpolate 8 points in-between, return the longitudes in the range 0-360 (iu positive).
begin npts = 10 lat1 = 20. lon1 = -120. lat2 = 60. lon2 = -64. gcdist = gc_latlon(lat1,lon1, lat2,lon2, npts,2) print (gcdist) print (gcdist@gclat+" "+gcdist@gclon ) ; print the lats/lons end
The distance will be 56.01797 degrees (iu=2), and the spacing will be 6.224219 degrees. The 10 coordinate pairs (initial/final and the 8 interpolated values) are returned as attributes of gcdist, and are in the range 0-360 (iu positive). The values are:
(0) 20 240 ; lat1,lon1 [0-360] (1) 25.356 243.438 ; interpolated (2) 30.6249 247.194 (3) 35.7735 251.377 (4) 40.7574 256.131 (5) 45.5151 261.637 (6) 49.9606 268.124 (7) 53.9734 275.859 (8) 57.3891 285.105 ; interpolated (9) 60 296 ; lat2,lon2
Calculate the distances between one set of lat/lon and an array of lat/lon pts. Here the latter are one-dimensional but the set can be multi-dimensional.
lat1 = (/ 84.0/) lon1 = (/ 30.0/) lat2 = (/ 30.0, 40.0, 84.0/) lon2 = (/ 50.0, 20.0, 30.0 /) print("===") print(lat1+" "+lon1) print("===") print(lat2+" "+lon2) print("===") dist = gc_latlon(lat1,lon1,lat2,lon2,2,4) print(dist)The output would be:
(0) === (0) 84 30 (0) === (0) 30 50 (1) 40 20 (2) 84 30 (0) === Variable: dist Type: float Total Size: 12 bytes 3 values Number of Dimensions: 1 Dimensions and sizes:  Coordinates: Number Of Attributes: 4 units : kilometers gclon : ( 30, 50, 30, 20, 30, 30 ) gclat : ( 84, 30, 84, 40, 84, 84 ) spacing : ( 6047.622, 4903.893, 0 ) (0) 6047.622 (1) 4903.893 (2) 0