Viewing contents of file '../idllib/contrib/esrg_ucsb/compass.pro'
 pro compass,lat0,lon0,uu,vv,uuu,vvv,to_latlon=to_latlon
;+
;ROUTINE:     compass
;
;USEAGE       compass, lat0,lon0,alat,alon,rng,az
;             compass, lat0,lon0,rng,az,alat,alon,/to_latlon
;
;PURPOSE:     Given the geographical coordinates of an array of points
;             on the on the earth's surface, compute the great-circle 
;             distance and compass heading from the central point.
;             Distances and azimuth angles about the central point are 
;             provided in KM and Degrees.  
;
;             If TO_LATLON is set, convert the specified range and
;             azimuth values to lat, lon coordinates
;
;INPUT:
;  lat0       geographic latitude (degrees) of central point
;  lon0       geographic longitude (degrees) of central point
; 
;INPUT/OUTPUT
;  alat       geographic latitudes
;
;  alon       geographic longitudes
;
;  rng        great circle distances (km) from (lat0,lon0) to (alat,alon)
;
;  az         azimuth angles (degrees), azimuth is measured clockwise
;             from due north (compass heading)
;
;KEYWORD INPUT:
; to_latlon   if set, rng, az input converted to lat, lon
;
;
;EXAMPLE:
;
;;; plot family of great circles passing though lat,lon=(0,0)
;
;  rng=findrng(0,2*!pi*6371.2,400)
;  map_set,/cyl,/cont,/grid
;  for az=0,90,15 do begin &$
;   compass,0,0,rng,az,alat,alon,/to_latlon & oplot,alon,alat & endfor
;  
;
;;; find the range and az of Janus Island from Palmer Station
;
;  lat0=-64.767 & lon0=-64.067 & alat=-64.78 & alon=-64.11
;  compass,lat0,lon0,alat,alon,rng,az
;  compass,lat0,lon0,rng,az,nlat,nlon,/to_latlon 
;  print,f='(6a13)','alat','alon','rng','az','nlat','nlon' &$
;  print,alat,alon,rng,az,nlat,nlon
;
;
;  author:  Paul Ricchiazzi                            jan93
;           Institute for Computational Earth System Science
;           University of California, Santa Barbara
;
;-
re=6371.2
;

if keyword_set(to_latlon) then begin
  alat=90.-uu/(!dtor*re)
  alon=180-vv
  latp=lat0
  lonp=180.
endif else begin
  latp=lat0
  lonp=lon0
  alat=uu
  alon=vv
endelse

t0=double((90.-latp)*!dtor)
t1=double((90.-alat)*!dtor)
p0=double(lonp*!dtor)
p1=double(alon*!dtor)
zz=cos(t0)*cos(t1)+sin(t0)*sin(t1)*cos(p1-p0) > (-1.) < 1. 
xx=sin(t1)*sin(p1-p0)
yy=sin(t0)*cos(t1)-cos(t0)*sin(t1)*cos(p1-p0)
uuu=re*acos(zz)
vvv=uuu
vvv=atan(xx,yy)/!dtor
uuu=float(uuu)
vvv=float(vvv)
if keyword_set(to_latlon) then begin
  uuu=90.-uuu/(!dtor*re)
  vvv=lon0-vvv
endif
return
end