I'm experienced with Rust, but have no idea what to pick for the task. Here's what I can do in Python:
Make a matrix, lets say 1000x1000 cells, let's say u32 type.
Treat it like raster image, draw a geometry, not like painting, but like adding 1 or whatever u32 value to the cells the figure covers. And not be limited by 255 value of RGB.
Ideally, increment by N, but if a figure covers a cell only partially, increment it by a respective fraction of N.
Maybe blur the image with Gaussian blur, or maximum in a radius.
Save to GeoTiff (Tiff with geospatial location tags), again not in colored format, but as an array of integer values. (GeoTiff can compress this data, not just deflate, but even with PNG compression.)
In numpy & other tools, it's doable. These are numeric and scientific libraries, not like image processing, where each channel is limited like 0..255.
I wonder how much of this I can outsource to libraries in Rust, rather than implement this myself.
It’s not exactly meant for this, but embedded-graphics has drawing routines which you can run on your own choice of buffer type, which can do whatever kind of compositing/accumulating operation you care to write.
I don’t have any pure Rust library suggestions for your other steps.
The most efficient way to execute a blur and large-area accumulation operations would be to do it on a GPU (perhaps using wgpu), but that will require lots more glue code and doesn’t help with writing the GeoTIFF output. (Yes, GPUs do support 16-bit image data.)
ndarray should give you a good storage for the images and ndarra-conv should allow you to do blur by doing convolution with a blur kernel.
to draw the primitives you will likely have to do it yourself, should be fairly simple
Thanks to you all for suggestions. I found out image crate has a rough version of what I needed -- rasters of arbitrary type, gaussian blurring. The only missing thing is a custom kernel function, (e.g. instead of points weighted by normal distribution on distance, to just have a maximum in a radius).