GitPedia

Google Map Card

Google Maps Card for Home Assistant

From catasevenΒ·Updated June 15, 2026Β·View on GitHubΒ·

* **Route Search and Travel Time Calculator** πŸ†• * **NEW (v5.0.2): Map-based route info bar, clickable route polylines, fullscreen panel overlay, active shortcut highlighting, and theme-consistent button colors** * **v5.0.0: Docked travel panel with real-time route calculation, live traffic-colored polylines, address autocomplete, route shortcuts, and multi-modal support (driving/walking/transit/cycling)** * Live Traffic Info * Weather Layers (via OpenWeather API Key) with adjustable opacity, br... The project is written primarily in JavaScript, distributed under the MIT License license, first published in 2025. Key topics include: commute, driving, driving-mode, google-maps, google-maps-card.

Latest release: v5.1.1β€” ✨ New Features
<a href="https://www.buymeacoffee.com/cataseven" target="_blank"> <img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me a Coffee" style="height: 60px !important;width: 217px !important;" > </a>

Google Maps Card for Home Assistant

Downloads
hacs_badge
GitHub Release
License
Home Assistant
Maintenance
GitHub Stars
GitHub Issues

Responsive Lovelace custom Google Maps card that displays the location of person., device_tracker., and sensor. entities and tracks their routes using the Google Maps JavaScript API including Live Traffic, Street View, POI Filtering, Map Types, FlightRadar24 Integration and Route Search and Travel Time Calculator support


Features

  • Route Search and Travel Time Calculator πŸ†•
    • NEW (v5.0.2): Map-based route info bar, clickable route polylines, fullscreen panel overlay, active shortcut highlighting, and theme-consistent button colors
    • v5.0.0: Docked travel panel with real-time route calculation, live traffic-colored polylines, address autocomplete, route shortcuts, and multi-modal support (driving/walking/transit/cycling)
  • Live Traffic Info
  • Weather Layers (via OpenWeather API Key) with adjustable opacity, brightness, contrast and saturation
  • FlightRadar24 integration support
    • NEW (v4.0.0): Dedicated FlightRadar panel + airport arrivals/departures table + Add/Remove Flight directly on the map via right click button
  • Create Zone, Edit Zone, Delete Zone directly from the card (right click / long press)
  • Show Zones
  • POI Filtering
  • Street View
  • Route tracking (polylines + history dots)
  • Themes (40+ built‑in)
  • Interactive Google Map view
  • Dynamic selection of person/zone/device_tracker entities
  • Geo Location sources auto-listing (from HA geo integrations)
  • Map terrain types (Map, Satellite, Hybrid, Terrain)
  • Custom zoom level
  • Fully responsive iframe layout with aspect_ratio
  • Show/hide map controls (Pan, Zoom, Street View, Fullscreen, Map Type, Rotate)
  • Control positions of buttons
  • Scale bar and keyboard shortcuts support
  • Follow mode: auto‑center map on selected entity/entities
  • Marker clustering (history dots) for performance on slower systems
  • Proximity clustering (entities grouped within a radius until zoom >= 17)
  • Spiderfy / overlap separation (high zoom) for entities with the exact same location
  • GPS Accuracy visualization
    • Accuracy styling via gps_accuracy_ranges
    • NEW (v4.0.0): optional GPS accuracy radius line + label per entity
  • External Date Control πŸ†• (v5.0.9)
    • Bind history date range to Home Assistant input_datetime entities β€” single day or explicit start/end range
    • Multiple cards stay in sync, perfect for tracking dashboards with markdown logs
  • Map & Format Language πŸ†• (v5.0.9)
    • Choose map labels and date/number formatting independently from your HA profile language
  • Dynamic Zoom πŸ†• (v5.0.10)
    • The zoom field now accepts a Home Assistant entity (input_number, sensor) for real-time zoom control
  • History Dot Shapes πŸ†• (v5.0.10)
    • Per-entity dot customization: circle, square, triangle, diamond, star, pentagon β€” filled or outline
    • Dot size auto-scales with polyline width, or can be set manually

image4 image4 image4 image4 image4 <br>

Attention

πŸ’‘ Google Maps JavaScript API must be enabled in your Google Cloud project:
https://console.cloud.google.com/google/maps-apis/api-list

If you plan to use the Route Search and Travel Time Calculator, you also need to enable these additional APIs:

APIPurposeRequired for
Maps JavaScript APICore map renderingAll features (required)
Directions APIRoute calculation, alternatives, duration & distanceRoute Search and Travel Time Calculator
Places API (New)Address autocomplete in travel panelRoute Search and Travel Time Calculator
Routes APIReal-time traffic segment data for color-coded polylinesRoute Search and Travel Time Calculator

image4


πŸ’° API Pricing & Free Quotas β€” You're Probably Fine

Google Maps Platform follows a "Pay-as-you-go" model, but don't let that scare you β€” Google provides a very generous free tier that comfortably covers typical Home Assistant usage. Most home users will never come close to the limits.

Here's how much you get for free every month (as of March 2025):

FeatureRequired APIFree Monthly LimitWhat That Means for You
Core Map RenderingMaps JavaScript API (Dynamic Maps)10,000 map loads~330 map loads/day β€” plenty for a household dashboard
Route CalculationDirections API10,000 requests~330 routes/day β€” way more than daily commute checks
Address AutocompletePlaces API (New)10,000 requests~330 autocomplete sessions/day
Live Traffic RoutesRoutes API5,000 – 10,000 requestsMore than enough for regular route queries

To put this in perspective: if you open your HA dashboard 10 times a day and calculate 5 routes, that's still only ~450 map loads and ~150 API calls in a month β€” well under 5% of your free quota. You'd need to be loading the map hundreds of times daily to even approach the limits.

πŸ’‘ In short: For personal / household use, the free tier is more than enough. You won't pay a cent unless you do something unusual.

To use all features of this card (including the Route Calculator), you need to enable the required APIs in your Google Cloud project: API List

❓ Why does my Quotas page say "Unlimited"?

If you check your Google Cloud Quotas page, you might see "Unlimited" next to Map loads per day. This doesn't mean you'll be charged without warning β€” it just means Google won't technically block your requests if traffic spikes. Billing only kicks in after the 10,000 monthly free loads, and for a typical home setup you'll stay well within that.

That said, if you want extra peace of mind (always a good idea!), you can set a daily cap yourself:

These are simple one-time steps to make sure you're fully protected β€” they only take a minute:

  1. Set a daily quota cap β€” Go to APIs & Services β†’ Quotas and lower the "Unlimited" daily limit to something comfortable (e.g., 200/day). This creates a hard ceiling so you can never accidentally exceed the free tier.
  2. Create a budget alert β€” Go to Billing β†’ Budgets & Alerts and set a $1–2/month alert. Google will email you if costs approach your threshold. Think of it as a smoke detector β€” you'll probably never hear it, but it's nice to have.
  3. Restrict your API key β€” Limit it to only the APIs you actually use.

image5

You can always check your actual usage here: Google Maps API Quotas

For a great walkthrough on setting up your API key safely, check out this video by @BeardedTinker:
https://youtu.be/usGLOxtXCxA?si=BxDj65bksi_tcZek

πŸš— Route Calculator β€” Built-in Safety Net

Each route calculation triggers multiple API calls behind the scenes (Directions + Routes + Places autocomplete), so 50 route calculations could mean ~150+ total API calls. To keep things safe by default, this card has a built-in soft limit of 50 route calculations per day per API key (shared across all browser instances). That's still plenty for daily use β€” you'd have to actively try to hit it.

πŸ’‘ For the best protection, combine this built-in limit with a hard daily quota in your Google Cloud Console (see the safety steps above). Belt and suspenders!

Create your API key and click the β€œShow key” button in the console:

image5


<br>>

Installation

Via HACS

  1. Go to HACS
  2. Search for Google Map Card
  3. Download & install

Adding the Card to Dashboard

Add via the Lovelace card picker (search β€œGoogle Map Card”)
or define it in YAML (see Card Example below):

<br>

image11

<br>

πŸ“ Dashboard Layout Tips

Standard Dashboard (Masonry / Panel)

Use aspect_ratio to control the card height:

yaml
type: custom:google-map-card api_key: YOUR_API_KEY aspect_ratio: "16:9" # or 4:3, 1:1, 400px, etc.

Sections Dashboard

If you are using Home Assistant’s Sections dashboard layout, the recommended approach is to use aspect_ratio** and rows: auto

yaml
type: custom:google-map-card api_key: YOUR_API_KEY grid_options: columns: full rows: auto

With rows: auto the card height is determined by aspect_ratio

πŸ’‘ Tip: Leaving aspect_ratio empty without setting grid_options: columns: full may cause the card to render with zero height on some Sections layouts. Always use one approach or the other.

Panel Layout

If you are using Home Assistant’s Panel dashboard layout, the recommended approach is to leave aspect_ratio* empty

<br>

UI Card Editor

image61 image66

image65 image62

image63 image66

image64 image64

image64


πŸš— Route Search and Travel Time Calculator (v5.0.4)

image64

Calculate real-time travel times between any combination of entities, zones, or typed addresses β€” directly from your dashboard. The panel supports driving, walking, transit, and cycling modes with live traffic visualization on the map.

What you get

  • Docked travel panel with flexible positioning (above / below the map)
  • Map-based route info bar β€” after calculating, a compact bar appears at the top of the map showing travel time, distance, and route name. No list, no clutter.
  • Multi-modal routing β€” Driving πŸš—, Walking 🚢, Transit 🚌, Cycling 🚴
  • Live traffic-colored routes for driving mode:
    • 🟒 Green β€” Normal flow
    • 🟑 Yellow β€” Slow traffic
    • πŸ”΄ Red β€” Heavy traffic / Traffic jam
  • Alternative routes β€” click any route line on the map or use Prev / Next in the info bar to switch between options
  • Address autocomplete β€” powered by Places API (New) with instant suggestions
  • Route Shortcuts ⚑ β€” define frequently used routes with custom icons and labels for one-tap calculation
    • Selected shortcut is highlighted so you always know which one is active
    • Supports person, device_tracker, and zone entities
    • Collapsible editor with label-based headers
  • Toggle button on the map to show/hide the panel β€” optional, position configurable in Map Button Positioning. Panel opens automatically on first load.
  • Fullscreen support β€” the panel and route info bar stay visible in fullscreen mode, anchored to the bottom of the screen

Required APIs

The Route Search and Travel Time Calculator requires these additional APIs to be enabled in Google Cloud Console:

  • Directions API β€” Route calculation
  • Places API (New) β€” Address autocomplete
  • Routes API β€” Traffic segment data

🌍 Map & Format Language

By default, the card uses your Home Assistant profile language for map labels (city names, streets) and in-card date/number formatting. If you'd like the map to display in a different language β€” for example, you run HA in English but want city names in your native script (Cyrillic, Japanese, Arabic, etc.) β€” set the language option.

yaml
type: custom:google-map-card api_key: YOUR_API_KEY language: ja # BCP-47 tag: en, tr, de, ja, ru, he, ar, etc. entities: - person.alice

You can also pick the language from the visual editor's Map Language dropdown.

⚠️ Google Maps reads the language only at script load time. After changing this setting, do a full page reload (Ctrl+Shift+R) for map labels to update.

Leave the option empty (or omit it) to fall back to your Home Assistant profile language.


πŸ“… External Date Control

You can bind the card's history date range to one or more Home Assistant input_datetime entities. This lets a single date picker on your dashboard drive both the map and other cards (markdown logs, tables, statistics) at the same time β€” no more selecting the date twice.

Two modes

Single day β€” one entity, automatically expanded to that day's full 00:00–23:59 range:

yaml
type: custom:google-map-card api_key: YOUR_API_KEY history_date_entity: input_datetime.map_date entities: - person.alice - person.bob

Date range β€” explicit start and end (each with optional time):

yaml
type: custom:google-map-card api_key: YOUR_API_KEY history_start_entity: input_datetime.history_start history_end_entity: input_datetime.history_end entities: - person.alice

Required Home Assistant helpers

Create the helpers under Settings β†’ Devices & Services β†’ Helpers β†’ + Create Helper β†’ Date and/or time, or in YAML:

yaml
input_datetime: map_date: name: Map Date has_date: true has_time: false history_start: name: History Start has_date: true has_time: true history_end: name: History End has_date: true has_time: true

How it works

  • The map updates automatically whenever the input_datetime value changes
  • The internal date picker button becomes read-only β€” clicking it shows a tooltip indicating the date is controlled externally
  • Multiple cards bound to the same entity stay in sync
  • All input_datetime formats are supported: date-only, time-only, date + time, and the underlying timestamp attribute
  • If both single-date and range entities are configured, the range form takes precedence
  • Configurable from the visual editor in the External Date Control section

Use case: synchronized tracking dashboard

Combine with previous/next day scripts and a markdown card to build a tracking dashboard where one date picker drives everything:

yaml
script: datepicker_previous_day: sequence: - service: input_datetime.set_datetime target: entity_id: input_datetime.map_date data: date: > {{ (states('input_datetime.map_date') | as_datetime - timedelta(days=1)).strftime('%Y-%m-%d') }} datepicker_next_day: sequence: - service: input_datetime.set_datetime target: entity_id: input_datetime.map_date data: date: > {{ (states('input_datetime.map_date') | as_datetime + timedelta(days=1)).strftime('%Y-%m-%d') }}

Bind the same input_datetime.map_date to both the map card and any markdown / entity / table card on the dashboard, and they'll all show the same day's data.


Live Traffic Info by Google Maps

Optional. Real time traffic layer

image7


Live Weather Layer by OpenWeather API (Optional)

image7

You need to create api key from openweathermap.org. Please create API v1.0. It is free. Please find the section below and create free API on https://openweathermap.org/price. DO NOT create API of One Call API 3.0

API v1.0 is enough and it is free.

image7

Weather Layer Appearance

By default, the weather layer renders at 60% opacity. Some layers (especially temperature) can obscure the map underneath. You can fine-tune how the layer looks using four settings, all available in the visual editor under the Layers section:

yaml
weather_layer: temp_new weather_layer_opacity: 0.4 # more transparent so the map stays visible weather_layer_brightness: 0.9 # slightly dimmed weather_layer_contrast: 1.4 # sharper weather patterns weather_layer_saturation: 0.6 # softer colors

All four default to sensible values and only need to be set when you want to override them.


Google Maps & Apple Map Application Support

You can open any point or location of your entities on Google Map or Apple Map mobile or web browser app.

For entity location: Click on entity picture and select your app on the opened popup

For any point on the map (Windows): Right click and select your app on the opened popup

For any point on the map (Mobile Phone): Hold your finger on any point for 2 seconds and select your app on the opened popup

πŸ’‘ You can hide these links entirely by setting hide_map_links: true in your card config.

<br>

POI Filtering

image12


Create Zone, Edit Zone, Delete Zone and Hide Zone

(Right click on browser or hold touch on mobile)

Create Zone: Right click on map (outside a zone)

Edit Zone, Delete Zone and Hide Zone: Right click inside a zone

image12
image12
image12
image12


Adding Geo Location Sources

If you have any integration providing geo location source, they will be automatically listed on the bottom of entity list.

image7


✈️ FlightRadar24 Support (v4.0.0)

This card supports FlightRadar24 entities and includes a dedicated FlightRadar panel to browse and manage flights.

What you get

  • FlightRadar panel with a richer UI and responsive layouts

    • Horizontal panel (above/below)
    • Sidebar panel (left/right)
  • Airport Arrivals / Departures support

    • Status chips (Estimated / Landed / Scheduled / Delayed / On Route, etc.)
    • Parses status_text such as Delayed 16:25 into a separate time column
  • Quick actions available from the map RIGHT CLICK popup (when FR24 is detected)

    • Add Flight
    • Remove Flight
    • Clear Flights

FlightRadar Panel

FlightRadar Panel

FlightRadar Panel

FlightRadar Panel

FlightRadar Panel

FlightRadar Panel

FlightRadar Panel

FlightRadar Panel


Configuration

yaml
travel_panel_enabled: true travel_panel_position: below # above | below show_travel_panel_toggle_button: true show_travel_panel_toggle_button_position: LEFT_BOTTOM travel_shortcuts: - label: "Go to Work" icon: "mdi:office-building" from_entity: "person.cenk" to_entity: "zone.office" - label: "Go Home" icon: "mdi:home" from_entity: "person.cenk" to_entity: "zone.home"

Enabling Clustering (History Dots)

If you enable clustering, route history markers will be grouped depending on zoom level.
More zoom = more granularity. This increases performance on slow systems.

Note (v4.0.0): FlightRadar markers are excluded from clustering by design.

image7


Themes

You can choose your best themeβ€”40 now and more to come!
image7

<br>

πŸ”§ Parameters

🧹 General Options

KeyTypeDescription
typestringRequired for Home Assistant custom card. Must be custom:google-map-card.
api_keystringYour Google Maps JavaScript API key (required).
zoominteger / stringInitial zoom level (1–22). Accepts a static number (e.g. 12) or a Home Assistant entity ID (e.g. input_number.map_zoom) for dynamic zoom control.
theme_modestringMap theme name from built-in themes (Dark_Blueish_Night, etc.). Not available when rendering_type: vector β€” use color_scheme instead.
rendering_typestringMap rendering engine. raster (default) or vector. Vector mode enables free 360Β° rotation and tilt on all map types. See Vector Map & Free Rotation below.
color_schemestringColor scheme for vector mode only. light (default), dark, or follow_system. Has no effect when rendering_type: raster.
aspect_ratiostringCard aspect ratio (16:9, 4:3, 1, 1:1.56, 400px, etc.). If omitted, the card expands to fill its container β€” recommended for Sections dashboard users who set grid_options: columns: full. See Dashboard Layout Tips below.
map_typestringMap type: roadmap, satellite, hybrid, or terrain. Default: roadmap.
gesture_handlingstringcooperative for CTRL+SCROLL, greedy for just SCROLL, auto
marker_clusteringbooleanIf true, history dots will be grouped depending on zoom level. Increases performance for slow systems.
proximity_clusteringbooleanIf true, entities within the defined radius will be grouped until zoom level is higher than 17
proximity_radiusnumberRadius of proximity cluster default: 150
spiderfybooleanIf true, after some zoom level, icons of entities with exact location will be separated by some distance in order to see all icons
allow_open_google_mapsbooleanAllow opening Google Maps from info popups via right-click / long-press. Default: true.
hide_map_linksbooleanHide Google Maps & Apple Maps links from all info popups. Default: false. NEW (v5.0.4)
history_presetstringRelative date range preset. Accepted values: today, yesterday, last7, last15. When set, the date range is recalculated on every page load relative to the current date β€” so it never goes stale. Overrides history_start_date / history_end_date.
history_start_datestringFixed start of the date range (ISO 8601, e.g. "2026-02-20T21:00:00.000Z"). Used only when history_preset is null.
history_end_datestringFixed end of the date range (ISO 8601). Used only when history_preset is null.

⚠️ Naming note: Older docs may mention marker_clustring / clustring. The correct key is marker_clustering.

πŸ“… Migration note (v4.0.2): history_start_date and history_end_date have moved from per-entity to card-level. The per-entity boolean use_date_range: true now opts an entity into the shared card-level date range. Old configs with per-entity dates will be auto-migrated on first edit.

πŸ‘€ Entities

KeyTypeDescription
entitieslistA list of device_tracker, person, or zone entities to show on the map (required if no geo location sources provided).
entitystringEntity ID to track.
icon_sizeintegerSize of the icon for this entity.
icon_colorstringIcon color (e.g., #ffffff).
background_colorstringBackground color of the icon.
hours_to_showintegerNumber of hours of location history to show. Use 0 to disable history. Ignored when use_date_range: true.
polyline_colorstringColor of the polyline for route history.
polyline_widthintegerWidth of the polyline for route history.
followbooleanIf true, map will center on this entity. When multiple entities have follow: true, the map will fit all of them.
show_history_dotsbooleanIf false, location history dots are not rendered. May increase speed of map rendering for long time period data.
history_dot_shapestringShape of history dots: circle (default), square, triangle, diamond, star, pentagon. Helps distinguish entities with similar colors.
history_dot_sizeintegerSize of history dots in pixels. When omitted, auto-derived from polyline width (4Γ— polyline width, minimum 4px).
history_dot_filledbooleanIf true (default), dots are filled solid. If false, dots are rendered as outlines only.
use_date_rangebooleanIf true, this entity uses the card-level date range (history_preset or history_start_date/history_end_date) instead of hours_to_show. When enabled, hours_to_show is ignored for this entity.
gps_accuracy_rangesobjmin,max,label,color,opacity see example below
show_gps_accuracy_radius_linebooleanNEW (v4.0.0) Draw a thin radius line + label showing GPS accuracy distance (zoom-aware)

πŸ‘€ Geo Location Sources

KeyTypeDescription
geo_location_sourceslistGeo Location Sources listed in entity selection list (required if no entity provided).

πŸ•ΉοΈ Map Buttons

KeyTypeDescription
cameraControlbooleanIn raster mode: shows/hides the native pan control. In vector mode: shows/hides a custom rotate & tilt grid (↑↓ tilt, ←→ rotate, ⟳ reset) β€” the native pan buttons are replaced entirely.
zoomControlbooleanShow or hide zoom control.
streetViewControlbooleanShow or hide Street View control.
fullscreenControlbooleanShow or hide fullscreen control.
mapTypeControlbooleanShow or hide map type selector.
rotateControlbooleanShow or hide rotate/tilt control. Limited support β€” only functional in satellite or hybrid map types, at high zoom levels (15+), and only in cities where Google provides 45Β° aerial imagery (e.g. New York, London, Tokyo). Has no effect on standard road maps. See Rotate & Tilt Limitations below.
showScalebooleanShow or hide the scale bar.
show_poi_buttonbooleanShow or hide the poi selector.
keyboardShortcutsbooleanEnable or disable keyboard shortcuts for navigation.
show_traffic_buttonbooleanShow or hide Traffic Layer Toggle Button.
show_weather_buttonbooleanShow or hide Weather Layer dropdown menu.
show_datepicker_buttonbooleanShow or hide Calendar. (use_date_range should be enabled for at least one entity)
show_recenter_buttonbooleanShow or hide Recenter Map Button.
buttons_opacityfloatOpacity of all buttons on the map. Buttons will be solid when hover

🌍 Localization & External Control

KeyTypeDescription
languagestringBCP-47 language tag for map labels and date/number formatting (e.g. en, tr, ja, ru, he, de-DE). Leave empty to follow the Home Assistant profile language. Requires page reload after change.
history_date_entitystringinput_datetime entity that controls the history date range. The selected day is automatically expanded to 00:00–23:59.
history_start_entitystringinput_datetime entity for the start of an explicit date range. Used together with history_end_entity.
history_end_entitystringinput_datetime entity for the end of an explicit date range. Used together with history_start_entity. If both range entities are set, they take precedence over history_date_entity.

πŸ“š Layers

KeyTypeDescription
show_trafficbooleanShow or hide live traffic. No extra api key needed
weather_layerstringAdd weather layer. none, precipitation_new, pressure_new, wind_new, temp_new, clouds_new
weather_layer_opacitynumberTransparency of the weather layer (0.0 = invisible, 1.0 = fully opaque). Default: 0.6
weather_layer_brightnessnumberBrightness of the weather layer (1.0 = normal). Lower values darken, higher values brighten. Default: 1.0
weather_layer_contrastnumberContrast of weather patterns (1.0 = normal). Increase to make patterns more visible. Default: 1.0
weather_layer_saturationnumberColor intensity of the weather layer (1.0 = normal, 0 = grayscale). Default: 1.0
owm_api_keystringCreate api and restrict it 1000 per day https://home.openweathermap.org/api_keys

πŸ” Button Positions

KeyTypeDescription
cameraControl_positionstringPosition of the pan control (e.g., RIGHT_BOTTOM).
zoomControl_positionstringPosition of the zoom control.
streetViewControl_positionstringPosition of the Street View control.
fullscreenControl_positionstringPosition of the fullscreen control.
mapTypeControl_positionstringPosition of the map type selector.
rotateControl_positionstringPosition of the rotate/tilt control.
show_traffic_button_positionstringPosition of the traffic layer toggle button
show_poi_button_positionstringPosition of the poi selector button
show_weather_button_positionstringPosition of the weather layer dropdown menu
show_recenter_button_positionstringPosition of the recenter map button
show_datepicker_button_positionstringPosition of the calendar
show_travel_panel_toggle_button_positionstringPosition of the travel panel toggle button

⚠️ Rotate & Tilt Limitations (Raster Mode)

The rotateControl button in raster mode (default) allows rotating and tilting the map to a 45Β° perspective view, but it comes with significant Google API constraints that are important to understand.

When it works:

  • Map type must be set to satellite or hybrid
  • Zoom level must be 15 or higher
  • You must be in a city where Google has captured 45Β° aerial imagery

Cities with known 45Β° imagery support (non-exhaustive):
New York, Los Angeles, San Francisco, Chicago, Miami, London, Paris, Berlin, Tokyo, Sydney, Toronto, Amsterdam, Barcelona, Rome, Dubai

When it does NOT work:

  • map_type: roadmap or map_type: terrain β€” the button will appear but have no effect
  • Rural areas, small towns, or regions without 45Β° Google imagery
  • Low zoom levels (below ~15)

Recommended config for best results with raster rotateControl:

yaml
map_type: satellite # or hybrid zoom: 17 rotateControl: true rotateControl_position: LEFT_BOTTOM

πŸ’‘ For full 360Β° free rotation on any map type, use rendering_type: vector instead. See below.


πŸ”„ Vector Map & Free Rotation (NEW)

By setting rendering_type: vector, the card switches to Google Maps' WebGL-based vector renderer. This unlocks free 360Β° rotation and tilt on any map type β€” including roadmap and terrain β€” with no Map ID or Google Cloud Console setup required.

What changes in vector mode:

  • rotateControl: true enables full drag-to-rotate and pinch-to-tilt gestures
  • cameraControl: true shows a custom rotate & tilt grid instead of the native pan buttons:
        [ ↑ Decrease Tilt ]
[ ← Rotate ]  [ ⟳ Reset ]  [ β†’ Rotate ]
        [ ↓ Increase Tilt ]

Rotate step: 15Β° β€” Tilt step: 10Β° (range: 0°–67.5Β°) β€” ⟳ resets both to 0

  • Right-click + drag tilts the map: drag down β†’ more perspective, drag up β†’ flatter. Release without dragging β†’ right-click popup opens normally
  • theme_mode is not supported β€” use color_scheme instead (light, dark, follow_system)
  • The 40+ built-in JSON themes are unavailable (Google API limitation β€” the styles array only works on raster maps)
  • Requires a WebGL-capable browser (all modern browsers supported by Home Assistant qualify)

Config example:

yaml
type: custom:google-map-card api_key: YOUR_API_KEY rendering_type: vector color_scheme: dark # light | dark | follow_system cameraControl: true # shows rotate/tilt grid in vector mode cameraControl_position: RIGHT_BOTTOM rotateControl: true # enables drag-to-rotate & pinch-to-tilt gestures map_type: roadmap zoom: 15

Raster vs Vector β€” quick comparison:

Raster (default)Vector
Free 360Β° rotationβŒβœ…
Rotate/tilt grid controlβŒβœ… (via cameraControl)
Right-click drag to tiltβŒβœ…
40+ built-in themesβœ…βŒ
Dark / Light modeVia themescolor_scheme
POI filteringβœ…βœ…
Traffic layerβœ…βœ…
Weather layerβœ…βœ…
GPU / WebGL requiredβŒβœ…

⚠️ color_scheme can only be set at map initialization. If you change it, the page must reload to take effect. In Home Assistant, saving the card config triggers a reload automatically.

🎯 Zones

KeyTypeDescription
zonesobjectDefines zone entities to show on the map, with styling.
showbooleanWhether to display the zone or not.
colorstringFill color for the zone area (e.g., #3498db).
zone_opacityfloatOpacity for the zone fill color (0.0 to 1.0).
zone_label_opacityfloatOpacity for the zone label color (0.0 to 1.0).
followbooleanCentre the map

πŸͺ POI

KeyTypeDescription
hide_poi_types:objectbusiness, attraction, government, medical, park, place_of_worship, school, sports_complex, transit

πŸš— Route Search and Travel Time Calculator

KeyTypeDescription
travel_panel_enabledbooleanEnable or disable the Route Search and Travel Time Calculator panel. Default: true.
travel_panel_positionstringPanel position relative to the map: above or below. Default: above.
show_travel_panel_toggle_buttonbooleanShow or hide the toggle button on the map. Default: true.
show_travel_panel_toggle_button_positionstringPosition of the toggle button on the map. Default: LEFT_BOTTOM.
travel_shortcutslistList of predefined route shortcuts for quick calculation.
travel_shortcuts[].labelstringDisplay label for the shortcut (e.g., "Go to Work").
travel_shortcuts[].iconstringMDI icon for the shortcut button (e.g., "mdi:office-building").
travel_shortcuts[].from_entitystringSource entity ID (person.*, device_tracker.*, or zone.*).
travel_shortcuts[].to_entitystringDestination entity ID (person.*, device_tracker.*, or zone.*).

The following control positions are supported:

TOP_LEFT, TOP_CENTER, TOP_RIGHT,
LEFT_TOP, LEFT_CENTER, LEFT_BOTTOM,
RIGHT_TOP, RIGHT_CENTER, RIGHT_BOTTOM,
BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT

PositionDescription
TOP_CENTERControl placed along the top center of the map.
TOP_LEFTControl placed along the top left of the map, with sub-elements β€œflowing” toward the top center.
TOP_RIGHTControl placed along the top right of the map, with sub-elements β€œflowing” toward the top center.
LEFT_TOPControl placed along the top left of the map, but below any TOP_LEFT elements.
RIGHT_TOPControl placed along the top right of the map, but below any TOP_RIGHT elements.
LEFT_CENTERControl placed along the left side of the map, centered between TOP_LEFT and BOTTOM_LEFT.
RIGHT_CENTERControl placed along the right side of the map, centered between TOP_RIGHT and BOTTOM_RIGHT.
LEFT_BOTTOMControl placed along the bottom left of the map, but above any BOTTOM_LEFT elements.
RIGHT_BOTTOMControl placed along the bottom right of the map, but above any BOTTOM_RIGHT elements.
BOTTOM_CENTERControl placed along the bottom center of the map.
BOTTOM_LEFTControl placed along the bottom left of the map, with sub-elements β€œflowing” toward the bottom center.
BOTTOM_RIGHTControl placed along the bottom right of the map, with sub-elements β€œflowing” toward the bottom center.
<br>

Card Example

yaml
type: custom:google-map-card api_key: <<GOOGLE API KEY>> owm_api_key: <<OPEN WEATHER API KEY>> theme_mode: Dark_Blueish_Night map_type: roadmap zoom: 16 aspect_ratio: 1.53:1 weather_layer: clouds_new weather_layer_opacity: 0.5 proximity_clustering: true proximity_radius: 5 marker_clustering: false spiderfy: true gesture_handling: greedy camera_control: false zoom_control: false zoom_control_position: RIGHT_BOTTOM street_view_control: false street_view_control_position: LEFT_BOTTOM fullscreen_control: false fullscreen_control_position: RIGHT_TOP map_type_control: false map_type_control_position: TOP_LEFT map_type_control_style: DROPDOWN_MENU rotate_control: false pan_control: true show_scale: false scaleControlPosition: BOTTOM_LEFT keyboard_shortcuts: false show_traffic_button: true show_traffic_button_position: TOP_RIGHT show_weather_button: true show_weather_button_position: TOP_RIGHT show_recenter_button: true show_recenter_button_position: LEFT_BOTTOM show_datepicker_button: true show_datepicker_button_position: TOP_CENTER show_traffic: false show_history_dots: true travel_panel_enabled: true travel_panel_position: below show_travel_panel_toggle_button: true show_travel_panel_toggle_button_position: LEFT_BOTTOM travel_shortcuts: - label: "Go to Work" icon: "mdi:office-building" from_entity: "person.cenk" to_entity: "zone.work" - label: "Go Home" icon: "mdi:home" from_entity: "person.cenk" to_entity: "zone.home" zones: zone.work: show: false color: "#3498db" follow: false label_color: "#c4dbf9" zone.work_2: show: false color: "#3498db" follow: false label_color: "#c4dbf9" zone.home: show: true color: "#3498db" follow: false label_color: "#c4dbf9" # Date range (card-level) β€” applies to all entities with use_date_range: true # Option A: Use a preset (recalculated on every page load) history_preset: today # today | yesterday | last7 | last15 # Option B: Use a fixed date range # history_preset: null # history_start_date: "2026-02-20T21:00:00.000Z" # history_end_date: "2026-02-21T20:55:00.000Z" entities: - entity: device_tracker.flightradar24 icon_size: 30 hours_to_show: 10 polyline_color: "#ffffff" polyline_width: 1 icon_color: "#780202" background_color: "#ffffff" - entity: person.cenk icon_size: 30 hours_to_show: 0 use_date_range: true polyline_color: "#ffffff" polyline_width: 1 icon_color: "#780202" background_color: "#ffffff" history_dot_shape: diamond show_gps_accuracy_radius_line: true gps_accuracy_ranges: - min: 0 max: 15 label: Excellent (0-15m) color: "#15cb1b" opacity: 0.6 - min: 16 max: 100 label: Good (16-100m) color: "#0dccf2" opacity: 1 - min: 101 max: 250 label: Fair (101-250m) color: "#ffeb3b" opacity: 1 - min: 251 max: 500 label: Poor (251-500m) color: "#ff9800" opacity: 1 - min: 501 max: 99999 label: Very Poor (501m+) color: "#f44336" opacity: 1 - entity: person.derya icon_size: 30 hours_to_show: 0 use_date_range: true polyline_color: "#ffffff" polyline_width: 1 icon_color: "#780202" background_color: "#ffffff" history_dot_shape: triangle history_dot_filled: false

⭐ Support

If you like this card, feel free to ⭐ star the project on GitHub and share it with the Home Assistant community or buy me a coffee!

<a href="https://www.buymeacoffee.com/cataseven" target="_blank"> <img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me a Coffee" style="height: 60px !important;width: 217px !important;" > </a>

Star History

Star History Chart

Contributors

Showing top 1 contributor by commit count.

View all contributors on GitHub β†’

This article is auto-generated from cataseven/Google-Map-Card via the GitHub API.Last fetched: 6/23/2026