5 Steps to Master Deneb Map Visuals in PowerBI (2025)
Unlock stunning, custom map visuals in Power BI. Follow our 5-step guide to master Deneb and Vega-Lite for creating interactive, data-rich maps in 2025.
Elena Petrova
Power BI MVP and data visualization specialist passionate about crafting compelling data stories.
5 Steps to Master Deneb Map Visuals in PowerBI (2025)
Let's be honest. Power BI’s built-in map visuals are good, but they have their limits. Have you ever wanted to overlay multiple data layers, create a non-standard map projection, or design a map with completely custom tooltips and interactions? If you've hit a wall with the standard visuals, I have one word for you: Deneb.
Deneb is a custom visual for Power BI that lets you build visuals using the declarative languages of Vega-Lite and Vega. It opens up a universe of possibilities, especially for maps. But it can also feel intimidating, with its JSON-based specifications and grammar of graphics concepts.
Don't worry. We're going to break it down. Forget the complexity for a moment. By following these five core steps, you'll go from a blank canvas to a stunning, interactive map that will leave your stakeholders speechless. Let's get started.
Step 1: The Foundation - Get Your GeoJSON Right
Before you even touch Power BI, you need the blueprint for your map. This blueprint is a file format called GeoJSON. Think of it as a text file that describes geographic shapes—countries, states, sales regions, you name it.
The most critical part of any GeoJSON file is its properties
. Each shape (or "feature") in the file has a set of properties. For your map to work, one of these properties must match a column in your Power BI data model. This is the key that will link your data (like sales figures) to the map shapes.

Where to find GeoJSON files?
- Natural Earth Data: A fantastic resource for public domain map datasets of countries, states, and more.
- Government GIS Portals: Many cities, states, and countries provide their own official boundary files.
Pro Tip: GeoJSON files can be large and complex. Use a free online tool like Mapshaper to simplify the geometry. A smaller file means a faster, more responsive visual in Power BI.
Step 2: Setting Up the Deneb Canvas
Now, let's head into Power BI. First, get the Deneb custom visual from AppSource if you haven't already. Once it's in your visuals pane, add it to your report canvas.
The next step is to feed it data. In the "Values" pane for the Deneb visual, you need to add the fields it will use. For a basic choropleth map, you'll need at least two:
- The Joining Key: The column from your data that matches the property in your GeoJSON (e.g., 'Country Code').
- The Measure: The numerical value you want to visualize (e.g., 'Total Sales').
Click on the visual and then the "..." in the top right corner, and select "Edit." This opens the Deneb Visual Editor. This is your new creative space. You'll see a "Specification" tab with some basic JSON. This is what we're going to build upon.
Step 3: Your First Vega-Lite Map Specification
This is the heart of the process. We're going to write a Vega-Lite specification. It looks like code, but it's really just a set of instructions describing your visual. We'll create a simple choropleth map, where each country is colored by its sales value.
First, we need to tell Deneb where to find our GeoJSON file. In the "Config" tab, you can define a URL to your GeoJSON. This is the cleanest method.
The Specification: A Choropleth Map
Go to the "Specification" tab, delete the boilerplate code, and paste this in. We'll break it down below.
{
"data": {
"url": "https://your-url/to/your-countries.json",
"format": {
"property": "features"
}
},
"projection": {
"type": "mercator"
},
"transform": [
{
"lookup": "properties.iso_a2",
"from": {
"data": {
"name": "dataset"
},
"key": "Country Code",
"fields": ["Total Sales", "Country Name"]
}
}
],
"mark": {
"type": "geoshape",
"stroke": "white",
"strokeWidth": 0.5
},
"encoding": {
"color": {
"field": "Total Sales",
"type": "quantitative",
"scale": {"scheme": "blues"}
}
}
}
Breaking It Down
"data"
: We point to our GeoJSON file via a URL."property": "features"
tells Vega-Lite to look for the array of shapes inside that file."projection"
: This defines how the 3D globe is flattened onto your 2D screen. `mercator` is a web standard."transform"
: This is the magic! Thelookup
is like a VLOOKUP or a JOIN. It says: "For each shape in the GeoJSON, look at itsproperties.iso_a2
value. Find the matching value in the Power BIdataset
'sCountry Code
column. When you find a match, pull in theTotal Sales
andCountry Name
fields.""mark"
: We tell it to draw ageoshape
for each feature."encoding"
: This connects the data to the visual properties. We're telling it to encode thecolor
of each shape based on the `Total Sales` field, treating it as a quantitative value and using a blue color scheme.
Make sure to replace the URL, lookup keys (`properties.iso_a2`, `Country Code`), and field names (`Total Sales`, `Country Name`) with your own.
Step 4: Adding Interactivity and Rich Tooltips
A static map is nice, but an interactive one is powerful. Let's add two essential features: tooltips and zoom/pan functionality.
Creating Rich Tooltips
A good tooltip provides context at a glance. In your Vega-Lite spec, add a `tooltip` property to your `encoding` block. It takes an array of fields you want to display.
Modify your `encoding` block to look like this:
"encoding": {
"color": {
"field": "Total Sales",
"type": "quantitative",
"scale": {"scheme": "blues"}
},
"tooltip": [
{"field": "properties.name", "type": "nominal", "title": "Country"},
{"field": "Total Sales", "type": "quantitative", "format": ",.0f"}
]
}
Now when you hover over a country, you'll see its name and formatted sales value. Easy, right?
Enabling Zoom and Pan
To let users explore the map, we can add zoom and pan controls with a `selection` property. Add this block to the top level of your JSON spec (at the same level as `projection` and `mark`).
"selection": {
"grid": {
"type": "interval",
"bind": "scales"
}
}
This simple block tells Vega-Lite to create an "interval selection" that is bound to the scales of the visual. In plain English, it means you can now use your mouse wheel to zoom and click-and-drag to pan around the map. It's a huge win for user experience with minimal effort.
Step 5: Leveling Up with Advanced Layers
The true power of Deneb comes from its ability to layer visuals. You're not limited to a single choropleth. You can stack marks on top of each other.
Let's say you want to plot your office locations as circles on top of the sales map. To do this, you'll need a dataset with office names, latitudes, and longitudes.
The structure involves converting your spec to use a `layer` array. Each object in the array is a complete visual specification that shares the same space.
Here’s a conceptual structure:
{
"projection": { ... },
"layer": [
{
// This is your entire choropleth map spec from Step 3 & 4
"data": { ... },
"transform": [ ... ],
"mark": "geoshape",
"encoding": { ... }
},
{
// This is the new layer for city points
"data": {"name": "dataset"},
"mark": "circle",
"encoding": {
"longitude": {"field": "Office Longitude", "type": "quantitative"},
"latitude": {"field": "Office Latitude", "type": "quantitative"},
"size": {"value": 100},
"color": {"value": "red"}
}
}
]
}
In this example, the first layer is our choropleth map. The second layer reads longitude and latitude fields from your Power BI dataset and plots them as red circles on top of the map. This layering technique is incredibly versatile—you can add flight paths, text labels, heatmaps, and more.
Your Journey Has Just Begun
We've covered the five fundamental steps to get you building powerful, custom maps in Power BI with Deneb:
- Prepare your GeoJSON with the right join key.
- Set up your Deneb canvas with the necessary data fields.
- Write a basic Vega-Lite spec using a `lookup` transform.
- Add interactivity with tooltips and zoom/pan selections.
- Explore advanced techniques like layering multiple marks.
This is your launchpad. The world of Vega-Lite is vast, and the best way to learn is by experimenting. Tweak the colors, try different mark types, and explore the extensive Vega-Lite documentation. You now have the framework to stop saying "I wish Power BI could..." and start building exactly what you envision. Go create something amazing!