diff --git a/.github/workflows/Documenter.yml b/.github/workflows/Documenter.yml index d4c91256..9f2f282f 100644 --- a/.github/workflows/Documenter.yml +++ b/.github/workflows/Documenter.yml @@ -3,6 +3,7 @@ on: push: branches: - master + - AddInterpolations tags: '*' pull_request: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39e6152c..745e8ba6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,7 @@ on: push: branches: - master + - AddInterpolations tags: '*' pull_request: diff --git a/docs/Project.toml b/docs/Project.toml index 8c2af70e..9f0c4fc0 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -9,6 +9,7 @@ DocumenterMarkdown = "997ab1e6-3595-5248-9280-8efb232c3433" Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" LightOSM = "d1922b25-af4e-4ba3-84af-fe9bea896051" Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" MapTiles = "fea52e5a-b371-463b-85f5-81770daa2737" diff --git a/docs/examples/UserGuide/interpolation.jl b/docs/examples/UserGuide/interpolation.jl new file mode 100644 index 00000000..af7e9db0 --- /dev/null +++ b/docs/examples/UserGuide/interpolation.jl @@ -0,0 +1,32 @@ +# # Using Interpolation On The Fly + +using Tyler, GLMakie +using Interpolations: interpolate, Gridded, Linear + +f(lon,lat)=cosd(16*lon)+sind(16*lat) + +f_in_0_1_range(lon,lat)=0.5+0.25*f(lon,lat) + +nodes=(-180.0:180.0, -90.0:90.0) +array=[f(lon,lat) for lon in nodes[1], lat in nodes[2]] +array=(array.-minimum(array))./(maximum(array)-minimum(array)) +itp = interpolate(nodes, array, Gridded(Linear())) +cols=Makie.to_colormap(:viridis) +col(i)=RGBAf(Makie.interpolated_getindex(cols,i)) +fun(x,y) = col(itp(x,y)) + +options = Dict(:min_zoom => 1,:max_zoom => 19) +p1=Tyler.Interpolator(f_in_0_1_range,options) +p2=Tyler.Interpolator(fun,options) + +b = Rect2f(-20.0, -20.0, 40.0, 40.0) +m = Tyler.Map(b, provider=p1) + +# !!! info +# Sine Waves + +# !!! tip +# Try `b = Rect2f(-180.0, -89.9, 360.0, 179.8)` + +# !!! tip +# `interpolated_getindex` requires input `i` to be in the 0-1 range diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 7ecdf88d..f42049d5 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -108,5 +108,6 @@ nav: - "Ice loss animation" : "examples/generated/UserGuide/iceloss_ex.md" - "Map Tile providers" : "examples/generated/UserGuide/providers.md" - "OSMMakie integration" : "examples/generated/UserGuide/osmmakie.md" + - "On The Fly Interpolation" : "examples/generated/UserGuide/interpolation.md" - "Contributors": - - "Contribute to Documentation" : "examples/generated/Contributors/Howto.md" \ No newline at end of file + - "Contribute to Documentation" : "examples/generated/Contributors/Howto.md" diff --git a/src/Tyler.jl b/src/Tyler.jl index 97e91b76..4afa6c54 100644 --- a/src/Tyler.jl +++ b/src/Tyler.jl @@ -16,6 +16,9 @@ using OrderedCollections using HTTP using ImageMagick +include("for_interpolations.jl") +using Tyler.ForInterpolations: tile2positions, Interpolator + const TileImage = Matrix{RGB{N0f8}} struct Map @@ -211,14 +214,34 @@ function create_tile_plot!(tyler::Map, tile::Tile, image::TileImage) place_tile!(tile, mplot, tyler.coordinate_system) end +## + function fetch_tile(tyler::Map, tile::Tile) return get!(tyler.fetched_tiles, tile) do - url = TileProviders.geturl(tyler.provider, tile.x, tile.y, tile.z) - result = HTTP.get(url; retry=false, readtimeout=4, connect_timeout=4) - return ImageMagick.readblob(result.body) + fetch_tile(tyler.provider,tile) end end +function fetch_tile(provider::AbstractProvider, tile::Tile) + url = TileProviders.geturl(provider, tile.x, tile.y, tile.z) + result = HTTP.get(url; retry=false, readtimeout=4, connect_timeout=4) + return ImageMagick.readblob(result.body) +end + +cols=Makie.to_colormap(:thermal) +col(i)=RGBAf(Makie.interpolated_getindex(cols,i)) +col(i::RGBAf)=i + +function fetch_tile(provider::Interpolator, tile::Tile) + itp=provider.url + (lon,lat) = tile2positions(tile) + z = permutedims(itp.(lon,lat)) + return [col(i) for i in z] +end + + +## + function queue_tile!(tyler::Map, tile) queue = tyler.tiles_being_added # NO need to start a need task! diff --git a/src/for_interpolations.jl b/src/for_interpolations.jl new file mode 100644 index 00000000..5d452f0d --- /dev/null +++ b/src/for_interpolations.jl @@ -0,0 +1,28 @@ +module ForInterpolations + + using MapTiles + using TileProviders: AbstractProvider + export tile2positions, Interpolator + + lng2tile(lng, zoom) = floor((lng+180)/360*2^zoom) + lat2tile(lat, zoom) = floor((1-log(tan(lat*pi/180)+1/cos(lat*pi/180))/pi)/2*2^zoom) + + tile2lng(x, z) = (x/2^z*360)-180 + tile2lat(y, z) = - 180/pi*atan(0.5*(exp(pi-2*pi*y/2^z)-exp(2*pi*y/2^z-pi))) + + tile2positions(tile::Tile) = tile2positions(tile.x,tile.y,tile.z) + + function tile2positions(x,y,z) + rng=range(0.5/232,231.5/232,232) + lons=[tile2lng(x+i,z) for i in rng, j in rng] + lats=[tile2lat(y+j,z) for i in rng, j in rng] + (lons,lats) + end + + struct Interpolator <: AbstractProvider + url::Function + options::Dict{Symbol,Any} + end + +end +