diff --git a/libs/leaflet/map-baselayer.model.ts b/libs/leaflet/map-baselayer.model.ts
index a1379f0ec6475fd54af8100ab7a618f31bd18f3f..0918e44a1cc776790ac0775c4279bf3aa8d71fcf 100644
--- a/libs/leaflet/map-baselayer.model.ts
+++ b/libs/leaflet/map-baselayer.model.ts
@@ -1,43 +1,10 @@
 /**
  * Base layers for mapping.
- *
- * These base layers map to concrete styles in lib/state/map/map.utils.
  */
 export enum MapBaseLayer {
-  /**
-   * Esri hillshade.
-   * @see https://doc.arcgis.com/en/data-appliance/2022/maps/world-hillshade.htm
-   */
-  HILLSHADE = 'Hillshade',
-
-  /**
-   * Esri dark hillshade.
-   * @see https://doc.arcgis.com/en/data-appliance/2022/maps/world-hillshade-dark.htm
-   */
-  HILLSHADE_DARK = 'Hillshade Dark',
-
-  /**
-   * Esri ocean map.
-   * @see https://doc.arcgis.com/en/data-appliance/2022/maps/world-ocean-base.htm
-   */
   OCEAN = 'Ocean',
-
-  /**
-   * Esri physical map
-   * @see https://doc.arcgis.com/en/data-appliance/2022/maps/world-physical-map.htm
-   */
-  PHYSICAL = 'Physical',
-
-  /**
-   * Esri satellite map.
-   * @see https://doc.arcgis.com/en/data-appliance/2022/maps/world-imagery.htm
-   */
+  OUTDOOR = 'Outdoor',
   SATELLITE = 'Satellite',
-
-  /**
-   * USGS topographic map.
-   *
-   * @see https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer
-   */
-  USGS_TOPO = 'USGS Topographic',
+  STREET = 'Street',
+  TOPO = 'Topographic',
 }
diff --git a/libs/leaflet/map.utils.ts b/libs/leaflet/map.utils.ts
index 9d7be50e045d3e9244a03fa6d76be618cb56a5ba..3fd852fc532d542c219c798939a2f39556cd6db5 100644
--- a/libs/leaflet/map.utils.ts
+++ b/libs/leaflet/map.utils.ts
@@ -1,8 +1,10 @@
+import {vectorTileLayer} from 'esri-leaflet-vector';
 import * as geojson from 'geojson';
 import * as L from 'leaflet';
 
 import {Location} from '../nshmp-lib/geo';
 import {MapBaseLayer} from './map-baselayer.model';
+import {VectorId} from './vector-id.model';
 
 /** Location transform */
 export type LocationTransform = (location: Location) => Location;
@@ -12,74 +14,80 @@ export type LocationTransform = (location: Location) => Location;
  *
  * https://doc.arcgis.com/en/data-appliance/latest/maps/directory-maps-data.htm
  */
-export function baseLayers(): Record<MapBaseLayer, L.TileLayer> {
-  const baseLayers: Record<MapBaseLayer, L.TileLayer> = {
-    /* Esri world hillshade */
-    [MapBaseLayer.HILLSHADE]: L.tileLayer(
-      `${ARCGIS_URL_START}Elevation/World_Hillshade${ARCGIS_URL_END}`,
+export function baseLayers(): Record<MapBaseLayer, L.LayerGroup> {
+  const baseLayers: Record<MapBaseLayer, L.LayerGroup> = {
+    // https://maps.arcgis.com/sharing/rest/content/items/33d6280d276d4af89fb66a6ffa7f2072/data
+    // https://www.arcgis.com/home/item.html?id=33d6280d276d4af89fb66a6ffa7f2072
+    [MapBaseLayer.OCEAN]: L.layerGroup(
+      [
+        vectorTileLayer(VectorId.OCEAN, {
+          ...OPTIONS,
+          id: MapBaseLayer.OCEAN,
+        }),
+        L.tileLayer(arcUrl('Ocean/World_Ocean_Base'), {
+          ...OPTIONS,
+          id: MapBaseLayer.OCEAN,
+        }),
+      ],
       {
-        ...OPTIONS,
-        attribution:
-          'Esri, USGS, NGA, NASA, CGIAR, N Robinson, NCEAS, NLS, OS, NMA, ' +
-          'Geodatastyrelsen, Rijkswaterstaat, GSA, Geoland, FEMA, Intermap, ' +
-          'and the GIS user community',
-        id: MapBaseLayer.HILLSHADE,
+        attribution: `
+          Esri, GEBCO, NOAA, National Geographic, Garmin,
+          TomTom, Geonames.org, and other contributors
+        `,
       }
     ),
-    /* Esri world hillshade */
-    [MapBaseLayer.HILLSHADE_DARK]: L.tileLayer(
-      `${ARCGIS_URL_START}Elevation/World_Hillshade_Dark${ARCGIS_URL_END}`,
-      {
-        ...OPTIONS,
-        attribution:
-          'Esri, USGS, NGA, NASA, CGIAR, N Robinson, NCEAS, NLS, OS, NMA, ' +
-          'Geodatastyrelsen, Rijkswaterstaat, GSA, Geoland, FEMA, Intermap, ' +
-          'and the GIS user community',
-        id: MapBaseLayer.HILLSHADE_DARK,
-      }
-    ),
-    /* Esri world ocean */
-    [MapBaseLayer.OCEAN]: L.tileLayer(
-      `${ARCGIS_URL_START}Ocean/World_Ocean_Base${ARCGIS_URL_END}`,
-      {
-        ...OPTIONS,
-        attribution: 'Esri, Garmin, GEBCO, NOAA NGDC, and other contributors',
-        id: MapBaseLayer.OCEAN,
-        maxZoom: 10,
-      }
-    ),
-    /* Esri world physical map */
-    [MapBaseLayer.PHYSICAL]: L.tileLayer(
-      `${ARCGIS_URL_START}World_Physical_Map${ARCGIS_URL_END}`,
-      {
-        ...OPTIONS,
-        attribution: 'U.S. National Park Service',
-        id: MapBaseLayer.PHYSICAL,
-        maxZoom: 8,
-      }
-    ),
-    [MapBaseLayer.SATELLITE]: L.tileLayer(
-      `${ARCGIS_URL_START}World_Imagery${ARCGIS_URL_END}`,
-      {
-        ...OPTIONS,
-        attribution:
-          'Esri, Maxar, Earthstar Geographics, and the GIS User Community',
-        id: MapBaseLayer.SATELLITE,
-      }
-    ),
-    [MapBaseLayer.USGS_TOPO]: L.tileLayer(
-      'https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}',
+
+    // https://maps.arcgis.com/sharing/rest/content/items/e128f7554370429c91ef7c0e260c078a/data
+    // https://www.arcgis.com/home/item.html?id=e128f7554370429c91ef7c0e260c078a
+    //
+    [MapBaseLayer.OUTDOOR]: vectorTileLayer(VectorId.OUTDOOR, {
+      ...OPTIONS,
+      attribution: `
+        Esri, TomTom, Garmin, FAO, NOAA, USGS, (c) OpenStreetMap contributors,
+        CNES/Airbus DS, InterMap, NASA/METI, NASA/NGS and the GIS User Community
+      `,
+      id: MapBaseLayer.OUTDOOR,
+    }),
+
+    // https://maps.arcgis.com/sharing/rest/content/items/0d17ba68a8f64c278e7e2e7864e1069d/data
+    // https://www.arcgis.com/home/item.html?id=0d17ba68a8f64c278e7e2e7864e1069d
+    [MapBaseLayer.SATELLITE]: L.layerGroup(
+      [
+        vectorTileLayer(VectorId.SATELLITE, {
+          ...OPTIONS,
+          id: MapBaseLayer.SATELLITE,
+        }),
+        L.tileLayer(arcUrl('World_Imagery'), {
+          ...OPTIONS,
+          id: MapBaseLayer.SATELLITE,
+        }),
+      ],
       {
-        ...OPTIONS,
-        attribution: `Esri, USGS | Esri, TomTom, FAO, NOAA, USGS | USGS The National Map: National Boundaries
-       Dataset, 3DEP Elevation Program, Geographic Names Information System, National Hydrography
-       Dataset, National Land Cover Database, National Structures Dataset, and National
-       Transportation Dataset; USGS Global Ecosystems; U.S. Census Bureau TIGER/Line data;
-       USFS Road data; Natural Earth Data; U.S. Department of State HIU; NOAA National
-       Centers for Environmental Information. Data refreshed February, 2025.`,
-        id: MapBaseLayer.USGS_TOPO,
+        attribution: 'Esri and its users and partners',
       }
     ),
+
+    // https://maps.arcgis.com/sharing/rest/content/items/22fb75c0fa5a4c88b8ca4c4b8ae5c90b/data
+    // https://www.arcgis.com/home/item.html?id=22fb75c0fa5a4c88b8ca4c4b8ae5c90b
+    [MapBaseLayer.STREET]: vectorTileLayer(VectorId.STREET, {
+      ...OPTIONS,
+      attribution: `
+        Esri, TomTom, Garmin, FAO, NOAA, USGS, (c) OpenStreetMap contributors,
+        and the GIS User Community
+      `,
+      id: MapBaseLayer.STREET,
+    }),
+
+    // https://maps.arcgis.com/sharing/rest/content/items/8d57f09b9df345e79945f0f3da1d4d0f/data
+    // https://www.arcgis.com/home/item.html?id=8d57f09b9df345e79945f0f3da1d4d0f
+    [MapBaseLayer.TOPO]: vectorTileLayer(VectorId.TOPO, {
+      ...OPTIONS,
+      attribution: `
+        Esri, TomTom, Garmin, FAO, NOAA, USGS, (c) OpenStreetMap contributors,
+        CNES/Airbus DS, InterMap, NASA/METI, NASA/NGS and the GIS User Community
+      `,
+      id: MapBaseLayer.TOPO,
+    }),
   };
 
   return baseLayers;
@@ -88,7 +96,7 @@ export function baseLayers(): Record<MapBaseLayer, L.TileLayer> {
 /**
  * Returns a specific Esri raster base layer.
  */
-export function baseLayer(baseLayer: MapBaseLayer): L.TileLayer {
+export function baseLayer(baseLayer: MapBaseLayer): L.LayerGroup {
   return baseLayers()[baseLayer];
 }
 
@@ -156,8 +164,13 @@ const ARCGIS_URL_START =
 const ARCGIS_URL_END = '/MapServer/tile/{z}/{y}/{x}';
 const OPTIONS: L.MapOptions = {
   maxZoom: 16,
+  attributionControl: false,
 };
 
+function arcUrl(id: string): string {
+  return `${ARCGIS_URL_START}${id}${ARCGIS_URL_END}`;
+}
+
 function transformCoordinate(
   coordinates: number[],
   transform: LocationTransform
diff --git a/libs/leaflet/vector-id.model.ts b/libs/leaflet/vector-id.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a0e76b65f511636ef56408c52aa33e2c5edfc64a
--- /dev/null
+++ b/libs/leaflet/vector-id.model.ts
@@ -0,0 +1,22 @@
+/**
+ * Vector tile layer item ids.
+ *
+ * Item ids can be found by viewing the data?f=json items in the network tab of
+ * https://maps.arcgis.com/apps/mapviewer/index.html when viewing the base maps.
+ */
+export enum VectorId {
+  // https://maps.arcgis.com/sharing/rest/content/items/33d6280d276d4af89fb66a6ffa7f2072/data
+  OCEAN = '6061e78281f94bb6a671d11253d41f6e',
+
+  // https://maps.arcgis.com/sharing/rest/content/items/e128f7554370429c91ef7c0e260c078a/data
+  OUTDOOR = 'f320a8af9ffa4b4baeaf1d66f03da86f',
+
+  // https://maps.arcgis.com/sharing/rest/content/items/0d17ba68a8f64c278e7e2e7864e1069d/data
+  SATELLITE = '5447e9aef0684ec391ae9381725f7370',
+
+  // https://maps.arcgis.com/sharing/rest/content/items/22fb75c0fa5a4c88b8ca4c4b8ae5c90b/data
+  STREET = '6ee2da1b8303471c9e3340d1277926bc',
+
+  // https://maps.arcgis.com/sharing/rest/content/items/8d57f09b9df345e79945f0f3da1d4d0f/data
+  TOPO = 'd38e980fc20141a49231b9fcea1c9bc0',
+}
diff --git a/package-lock.json b/package-lock.json
index b8327bb9c337a9cc25e4fcee43fb20780bc12cdb..e29d8dd5caf85f35b9a8a9574bba7b1348f28fb6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
         "change-case": "^5.4.4",
         "constructs": "^10.3.0",
         "d3-format": "^3.1.0",
+        "esri-leaflet-vector": "^4.2.7",
         "leaflet": "^1.9.4",
         "plotly.js": "^2.34.0"
       },
@@ -425,6 +426,41 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/@maplibre/maplibre-gl-style-spec": {
+      "version": "20.4.0",
+      "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz",
+      "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==",
+      "license": "ISC",
+      "peer": true,
+      "dependencies": {
+        "@mapbox/jsonlint-lines-primitives": "~2.0.2",
+        "@mapbox/unitbezier": "^0.0.1",
+        "json-stringify-pretty-compact": "^4.0.0",
+        "minimist": "^1.2.8",
+        "quickselect": "^2.0.0",
+        "rw": "^1.3.3",
+        "tinyqueue": "^3.0.0"
+      },
+      "bin": {
+        "gl-style-format": "dist/gl-style-format.mjs",
+        "gl-style-migrate": "dist/gl-style-migrate.mjs",
+        "gl-style-validate": "dist/gl-style-validate.mjs"
+      }
+    },
+    "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
+      "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==",
+      "license": "BSD-2-Clause",
+      "peer": true
+    },
+    "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz",
+      "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==",
+      "license": "ISC",
+      "peer": true
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -566,6 +602,23 @@
         "@types/hast": "^3.0.4"
       }
     },
+    "node_modules/@terraformer/arcgis": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/@terraformer/arcgis/-/arcgis-2.1.2.tgz",
+      "integrity": "sha512-IvdfqehcNAUtKU1OFMKwPT8EvdKlVFZ7q7ZKzkIF8XzYZIVsZLuXuOS1UBdRh5u/o+X5Gax7jiZhD8U/4TV+Jw==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@terraformer/common": "^2.1.2"
+      }
+    },
+    "node_modules/@terraformer/common": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/@terraformer/common/-/common-2.1.2.tgz",
+      "integrity": "sha512-cwPdTFzIpekZhZRrgDEkqLKNPoqbyCBQHiemaovnGIeUx0Pl336MY/eCxzJ5zXkrQLVo9zPalq/vYW5HnyKevQ==",
+      "license": "MIT",
+      "peer": true
+    },
     "node_modules/@tsconfig/node10": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
@@ -666,6 +719,16 @@
       "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==",
       "license": "MIT"
     },
+    "node_modules/@types/geojson-vt": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz",
+      "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
     "node_modules/@types/hast": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
@@ -692,6 +755,25 @@
         "@types/geojson": "*"
       }
     },
+    "node_modules/@types/mapbox__point-geometry": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz",
+      "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/@types/mapbox__vector-tile": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz",
+      "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@types/geojson": "*",
+        "@types/mapbox__point-geometry": "*",
+        "@types/pbf": "*"
+      }
+    },
     "node_modules/@types/minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
@@ -716,6 +798,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@types/pbf": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz",
+      "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==",
+      "license": "MIT",
+      "peer": true
+    },
     "node_modules/@types/plotly.js": {
       "version": "2.33.1",
       "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.33.1.tgz",
@@ -729,6 +818,16 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@types/supercluster": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz",
+      "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
     "node_modules/@types/unist": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
@@ -2668,6 +2767,31 @@
         "node": ">=4.0"
       }
     },
+    "node_modules/esri-leaflet": {
+      "version": "3.0.14",
+      "resolved": "https://registry.npmjs.org/esri-leaflet/-/esri-leaflet-3.0.14.tgz",
+      "integrity": "sha512-mXUFWFkHbnLnFh3uYHJiZNoOOEK2Jwt0MVx4b5wC7qAt6X0e7dyLQoiWuy2XPGkhg1/RTR96Lz63QAm4HUVNbQ==",
+      "license": "Apache-2.0",
+      "peer": true,
+      "dependencies": {
+        "@terraformer/arcgis": "^2.1.0",
+        "tiny-binary-search": "^1.0.3"
+      },
+      "peerDependencies": {
+        "leaflet": "^1.0.0"
+      }
+    },
+    "node_modules/esri-leaflet-vector": {
+      "version": "4.2.7",
+      "resolved": "https://registry.npmjs.org/esri-leaflet-vector/-/esri-leaflet-vector-4.2.7.tgz",
+      "integrity": "sha512-PC9XJXzXAxMS+WIE522Q8LrpJh4lwXmhAO+7vlxDxSpimTEMuwK78Fwd6bCrbRiweAoodhq0+eJ5QL/FsYFUOg==",
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "esri-leaflet": ">2.3.0",
+        "leaflet": "^1.5.0",
+        "maplibre-gl": "^2.0.0 || ^3.0.0 || ^4.0.0"
+      }
+    },
     "node_modules/estraverse": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
@@ -3110,6 +3234,47 @@
         "node": ">=10.13.0"
       }
     },
+    "node_modules/global-prefix": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz",
+      "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "ini": "^4.1.3",
+        "kind-of": "^6.0.3",
+        "which": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/global-prefix/node_modules/isexe": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+      "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+      "license": "ISC",
+      "peer": true,
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/global-prefix/node_modules/which": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+      "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+      "license": "ISC",
+      "peer": true,
+      "dependencies": {
+        "isexe": "^3.1.1"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/globals": {
       "version": "13.24.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
@@ -3608,6 +3773,16 @@
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "license": "ISC"
     },
+    "node_modules/ini": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+      "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+      "license": "ISC",
+      "peer": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/inquirer": {
       "version": "7.3.3",
       "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
@@ -3854,6 +4029,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/json-stringify-pretty-compact": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz",
+      "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==",
+      "license": "MIT",
+      "peer": true
+    },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -3887,7 +4069,6 @@
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
@@ -4051,6 +4232,114 @@
         "node": ">=6.4.0"
       }
     },
+    "node_modules/maplibre-gl": {
+      "version": "4.7.1",
+      "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz",
+      "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==",
+      "license": "BSD-3-Clause",
+      "peer": true,
+      "dependencies": {
+        "@mapbox/geojson-rewind": "^0.5.2",
+        "@mapbox/jsonlint-lines-primitives": "^2.0.2",
+        "@mapbox/point-geometry": "^0.1.0",
+        "@mapbox/tiny-sdf": "^2.0.6",
+        "@mapbox/unitbezier": "^0.0.1",
+        "@mapbox/vector-tile": "^1.3.1",
+        "@mapbox/whoots-js": "^3.1.0",
+        "@maplibre/maplibre-gl-style-spec": "^20.3.1",
+        "@types/geojson": "^7946.0.14",
+        "@types/geojson-vt": "3.2.5",
+        "@types/mapbox__point-geometry": "^0.1.4",
+        "@types/mapbox__vector-tile": "^1.3.4",
+        "@types/pbf": "^3.0.5",
+        "@types/supercluster": "^7.1.3",
+        "earcut": "^3.0.0",
+        "geojson-vt": "^4.0.2",
+        "gl-matrix": "^3.4.3",
+        "global-prefix": "^4.0.0",
+        "kdbush": "^4.0.2",
+        "murmurhash-js": "^1.0.0",
+        "pbf": "^3.3.0",
+        "potpack": "^2.0.0",
+        "quickselect": "^3.0.0",
+        "supercluster": "^8.0.1",
+        "tinyqueue": "^3.0.0",
+        "vt-pbf": "^3.1.3"
+      },
+      "engines": {
+        "node": ">=16.14.0",
+        "npm": ">=8.1.0"
+      },
+      "funding": {
+        "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1"
+      }
+    },
+    "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz",
+      "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==",
+      "license": "BSD-2-Clause",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
+      "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==",
+      "license": "BSD-2-Clause",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/earcut": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz",
+      "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==",
+      "license": "ISC",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/geojson-vt": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz",
+      "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==",
+      "license": "ISC",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/kdbush": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
+      "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==",
+      "license": "ISC",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/potpack": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz",
+      "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==",
+      "license": "ISC",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/quickselect": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz",
+      "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==",
+      "license": "ISC",
+      "peer": true
+    },
+    "node_modules/maplibre-gl/node_modules/supercluster": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
+      "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
+      "license": "ISC",
+      "peer": true,
+      "dependencies": {
+        "kdbush": "^4.0.2"
+      }
+    },
+    "node_modules/maplibre-gl/node_modules/tinyqueue": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz",
+      "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==",
+      "license": "ISC",
+      "peer": true
+    },
     "node_modules/markdown-it": {
       "version": "14.1.0",
       "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
@@ -5728,6 +6017,13 @@
         "xtend": "~4.0.1"
       }
     },
+    "node_modules/tiny-binary-search": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tiny-binary-search/-/tiny-binary-search-1.0.3.tgz",
+      "integrity": "sha512-STSHX/L5nI9WTLv6wrzJbAPbO7OIISX83KFBh2GVbX1Uz/vgZOU/ANn/8iV6t35yMTpoPzzO+3OQid3mifE0CA==",
+      "license": "Apache-2.0",
+      "peer": true
+    },
     "node_modules/tinycolor2": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
diff --git a/package.json b/package.json
index 5432a6e4ad25209f20890c4c67bcebed8531b946..2e2fcb16e88da63cea2cc73f9066a1fcd853e0e3 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
     "change-case": "^5.4.4",
     "constructs": "^10.3.0",
     "d3-format": "^3.1.0",
+    "esri-leaflet-vector": "^4.2.7",
     "leaflet": "^1.9.4",
     "plotly.js": "^2.34.0"
   },