Plot an interactive canvas of GeometryBaseics Point, LineString or Polygon, or an ms-paint style canvas for any numerical or color Array. These can be overlayed and activated/deactivated to have multiple drawing task on the same Axis.
makie_draw_life.webm
Drawing into a DynamicGrids.jl game of life simulation
GeometryCanvascan be used to manually crreate GeoInterface.jl compatible FeatureCollections (and even add metadata columns for each geometry), which can be done over a heatmap or other spatial plot. AGeometryCanvascan be written directly to disk with GeoJSON.jl or Shapefile.jl.GeometryCanvascan also be used to edit any GeoInterface.jl compatible geometries and feature collections.PaintCanvascan be used to manually edit matrices of any kind that Makie can plot. You could makeBoolmask layers over maps or other images, edit categorical images, or just draw some retro pictures on aMatrix{RGB}.- MakieDraw could also be used for live interaction, such as using 
PaintCanvasas a mask or aux layer in DynamicGrids.jl simulations. 
makie_draws-2023-03-29_17.48.57.webm
Or try this example over Tyler.jl tiles:
using MakieDraw
using GLMakie
using GeoJSON
using GeometryBasics
using GeoInterface
using TileProviders
using Tyler
using Extents
provider = Google(:satelite)
figure = Figure()
axis = Axis(figure[1, 1])
tyler = Tyler.Map(Extent(Y=(-27.0, 0.025), X=(0.04, 38.0)); 
    figure, axis, provider=Google()
)
categories = Observable(Int[])
point_canvas = GeometryCanvas{Point2}(; 
  figure, axis, properties=(; categories), mouse_property=:categories,
  scatter_kw=(; color=categories, colorrange=(0, 2), colormap=:spring)
)
line_canvas = GeometryCanvas{LineString}(; figure, axis)
line_canvas.active[] = false
point_canvas.active[] = true
poly_canvas = GeometryCanvas{Polygon}(; figure, axis)
layers = Dict(
    :point=>point_canvas, 
    :line=>line_canvas,
    :poly=>poly_canvas,
)
MakieDraw.CanvasSelect(figure[3, 1], axis; layers)
# Write the polygons to JSON
# Have to convert here because GeometryBasics `isgeometry` has a bug, see PR #193
polygons = GeoInterface.convert.(Ref(GeoInterface), poly_canvas.geoms[])
mp = GeoInterface.MultiPolygon(polygons)
GeoJSON.write("multipolygon.json", mp)
# Reload and edit again
polygons = collect(GeoInterface.getgeom(GeoJSON.read(read("multipolygon.json"))))
tyler = Tyler.Map(Extent(Y=(-27.0, 0.025), X=(0.04, 38.0)); provider)
fig = tyler.figure;
axis = tyler.axis;
poly_canvas = GeometryCanvas(polygons; figure, axis)GeometryCanvas keys:
Cick to add, grab or drag points. Left/Right/Center can be used for data entry of 0/1/2 with the mouseproperty keyword.
Shift + click starts new lines and polygons.
Alt + click deletes points, hold and drag continues deleting them.
PaintCanvas keys:
Left click draws with fill_left, right click draws with fill_right.