Replace circle markers with a canvas tile layer that renders smooth, flowing colored regions using bilinear interpolation between grid points. Colors interpolate between tiers for gradients. ~95k grid points at 0.125 degree resolution with wgrib2 extraction.
43 lines
1.2 KiB
Elixir
43 lines
1.2 KiB
Elixir
defmodule Microwaveprop.Propagation.Grid do
|
|
@moduledoc "CONUS grid definition for propagation scoring. 0.125 degree resolution (~14 km)."
|
|
|
|
@lat_min 25.0
|
|
@lat_max 50.0
|
|
@lon_min -125.0
|
|
@lon_max -66.0
|
|
@step 0.125
|
|
|
|
@doc "Returns all grid points as `{lat, lon}` tuples covering CONUS at 0.125 degree spacing."
|
|
def conus_points do
|
|
for lat <- float_range(@lat_min, @lat_max, @step),
|
|
lon <- float_range(@lon_min, @lon_max, @step) do
|
|
{Float.round(lat, 3), Float.round(lon, 3)}
|
|
end
|
|
end
|
|
|
|
@doc "Returns the grid step size in degrees."
|
|
def step, do: @step
|
|
|
|
@doc "Returns the CONUS bounding box as a map."
|
|
def bounds, do: %{lat_min: @lat_min, lat_max: @lat_max, lon_min: @lon_min, lon_max: @lon_max}
|
|
|
|
@doc "Returns the grid specification for wgrib2 -lola extraction."
|
|
def wgrib2_grid_spec do
|
|
lon_count = round((@lon_max - @lon_min) / @step) + 1
|
|
lat_count = round((@lat_max - @lat_min) / @step) + 1
|
|
|
|
%{
|
|
lon_start: @lon_min,
|
|
lon_count: lon_count,
|
|
lon_step: @step,
|
|
lat_start: @lat_min,
|
|
lat_count: lat_count,
|
|
lat_step: @step
|
|
}
|
|
end
|
|
|
|
defp float_range(start, stop, step) do
|
|
count = round((stop - start) / step) + 1
|
|
Enum.map(0..(count - 1), fn i -> start + i * step end)
|
|
end
|
|
end
|