You may be missing a more basic approach.
Shove a texture in the decal, use world position to place it and stretch it across your world.
You can then sample that texture in the decal, and do whatever based on the value it reports.
An 8k texture can provide 4pixels stretched to 1/2m on a 4km^2 area.
Dimminishing returns come in as you add more textures or set up a tile&swap system.
Also consider the fact running a single 8k texture may cost more ms than 10 instances…
If you need more control than this, you can hard code a location array based on world positions.
At that point though, .usf the thing instead of messing with the engine instances…