Vector minimaps drawn for setpos.gg, a Counter-Strike 2 lineup site. Seven maps, each in dark and light colours, with transparent SVGs and 1024 / 2048 px PNGs. Use them in a demo viewer, a match dashboard, a guide, or anything else that needs a map.
Each pair shows dark on the left and light on the right. The drawings simplify cover and show overlapping routes with dashed lines. Nuke is upper level only; there is no lower level drawing in this repository. These are the drawings used on setpos.gg, not the game's radar textures. They may lag behind map updates.
Pick an SVG for scalable artwork, or a PNG for a fixed-size image. The artwork has a transparent background: use the dark version on a dark surface and the light version on a light surface. The previews include a background so both versions stay readable.
| Map | Preview | Dark files | Light files |
|---|---|---|---|
| Mirage | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
| Dust II | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
| Anubis | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
| Inferno | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
| Ancient | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
| Nuke (upper) | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
| Cache | ![]() |
SVG · 1024 PNG · 2048 PNG | SVG · 1024 PNG · 2048 PNG |
maps.json has each map's display name, calibration and relative file paths.
Its keys are the map slugs, such as mirage and dust2.
Every SVG has a 0 0 1024 1024 viewBox. Calibration uses the game's world coordinates:
posX / posY are the top-left origin, and scale is world units per radar pixel.
The image's Y axis points down, so subtract world Y from posY:
u = (worldX - posX) / scale
v = (posY - worldY) / scale
For an image displayed at width × height, place the point at
(u * width / radarSize, v * height / radarSize), relative to the image's top-left
corner. Keep the full square image when placing markers; cropping adds another offset.
The same formula works for the 2048 px PNGs by setting width and height to 2048.
Z is not used: positions on different floors can overlap, and the Nuke drawing does not
cover the lower floor.
JavaScript (after loading maps.json):
function worldToImage(x, y, calibration, width = 1024, height = width) {
const { posX, posY, scale, radarSize } = calibration;
return {
x: ((x - posX) / scale) * (width / radarSize),
y: ((posY - y) / scale) * (height / radarSize)
};
}
const maps = await (await fetch('./maps.json')).json();
const point = worldToImage(0, 0, maps.mirage.calibration);
// { x: 646, y: 342.6 }Python:
import json
def world_to_image(x, y, calibration, width=1024, height=None):
if height is None:
height = width
return (
(x - calibration["posX"]) / calibration["scale"]
* width / calibration["radarSize"],
(calibration["posY"] - y) / calibration["scale"]
* height / calibration["radarSize"],
)
with open("maps.json", encoding="utf-8") as source:
maps = json.load(source)
point = world_to_image(0, 0, maps["mirage"]["calibration"])
# (646.0, 342.6)Use them for anything, including commercial work, and change them however you like. All we ask is a credit:
Minimaps by [setpos.gg](https://setpos.gg)That's it: no licence link or change notes needed. The files are CC BY 4.0, and as the licensor we waive everything in it beyond that one credit line.
Found a mistake? Open an issue with the map name and a screenshot of the area. Everything here is generated from the same drawings setpos.gg uses, so fixes reach both.
Counter-Strike 2 is a trademark of Valve Corporation. Not affiliated with Valve.







