Skip to main content

Genie Map

Genie Map is a Databricks App that turns the GeoBrix-processed Permian methane gold data into an interactive map. It sits on top of the Vapor-Eyes methane pipeline: where that pipeline detects and attributes methane over the Permian Basin, Genie Map is where you go to look at the result and interrogate it. The client is React + kepler.gl; the server is Databricks AppKit; the data is the geospatial_docs.vapor_eyes_lf gold schema.

Featured at Data + AI Summit 2026 — with S&P Global

Genie Map grew out of the AI-powered map-agent demo from the Data + AI Summit 2026 session Scaling Geospatial Analytics at S&P Global Energy: From Billions of Points to AI-Powered Map Agents with Databricks, presented by Hubert Boguski (S&P Global) and Michael Johns (Databricks).

Data + AI Summit 2026 session — “From Billions of Points to AI-Powered Map Agents with Databricks: Scaling Geospatial Analytics at S&P Global Energy,” presented by Hubert Boguski (S&P Global) and Michael Johns (Databricks)

Watch the session on databricks.com.

View on GitHub

apps/genie_map — the React + kepler.gl client, the AppKit server, and full setup instructions live here. See its README for the quickstart — prerequisites, environment setup, and the local-dev and deploy commands — and docs/BUILD.md for the full build narrative if you want to rebuild it or adapt it to another dataset.

Genie Map architecture — a React + kepler.gl client and an AppKit server reading the vapor-eyes gold schema through a SQL warehouse and a curated Genie Space

Two ways to explore

Genie Map answers the same data two ways, side by side.

Two paths through Genie Map — moving the map runs parameterized viewport SQL, while asking a question runs a Genie query that renders its geometry answer as a layer

Move the map. Every pan and zoom runs parameterized Spark SQL for the current viewport and redraws the layers. This path is deterministic: the same view always yields the same query and the same hexagons and points. Four layers ship:

LayerShapeWhat it shows
CH₄ hotspotsH3 hexagonsPeak methane concentration per cell
Well densityH3 hexagonsHow many wells fall in each cell
WellsPointsIndividual wells, with operator and play
EMIT plumesPointsDetected plumes, by peak concentration

Ask a question. Type a natural-language question in the AI Assistant panel — for example, "which operators have wells near the strongest plumes?" The panel routes the question to a curated Genie Space, and the shape of the answer decides how it lands on the canvas. There are two kinds of result, and it helps to ask with the one you want in mind.

Two kinds of question result

You want…Ask for…What the result must containWhat you get
A new map layer"Show / map / plot …" — e.g. "Show the latest plumes, strongest first"one ST_ASGEOJSON(...) geometry column (aliased *_geojson)Genie's answer is drawn as a new layer beside the others
An interactive chart that filters the map"Chart … and let me filter the map" — e.g. "Chart plume concentration and let me filter the map"one row per feature, carrying both a *_geojson geometry and chartable attributes (a number like max_conc_ppmm, plus categoricals like lead_operator)a chart whose selection highlights the matching features on the map, and vice-versa

The distinction is the row grain. A map-layer answer just needs geometry. The interactive chart needs geometry and per-feature attributes on the same rows — because the chart and the map layer are the same dataset, and selecting chart elements cross-filters the layer by row. A pre-aggregated rollup (one row per operator, per county, per H3 cell) still charts fine, but with no per-feature geometry it can't cross-filter the map — so when you want that interactivity, ask for the individual features, not the summary.

The charts plot numeric values (a histogram or box plot of a measure like max_conc_ppmm), so ask for a number to chart. To slice by a category such as operator, chart the number and add a kepler.gl filter on the category column — that filter drives the map too. (Asking to chart a category directly on an axis — "concentration by operator" as a scatter — doesn't produce a usable chart, since operator isn't numeric.)

Either way, a spoken question and a drawn map answer share one canvas.

Animated demo: asking the assistant to chart plume concentration, then brushing a range on the histogram to cross-filter the EMIT plumes on the map in real time

Above: the interactive-chart path. The user asks "Chart plume concentration and let me filter the map"; brushing a range on the resulting histogram filters the plume layer on the map to just that concentration band — the chart and map are the same dataset, so a selection in one cross-filters the other.

The AI Assistant panel building an EMIT-plumes-by-county choropleth on the map — county polygons joined to plume aggregates by lead_county and added as a new geojson layer colored by plume count, with a tooltip showing per-county plume_count and concentration stats, alongside the density-aware 3D hex layers

Above: the "new map layer" path in action. The user asked the assistant to map EMIT plumes by county; it joined the county polygons to plume aggregates by lead_county, added the result as a geojson layer colored by plume_count, and left the CH₄ hotspot and well layers in place — a natural-language question and its drawn answer on one canvas.

Density-aware dynamic H3

The map's standout behavior is how its hexagon layers pick their resolution. Keying resolution to zoom alone misbehaves on real data — a handful of hexagons blown up to a continental scale tells you nothing. So Genie Map chooses resolution from both zoom and data density.

Dynamic H3 resolution — zoom sets a ceiling, then cell count in view lowers the resolution only when the view is crowded; cell-sourced layers coarsen while point-sourced layers can also refine

  • Zoom sets a ceiling — the maximum resolution allowed at the current zoom.
  • Density lowers it only when crowded — when a view holds far more cells than the map can usefully show, the hexagons coarsen a step at a time. Sparse views stay at the ceiling, with no pointless coarsening.

The two hexagon layers differ in how far they can go. The CH₄ hotspots come from cells stored at the satellite's native resolution, so they coarsen when dense but never go finer than the instrument measured. The well-density layer bins raw well coordinates on the fly, so it can both coarsen when crowded and refine as you zoom in. The result reads naturally end to end: a basin-wide screen of coarse hexagons that resolves into fine cells and individual well pads as you close in.

One map-ready wells view

Both the well-density hexagons and the individual well points read one gold view, wells_enriched_latest. It takes the current well inventory and spatially tags each well with its shale play and its county and state, carrying the operator, lease, field, and a map-ready point — one row per well.

Data lineage — the vapor-eyes methane gold tables feed the wells_enriched_latest view, which feeds the well-density and well layers on the map

Built to be re-pointed

Genie Map is config-driven. One dataset configuration declares the list of layers, and everything downstream — the SQL each layer runs, the kepler layer it draws, when it is visible — is derived from that one declaration. Pointing the map at a different scenario is a matter of adding a configuration, not editing app code.

Layer registry — one dataset configuration declares many layers, each with its query, shape, styling, and zoom-visibility band