geolocation_circle
Create latitudes and longitudes that define concentric circles at user specified distances from a central location.
Available in version 6.5.0 and later.
Prototype
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" ; This library is automatically loaded
; from NCL V6.2.0 onward.
; No need for user to explicitly load.
function geolocation_circle (
clat [*] : numeric,
clon [*] : numeric,
crad [*] : numeric,
urad [1] : integer,
N [1] : integer,
opt [1] : logical
)
return_val : float or double
Arguments
clatclon
Scalars or one-dimensional arrays containing the 'center' location latitudes or latitudes. If these are arrays,they must be the same length. Missing values are not allowed.
Most commonly, these might be station or grid point locations or a time series of (say) low-pressure center locations.
cradScalar or one-dimensional array containing the radial distances for each circle. The units can be degrees (great circle degrees) or kilometers (km).
uradAn integer which specifies the units of crad: =0 means degrees (dg); =1 mean kilometers (km)
optCurrently, not used. Set to False.
Return value
A variable of type list containing two variables (say, Rlat and Rlon) which contain the geolocated latitudes and longitudes for each specified location pair at each radius.
Rlat(dimsizes(clat),dimsizes(crad),N),
Rlon(dimsizes(clat),dimsizes(crad),N)).
Informational attributes are also returned.
Description
geolocation_circle computes N latitude and longitudes at each specified crad. The nggcog is used for the computations.
The gc_inout function can be used to retain or exclude values within the radii. Some examples of using gc_inout for this purpose are at:
- Katrina_circle
- shapefiles: Examples 5, 9 and 13
See Also
Examples
Example 1: The plot created by the following script is here.
; *********************************
; Draw circles
;**********************************
;---One station with multiple radii
slat = 30.192 ; lat: station or storm
slon = 280.477 ; lon: station or storm
srad = (/ 50, 150, 300, 500, 750/) ; station radii (km)
srad_unit = 1 ; km
N = 180 ; # of points; more points nicer 'circle'
opt = False
;---End input
nLoc = dimsizes(slat) ; # locations
nRad = dimsizes(srad) ; # radii
circle = geolocation_circle(slat, slon, srad, srad_unit, N, opt) ; circle is type list
;---Extract variables from 'list'
printVarSummary(circle)
circle_lat = circle[0] ; clarity: explicitly extract list variables
circle_lon = circle[1]
;---Print and examine returned variables
printVarSummary(circle_lat)
print("------------------")
printVarSummary(circle_lon)
print("------------------")
;---Print the lat/lon for the last radius [ for fun ]
print(circle_lat(nRad-1,:)+" "+circle_lon(nRad-1,:))
;*************************************************
; Plot
;*************************************************
pltType = "png"
pltDir = "./"
pltName = "geolocation_circle"
pltPath = pltDir + pltName
;---Resources for background map
res = True
res@gsnDraw = False
res@gsnFrame = False
res@gsnMaximize = True
;res@mpProjection = "CylindricalEquidistant" ; choose map projection
;res@mpLimitMode = "LatLon"
res@mpOutlineBoundarySets = "GeophysicalAndUSStates" ; add state boundaries
res@mpGeophysicalLineColor = "Gray"
res@mpUSStateLineColor = "LightGray"
res@mpMinLatF = slat - 7.5 ; add 'buffer' around central location
res@mpMaxLatF = slat + 7.5
res@mpMinLonF = slon - 10
res@mpMaxLonF = slon + 10
res@mpCenterLonF = (res@mpMinLonF + res@mpMaxLonF )*0.5
res@mpGeophysicalLineThicknessF = 1.5
res@mpFillOn = False
;--Text for map
res@tiMainString = "Center: ("+sprintf("%5.1f", slat)+","+sprintf("%5.1f", slon)+")"
res@gsnStringFontHeightF = 0.0125
res@gsnLeftString = "Radii: km: "
res@gsnRightString = "dg: "
do nr=0,nRad-2
res@gsnLeftString = res@gsnLeftString + sprinti("%2.2i", srad(nr))+","
res@gsnRightString = res@gsnRightString + sprintf("%4.2f", circle_lat@radii_converted_values(nr) )+","
end do
res@gsnLeftString = res@gsnLeftString + sprinti("%2.2i", srad(nRad-1))
res@gsnRightString = res@gsnRightString + sprintf("%4.2f", circle_lat@radii_converted_values(nRad-1) )
;*****************************************************
; Plot
;*****************************************************
wks = gsn_open_wks(pltType, pltPath)
plot = gsn_csm_map(wks,res) ; draw background map
plres = True
plres@gsMarkerIndex = 2 ; Plus sign ( + )
;plres@gsMarkerIndex = 15 ; Circle with x
;plres@gsMarkerIndex = 16 ; Filled Circle
plres@gsMarkerSizeF = 10.
plres@gsMarkerColor = "black"
plot@$"marker"$ = gsn_add_polymarker(wks, plot, slon, slat, plres) ; "marker" is arbitrary
colors = (/ "magenta", "orange", "red", "DarkGreen", "blue" /)
thick = (/ 1 , 1.5 , 2.0 , 3.0 , 4.0 /)
do nl=0,nLoc-1
do nr=0,nRad-1
plres@gsLineColor = colors(nr)
plres@gsLineThicknessF = thick(nr)
circ_id = "radii_"+nl+"_"+nr ; any unique name
plot@$circ_id$ = gsn_add_polyline(wks, plot, circle_lon(nl,nr,:), circle_lat(nl,nr,:), plres)
end do ; nr
end do ; nl
draw(plot)
frame(wks)
------------------------------------------------------------------------- The (edited) output follows:
Variable: circle
Type: list
Total items: 2
Variable: circle_lat
Type: float
Total Size: 3600 bytes
900 values
Number of Dimensions: 2
Dimensions and sizes: [location | 1] x [radii | 5] x [circle | 180]
Coordinates:
Number Of Attributes: 7
units : degrees_north
long_name : circle latitudes
radii_converted_values : ( 0.4522022, 1.356607, 2.713213, 4.522022, 6.783033 )
radii_converted_units : great_circle_degrees
radii_input_values : ( 50, 150, 300, 500, 750 )
radii_input_units : km
_FillValue : 9.96921e+36
------------------
Variable: circle_lon
Type: float
Total Size: 3600 bytes
900 values
Number of Dimensions: 2
Dimensions and sizes: [location | 1] x [radii | 5] x [circle | 180]
Coordinates:
Number Of Attributes: 7
units : degrees_east
long_name : circle longitudes
radii_input_units : km
radii_input_values : ( 50, 150, 300, 500, 750 )
radii_converted_units : great_circle_degrees
radii_converted_values : ( 0.4522022, 1.356607, 2.713213, 4.522022, 6.783033 )
_FillValue : 9.96921e+36
------------------
(0) 23.409 -79.523
(1) 23.4129 -79.2642
(2) 23.4247 -79.0057
(3) 23.4443 -78.7477
(4) 23.4717 -78.4905
(5) 23.5069 -78.2344
(6) 23.5499 -77.9796
(7) 23.6005 -77.7264
(8) 23.6589 -77.475
[SNIP]
(86) 36.9199 -78.4856
(87) 36.9469 -78.7809
(88) 36.9649 -79.0773
(89) 36.9739 -79.3744
(90) 36.9739 -79.6717
(91) 36.9649 -79.9688
(92) 36.9469 -80.2651
(93) 36.9199 -80.5604
(94) 36.8839 -80.854
[SNIP]
(172) 23.6005 -81.3196
(173) 23.5499 -81.0665
(174) 23.5069 -80.8117
(175) 23.4717 -80.5555
(176) 23.4443 -80.2983
(177) 23.4247 -80.0403
(178) 23.4129 -79.7818
(179) 23.409 -79.523
Example 2: The following illustrates multiple locations and radii. The full script is here. The created plot is here.
;---Multiple locations (eg: time series of locations) and radii slat = (/ 27.0, 31.5, 34.7 /) ; lat: stations or storm centers slon = (/273.5,280.0,284.3/) ; lon: stations or storm centers srad = (/ 1, 3 /) ; radii (great circle degrees) srad_unit = 0 ; 0=degrees N = 90 ; # of points; more points nicer 'circle' opt = False [SNIP]The (edited) output follows:
Variable: circle_lat
Type: float
Total Size: 2160 bytes
540 values
Number of Dimensions: 3
Dimensions and sizes: [location | 3] x [radii | 2] x [circle | 90]
Coordinates:
Number Of Attributes: 5
_FillValue : 9.96921e+36
radii_units_input : great_circle_degrees
radii_input_values : ( 1, 3 )
long_name : circle latitudes
units : degrees_north
------------------
Variable: circle_lon
Type: float
Total Size: 2160 bytes
540 values
Number of Dimensions: 3
Dimensions and sizes: [location | 3] x [radii | 2] x [circle | 90]
Coordinates:
Number Of Attributes: 5
_FillValue : 9.96921e+36
radii_input_values : ( 1, 3 )
radii_units_input : great_circle_degrees
long_name : circle longitudes
units : degrees_east
Example 3: Mask values using gc_inout. Plot data within defined radius only.
See: Examples polyg_29, polyg_30, polyg_31