@@ -5,10 +5,10 @@ using Extents: Extents, Extent
5
5
using GeoInterface: GeoInterface
6
6
using GeometryBasics: GeometryBasics, GLTriangleFace, Point2f, Vec2f, Rect2f, Rect2, Rect, decompose, decompose_uv
7
7
using HTTP: HTTP
8
- using ImageMagick: ImageMagick
9
8
using LRUCache: LRUCache, LRU
10
9
using MapTiles: MapTiles, Tile, TileGrid, web_mercator, wgs84, CoordinateReferenceSystemFormat
11
- using Makie: Makie, Observable, Figure, Axis, RGBAf, on, isopen, meta, mesh!, translate!, scale!
10
+ using Makie: Makie, Observable, Figure, Axis, RGBAf, on, isopen, linesegments!, meta, mesh!, translate!, scale!
11
+ using Makie: FileIO, ImageIO
12
12
using OrderedCollections: OrderedCollections, OrderedSet
13
13
using ThreadSafeDicts: ThreadSafeDicts, ThreadSafeDict
14
14
using TileProviders: TileProviders, AbstractProvider, geturl, min_zoom, max_zoom
@@ -46,15 +46,15 @@ downloading and plotting more tiles as you zoom and pan.
46
46
-`scale`: a tile scaling factor. Low number decrease the downloads but reduce the resolution.
47
47
The default is `1.0`.
48
48
"""
49
- struct Map
49
+ struct Map{A <: Makie.AbstractAxis }
50
50
provider:: AbstractProvider
51
51
crs:: CoordinateReferenceSystemFormat
52
52
zoom:: Observable{Int}
53
53
figure:: Figure
54
- axis:: Axis
54
+ axis:: A
55
55
displayed_tiles:: OrderedSet{Tile}
56
56
plots:: Dict{Tile,Any}
57
- free_tiles:: Vector{Makie.Combined }
57
+ free_tiles:: Vector{Makie.Plot }
58
58
fetched_tiles:: LRU{Tile,TileImage}
59
59
max_parallel_downloads:: Int
60
60
# TODO , use Channel here
@@ -151,9 +151,15 @@ function Map(extent, extent_crs=wgs84;
151
151
ext_target = MapTiles. project_extent (extent, extent_crs, crs)
152
152
X = ext_target. X
153
153
Y = ext_target. Y
154
- axis. autolimitaspect = 1
155
- Makie. limits! (axis, (X[1 ], X[2 ]), (Y[1 ], Y[2 ]))
156
-
154
+ if axis isa Makie. Axis3
155
+ Makie. xlims! (axis, X[1 ], X[2 ])
156
+ Makie. ylims! (axis, Y[1 ], Y[2 ])
157
+ elseif axis isa Makie. LScene
158
+ # do nothing
159
+ else # any other axis is 2d
160
+ axis. autolimitaspect = 1
161
+ Makie. limits! (axis, (X[1 ], X[2 ]), (Y[1 ], Y[2 ]))
162
+ end
157
163
plots = Dict {Tile,Any} ()
158
164
tyler = Map (
159
165
provider, crs,
@@ -163,7 +169,7 @@ function Map(extent, extent_crs=wgs84;
163
169
max_parallel_downloads, OrderedSet {Tile} (),
164
170
tiles_being_added, downloaded_tiles,
165
171
display_task, download_task,
166
- depth, halo, scale, max_zoom
172
+ depth, Float64 ( halo), Float64 ( scale) , max_zoom
167
173
)
168
174
tyler. zoom[] = get_zoom (tyler, extent)
169
175
download_task[] = @async begin
@@ -204,16 +210,21 @@ function Map(extent, extent_crs=wgs84;
204
210
# Queue tiles to be downloaded & displayed
205
211
update_tiles! (tyler, ext_target)
206
212
207
- on (axis. scene, axis. finallimits) do extent
208
- stopped_displaying (figure) && return
209
- update_tiles! (tyler, extent)
210
- return
213
+ if axis isa Union{Makie. Axis, Makie. Axis3}
214
+ on (axis. scene, axis. finallimits) do extent
215
+ stopped_displaying (figure) && return
216
+ update_tiles! (tyler, extent)
217
+ return
218
+ end
219
+ else
220
+ # we can't hook it up so don't do anything.
221
+ # the user can zoom manually using `update_tiles!`.
211
222
end
212
223
return tyler
213
224
end
214
225
215
226
GeoInterface. crs (tyler:: Map ) = tyler. crs
216
- Extents. extent (tyler:: Map ) = Extents. extent (tyler. axis. finallimits[])
227
+ Extents. extent (tyler:: Map ) = Extents. extent (Makie . Rect2d ( tyler. axis. finallimits[]) )
217
228
218
229
function stop_download! (map:: Map , tile:: Tile )
219
230
# delete!(map.tiles_being_added, tile)
@@ -261,7 +272,7 @@ function place_tile!(tile::Tile, plot, crs)
261
272
xmin, xmax = bounds. X
262
273
ymin, ymax = bounds. Y
263
274
translate! (plot, xmin, ymin, tile. z - 100 )
264
- scale! (plot, xmax - xmin, ymax - ymin, 0 )
275
+ scale! (plot, xmax - xmin, ymax - ymin, 1 )
265
276
return
266
277
end
267
278
@@ -283,14 +294,17 @@ function create_tile_plot!(tyler::Map, tile::Tile, image::TileImage)
283
294
end
284
295
285
296
function fetch_tile (tyler:: Map , tile:: Tile )
297
+ # println("Fetching Tile")
286
298
return get! (tyler. fetched_tiles, tile) do
287
299
fetch_tile (tyler. provider, tile)
288
300
end
289
301
end
290
302
function fetch_tile (provider:: AbstractProvider , tile:: Tile )
291
303
url = TileProviders. geturl (provider, tile. x, tile. y, tile. z)
292
304
result = HTTP. get (url; retry= false , readtimeout= 4 , connect_timeout= 4 )
293
- return ImageMagick. readblob (result. body)
305
+ io = IOBuffer (result. body) # this wraps the byte data in an IO-like type
306
+ format = FileIO. query (io) # this interrogates the magic bits to see what file format it is (JPEG, PNG, etc)
307
+ return FileIO. load (format) # this actually loads the data using ImageIO.jl or whatever other FileIO loader exists
294
308
end
295
309
296
310
function queue_tile! (tyler:: Map , tile)
@@ -412,13 +426,13 @@ function grow_extent(area::Union{Rect,Extent}, factor)
412
426
end
413
427
414
428
function debug_tile! (map:: Tyler.Map , tile:: Tile )
415
- plot = linesegments! (map. axis, Rect2f (0 , 0 , 1 , 1 ), color= :red , linewidth= 1 )
429
+ plot = Makie . linesegments! (map. axis, Rect2f (0 , 0 , 1 , 1 ), color= :red , linewidth= 1 )
416
430
Tyler. place_tile! (tile, plot, web_mercator)
417
431
end
418
432
419
433
function debug_tiles! (map:: Tyler.Map )
420
- for tile in m . displayed_tiles
421
- debug_tile! (m , tile)
434
+ for tile in map . displayed_tiles
435
+ debug_tile! (map , tile)
422
436
end
423
437
end
424
438
0 commit comments