Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
mapbox avatar

Mapbox Google Maps Migration

  • 955 installs
  • 71 repo stars
  • Updated August 4, 2026
  • mapbox/mapbox-agent-skills

mapbox-google-maps-migration is a Mapbox agent skill that converts existing Google Maps implementations into Mapbox GL JS with correct coordinate handling, layer patterns, and API swaps for developers migrating map UIs.

About

mapbox-google-maps-migration is an official Mapbox agent skill that walks developers through swapping Google Maps Platform APIs to Mapbox GL JS. The guide documents critical differences: Google uses {lat, lng} objects while Mapbox expects [lng, lat] arrays, Google favors imperative DOM markers while Mapbox uses declarative data-driven WebGL layers, and performance shifts from slowing around 500+ markers to handling 10,000+ points. Developers reach for this skill when refactoring map initialization, layers, sources, and event handlers without relearning Mapbox from generic docs. It is a migration quick reference with side-by-side API equivalents rather than a greenfield mapping tutorial.

  • Provides critical differences between Google Maps (imperative, DOM, lat-lng objects) and Mapbox GL JS (declarative, WebG
  • Includes an 8-step quick migration checklist covering package install, token setup, coordinate swapping, and clustering
  • Shows side-by-side code examples for map initialization, marker handling, and geocoding
  • Recommends performance best practices such as Symbol layers for 100+ markers and clustering for 500+ points
  • Delivers ready-to-adapt JavaScript patterns that work with Claude Code, Cursor, and similar agents

Mapbox Google Maps Migration by the numbers

  • 955 all-time installs (skills.sh)
  • +33 installs in the week ending Aug 4, 2026 (Skillselion tracking)
  • Ranked #403 of 2,245 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/mapbox/mapbox-agent-skills --skill mapbox-google-maps-migration

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs955
repo stars71
Security audit2 / 3 scanners passed
Last updatedAugust 4, 2026
Repositorymapbox/mapbox-agent-skills

How do you migrate Google Maps to Mapbox GL JS?

Rapidly convert an existing Google Maps implementation into Mapbox GL JS with correct coordinate handling, layer patterns, and API swaps.

Who is it for?

Frontend developers replacing Google Maps Platform in an existing web or mobile map UI who need API equivalents and coordinate migration patterns.

Skip if: Greenfield mapping projects with no Google Maps codebase to convert or teams staying on Google Maps without any Mapbox adoption plan.

When should I use this skill?

The user is converting Google Maps to Mapbox GL JS, mentions lat/lng vs lng/lat coordinates, or needs WebGL layer patterns instead of DOM markers.

What you get

Mapbox GL JS map initialization, converted layers and sources, and corrected [lng, lat] coordinate handling replacing Google Maps APIs.

  • Mapbox GL JS map module
  • Migrated layer and source definitions

By the numbers

  • Google Maps slows with 500+ markers; Mapbox GL JS handles 10,000+ points via WebGL

Files

SKILL.mdMarkdownGitHub ↗

Mapbox Google Maps Migration Skill

Comprehensive guidance for migrating from Google Maps Platform to Mapbox GL JS. Provides API equivalents, pattern translations, and strategies for successful migration.

Core Philosophy Differences

Google Maps: Imperative & Object-Oriented

  • Create objects (Marker, Polygon, etc.)
  • Add to map with .setMap(map)
  • Update properties with setters
  • Heavy reliance on object instances

Mapbox GL JS: Declarative & Data-Driven

  • Add data sources
  • Define layers (visual representation)
  • Style with JSON
  • Update data, not object properties

Key Insight: Mapbox treats everything as data + styling, not individual objects.

Map Initialization

Google Maps

const map = new google.maps.Map(document.getElementById('map'), {
  center: { lat: 37.7749, lng: -122.4194 },
  zoom: 12,
  mapTypeId: 'roadmap' // or 'satellite', 'hybrid', 'terrain'
});

Mapbox GL JS

mapboxgl.accessToken = 'YOUR_MAPBOX_TOKEN';
const map = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v12', // or satellite-v9, outdoors-v12
  center: [-122.4194, 37.7749], // [lng, lat] - note the order!
  zoom: 12
});

Key Differences:

  • Coordinate order: Google uses {lat, lng}, Mapbox uses [lng, lat]
  • Authentication: Google uses API key in script tag, Mapbox uses access token in code
  • Styling: Google uses map types, Mapbox uses full style URLs

API Equivalents Reference

Map Methods

Google MapsMapbox GL JSNotes
map.setCenter(latLng)map.setCenter([lng, lat])Coordinate order reversed
map.getCenter()map.getCenter()Returns LngLat object
map.setZoom(zoom)map.setZoom(zoom)Same behavior
map.getZoom()map.getZoom()Same behavior
map.panTo(latLng)map.panTo([lng, lat])Animated pan
map.fitBounds(bounds)map.fitBounds([[lng,lat],[lng,lat]])Different bound format
map.setMapTypeId(type)map.setStyle(styleUrl)Completely different approach
map.getBounds()map.getBounds()Similar

Map Events

Google MapsMapbox GL JSNotes
google.maps.event.addListener(map, 'click', fn)map.on('click', fn)Simpler syntax
event.latLngevent.lngLatEvent property name
'center_changed''move' / 'moveend'Different event names
'zoom_changed''zoom' / 'zoomend'Different event names
'bounds_changed''moveend'No direct equivalent
'mousemove''mousemove'Same
'mouseout''mouseleave'Different name

Markers and Points

Simple Marker

Google Maps:

const marker = new google.maps.Marker({
  position: { lat: 37.7749, lng: -122.4194 },
  map: map,
  title: 'San Francisco',
  icon: 'custom-icon.png'
});

// Remove marker
marker.setMap(null);

Mapbox GL JS:

// Create marker
const marker = new mapboxgl.Marker()
  .setLngLat([-122.4194, 37.7749])
  .setPopup(new mapboxgl.Popup().setText('San Francisco'))
  .addTo(map);

// Remove marker
marker.remove();

Multiple Markers

Google Maps:

const markers = locations.map(
  (loc) =>
    new google.maps.Marker({
      position: { lat: loc.lat, lng: loc.lng },
      map: map
    })
);

Mapbox GL JS (Equivalent Approach):

// Same object-oriented approach
const markers = locations.map((loc) => new mapboxgl.Marker().setLngLat([loc.lng, loc.lat]).addTo(map));

Mapbox GL JS (Data-Driven Approach - Recommended for 100+ points):

// Add as GeoJSON source + layer (uses WebGL, not DOM)
map.addSource('points', {
  type: 'geojson',
  data: {
    type: 'FeatureCollection',
    features: locations.map((loc) => ({
      type: 'Feature',
      geometry: { type: 'Point', coordinates: [loc.lng, loc.lat] },
      properties: { name: loc.name }
    }))
  }
});

map.addLayer({
  id: 'points-layer',
  type: 'circle', // or 'symbol' for icons
  source: 'points',
  paint: {
    'circle-radius': 8,
    'circle-color': '#ff0000'
  }
});

Performance Advantage: Google Maps renders all markers as DOM elements (even when using the Data Layer), which becomes slow with 500+ markers. Mapbox's circle and symbol layers are rendered by WebGL, making them much faster for large datasets (1,000-10,000+ points). This is a significant advantage when building applications with many points.

Info Windows / Popups

Google Maps

const infowindow = new google.maps.InfoWindow({
  content: '<h3>Title</h3><p>Content</p>'
});

marker.addListener('click', () => {
  infowindow.open(map, marker);
});

Mapbox GL JS

// Option 1: Attach to marker
const marker = new mapboxgl.Marker()
  .setLngLat([-122.4194, 37.7749])
  .setPopup(new mapboxgl.Popup().setHTML('<h3>Title</h3><p>Content</p>'))
  .addTo(map);

// Option 2: On layer click (for data-driven markers)
map.on('click', 'points-layer', (e) => {
  const coordinates = e.features[0].geometry.coordinates.slice();
  const description = e.features[0].properties.description;

  new mapboxgl.Popup().setLngLat(coordinates).setHTML(description).addTo(map);
});

Migration Strategy

Step 1: Audit Current Implementation

Identify all Google Maps features you use:

  • [ ] Basic map with markers
  • [ ] Info windows/popups
  • [ ] Polygons/polylines
  • [ ] Geocoding
  • [ ] Directions
  • [ ] Clustering
  • [ ] Custom styling
  • [ ] Drawing tools
  • [ ] Street View (no Mapbox equivalent)
  • [ ] Other advanced features

Step 2: Set Up Mapbox

<!-- Replace Google Maps script -->
<script src="https://api.mapbox.com/mapbox-gl-js/v3.18.1/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v3.18.1/mapbox-gl.css" rel="stylesheet" />

Step 3: Convert Core Map

Start with basic map initialization:

1. Replace new google.maps.Map() with new mapboxgl.Map() 2. Fix coordinate order (lat,lng -> lng,lat) 3. Update zoom/center

Step 4: Convert Features One by One

Prioritize by complexity:

1. Easy: Map controls, basic markers 2. Medium: Popups, polygons, lines 3. Complex: Clustering, custom styling, data updates

Step 5: Update Event Handlers

Change event syntax:

  • google.maps.event.addListener() -> map.on()
  • Update event property names (latLng -> lngLat)

Step 6: Optimize for Mapbox

Take advantage of Mapbox features:

  • Convert multiple markers to data-driven layers
  • Use clustering (built-in)
  • Leverage vector tiles for custom styling
  • Use expressions for dynamic styling

Step 7: Test Thoroughly

  • Cross-browser testing
  • Mobile responsiveness
  • Performance with real data volumes
  • Touch/gesture interactions

Gotchas and Common Issues

Coordinate Order

// Google Maps
{ lat: 37.7749, lng: -122.4194 }

// Mapbox (REVERSED!)
[-122.4194, 37.7749]

Always double-check coordinate order!

Event Properties

// Google Maps
map.on('click', (e) => {
  console.log(e.latLng.lat(), e.latLng.lng());
});

// Mapbox
map.on('click', (e) => {
  console.log(e.lngLat.lat, e.lngLat.lng);
});

Timing Issues

// Google Maps - immediate
const marker = new google.maps.Marker({ map: map });

// Mapbox - wait for load
map.on('load', () => {
  map.addSource(...);
  map.addLayer(...);
});

Removing Features

// Google Maps
marker.setMap(null);

// Mapbox - must remove both
map.removeLayer('layer-id');
map.removeSource('source-id');

Updating Data Without Flash

Never remove and re-add layers to update data — this reinitializes WebGL resources and causes a visible flash. Instead:

// ✅ Update data in place (no flash)
map.getSource('stores').setData(newGeoJSON);

// ✅ Filter existing data (GPU-side, fastest)
map.setFilter('stores-layer', ['==', ['get', 'category'], 'coffee']);

// ❌ BAD: remove + re-add causes flash
map.removeLayer('stores-layer');
map.removeSource('stores');
map.addSource('stores', { ... });
map.addLayer({ ... });

When NOT to Migrate

Consider staying with Google Maps if:

  • Street View is critical - Mapbox doesn't have equivalent
  • Tight Google Workspace integration - Places API deeply integrated
  • Already heavily optimized - Migration cost > benefits
  • Team expertise - Retraining costs too high
  • Short-term project - Not worth migration effort

Quick Reference: Side-by-Side Comparison

// GOOGLE MAPS
const map = new google.maps.Map(el, {
  center: { lat: 37.7749, lng: -122.4194 },
  zoom: 12
});

const marker = new google.maps.Marker({
  position: { lat: 37.7749, lng: -122.4194 },
  map: map
});

google.maps.event.addListener(map, 'click', (e) => {
  console.log(e.latLng.lat(), e.latLng.lng());
});

// MAPBOX GL JS
mapboxgl.accessToken = 'YOUR_TOKEN';
const map = new mapboxgl.Map({
  container: el,
  center: [-122.4194, 37.7749], // REVERSED!
  zoom: 12,
  style: 'mapbox://styles/mapbox/streets-v12'
});

const marker = new mapboxgl.Marker()
  .setLngLat([-122.4194, 37.7749]) // REVERSED!
  .addTo(map);

map.on('click', (e) => {
  console.log(e.lngLat.lat, e.lngLat.lng);
});

Remember: lng, lat order in Mapbox!

Additional Resources

Integration with Other Skills

Works with:

  • mapbox-web-integration-patterns: Framework-specific migration guidance
  • mapbox-web-performance-patterns: Optimize after migration
  • mapbox-token-security: Secure your Mapbox tokens properly
  • mapbox-geospatial-operations: Use Mapbox's geospatial tools effectively
  • mapbox-search-patterns: Migrate geocoding/search functionality

Reference Files

The following reference files contain detailed migration guides for specific topics. Load them when working on those areas:

  • `references/shapes-geocoding.md` — Polygons, Polylines, Custom Icons, Geocoding
  • `references/directions-controls.md` — Directions/Routing, Controls
  • `references/clustering-styling.md` — Clustering, Styling/Appearance
  • `references/data-performance.md` — Data Updates, Performance, Common Migration Patterns (Store Locator, Drawing Tools, Heatmaps)
  • `references/api-services.md` — API Services Comparison, Pricing, Plugins, Framework Integration, Testing, Migration Checklist

To load a reference, read the file relative to this skill directory, e.g.:

Load references/shapes-geocoding.md

Related skills

How it compares

Use mapbox-google-maps-migration for API swap refactors from Google Maps; use Mapbox docs for brand-new maps with no legacy Google code.

FAQ

How do coordinates differ between Google Maps and Mapbox GL JS?

mapbox-google-maps-migration notes Google Maps uses {lat, lng} objects while Mapbox GL JS expects [lng, lat] arrays, and getting this order wrong is a common migration bug the skill addresses directly.

What performance difference does Mapbox GL JS offer over Google Maps markers?

mapbox-google-maps-migration documents Google Maps slowing with 500+ markers while Mapbox GL JS WebGL rendering stays fast with 10,000+ points using declarative data-driven layers.

Is Mapbox Google Maps Migration safe to install?

skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Frontend Developmentintegrationsfrontend

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.