Learn how to create, configure, and share interactive geo-dashboards
Welcome to the QGeoDash tool! This platform allows you to transform your CSV or Excel data into interactive, shareable geo-dashboards using a simple YAML configuration language. No coding experience required!
All dashboards are private by default. You need to be authenticated to create, edit, or delete dashboards.
π‘ Note: Your session will remain active for 30 days. You can log out at any time.
{
"date_column": "DATE",
"value_column": "FLOAT",
"category_column": "TEXT"
}β οΈ Important: Column names with spaces or special characters are automatically sanitized. Use quotes in your YAML when referencing them (e.g., "Specie counts").
The heart of your dashboard is the YAML configuration file. It defines the dashboard's name, layout, charts, map, and menus. YAML is a human-readable data format that's easy to learn.
geo-dashboard:
name: "My Dashboard Name"
template: side_content
download: false # Set to true to enable data download button
filters:
- column: Year
operator: ">="
value: 2020
stats:
- type: bar
title: "My Chart Title"
x: category_column
y: count
interactiveFilters:
- column: Year
label: Year Range
type: range
- column: Country
label: Country
type: multiselect
map:
lat: latitude_column
lon: longitude_column
menus:
about: "Information about this dashboard"
stats: "Statistical summary"
map: "Map description"side_content - Sidebar on the left, main content on the right (recommended)top_content - Menus on top, charts belowcontent_side - Main content on the left, sidebar on the rightcontent_bottom - Menus on top, charts in the middle, map at bottomSet download: true in the root of the config to display a "Download Data" button in the sidebar. When clicked, it exports the currently filtered dataset (respecting global and interactive filters) as a CSV file.
- type: bar
title: "Sales by Category"
x: category
y:
column: sales
aggregation: sum- type: line
title: "Trend Over Time"
x: year
y:
column: value
aggregation: avg- type: pie
title: "Distribution by Category"
x: category
y: count # Simple count of rows- type: stackedbar
title: "Species by Country"
x: country
y:
column: count
aggregation: sum
stackBy: speciessum - Total sum of valuesavg - Average valuecount - Number of recordsmin - Minimum valuemax - Maximum valuecount distinct - Number of unique valuesmap:
lat: latitude_column
lon: longitude_columnmap:
lat: lat
lon: lon
clustering:
enabled: true
maxClusterRadius: 80
disableClusteringAtZoom: 14
limit: 15000
style:
colorBy: category_column
sizeBy: value_column
defaultColor: "#94a3b8"
defaultSize: 6
minSize: 4
maxSize: 14
rules:
- field: category
operator: "="
value: "Type A"
color: "#ef4444"
label: "Category A"
- field: category
operator: "="
value: "Type B"
color: "#3b82f6"
label: "Category B"
legend:
title: "Legend Title"
position: "bottomright"fieldsBy default, the map endpoints return every column of your table for every point. For wide tables (dozens of columns) this dominates both network transfer and browser rendering time, even with clustering enabled. Add a fields list under map to ship only the columns the popup actually needs.
map:
lat: common_latitude
lon: common_longitude
fields:
- source
- countryCode
- common_year
- common_month
- individualCount
clustering:
enabled: true
limit: 3000
style:
sizeBy: individualCount
rules:
- field: common_year
operator: ">="
value: 2020
color: "#00ff00"
label: "2020β2026"π‘ How fields works: The backend always augments the list you provide with:
lat and lon β required to build the point geometrystyle.sizeBy β required to compute marker radiusstyle.colorBy β reserved for future colour-by supportstyle.rules[].field β required for colour rule matchingSo you don't need to list those yourself. If a listed column doesn't exist in the data table, it's silently skipped and a warning is logged β no need to update every dashboard when you rename a column.
β οΈ Performance tip: For tables with many columns (20+), setting fieldstypically reduces the map payload by 5β10Γ. Combine it with a modest clustering.limit(3000β5000) for best results. If fields is omitted entirely, all columns are returned β same behaviour as before, so existing dashboards keep working.
enabled - Enable/disable clustering (boolean)maxClusterRadius - Maximum radius of clusters in pixelsdisableClusteringAtZoom - Zoom level where clusters break apartspiderfyOnMaxZoom - Spread out clusters when zooming inchunkedLoading - Load markers in batches for performancelimit - Maximum points to load per viewportFilters can be applied globally to all charts and the map, or specifically to individual charts.
= - Equal to!= - Not equal to> - Greater than>= - Greater than or equal to< - Less than<= - Less than or equal tolike - Pattern matching (use % as wildcard)in - Value in a listbetween - Between two valuesfilters:
- column: year
operator: ">="
value: 2020
- column: country
operator: in
value: ["USA", "Canada", "Mexico"]- type: bar
title: "Filtered Chart"
x: category
y: count
filters:
- column: status
operator: "="
value: "active"
- column: value
operator: ">"
value: 100Interactive filters appear in the sidebar and allow users to dynamically filter the dashboard without editing YAML. They are defined in the YAML under interactiveFilters.
dropdown - Single-select dropdownmultiselect - Multi-select dropdown with searchrange - Range slider for numeric columnsinteractiveFilters:
- column: Year
label: Year Range
type: range
- column: Country
label: Country
type: multiselect
- column: Form
label: Disease Form
type: dropdownπ‘ Tip: The range filter automatically fetches the minimum and maximum values from your data (respecting global filters) and displays a slider. Adjusting it instantly updates all charts and the map.
If you set download: true in the YAML, a "Download Data" button appears in the sidebar. When clicked, it exports the currently filtered dataset (including all applied global and interactive filters) as a CSV file.
geo-dashboard:
download: true
# ... rest of configThe download respects all active filters, so users can export exactly the subset they're viewing.
On the dashboard edit page, a rich preview shows information about the uploaded data:
This helps you understand the structure of your data before building charts and maps.
geo-dashboard:
name: "Leishmaniasis Vector Surveillance Dashboard"
template: side_content
download: true
filters:
- column: Year
operator: ">="
value: 2000
interactiveFilters:
- column: Year
label: Year Range
type: range
- column: Country
label: Country
type: multiselect
- column: Form
label: Disease Form
type: dropdown
stats:
- type: pie
title: "Top 10 VL Vectors by Abundance"
x: species
y:
column: "Specie counts"
aggregation: sum
filters:
- column: Form
operator: "="
value: VL
- type: bar
title: "VL Vector Abundance by Country"
x: Country
y:
column: "Specie counts"
aggregation: sum
filters:
- column: Form
operator: "="
value: VL
map:
lat: Lat
lon: Lon
fields:
- species
- Country
- Form
- "Specie counts"
- Year
clustering:
enabled: true
limit: 3000
style:
colorBy: Form
sizeBy: "Specie counts"
rules:
- field: Form
operator: "="
value: VL
color: "#ef4444"
label: "VL Vectors"
- field: Form
operator: "="
value: CL
color: "#3b82f6"
label: "CL Vectors"
legend:
title: "Vector Types"
position: "bottomright"
menus:
about: |
## π¦ Leishmaniasis Vector Surveillance Dashboard
A comprehensive visualization platform for sand fly vector surveillance data...All API endpoints are available under the /qgd_api base path.
POST /tokenGet access token (username/password)
GET /dashboards/List all dashboards (paginated)
POST /dashboards/addCreate a new dashboard
GET /dashboards/{id}Get dashboard details
PUT /dashboards/{id}/editRename dashboard
POST /dashboards/{id}/deleteDelete a dashboard
PUT /dashboards/{id}/configUpdate dashboard YAML configuration
POST /dashboards/{id}/add_dataUpload data files (CSV/Excel)
GET /dashboards/{id}/configGet dashboard configuration (public)
GET /dashboards/{id}/pointsGet all map points as GeoJSON
POST /dashboards/{id}/points-in-viewGet points within bounding box (for clustering)
POST /dashboards/{id}/chart-dataGet aggregated data for a chart
POST /dashboards/{id}/distinct-valuesGet distinct values for a column (for stacked charts)
GET /dashboards/{id}/dashboard.jsGet generated JavaScript config
GET /dashboards/{id}/data-infoGet data preview (rows, columns, sample)
POST /dashboards/{id}/exportExport filtered data as CSV
map.fields, confirm lat and lon still point to real columnsmap.fields must be a list of column names, not a comma-separated stringmap.fields to ship only the popup columns (biggest single win for wide tables)clustering.limit to 3000β5000 per viewport request>=/<= style rules over in with long arraysVersion 1.1.0 | Last updated: September 2026 | Β© 2025 QGeoDash Platform